1 #include "common/instance_id.hpp"
2 #include "common/utils.hpp"
3 #include "fw-update/device_updater.hpp"
4 #include "fw-update/package_parser.hpp"
5 #include "requester/handler.hpp"
6
7 #include <libpldm/firmware_update.h>
8
9 #include <gmock/gmock.h>
10 #include <gtest/gtest.h>
11
12 using namespace pldm;
13 using namespace pldm::fw_update;
14
15 class DeviceUpdaterTest : public testing::Test
16 {
17 protected:
DeviceUpdaterTest()18 DeviceUpdaterTest() :
19 package("./test_pkg", std::ios::binary | std::ios::in | std::ios::ate)
20 {
21 fwDeviceIDRecord = {
22 1,
23 {0x00},
24 "VersionString2",
25 {{PLDM_FWUP_UUID,
26 std::vector<uint8_t>{0x16, 0x20, 0x23, 0xC9, 0x3E, 0xC5, 0x41,
27 0x15, 0x95, 0xF4, 0x48, 0x70, 0x1D, 0x49,
28 0xD6, 0x75}}},
29 {}};
30 compImageInfos = {
31 {10, 100, 0xFFFFFFFF, 0, 0, 139, 1024, "VersionString3"}};
32 compInfo = {{std::make_pair(10, 100), 1}};
33 }
34
35 int fd = -1;
36 std::ifstream package;
37 FirmwareDeviceIDRecord fwDeviceIDRecord;
38 ComponentImageInfos compImageInfos;
39 ComponentInfo compInfo;
40 };
41
TEST_F(DeviceUpdaterTest,validatePackage)42 TEST_F(DeviceUpdaterTest, validatePackage)
43 {
44 constexpr uintmax_t testPkgSize = 1163;
45 uintmax_t packageSize = package.tellg();
46 EXPECT_EQ(packageSize, testPkgSize);
47
48 package.seekg(0);
49 std::vector<uint8_t> packageHeader(sizeof(pldm_package_header_information));
50 package.read(new (packageHeader.data()) char,
51 sizeof(pldm_package_header_information));
52
53 auto pkgHeaderInfo =
54 reinterpret_cast<const pldm_package_header_information*>(
55 packageHeader.data());
56 auto pkgHeaderInfoSize = sizeof(pldm_package_header_information) +
57 pkgHeaderInfo->package_version_string_length;
58 packageHeader.clear();
59 packageHeader.resize(pkgHeaderInfoSize);
60 package.seekg(0);
61 package.read(new (packageHeader.data()) char, pkgHeaderInfoSize);
62
63 auto parser = parsePkgHeader(packageHeader);
64 EXPECT_NE(parser, nullptr);
65
66 package.seekg(0);
67 packageHeader.resize(parser->pkgHeaderSize);
68 package.read(new (packageHeader.data()) char, parser->pkgHeaderSize);
69
70 parser->parse(packageHeader, packageSize);
71 const auto& fwDeviceIDRecords = parser->getFwDeviceIDRecords();
72 const auto& testPkgCompImageInfos = parser->getComponentImageInfos();
73
74 EXPECT_EQ(fwDeviceIDRecords.size(), 1);
75 EXPECT_EQ(compImageInfos.size(), 1);
76 EXPECT_EQ(fwDeviceIDRecords[0], fwDeviceIDRecord);
77 EXPECT_EQ(testPkgCompImageInfos, compImageInfos);
78 }
79
TEST_F(DeviceUpdaterTest,ReadPackage512B)80 TEST_F(DeviceUpdaterTest, ReadPackage512B)
81 {
82 DeviceUpdater deviceUpdater(0, package, fwDeviceIDRecord, compImageInfos,
83 compInfo, 512, nullptr);
84
85 constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) +
86 sizeof(pldm_request_firmware_data_req)>
87 reqFwDataReq{0x8A, 0x05, 0x15, 0x00, 0x00, 0x00,
88 0x00, 0x00, 0x02, 0x00, 0x00};
89 constexpr uint8_t instanceId = 0x0A;
90 constexpr uint8_t completionCode = PLDM_SUCCESS;
91 constexpr uint32_t length = 512;
92 auto requestMsg = reinterpret_cast<const pldm_msg*>(reqFwDataReq.data());
93 auto response = deviceUpdater.requestFwData(
94 requestMsg, sizeof(pldm_request_firmware_data_req));
95
96 EXPECT_EQ(response.size(),
97 sizeof(pldm_msg_hdr) + sizeof(completionCode) + length);
98 auto responeMsg = reinterpret_cast<const pldm_msg*>(response.data());
99 EXPECT_EQ(responeMsg->hdr.request, PLDM_RESPONSE);
100 EXPECT_EQ(responeMsg->hdr.instance_id, instanceId);
101 EXPECT_EQ(responeMsg->hdr.type, PLDM_FWUP);
102 EXPECT_EQ(responeMsg->hdr.command, PLDM_REQUEST_FIRMWARE_DATA);
103 EXPECT_EQ(response[sizeof(pldm_msg_hdr)], completionCode);
104
105 const std::vector<uint8_t> compFirst512B{
106 0x0A, 0x05, 0x15, 0x00, 0x48, 0xD2, 0x1E, 0x80, 0x2E, 0x77, 0x71, 0x2C,
107 0x8E, 0xE3, 0x1F, 0x6F, 0x30, 0x76, 0x65, 0x08, 0xB8, 0x1B, 0x4B, 0x03,
108 0x7E, 0x96, 0xD9, 0x2A, 0x36, 0x3A, 0xA2, 0xEE, 0x8A, 0x30, 0x21, 0x33,
109 0xFC, 0x27, 0xE7, 0x3E, 0x56, 0x79, 0x0E, 0xBD, 0xED, 0x44, 0x96, 0x2F,
110 0x84, 0xB5, 0xED, 0x19, 0x3A, 0x5E, 0x62, 0x2A, 0x6E, 0x41, 0x7E, 0xDC,
111 0x2E, 0xBB, 0x87, 0x41, 0x7F, 0xCE, 0xF0, 0xD7, 0xE4, 0x0F, 0x95, 0x33,
112 0x3B, 0xF9, 0x04, 0xF8, 0x1A, 0x92, 0x54, 0xFD, 0x33, 0xBA, 0xCD, 0xA6,
113 0x08, 0x0D, 0x32, 0x2C, 0xEB, 0x75, 0xDC, 0xEA, 0xBA, 0x30, 0x94, 0x78,
114 0x8C, 0x61, 0x58, 0xD0, 0x59, 0xF3, 0x29, 0x6D, 0x67, 0xD3, 0x26, 0x08,
115 0x25, 0x1E, 0x69, 0xBB, 0x28, 0xB0, 0x61, 0xFB, 0x96, 0xA3, 0x8C, 0xBF,
116 0x01, 0x94, 0xEB, 0x3A, 0x63, 0x6F, 0xC8, 0x0F, 0x42, 0x7F, 0xEB, 0x3D,
117 0xA7, 0x8B, 0xE5, 0xD2, 0xFB, 0xB8, 0xD3, 0x15, 0xAA, 0xDF, 0x86, 0xAB,
118 0x6E, 0x29, 0xB3, 0x12, 0x96, 0xB7, 0x86, 0xDA, 0xF9, 0xD7, 0x70, 0xAD,
119 0xB6, 0x1A, 0x29, 0xB1, 0xA4, 0x2B, 0x6F, 0x63, 0xEE, 0x05, 0x9F, 0x35,
120 0x49, 0xA1, 0xAB, 0xA2, 0x6F, 0x7C, 0xFC, 0x23, 0x09, 0x55, 0xED, 0xF7,
121 0x35, 0xD8, 0x2F, 0x8F, 0xD2, 0xBD, 0x77, 0xED, 0x0C, 0x7A, 0xE9, 0xD3,
122 0xF7, 0x90, 0xA7, 0x45, 0x97, 0xAA, 0x3A, 0x79, 0xC4, 0xF8, 0xD2, 0xFE,
123 0xFB, 0xB3, 0x25, 0x86, 0x98, 0x6B, 0x98, 0x10, 0x15, 0xB3, 0xDD, 0x43,
124 0x0B, 0x20, 0x5F, 0xE4, 0x62, 0xC8, 0xA1, 0x3E, 0x9C, 0xF3, 0xD8, 0xEA,
125 0x15, 0xA1, 0x24, 0x94, 0x1C, 0xF5, 0xB4, 0x86, 0x04, 0x30, 0x2C, 0x84,
126 0xB6, 0x29, 0xF6, 0x9D, 0x76, 0x6E, 0xD4, 0x0C, 0x1C, 0xBD, 0xF9, 0x95,
127 0x7E, 0xAF, 0x62, 0x80, 0x14, 0xE6, 0x1C, 0x43, 0x51, 0x5C, 0xCA, 0x50,
128 0xE1, 0x73, 0x3D, 0x75, 0x66, 0x52, 0x9E, 0xB6, 0x15, 0x7E, 0xF7, 0xE5,
129 0xE2, 0xAF, 0x54, 0x75, 0x82, 0x3D, 0x55, 0xC7, 0x59, 0xD7, 0xBD, 0x8C,
130 0x4B, 0x74, 0xD1, 0x3F, 0xA8, 0x1B, 0x0A, 0xF0, 0x5A, 0x32, 0x2B, 0xA7,
131 0xA4, 0xBE, 0x38, 0x18, 0xAE, 0x69, 0xDC, 0x54, 0x7C, 0x60, 0xEF, 0x4F,
132 0x0F, 0x7F, 0x5A, 0xA6, 0xC8, 0x3E, 0x59, 0xFD, 0xF5, 0x98, 0x26, 0x71,
133 0xD0, 0xEF, 0x54, 0x47, 0x38, 0x1F, 0x18, 0x9D, 0x37, 0x9D, 0xF0, 0xCD,
134 0x00, 0x73, 0x30, 0xD4, 0xB7, 0xDA, 0x2D, 0x36, 0xA1, 0xA9, 0xAD, 0x4F,
135 0x9F, 0x17, 0xA5, 0xA1, 0x62, 0x18, 0x21, 0xDD, 0x0E, 0xB6, 0x72, 0xDE,
136 0x17, 0xF0, 0x71, 0x94, 0xA9, 0x67, 0xB4, 0x75, 0xDB, 0x64, 0xF0, 0x6E,
137 0x3D, 0x4E, 0x29, 0x45, 0x42, 0xC3, 0xDA, 0x1F, 0x9E, 0x31, 0x4D, 0x1B,
138 0xA7, 0x9D, 0x07, 0xD9, 0x10, 0x75, 0x27, 0x92, 0x16, 0x35, 0xF5, 0x51,
139 0x3E, 0x14, 0x00, 0xB4, 0xBD, 0x21, 0xAF, 0x90, 0xC5, 0xE5, 0xEE, 0xD0,
140 0xB3, 0x7F, 0x61, 0xA5, 0x1B, 0x91, 0xD5, 0x66, 0x08, 0xB5, 0x16, 0x25,
141 0xC2, 0x16, 0x53, 0xDC, 0xB5, 0xF1, 0xDD, 0xCF, 0x28, 0xDD, 0x57, 0x90,
142 0x66, 0x33, 0x7B, 0x75, 0xF4, 0x8A, 0x19, 0xAC, 0x1F, 0x44, 0xC2, 0xF6,
143 0x21, 0x07, 0xE9, 0xCC, 0xDD, 0xCF, 0x4A, 0x34, 0xA1, 0x24, 0x82, 0xF8,
144 0xA1, 0x1D, 0x06, 0x90, 0x4B, 0x97, 0xB8, 0x10, 0xF2, 0x6A, 0x55, 0x30,
145 0xD9, 0x4F, 0x94, 0xE7, 0x7C, 0xBB, 0x73, 0xA3, 0x5F, 0xC6, 0xF1, 0xDB,
146 0x84, 0x3D, 0x29, 0x72, 0xD1, 0xAD, 0x2D, 0x77, 0x3F, 0x36, 0x24, 0x0F,
147 0xC4, 0x12, 0xD7, 0x3C, 0x65, 0x6C, 0xE1, 0x5A, 0x32, 0xAA, 0x0B, 0xA3,
148 0xA2, 0x72, 0x33, 0x00, 0x3C, 0x7E, 0x28, 0x36, 0x10, 0x90, 0x38, 0xFB};
149 EXPECT_EQ(response, compFirst512B);
150 }
151