blob: bd1d6849aee85a994cfe58731fb069dc6ba2572c [file] [log] [blame]
Andrew Jeffery2abbce72023-10-18 10:17:35 +10301#include "common/instance_id.hpp"
Tom Josephef90b0d2021-08-17 07:12:49 -07002#include "common/utils.hpp"
3#include "fw-update/device_updater.hpp"
4#include "fw-update/package_parser.hpp"
Tom Josephef90b0d2021-08-17 07:12:49 -07005#include "requester/handler.hpp"
6
George Liuc453e162022-12-21 17:16:23 +08007#include <libpldm/firmware_update.h>
8
Tom Josephef90b0d2021-08-17 07:12:49 -07009#include <gmock/gmock.h>
10#include <gtest/gtest.h>
11
12using namespace pldm;
Tom Josephef90b0d2021-08-17 07:12:49 -070013using namespace pldm::fw_update;
14
15class DeviceUpdaterTest : public testing::Test
16{
17 protected:
18 DeviceUpdaterTest() :
Tom Josephef90b0d2021-08-17 07:12:49 -070019 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;
Tom Josephef90b0d2021-08-17 07:12:49 -070036 std::ifstream package;
37 FirmwareDeviceIDRecord fwDeviceIDRecord;
38 ComponentImageInfos compImageInfos;
39 ComponentInfo compInfo;
40};
41
42TEST_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));
Pavithra Barithaya5ea72372025-02-04 18:09:57 +053050 package.read(new (packageHeader.data()) char,
Tom Josephef90b0d2021-08-17 07:12:49 -070051 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);
Pavithra Barithaya5ea72372025-02-04 18:09:57 +053061 package.read(new (packageHeader.data()) char, pkgHeaderInfoSize);
Tom Josephef90b0d2021-08-17 07:12:49 -070062
63 auto parser = parsePkgHeader(packageHeader);
64 EXPECT_NE(parser, nullptr);
65
66 package.seekg(0);
67 packageHeader.resize(parser->pkgHeaderSize);
Pavithra Barithaya5ea72372025-02-04 18:09:57 +053068 package.read(new (packageHeader.data()) char, parser->pkgHeaderSize);
Tom Josephef90b0d2021-08-17 07:12:49 -070069
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
80TEST_F(DeviceUpdaterTest, ReadPackage512B)
81{
Tom Josephb7e083e2021-10-26 15:10:03 +053082 DeviceUpdater deviceUpdater(0, package, fwDeviceIDRecord, compImageInfos,
83 compInfo, 512, nullptr);
Tom Josephef90b0d2021-08-17 07:12:49 -070084
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}