blob: 5ea71abb78f9f1f08c27192c2ca9d0eb3da171c7 [file] [log] [blame]
Deepak Kodihalli557dfb02019-05-12 13:11:17 +05301#include "libpldmresponder/pdr.hpp"
George Liue53193f2020-02-24 09:23:26 +08002#include "libpldmresponder/pdr_utils.hpp"
Deepak Kodihalli557dfb02019-05-12 13:11:17 +05303#include "libpldmresponder/platform.hpp"
George Liu64d26be2020-01-15 10:58:10 +08004#include "libpldmresponder/platform_numeric_effecter.hpp"
George Liu0d7aca82020-03-30 15:01:36 +08005#include "libpldmresponder/platform_state_effecter.hpp"
George Liu1e44c732020-02-28 20:20:06 +08006#include "mocked_utils.hpp"
7#include "utils.hpp"
Deepak Kodihalli557dfb02019-05-12 13:11:17 +05308
9#include <iostream>
10
George Liu1e44c732020-02-28 20:20:06 +080011using namespace pldm::utils;
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053012using namespace pldm::responder;
Deepak Kodihallic682fe22020-03-04 00:42:54 -060013using namespace pldm::responder::platform;
14using namespace pldm::responder::pdr;
15using namespace pldm::responder::pdr_utils;
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053016
17TEST(getPDR, testGoodPath)
18{
19 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
20 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +080021 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053022 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
23
George Liue53193f2020-02-24 09:23:26 +080024 struct pldm_get_pdr_req* request =
25 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
26 request->request_count = 100;
27
Deepak Kodihallic682fe22020-03-04 00:42:54 -060028 auto pdrRepo = pldm_pdr_init();
Pavithra Barithaya51efaf82020-04-02 02:42:27 -050029 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060030 Repo repo(pdrRepo);
31 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +080032 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053033 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
34
George Liue53193f2020-02-24 09:23:26 +080035 struct pldm_get_pdr_resp* resp =
36 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
37 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
38 ASSERT_EQ(2, resp->next_record_handle);
39 ASSERT_EQ(true, resp->response_count != 0);
40
41 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(resp->record_data);
42 ASSERT_EQ(hdr->record_handle, 1);
43 ASSERT_EQ(hdr->version, 1);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060044
45 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053046}
47
48TEST(getPDR, testShortRead)
49{
50 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
51 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +080052 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053053 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
54
George Liue53193f2020-02-24 09:23:26 +080055 struct pldm_get_pdr_req* request =
56 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
57 request->request_count = 1;
58
Deepak Kodihallic682fe22020-03-04 00:42:54 -060059 auto pdrRepo = pldm_pdr_init();
Pavithra Barithaya51efaf82020-04-02 02:42:27 -050060 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060061 Repo repo(pdrRepo);
62 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +080063 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053064 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
George Liue53193f2020-02-24 09:23:26 +080065 struct pldm_get_pdr_resp* resp =
66 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
67 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
68 ASSERT_EQ(1, resp->response_count);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060069 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053070}
71
72TEST(getPDR, testBadRecordHandle)
73{
74 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
75 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +080076 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053077 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
78
George Liue53193f2020-02-24 09:23:26 +080079 struct pldm_get_pdr_req* request =
80 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
81 request->record_handle = 100000;
82 request->request_count = 1;
83
Deepak Kodihallic682fe22020-03-04 00:42:54 -060084 auto pdrRepo = pldm_pdr_init();
Pavithra Barithaya51efaf82020-04-02 02:42:27 -050085 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060086 Repo repo(pdrRepo);
87 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +080088 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053089 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
90
91 ASSERT_EQ(responsePtr->payload[0], PLDM_PLATFORM_INVALID_RECORD_HANDLE);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060092
93 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053094}
95
96TEST(getPDR, testNoNextRecord)
97{
98 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
99 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +0800100 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530101 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
102
George Liue53193f2020-02-24 09:23:26 +0800103 struct pldm_get_pdr_req* request =
104 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
105 request->record_handle = 1;
106
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600107 auto pdrRepo = pldm_pdr_init();
Pavithra Barithaya51efaf82020-04-02 02:42:27 -0500108 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600109 Repo repo(pdrRepo);
110 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +0800111 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530112 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
George Liue53193f2020-02-24 09:23:26 +0800113 struct pldm_get_pdr_resp* resp =
114 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
115 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
116 ASSERT_EQ(2, resp->next_record_handle);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600117
118 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530119}
120
121TEST(getPDR, testFindPDR)
122{
123 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
124 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +0800125 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530126 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
127
George Liue53193f2020-02-24 09:23:26 +0800128 struct pldm_get_pdr_req* request =
129 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
130 request->request_count = 100;
131
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600132 auto pdrRepo = pldm_pdr_init();
Pavithra Barithaya51efaf82020-04-02 02:42:27 -0500133 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600134 Repo repo(pdrRepo);
135 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +0800136 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530137
138 // Let's try to find a PDR of type stateEffecter (= 11) and entity type =
139 // 100
140 bool found = false;
141 uint32_t handle = 0; // start asking for PDRs from recordHandle 0
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530142 while (!found)
143 {
George Liue53193f2020-02-24 09:23:26 +0800144 request->record_handle = handle;
George Liue53193f2020-02-24 09:23:26 +0800145 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530146 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
George Liue53193f2020-02-24 09:23:26 +0800147 struct pldm_get_pdr_resp* resp =
148 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
149 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530150
George Liue53193f2020-02-24 09:23:26 +0800151 handle = resp->next_record_handle; // point to the next pdr in case
152 // current is not what we want
153
154 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(resp->record_data);
Sampa Misraaa8ae722019-12-12 03:20:40 -0600155 std::cerr << "PDR next record handle " << handle << "\n";
George Liue53193f2020-02-24 09:23:26 +0800156 std::cerr << "PDR type " << hdr->type << "\n";
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530157 if (hdr->type == PLDM_STATE_EFFECTER_PDR)
158 {
159 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +0800160 reinterpret_cast<pldm_state_effecter_pdr*>(resp->record_data);
Sampa Misraaa8ae722019-12-12 03:20:40 -0600161 std::cerr << "PDR entity type " << pdr->entity_type << "\n";
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530162 if (pdr->entity_type == 100)
163 {
164 found = true;
165 // Rest of the PDR can be accessed as need be
166 break;
167 }
168 }
George Liue53193f2020-02-24 09:23:26 +0800169 if (!resp->next_record_handle) // no more records
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530170 {
171 break;
172 }
173 }
174 ASSERT_EQ(found, true);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600175
176 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530177}
Sampa Misraa2fa0702019-05-31 01:28:55 -0500178
Sampa Misraa2fa0702019-05-31 01:28:55 -0500179TEST(setStateEffecterStatesHandler, testGoodRequest)
180{
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600181 auto inPDRRepo = pldm_pdr_init();
182 auto outPDRRepo = pldm_pdr_init();
183 Repo outRepo(outPDRRepo);
Pavithra Barithaya51efaf82020-04-02 02:42:27 -0500184 Handler handler("./pdr_jsons/state_effecter/good", inPDRRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600185 Repo inRepo(inPDRRepo);
186 getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
George Liue53193f2020-02-24 09:23:26 +0800187 pdr_utils::PdrEntry e;
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600188 auto record1 = pdr::getRecordByHandle(outRepo, 1, e);
George Liue53193f2020-02-24 09:23:26 +0800189 ASSERT_NE(record1, nullptr);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500190 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +0800191 reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500192 EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
193
194 std::vector<set_effecter_state_field> stateField;
195 stateField.push_back({PLDM_REQUEST_SET, 1});
196 stateField.push_back({PLDM_REQUEST_SET, 1});
George Liu1ec85d42020-02-12 16:05:32 +0800197 std::string value = "xyz.openbmc_project.Foo.Bar.V1";
George Liu1e44c732020-02-28 20:20:06 +0800198 PropertyValue propertyValue = value;
Sampa Misraa2fa0702019-05-31 01:28:55 -0500199
200 MockdBusHandler handlerObj;
George Liu1ec85d42020-02-12 16:05:32 +0800201 DBusMapping dbusMapping{"/foo/bar", "xyz.openbmc_project.Foo.Bar",
202 "propertyName", "string"};
George Liu1e44c732020-02-28 20:20:06 +0800203
204 EXPECT_CALL(handlerObj, setDbusProperty(dbusMapping, propertyValue))
Sampa Misraa2fa0702019-05-31 01:28:55 -0500205 .Times(2);
George Liu0d7aca82020-03-30 15:01:36 +0800206 auto rc = platform_state_effecter::setStateEffecterStatesHandler<
207 MockdBusHandler, Handler>(handlerObj, handler, 0x1, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500208 ASSERT_EQ(rc, 0);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600209
210 pldm_pdr_destroy(inPDRRepo);
211 pldm_pdr_destroy(outPDRRepo);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500212}
213
214TEST(setStateEffecterStatesHandler, testBadRequest)
215{
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600216 auto inPDRRepo = pldm_pdr_init();
217 auto outPDRRepo = pldm_pdr_init();
218 Repo outRepo(outPDRRepo);
Pavithra Barithaya51efaf82020-04-02 02:42:27 -0500219 Handler handler("./pdr_jsons/state_effecter/good", inPDRRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600220 Repo inRepo(inPDRRepo);
221 getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
George Liue53193f2020-02-24 09:23:26 +0800222 pdr_utils::PdrEntry e;
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600223 auto record1 = pdr::getRecordByHandle(outRepo, 1, e);
George Liue53193f2020-02-24 09:23:26 +0800224 ASSERT_NE(record1, nullptr);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500225 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +0800226 reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500227 EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
228
229 std::vector<set_effecter_state_field> stateField;
230 stateField.push_back({PLDM_REQUEST_SET, 3});
231 stateField.push_back({PLDM_REQUEST_SET, 4});
232
233 MockdBusHandler handlerObj;
George Liu0d7aca82020-03-30 15:01:36 +0800234 auto rc = platform_state_effecter::setStateEffecterStatesHandler<
235 MockdBusHandler, Handler>(handlerObj, handler, 0x1, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500236 ASSERT_EQ(rc, PLDM_PLATFORM_SET_EFFECTER_UNSUPPORTED_SENSORSTATE);
237
George Liu0d7aca82020-03-30 15:01:36 +0800238 rc = platform_state_effecter::setStateEffecterStatesHandler<MockdBusHandler,
239 Handler>(
240 handlerObj, handler, 0x9, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500241 ASSERT_EQ(rc, PLDM_PLATFORM_INVALID_EFFECTER_ID);
242
243 stateField.push_back({PLDM_REQUEST_SET, 4});
George Liu0d7aca82020-03-30 15:01:36 +0800244 rc = platform_state_effecter::setStateEffecterStatesHandler<MockdBusHandler,
245 Handler>(
246 handlerObj, handler, 0x1, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500247 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
248
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600249 pldm_pdr_destroy(inPDRRepo);
250 pldm_pdr_destroy(outPDRRepo);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500251}
George Liu64d26be2020-01-15 10:58:10 +0800252
253TEST(setNumericEffecterValueHandler, testGoodRequest)
254{
255 auto inPDRRepo = pldm_pdr_init();
256 auto numericEffecterPdrRepo = pldm_pdr_init();
257 Repo numericEffecterPDRs(numericEffecterPdrRepo);
258 Handler handler("./pdr_jsons/state_effecter/good", inPDRRepo, nullptr);
259 Repo inRepo(inPDRRepo);
260 getRepoByType(inRepo, numericEffecterPDRs, PLDM_NUMERIC_EFFECTER_PDR);
261
262 pdr_utils::PdrEntry e;
263 auto record3 = pdr::getRecordByHandle(numericEffecterPDRs, 3, e);
264 ASSERT_NE(record3, nullptr);
265
266 pldm_numeric_effecter_value_pdr* pdr =
267 reinterpret_cast<pldm_numeric_effecter_value_pdr*>(e.data);
268 EXPECT_EQ(pdr->hdr.type, PLDM_NUMERIC_EFFECTER_PDR);
269
270 uint16_t effecterId = 3;
271 uint32_t effecterValue = 2100000000; // 2036-07-18 21:20:00
272 PropertyValue propertyValue = static_cast<uint32_t>(effecterValue);
273
274 MockdBusHandler handlerObj;
275 DBusMapping dbusMapping{"/foo/bar", "xyz.openbmc_project.Foo.Bar",
276 "propertyName", "uint64_t"};
277 EXPECT_CALL(handlerObj, setDbusProperty(dbusMapping, propertyValue))
278 .Times(1);
279
280 auto rc = platform_numeric_effecter::setNumericEffecterValueHandler<
281 MockdBusHandler, Handler>(
282 handlerObj, handler, effecterId, PLDM_EFFECTER_DATA_SIZE_UINT32,
283 reinterpret_cast<uint8_t*>(&effecterValue), 4);
284 ASSERT_EQ(rc, 0);
285
286 pldm_pdr_destroy(inPDRRepo);
287 pldm_pdr_destroy(numericEffecterPdrRepo);
288}
289
290TEST(setNumericEffecterValueHandler, testBadRequest)
291{
292 auto inPDRRepo = pldm_pdr_init();
293 auto numericEffecterPdrRepo = pldm_pdr_init();
294 Repo numericEffecterPDRs(numericEffecterPdrRepo);
295 Handler handler("./pdr_jsons/state_effecter/good", inPDRRepo, nullptr);
296 Repo inRepo(inPDRRepo);
297 getRepoByType(inRepo, numericEffecterPDRs, PLDM_NUMERIC_EFFECTER_PDR);
298
299 pdr_utils::PdrEntry e;
300 auto record3 = pdr::getRecordByHandle(numericEffecterPDRs, 3, e);
301 ASSERT_NE(record3, nullptr);
302
303 pldm_numeric_effecter_value_pdr* pdr =
304 reinterpret_cast<pldm_numeric_effecter_value_pdr*>(e.data);
305 EXPECT_EQ(pdr->hdr.type, PLDM_NUMERIC_EFFECTER_PDR);
306
307 uint16_t effecterId = 3;
308 uint64_t effecterValue = 9876543210;
309 MockdBusHandler handlerObj;
310 auto rc = platform_numeric_effecter::setNumericEffecterValueHandler<
311 MockdBusHandler, Handler>(
312 handlerObj, handler, effecterId, PLDM_EFFECTER_DATA_SIZE_SINT32,
313 reinterpret_cast<uint8_t*>(&effecterValue), 3);
314 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
315
316 pldm_pdr_destroy(inPDRRepo);
317 pldm_pdr_destroy(numericEffecterPdrRepo);
318}