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