1 #include "helper.hpp" 2 #include "ipmi.hpp" 3 #include "manager_mock.hpp" 4 5 #include <cstring> 6 #include <vector> 7 8 #include <gtest/gtest.h> 9 10 namespace blobs 11 { 12 13 using ::testing::Return; 14 15 TEST(BlobReadTest, ManagerReturnsNoData) 16 { 17 // Verify that if no data is returned the IPMI command reply has no 18 // payload. The manager, in all failures, will just return 0 bytes. 19 ManagerMock mgr; 20 std::vector<uint8_t> request; 21 struct BmcBlobReadTx req; 22 23 req.crc = 0; 24 req.sessionId = 0x54; 25 req.offset = 0x100; 26 req.requestedSize = 0x10; 27 request.resize(sizeof(struct BmcBlobReadTx)); 28 std::memcpy(request.data(), &req, sizeof(struct BmcBlobReadTx)); 29 std::vector<uint8_t> data; 30 31 EXPECT_CALL(mgr, read(req.sessionId, req.offset, req.requestedSize)) 32 .WillOnce(Return(data)); 33 34 auto result = validateReply(readBlob(&mgr, request)); 35 EXPECT_EQ(sizeof(struct BmcBlobReadRx), result.size()); 36 } 37 38 TEST(BlobReadTest, ManagerReturnsData) 39 { 40 // Verify that if data is returned, it's placed in the expected location. 41 ManagerMock mgr; 42 std::vector<uint8_t> request; 43 struct BmcBlobReadTx req; 44 45 req.crc = 0; 46 req.sessionId = 0x54; 47 req.offset = 0x100; 48 req.requestedSize = 0x10; 49 request.resize(sizeof(struct BmcBlobReadTx)); 50 std::memcpy(request.data(), &req, sizeof(struct BmcBlobReadTx)); 51 std::vector<uint8_t> data = {0x02, 0x03, 0x05, 0x06}; 52 53 EXPECT_CALL(mgr, read(req.sessionId, req.offset, req.requestedSize)) 54 .WillOnce(Return(data)); 55 56 auto result = validateReply(readBlob(&mgr, request)); 57 EXPECT_EQ(sizeof(struct BmcBlobReadRx) + data.size(), result.size()); 58 EXPECT_EQ(0, std::memcmp(&result[sizeof(struct BmcBlobReadRx)], data.data(), 59 data.size())); 60 } 61 62 /* TODO(venture): We need a test that handles other checks such as if the size 63 * requested won't fit into a packet response. 64 */ 65 } // namespace blobs 66