blob: c764ce3642bc52ba34476e19ba8a0be31b8217a4 [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 Liu0d7aca82020-03-30 15:01:36 +08004#include "libpldmresponder/platform_state_effecter.hpp"
George Liu1e44c732020-02-28 20:20:06 +08005#include "mocked_utils.hpp"
6#include "utils.hpp"
Deepak Kodihalli557dfb02019-05-12 13:11:17 +05307
8#include <iostream>
9
George Liu1e44c732020-02-28 20:20:06 +080010using namespace pldm::utils;
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053011using namespace pldm::responder;
Deepak Kodihallic682fe22020-03-04 00:42:54 -060012using namespace pldm::responder::platform;
13using namespace pldm::responder::pdr;
14using namespace pldm::responder::pdr_utils;
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053015
16TEST(getPDR, testGoodPath)
17{
18 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
19 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +080020 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053021 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
22
George Liue53193f2020-02-24 09:23:26 +080023 struct pldm_get_pdr_req* request =
24 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
25 request->request_count = 100;
26
Deepak Kodihallic682fe22020-03-04 00:42:54 -060027 auto pdrRepo = pldm_pdr_init();
Pavithra Barithaya51efaf82020-04-02 02:42:27 -050028 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060029 Repo repo(pdrRepo);
30 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +080031 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053032 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
33
George Liue53193f2020-02-24 09:23:26 +080034 struct pldm_get_pdr_resp* resp =
35 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
36 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
37 ASSERT_EQ(2, resp->next_record_handle);
38 ASSERT_EQ(true, resp->response_count != 0);
39
40 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(resp->record_data);
41 ASSERT_EQ(hdr->record_handle, 1);
42 ASSERT_EQ(hdr->version, 1);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060043
44 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053045}
46
47TEST(getPDR, testShortRead)
48{
49 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
50 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +080051 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053052 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
53
George Liue53193f2020-02-24 09:23:26 +080054 struct pldm_get_pdr_req* request =
55 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
56 request->request_count = 1;
57
Deepak Kodihallic682fe22020-03-04 00:42:54 -060058 auto pdrRepo = pldm_pdr_init();
Pavithra Barithaya51efaf82020-04-02 02:42:27 -050059 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060060 Repo repo(pdrRepo);
61 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +080062 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053063 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
George Liue53193f2020-02-24 09:23:26 +080064 struct pldm_get_pdr_resp* resp =
65 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
66 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
67 ASSERT_EQ(1, resp->response_count);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060068 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053069}
70
71TEST(getPDR, testBadRecordHandle)
72{
73 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
74 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +080075 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053076 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
77
George Liue53193f2020-02-24 09:23:26 +080078 struct pldm_get_pdr_req* request =
79 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
80 request->record_handle = 100000;
81 request->request_count = 1;
82
Deepak Kodihallic682fe22020-03-04 00:42:54 -060083 auto pdrRepo = pldm_pdr_init();
Pavithra Barithaya51efaf82020-04-02 02:42:27 -050084 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060085 Repo repo(pdrRepo);
86 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +080087 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053088 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
89
90 ASSERT_EQ(responsePtr->payload[0], PLDM_PLATFORM_INVALID_RECORD_HANDLE);
Deepak Kodihallic682fe22020-03-04 00:42:54 -060091
92 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +053093}
94
95TEST(getPDR, testNoNextRecord)
96{
97 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
98 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +080099 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530100 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
101
George Liue53193f2020-02-24 09:23:26 +0800102 struct pldm_get_pdr_req* request =
103 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
104 request->record_handle = 1;
105
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600106 auto pdrRepo = pldm_pdr_init();
Pavithra Barithaya51efaf82020-04-02 02:42:27 -0500107 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600108 Repo repo(pdrRepo);
109 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +0800110 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530111 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
George Liue53193f2020-02-24 09:23:26 +0800112 struct pldm_get_pdr_resp* resp =
113 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
114 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
115 ASSERT_EQ(2, resp->next_record_handle);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600116
117 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530118}
119
120TEST(getPDR, testFindPDR)
121{
122 std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REQ_BYTES>
123 requestPayload{};
George Liue53193f2020-02-24 09:23:26 +0800124 auto req = reinterpret_cast<pldm_msg*>(requestPayload.data());
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530125 size_t requestPayloadLength = requestPayload.size() - sizeof(pldm_msg_hdr);
126
George Liue53193f2020-02-24 09:23:26 +0800127 struct pldm_get_pdr_req* request =
128 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
129 request->request_count = 100;
130
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600131 auto pdrRepo = pldm_pdr_init();
Pavithra Barithaya51efaf82020-04-02 02:42:27 -0500132 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600133 Repo repo(pdrRepo);
134 ASSERT_EQ(repo.empty(), false);
George Liue53193f2020-02-24 09:23:26 +0800135 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530136
137 // Let's try to find a PDR of type stateEffecter (= 11) and entity type =
138 // 100
139 bool found = false;
140 uint32_t handle = 0; // start asking for PDRs from recordHandle 0
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530141 while (!found)
142 {
George Liue53193f2020-02-24 09:23:26 +0800143 request->record_handle = handle;
George Liue53193f2020-02-24 09:23:26 +0800144 auto response = handler.getPDR(req, requestPayloadLength);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530145 auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
George Liue53193f2020-02-24 09:23:26 +0800146 struct pldm_get_pdr_resp* resp =
147 reinterpret_cast<struct pldm_get_pdr_resp*>(responsePtr->payload);
148 ASSERT_EQ(PLDM_SUCCESS, resp->completion_code);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530149
George Liue53193f2020-02-24 09:23:26 +0800150 handle = resp->next_record_handle; // point to the next pdr in case
151 // current is not what we want
152
153 pldm_pdr_hdr* hdr = reinterpret_cast<pldm_pdr_hdr*>(resp->record_data);
Sampa Misraaa8ae722019-12-12 03:20:40 -0600154 std::cerr << "PDR next record handle " << handle << "\n";
George Liue53193f2020-02-24 09:23:26 +0800155 std::cerr << "PDR type " << hdr->type << "\n";
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530156 if (hdr->type == PLDM_STATE_EFFECTER_PDR)
157 {
158 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +0800159 reinterpret_cast<pldm_state_effecter_pdr*>(resp->record_data);
Sampa Misraaa8ae722019-12-12 03:20:40 -0600160 std::cerr << "PDR entity type " << pdr->entity_type << "\n";
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530161 if (pdr->entity_type == 100)
162 {
163 found = true;
164 // Rest of the PDR can be accessed as need be
165 break;
166 }
167 }
George Liue53193f2020-02-24 09:23:26 +0800168 if (!resp->next_record_handle) // no more records
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530169 {
170 break;
171 }
172 }
173 ASSERT_EQ(found, true);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600174
175 pldm_pdr_destroy(pdrRepo);
Deepak Kodihalli557dfb02019-05-12 13:11:17 +0530176}
Sampa Misraa2fa0702019-05-31 01:28:55 -0500177
Sampa Misraa2fa0702019-05-31 01:28:55 -0500178TEST(setStateEffecterStatesHandler, testGoodRequest)
179{
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600180 auto inPDRRepo = pldm_pdr_init();
181 auto outPDRRepo = pldm_pdr_init();
182 Repo outRepo(outPDRRepo);
Pavithra Barithaya51efaf82020-04-02 02:42:27 -0500183 Handler handler("./pdr_jsons/state_effecter/good", inPDRRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600184 Repo inRepo(inPDRRepo);
185 getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
George Liue53193f2020-02-24 09:23:26 +0800186 pdr_utils::PdrEntry e;
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600187 auto record1 = pdr::getRecordByHandle(outRepo, 1, e);
George Liue53193f2020-02-24 09:23:26 +0800188 ASSERT_NE(record1, nullptr);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500189 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +0800190 reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500191 EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
192
193 std::vector<set_effecter_state_field> stateField;
194 stateField.push_back({PLDM_REQUEST_SET, 1});
195 stateField.push_back({PLDM_REQUEST_SET, 1});
George Liu1ec85d42020-02-12 16:05:32 +0800196 std::string value = "xyz.openbmc_project.Foo.Bar.V1";
George Liu1e44c732020-02-28 20:20:06 +0800197 PropertyValue propertyValue = value;
Sampa Misraa2fa0702019-05-31 01:28:55 -0500198
199 MockdBusHandler handlerObj;
George Liu1ec85d42020-02-12 16:05:32 +0800200 DBusMapping dbusMapping{"/foo/bar", "xyz.openbmc_project.Foo.Bar",
201 "propertyName", "string"};
George Liu1e44c732020-02-28 20:20:06 +0800202
203 EXPECT_CALL(handlerObj, setDbusProperty(dbusMapping, propertyValue))
Sampa Misraa2fa0702019-05-31 01:28:55 -0500204 .Times(2);
George Liu0d7aca82020-03-30 15:01:36 +0800205 auto rc = platform_state_effecter::setStateEffecterStatesHandler<
206 MockdBusHandler, Handler>(handlerObj, handler, 0x1, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500207 ASSERT_EQ(rc, 0);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600208
209 pldm_pdr_destroy(inPDRRepo);
210 pldm_pdr_destroy(outPDRRepo);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500211}
212
213TEST(setStateEffecterStatesHandler, testBadRequest)
214{
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600215 auto inPDRRepo = pldm_pdr_init();
216 auto outPDRRepo = pldm_pdr_init();
217 Repo outRepo(outPDRRepo);
Pavithra Barithaya51efaf82020-04-02 02:42:27 -0500218 Handler handler("./pdr_jsons/state_effecter/good", inPDRRepo, nullptr);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600219 Repo inRepo(inPDRRepo);
220 getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
George Liue53193f2020-02-24 09:23:26 +0800221 pdr_utils::PdrEntry e;
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600222 auto record1 = pdr::getRecordByHandle(outRepo, 1, e);
George Liue53193f2020-02-24 09:23:26 +0800223 ASSERT_NE(record1, nullptr);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500224 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +0800225 reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500226 EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
227
228 std::vector<set_effecter_state_field> stateField;
229 stateField.push_back({PLDM_REQUEST_SET, 3});
230 stateField.push_back({PLDM_REQUEST_SET, 4});
231
232 MockdBusHandler handlerObj;
George Liu0d7aca82020-03-30 15:01:36 +0800233 auto rc = platform_state_effecter::setStateEffecterStatesHandler<
234 MockdBusHandler, Handler>(handlerObj, handler, 0x1, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500235 ASSERT_EQ(rc, PLDM_PLATFORM_SET_EFFECTER_UNSUPPORTED_SENSORSTATE);
236
George Liu0d7aca82020-03-30 15:01:36 +0800237 rc = platform_state_effecter::setStateEffecterStatesHandler<MockdBusHandler,
238 Handler>(
239 handlerObj, handler, 0x9, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500240 ASSERT_EQ(rc, PLDM_PLATFORM_INVALID_EFFECTER_ID);
241
242 stateField.push_back({PLDM_REQUEST_SET, 4});
George Liu0d7aca82020-03-30 15:01:36 +0800243 rc = platform_state_effecter::setStateEffecterStatesHandler<MockdBusHandler,
244 Handler>(
245 handlerObj, handler, 0x1, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500246 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
247
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600248 pldm_pdr_destroy(inPDRRepo);
249 pldm_pdr_destroy(outPDRRepo);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500250}