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