1 #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 12 using namespace pldm; 13 using namespace pldm::fw_update; 14 15 class DeviceUpdaterTest : public testing::Test 16 { 17 protected: 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 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(reinterpret_cast<char*>(packageHeader.data()), 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(reinterpret_cast<char*>(packageHeader.data()), 62 pkgHeaderInfoSize); 63 64 auto parser = parsePkgHeader(packageHeader); 65 EXPECT_NE(parser, nullptr); 66 67 package.seekg(0); 68 packageHeader.resize(parser->pkgHeaderSize); 69 package.read(reinterpret_cast<char*>(packageHeader.data()), 70 parser->pkgHeaderSize); 71 72 parser->parse(packageHeader, packageSize); 73 const auto& fwDeviceIDRecords = parser->getFwDeviceIDRecords(); 74 const auto& testPkgCompImageInfos = parser->getComponentImageInfos(); 75 76 EXPECT_EQ(fwDeviceIDRecords.size(), 1); 77 EXPECT_EQ(compImageInfos.size(), 1); 78 EXPECT_EQ(fwDeviceIDRecords[0], fwDeviceIDRecord); 79 EXPECT_EQ(testPkgCompImageInfos, compImageInfos); 80 } 81 82 TEST_F(DeviceUpdaterTest, ReadPackage512B) 83 { 84 DeviceUpdater deviceUpdater(0, package, fwDeviceIDRecord, compImageInfos, 85 compInfo, 512, nullptr); 86 87 constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + 88 sizeof(pldm_request_firmware_data_req)> 89 reqFwDataReq{0x8A, 0x05, 0x15, 0x00, 0x00, 0x00, 90 0x00, 0x00, 0x02, 0x00, 0x00}; 91 constexpr uint8_t instanceId = 0x0A; 92 constexpr uint8_t completionCode = PLDM_SUCCESS; 93 constexpr uint32_t length = 512; 94 auto requestMsg = reinterpret_cast<const pldm_msg*>(reqFwDataReq.data()); 95 auto response = deviceUpdater.requestFwData( 96 requestMsg, sizeof(pldm_request_firmware_data_req)); 97 98 EXPECT_EQ(response.size(), 99 sizeof(pldm_msg_hdr) + sizeof(completionCode) + length); 100 auto responeMsg = reinterpret_cast<const pldm_msg*>(response.data()); 101 EXPECT_EQ(responeMsg->hdr.request, PLDM_RESPONSE); 102 EXPECT_EQ(responeMsg->hdr.instance_id, instanceId); 103 EXPECT_EQ(responeMsg->hdr.type, PLDM_FWUP); 104 EXPECT_EQ(responeMsg->hdr.command, PLDM_REQUEST_FIRMWARE_DATA); 105 EXPECT_EQ(response[sizeof(pldm_msg_hdr)], completionCode); 106 107 const std::vector<uint8_t> compFirst512B{ 108 0x0A, 0x05, 0x15, 0x00, 0x48, 0xD2, 0x1E, 0x80, 0x2E, 0x77, 0x71, 0x2C, 109 0x8E, 0xE3, 0x1F, 0x6F, 0x30, 0x76, 0x65, 0x08, 0xB8, 0x1B, 0x4B, 0x03, 110 0x7E, 0x96, 0xD9, 0x2A, 0x36, 0x3A, 0xA2, 0xEE, 0x8A, 0x30, 0x21, 0x33, 111 0xFC, 0x27, 0xE7, 0x3E, 0x56, 0x79, 0x0E, 0xBD, 0xED, 0x44, 0x96, 0x2F, 112 0x84, 0xB5, 0xED, 0x19, 0x3A, 0x5E, 0x62, 0x2A, 0x6E, 0x41, 0x7E, 0xDC, 113 0x2E, 0xBB, 0x87, 0x41, 0x7F, 0xCE, 0xF0, 0xD7, 0xE4, 0x0F, 0x95, 0x33, 114 0x3B, 0xF9, 0x04, 0xF8, 0x1A, 0x92, 0x54, 0xFD, 0x33, 0xBA, 0xCD, 0xA6, 115 0x08, 0x0D, 0x32, 0x2C, 0xEB, 0x75, 0xDC, 0xEA, 0xBA, 0x30, 0x94, 0x78, 116 0x8C, 0x61, 0x58, 0xD0, 0x59, 0xF3, 0x29, 0x6D, 0x67, 0xD3, 0x26, 0x08, 117 0x25, 0x1E, 0x69, 0xBB, 0x28, 0xB0, 0x61, 0xFB, 0x96, 0xA3, 0x8C, 0xBF, 118 0x01, 0x94, 0xEB, 0x3A, 0x63, 0x6F, 0xC8, 0x0F, 0x42, 0x7F, 0xEB, 0x3D, 119 0xA7, 0x8B, 0xE5, 0xD2, 0xFB, 0xB8, 0xD3, 0x15, 0xAA, 0xDF, 0x86, 0xAB, 120 0x6E, 0x29, 0xB3, 0x12, 0x96, 0xB7, 0x86, 0xDA, 0xF9, 0xD7, 0x70, 0xAD, 121 0xB6, 0x1A, 0x29, 0xB1, 0xA4, 0x2B, 0x6F, 0x63, 0xEE, 0x05, 0x9F, 0x35, 122 0x49, 0xA1, 0xAB, 0xA2, 0x6F, 0x7C, 0xFC, 0x23, 0x09, 0x55, 0xED, 0xF7, 123 0x35, 0xD8, 0x2F, 0x8F, 0xD2, 0xBD, 0x77, 0xED, 0x0C, 0x7A, 0xE9, 0xD3, 124 0xF7, 0x90, 0xA7, 0x45, 0x97, 0xAA, 0x3A, 0x79, 0xC4, 0xF8, 0xD2, 0xFE, 125 0xFB, 0xB3, 0x25, 0x86, 0x98, 0x6B, 0x98, 0x10, 0x15, 0xB3, 0xDD, 0x43, 126 0x0B, 0x20, 0x5F, 0xE4, 0x62, 0xC8, 0xA1, 0x3E, 0x9C, 0xF3, 0xD8, 0xEA, 127 0x15, 0xA1, 0x24, 0x94, 0x1C, 0xF5, 0xB4, 0x86, 0x04, 0x30, 0x2C, 0x84, 128 0xB6, 0x29, 0xF6, 0x9D, 0x76, 0x6E, 0xD4, 0x0C, 0x1C, 0xBD, 0xF9, 0x95, 129 0x7E, 0xAF, 0x62, 0x80, 0x14, 0xE6, 0x1C, 0x43, 0x51, 0x5C, 0xCA, 0x50, 130 0xE1, 0x73, 0x3D, 0x75, 0x66, 0x52, 0x9E, 0xB6, 0x15, 0x7E, 0xF7, 0xE5, 131 0xE2, 0xAF, 0x54, 0x75, 0x82, 0x3D, 0x55, 0xC7, 0x59, 0xD7, 0xBD, 0x8C, 132 0x4B, 0x74, 0xD1, 0x3F, 0xA8, 0x1B, 0x0A, 0xF0, 0x5A, 0x32, 0x2B, 0xA7, 133 0xA4, 0xBE, 0x38, 0x18, 0xAE, 0x69, 0xDC, 0x54, 0x7C, 0x60, 0xEF, 0x4F, 134 0x0F, 0x7F, 0x5A, 0xA6, 0xC8, 0x3E, 0x59, 0xFD, 0xF5, 0x98, 0x26, 0x71, 135 0xD0, 0xEF, 0x54, 0x47, 0x38, 0x1F, 0x18, 0x9D, 0x37, 0x9D, 0xF0, 0xCD, 136 0x00, 0x73, 0x30, 0xD4, 0xB7, 0xDA, 0x2D, 0x36, 0xA1, 0xA9, 0xAD, 0x4F, 137 0x9F, 0x17, 0xA5, 0xA1, 0x62, 0x18, 0x21, 0xDD, 0x0E, 0xB6, 0x72, 0xDE, 138 0x17, 0xF0, 0x71, 0x94, 0xA9, 0x67, 0xB4, 0x75, 0xDB, 0x64, 0xF0, 0x6E, 139 0x3D, 0x4E, 0x29, 0x45, 0x42, 0xC3, 0xDA, 0x1F, 0x9E, 0x31, 0x4D, 0x1B, 140 0xA7, 0x9D, 0x07, 0xD9, 0x10, 0x75, 0x27, 0x92, 0x16, 0x35, 0xF5, 0x51, 141 0x3E, 0x14, 0x00, 0xB4, 0xBD, 0x21, 0xAF, 0x90, 0xC5, 0xE5, 0xEE, 0xD0, 142 0xB3, 0x7F, 0x61, 0xA5, 0x1B, 0x91, 0xD5, 0x66, 0x08, 0xB5, 0x16, 0x25, 143 0xC2, 0x16, 0x53, 0xDC, 0xB5, 0xF1, 0xDD, 0xCF, 0x28, 0xDD, 0x57, 0x90, 144 0x66, 0x33, 0x7B, 0x75, 0xF4, 0x8A, 0x19, 0xAC, 0x1F, 0x44, 0xC2, 0xF6, 145 0x21, 0x07, 0xE9, 0xCC, 0xDD, 0xCF, 0x4A, 0x34, 0xA1, 0x24, 0x82, 0xF8, 146 0xA1, 0x1D, 0x06, 0x90, 0x4B, 0x97, 0xB8, 0x10, 0xF2, 0x6A, 0x55, 0x30, 147 0xD9, 0x4F, 0x94, 0xE7, 0x7C, 0xBB, 0x73, 0xA3, 0x5F, 0xC6, 0xF1, 0xDB, 148 0x84, 0x3D, 0x29, 0x72, 0xD1, 0xAD, 0x2D, 0x77, 0x3F, 0x36, 0x24, 0x0F, 149 0xC4, 0x12, 0xD7, 0x3C, 0x65, 0x6C, 0xE1, 0x5A, 0x32, 0xAA, 0x0B, 0xA3, 150 0xA2, 0x72, 0x33, 0x00, 0x3C, 0x7E, 0x28, 0x36, 0x10, 0x90, 0x38, 0xFB}; 151 EXPECT_EQ(response, compFirst512B); 152 } 153