blob: f2fd789159433ae4604024db758f652e281435ba [file] [log] [blame]
Tom Joseph75356c12021-06-20 03:52:40 -07001#include "common/utils.hpp"
2#include "fw-update/inventory_manager.hpp"
3#include "requester/test/mock_request.hpp"
Andrew Jeffery7c1dc7e2023-04-28 14:52:16 +09304#include "test/test_instance_id.hpp"
Tom Joseph75356c12021-06-20 03:52:40 -07005
George Liuc453e162022-12-21 17:16:23 +08006#include <libpldm/firmware_update.h>
7
Tom Joseph75356c12021-06-20 03:52:40 -07008#include <gtest/gtest.h>
9
10using namespace pldm;
11using namespace std::chrono;
12using namespace pldm::fw_update;
13
14class InventoryManagerTest : public testing::Test
15{
16 protected:
17 InventoryManagerTest() :
Andrew Jeffery7c1dc7e2023-04-28 14:52:16 +093018 event(sdeventplus::Event::get_default()), instanceIdDb(),
Rashmica Gupta1ed5f7a2023-05-22 13:56:42 +100019 reqHandler(nullptr, event, instanceIdDb, false, seconds(1), 2,
Tom Joseph75356c12021-06-20 03:52:40 -070020 milliseconds(100)),
Unive Tien7ad45b42025-08-18 06:04:53 +000021 inventoryManager(&dBusHandler, reqHandler, instanceIdDb,
22 outDescriptorMap, outDownstreamDescriptorMap,
23 outComponentInfoMap, configurations)
Tom Joseph75356c12021-06-20 03:52:40 -070024 {}
25
26 int fd = -1;
Unive Tien7ad45b42025-08-18 06:04:53 +000027 const pldm::utils::DBusHandler dBusHandler;
Tom Joseph75356c12021-06-20 03:52:40 -070028 sdeventplus::Event event;
Andrew Jeffery7c1dc7e2023-04-28 14:52:16 +093029 TestInstanceIdDb instanceIdDb;
Tom Joseph75356c12021-06-20 03:52:40 -070030 requester::Handler<requester::Request> reqHandler;
31 InventoryManager inventoryManager;
32 DescriptorMap outDescriptorMap{};
Unive Tien8b169dc2024-11-25 09:34:39 +080033 DownstreamDescriptorMap outDownstreamDescriptorMap{};
Tom Joseph75356c12021-06-20 03:52:40 -070034 ComponentInfoMap outComponentInfoMap{};
Unive Tien7ad45b42025-08-18 06:04:53 +000035 Configurations configurations;
Tom Joseph75356c12021-06-20 03:52:40 -070036};
37
38TEST_F(InventoryManagerTest, handleQueryDeviceIdentifiersResponse)
39{
40 constexpr size_t respPayloadLength1 = 49;
41 constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength1>
42 queryDeviceIdentifiersResp1{
43 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00,
44 0x04, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x02, 0x00, 0x10, 0x00, 0x12,
45 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18, 0xa0, 0x30, 0xfc, 0x8a,
46 0x56, 0x58, 0x7d, 0x5b, 0xFF, 0xFF, 0x0B, 0x00, 0x01, 0x07, 0x4f,
47 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x01, 0x02};
48 auto responseMsg1 =
49 reinterpret_cast<const pldm_msg*>(queryDeviceIdentifiersResp1.data());
50 inventoryManager.queryDeviceIdentifiers(1, responseMsg1,
51 respPayloadLength1);
52
53 DescriptorMap descriptorMap1{
54 {0x01,
55 {{PLDM_FWUP_IANA_ENTERPRISE_ID,
56 std::vector<uint8_t>{0x0a, 0x0b, 0x0c, 0xd}},
57 {PLDM_FWUP_UUID,
58 std::vector<uint8_t>{0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18,
59 0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d,
60 0x5b}},
61 {PLDM_FWUP_VENDOR_DEFINED,
62 std::make_tuple("OpenBMC", std::vector<uint8_t>{0x01, 0x02})}}}};
63
64 EXPECT_EQ(outDescriptorMap.size(), descriptorMap1.size());
65 EXPECT_EQ(outDescriptorMap, descriptorMap1);
66
67 constexpr size_t respPayloadLength2 = 26;
68 constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength2>
69 queryDeviceIdentifiersResp2{
70 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x02,
71 0x00, 0x10, 0x00, 0xF0, 0x18, 0x87, 0x8C, 0xCB, 0x7D, 0x49,
72 0x43, 0x98, 0x00, 0xA0, 0x2F, 0x59, 0x9A, 0xCA, 0x02};
73 auto responseMsg2 =
74 reinterpret_cast<const pldm_msg*>(queryDeviceIdentifiersResp2.data());
75 inventoryManager.queryDeviceIdentifiers(2, responseMsg2,
76 respPayloadLength2);
77 DescriptorMap descriptorMap2{
78 {0x01,
79 {{PLDM_FWUP_IANA_ENTERPRISE_ID,
80 std::vector<uint8_t>{0x0a, 0x0b, 0x0c, 0xd}},
81 {PLDM_FWUP_UUID,
82 std::vector<uint8_t>{0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18,
83 0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d,
84 0x5b}},
85 {PLDM_FWUP_VENDOR_DEFINED,
86 std::make_tuple("OpenBMC", std::vector<uint8_t>{0x01, 0x02})}}},
87 {0x02,
88 {{PLDM_FWUP_UUID,
89 std::vector<uint8_t>{0xF0, 0x18, 0x87, 0x8C, 0xCB, 0x7D, 0x49, 0x43,
90 0x98, 0x00, 0xA0, 0x2F, 0x59, 0x9A, 0xCA,
91 0x02}}}}};
92 EXPECT_EQ(outDescriptorMap.size(), descriptorMap2.size());
93 EXPECT_EQ(outDescriptorMap, descriptorMap2);
94}
95
96TEST_F(InventoryManagerTest, handleQueryDeviceIdentifiersResponseErrorCC)
97{
98 constexpr size_t respPayloadLength = 1;
99 constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength>
100 queryDeviceIdentifiersResp{0x00, 0x00, 0x00, 0x01};
101 auto responseMsg =
102 reinterpret_cast<const pldm_msg*>(queryDeviceIdentifiersResp.data());
103 inventoryManager.queryDeviceIdentifiers(1, responseMsg, respPayloadLength);
104 EXPECT_EQ(outDescriptorMap.size(), 0);
105}
106
Unive Tien8b169dc2024-11-25 09:34:39 +0800107TEST_F(InventoryManagerTest, handleQueryDownstreamIdentifierResponse)
108{
109 constexpr uint8_t eid = 1;
110 constexpr uint8_t downstreamDeviceCount = 1;
111 constexpr uint32_t downstreamDeviceLen = 11;
112 constexpr size_t respPayloadLength =
113 PLDM_QUERY_DOWNSTREAM_IDENTIFIERS_RESP_MIN_LEN + downstreamDeviceLen;
114
115 std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength>
116 queryDownstreamIdentifiersResp{
117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
118 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
119 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0xa0, 0x15};
120 auto responseMsg = new (queryDownstreamIdentifiersResp.data()) pldm_msg;
121
122 inventoryManager.queryDownstreamIdentifiers(eid, responseMsg,
123 respPayloadLength);
124
125 DownstreamDeviceInfo downstreamDevices = {
126 {0,
127 {{PLDM_FWUP_IANA_ENTERPRISE_ID,
128 std::vector<uint8_t>{0x00, 0x00, 0xa0, 0x15}}}}};
129 DownstreamDescriptorMap refDownstreamDescriptorMap{
130 {eid, downstreamDevices}};
131
132 ASSERT_EQ(outDownstreamDescriptorMap.size(), downstreamDeviceCount);
133 ASSERT_EQ(outDownstreamDescriptorMap.size(),
134 refDownstreamDescriptorMap.size());
135 ASSERT_EQ(outDownstreamDescriptorMap, refDownstreamDescriptorMap);
136}
137
138TEST_F(InventoryManagerTest, handleQueryDownstreamIdentifierResponseErrorCC)
139{
140 constexpr size_t respPayloadLength = 1;
141 constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength>
142 queryDownstreamIdentifiersResp{0x00, 0x00, 0x00, 0x01};
143 const auto responseMsg =
144 new (const_cast<unsigned char*>(queryDownstreamIdentifiersResp.data()))
145 pldm_msg;
146 inventoryManager.queryDownstreamIdentifiers(1, responseMsg,
147 respPayloadLength);
148
149 ASSERT_EQ(outDownstreamDescriptorMap.size(), 0);
150}
151
Tom Joseph75356c12021-06-20 03:52:40 -0700152TEST_F(InventoryManagerTest, getFirmwareParametersResponse)
153{
154 // constexpr uint16_t compCount = 2;
155 // constexpr std::string_view activeCompImageSetVersion{"DeviceVer1.0"};
156 // constexpr std::string_view activeCompVersion1{"Comp1v2.0"};
157 // constexpr std::string_view activeCompVersion2{"Comp2v3.0"};
158 constexpr uint16_t compClassification1 = 10;
159 constexpr uint16_t compIdentifier1 = 300;
160 constexpr uint8_t compClassificationIndex1 = 20;
161 constexpr uint16_t compClassification2 = 16;
162 constexpr uint16_t compIdentifier2 = 301;
163 constexpr uint8_t compClassificationIndex2 = 30;
164
165 constexpr size_t respPayloadLength1 = 119;
166 constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength1>
167 getFirmwareParametersResp1{
168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01,
169 0x0c, 0x00, 0x00, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65,
170 0x72, 0x31, 0x2e, 0x30, 0x0a, 0x00, 0x2c, 0x01, 0x14, 0x00, 0x00,
171 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
173 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43,
174 0x6f, 0x6d, 0x70, 0x31, 0x76, 0x32, 0x2e, 0x30, 0x10, 0x00, 0x2d,
175 0x01, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0x00,
176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
178 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6d, 0x70, 0x32, 0x76, 0x33, 0x2e,
179 0x30};
180 auto responseMsg1 =
181 reinterpret_cast<const pldm_msg*>(getFirmwareParametersResp1.data());
182 inventoryManager.getFirmwareParameters(1, responseMsg1, respPayloadLength1);
183
184 ComponentInfoMap componentInfoMap1{
185 {1,
186 {{std::make_pair(compClassification1, compIdentifier1),
187 compClassificationIndex1},
188 {std::make_pair(compClassification2, compIdentifier2),
189 compClassificationIndex2}}}};
190 EXPECT_EQ(outComponentInfoMap.size(), componentInfoMap1.size());
191 EXPECT_EQ(outComponentInfoMap, componentInfoMap1);
192
193 // constexpr uint16_t compCount = 1;
194 // constexpr std::string_view activeCompImageSetVersion{"DeviceVer2.0"};
195 // constexpr std::string_view activeCompVersion1{"Comp3v4.0"};
196 constexpr uint16_t compClassification3 = 2;
197 constexpr uint16_t compIdentifier3 = 302;
198 constexpr uint8_t compClassificationIndex3 = 40;
199
200 constexpr size_t respPayloadLength2 = 119;
201 constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength2>
202 getFirmwareParametersResp2{
203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01,
204 0x0c, 0x00, 0x00, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65,
205 0x72, 0x32, 0x2e, 0x30, 0x02, 0x00, 0x2e, 0x01, 0x28, 0x00, 0x00,
206 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
208 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43,
209 0x6f, 0x6d, 0x70, 0x33, 0x76, 0x34, 0x2e, 0x30};
210 auto responseMsg2 =
211 reinterpret_cast<const pldm_msg*>(getFirmwareParametersResp2.data());
212 inventoryManager.getFirmwareParameters(2, responseMsg2, respPayloadLength2);
213
214 ComponentInfoMap componentInfoMap2{
215 {1,
216 {{std::make_pair(compClassification1, compIdentifier1),
217 compClassificationIndex1},
218 {std::make_pair(compClassification2, compIdentifier2),
219 compClassificationIndex2}}},
220 {2,
221 {{std::make_pair(compClassification3, compIdentifier3),
222 compClassificationIndex3}}}};
223 EXPECT_EQ(outComponentInfoMap.size(), componentInfoMap2.size());
224 EXPECT_EQ(outComponentInfoMap, componentInfoMap2);
225}
226
227TEST_F(InventoryManagerTest, getFirmwareParametersResponseErrorCC)
228{
229 constexpr size_t respPayloadLength = 1;
230 constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength>
231 getFirmwareParametersResp{0x00, 0x00, 0x00, 0x01};
232 auto responseMsg =
233 reinterpret_cast<const pldm_msg*>(getFirmwareParametersResp.data());
234 inventoryManager.getFirmwareParameters(1, responseMsg, respPayloadLength);
235 EXPECT_EQ(outComponentInfoMap.size(), 0);
236}