summaryrefslogtreecommitdiffstats
path: root/test/ipmi_read_unittest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/ipmi_read_unittest.cpp')
-rw-r--r--test/ipmi_read_unittest.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/test/ipmi_read_unittest.cpp b/test/ipmi_read_unittest.cpp
new file mode 100644
index 0000000..b6dab55
--- /dev/null
+++ b/test/ipmi_read_unittest.cpp
@@ -0,0 +1,78 @@
+#include "ipmi.hpp"
+#include "manager_mock.hpp"
+
+#include <cstring>
+#include <vector>
+
+#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(BlobReadTest, ManagerReturnsNoData)
+{
+ // Verify that if no data is returned the IPMI command reply has no
+ // payload. The manager, in all failures, will just return 0 bytes.
+
+ ManagerMock mgr;
+ size_t dataLen;
+ uint8_t request[MAX_IPMI_BUFFER] = {0};
+ uint8_t reply[MAX_IPMI_BUFFER] = {0};
+ auto req = reinterpret_cast<struct BmcBlobReadTx*>(request);
+
+ req->cmd = BlobOEMCommands::bmcBlobRead;
+ req->crc = 0;
+ req->sessionId = 0x54;
+ req->offset = 0x100;
+ req->requestedSize = 0x10;
+
+ dataLen = sizeof(struct BmcBlobReadTx);
+
+ std::vector<uint8_t> data;
+
+ EXPECT_CALL(mgr, read(req->sessionId, req->offset, req->requestedSize))
+ .WillOnce(Return(data));
+
+ EXPECT_EQ(IPMI_CC_OK, readBlob(&mgr, request, reply, &dataLen));
+ EXPECT_EQ(sizeof(struct BmcBlobReadRx), dataLen);
+}
+
+TEST(BlobReadTest, ManagerReturnsData)
+{
+ // Verify that if data is returned, it's placed in the expected location.
+
+ ManagerMock mgr;
+ size_t dataLen;
+ uint8_t request[MAX_IPMI_BUFFER] = {0};
+ uint8_t reply[MAX_IPMI_BUFFER] = {0};
+ auto req = reinterpret_cast<struct BmcBlobReadTx*>(request);
+
+ req->cmd = BlobOEMCommands::bmcBlobRead;
+ req->crc = 0;
+ req->sessionId = 0x54;
+ req->offset = 0x100;
+ req->requestedSize = 0x10;
+
+ dataLen = sizeof(struct BmcBlobReadTx);
+
+ std::vector<uint8_t> data = {0x02, 0x03, 0x05, 0x06};
+
+ EXPECT_CALL(mgr, read(req->sessionId, req->offset, req->requestedSize))
+ .WillOnce(Return(data));
+
+ EXPECT_EQ(IPMI_CC_OK, readBlob(&mgr, request, reply, &dataLen));
+ EXPECT_EQ(sizeof(struct BmcBlobReadRx) + data.size(), dataLen);
+ EXPECT_EQ(0, std::memcmp(&reply[sizeof(struct BmcBlobReadRx)], data.data(),
+ data.size()));
+}
+
+/* TODO(venture): We need a test that handles other checks such as if the size
+ * requested won't fit into a packet response.
+ */
+} // namespace blobs
OpenPOWER on IntegriCloud