1*7ad45b40SUnive Tien #include "common/test/mocked_utils.hpp"
2*7ad45b40SUnive Tien #include "fw-update/firmware_inventory.hpp"
3*7ad45b40SUnive Tien #include "fw-update/firmware_inventory_manager.hpp"
4*7ad45b40SUnive Tien
5*7ad45b40SUnive Tien #include <gmock/gmock.h>
6*7ad45b40SUnive Tien #include <gtest/gtest.h>
7*7ad45b40SUnive Tien
8*7ad45b40SUnive Tien using namespace pldm;
9*7ad45b40SUnive Tien using namespace std::chrono;
10*7ad45b40SUnive Tien using namespace pldm::fw_update;
11*7ad45b40SUnive Tien
12*7ad45b40SUnive Tien // Helper class for testing: inherits FirmwareInventory and exposes protected
13*7ad45b40SUnive Tien class FirmwareInventoryTest : public pldm::fw_update::FirmwareInventory
14*7ad45b40SUnive Tien {
15*7ad45b40SUnive Tien public:
16*7ad45b40SUnive Tien using FirmwareInventory::FirmwareInventory;
17*7ad45b40SUnive Tien
getSoftwarePath() const18*7ad45b40SUnive Tien const std::string& getSoftwarePath() const
19*7ad45b40SUnive Tien {
20*7ad45b40SUnive Tien return this->softwarePath;
21*7ad45b40SUnive Tien }
getAssociation() const22*7ad45b40SUnive Tien const SoftwareAssociationDefinitions& getAssociation() const
23*7ad45b40SUnive Tien {
24*7ad45b40SUnive Tien return this->association;
25*7ad45b40SUnive Tien }
getVersion() const26*7ad45b40SUnive Tien const SoftwareVersion& getVersion() const
27*7ad45b40SUnive Tien {
28*7ad45b40SUnive Tien return this->version;
29*7ad45b40SUnive Tien }
30*7ad45b40SUnive Tien };
31*7ad45b40SUnive Tien
32*7ad45b40SUnive Tien class FirmwareInventoryManagerTest : public FirmwareInventoryManager
33*7ad45b40SUnive Tien {
34*7ad45b40SUnive Tien public:
FirmwareInventoryManagerTest(const pldm::utils::DBusHandler * handler,const Configurations & config)35*7ad45b40SUnive Tien FirmwareInventoryManagerTest(const pldm::utils::DBusHandler* handler,
36*7ad45b40SUnive Tien const Configurations& config) :
37*7ad45b40SUnive Tien FirmwareInventoryManager(handler, config)
38*7ad45b40SUnive Tien {}
39*7ad45b40SUnive Tien
getSoftwareMap()40*7ad45b40SUnive Tien SoftwareMap& getSoftwareMap()
41*7ad45b40SUnive Tien {
42*7ad45b40SUnive Tien return softwareMap;
43*7ad45b40SUnive Tien }
44*7ad45b40SUnive Tien };
45*7ad45b40SUnive Tien
TEST(GetBoardPath_WithMockHandler,ReturnsExpectedBoardPath)46*7ad45b40SUnive Tien TEST(GetBoardPath_WithMockHandler, ReturnsExpectedBoardPath)
47*7ad45b40SUnive Tien {
48*7ad45b40SUnive Tien MockdBusHandler mockHandler;
49*7ad45b40SUnive Tien InventoryPath inventoryPath =
50*7ad45b40SUnive Tien "/xyz/openbmc_project/inventory/system/board/PLDM_Device";
51*7ad45b40SUnive Tien pldm::utils::GetAncestorsResponse fakeResponse = {{inventoryPath, {}}};
52*7ad45b40SUnive Tien EXPECT_CALL(mockHandler, getAncestors)
53*7ad45b40SUnive Tien .WillOnce(::testing::Return(fakeResponse));
54*7ad45b40SUnive Tien
55*7ad45b40SUnive Tien Configurations configurations;
56*7ad45b40SUnive Tien std::string boardInventoryPath =
57*7ad45b40SUnive Tien "/xyz/openbmc_project/inventory/system/board/PLDM_Device";
58*7ad45b40SUnive Tien pldm::eid endpointId = 1;
59*7ad45b40SUnive Tien pldm::UUID endpointUuid = "uuid";
60*7ad45b40SUnive Tien pldm::MctpMedium endpointMedium = "medium";
61*7ad45b40SUnive Tien pldm::NetworkId endpointNetId = 0;
62*7ad45b40SUnive Tien pldm::MctpInfoName endpointName = "BMC";
63*7ad45b40SUnive Tien pldm::MctpInfo endpointInfo = std::make_tuple(
64*7ad45b40SUnive Tien endpointId, endpointUuid, endpointMedium, endpointNetId, endpointName);
65*7ad45b40SUnive Tien configurations[boardInventoryPath] = endpointInfo;
66*7ad45b40SUnive Tien
67*7ad45b40SUnive Tien FirmwareInventoryManagerTest inventoryManager(&mockHandler, configurations);
68*7ad45b40SUnive Tien
69*7ad45b40SUnive Tien SoftwareIdentifier softwareIdentifier{endpointId, 100};
70*7ad45b40SUnive Tien SoftwareName softwareName{"TestDevice"};
71*7ad45b40SUnive Tien std::string firmwareVersion{"1.0.0"};
72*7ad45b40SUnive Tien Descriptors firmwareDescriptors;
73*7ad45b40SUnive Tien ComponentInfo firmwareComponentInfo;
74*7ad45b40SUnive Tien
75*7ad45b40SUnive Tien inventoryManager.createFirmwareEntry(
76*7ad45b40SUnive Tien softwareIdentifier, softwareName, firmwareVersion, firmwareDescriptors,
77*7ad45b40SUnive Tien firmwareComponentInfo);
78*7ad45b40SUnive Tien ASSERT_TRUE(inventoryManager.getSoftwareMap().contains(softwareIdentifier));
79*7ad45b40SUnive Tien
80*7ad45b40SUnive Tien auto inventoryIt =
81*7ad45b40SUnive Tien inventoryManager.getSoftwareMap().find(softwareIdentifier);
82*7ad45b40SUnive Tien ASSERT_NE(inventoryIt, inventoryManager.getSoftwareMap().end());
83*7ad45b40SUnive Tien const auto* inventory =
84*7ad45b40SUnive Tien static_cast<FirmwareInventoryTest*>(inventoryIt->second.get());
85*7ad45b40SUnive Tien ASSERT_NE(inventory, nullptr);
86*7ad45b40SUnive Tien EXPECT_NE(inventory->getSoftwarePath().find(
87*7ad45b40SUnive Tien "/xyz/openbmc_project/software/PLDM_Device_TestDevice_"),
88*7ad45b40SUnive Tien std::string::npos);
89*7ad45b40SUnive Tien EXPECT_EQ(inventory->getVersion().version(), firmwareVersion);
90*7ad45b40SUnive Tien }
91