blob: 6cc8223afc50aa44316d05f0c9eed879387c1027 [file] [log] [blame]
#include "ipmi.hpp"
#include "manager_mock.hpp"
#include <cstring>
#include <gtest/gtest.h>
namespace blobs
{
using ::testing::_;
using ::testing::ElementsAreArray;
using ::testing::Return;
TEST(BlobCommitTest, InvalidCommitDataLengthReturnsFailure)
{
// The commit command supports an optional commit blob. This test verifies
// we sanity check the length of that blob.
ManagerMock mgr;
std::vector<uint8_t> request;
struct BmcBlobCommitTx req;
req.crc = 0;
req.sessionId = 0x54;
req.commitDataLen =
1; // It's one byte, but that's more than the packet size.
request.resize(sizeof(struct BmcBlobCommitTx));
std::memcpy(request.data(), &req, sizeof(struct BmcBlobCommitTx));
EXPECT_EQ(ipmi::responseReqDataLenInvalid(), commitBlob(&mgr, request));
}
TEST(BlobCommitTest, ValidCommitNoDataHandlerRejectsReturnsFailure)
{
// The commit packet is valid and the manager's commit call returns failure.
ManagerMock mgr;
std::vector<uint8_t> request;
struct BmcBlobCommitTx req;
req.crc = 0;
req.sessionId = 0x54;
req.commitDataLen = 0;
request.resize(sizeof(struct BmcBlobCommitTx));
std::memcpy(request.data(), &req, sizeof(struct BmcBlobCommitTx));
EXPECT_CALL(mgr, commit(req.sessionId, _)).WillOnce(Return(false));
EXPECT_EQ(ipmi::responseUnspecifiedError(), commitBlob(&mgr, request));
}
TEST(BlobCommitTest, ValidCommitNoDataHandlerAcceptsReturnsSuccess)
{
// Commit called with no data and everything returns success.
ManagerMock mgr;
std::vector<uint8_t> request;
struct BmcBlobCommitTx req;
req.crc = 0;
req.sessionId = 0x54;
req.commitDataLen = 0;
request.resize(sizeof(struct BmcBlobCommitTx));
std::memcpy(request.data(), &req, sizeof(struct BmcBlobCommitTx));
EXPECT_CALL(mgr, commit(req.sessionId, _)).WillOnce(Return(true));
EXPECT_EQ(ipmi::responseSuccess(std::vector<uint8_t>{}),
commitBlob(&mgr, request));
}
TEST(BlobCommitTest, ValidCommitWithDataHandlerAcceptsReturnsSuccess)
{
// Commit called with extra data and everything returns success.
ManagerMock mgr;
std::vector<uint8_t> request;
std::array<uint8_t, 4> expectedBlob = {0x25, 0x33, 0x45, 0x67};
struct BmcBlobCommitTx req;
req.crc = 0;
req.sessionId = 0x54;
req.commitDataLen = sizeof(expectedBlob);
request.resize(sizeof(struct BmcBlobCommitTx));
std::memcpy(request.data(), &req, sizeof(struct BmcBlobCommitTx));
request.insert(request.end(), expectedBlob.begin(), expectedBlob.end());
EXPECT_CALL(mgr, commit(req.sessionId, ElementsAreArray(expectedBlob)))
.WillOnce(Return(true));
EXPECT_EQ(ipmi::responseSuccess(std::vector<uint8_t>{}),
commitBlob(&mgr, request));
}
} // namespace blobs