#include "common/test/mocked_utils.hpp" #include "common/utils.hpp" #include "host-bmc/dbus_to_terminus_effecters.hpp" #include #include using namespace pldm::host_effecters; using namespace pldm::utils; class MockHostEffecterParser : public HostEffecterParser { public: MockHostEffecterParser(int fd, const pldm_pdr* repo, DBusHandler* const dbusHandler, const std::string& jsonPath) : HostEffecterParser(nullptr, fd, repo, dbusHandler, jsonPath, nullptr) {} MOCK_METHOD(int, setHostStateEffecter, (size_t, std::vector&, uint16_t), (override)); MOCK_METHOD(void, createHostEffecterMatch, (const std::string&, const std::string&, size_t, size_t, uint16_t), (override)); const std::vector& gethostEffecterInfo() { return hostEffecterInfo; } }; TEST(HostEffecterParser, parseEffecterJsonGoodPath) { MockdBusHandler dbusHandler; int sockfd{}; MockHostEffecterParser hostEffecterParserGood(sockfd, nullptr, &dbusHandler, "./host_effecter_jsons/good"); auto hostEffecterInfo = hostEffecterParserGood.gethostEffecterInfo(); ASSERT_EQ(hostEffecterInfo.size(), 2); ASSERT_EQ(hostEffecterInfo[0].effecterPdrType, PLDM_STATE_EFFECTER_PDR); ASSERT_EQ(hostEffecterInfo[0].entityInstance, 0); ASSERT_EQ(hostEffecterInfo[0].entityType, 33); ASSERT_EQ(hostEffecterInfo[0].dbusInfo.size(), 1); ASSERT_EQ(hostEffecterInfo[0].checkHostState, true); DBusEffecterMapping dbusInfo{ {"/xyz/openbmc_project/control/host0/boot", "xyz.openbmc_project.Control.Boot.Mode", "BootMode", "string"}, {"xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"}, {196, {2}}}; auto& temp = hostEffecterInfo[0].dbusInfo[0]; ASSERT_EQ(temp.dbusMap.objectPath == dbusInfo.dbusMap.objectPath, true); ASSERT_EQ(temp.dbusMap.interface == dbusInfo.dbusMap.interface, true); ASSERT_EQ(temp.dbusMap.propertyName == dbusInfo.dbusMap.propertyName, true); ASSERT_EQ(temp.dbusMap.propertyType == dbusInfo.dbusMap.propertyType, true); /* Check Numeric Effecter in Good Json file */ ASSERT_EQ(hostEffecterInfo[1].effecterPdrType, PLDM_NUMERIC_EFFECTER_PDR); ASSERT_EQ(hostEffecterInfo[1].entityType, 32903); ASSERT_EQ(hostEffecterInfo[1].entityInstance, 6); ASSERT_EQ(hostEffecterInfo[1].containerId, 4); ASSERT_EQ(hostEffecterInfo[1].dbusNumericEffecterInfo.size(), 1); ASSERT_EQ(hostEffecterInfo[1].checkHostState, false); DBusNumericEffecterMapping dbusInfoNumeric{ {"/xyz/openbmc_project/effecters/power/PLimit", "xyz.openbmc_project.Effecter.Value", "Value", "double"}, 5, 1, 0, -3, 100}; auto& tempNumeric = hostEffecterInfo[1].dbusNumericEffecterInfo[0]; ASSERT_EQ(tempNumeric.dbusMap.objectPath == dbusInfoNumeric.dbusMap.objectPath, true); ASSERT_EQ(tempNumeric.dbusMap.interface == dbusInfoNumeric.dbusMap.interface, true); ASSERT_EQ(tempNumeric.dbusMap.propertyName == dbusInfoNumeric.dbusMap.propertyName, true); ASSERT_EQ(tempNumeric.dbusMap.propertyType == dbusInfoNumeric.dbusMap.propertyType, true); ASSERT_EQ(tempNumeric.dataSize == dbusInfoNumeric.dataSize, true); ASSERT_EQ(tempNumeric.resolution == dbusInfoNumeric.resolution, true); ASSERT_EQ(tempNumeric.offset == dbusInfoNumeric.offset, true); ASSERT_EQ(tempNumeric.unitModifier == dbusInfoNumeric.unitModifier, true); } TEST(HostEffecterParser, parseEffecterJsonBadPath) { MockdBusHandler dbusHandler; int sockfd{}; MockHostEffecterParser hostEffecterParser(sockfd, nullptr, &dbusHandler, "./host_effecter_jsons/no_json"); ASSERT_THROW( hostEffecterParser.parseEffecterJson("./host_effecter_jsons/no_json"), std::exception); ASSERT_THROW( hostEffecterParser.parseEffecterJson("./host_effecter_jsons/malformed"), std::exception); } TEST(HostEffecterParser, findNewStateValue) { MockdBusHandler dbusHandler; int sockfd{}; MockHostEffecterParser hostEffecterParser(sockfd, nullptr, &dbusHandler, "./host_effecter_jsons/good"); PropertyValue val1{std::in_place_type, "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"}; PropertyValue val2{std::in_place_type, "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup"}; auto newState = hostEffecterParser.findNewStateValue(0, 0, val1); ASSERT_EQ(newState, 2); ASSERT_THROW(hostEffecterParser.findNewStateValue(0, 0, val2), std::exception); } TEST(HostEffecterParser, adjustValue) { MockdBusHandler dbusHandler; int sockfd{}; MockHostEffecterParser hostEffecterParser(sockfd, nullptr, &dbusHandler, "./host_effecter_jsons/good"); auto realVal = hostEffecterParser.adjustValue(200, -50, 0.5, -2); ASSERT_EQ(realVal, 12500); realVal = hostEffecterParser.adjustValue(0, -50, 1, 0); ASSERT_EQ(realVal, 50); realVal = hostEffecterParser.adjustValue(0, 100, 1, -1); ASSERT_EQ(realVal, -1000); realVal = hostEffecterParser.adjustValue(2.34, 0, 1, -1); ASSERT_EQ(realVal, 23); realVal = hostEffecterParser.adjustValue(2.35, 0, 1, -1); ASSERT_EQ(realVal, 24); }