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