blob: 4fbd81bfb0a51b40f2be63c8373c6276ed853410 [file] [log] [blame]
Tom Joseph53279882021-04-28 06:29:13 -07001#include "common/test/mocked_utils.hpp"
Thu Nguyen51d66b52024-08-06 09:15:55 +00002#include "common/types.hpp"
Deepak Kodihallid130e1a2020-06-17 05:55:32 -05003#include "common/utils.hpp"
Manojkiran Edaae933cc2024-02-21 17:19:21 +05304#include "host-bmc/dbus_to_event_handler.hpp"
TOM JOSEPHd4d97a52020-03-23 14:36:34 +05305#include "libpldmresponder/event_parser.hpp"
Deepak Kodihalli557dfb02019-05-12 13:11:17 +05306#include "libpldmresponder/pdr.hpp"
George Liue53193f2020-02-24 09:23:26 +08007#include "libpldmresponder/pdr_utils.hpp"
Deepak Kodihalli557dfb02019-05-12 13:11:17 +05308#include "libpldmresponder/platform.hpp"
George Liu64d26be2020-01-15 10:58:10 +08009#include "libpldmresponder/platform_numeric_effecter.hpp"
George Liu0d7aca82020-03-30 15:01:36 +080010#include "libpldmresponder/platform_state_effecter.hpp"
George Liua9170122020-05-14 11:59:13 +080011#include "libpldmresponder/platform_state_sensor.hpp"
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053012
George Liu36e81352020-07-01 14:40:30 +080013#include <sdbusplus/test/sdbus_mock.hpp>
Sampa Misra5fb37d52021-03-06 07:26:00 -060014#include <sdeventplus/event.hpp>
George Liu36e81352020-07-01 14:40:30 +080015
Brad Bishop5079ac42021-08-19 18:35:06 -040016using namespace pldm::pdr;
George Liu1e44c732020-02-28 20:20:06 +080017using namespace pldm::utils;
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053018using namespace pldm::responder;
Deepak Kodihallic682fe22020-03-04 00:42:54 -060019using namespace pldm::responder::platform;
20using namespace pldm::responder::pdr;
21using namespace pldm::responder::pdr_utils;
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053022
George Liu36e81352020-07-01 14:40:30 +080023using ::testing::_;
24using ::testing::Return;
25using ::testing::StrEq;
26
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053027TEST(getPDR, testGoodPath)
28{
29 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
30 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +080031 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053032 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
33
George Liue53193f2020-02-24 09:23:26 +080034 struct pldm_get_pdr_req* request =
35 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
36 request->request_count = 100;
37
George Liu36e81352020-07-01 14:40:30 +080038 MockdBusHandler mockedUtils;
39 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
40 .Times(5)
41 .WillRepeatedly(Return("foo.bar"));
42
Deepak Kodihallic682fe22020-03-04 00:42:54 -060043 auto pdrRepo = pldm_pdr_init();
Sampa Misra5fb37d52021-03-06 07:26:00 -060044 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -050045 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
46 pdrRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +080047 event);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060048 Repo repo(pdrRepo);
49 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +080050 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053051 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
52
George Liue53193f2020-02-24 09:23:26 +080053 struct pldm_get_pdr_resp* resp =
54 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
55 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
56 ASSERT_EQ(2, resp->next_record_handle);
57 ASSERT_EQ(true, resp->response_count != 0);
58
59 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(resp->record_data);
60 ASSERT_EQ(hdr->record_handle, 1);
61 ASSERT_EQ(hdr->version, 1);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060062
63 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053064}
65
66TEST(getPDR, testShortRead)
67{
68 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
69 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +080070 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053071 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
72
George Liue53193f2020-02-24 09:23:26 +080073 struct pldm_get_pdr_req* request =
74 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
75 request->request_count = 1;
76
George Liu36e81352020-07-01 14:40:30 +080077 MockdBusHandler mockedUtils;
78 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
79 .Times(5)
80 .WillRepeatedly(Return("foo.bar"));
81
Deepak Kodihallic682fe22020-03-04 00:42:54 -060082 auto pdrRepo = pldm_pdr_init();
Sampa Misra5fb37d52021-03-06 07:26:00 -060083 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -050084 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
85 pdrRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +080086 event);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060087 Repo repo(pdrRepo);
88 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +080089 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053090 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
George Liue53193f2020-02-24 09:23:26 +080091 struct pldm_get_pdr_resp* resp =
92 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
93 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
94 ASSERT_EQ(1, resp->response_count);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060095 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053096}
97
98TEST(getPDR, testBadRecordHandle)
99{
100 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
101 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +0800102 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530103 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
104
George Liue53193f2020-02-24 09:23:26 +0800105 struct pldm_get_pdr_req* request =
106 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
107 request->record_handle = 100000;
108 request->request_count = 1;
109
George Liu36e81352020-07-01 14:40:30 +0800110 MockdBusHandler mockedUtils;
111 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
112 .Times(5)
113 .WillRepeatedly(Return("foo.bar"));
114
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600115 auto pdrRepo = pldm_pdr_init();
Sampa Misra5fb37d52021-03-06 07:26:00 -0600116 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500117 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
118 pdrRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800119 event);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600120 Repo repo(pdrRepo);
121 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +0800122 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530123 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
124
125 ASSERT_EQ(responsePtr->payload[0], PLDM_PLATFORM_INVALID_RECORD_HANDLE);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600126
127 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530128}
129
130TEST(getPDR, testNoNextRecord)
131{
132 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
133 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +0800134 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530135 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
136
George Liue53193f2020-02-24 09:23:26 +0800137 struct pldm_get_pdr_req* request =
138 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
139 request->record_handle = 1;
140
George Liu36e81352020-07-01 14:40:30 +0800141 MockdBusHandler mockedUtils;
142 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
143 .Times(5)
144 .WillRepeatedly(Return("foo.bar"));
145
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600146 auto pdrRepo = pldm_pdr_init();
Sampa Misra5fb37d52021-03-06 07:26:00 -0600147 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500148 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
149 pdrRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800150 event);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600151 Repo repo(pdrRepo);
152 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +0800153 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530154 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
George Liue53193f2020-02-24 09:23:26 +0800155 struct pldm_get_pdr_resp* resp =
156 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
157 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
158 ASSERT_EQ(2, resp->next_record_handle);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600159
160 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530161}
162
163TEST(getPDR, testFindPDR)
164{
165 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
166 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +0800167 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530168 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
169
George Liue53193f2020-02-24 09:23:26 +0800170 struct pldm_get_pdr_req* request =
171 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
172 request->request_count = 100;
173
George Liu36e81352020-07-01 14:40:30 +0800174 MockdBusHandler mockedUtils;
175 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
176 .Times(5)
177 .WillRepeatedly(Return("foo.bar"));
178
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600179 auto pdrRepo = pldm_pdr_init();
Sampa Misra5fb37d52021-03-06 07:26:00 -0600180 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500181 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
182 pdrRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800183 event);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600184 Repo repo(pdrRepo);
185 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +0800186 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530187
188 // Let's try to find a PDR of type stateEffecter (= 11) and entity type =
189 // 100
190 bool found = false;
191 uint32_t handle = 0; // start asking for PDRs from recordHandle 0
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530192 while (!found)
193 {
George Liue53193f2020-02-24 09:23:26 +0800194 request->record_handle = handle;
George Liue53193f2020-02-24 09:23:26 +0800195 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530196 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
George Liue53193f2020-02-24 09:23:26 +0800197 struct pldm_get_pdr_resp* resp =
198 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
199 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530200
George Liue53193f2020-02-24 09:23:26 +0800201 handle = resp->next_record_handle; // point to the next pdr in case
202 // current is not what we want
203
204 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(resp->record_data);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530205 if (hdr->type == PLDM_STATE_EFFECTER_PDR)
206 {
207 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +0800208 reinterpret_cast<pldm_state_effecter_pdr*>(resp->record_data);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530209 if (pdr->entity_type == 100)
210 {
211 found = true;
212 // Rest of the PDR can be accessed as need be
213 break;
214 }
215 }
George Liue53193f2020-02-24 09:23:26 +0800216 if (!resp->next_record_handle) // no more records
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530217 {
218 break;
219 }
220 }
221 ASSERT_EQ(found, true);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600222
223 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530224}
Sampa Misraa2fa0702019-05-31 01:28:55 -0500225
Sampa Misraa2fa0702019-05-31 01:28:55 -0500226TEST(setStateEffecterStatesHandler, testGoodRequest)
227{
George Liua9170122020-05-14 11:59:13 +0800228 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
229 requestPayload{};
230 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
231 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
232
George Liu36e81352020-07-01 14:40:30 +0800233 MockdBusHandler mockedUtils;
234 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
235 .Times(5)
236 .WillRepeatedly(Return("foo.bar"));
237
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600238 auto inPDRRepo = pldm_pdr_init();
239 auto outPDRRepo = pldm_pdr_init();
240 Repo outRepo(outPDRRepo);
Sampa Misra5fb37d52021-03-06 07:26:00 -0600241 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500242 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
243 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800244 event);
George Liua9170122020-05-14 11:59:13 +0800245 handler.getPDR(req, requestPayloadLength);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600246 Repo inRepo(inPDRRepo);
247 getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
George Liue53193f2020-02-24 09:23:26 +0800248 pdr_utils::PdrEntry e;
Sampa Misra12afe112020-05-25 11:40:44 -0500249 auto record1 = pdr::getRecordByHandle(outRepo, 2, e);
George Liue53193f2020-02-24 09:23:26 +0800250 ASSERT_NE(record1, nullptr);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500251 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +0800252 reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500253 EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
254
255 std::vector<set_effecter_state_field> stateField;
256 stateField.push_back({PLDM_REQUEST_SET, 1});
257 stateField.push_back({PLDM_REQUEST_SET, 1});
George Liu1ec85d42020-02-12 16:05:32 +0800258 std::string value = "xyz.openbmc_project.Foo.Bar.V1";
George Liu1e44c732020-02-28 20:20:06 +0800259 PropertyValue propertyValue = value;
Sampa Misraa2fa0702019-05-31 01:28:55 -0500260
George Liu1ec85d42020-02-12 16:05:32 +0800261 DBusMapping dbusMapping{"/foo/bar", "xyz.openbmc_project.Foo.Bar",
262 "propertyName", "string"};
George Liu1e44c732020-02-28 20:20:06 +0800263
George Liu36e81352020-07-01 14:40:30 +0800264 EXPECT_CALL(mockedUtils, setDbusProperty(dbusMapping, propertyValue))
Sampa Misraa2fa0702019-05-31 01:28:55 -0500265 .Times(2);
George Liu0d7aca82020-03-30 15:01:36 +0800266 auto rc = platform_state_effecter::setStateEffecterStatesHandler<
George Liu36e81352020-07-01 14:40:30 +0800267 MockdBusHandler, Handler>(mockedUtils, handler, 0x1, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500268 ASSERT_EQ(rc, 0);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600269
270 pldm_pdr_destroy(inPDRRepo);
271 pldm_pdr_destroy(outPDRRepo);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500272}
273
274TEST(setStateEffecterStatesHandler, testBadRequest)
275{
George Liua9170122020-05-14 11:59:13 +0800276 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
277 requestPayload{};
278 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
279 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
280
George Liu36e81352020-07-01 14:40:30 +0800281 MockdBusHandler mockedUtils;
282 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
283 .Times(5)
284 .WillRepeatedly(Return("foo.bar"));
285
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600286 auto inPDRRepo = pldm_pdr_init();
287 auto outPDRRepo = pldm_pdr_init();
288 Repo outRepo(outPDRRepo);
Sampa Misra5fb37d52021-03-06 07:26:00 -0600289 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500290 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
291 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800292 event);
George Liua9170122020-05-14 11:59:13 +0800293 handler.getPDR(req, requestPayloadLength);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600294 Repo inRepo(inPDRRepo);
295 getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
George Liue53193f2020-02-24 09:23:26 +0800296 pdr_utils::PdrEntry e;
Sampa Misra12afe112020-05-25 11:40:44 -0500297 auto record1 = pdr::getRecordByHandle(outRepo, 2, e);
George Liue53193f2020-02-24 09:23:26 +0800298 ASSERT_NE(record1, nullptr);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500299 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +0800300 reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500301 EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
302
303 std::vector<set_effecter_state_field> stateField;
304 stateField.push_back({PLDM_REQUEST_SET, 3});
305 stateField.push_back({PLDM_REQUEST_SET, 4});
306
George Liu0d7aca82020-03-30 15:01:36 +0800307 auto rc = platform_state_effecter::setStateEffecterStatesHandler<
George Liu36e81352020-07-01 14:40:30 +0800308 MockdBusHandler, Handler>(mockedUtils, handler, 0x1, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500309 ASSERT_EQ(rc, PLDM_PLATFORM_SET_EFFECTER_UNSUPPORTED_SENSORSTATE);
310
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400311 rc = platform_state_effecter::setStateEffecterStatesHandler<
312 MockdBusHandler, Handler>(mockedUtils, handler, 0x9, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500313 ASSERT_EQ(rc, PLDM_PLATFORM_INVALID_EFFECTER_ID);
314
315 stateField.push_back({PLDM_REQUEST_SET, 4});
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400316 rc = platform_state_effecter::setStateEffecterStatesHandler<
317 MockdBusHandler, Handler>(mockedUtils, handler, 0x1, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500318 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
319
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600320 pldm_pdr_destroy(inPDRRepo);
321 pldm_pdr_destroy(outPDRRepo);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500322}
George Liu64d26be2020-01-15 10:58:10 +0800323
324TEST(setNumericEffecterValueHandler, testGoodRequest)
325{
George Liu36e81352020-07-01 14:40:30 +0800326 MockdBusHandler mockedUtils;
327 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
328 .Times(5)
329 .WillRepeatedly(Return("foo.bar"));
330
George Liu64d26be2020-01-15 10:58:10 +0800331 auto inPDRRepo = pldm_pdr_init();
332 auto numericEffecterPdrRepo = pldm_pdr_init();
333 Repo numericEffecterPDRs(numericEffecterPdrRepo);
Sampa Misra5fb37d52021-03-06 07:26:00 -0600334 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500335 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
336 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800337 event);
George Liu64d26be2020-01-15 10:58:10 +0800338 Repo inRepo(inPDRRepo);
339 getRepoByType(inRepo, numericEffecterPDRs, PLDM_NUMERIC_EFFECTER_PDR);
340
341 pdr_utils::PdrEntry e;
Sampa Misra12afe112020-05-25 11:40:44 -0500342 auto record4 = pdr::getRecordByHandle(numericEffecterPDRs, 4, e);
343 ASSERT_NE(record4, nullptr);
George Liu64d26be2020-01-15 10:58:10 +0800344
345 pldm_numeric_effecter_value_pdr* pdr =
346 reinterpret_cast<pldm_numeric_effecter_value_pdr*>(e.data);
347 EXPECT_EQ(pdr->hdr.type, PLDM_NUMERIC_EFFECTER_PDR);
348
349 uint16_t effecterId = 3;
350 uint32_t effecterValue = 2100000000; // 2036-07-18 21:20:00
Pavithra Barithaya45cd16b2021-07-01 08:19:59 -0500351 PropertyValue propertyValue = static_cast<uint64_t>(effecterValue);
George Liu64d26be2020-01-15 10:58:10 +0800352
George Liu64d26be2020-01-15 10:58:10 +0800353 DBusMapping dbusMapping{"/foo/bar", "xyz.openbmc_project.Foo.Bar",
354 "propertyName", "uint64_t"};
George Liu36e81352020-07-01 14:40:30 +0800355 EXPECT_CALL(mockedUtils, setDbusProperty(dbusMapping, propertyValue))
George Liu64d26be2020-01-15 10:58:10 +0800356 .Times(1);
357
358 auto rc = platform_numeric_effecter::setNumericEffecterValueHandler<
359 MockdBusHandler, Handler>(
George Liu36e81352020-07-01 14:40:30 +0800360 mockedUtils, handler, effecterId, PLDM_EFFECTER_DATA_SIZE_UINT32,
George Liu64d26be2020-01-15 10:58:10 +0800361 reinterpret_cast<uint8_t*>(&effecterValue), 4);
362 ASSERT_EQ(rc, 0);
363
364 pldm_pdr_destroy(inPDRRepo);
365 pldm_pdr_destroy(numericEffecterPdrRepo);
366}
367
368TEST(setNumericEffecterValueHandler, testBadRequest)
369{
George Liu36e81352020-07-01 14:40:30 +0800370 MockdBusHandler mockedUtils;
371 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
372 .Times(5)
373 .WillRepeatedly(Return("foo.bar"));
374
George Liu64d26be2020-01-15 10:58:10 +0800375 auto inPDRRepo = pldm_pdr_init();
376 auto numericEffecterPdrRepo = pldm_pdr_init();
377 Repo numericEffecterPDRs(numericEffecterPdrRepo);
Sampa Misra5fb37d52021-03-06 07:26:00 -0600378 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500379 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
380 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800381 event);
George Liu64d26be2020-01-15 10:58:10 +0800382 Repo inRepo(inPDRRepo);
383 getRepoByType(inRepo, numericEffecterPDRs, PLDM_NUMERIC_EFFECTER_PDR);
384
385 pdr_utils::PdrEntry e;
Sampa Misra12afe112020-05-25 11:40:44 -0500386 auto record4 = pdr::getRecordByHandle(numericEffecterPDRs, 4, e);
387 ASSERT_NE(record4, nullptr);
George Liu64d26be2020-01-15 10:58:10 +0800388
389 pldm_numeric_effecter_value_pdr* pdr =
390 reinterpret_cast<pldm_numeric_effecter_value_pdr*>(e.data);
391 EXPECT_EQ(pdr->hdr.type, PLDM_NUMERIC_EFFECTER_PDR);
392
393 uint16_t effecterId = 3;
394 uint64_t effecterValue = 9876543210;
George Liu64d26be2020-01-15 10:58:10 +0800395 auto rc = platform_numeric_effecter::setNumericEffecterValueHandler<
396 MockdBusHandler, Handler>(
George Liu36e81352020-07-01 14:40:30 +0800397 mockedUtils, handler, effecterId, PLDM_EFFECTER_DATA_SIZE_SINT32,
George Liu64d26be2020-01-15 10:58:10 +0800398 reinterpret_cast<uint8_t*>(&effecterValue), 3);
399 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
400
401 pldm_pdr_destroy(inPDRRepo);
402 pldm_pdr_destroy(numericEffecterPdrRepo);
403}
Tom Josephb4268602020-04-17 17:20:45 +0530404
Archana Kakani6ece21fb2023-10-10 08:21:52 -0500405TEST(getNumericEffecterValueHandler, testGoodRequest)
406{
407 MockdBusHandler mockedUtils;
408 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
409 .Times(5)
410 .WillRepeatedly(Return("foo.bar"));
411
412 auto inPDRRepo = pldm_pdr_init();
413 auto numericEffecterPdrRepo = pldm_pdr_init();
414 Repo numericEffecterPDRs(numericEffecterPdrRepo);
415 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500416 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
417 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800418 event);
Archana Kakani6ece21fb2023-10-10 08:21:52 -0500419 Repo inRepo(inPDRRepo);
420 getRepoByType(inRepo, numericEffecterPDRs, PLDM_NUMERIC_EFFECTER_PDR);
421
422 pdr_utils::PdrEntry e;
423 auto record4 = pdr::getRecordByHandle(numericEffecterPDRs, 4, e);
424 ASSERT_NE(record4, nullptr);
425
426 pldm_numeric_effecter_value_pdr* pdr =
427 reinterpret_cast<pldm_numeric_effecter_value_pdr*>(e.data);
428 EXPECT_EQ(pdr->hdr.type, PLDM_NUMERIC_EFFECTER_PDR);
429
430 uint16_t effecterId = 3;
431
432 uint8_t effecterDataSize{};
433 pldm::utils::PropertyValue dbusValue;
434 std::string propertyType;
435
436 // effecterValue return the present numeric setting
437 uint32_t effecterValue = 2100000000;
438 using effecterOperationalState = uint8_t;
439 using completionCode = uint8_t;
440
441 EXPECT_CALL(mockedUtils,
442 getDbusPropertyVariant(StrEq("/foo/bar"), StrEq("propertyName"),
443 StrEq("xyz.openbmc_project.Foo.Bar")))
444 .WillOnce(Return(PropertyValue(static_cast<uint64_t>(effecterValue))));
445
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400446 auto rc = platform_numeric_effecter::getNumericEffecterData<
447 MockdBusHandler, Handler>(mockedUtils, handler, effecterId,
448 effecterDataSize, propertyType, dbusValue);
Archana Kakani6ece21fb2023-10-10 08:21:52 -0500449
450 ASSERT_EQ(rc, 0);
451
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400452 size_t responsePayloadLength =
453 sizeof(completionCode) + sizeof(effecterDataSize) +
454 sizeof(effecterOperationalState) +
455 getEffecterDataSize(effecterDataSize) +
456 getEffecterDataSize(effecterDataSize);
Archana Kakani6ece21fb2023-10-10 08:21:52 -0500457
458 Response response(responsePayloadLength + sizeof(pldm_msg_hdr));
459 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
460
461 rc = platform_numeric_effecter::getNumericEffecterValueHandler(
462 propertyType, dbusValue, effecterDataSize, responsePtr,
463 responsePayloadLength, 1);
464
465 ASSERT_EQ(rc, 0);
466
467 struct pldm_get_numeric_effecter_value_resp* resp =
468 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
469 responsePtr->payload);
470 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
471 uint32_t valPresent;
472 memcpy(&valPresent, &resp->pending_and_present_values[4],
473 sizeof(valPresent));
474
475 ASSERT_EQ(effecterValue, valPresent);
476
477 pldm_pdr_destroy(inPDRRepo);
478 pldm_pdr_destroy(numericEffecterPdrRepo);
479}
480
481TEST(getNumericEffecterValueHandler, testBadRequest)
482{
483 MockdBusHandler mockedUtils;
484 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
485 .Times(5)
486 .WillRepeatedly(Return("foo.bar"));
487
488 auto inPDRRepo = pldm_pdr_init();
489 auto numericEffecterPdrRepo = pldm_pdr_init();
490 Repo numericEffecterPDRs(numericEffecterPdrRepo);
491 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500492 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_effecter/good",
493 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800494 event);
Archana Kakani6ece21fb2023-10-10 08:21:52 -0500495 Repo inRepo(inPDRRepo);
496 getRepoByType(inRepo, numericEffecterPDRs, PLDM_NUMERIC_EFFECTER_PDR);
497
498 pdr_utils::PdrEntry e;
499 auto record4 = pdr::getRecordByHandle(numericEffecterPDRs, 4, e);
500 ASSERT_NE(record4, nullptr);
501
502 pldm_numeric_effecter_value_pdr* pdr =
503 reinterpret_cast<pldm_numeric_effecter_value_pdr*>(e.data);
504 EXPECT_EQ(pdr->hdr.type, PLDM_NUMERIC_EFFECTER_PDR);
505
506 uint16_t effecterId = 4;
507
508 uint8_t effecterDataSize{};
509 pldm::utils::PropertyValue dbusValue;
510 std::string propertyType;
511
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400512 auto rc = platform_numeric_effecter::getNumericEffecterData<
513 MockdBusHandler, Handler>(mockedUtils, handler, effecterId,
514 effecterDataSize, propertyType, dbusValue);
Archana Kakani6ece21fb2023-10-10 08:21:52 -0500515
516 ASSERT_EQ(rc, 128);
517
518 pldm_pdr_destroy(inPDRRepo);
519 pldm_pdr_destroy(numericEffecterPdrRepo);
520}
521
Tom Josephb4268602020-04-17 17:20:45 +0530522TEST(parseStateSensor, allScenarios)
523{
524 // Sample state sensor with SensorID - 1, EntityType - Processor Module(67)
525 // State Set ID - Operational Running Status(11), Supported States - 3,4
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400526 std::vector<uint8_t> sample1PDR{
527 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x17,
528 0x00, 0x00, 0x00, 0x01, 0x00, 0x43, 0x00, 0x01, 0x00,
529 0x00, 0x00, 0x00, 0x00, 0x01, 0x0b, 0x00, 0x01, 0x18};
Tom Josephb4268602020-04-17 17:20:45 +0530530
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400531 const auto& [terminusHandle1, sensorID1, sensorInfo1] =
532 parseStateSensorPDR(sample1PDR);
533 const auto& [containerID1, entityType1, entityInstance1] =
534 std::get<0>(sensorInfo1);
Tom Josephb4268602020-04-17 17:20:45 +0530535 const auto& states1 = std::get<1>(sensorInfo1);
536 CompositeSensorStates statesCmp1{{3u, 4u}};
537
538 ASSERT_EQ(le16toh(terminusHandle1), 0u);
539 ASSERT_EQ(le16toh(sensorID1), 1u);
540 ASSERT_EQ(le16toh(containerID1), 0u);
541 ASSERT_EQ(le16toh(entityType1), 67u);
542 ASSERT_EQ(le16toh(entityInstance1), 1u);
543 ASSERT_EQ(states1, statesCmp1);
544
545 // Sample state sensor with SensorID - 2, EntityType - System Firmware(31)
546 // State Set ID - Availability(2), Supported States - 3,4,9,10,11,13
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400547 std::vector<uint8_t> sample2PDR{
548 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x17, 0x00,
549 0x00, 0x00, 0x02, 0x00, 0x1F, 0x00, 0x01, 0x00, 0x00, 0x00,
550 0x00, 0x00, 0x01, 0x02, 0x00, 0x02, 0x18, 0x2E};
Tom Josephb4268602020-04-17 17:20:45 +0530551
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400552 const auto& [terminusHandle2, sensorID2, sensorInfo2] =
553 parseStateSensorPDR(sample2PDR);
554 const auto& [containerID2, entityType2, entityInstance2] =
555 std::get<0>(sensorInfo2);
Tom Josephb4268602020-04-17 17:20:45 +0530556 const auto& states2 = std::get<1>(sensorInfo2);
557 CompositeSensorStates statesCmp2{{3u, 4u, 9u, 10u, 11u, 13u}};
558
559 ASSERT_EQ(le16toh(terminusHandle2), 0u);
560 ASSERT_EQ(le16toh(sensorID2), 2u);
561 ASSERT_EQ(le16toh(containerID2), 0u);
562 ASSERT_EQ(le16toh(entityType2), 31u);
563 ASSERT_EQ(le16toh(entityInstance2), 1u);
564 ASSERT_EQ(states2, statesCmp2);
565
566 // Sample state sensor with SensorID - 3, EntityType - Virtual Machine
567 // Manager(33), Composite State Sensor -2 , State Set ID - Link State(33),
568 // Supported States - 1,2, State Set ID - Configuration State(15),
569 // Supported States - 1,2,3,4
570 std::vector<uint8_t> sample3PDR{
571 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x17, 0x00, 0x00,
572 0x00, 0x03, 0x00, 0x21, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,
573 0x02, 0x21, 0x00, 0x01, 0x06, 0x0F, 0x00, 0x01, 0x1E};
574
Patrick Williams16c2a0a2024-08-16 15:20:59 -0400575 const auto& [terminusHandle3, sensorID3, sensorInfo3] =
576 parseStateSensorPDR(sample3PDR);
577 const auto& [containerID3, entityType3, entityInstance3] =
578 std::get<0>(sensorInfo3);
Tom Josephb4268602020-04-17 17:20:45 +0530579 const auto& states3 = std::get<1>(sensorInfo3);
580 CompositeSensorStates statesCmp3{{1u, 2u}, {1u, 2u, 3u, 4u}};
581
582 ASSERT_EQ(le16toh(terminusHandle3), 0u);
583 ASSERT_EQ(le16toh(sensorID3), 3u);
584 ASSERT_EQ(le16toh(containerID3), 1u);
585 ASSERT_EQ(le16toh(entityType3), 33u);
586 ASSERT_EQ(le16toh(entityInstance3), 2u);
587 ASSERT_EQ(states3, statesCmp3);
588}
TOM JOSEPHd4d97a52020-03-23 14:36:34 +0530589
590TEST(StateSensorHandler, allScenarios)
591{
592 using namespace pldm::responder::events;
593
TOM JOSEPHd4d97a52020-03-23 14:36:34 +0530594 StateSensorHandler handler{"./event_jsons/good"};
595 constexpr uint8_t eventState0 = 0;
596 constexpr uint8_t eventState1 = 1;
597 constexpr uint8_t eventState2 = 2;
598 constexpr uint8_t eventState3 = 3;
599
600 // Event Entry 1
601 {
Manojkiran Edafa084702024-05-27 10:20:30 +0530602 StateSensorEntry entry{1, 64, 1, 0, 1, false};
TOM JOSEPHd4d97a52020-03-23 14:36:34 +0530603 const auto& [dbusMapping, eventStateMap] = handler.getEventInfo(entry);
604 DBusMapping mapping{"/xyz/abc/def",
605 "xyz.openbmc_project.example1.value", "value1",
606 "string"};
607 ASSERT_EQ(mapping == dbusMapping, true);
608
609 const auto& propValue0 = eventStateMap.at(eventState0);
610 const auto& propValue1 = eventStateMap.at(eventState1);
611 const auto& propValue2 = eventStateMap.at(eventState2);
612 PropertyValue value0{std::in_place_type<std::string>,
613 "xyz.openbmc_project.State.Normal"};
614 PropertyValue value1{std::in_place_type<std::string>,
615 "xyz.openbmc_project.State.Critical"};
616 PropertyValue value2{std::in_place_type<std::string>,
617 "xyz.openbmc_project.State.Fatal"};
618 ASSERT_EQ(value0 == propValue0, true);
619 ASSERT_EQ(value1 == propValue1, true);
620 ASSERT_EQ(value2 == propValue2, true);
621 }
622
623 // Event Entry 2
624 {
Manojkiran Edafa084702024-05-27 10:20:30 +0530625 StateSensorEntry entry{1, 64, 1, 1, 1, false};
TOM JOSEPHd4d97a52020-03-23 14:36:34 +0530626 const auto& [dbusMapping, eventStateMap] = handler.getEventInfo(entry);
627 DBusMapping mapping{"/xyz/abc/def",
628 "xyz.openbmc_project.example2.value", "value2",
629 "uint8_t"};
630 ASSERT_EQ(mapping == dbusMapping, true);
631
632 const auto& propValue0 = eventStateMap.at(eventState2);
633 const auto& propValue1 = eventStateMap.at(eventState3);
634 PropertyValue value0{std::in_place_type<uint8_t>, 9};
635 PropertyValue value1{std::in_place_type<uint8_t>, 10};
636 ASSERT_EQ(value0 == propValue0, true);
637 ASSERT_EQ(value1 == propValue1, true);
638 }
639
640 // Event Entry 3
641 {
Manojkiran Edafa084702024-05-27 10:20:30 +0530642 StateSensorEntry entry{2, 67, 2, 0, 1, false};
TOM JOSEPHd4d97a52020-03-23 14:36:34 +0530643 const auto& [dbusMapping, eventStateMap] = handler.getEventInfo(entry);
644 DBusMapping mapping{"/xyz/abc/ghi",
645 "xyz.openbmc_project.example3.value", "value3",
646 "bool"};
647 ASSERT_EQ(mapping == dbusMapping, true);
648
649 const auto& propValue0 = eventStateMap.at(eventState0);
650 const auto& propValue1 = eventStateMap.at(eventState1);
651 PropertyValue value0{std::in_place_type<bool>, false};
652 PropertyValue value1{std::in_place_type<bool>, true};
653 ASSERT_EQ(value0 == propValue0, true);
654 ASSERT_EQ(value1 == propValue1, true);
655 }
656
Sagar Srinivase3607a32024-02-16 03:50:53 -0600657 // Event Entry 4
658 {
Manojkiran Edafa084702024-05-27 10:20:30 +0530659 StateSensorEntry entry{2, 67, 2, 0, 2, false};
Sagar Srinivase3607a32024-02-16 03:50:53 -0600660 const auto& [dbusMapping, eventStateMap] = handler.getEventInfo(entry);
661 DBusMapping mapping{"/xyz/abc/jkl",
662 "xyz.openbmc_project.example4.value", "value4",
663 "string"};
664 ASSERT_EQ(mapping == dbusMapping, true);
665
666 const auto& propValue0 = eventStateMap.at(eventState0);
667 const auto& propValue1 = eventStateMap.at(eventState1);
668 const auto& propValue2 = eventStateMap.at(eventState2);
669 PropertyValue value0{std::in_place_type<std::string>, "Enabled"};
670 PropertyValue value1{std::in_place_type<std::string>, "Disabled"};
671 PropertyValue value2{std::in_place_type<std::string>, "Auto"};
672 ASSERT_EQ(value0 == propValue0, true);
673 ASSERT_EQ(value1 == propValue1, true);
674 ASSERT_EQ(value2 == propValue2, true);
675 }
676
Manojkiran Edafa084702024-05-27 10:20:30 +0530677 // Event Entry 5
678 {
679 StateSensorEntry entry{0xFFFF, 120, 2, 0, 2, true};
680 const auto& [dbusMapping, eventStateMap] = handler.getEventInfo(entry);
681 DBusMapping mapping{"/xyz/abc/mno",
682 "xyz.openbmc_project.example5.value", "value5",
683 "string"};
684 ASSERT_EQ(mapping == dbusMapping, true);
685
686 const auto& propValue0 = eventStateMap.at(eventState0);
687 const auto& propValue1 = eventStateMap.at(eventState1);
688 const auto& propValue2 = eventStateMap.at(eventState2);
689 PropertyValue value0{std::in_place_type<std::string>, "Enabled"};
690 PropertyValue value1{std::in_place_type<std::string>, "Disabled"};
691 PropertyValue value2{std::in_place_type<std::string>, "Auto"};
692 ASSERT_EQ(value0 == propValue0, true);
693 ASSERT_EQ(value1 == propValue1, true);
694 ASSERT_EQ(value2 == propValue2, true);
695 }
696 // Event Entry 6
697 {
698 StateSensorEntry entry{10, 120, 2, 0, 2, true};
699 const auto& [dbusMapping, eventStateMap] = handler.getEventInfo(entry);
700 DBusMapping mapping{"/xyz/abc/opk",
701 "xyz.openbmc_project.example6.value", "value6",
702 "string"};
703 ASSERT_EQ(mapping == dbusMapping, true);
704
705 const auto& propValue0 = eventStateMap.at(eventState0);
706 const auto& propValue1 = eventStateMap.at(eventState1);
707 const auto& propValue2 = eventStateMap.at(eventState2);
708 PropertyValue value0{std::in_place_type<std::string>, "Enabled"};
709 PropertyValue value1{std::in_place_type<std::string>, "Disabled"};
710 PropertyValue value2{std::in_place_type<std::string>, "Auto"};
711 ASSERT_EQ(value0 == propValue0, true);
712 ASSERT_EQ(value1 == propValue1, true);
713 ASSERT_EQ(value2 == propValue2, true);
714 }
715 // Event Entry 7
716 {
717 StateSensorEntry entry{10, 120, 2, 0, 2, false};
718 const auto& [dbusMapping, eventStateMap] = handler.getEventInfo(entry);
719 DBusMapping mapping{"/xyz/abc/opk",
720 "xyz.openbmc_project.example6.value", "value6",
721 "string"};
722 ASSERT_EQ(mapping == dbusMapping, true);
723
724 const auto& propValue0 = eventStateMap.at(eventState0);
725 const auto& propValue1 = eventStateMap.at(eventState1);
726 const auto& propValue2 = eventStateMap.at(eventState2);
727 PropertyValue value0{std::in_place_type<std::string>, "Enabled"};
728 PropertyValue value1{std::in_place_type<std::string>, "Disabled"};
729 PropertyValue value2{std::in_place_type<std::string>, "Auto"};
730 ASSERT_EQ(value0 == propValue0, true);
731 ASSERT_EQ(value1 == propValue1, true);
732 ASSERT_EQ(value2 == propValue2, true);
733 }
734
TOM JOSEPHd4d97a52020-03-23 14:36:34 +0530735 // Invalid Entry
736 {
Manojkiran Edafa084702024-05-27 10:20:30 +0530737 StateSensorEntry entry{0, 0, 0, 0, 1, false};
TOM JOSEPHd4d97a52020-03-23 14:36:34 +0530738 ASSERT_THROW(handler.getEventInfo(entry), std::out_of_range);
739 }
740}
Sampa Misra12afe112020-05-25 11:40:44 -0500741
742TEST(TerminusLocatorPDR, BMCTerminusLocatorPDR)
743{
744 auto inPDRRepo = pldm_pdr_init();
745 auto outPDRRepo = pldm_pdr_init();
746 Repo outRepo(outPDRRepo);
747 MockdBusHandler mockedUtils;
Sampa Misra5fb37d52021-03-06 07:26:00 -0600748 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500749 Handler handler(&mockedUtils, 0, nullptr, "", inPDRRepo, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800750 nullptr, nullptr, nullptr, event);
Sampa Misra12afe112020-05-25 11:40:44 -0500751 Repo inRepo(inPDRRepo);
752 getRepoByType(inRepo, outRepo, PLDM_TERMINUS_LOCATOR_PDR);
753
754 // 1 BMC terminus locator PDR in the PDR repository
755 ASSERT_EQ(outRepo.getRecordCount(), 1);
756
757 pdr_utils::PdrEntry entry;
758 auto record = pdr::getRecordByHandle(outRepo, 1, entry);
759 ASSERT_NE(record, nullptr);
760
761 auto pdr = reinterpret_cast<const pldm_terminus_locator_pdr*>(entry.data);
762 EXPECT_EQ(pdr->hdr.record_handle, 1);
763 EXPECT_EQ(pdr->hdr.version, 1);
764 EXPECT_EQ(pdr->hdr.type, PLDM_TERMINUS_LOCATOR_PDR);
765 EXPECT_EQ(pdr->hdr.record_change_num, 0);
766 EXPECT_EQ(pdr->hdr.length,
767 sizeof(pldm_terminus_locator_pdr) - sizeof(pldm_pdr_hdr));
Manojkiran Edacc5f1582021-09-29 17:03:06 +0530768 EXPECT_EQ(pdr->terminus_handle, TERMINUS_HANDLE);
Sampa Misra12afe112020-05-25 11:40:44 -0500769 EXPECT_EQ(pdr->validity, PLDM_TL_PDR_VALID);
Manojkiran Edacc5f1582021-09-29 17:03:06 +0530770 EXPECT_EQ(pdr->tid, TERMINUS_ID);
Sampa Misra12afe112020-05-25 11:40:44 -0500771 EXPECT_EQ(pdr->container_id, 0);
772 EXPECT_EQ(pdr->terminus_locator_type, PLDM_TERMINUS_LOCATOR_TYPE_MCTP_EID);
773 EXPECT_EQ(pdr->terminus_locator_value_size,
774 sizeof(pldm_terminus_locator_type_mctp_eid));
775 auto locatorValue =
776 reinterpret_cast<const pldm_terminus_locator_type_mctp_eid*>(
777 pdr->terminus_locator_value);
Thu Nguyen51d66b52024-08-06 09:15:55 +0000778 EXPECT_EQ(locatorValue->eid, pldm::BmcMctpEid);
George Liua9170122020-05-14 11:59:13 +0800779 pldm_pdr_destroy(inPDRRepo);
780 pldm_pdr_destroy(outPDRRepo);
781}
782
783TEST(getStateSensorReadingsHandler, testGoodRequest)
784{
785 MockdBusHandler mockedUtils;
786 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
787 .Times(1)
788 .WillRepeatedly(Return("foo.bar"));
789
790 auto inPDRRepo = pldm_pdr_init();
791 auto outPDRRepo = pldm_pdr_init();
792 Repo outRepo(outPDRRepo);
Sampa Misra5fb37d52021-03-06 07:26:00 -0600793 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500794 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_sensor/good",
795 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800796 event);
George Liua9170122020-05-14 11:59:13 +0800797 Repo inRepo(inPDRRepo);
798 getRepoByType(inRepo, outRepo, PLDM_STATE_SENSOR_PDR);
799 pdr_utils::PdrEntry e;
800 auto record = pdr::getRecordByHandle(outRepo, 2, e);
801 ASSERT_NE(record, nullptr);
802 pldm_state_sensor_pdr* pdr =
803 reinterpret_cast<pldm_state_sensor_pdr*>(e.data);
804 EXPECT_EQ(pdr->hdr.type, PLDM_STATE_SENSOR_PDR);
805
806 std::vector<get_sensor_state_field> stateField;
807 uint8_t compSensorCnt{};
808 uint8_t sensorRearmCnt = 1;
809
810 MockdBusHandler handlerObj;
811 EXPECT_CALL(handlerObj,
812 getDbusPropertyVariant(StrEq("/foo/bar"), StrEq("propertyName"),
813 StrEq("xyz.openbmc_project.Foo.Bar")))
814 .WillOnce(Return(
815 PropertyValue(std::string("xyz.openbmc_project.Foo.Bar.V0"))));
Manojkiran Edaae933cc2024-02-21 17:19:21 +0530816 EventStates cache = {PLDM_SENSOR_NORMAL};
817 pldm::stateSensorCacheMaps sensorCache;
818 sensorCache.emplace(0x1, cache);
George Liua9170122020-05-14 11:59:13 +0800819 auto rc = platform_state_sensor::getStateSensorReadingsHandler<
820 MockdBusHandler, Handler>(handlerObj, handler, 0x1, sensorRearmCnt,
Manojkiran Edaae933cc2024-02-21 17:19:21 +0530821 compSensorCnt, stateField, sensorCache);
George Liua9170122020-05-14 11:59:13 +0800822 ASSERT_EQ(rc, 0);
823 ASSERT_EQ(compSensorCnt, 1);
George Liu916808c2021-01-19 17:56:42 +0800824 ASSERT_EQ(stateField[0].sensor_op_state, PLDM_SENSOR_UNAVAILABLE);
825 ASSERT_EQ(stateField[0].present_state, PLDM_SENSOR_NORMAL);
Manojkiran Edaae933cc2024-02-21 17:19:21 +0530826 ASSERT_EQ(stateField[0].previous_state, PLDM_SENSOR_NORMAL);
George Liu916808c2021-01-19 17:56:42 +0800827 ASSERT_EQ(stateField[0].event_state, PLDM_SENSOR_UNKNOWN);
George Liua9170122020-05-14 11:59:13 +0800828
829 pldm_pdr_destroy(inPDRRepo);
830 pldm_pdr_destroy(outPDRRepo);
831}
832
833TEST(getStateSensorReadingsHandler, testBadRequest)
834{
835 MockdBusHandler mockedUtils;
836 EXPECT_CALL(mockedUtils, getService(StrEq("/foo/bar"), _))
837 .Times(1)
838 .WillRepeatedly(Return("foo.bar"));
839
840 auto inPDRRepo = pldm_pdr_init();
841 auto outPDRRepo = pldm_pdr_init();
842 Repo outRepo(outPDRRepo);
Sampa Misra5fb37d52021-03-06 07:26:00 -0600843 auto event = sdeventplus::Event::get_default();
Sagar Srinivas90314a32023-10-17 10:38:03 -0500844 Handler handler(&mockedUtils, 0, nullptr, "./pdr_jsons/state_sensor/good",
845 inPDRRepo, nullptr, nullptr, nullptr, nullptr, nullptr,
George Liua881c172021-06-21 18:28:11 +0800846 event);
George Liua9170122020-05-14 11:59:13 +0800847 Repo inRepo(inPDRRepo);
848 getRepoByType(inRepo, outRepo, PLDM_STATE_SENSOR_PDR);
849 pdr_utils::PdrEntry e;
850 auto record = pdr::getRecordByHandle(outRepo, 2, e);
851 ASSERT_NE(record, nullptr);
852 pldm_state_sensor_pdr* pdr =
853 reinterpret_cast<pldm_state_sensor_pdr*>(e.data);
854 EXPECT_EQ(pdr->hdr.type, PLDM_STATE_SENSOR_PDR);
855
856 std::vector<get_sensor_state_field> stateField;
857 uint8_t compSensorCnt{};
858 uint8_t sensorRearmCnt = 3;
859
860 MockdBusHandler handlerObj;
Manojkiran Edaae933cc2024-02-21 17:19:21 +0530861 EventStates cache = {PLDM_SENSOR_NORMAL};
862 pldm::stateSensorCacheMaps sensorCache;
863 sensorCache.emplace(0x1, cache);
George Liua9170122020-05-14 11:59:13 +0800864 auto rc = platform_state_sensor::getStateSensorReadingsHandler<
865 MockdBusHandler, Handler>(handlerObj, handler, 0x1, sensorRearmCnt,
Manojkiran Edaae933cc2024-02-21 17:19:21 +0530866 compSensorCnt, stateField, sensorCache);
George Liua9170122020-05-14 11:59:13 +0800867 ASSERT_EQ(rc, PLDM_PLATFORM_REARM_UNAVAILABLE_IN_PRESENT_STATE);
Sampa Misra12afe112020-05-25 11:40:44 -0500868
869 pldm_pdr_destroy(inPDRRepo);
870 pldm_pdr_destroy(outPDRRepo);
871}