blob: d1241c2354bc9ebf3c1b29021dfa41eb5813ef5d [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"
4
5#include <iostream>
6
Sampa Misraa2fa0702019-05-31 01:28:55 -05007#include <gmock/gmock-matchers.h>
8#include <gmock/gmock.h>
Deepak Kodihalli557dfb02019-05-12 13:11:17 +05309#include <gtest/gtest.h>
10
11using 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();
28 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo);
29 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();
59 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo);
60 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();
84 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo);
85 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();
107 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo);
108 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();
132 Handler handler("./pdr_jsons/state_effecter/good", pdrRepo);
133 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
178namespace pldm
179{
180
181namespace responder
182{
183
184class MockdBusHandler
185{
186 public:
187 MOCK_CONST_METHOD4(setDbusProperty,
188 int(const std::string&, const std::string&,
189 const std::string&,
190 const std::variant<std::string>&));
191};
192} // namespace responder
193} // namespace pldm
194
195using ::testing::_;
196using ::testing::Return;
197
198TEST(setStateEffecterStatesHandler, testGoodRequest)
199{
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600200 auto inPDRRepo = pldm_pdr_init();
201 auto outPDRRepo = pldm_pdr_init();
202 Repo outRepo(outPDRRepo);
203 Handler handler("./pdr_jsons/state_effecter/good", inPDRRepo);
204 Repo inRepo(inPDRRepo);
205 getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
George Liue53193f2020-02-24 09:23:26 +0800206 pdr_utils::PdrEntry e;
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600207 auto record1 = pdr::getRecordByHandle(outRepo, 1, e);
George Liue53193f2020-02-24 09:23:26 +0800208 ASSERT_NE(record1, nullptr);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500209 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +0800210 reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500211 EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
212
213 std::vector<set_effecter_state_field> stateField;
214 stateField.push_back({PLDM_REQUEST_SET, 1});
215 stateField.push_back({PLDM_REQUEST_SET, 1});
216
217 auto bootProgressInf = "xyz.openbmc_project.State.OperatingSystem.Status";
218 auto bootProgressProp = "OperatingSystemState";
219 std::string objPath = "/foo/bar";
220 std::variant<std::string> value{"xyz.openbmc_project.State.OperatingSystem."
221 "Status.OSStatus.Standby"};
222
223 MockdBusHandler handlerObj;
224 EXPECT_CALL(handlerObj, setDbusProperty(objPath, bootProgressProp,
225 bootProgressInf, value))
226 .Times(2);
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600227 auto rc = handler.setStateEffecterStatesHandler<MockdBusHandler>(
228 handlerObj, 0x1, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500229 ASSERT_EQ(rc, 0);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600230
231 pldm_pdr_destroy(inPDRRepo);
232 pldm_pdr_destroy(outPDRRepo);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500233}
234
235TEST(setStateEffecterStatesHandler, testBadRequest)
236{
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600237 auto inPDRRepo = pldm_pdr_init();
238 auto outPDRRepo = pldm_pdr_init();
239 Repo outRepo(outPDRRepo);
240 Handler handler("./pdr_jsons/state_effecter/good", inPDRRepo);
241 Repo inRepo(inPDRRepo);
242 getRepoByType(inRepo, outRepo, PLDM_STATE_EFFECTER_PDR);
George Liue53193f2020-02-24 09:23:26 +0800243 pdr_utils::PdrEntry e;
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600244 auto record1 = pdr::getRecordByHandle(outRepo, 1, e);
George Liue53193f2020-02-24 09:23:26 +0800245 ASSERT_NE(record1, nullptr);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500246 pldm_state_effecter_pdr* pdr =
George Liue53193f2020-02-24 09:23:26 +0800247 reinterpret_cast<pldm_state_effecter_pdr*>(e.data);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500248 EXPECT_EQ(pdr->hdr.type, PLDM_STATE_EFFECTER_PDR);
249
250 std::vector<set_effecter_state_field> stateField;
251 stateField.push_back({PLDM_REQUEST_SET, 3});
252 stateField.push_back({PLDM_REQUEST_SET, 4});
253
254 MockdBusHandler handlerObj;
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600255 auto rc = handler.setStateEffecterStatesHandler<MockdBusHandler>(
256 handlerObj, 0x1, stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500257 ASSERT_EQ(rc, PLDM_PLATFORM_SET_EFFECTER_UNSUPPORTED_SENSORSTATE);
258
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600259 rc = handler.setStateEffecterStatesHandler<MockdBusHandler>(handlerObj, 0x9,
260 stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500261 ASSERT_EQ(rc, PLDM_PLATFORM_INVALID_EFFECTER_ID);
262
263 stateField.push_back({PLDM_REQUEST_SET, 4});
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600264 rc = handler.setStateEffecterStatesHandler<MockdBusHandler>(handlerObj, 0x1,
265 stateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500266 ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
267
268 std::vector<set_effecter_state_field> newStateField;
269 newStateField.push_back({PLDM_REQUEST_SET, 1});
270
Deepak Kodihallibc669f12019-11-28 08:52:07 -0600271 rc = handler.setStateEffecterStatesHandler<MockdBusHandler>(handlerObj, 0x2,
272 newStateField);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500273 ASSERT_EQ(rc, PLDM_PLATFORM_INVALID_STATE_VALUE);
Deepak Kodihallic682fe22020-03-04 00:42:54 -0600274
275 pldm_pdr_destroy(inPDRRepo);
276 pldm_pdr_destroy(outPDRRepo);
Sampa Misraa2fa0702019-05-31 01:28:55 -0500277}