xref: /openbmc/pldm/platform-mc/test/dbus_to_terminus_effecter_test.cpp (revision dd1f28b818b86c3e46826b758d8d552b176d6292)
1 #include "common/test/mocked_utils.hpp"
2 #include "common/utils.hpp"
3 #include "platform-mc/dbus_to_terminus_effecters.hpp"
4 
5 #include <nlohmann/json.hpp>
6 
7 #include <gtest/gtest.h>
8 
9 using namespace pldm::host_effecters;
10 using namespace pldm::utils;
11 
12 class MockHostEffecterParser : public HostEffecterParser
13 {
14   public:
MockHostEffecterParser(int fd,const pldm_pdr * repo,DBusHandler * const dbusHandler,const std::string & jsonPath)15     MockHostEffecterParser(int fd, const pldm_pdr* repo,
16                            DBusHandler* const dbusHandler,
17                            const std::string& jsonPath) :
18         HostEffecterParser(nullptr, fd, repo, dbusHandler, jsonPath, nullptr,
19                            nullptr)
20     {}
21 
22     MOCK_METHOD(int, setHostStateEffecter,
23                 (size_t, std::vector<set_effecter_state_field>&, uint16_t),
24                 (override));
25 
26     MOCK_METHOD(void, createHostEffecterMatch,
27                 (const std::string&, const std::string&, size_t, size_t,
28                  uint16_t),
29                 (override));
30 
gethostEffecterInfo()31     const std::vector<EffecterInfo>& gethostEffecterInfo()
32     {
33         return hostEffecterInfo;
34     }
35 };
36 
TEST(HostEffecterParser,parseEffecterJsonGoodPath)37 TEST(HostEffecterParser, parseEffecterJsonGoodPath)
38 {
39     MockdBusHandler dbusHandler;
40     int sockfd{};
41     MockHostEffecterParser hostEffecterParserGood(sockfd, nullptr, &dbusHandler,
42                                                   "./host_effecter_jsons/good");
43     auto hostEffecterInfo = hostEffecterParserGood.gethostEffecterInfo();
44     ASSERT_EQ(hostEffecterInfo.size(), 2);
45     ASSERT_EQ(hostEffecterInfo[0].effecterPdrType, PLDM_STATE_EFFECTER_PDR);
46     ASSERT_EQ(hostEffecterInfo[0].entityInstance, 0);
47     ASSERT_EQ(hostEffecterInfo[0].entityType, 33);
48     ASSERT_EQ(hostEffecterInfo[0].dbusInfo.size(), 1);
49     ASSERT_EQ(hostEffecterInfo[0].checkHostState, true);
50     DBusEffecterMapping dbusInfo{
51         {"/xyz/openbmc_project/control/host0/boot",
52          "xyz.openbmc_project.Control.Boot.Mode", "BootMode", "string"},
53         {"xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"},
54         {196, {2}}};
55     auto& temp = hostEffecterInfo[0].dbusInfo[0];
56     ASSERT_EQ(temp.dbusMap.objectPath == dbusInfo.dbusMap.objectPath, true);
57     ASSERT_EQ(temp.dbusMap.interface == dbusInfo.dbusMap.interface, true);
58     ASSERT_EQ(temp.dbusMap.propertyName == dbusInfo.dbusMap.propertyName, true);
59     ASSERT_EQ(temp.dbusMap.propertyType == dbusInfo.dbusMap.propertyType, true);
60 
61     /* Check Numeric Effecter in Good Json file */
62     ASSERT_EQ(hostEffecterInfo[1].effecterPdrType, PLDM_NUMERIC_EFFECTER_PDR);
63     ASSERT_EQ(hostEffecterInfo[1].entityType, 32903);
64     ASSERT_EQ(hostEffecterInfo[1].entityInstance, 6);
65     ASSERT_EQ(hostEffecterInfo[1].containerId, 4);
66     ASSERT_EQ(hostEffecterInfo[1].dbusNumericEffecterInfo.size(), 1);
67     ASSERT_EQ(hostEffecterInfo[1].checkHostState, false);
68     DBusNumericEffecterMapping dbusInfoNumeric{
69         {"/xyz/openbmc_project/effecters/power/PLimit",
70          "xyz.openbmc_project.Effecter.Value", "Value", "double"},
71         5,
72         1,
73         0,
74         -3,
75         100};
76     auto& tempNumeric = hostEffecterInfo[1].dbusNumericEffecterInfo[0];
77     ASSERT_EQ(tempNumeric.dbusMap.objectPath ==
78                   dbusInfoNumeric.dbusMap.objectPath,
79               true);
80     ASSERT_EQ(tempNumeric.dbusMap.interface ==
81                   dbusInfoNumeric.dbusMap.interface,
82               true);
83     ASSERT_EQ(tempNumeric.dbusMap.propertyName ==
84                   dbusInfoNumeric.dbusMap.propertyName,
85               true);
86     ASSERT_EQ(tempNumeric.dbusMap.propertyType ==
87                   dbusInfoNumeric.dbusMap.propertyType,
88               true);
89     ASSERT_EQ(tempNumeric.dataSize == dbusInfoNumeric.dataSize, true);
90     ASSERT_EQ(tempNumeric.resolution == dbusInfoNumeric.resolution, true);
91     ASSERT_EQ(tempNumeric.offset == dbusInfoNumeric.offset, true);
92     ASSERT_EQ(tempNumeric.unitModifier == dbusInfoNumeric.unitModifier, true);
93 }
94 
TEST(HostEffecterParser,parseEffecterJsonBadPath)95 TEST(HostEffecterParser, parseEffecterJsonBadPath)
96 {
97     MockdBusHandler dbusHandler;
98     int sockfd{};
99     MockHostEffecterParser hostEffecterParser(sockfd, nullptr, &dbusHandler,
100                                               "./host_effecter_jsons/no_json");
101     ASSERT_THROW(
102         hostEffecterParser.parseEffecterJson("./host_effecter_jsons/no_json"),
103         std::exception);
104     ASSERT_THROW(
105         hostEffecterParser.parseEffecterJson("./host_effecter_jsons/malformed"),
106         std::exception);
107 }
108 
TEST(HostEffecterParser,findNewStateValue)109 TEST(HostEffecterParser, findNewStateValue)
110 {
111     MockdBusHandler dbusHandler;
112     int sockfd{};
113     MockHostEffecterParser hostEffecterParser(sockfd, nullptr, &dbusHandler,
114                                               "./host_effecter_jsons/good");
115 
116     PropertyValue val1{std::in_place_type<std::string>,
117                        "xyz.openbmc_project.Control.Boot.Mode.Modes.Regular"};
118     PropertyValue val2{std::in_place_type<std::string>,
119                        "xyz.openbmc_project.Control.Boot.Mode.Modes.Setup"};
120     auto newState = hostEffecterParser.findNewStateValue(0, 0, val1);
121     ASSERT_EQ(newState, 2);
122 
123     ASSERT_THROW(hostEffecterParser.findNewStateValue(0, 0, val2),
124                  std::exception);
125 }
126 
TEST(HostEffecterParser,adjustValue)127 TEST(HostEffecterParser, adjustValue)
128 {
129     MockdBusHandler dbusHandler;
130     int sockfd{};
131     MockHostEffecterParser hostEffecterParser(sockfd, nullptr, &dbusHandler,
132                                               "./host_effecter_jsons/good");
133 
134     auto realVal = hostEffecterParser.adjustValue(200, -50, 0.5, -2);
135     ASSERT_EQ(realVal, 12500);
136     realVal = hostEffecterParser.adjustValue(0, -50, 1, 0);
137     ASSERT_EQ(realVal, 50);
138     realVal = hostEffecterParser.adjustValue(0, 100, 1, -1);
139     ASSERT_EQ(realVal, -1000);
140     realVal = hostEffecterParser.adjustValue(2.34, 0, 1, -1);
141     ASSERT_EQ(realVal, 23);
142     realVal = hostEffecterParser.adjustValue(2.35, 0, 1, -1);
143     ASSERT_EQ(realVal, 24);
144 }
145