| #include "common/utils.hpp" | |
| #include "fw-update/inventory_manager.hpp" | |
| #include "requester/test/mock_request.hpp" | |
| #include "test/test_instance_id.hpp" | |
| #include <libpldm/firmware_update.h> | |
| #include <gtest/gtest.h> | |
| using namespace pldm; | |
| using namespace std::chrono; | |
| using namespace pldm::fw_update; | |
| class InventoryManagerTest : public testing::Test | |
| { | |
| protected: | |
| InventoryManagerTest() : | |
| event(sdeventplus::Event::get_default()), instanceIdDb(), | |
| reqHandler(nullptr, event, instanceIdDb, false, seconds(1), 2, | |
| milliseconds(100)), | |
| inventoryManager(reqHandler, instanceIdDb, outDescriptorMap, | |
| outDownstreamDescriptorMap, outComponentInfoMap) | |
| {} | |
| int fd = -1; | |
| sdeventplus::Event event; | |
| TestInstanceIdDb instanceIdDb; | |
| requester::Handler<requester::Request> reqHandler; | |
| InventoryManager inventoryManager; | |
| DescriptorMap outDescriptorMap{}; | |
| DownstreamDescriptorMap outDownstreamDescriptorMap{}; | |
| ComponentInfoMap outComponentInfoMap{}; | |
| }; | |
| TEST_F(InventoryManagerTest, handleQueryDeviceIdentifiersResponse) | |
| { | |
| constexpr size_t respPayloadLength1 = 49; | |
| constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength1> | |
| queryDeviceIdentifiersResp1{ | |
| 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, | |
| 0x04, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x02, 0x00, 0x10, 0x00, 0x12, | |
| 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18, 0xa0, 0x30, 0xfc, 0x8a, | |
| 0x56, 0x58, 0x7d, 0x5b, 0xFF, 0xFF, 0x0B, 0x00, 0x01, 0x07, 0x4f, | |
| 0x70, 0x65, 0x6e, 0x42, 0x4d, 0x43, 0x01, 0x02}; | |
| auto responseMsg1 = | |
| reinterpret_cast<const pldm_msg*>(queryDeviceIdentifiersResp1.data()); | |
| inventoryManager.queryDeviceIdentifiers(1, responseMsg1, | |
| respPayloadLength1); | |
| DescriptorMap descriptorMap1{ | |
| {0x01, | |
| {{PLDM_FWUP_IANA_ENTERPRISE_ID, | |
| std::vector<uint8_t>{0x0a, 0x0b, 0x0c, 0xd}}, | |
| {PLDM_FWUP_UUID, | |
| std::vector<uint8_t>{0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18, | |
| 0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, | |
| 0x5b}}, | |
| {PLDM_FWUP_VENDOR_DEFINED, | |
| std::make_tuple("OpenBMC", std::vector<uint8_t>{0x01, 0x02})}}}}; | |
| EXPECT_EQ(outDescriptorMap.size(), descriptorMap1.size()); | |
| EXPECT_EQ(outDescriptorMap, descriptorMap1); | |
| constexpr size_t respPayloadLength2 = 26; | |
| constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength2> | |
| queryDeviceIdentifiersResp2{ | |
| 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x02, | |
| 0x00, 0x10, 0x00, 0xF0, 0x18, 0x87, 0x8C, 0xCB, 0x7D, 0x49, | |
| 0x43, 0x98, 0x00, 0xA0, 0x2F, 0x59, 0x9A, 0xCA, 0x02}; | |
| auto responseMsg2 = | |
| reinterpret_cast<const pldm_msg*>(queryDeviceIdentifiersResp2.data()); | |
| inventoryManager.queryDeviceIdentifiers(2, responseMsg2, | |
| respPayloadLength2); | |
| DescriptorMap descriptorMap2{ | |
| {0x01, | |
| {{PLDM_FWUP_IANA_ENTERPRISE_ID, | |
| std::vector<uint8_t>{0x0a, 0x0b, 0x0c, 0xd}}, | |
| {PLDM_FWUP_UUID, | |
| std::vector<uint8_t>{0x12, 0x44, 0xd2, 0x64, 0x8d, 0x7d, 0x47, 0x18, | |
| 0xa0, 0x30, 0xfc, 0x8a, 0x56, 0x58, 0x7d, | |
| 0x5b}}, | |
| {PLDM_FWUP_VENDOR_DEFINED, | |
| std::make_tuple("OpenBMC", std::vector<uint8_t>{0x01, 0x02})}}}, | |
| {0x02, | |
| {{PLDM_FWUP_UUID, | |
| std::vector<uint8_t>{0xF0, 0x18, 0x87, 0x8C, 0xCB, 0x7D, 0x49, 0x43, | |
| 0x98, 0x00, 0xA0, 0x2F, 0x59, 0x9A, 0xCA, | |
| 0x02}}}}}; | |
| EXPECT_EQ(outDescriptorMap.size(), descriptorMap2.size()); | |
| EXPECT_EQ(outDescriptorMap, descriptorMap2); | |
| } | |
| TEST_F(InventoryManagerTest, handleQueryDeviceIdentifiersResponseErrorCC) | |
| { | |
| constexpr size_t respPayloadLength = 1; | |
| constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength> | |
| queryDeviceIdentifiersResp{0x00, 0x00, 0x00, 0x01}; | |
| auto responseMsg = | |
| reinterpret_cast<const pldm_msg*>(queryDeviceIdentifiersResp.data()); | |
| inventoryManager.queryDeviceIdentifiers(1, responseMsg, respPayloadLength); | |
| EXPECT_EQ(outDescriptorMap.size(), 0); | |
| } | |
| TEST_F(InventoryManagerTest, handleQueryDownstreamIdentifierResponse) | |
| { | |
| constexpr uint8_t eid = 1; | |
| constexpr uint8_t downstreamDeviceCount = 1; | |
| constexpr uint32_t downstreamDeviceLen = 11; | |
| constexpr size_t respPayloadLength = | |
| PLDM_QUERY_DOWNSTREAM_IDENTIFIERS_RESP_MIN_LEN + downstreamDeviceLen; | |
| std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength> | |
| queryDownstreamIdentifiersResp{ | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, | |
| 0x0B, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, | |
| 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0xa0, 0x15}; | |
| auto responseMsg = new (queryDownstreamIdentifiersResp.data()) pldm_msg; | |
| inventoryManager.queryDownstreamIdentifiers(eid, responseMsg, | |
| respPayloadLength); | |
| DownstreamDeviceInfo downstreamDevices = { | |
| {0, | |
| {{PLDM_FWUP_IANA_ENTERPRISE_ID, | |
| std::vector<uint8_t>{0x00, 0x00, 0xa0, 0x15}}}}}; | |
| DownstreamDescriptorMap refDownstreamDescriptorMap{ | |
| {eid, downstreamDevices}}; | |
| ASSERT_EQ(outDownstreamDescriptorMap.size(), downstreamDeviceCount); | |
| ASSERT_EQ(outDownstreamDescriptorMap.size(), | |
| refDownstreamDescriptorMap.size()); | |
| ASSERT_EQ(outDownstreamDescriptorMap, refDownstreamDescriptorMap); | |
| } | |
| TEST_F(InventoryManagerTest, handleQueryDownstreamIdentifierResponseErrorCC) | |
| { | |
| constexpr size_t respPayloadLength = 1; | |
| constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength> | |
| queryDownstreamIdentifiersResp{0x00, 0x00, 0x00, 0x01}; | |
| const auto responseMsg = | |
| new (const_cast<unsigned char*>(queryDownstreamIdentifiersResp.data())) | |
| pldm_msg; | |
| inventoryManager.queryDownstreamIdentifiers(1, responseMsg, | |
| respPayloadLength); | |
| ASSERT_EQ(outDownstreamDescriptorMap.size(), 0); | |
| } | |
| TEST_F(InventoryManagerTest, getFirmwareParametersResponse) | |
| { | |
| // constexpr uint16_t compCount = 2; | |
| // constexpr std::string_view activeCompImageSetVersion{"DeviceVer1.0"}; | |
| // constexpr std::string_view activeCompVersion1{"Comp1v2.0"}; | |
| // constexpr std::string_view activeCompVersion2{"Comp2v3.0"}; | |
| constexpr uint16_t compClassification1 = 10; | |
| constexpr uint16_t compIdentifier1 = 300; | |
| constexpr uint8_t compClassificationIndex1 = 20; | |
| constexpr uint16_t compClassification2 = 16; | |
| constexpr uint16_t compIdentifier2 = 301; | |
| constexpr uint8_t compClassificationIndex2 = 30; | |
| constexpr size_t respPayloadLength1 = 119; | |
| constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength1> | |
| getFirmwareParametersResp1{ | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, | |
| 0x0c, 0x00, 0x00, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, | |
| 0x72, 0x31, 0x2e, 0x30, 0x0a, 0x00, 0x2c, 0x01, 0x14, 0x00, 0x00, | |
| 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, | |
| 0x6f, 0x6d, 0x70, 0x31, 0x76, 0x32, 0x2e, 0x30, 0x10, 0x00, 0x2d, | |
| 0x01, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6d, 0x70, 0x32, 0x76, 0x33, 0x2e, | |
| 0x30}; | |
| auto responseMsg1 = | |
| reinterpret_cast<const pldm_msg*>(getFirmwareParametersResp1.data()); | |
| inventoryManager.getFirmwareParameters(1, responseMsg1, respPayloadLength1); | |
| ComponentInfoMap componentInfoMap1{ | |
| {1, | |
| {{std::make_pair(compClassification1, compIdentifier1), | |
| compClassificationIndex1}, | |
| {std::make_pair(compClassification2, compIdentifier2), | |
| compClassificationIndex2}}}}; | |
| EXPECT_EQ(outComponentInfoMap.size(), componentInfoMap1.size()); | |
| EXPECT_EQ(outComponentInfoMap, componentInfoMap1); | |
| // constexpr uint16_t compCount = 1; | |
| // constexpr std::string_view activeCompImageSetVersion{"DeviceVer2.0"}; | |
| // constexpr std::string_view activeCompVersion1{"Comp3v4.0"}; | |
| constexpr uint16_t compClassification3 = 2; | |
| constexpr uint16_t compIdentifier3 = 302; | |
| constexpr uint8_t compClassificationIndex3 = 40; | |
| constexpr size_t respPayloadLength2 = 119; | |
| constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength2> | |
| getFirmwareParametersResp2{ | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, | |
| 0x0c, 0x00, 0x00, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x56, 0x65, | |
| 0x72, 0x32, 0x2e, 0x30, 0x02, 0x00, 0x2e, 0x01, 0x28, 0x00, 0x00, | |
| 0x00, 0x00, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, | |
| 0x6f, 0x6d, 0x70, 0x33, 0x76, 0x34, 0x2e, 0x30}; | |
| auto responseMsg2 = | |
| reinterpret_cast<const pldm_msg*>(getFirmwareParametersResp2.data()); | |
| inventoryManager.getFirmwareParameters(2, responseMsg2, respPayloadLength2); | |
| ComponentInfoMap componentInfoMap2{ | |
| {1, | |
| {{std::make_pair(compClassification1, compIdentifier1), | |
| compClassificationIndex1}, | |
| {std::make_pair(compClassification2, compIdentifier2), | |
| compClassificationIndex2}}}, | |
| {2, | |
| {{std::make_pair(compClassification3, compIdentifier3), | |
| compClassificationIndex3}}}}; | |
| EXPECT_EQ(outComponentInfoMap.size(), componentInfoMap2.size()); | |
| EXPECT_EQ(outComponentInfoMap, componentInfoMap2); | |
| } | |
| TEST_F(InventoryManagerTest, getFirmwareParametersResponseErrorCC) | |
| { | |
| constexpr size_t respPayloadLength = 1; | |
| constexpr std::array<uint8_t, sizeof(pldm_msg_hdr) + respPayloadLength> | |
| getFirmwareParametersResp{0x00, 0x00, 0x00, 0x01}; | |
| auto responseMsg = | |
| reinterpret_cast<const pldm_msg*>(getFirmwareParametersResp.data()); | |
| inventoryManager.getFirmwareParameters(1, responseMsg, respPayloadLength); | |
| EXPECT_EQ(outComponentInfoMap.size(), 0); | |
| } |