xref: /openbmc/libpldm/tests/bindings/cpp/firmware_update_test.cpp (revision d6a957481638b00a49aed15d04b60d3d32fede54)
1*d6a95748SAlexander Hansen #include "libpldm++/firmware_update.hpp"
2*d6a95748SAlexander Hansen #include "libpldm++/types.hpp"
3*d6a95748SAlexander Hansen 
4*d6a95748SAlexander Hansen #include <expected>
5*d6a95748SAlexander Hansen #include <span>
6*d6a95748SAlexander Hansen 
7*d6a95748SAlexander Hansen #include <gmock/gmock.h>
8*d6a95748SAlexander Hansen #include <gtest/gtest.h>
9*d6a95748SAlexander Hansen 
10*d6a95748SAlexander Hansen using namespace pldm::fw_update;
11*d6a95748SAlexander Hansen 
12*d6a95748SAlexander Hansen namespace pldm
13*d6a95748SAlexander Hansen {
14*d6a95748SAlexander Hansen namespace fw_update
15*d6a95748SAlexander Hansen {
16*d6a95748SAlexander Hansen 
17*d6a95748SAlexander Hansen #ifdef LIBPLDM_API_TESTING
18*d6a95748SAlexander Hansen 
19*d6a95748SAlexander Hansen const std::vector<uint8_t> fwPkgHdrSingleComponent{
20*d6a95748SAlexander Hansen     // clang-format off
21*d6a95748SAlexander Hansen     0xF0, 0x18, 0x87, 0x8C, 0xCB, 0x7D, 0x49, 0x43,
22*d6a95748SAlexander Hansen     0x98, 0x00, 0xA0, 0x2F, 0x05, 0x9A, 0xCA, 0x02, // UUID
23*d6a95748SAlexander Hansen 
24*d6a95748SAlexander Hansen     0x01,       // pkg header format revision
25*d6a95748SAlexander Hansen     0x8b, 0x00, // pkg header size
26*d6a95748SAlexander Hansen 
27*d6a95748SAlexander Hansen     0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28*d6a95748SAlexander Hansen     0x00, 0x00, 0x19, 0x0C, 0xE5, 0x07,
29*d6a95748SAlexander Hansen     0x00,       // pkg release date time (13 bytes, timestamp104)
30*d6a95748SAlexander Hansen 
31*d6a95748SAlexander Hansen     0x08, 0x00, // component bitmap bit length
32*d6a95748SAlexander Hansen 
33*d6a95748SAlexander Hansen     0x01,       // package version string type
34*d6a95748SAlexander Hansen 
35*d6a95748SAlexander Hansen     0x0E,       // package version string length
36*d6a95748SAlexander Hansen 
37*d6a95748SAlexander Hansen     0x56, 0x65, 0x72, 0x73, 0x69, 0x6F,
38*d6a95748SAlexander Hansen     0x6E, 0x53, 0x74, 0x72, 0x69, 0x6E,
39*d6a95748SAlexander Hansen     0x67, 0x31, // package version string
40*d6a95748SAlexander Hansen 
41*d6a95748SAlexander Hansen     0x01,       // device id record count
42*d6a95748SAlexander Hansen 
43*d6a95748SAlexander Hansen     0x2E, 0x00, // record 0: record length
44*d6a95748SAlexander Hansen 
45*d6a95748SAlexander Hansen     0x01,                   // record 0: descriptor count
46*d6a95748SAlexander Hansen     0x01, 0x00, 0x00, 0x00, // record 0: device update options flags
47*d6a95748SAlexander Hansen 
48*d6a95748SAlexander Hansen     0x01,       // record 0: component image set version string type
49*d6a95748SAlexander Hansen     0x0E,       // record 0: component image set version string length
50*d6a95748SAlexander Hansen     0x00, 0x00, // record 0: firmware device package data length
51*d6a95748SAlexander Hansen 
52*d6a95748SAlexander Hansen     0x01,       // applicable components
53*d6a95748SAlexander Hansen 
54*d6a95748SAlexander Hansen     0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E,
55*d6a95748SAlexander Hansen     0x53, 0x74, 0x72, 0x69, 0x6E, 0x67,
56*d6a95748SAlexander Hansen     0x32,       // component image set version string (14 bytes)
57*d6a95748SAlexander Hansen 
58*d6a95748SAlexander Hansen     // record descriptors below
59*d6a95748SAlexander Hansen     0x02, 0x00, // record 0: descriptor type: UUID
60*d6a95748SAlexander Hansen 
61*d6a95748SAlexander Hansen     0x10, 0x00, // record 0: InitialDescriptorLength (16 bytes)
62*d6a95748SAlexander Hansen 
63*d6a95748SAlexander Hansen     0x16, 0x20, 0x23, 0xC9, 0x3E, 0xC5, 0x41,
64*d6a95748SAlexander Hansen     0x15, 0x95, 0xF4, 0x48, 0x70, 0x1D, 0x49,
65*d6a95748SAlexander Hansen     0xD6, 0x75, // record 0: InitialDescriptorData (UUID)
66*d6a95748SAlexander Hansen 
67*d6a95748SAlexander Hansen     // firmware device package data (empty here)
68*d6a95748SAlexander Hansen 
69*d6a95748SAlexander Hansen     // component image info area
70*d6a95748SAlexander Hansen     0x01, 0x00,             // component image count
71*d6a95748SAlexander Hansen 
72*d6a95748SAlexander Hansen     0x0A, 0x00,             // component classification
73*d6a95748SAlexander Hansen     0x64, 0x00,             // component identifier
74*d6a95748SAlexander Hansen     0xFF, 0xFF, 0xFF, 0xFF, // component comparison stamp
75*d6a95748SAlexander Hansen     0x00, 0x00,             // component options
76*d6a95748SAlexander Hansen 
77*d6a95748SAlexander Hansen     0x00, 0x00,             // requested component activation method
78*d6a95748SAlexander Hansen     0x8B, 0x00, 0x00, 0x00, // component location offset
79*d6a95748SAlexander Hansen     0x01, 0x00, 0x00, 0x00, // component size
80*d6a95748SAlexander Hansen     0x01,                   // component version string type
81*d6a95748SAlexander Hansen     0x0E,                   // component version string length
82*d6a95748SAlexander Hansen 
83*d6a95748SAlexander Hansen     0x56, 0x65, 0x72, 0x73, 0x69, 0x6F,
84*d6a95748SAlexander Hansen     0x6E, 0x53, 0x74, 0x72, 0x69, 0x6E,
85*d6a95748SAlexander Hansen     0x67, 0x33,             // component version string
86*d6a95748SAlexander Hansen 
87*d6a95748SAlexander Hansen     0x54, 0x9d, 0x7d, 0xe1, // package header checksum
88*d6a95748SAlexander Hansen 
89*d6a95748SAlexander Hansen     0x00,                   // component image
90*d6a95748SAlexander Hansen     // clang-format on
91*d6a95748SAlexander Hansen };
92*d6a95748SAlexander Hansen 
93*d6a95748SAlexander Hansen #endif
94*d6a95748SAlexander Hansen 
95*d6a95748SAlexander Hansen #ifdef LIBPLDM_API_TESTING
96*d6a95748SAlexander Hansen 
TEST(PackageParserTest,ValidPkgSingleDescriptorSingleComponent)97*d6a95748SAlexander Hansen TEST(PackageParserTest, ValidPkgSingleDescriptorSingleComponent)
98*d6a95748SAlexander Hansen {
99*d6a95748SAlexander Hansen 
100*d6a95748SAlexander Hansen     uintmax_t pkgSize = fwPkgHdrSingleComponent.size();
101*d6a95748SAlexander Hansen 
102*d6a95748SAlexander Hansen     std::cout << pkgSize << std::endl;
103*d6a95748SAlexander Hansen 
104*d6a95748SAlexander Hansen     DEFINE_PLDM_PACKAGE_FORMAT_PIN_FR01H(pin);
105*d6a95748SAlexander Hansen     auto span = std::span<const uint8_t>(fwPkgHdrSingleComponent);
106*d6a95748SAlexander Hansen     auto res = PackageParser::parse(span, pin);
107*d6a95748SAlexander Hansen 
108*d6a95748SAlexander Hansen     if (!res.has_value())
109*d6a95748SAlexander Hansen     {
110*d6a95748SAlexander Hansen         std::cout << res.error().msg << std::endl;
111*d6a95748SAlexander Hansen     }
112*d6a95748SAlexander Hansen 
113*d6a95748SAlexander Hansen     ASSERT_TRUE(res.has_value());
114*d6a95748SAlexander Hansen 
115*d6a95748SAlexander Hansen     auto outfwDeviceIDRecords = res.value()->firmwareDeviceIdRecords;
116*d6a95748SAlexander Hansen 
117*d6a95748SAlexander Hansen     std::vector<uint8_t> dd1Data{0x16, 0x20, 0x23, 0xC9, 0x3E, 0xC5,
118*d6a95748SAlexander Hansen                                  0x41, 0x15, 0x95, 0xF4, 0x48, 0x70,
119*d6a95748SAlexander Hansen                                  0x1D, 0x49, 0xD6, 0x75};
120*d6a95748SAlexander Hansen 
121*d6a95748SAlexander Hansen     ASSERT_EQ(outfwDeviceIDRecords.size(), 1);
122*d6a95748SAlexander Hansen 
123*d6a95748SAlexander Hansen     // we cannot compare the applicable components here since their memory
124*d6a95748SAlexander Hansen     // address will be different
125*d6a95748SAlexander Hansen     EXPECT_EQ(outfwDeviceIDRecords[0].deviceUpdateOptionFlags,
126*d6a95748SAlexander Hansen               std::bitset<32>(1));
127*d6a95748SAlexander Hansen     EXPECT_EQ(outfwDeviceIDRecords[0].componentImageSetVersionString,
128*d6a95748SAlexander Hansen               "VersionString2");
129*d6a95748SAlexander Hansen 
130*d6a95748SAlexander Hansen     EXPECT_EQ(outfwDeviceIDRecords[0].getDescriptorTypes(),
131*d6a95748SAlexander Hansen               std::vector<uint16_t>({PLDM_FWUP_UUID}));
132*d6a95748SAlexander Hansen 
133*d6a95748SAlexander Hansen     // assert for descriptor type PLDM_FWUP_UUID
134*d6a95748SAlexander Hansen     const auto& d1 =
135*d6a95748SAlexander Hansen         outfwDeviceIDRecords[0].recordDescriptors.at(PLDM_FWUP_UUID);
136*d6a95748SAlexander Hansen     EXPECT_EQ(d1->data, dd1Data);
137*d6a95748SAlexander Hansen     EXPECT_EQ(d1->vendorDefinedDescriptorTitle, std::nullopt);
138*d6a95748SAlexander Hansen 
139*d6a95748SAlexander Hansen     EXPECT_EQ(outfwDeviceIDRecords[0].firmwareDevicePackageData,
140*d6a95748SAlexander Hansen               std::vector<uint8_t>{});
141*d6a95748SAlexander Hansen 
142*d6a95748SAlexander Hansen     auto outCompImageInfos = res.value()->componentImageInformation;
143*d6a95748SAlexander Hansen 
144*d6a95748SAlexander Hansen     ASSERT_EQ(outCompImageInfos.size(), 1);
145*d6a95748SAlexander Hansen 
146*d6a95748SAlexander Hansen     EXPECT_EQ(outCompImageInfos[0].componentClassification, 10);
147*d6a95748SAlexander Hansen     EXPECT_EQ(outCompImageInfos[0].componentIdentifier, 100);
148*d6a95748SAlexander Hansen     EXPECT_EQ(outCompImageInfos[0].compComparisonStamp, 0xFFFFFFFF);
149*d6a95748SAlexander Hansen     EXPECT_EQ(outCompImageInfos[0].componentOptions, 0);
150*d6a95748SAlexander Hansen     EXPECT_EQ(outCompImageInfos[0].requestedComponentActivationMethod, 0);
151*d6a95748SAlexander Hansen     EXPECT_EQ(outCompImageInfos[0].componentLocation.length, 1);
152*d6a95748SAlexander Hansen     EXPECT_EQ(outCompImageInfos[0].componentVersion, "VersionString3");
153*d6a95748SAlexander Hansen }
154*d6a95748SAlexander Hansen 
155*d6a95748SAlexander Hansen #endif
156*d6a95748SAlexander Hansen 
157*d6a95748SAlexander Hansen } // namespace fw_update
158*d6a95748SAlexander Hansen } // namespace pldm
159