1 #include "ipmi.hpp" 2 #include "manager_mock.hpp" 3 4 #include <cstring> 5 #include <string> 6 7 #include <gtest/gtest.h> 8 9 namespace blobs 10 { 11 12 using ::testing::Return; 13 14 // ipmid.hpp isn't installed where we can grab it and this value is per BMC 15 // SoC. 16 #define MAX_IPMI_BUFFER 64 17 18 TEST(BlobEnumerateTest, VerifyIfRequestByIdInvalidReturnsFailure) 19 { 20 // This tests to verify that if the index is invalid, it'll return failure. 21 22 ManagerMock mgr; 23 size_t dataLen; 24 uint8_t reply[MAX_IPMI_BUFFER] = {0}; 25 struct BmcBlobEnumerateTx req; 26 uint8_t* request = reinterpret_cast<uint8_t*>(&req); 27 28 req.cmd = BlobOEMCommands::bmcBlobEnumerate; 29 req.blobIdx = 0; 30 dataLen = sizeof(struct BmcBlobEnumerateTx); 31 32 EXPECT_CALL(mgr, getBlobId(req.blobIdx)).WillOnce(Return("")); 33 34 EXPECT_EQ(IPMI_CC_INVALID, enumerateBlob(&mgr, request, reply, &dataLen)); 35 } 36 37 TEST(BlobEnumerateTest, BoringRequestByIdAndReceive) 38 { 39 // This tests that if an index into the blob_id cache is valid, the command 40 // will return the blobId. 41 42 ManagerMock mgr; 43 size_t dataLen; 44 uint8_t reply[MAX_IPMI_BUFFER] = {0}; 45 struct BmcBlobEnumerateTx req; 46 struct BmcBlobEnumerateRx* rep; 47 uint8_t* request = reinterpret_cast<uint8_t*>(&req); 48 std::string blobId = "/asdf"; 49 50 req.cmd = BlobOEMCommands::bmcBlobEnumerate; 51 req.blobIdx = 0; 52 dataLen = sizeof(struct BmcBlobEnumerateTx); 53 54 EXPECT_CALL(mgr, getBlobId(req.blobIdx)).WillOnce(Return(blobId)); 55 56 EXPECT_EQ(IPMI_CC_OK, enumerateBlob(&mgr, request, reply, &dataLen)); 57 58 // We're expecting this as a response. 59 // blobId.length + 1 + sizeof(uint16_t); 60 EXPECT_EQ(blobId.length() + 1 + sizeof(uint16_t), dataLen); 61 62 rep = reinterpret_cast<struct BmcBlobEnumerateRx*>(reply); 63 EXPECT_EQ(0, std::memcmp(rep->blobId, blobId.c_str(), blobId.length() + 1)); 64 } 65 } // namespace blobs 66