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