| #include "ipmi.hpp" |
| |
| #include <blobs-ipmid/test/manager_mock.hpp> |
| #include <cstring> |
| #include <string> |
| |
| #include <gtest/gtest.h> |
| |
| namespace blobs |
| { |
| |
| using ::testing::Return; |
| |
| // ipmid.hpp isn't installed where we can grab it and this value is per BMC |
| // SoC. |
| #define MAX_IPMI_BUFFER 64 |
| |
| TEST(BlobEnumerateTest, VerifyIfRequestByIdInvalidReturnsFailure) |
| { |
| // This tests to verify that if the index is invalid, it'll return failure. |
| |
| ManagerMock mgr; |
| size_t dataLen; |
| uint8_t reply[MAX_IPMI_BUFFER] = {0}; |
| struct BmcBlobEnumerateTx req; |
| uint8_t* request = reinterpret_cast<uint8_t*>(&req); |
| |
| req.cmd = BlobOEMCommands::bmcBlobEnumerate; |
| req.blobIdx = 0; |
| dataLen = sizeof(struct BmcBlobEnumerateTx); |
| |
| EXPECT_CALL(mgr, getBlobId(req.blobIdx)).WillOnce(Return("")); |
| |
| EXPECT_EQ(IPMI_CC_INVALID_FIELD_REQUEST, |
| enumerateBlob(&mgr, request, reply, &dataLen)); |
| } |
| |
| TEST(BlobEnumerateTest, BoringRequestByIdAndReceive) |
| { |
| // This tests that if an index into the blob_id cache is valid, the command |
| // will return the blobId. |
| |
| ManagerMock mgr; |
| size_t dataLen; |
| uint8_t reply[MAX_IPMI_BUFFER] = {0}; |
| struct BmcBlobEnumerateTx req; |
| struct BmcBlobEnumerateRx* rep; |
| uint8_t* request = reinterpret_cast<uint8_t*>(&req); |
| std::string blobId = "/asdf"; |
| |
| req.cmd = BlobOEMCommands::bmcBlobEnumerate; |
| req.blobIdx = 0; |
| dataLen = sizeof(struct BmcBlobEnumerateTx); |
| |
| EXPECT_CALL(mgr, getBlobId(req.blobIdx)).WillOnce(Return(blobId)); |
| |
| EXPECT_EQ(IPMI_CC_OK, enumerateBlob(&mgr, request, reply, &dataLen)); |
| |
| // We're expecting this as a response. |
| // blobId.length + 1 + sizeof(uint16_t); |
| EXPECT_EQ(blobId.length() + 1 + sizeof(uint16_t), dataLen); |
| |
| rep = reinterpret_cast<struct BmcBlobEnumerateRx*>(reply); |
| EXPECT_EQ(0, std::memcmp(rep->blobId, blobId.c_str(), blobId.length() + 1)); |
| } |
| } // namespace blobs |