xref: /openbmc/pldm/libpldmresponder/test/libpldmresponder_fru_test.cpp (revision 7c14fc4793a4a5fca7210377c32bd241127e96d5)
15bfb0dcbSGeorge Liu #include "common/utils.hpp"
25bfb0dcbSGeorge Liu #include "libpldmresponder/fru.hpp"
35327988eSTom Joseph #include "libpldmresponder/fru_parser.hpp"
45327988eSTom Joseph 
55bfb0dcbSGeorge Liu #include <config.h>
65bfb0dcbSGeorge Liu #include <libpldm/pdr.h>
75bfb0dcbSGeorge Liu 
85bfb0dcbSGeorge Liu #include <sdbusplus/message.hpp>
95bfb0dcbSGeorge Liu 
105327988eSTom Joseph #include <gtest/gtest.h>
115bfb0dcbSGeorge Liu 
TEST(FruParser,allScenarios)125327988eSTom Joseph TEST(FruParser, allScenarios)
135327988eSTom Joseph {
145327988eSTom Joseph     using namespace pldm::responder::fru_parser;
155327988eSTom Joseph 
1603b01ca8SManojkiran Eda     FruParser parser{"./fru_jsons/good",
1703b01ca8SManojkiran Eda                      "./fru_jsons/fru_master/fru_master.json"};
185327988eSTom Joseph 
195327988eSTom Joseph     // Get an item with a single PLDM FRU record
205327988eSTom Joseph     FruRecordInfos cpu{
215327988eSTom Joseph         {1,
225327988eSTom Joseph          1,
235327988eSTom Joseph          {{"xyz.openbmc_project.Inventory.Decorator.Asset", "Model", "string",
245327988eSTom Joseph            2},
255327988eSTom Joseph           {"xyz.openbmc_project.Inventory.Decorator.Asset", "PartNumber",
265327988eSTom Joseph            "string", 3},
275327988eSTom Joseph           {"xyz.openbmc_project.Inventory.Decorator.Asset", "SerialNumber",
285327988eSTom Joseph            "string", 4},
295327988eSTom Joseph           {"xyz.openbmc_project.Inventory.Decorator.Asset", "Manufacturer",
305327988eSTom Joseph            "string", 5},
315327988eSTom Joseph           {"xyz.openbmc_project.Inventory.Item", "PrettyName", "string", 8},
325327988eSTom Joseph           {"xyz.openbmc_project.Inventory.Decorator.AssetTag", "AssetTag",
335327988eSTom Joseph            "string", 11},
345327988eSTom Joseph           {"xyz.openbmc_project.Inventory.Decorator.Revision", "Version",
355327988eSTom Joseph            "string", 10}}},
365327988eSTom Joseph         {1,
375327988eSTom Joseph          1,
385327988eSTom Joseph          {{"xyz.openbmc_project.Inventory.Decorator.Asset", "PartNumber",
395327988eSTom Joseph            "string", 3},
405327988eSTom Joseph           {"xyz.openbmc_project.Inventory.Decorator.Asset", "SerialNumber",
415327988eSTom Joseph            "string", 4}}}};
425327988eSTom Joseph     auto cpuInfos =
435327988eSTom Joseph         parser.getRecordInfo("xyz.openbmc_project.Inventory.Item.Cpu");
445327988eSTom Joseph     ASSERT_EQ(cpuInfos.size(), 2);
455327988eSTom Joseph     ASSERT_EQ(cpu == cpuInfos, true);
465327988eSTom Joseph 
475327988eSTom Joseph     // Get an item type with 3 PLDM FRU records
485327988eSTom Joseph     auto boardInfos =
495327988eSTom Joseph         parser.getRecordInfo("xyz.openbmc_project.Inventory.Item.Board");
505327988eSTom Joseph     ASSERT_EQ(boardInfos.size(), 3);
515327988eSTom Joseph 
525327988eSTom Joseph     // D-Bus lookup info for FRU information
535327988eSTom Joseph     DBusLookupInfo lookupInfo{
545327988eSTom Joseph         "xyz.openbmc_project.Inventory.Manager",
555327988eSTom Joseph         "/xyz/openbmc_project/inventory",
565327988eSTom Joseph         {"xyz.openbmc_project.Inventory.Item.Chassis",
575327988eSTom Joseph          "xyz.openbmc_project.Inventory.Item.Board",
58a137f903SJayashankar Padath          "xyz.openbmc_project.Inventory.Item.PCIeDevice",
595327988eSTom Joseph          "xyz.openbmc_project.Inventory.Item.Board.Motherboard",
60a137f903SJayashankar Padath          "xyz.openbmc_project.Inventory.Item.Dimm",
615327988eSTom Joseph          "xyz.openbmc_project.Inventory.Item.Panel",
62a137f903SJayashankar Padath          "xyz.openbmc_project.Inventory.Item.DiskBackplane",
63a137f903SJayashankar Padath          "xyz.openbmc_project.Inventory.Item.Fan",
645327988eSTom Joseph          "xyz.openbmc_project.Inventory.Item.PowerSupply",
65a137f903SJayashankar Padath          "xyz.openbmc_project.Inventory.Item.Battery",
665327988eSTom Joseph          "xyz.openbmc_project.Inventory.Item.Vrm",
675327988eSTom Joseph          "xyz.openbmc_project.Inventory.Item.Cpu",
685327988eSTom Joseph          "xyz.openbmc_project.Inventory.Item.Bmc",
69a137f903SJayashankar Padath          "xyz.openbmc_project.Inventory.Item.Connector",
70a137f903SJayashankar Padath          "xyz.openbmc_project.Inventory.Item.PCIeSlot",
71a137f903SJayashankar Padath          "xyz.openbmc_project.Inventory.Item.System",
72a137f903SJayashankar Padath          "xyz.openbmc_project.Inventory.Item.Tpm"}};
735327988eSTom Joseph     auto dbusInfo = parser.inventoryLookup();
745327988eSTom Joseph     ASSERT_EQ(dbusInfo == lookupInfo, true);
755327988eSTom Joseph 
765327988eSTom Joseph     ASSERT_THROW(
775327988eSTom Joseph         parser.getRecordInfo("xyz.openbmc_project.Inventory.Item.DIMM"),
785327988eSTom Joseph         std::exception);
795327988eSTom Joseph }
805bfb0dcbSGeorge Liu 
TEST(FruImpl,updateAssociationTreeTest)815bfb0dcbSGeorge Liu TEST(FruImpl, updateAssociationTreeTest)
825bfb0dcbSGeorge Liu {
835bfb0dcbSGeorge Liu     using namespace pldm::responder;
845bfb0dcbSGeorge Liu     using namespace pldm::responder::fru_parser;
855bfb0dcbSGeorge Liu     using namespace pldm::responder::dbus;
865bfb0dcbSGeorge Liu     std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> pdrRepo(
875bfb0dcbSGeorge Liu         pldm_pdr_init(), pldm_pdr_destroy);
885bfb0dcbSGeorge Liu     std::unique_ptr<pldm_entity_association_tree,
895bfb0dcbSGeorge Liu                     decltype(&pldm_entity_association_tree_destroy)>
905bfb0dcbSGeorge Liu         entityTree(pldm_entity_association_tree_init(),
915bfb0dcbSGeorge Liu                    pldm_entity_association_tree_destroy);
925bfb0dcbSGeorge Liu     std::unique_ptr<pldm_entity_association_tree,
935bfb0dcbSGeorge Liu                     decltype(&pldm_entity_association_tree_destroy)>
945bfb0dcbSGeorge Liu         bmcEntityTree(pldm_entity_association_tree_init(),
955bfb0dcbSGeorge Liu                       pldm_entity_association_tree_destroy);
965bfb0dcbSGeorge Liu 
975bfb0dcbSGeorge Liu     ObjectValueTree objects{
985bfb0dcbSGeorge Liu         {sdbusplus::message::object_path(
995bfb0dcbSGeorge Liu              "/xyz/openbmc_project/inventory/system"),
1005bfb0dcbSGeorge Liu          {{"xyz.openbmc_project.Inventory.Item.System", {}}}},
1015bfb0dcbSGeorge Liu         {sdbusplus::message::object_path(
1025bfb0dcbSGeorge Liu              "/xyz/openbmc_project/inventory/system/chassis"),
1035bfb0dcbSGeorge Liu          {{"xyz.openbmc_project.Inventory.Item.Chassis", {}}}},
1045bfb0dcbSGeorge Liu         {sdbusplus::message::object_path(
1055bfb0dcbSGeorge Liu              "/xyz/openbmc_project/inventory/system/chassis/motherboard"),
1065bfb0dcbSGeorge Liu          {{"xyz.openbmc_project.Inventory.Item.Board.Motherboard", {}}}}};
1075bfb0dcbSGeorge Liu 
1085bfb0dcbSGeorge Liu     typedef struct test_pldm_entity_node
1095bfb0dcbSGeorge Liu     {
1105bfb0dcbSGeorge Liu         pldm_entity entity;
1115bfb0dcbSGeorge Liu         pldm_entity parent;
1125bfb0dcbSGeorge Liu         uint16_t host_container_id;
1135bfb0dcbSGeorge Liu         pldm_entity_node* first_child;
1145bfb0dcbSGeorge Liu         pldm_entity_node* next_sibling;
1155bfb0dcbSGeorge Liu         uint8_t association_type;
1165bfb0dcbSGeorge Liu     } test_pldm_entity_node;
1175bfb0dcbSGeorge Liu 
11819fdb45bSAndrew Jeffery     pldm::responder::FruImpl mockedFruHandler(
11919fdb45bSAndrew Jeffery         FRU_JSONS_DIR, "./fru_jsons/fru_master/fru_master.json", pdrRepo.get(),
120a881c170SGeorge Liu         entityTree.get(), bmcEntityTree.get());
1215bfb0dcbSGeorge Liu 
1225bfb0dcbSGeorge Liu     pldm_entity systemEntity{0x2d01, 1, 0};
1235bfb0dcbSGeorge Liu     pldm_entity chassisEntity{0x2d, 1, 1};
1245bfb0dcbSGeorge Liu     pldm_entity motherboardEntity{0x40, 1, 2};
1255bfb0dcbSGeorge Liu     pldm_entity panelEntity{0x45, 1, 3};
1265bfb0dcbSGeorge Liu 
1275bfb0dcbSGeorge Liu     dbus::InterfaceMap systemIface{
1285bfb0dcbSGeorge Liu         {"xyz.openbmc_project.Inventory.Item.System", {}}};
1295bfb0dcbSGeorge Liu     dbus::InterfaceMap chassisIface{
1305bfb0dcbSGeorge Liu         {"xyz.openbmc_project.Inventory.Item.Chassis", {}}};
1315bfb0dcbSGeorge Liu     dbus::InterfaceMap motherboardIface{
1325bfb0dcbSGeorge Liu         {"xyz.openbmc_project.Inventory.Item.Board.Motherboard", {}}};
1335bfb0dcbSGeorge Liu 
1345bfb0dcbSGeorge Liu     mockedFruHandler.updateAssociationTree(
1355bfb0dcbSGeorge Liu         objects, "/xyz/openbmc_project/inventory/system/chassis/motherboard");
1365bfb0dcbSGeorge Liu 
13716c2a0a0SPatrick Williams     pldm_entity_node* node =
13816c2a0a0SPatrick Williams         pldm_entity_association_tree_find(entityTree.get(), &systemEntity);
139*7c14fc47SJayanth Othayoth     EXPECT_TRUE(node != nullptr);
1405bfb0dcbSGeorge Liu 
1415bfb0dcbSGeorge Liu     node = pldm_entity_association_tree_find(entityTree.get(), &chassisEntity);
142*7c14fc47SJayanth Othayoth     ASSERT_TRUE(node != nullptr);
1435bfb0dcbSGeorge Liu     test_pldm_entity_node* test_node = (test_pldm_entity_node*)node;
1445bfb0dcbSGeorge Liu     EXPECT_TRUE((test_node->parent).entity_type == systemEntity.entity_type);
1455bfb0dcbSGeorge Liu 
14616c2a0a0SPatrick Williams     node =
14716c2a0a0SPatrick Williams         pldm_entity_association_tree_find(entityTree.get(), &motherboardEntity);
148*7c14fc47SJayanth Othayoth     ASSERT_TRUE(node != nullptr);
1495bfb0dcbSGeorge Liu     test_node = (test_pldm_entity_node*)node;
1505bfb0dcbSGeorge Liu     EXPECT_TRUE((test_node->parent).entity_type == chassisEntity.entity_type);
1515bfb0dcbSGeorge Liu 
1525bfb0dcbSGeorge Liu     node = pldm_entity_association_tree_find(entityTree.get(), &panelEntity);
153*7c14fc47SJayanth Othayoth     EXPECT_TRUE(node == nullptr);
1545bfb0dcbSGeorge Liu }
1555bfb0dcbSGeorge Liu 
TEST(FruImpl,entityByObjectPath)1565bfb0dcbSGeorge Liu TEST(FruImpl, entityByObjectPath)
1575bfb0dcbSGeorge Liu {
1585bfb0dcbSGeorge Liu     using namespace pldm::responder::dbus;
1595bfb0dcbSGeorge Liu     std::unique_ptr<pldm_pdr, decltype(&pldm_pdr_destroy)> pdrRepo(
1605bfb0dcbSGeorge Liu         pldm_pdr_init(), pldm_pdr_destroy);
1615bfb0dcbSGeorge Liu     std::unique_ptr<pldm_entity_association_tree,
1625bfb0dcbSGeorge Liu                     decltype(&pldm_entity_association_tree_destroy)>
1635bfb0dcbSGeorge Liu         entityTree(pldm_entity_association_tree_init(),
1645bfb0dcbSGeorge Liu                    pldm_entity_association_tree_destroy);
1655bfb0dcbSGeorge Liu     std::unique_ptr<pldm_entity_association_tree,
1665bfb0dcbSGeorge Liu                     decltype(&pldm_entity_association_tree_destroy)>
1675bfb0dcbSGeorge Liu         bmcEntityTree(pldm_entity_association_tree_init(),
1685bfb0dcbSGeorge Liu                       pldm_entity_association_tree_destroy);
1695bfb0dcbSGeorge Liu 
1705bfb0dcbSGeorge Liu     InterfaceMap iface = {{"xyz.openbmc_project.Inventory.Item.Chassis", {}}};
17119fdb45bSAndrew Jeffery     pldm::responder::FruImpl mockedFruHandler(
17219fdb45bSAndrew Jeffery         FRU_JSONS_DIR, "./fru_jsons/fru_master/fru_master.json", pdrRepo.get(),
173a881c170SGeorge Liu         entityTree.get(), bmcEntityTree.get());
1745bfb0dcbSGeorge Liu 
1755bfb0dcbSGeorge Liu     // Good path
1765bfb0dcbSGeorge Liu     auto entityPtr = mockedFruHandler.getEntityByObjectPath(iface);
1775bfb0dcbSGeorge Liu     pldm_entity entity = *entityPtr;
1785bfb0dcbSGeorge Liu     EXPECT_TRUE(entity.entity_type == 45);
1795bfb0dcbSGeorge Liu     // Bad Path
1805bfb0dcbSGeorge Liu     InterfaceMap invalidIface = {
1815bfb0dcbSGeorge Liu         {"xyz.openbmc_project.Inventory.Item.Motherboard", {}}};
1825bfb0dcbSGeorge Liu     entityPtr = mockedFruHandler.getEntityByObjectPath(invalidIface);
1835bfb0dcbSGeorge Liu     ASSERT_TRUE(!entityPtr);
1845bfb0dcbSGeorge Liu }
185