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