blob: 4bf1125ab89ad233bfa0ef9b4bb2bc630595972e [file] [log] [blame]
Patrick Ventureef3aead2018-09-12 08:53:29 -07001#include "ipmi.hpp"
Patrick Venturecd8dab42019-01-15 19:57:38 -08002#include "manager_mock.hpp"
Patrick Ventureef3aead2018-09-12 08:53:29 -07003
Patrick Ventureef3aead2018-09-12 08:53:29 -07004#include <cstring>
5
6#include <gtest/gtest.h>
7
8namespace blobs
9{
10
11using ::testing::_;
12using ::testing::Invoke;
13using ::testing::Matcher;
14using ::testing::NotNull;
15using ::testing::Return;
16
17// ipmid.hpp isn't installed where we can grab it and this value is per BMC
18// SoC.
19#define MAX_IPMI_BUFFER 64
20
21TEST(BlobSessionStatTest, RequestRejectedByManagerReturnsFailure)
22{
23 // If the session ID is invalid, the request must fail.
24
25 ManagerMock mgr;
26 size_t dataLen;
27 uint8_t request[MAX_IPMI_BUFFER] = {0};
28 uint8_t reply[MAX_IPMI_BUFFER] = {0};
29 auto req = reinterpret_cast<struct BmcBlobSessionStatTx*>(request);
Patrick Venture00d5f0d2019-05-17 19:21:35 -070030 req->cmd = static_cast<std::uint8_t>(BlobOEMCommands::bmcBlobSessionStat);
Patrick Ventureef3aead2018-09-12 08:53:29 -070031 req->crc = 0;
32 req->sessionId = 0x54;
33
34 dataLen = sizeof(struct BmcBlobSessionStatTx);
35
Patrick Venture8bc11772019-06-04 07:20:24 -070036 EXPECT_CALL(mgr,
37 stat(Matcher<uint16_t>(req->sessionId), Matcher<BlobMeta*>(_)))
Patrick Ventureef3aead2018-09-12 08:53:29 -070038 .WillOnce(Return(false));
39
Patrick Venture41258802018-11-12 10:46:30 -080040 EXPECT_EQ(IPMI_CC_UNSPECIFIED_ERROR,
41 sessionStatBlob(&mgr, request, reply, &dataLen));
Patrick Ventureef3aead2018-09-12 08:53:29 -070042}
43
44TEST(BlobSessionStatTest, RequestSucceedsNoMetadata)
45{
46 // Stat request succeeeds but there were no metadata bytes.
47
48 ManagerMock mgr;
49 size_t dataLen;
50 uint8_t request[MAX_IPMI_BUFFER] = {0};
51 uint8_t reply[MAX_IPMI_BUFFER] = {0};
52 auto req = reinterpret_cast<struct BmcBlobSessionStatTx*>(request);
Patrick Venture00d5f0d2019-05-17 19:21:35 -070053 req->cmd = static_cast<std::uint8_t>(BlobOEMCommands::bmcBlobSessionStat);
Patrick Ventureef3aead2018-09-12 08:53:29 -070054 req->crc = 0;
55 req->sessionId = 0x54;
56
57 dataLen = sizeof(struct BmcBlobSessionStatTx);
58
59 struct BmcBlobStatRx rep;
60 rep.crc = 0x00;
61 rep.blobState = 0x01;
62 rep.size = 0x100;
63 rep.metadataLen = 0x00;
64
Patrick Ventureb6ed5622020-09-28 13:17:14 -070065 uint16_t blobState = rep.blobState;
66 uint32_t size = rep.size;
67
Patrick Ventureef3aead2018-09-12 08:53:29 -070068 EXPECT_CALL(mgr, stat(Matcher<uint16_t>(req->sessionId),
Patrick Venture8bc11772019-06-04 07:20:24 -070069 Matcher<BlobMeta*>(NotNull())))
William A. Kennington III993f5412021-06-15 18:19:18 -070070 .WillOnce(Invoke([&](uint16_t, BlobMeta* meta) {
Patrick Ventureb6ed5622020-09-28 13:17:14 -070071 meta->blobState = blobState;
72 meta->size = size;
Patrick Ventureef3aead2018-09-12 08:53:29 -070073 return true;
74 }));
75
76 EXPECT_EQ(IPMI_CC_OK, sessionStatBlob(&mgr, request, reply, &dataLen));
77
78 EXPECT_EQ(sizeof(rep), dataLen);
79 EXPECT_EQ(0, std::memcmp(reply, &rep, sizeof(rep)));
80}
81
82TEST(BlobSessionStatTest, RequestSucceedsWithMetadata)
83{
84 // Stat request succeeds and there were metadata bytes.
85
86 ManagerMock mgr;
87 size_t dataLen;
88 uint8_t request[MAX_IPMI_BUFFER] = {0};
89 uint8_t reply[MAX_IPMI_BUFFER] = {0};
90 auto req = reinterpret_cast<struct BmcBlobSessionStatTx*>(request);
Patrick Venture00d5f0d2019-05-17 19:21:35 -070091 req->cmd = static_cast<std::uint8_t>(BlobOEMCommands::bmcBlobSessionStat);
Patrick Ventureef3aead2018-09-12 08:53:29 -070092 req->crc = 0;
93 req->sessionId = 0x54;
94
95 dataLen = sizeof(struct BmcBlobSessionStatTx);
96
Patrick Venture8bc11772019-06-04 07:20:24 -070097 BlobMeta lmeta;
Patrick Ventureef3aead2018-09-12 08:53:29 -070098 lmeta.blobState = 0x01;
99 lmeta.size = 0x100;
100 lmeta.metadata.push_back(0x01);
101 lmeta.metadata.push_back(0x02);
102 lmeta.metadata.push_back(0x03);
103 lmeta.metadata.push_back(0x04);
104
105 struct BmcBlobStatRx rep;
106 rep.crc = 0x00;
107 rep.blobState = lmeta.blobState;
108 rep.size = lmeta.size;
109 rep.metadataLen = lmeta.metadata.size();
110
111 EXPECT_CALL(mgr, stat(Matcher<uint16_t>(req->sessionId),
Patrick Venture8bc11772019-06-04 07:20:24 -0700112 Matcher<BlobMeta*>(NotNull())))
William A. Kennington III993f5412021-06-15 18:19:18 -0700113 .WillOnce(Invoke([&](uint16_t, BlobMeta* meta) {
Patrick Ventureef3aead2018-09-12 08:53:29 -0700114 (*meta) = lmeta;
115 return true;
116 }));
117
118 EXPECT_EQ(IPMI_CC_OK, sessionStatBlob(&mgr, request, reply, &dataLen));
119
120 EXPECT_EQ(sizeof(rep) + lmeta.metadata.size(), dataLen);
121 EXPECT_EQ(0, std::memcmp(reply, &rep, sizeof(rep)));
122 EXPECT_EQ(0, std::memcmp(reply + sizeof(rep), lmeta.metadata.data(),
123 lmeta.metadata.size()));
124}
125} // namespace blobs