blob: 0586c2ecf38ad0fd736a411ddc3aaaabea4bd81a [file] [log] [blame]
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05301#include <endian.h>
Andrew Jefferyb0c1d202023-11-07 22:08:44 +10302#include <libpldm/base.h>
3#include <libpldm/entity.h>
4#include <libpldm/platform.h>
5#include <libpldm/pldm_types.h>
Andrew Jeffery9c766792022-08-10 23:12:49 +09306
7#include <array>
Tal Yacobif490a382024-05-31 09:57:36 +03008#include <cerrno>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05309#include <cstdint>
Andrew Jeffery5a706072023-04-05 19:45:31 +093010#include <cstring>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +053011#include <vector>
Andrew Jeffery9c766792022-08-10 23:12:49 +093012
Thu Nguyen159a98b2022-11-02 10:00:10 +070013#include "msgbuf.h"
Andrew Jeffery9c766792022-08-10 23:12:49 +093014
15#include <gtest/gtest.h>
16
17constexpr auto hdrSize = sizeof(pldm_msg_hdr);
18
Andrew Jeffery1be1d5e2024-11-07 10:43:44 +103019TEST(StateEffecterPdr, testIncorrectInvocations)
20{
Patrick Williamsf37edd72024-12-18 11:22:58 -050021 struct state_effecter_possible_states possible_states{};
22 struct pldm_state_effecter_pdr effecter{};
Andrew Jeffery1be1d5e2024-11-07 10:43:44 +103023 size_t actual_size;
24 int rc;
25
26 /* effecter can't be NULL */
27 rc = encode_state_effecter_pdr(NULL, 0, &possible_states, 1, &actual_size);
28 EXPECT_EQ(rc, PLDM_ERROR);
29
30 /* possible states size can't be NULL */
31 rc = encode_state_effecter_pdr(&effecter, sizeof(effecter), NULL, 0,
32 &actual_size);
33 EXPECT_EQ(rc, PLDM_ERROR);
34
35 /* possible states size can't be too large */
36 rc = encode_state_effecter_pdr(&effecter, sizeof(effecter),
37 &possible_states, SIZE_MAX, &actual_size);
38 EXPECT_EQ(rc, PLDM_ERROR);
39
40 /* actual size can't be NULL */
41 rc = encode_state_effecter_pdr(&effecter, sizeof(effecter),
42 &possible_states, 0, NULL);
43 EXPECT_EQ(rc, PLDM_ERROR);
44
45 /* allocation size can't be less than effecter size with possible states */
46 rc = encode_state_effecter_pdr(&effecter, 0, &possible_states, 1,
47 &actual_size);
48 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
49
50 /* disallow mismatches between recorded possible state size and provided
51 * possible state size */
52 effecter.composite_effecter_count = 1;
53 rc = encode_state_effecter_pdr(&effecter, sizeof(effecter),
54 &possible_states, 1, &actual_size);
55 EXPECT_EQ(rc, PLDM_ERROR);
56 EXPECT_EQ(actual_size, 0);
57}
58
59TEST(StateEffecterPdr, testReasonableInvocations)
60{
Patrick Williamsf37edd72024-12-18 11:22:58 -050061 struct state_effecter_possible_states possible_states{};
62 struct pldm_state_effecter_pdr effecter{};
Andrew Jeffery1be1d5e2024-11-07 10:43:44 +103063 size_t actual_size;
64 int rc;
65
66 /* Accept 0 possible states */
67 rc = encode_state_effecter_pdr(&effecter, sizeof(effecter),
68 &possible_states, 0, &actual_size);
69 EXPECT_EQ(rc, PLDM_SUCCESS);
70 EXPECT_EQ(actual_size, sizeof(effecter) - sizeof(effecter.possible_states));
71}
72
Andrew Jeffery9c766792022-08-10 23:12:49 +093073TEST(SetStateEffecterStates, testEncodeResponse)
74{
75 std::array<uint8_t,
76 sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
77 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +093078 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +093079 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
80 uint8_t completionCode = 0;
81
82 auto rc = encode_set_state_effecter_states_resp(0, PLDM_SUCCESS, response);
83
84 EXPECT_EQ(rc, PLDM_SUCCESS);
85 EXPECT_EQ(completionCode, response->payload[0]);
86}
87
88TEST(SetStateEffecterStates, testEncodeRequest)
89{
90 std::array<uint8_t,
91 sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES>
92 requestMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +093093 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +093094 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
95
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -060096 uint16_t effecterId = 0x0a;
Andrew Jeffery9c766792022-08-10 23:12:49 +093097 uint8_t compEffecterCnt = 0x2;
98 std::array<set_effecter_state_field, 8> stateField{};
99 stateField[0] = {PLDM_REQUEST_SET, 2};
100 stateField[1] = {PLDM_REQUEST_SET, 3};
101
102 auto rc = encode_set_state_effecter_states_req(
103 0, effecterId, compEffecterCnt, stateField.data(), request);
104
105 EXPECT_EQ(rc, PLDM_SUCCESS);
106 EXPECT_EQ(effecterId, request->payload[0]);
107 EXPECT_EQ(compEffecterCnt, request->payload[sizeof(effecterId)]);
108 EXPECT_EQ(stateField[0].set_request,
109 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt)]);
110 EXPECT_EQ(stateField[0].effecter_state,
111 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
112 sizeof(stateField[0].set_request)]);
113 EXPECT_EQ(stateField[1].set_request,
114 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
115 sizeof(stateField[0])]);
116 EXPECT_EQ(stateField[1].effecter_state,
117 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
118 sizeof(stateField[0]) +
119 sizeof(stateField[1].set_request)]);
120}
121
122TEST(SetStateEffecterStates, testGoodDecodeResponse)
123{
124 std::array<uint8_t, hdrSize + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
125 responseMsg{};
126
127 uint8_t retcompletion_code = 0;
128
129 responseMsg[hdrSize] = PLDM_SUCCESS;
130
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930131 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930132 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
133
134 auto rc = decode_set_state_effecter_states_resp(
135 response, responseMsg.size() - hdrSize, &retcompletion_code);
136
137 EXPECT_EQ(rc, PLDM_SUCCESS);
138 EXPECT_EQ(PLDM_SUCCESS, retcompletion_code);
139}
140
141TEST(SetStateEffecterStates, testGoodDecodeRequest)
142{
143 std::array<uint8_t, hdrSize + PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES>
144 requestMsg{};
145
146 uint16_t effecterId = 0x32;
147 uint16_t effecterIdLE = htole16(effecterId);
148 uint8_t compEffecterCnt = 0x2;
149
150 std::array<set_effecter_state_field, 8> stateField{};
151 stateField[0] = {PLDM_REQUEST_SET, 3};
152 stateField[1] = {PLDM_REQUEST_SET, 4};
153
154 uint16_t retEffecterId = 0;
155 uint8_t retCompEffecterCnt = 0;
156
157 std::array<set_effecter_state_field, 8> retStateField{};
158
159 memcpy(requestMsg.data() + hdrSize, &effecterIdLE, sizeof(effecterIdLE));
160 memcpy(requestMsg.data() + sizeof(effecterIdLE) + hdrSize, &compEffecterCnt,
161 sizeof(compEffecterCnt));
162 memcpy(requestMsg.data() + sizeof(effecterIdLE) + sizeof(compEffecterCnt) +
163 hdrSize,
164 &stateField, sizeof(stateField));
165
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930166 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930167 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
168
169 auto rc = decode_set_state_effecter_states_req(
170 request, requestMsg.size() - hdrSize, &retEffecterId,
171 &retCompEffecterCnt, retStateField.data());
172
173 EXPECT_EQ(rc, PLDM_SUCCESS);
174 EXPECT_EQ(effecterId, retEffecterId);
175 EXPECT_EQ(retCompEffecterCnt, compEffecterCnt);
176 EXPECT_EQ(retStateField[0].set_request, stateField[0].set_request);
177 EXPECT_EQ(retStateField[0].effecter_state, stateField[0].effecter_state);
178 EXPECT_EQ(retStateField[1].set_request, stateField[1].set_request);
179 EXPECT_EQ(retStateField[1].effecter_state, stateField[1].effecter_state);
180}
181
182TEST(SetStateEffecterStates, testBadDecodeRequest)
183{
184 const struct pldm_msg* msg = NULL;
185
186 auto rc = decode_set_state_effecter_states_req(msg, sizeof(*msg), NULL,
187 NULL, NULL);
188
189 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
190}
191
192TEST(SetStateEffecterStates, testBadDecodeResponse)
193{
194 std::array<uint8_t, PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
195 responseMsg{};
196
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930197 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930198 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
199
200 auto rc = decode_set_state_effecter_states_resp(response,
201 responseMsg.size(), NULL);
202
203 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
204}
205
206TEST(GetPDR, testGoodEncodeResponse)
207{
208 uint8_t completionCode = 0;
209 uint32_t nextRecordHndl = 0x12;
210 uint32_t nextDataTransferHndl = 0x13;
211 uint8_t transferFlag = PLDM_END;
212 uint16_t respCnt = 0x5;
213 std::vector<uint8_t> recordData{1, 2, 3, 4, 5};
214 uint8_t transferCRC = 6;
215
216 // + size of record data and transfer CRC
217 std::vector<uint8_t> responseMsg(hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES +
218 recordData.size() + 1);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930219 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930220 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
221
222 auto rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
223 nextDataTransferHndl, transferFlag, respCnt,
224 recordData.data(), transferCRC, response);
225
226 EXPECT_EQ(rc, PLDM_SUCCESS);
227 struct pldm_get_pdr_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930228 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930229 reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
230
231 EXPECT_EQ(completionCode, resp->completion_code);
232 EXPECT_EQ(nextRecordHndl, le32toh(resp->next_record_handle));
233 EXPECT_EQ(nextDataTransferHndl, le32toh(resp->next_data_transfer_handle));
234 EXPECT_EQ(transferFlag, resp->transfer_flag);
235 EXPECT_EQ(respCnt, le16toh(resp->response_count));
236 EXPECT_EQ(0,
237 memcmp(recordData.data(), resp->record_data, recordData.size()));
238 EXPECT_EQ(*(response->payload + sizeof(pldm_get_pdr_resp) - 1 +
239 recordData.size()),
240 transferCRC);
241
242 transferFlag = PLDM_START_AND_END; // No CRC in this case
243 responseMsg.resize(responseMsg.size() - sizeof(transferCRC));
244 rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
245 nextDataTransferHndl, transferFlag, respCnt,
246 recordData.data(), transferCRC, response);
247 EXPECT_EQ(rc, PLDM_SUCCESS);
248}
249
250TEST(GetPDR, testBadEncodeResponse)
251{
252 uint32_t nextRecordHndl = 0x12;
253 uint32_t nextDataTransferHndl = 0x13;
254 uint8_t transferFlag = PLDM_START_AND_END;
255 uint16_t respCnt = 0x5;
256 std::vector<uint8_t> recordData{1, 2, 3, 4, 5};
257 uint8_t transferCRC = 0;
258
259 auto rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
260 nextDataTransferHndl, transferFlag, respCnt,
261 recordData.data(), transferCRC, nullptr);
262
263 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
264}
265
266TEST(GetPDR, testGoodDecodeRequest)
267{
268 std::array<uint8_t, hdrSize + PLDM_GET_PDR_REQ_BYTES> requestMsg{};
269
270 uint32_t recordHndl = 0x32;
271 uint32_t dataTransferHndl = 0x11;
272 uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
273 uint16_t requestCnt = 0x5;
274 uint16_t recordChangeNum = 0x01;
275
276 uint32_t retRecordHndl = 0;
277 uint32_t retDataTransferHndl = 0;
278 uint8_t retTransferOpFlag = 0;
279 uint16_t retRequestCnt = 0;
280 uint16_t retRecordChangeNum = 0;
281
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930282 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930283 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
284 struct pldm_get_pdr_req* request =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930285 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930286 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
287
288 request->record_handle = htole32(recordHndl);
289 request->data_transfer_handle = htole32(dataTransferHndl);
290 request->transfer_op_flag = transferOpFlag;
291 request->request_count = htole16(requestCnt);
292 request->record_change_number = htole16(recordChangeNum);
293
294 auto rc = decode_get_pdr_req(
295 req, requestMsg.size() - hdrSize, &retRecordHndl, &retDataTransferHndl,
296 &retTransferOpFlag, &retRequestCnt, &retRecordChangeNum);
297
298 EXPECT_EQ(rc, PLDM_SUCCESS);
299 EXPECT_EQ(retRecordHndl, recordHndl);
300 EXPECT_EQ(retDataTransferHndl, dataTransferHndl);
301 EXPECT_EQ(retTransferOpFlag, transferOpFlag);
302 EXPECT_EQ(retRequestCnt, requestCnt);
303 EXPECT_EQ(retRecordChangeNum, recordChangeNum);
304}
305
306TEST(GetPDR, testBadDecodeRequest)
307{
308 std::array<uint8_t, PLDM_GET_PDR_REQ_BYTES> requestMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930309 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930310 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
311
312 auto rc = decode_get_pdr_req(req, requestMsg.size(), NULL, NULL, NULL, NULL,
313 NULL);
314
315 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
316}
317
318TEST(GetPDR, testGoodEncodeRequest)
319{
320 uint32_t record_hndl = 0;
321 uint32_t data_transfer_hndl = 0;
322 uint8_t transfer_op_flag = PLDM_GET_FIRSTPART;
323 uint16_t request_cnt = 20;
324 uint16_t record_chg_num = 0;
325
326 std::vector<uint8_t> requestMsg(hdrSize + PLDM_GET_PDR_REQ_BYTES);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930327 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930328 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
329
330 auto rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
331 transfer_op_flag, request_cnt, record_chg_num,
332 request, PLDM_GET_PDR_REQ_BYTES);
333 EXPECT_EQ(rc, PLDM_SUCCESS);
334 struct pldm_get_pdr_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930335 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930336 reinterpret_cast<struct pldm_get_pdr_req*>(request->payload);
337 EXPECT_EQ(record_hndl, le32toh(req->record_handle));
338 EXPECT_EQ(data_transfer_hndl, le32toh(req->data_transfer_handle));
339 EXPECT_EQ(transfer_op_flag, req->transfer_op_flag);
340 EXPECT_EQ(request_cnt, le16toh(req->request_count));
341 EXPECT_EQ(record_chg_num, le16toh(req->record_change_number));
342}
343
344TEST(GetPDR, testBadEncodeRequest)
345{
346 uint32_t record_hndl = 0;
347 uint32_t data_transfer_hndl = 0;
348 uint8_t transfer_op_flag = PLDM_GET_FIRSTPART;
349 uint16_t request_cnt = 32;
350 uint16_t record_chg_num = 0;
351
352 std::vector<uint8_t> requestMsg(hdrSize + PLDM_GET_PDR_REQ_BYTES);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930353 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930354 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
355
356 auto rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
357 transfer_op_flag, request_cnt, record_chg_num,
358 nullptr, PLDM_GET_PDR_REQ_BYTES);
359 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
360
361 rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
362 transfer_op_flag, request_cnt, record_chg_num,
363 request, PLDM_GET_PDR_REQ_BYTES + 1);
364 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
365}
366
367TEST(GetPDR, testGoodDecodeResponse)
368{
369 const char* recordData = "123456789";
370 uint8_t completionCode = PLDM_SUCCESS;
371 uint32_t nextRecordHndl = 0;
372 uint32_t nextDataTransferHndl = 0;
373 uint8_t transferFlag = PLDM_END;
374 constexpr uint16_t respCnt = 9;
375 uint8_t transferCRC = 96;
376 size_t recordDataLength = 32;
377 std::array<uint8_t, hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES + respCnt +
378 sizeof(transferCRC)>
379 responseMsg{};
380
381 uint8_t retCompletionCode = 0;
382 uint8_t retRecordData[32] = {0};
383 uint32_t retNextRecordHndl = 0;
384 uint32_t retNextDataTransferHndl = 0;
385 uint8_t retTransferFlag = 0;
386 uint16_t retRespCnt = 0;
387 uint8_t retTransferCRC = 0;
388
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930389 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930390 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
391 struct pldm_get_pdr_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930392 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930393 reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
394 resp->completion_code = completionCode;
395 resp->next_record_handle = htole32(nextRecordHndl);
396 resp->next_data_transfer_handle = htole32(nextDataTransferHndl);
397 resp->transfer_flag = transferFlag;
398 resp->response_count = htole16(respCnt);
399 memcpy(resp->record_data, recordData, respCnt);
400 response->payload[PLDM_GET_PDR_MIN_RESP_BYTES + respCnt] = transferCRC;
401
402 auto rc = decode_get_pdr_resp(
403 response, responseMsg.size() - hdrSize, &retCompletionCode,
404 &retNextRecordHndl, &retNextDataTransferHndl, &retTransferFlag,
405 &retRespCnt, retRecordData, recordDataLength, &retTransferCRC);
406 EXPECT_EQ(rc, PLDM_SUCCESS);
407 EXPECT_EQ(retCompletionCode, completionCode);
408 EXPECT_EQ(retNextRecordHndl, nextRecordHndl);
409 EXPECT_EQ(retNextDataTransferHndl, nextDataTransferHndl);
410 EXPECT_EQ(retTransferFlag, transferFlag);
411 EXPECT_EQ(retRespCnt, respCnt);
412 EXPECT_EQ(retTransferCRC, transferCRC);
413 EXPECT_EQ(0, memcmp(recordData, resp->record_data, respCnt));
414}
415
416TEST(GetPDR, testBadDecodeResponse)
417{
418 const char* recordData = "123456789";
419 uint8_t completionCode = PLDM_SUCCESS;
420 uint32_t nextRecordHndl = 0;
421 uint32_t nextDataTransferHndl = 0;
422 uint8_t transferFlag = PLDM_END;
423 constexpr uint16_t respCnt = 9;
424 uint8_t transferCRC = 96;
Andrew Jeffery4e5e8a22023-04-04 11:58:45 +0930425 size_t recordDataLength = respCnt - 1;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930426 std::array<uint8_t, hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES + respCnt +
427 sizeof(transferCRC)>
428 responseMsg{};
429
430 uint8_t retCompletionCode = 0;
431 uint8_t retRecordData[32] = {0};
432 uint32_t retNextRecordHndl = 0;
433 uint32_t retNextDataTransferHndl = 0;
434 uint8_t retTransferFlag = 0;
435 uint16_t retRespCnt = 0;
436 uint8_t retTransferCRC = 0;
437
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930438 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930439 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
440 struct pldm_get_pdr_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930441 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930442 reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
443 resp->completion_code = completionCode;
444 resp->next_record_handle = htole32(nextRecordHndl);
445 resp->next_data_transfer_handle = htole32(nextDataTransferHndl);
446 resp->transfer_flag = transferFlag;
447 resp->response_count = htole16(respCnt);
448 memcpy(resp->record_data, recordData, respCnt);
449 response->payload[PLDM_GET_PDR_MIN_RESP_BYTES + respCnt] = transferCRC;
450
451 auto rc = decode_get_pdr_resp(response, responseMsg.size() - hdrSize, NULL,
452 NULL, NULL, NULL, NULL, NULL, 0, NULL);
453 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
454
455 rc = decode_get_pdr_resp(
456 response, responseMsg.size() - hdrSize - 1, &retCompletionCode,
457 &retNextRecordHndl, &retNextDataTransferHndl, &retTransferFlag,
458 &retRespCnt, retRecordData, recordDataLength, &retTransferCRC);
459 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
460}
461
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000462#ifdef LIBPLDM_API_TESTING
463TEST(GetPDR, testGoodDecodeResponseSafe)
464{
465 static const char recordData[] = "123456789";
466
467 alignas(pldm_msg) unsigned char data[sizeof(pldm_msg_hdr) +
468 PLDM_GET_PDR_MIN_RESP_BYTES +
469 sizeof(recordData) - 1 + 1];
Andrew Jefferya1896962025-03-03 21:41:25 +1030470 PLDM_MSGBUF_DEFINE_P(buf);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000471 int rc;
472
473 pldm_msg* msg = new (data) pldm_msg;
474
475 rc = pldm_msgbuf_init_errno(buf, PLDM_GET_PDR_MIN_RESP_BYTES, msg->payload,
476 sizeof(data) - sizeof(msg->hdr));
477 ASSERT_EQ(rc, 0);
478
479 pldm_msgbuf_insert_uint8(buf, PLDM_SUCCESS);
480 pldm_msgbuf_insert_uint32(buf, 0);
481 pldm_msgbuf_insert_uint32(buf, 0);
482 pldm_msgbuf_insert_uint8(buf, PLDM_END);
483 pldm_msgbuf_insert_uint16(buf, sizeof(recordData) - 1);
484 rc = pldm_msgbuf_insert_array_char(buf, sizeof(recordData) - 1, recordData,
485 sizeof(recordData) - 1);
486 ASSERT_EQ(rc, 0);
487 pldm_msgbuf_insert_uint8(buf, 96);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030488 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000489
490 alignas(pldm_get_pdr_resp) unsigned char
491 resp_data[sizeof(pldm_get_pdr_resp) + sizeof(recordData) - 1];
492 pldm_get_pdr_resp* resp = new (resp_data) pldm_get_pdr_resp;
493 uint8_t crc;
494 rc = decode_get_pdr_resp_safe(msg, sizeof(data) - sizeof(msg->hdr), resp,
495 sizeof(resp_data) - sizeof(*resp), &crc);
496 ASSERT_EQ(rc, 0);
497 EXPECT_EQ(resp->completion_code, PLDM_SUCCESS);
498 EXPECT_EQ(resp->next_record_handle, 0);
499 EXPECT_EQ(resp->next_data_transfer_handle, 0);
500 EXPECT_EQ(resp->transfer_flag, PLDM_END);
501 ASSERT_EQ(resp->response_count, sizeof(recordData) - 1);
502 EXPECT_EQ(crc, 96);
503 EXPECT_EQ(0, memcmp(recordData, resp->record_data, resp->response_count));
504}
505#endif
506
507#ifdef LIBPLDM_API_TESTING
508TEST(GetPDR, testBadDecodeResponseSafeTrivial)
509{
510 pldm_get_pdr_resp resp;
511 uint8_t crc;
512 int rc;
513
514 rc = decode_get_pdr_resp_safe(nullptr, PLDM_GET_PDR_MIN_RESP_BYTES, &resp,
515 sizeof(resp), &crc);
516 EXPECT_EQ(rc, -EINVAL);
517
518 alignas(pldm_msg) unsigned char
519 msg_data[sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES];
520 pldm_msg* msg = new (msg_data) pldm_msg;
521 rc = decode_get_pdr_resp_safe(msg, PLDM_GET_PDR_MIN_RESP_BYTES, nullptr,
522 sizeof(resp), &crc);
523 EXPECT_EQ(rc, -EINVAL);
524
525 rc = decode_get_pdr_resp_safe(msg, PLDM_GET_PDR_MIN_RESP_BYTES, &resp,
526 sizeof(resp), nullptr);
527 EXPECT_EQ(rc, -EINVAL);
528
529 msg->payload[0] = PLDM_ERROR_INVALID_DATA;
530 rc = decode_get_pdr_resp_safe(msg, 1, &resp, sizeof(resp), &crc);
531 EXPECT_EQ(rc, 0);
532 EXPECT_EQ(resp.completion_code, PLDM_ERROR_INVALID_DATA);
533}
534#endif
535
Vishnu Santhosh48b0f802025-05-19 20:30:15 +0530536#ifdef LIBPLDM_API_TESTING
537TEST(GetPDRRepositoryInfo, testGoodEncodeRequest)
538{
539 pldm_msg request{};
540
541 auto rc = encode_get_pdr_repository_info_req(0, &request,
542 sizeof(struct pldm_msg));
543 ASSERT_EQ(rc, PLDM_SUCCESS);
544}
545#endif
546
547#ifdef LIBPLDM_API_TESTING
548TEST(GetPDRRepositoryInfo, testBadEncodeRequest)
549{
550 auto rc =
551 encode_get_pdr_repository_info_req(0, nullptr, sizeof(struct pldm_msg));
552 EXPECT_EQ(rc, -EINVAL);
553}
554#endif
555
Andrew Jeffery9c766792022-08-10 23:12:49 +0930556TEST(GetPDRRepositoryInfo, testGoodEncodeResponse)
557{
558 uint8_t completionCode = 0;
559 uint8_t repositoryState = PLDM_AVAILABLE;
560 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
561 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
562 uint32_t recordCount = 100;
563 uint32_t repositorySize = 100;
564 uint32_t largestRecordSize = UINT32_MAX;
565 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
566
567 std::vector<uint8_t> responseMsg(hdrSize +
568 PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930569 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930570 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
571
572 auto rc = encode_get_pdr_repository_info_resp(
573 0, PLDM_SUCCESS, repositoryState, updateTime, oemUpdateTime,
574 recordCount, repositorySize, largestRecordSize,
575 dataTransferHandleTimeout, response);
576
577 EXPECT_EQ(rc, PLDM_SUCCESS);
578 struct pldm_pdr_repository_info_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930579 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930580 reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
581 response->payload);
582
583 EXPECT_EQ(completionCode, resp->completion_code);
584 EXPECT_EQ(repositoryState, resp->repository_state);
585 EXPECT_EQ(0, memcmp(updateTime, resp->update_time, PLDM_TIMESTAMP104_SIZE));
586 EXPECT_EQ(0, memcmp(oemUpdateTime, resp->oem_update_time,
587 PLDM_TIMESTAMP104_SIZE));
588 EXPECT_EQ(recordCount, le32toh(resp->record_count));
589 EXPECT_EQ(repositorySize, le32toh(resp->repository_size));
590 EXPECT_EQ(largestRecordSize, le32toh(resp->largest_record_size));
591 EXPECT_EQ(dataTransferHandleTimeout, resp->data_transfer_handle_timeout);
592}
593
594TEST(GetPDRRepositoryInfo, testBadEncodeResponse)
595{
596 uint8_t repositoryState = PLDM_AVAILABLE;
597 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
598 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
599 uint32_t recordCount = 100;
600 uint32_t repositorySize = 100;
601 uint32_t largestRecordSize = UINT32_MAX;
602 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
603
604 auto rc = encode_get_pdr_repository_info_resp(
605 0, PLDM_SUCCESS, repositoryState, updateTime, oemUpdateTime,
606 recordCount, repositorySize, largestRecordSize,
607 dataTransferHandleTimeout, nullptr);
608 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
609}
610
Gilbert Chenb7c73e52022-11-10 11:29:52 +0800611TEST(GetPDRRepositoryInfo, testGoodDecodeResponse)
612{
613 uint8_t completionCode = PLDM_SUCCESS;
614 uint8_t repositoryState = PLDM_AVAILABLE;
615 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
616 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
617 uint32_t recordCount = 100;
618 uint32_t repositorySize = 100;
619 uint32_t largestRecordSize = UINT32_MAX;
620 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
621
622 std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
623 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930624 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Gilbert Chenb7c73e52022-11-10 11:29:52 +0800625 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
626 struct pldm_pdr_repository_info_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930627 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Gilbert Chenb7c73e52022-11-10 11:29:52 +0800628 reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
629 response->payload);
630 resp->completion_code = completionCode;
631 resp->repository_state = repositoryState;
632 memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
633 memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
634 resp->record_count = htole32(recordCount);
635 resp->repository_size = htole32(repositorySize);
636 resp->largest_record_size = htole32(largestRecordSize);
637 resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
638
639 uint8_t retCompletionCode = 0;
640 uint8_t retRepositoryState = 0;
641 uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
642 uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
643 uint32_t retRecordCount = 0;
644 uint32_t retRepositorySize = 0;
645 uint32_t retLargestRecordSize = 0;
646 uint8_t retDataTransferHandleTimeout = 0;
647
648 auto rc = decode_get_pdr_repository_info_resp(
649 response, responseMsg.size() - hdrSize, &retCompletionCode,
650 &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
651 &retRepositorySize, &retLargestRecordSize,
652 &retDataTransferHandleTimeout);
653
654 EXPECT_EQ(rc, PLDM_SUCCESS);
655 EXPECT_EQ(completionCode, retCompletionCode);
656 EXPECT_EQ(repositoryState, retRepositoryState);
657 EXPECT_EQ(0, memcmp(updateTime, retUpdateTime, PLDM_TIMESTAMP104_SIZE));
658 EXPECT_EQ(0,
659 memcmp(oemUpdateTime, retOemUpdateTime, PLDM_TIMESTAMP104_SIZE));
660 EXPECT_EQ(recordCount, recordCount);
661 EXPECT_EQ(repositorySize, repositorySize);
662 EXPECT_EQ(largestRecordSize, largestRecordSize);
663 EXPECT_EQ(dataTransferHandleTimeout, dataTransferHandleTimeout);
664}
665
666TEST(GetPDRRepositoryInfo, testBadDecodeResponse)
667{
668 uint8_t completionCode = PLDM_SUCCESS;
669 uint8_t repositoryState = PLDM_AVAILABLE;
670 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
671 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
672 uint32_t recordCount = htole32(100);
673 uint32_t repositorySize = htole32(100);
674 uint32_t largestRecordSize = htole32(UINT32_MAX);
675 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
676
677 std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
678 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930679 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Gilbert Chenb7c73e52022-11-10 11:29:52 +0800680 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
681 struct pldm_pdr_repository_info_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930682 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Gilbert Chenb7c73e52022-11-10 11:29:52 +0800683 reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
684 response->payload);
685 resp->completion_code = completionCode;
686 resp->repository_state = repositoryState;
687 memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
688 memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
689 resp->record_count = recordCount;
690 resp->repository_size = repositorySize;
691 resp->largest_record_size = largestRecordSize;
692 resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
693
694 uint8_t retCompletionCode = 0;
695 uint8_t retRepositoryState = 0;
696 uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
697 uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
698 uint32_t retRecordCount = 0;
699 uint32_t retRepositorySize = 0;
700 uint32_t retLargestRecordSize = 0;
701 uint8_t retDataTransferHandleTimeout = 0;
702
703 auto rc = decode_get_pdr_repository_info_resp(
704 response, responseMsg.size() - hdrSize, NULL, NULL, NULL, NULL, NULL,
705 NULL, NULL, NULL);
706 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
707
708 rc = decode_get_pdr_repository_info_resp(
709 response, responseMsg.size() - hdrSize - 1, &retCompletionCode,
710 &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
711 &retRepositorySize, &retLargestRecordSize,
712 &retDataTransferHandleTimeout);
713 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
714
715 resp->repository_state = PLDM_FAILED + 1;
716 rc = decode_get_pdr_repository_info_resp(
717 response, responseMsg.size() - hdrSize, &retCompletionCode,
718 &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
719 &retRepositorySize, &retLargestRecordSize,
720 &retDataTransferHandleTimeout);
721 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
722}
723
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000724#ifdef LIBPLDM_API_TESTING
725TEST(GetPDRRepositoryInfo, testGoodDecodeResponseSafe)
726{
727 alignas(pldm_msg) unsigned char
728 data[sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES];
729 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
730 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
Andrew Jefferya1896962025-03-03 21:41:25 +1030731 PLDM_MSGBUF_DEFINE_P(buf);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000732 int rc;
733
734 pldm_msg* msg = new (data) pldm_msg;
735
736 rc = pldm_msgbuf_init_errno(buf, PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES,
737 msg->payload, sizeof(data) - sizeof(msg->hdr));
738 ASSERT_EQ(rc, 0);
739 pldm_msgbuf_insert_uint8(buf, PLDM_SUCCESS);
740 pldm_msgbuf_insert_uint8(buf, PLDM_AVAILABLE);
741 rc = pldm_msgbuf_insert_array_uint8(buf, PLDM_TIMESTAMP104_SIZE, updateTime,
742 sizeof(updateTime));
743 ASSERT_EQ(rc, 0);
744 rc = pldm_msgbuf_insert_array_uint8(buf, PLDM_TIMESTAMP104_SIZE,
745 oemUpdateTime, sizeof(oemUpdateTime));
746 ASSERT_EQ(rc, 0);
747 pldm_msgbuf_insert_uint32(buf, 100);
748 pldm_msgbuf_insert_uint32(buf, 100);
749 pldm_msgbuf_insert_uint32(buf, UINT32_MAX);
750 pldm_msgbuf_insert_uint8(buf, PLDM_NO_TIMEOUT);
Andrew Jeffery70d21c92025-03-05 12:59:42 +1030751 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +0000752
753 struct pldm_pdr_repository_info_resp resp;
754 rc = decode_get_pdr_repository_info_resp_safe(
755 msg, sizeof(data) - sizeof(msg->hdr), &resp);
756
757 EXPECT_EQ(rc, 0);
758 EXPECT_EQ(PLDM_SUCCESS, resp.completion_code);
759 EXPECT_EQ(PLDM_AVAILABLE, resp.repository_state);
760 EXPECT_EQ(0,
761 memcmp(updateTime, resp.update_time, sizeof(resp.update_time)));
762 EXPECT_EQ(0, memcmp(oemUpdateTime, resp.oem_update_time,
763 sizeof(resp.oem_update_time)));
764 EXPECT_EQ(100, resp.record_count);
765 EXPECT_EQ(100, resp.repository_size);
766 EXPECT_EQ(UINT32_MAX, resp.largest_record_size);
767 EXPECT_EQ(PLDM_NO_TIMEOUT, resp.data_transfer_handle_timeout);
768}
769#endif
770
771#ifdef LIBPLDM_API_TESTING
772TEST(GetPDRRepositoryInfo, testBadDecodeResponseSafeTrivial)
773{
774 struct pldm_pdr_repository_info_resp resp;
775 int rc;
776
777 rc = decode_get_pdr_repository_info_resp_safe(
778 nullptr, PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES, &resp);
779 EXPECT_EQ(rc, -EINVAL);
780
781 alignas(pldm_msg) unsigned char
782 msg_data[sizeof(pldm_msg) - 1 +
783 PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES];
784 pldm_msg* msg = new (msg_data) pldm_msg;
785 rc = decode_get_pdr_repository_info_resp_safe(msg, 0, &resp);
786 EXPECT_EQ(rc, -EOVERFLOW);
787
788 rc = decode_get_pdr_repository_info_resp_safe(
789 msg, PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES, nullptr);
790 EXPECT_EQ(rc, -EINVAL);
791
792 msg->payload[0] = PLDM_ERROR_INVALID_DATA;
793 rc = decode_get_pdr_repository_info_resp_safe(msg, 1, &resp);
794 EXPECT_EQ(rc, 0);
795 EXPECT_EQ(resp.completion_code, PLDM_ERROR_INVALID_DATA);
796}
797#endif
798
Andrew Jeffery9c766792022-08-10 23:12:49 +0930799TEST(SetNumericEffecterValue, testGoodDecodeRequest)
800{
801 std::array<uint8_t,
802 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 3>
803 requestMsg{};
804
805 uint16_t effecter_id = 32768;
806 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT32;
807 uint32_t effecter_value = 123456789;
808
809 uint16_t reteffecter_id;
810 uint8_t reteffecter_data_size;
811 uint8_t reteffecter_value[4];
812
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930813 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930814 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
815 struct pldm_set_numeric_effecter_value_req* request =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930816 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930817 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
818 req->payload);
819
820 request->effecter_id = htole16(effecter_id);
821 request->effecter_data_size = effecter_data_size;
822 uint32_t effecter_value_le = htole32(effecter_value);
823 memcpy(request->effecter_value, &effecter_value_le,
824 sizeof(effecter_value_le));
825
826 auto rc = decode_set_numeric_effecter_value_req(
827 req, requestMsg.size() - hdrSize, &reteffecter_id,
828 &reteffecter_data_size, reteffecter_value);
829
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930830 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930831 uint32_t value = *(reinterpret_cast<uint32_t*>(reteffecter_value));
832 EXPECT_EQ(rc, PLDM_SUCCESS);
833 EXPECT_EQ(reteffecter_id, effecter_id);
834 EXPECT_EQ(reteffecter_data_size, effecter_data_size);
835 EXPECT_EQ(value, effecter_value);
836}
837
838TEST(SetNumericEffecterValue, testBadDecodeRequest)
839{
840 std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES>
841 requestMsg{};
842
843 auto rc = decode_set_numeric_effecter_value_req(
844 NULL, requestMsg.size() - hdrSize, NULL, NULL, NULL);
845 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
846
847 uint16_t effecter_id = 0x10;
848 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT8;
849 uint8_t effecter_value = 1;
850
851 uint16_t reteffecter_id;
852 uint8_t reteffecter_data_size;
853 uint8_t reteffecter_value[4];
854
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930855 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930856 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
857 struct pldm_set_numeric_effecter_value_req* request =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930858 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930859 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
860 req->payload);
861
862 request->effecter_id = effecter_id;
863 request->effecter_data_size = effecter_data_size;
864 memcpy(request->effecter_value, &effecter_value, sizeof(effecter_value));
865
866 rc = decode_set_numeric_effecter_value_req(
867 req, requestMsg.size() - hdrSize - 1, &reteffecter_id,
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930868 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930869 &reteffecter_data_size, reinterpret_cast<uint8_t*>(&reteffecter_value));
870 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
871}
872
873TEST(SetNumericEffecterValue, testGoodEncodeRequest)
874{
875 uint16_t effecter_id = 0;
876 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT16;
877 uint16_t effecter_value = 65534;
878
879 std::vector<uint8_t> requestMsg(
880 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930881 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930882 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
883
884 auto rc = encode_set_numeric_effecter_value_req(
885 0, effecter_id, effecter_data_size,
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930886 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930887 reinterpret_cast<uint8_t*>(&effecter_value), request,
888 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
889 EXPECT_EQ(rc, PLDM_SUCCESS);
890
891 struct pldm_set_numeric_effecter_value_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930892 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930893 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
894 request->payload);
895 EXPECT_EQ(effecter_id, req->effecter_id);
896 EXPECT_EQ(effecter_data_size, req->effecter_data_size);
897 uint16_t* val = (uint16_t*)req->effecter_value;
898 *val = le16toh(*val);
899 EXPECT_EQ(effecter_value, *val);
900}
901
902TEST(SetNumericEffecterValue, testBadEncodeRequest)
903{
904 std::vector<uint8_t> requestMsg(
905 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930906 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930907 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
908
909 auto rc = encode_set_numeric_effecter_value_req(
910 0, 0, 0, NULL, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
911 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
912
913 uint16_t effecter_value;
914 rc = encode_set_numeric_effecter_value_req(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930915 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930916 0, 0, 6, reinterpret_cast<uint8_t*>(&effecter_value), request,
917 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
918 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
919}
920
921TEST(SetNumericEffecterValue, testGoodDecodeResponse)
922{
923 std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
924 responseMsg{};
925
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -0600926 uint8_t completion_code = 0xa0;
Andrew Jeffery9c766792022-08-10 23:12:49 +0930927
928 uint8_t retcompletion_code;
929
930 memcpy(responseMsg.data() + hdrSize, &completion_code,
931 sizeof(completion_code));
932
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930933 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930934 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
935
936 auto rc = decode_set_numeric_effecter_value_resp(
937 response, responseMsg.size() - hdrSize, &retcompletion_code);
938
939 EXPECT_EQ(rc, PLDM_SUCCESS);
940 EXPECT_EQ(completion_code, retcompletion_code);
941}
942
943TEST(SetNumericEffecterValue, testBadDecodeResponse)
944{
945 std::array<uint8_t, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
946 responseMsg{};
947
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930948 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930949 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
950
951 auto rc = decode_set_numeric_effecter_value_resp(response,
952 responseMsg.size(), NULL);
953
954 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
955}
956
957TEST(SetNumericEffecterValue, testGoodEncodeResponse)
958{
959 std::array<uint8_t, sizeof(pldm_msg_hdr) +
960 PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
961 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930962 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930963 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
964 uint8_t completionCode = 0;
965
966 auto rc = encode_set_numeric_effecter_value_resp(
967 0, PLDM_SUCCESS, response, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
968
969 EXPECT_EQ(rc, PLDM_SUCCESS);
970 EXPECT_EQ(completionCode, response->payload[0]);
971}
972
973TEST(SetNumericEffecterValue, testBadEncodeResponse)
974{
975 auto rc = encode_set_numeric_effecter_value_resp(
976 0, PLDM_SUCCESS, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
977 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
978}
979
980TEST(GetStateSensorReadings, testGoodEncodeResponse)
981{
982 std::array<uint8_t, hdrSize +
983 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
984 sizeof(get_sensor_state_field) * 2>
985 responseMsg{};
986
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +0930987 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +0930988 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
989 uint8_t completionCode = 0;
990 uint8_t comp_sensorCnt = 0x2;
991
992 std::array<get_sensor_state_field, 2> stateField{};
993 stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_NORMAL,
994 PLDM_SENSOR_WARNING, PLDM_SENSOR_UNKNOWN};
995 stateField[1] = {PLDM_SENSOR_FAILED, PLDM_SENSOR_UPPERFATAL,
996 PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_FATAL};
997
998 auto rc = encode_get_state_sensor_readings_resp(
999 0, PLDM_SUCCESS, comp_sensorCnt, stateField.data(), response);
1000
1001 struct pldm_get_state_sensor_readings_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301002 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301003 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
1004 response->payload);
1005
1006 EXPECT_EQ(rc, PLDM_SUCCESS);
1007 EXPECT_EQ(completionCode, resp->completion_code);
1008 EXPECT_EQ(comp_sensorCnt, resp->comp_sensor_count);
1009 EXPECT_EQ(stateField[0].sensor_op_state, resp->field->sensor_op_state);
1010 EXPECT_EQ(stateField[0].present_state, resp->field->present_state);
1011 EXPECT_EQ(stateField[0].previous_state, resp->field->previous_state);
1012 EXPECT_EQ(stateField[0].event_state, resp->field->event_state);
1013 EXPECT_EQ(stateField[1].sensor_op_state, resp->field[1].sensor_op_state);
1014 EXPECT_EQ(stateField[1].present_state, resp->field[1].present_state);
1015 EXPECT_EQ(stateField[1].previous_state, resp->field[1].previous_state);
1016 EXPECT_EQ(stateField[1].event_state, resp->field[1].event_state);
1017}
1018
1019TEST(GetStateSensorReadings, testBadEncodeResponse)
1020{
1021 auto rc = encode_get_state_sensor_readings_resp(0, PLDM_SUCCESS, 0, nullptr,
1022 nullptr);
1023
1024 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1025}
1026
1027TEST(GetStateSensorReadings, testGoodDecodeResponse)
1028{
1029 std::array<uint8_t, hdrSize +
1030 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
1031 sizeof(get_sensor_state_field) * 2>
1032 responseMsg{};
1033
1034 uint8_t completionCode = 0;
1035 uint8_t comp_sensorCnt = 2;
1036
1037 std::array<get_sensor_state_field, 2> stateField{};
1038 stateField[0] = {PLDM_SENSOR_DISABLED, PLDM_SENSOR_UNKNOWN,
1039 PLDM_SENSOR_UNKNOWN, PLDM_SENSOR_UNKNOWN};
1040 stateField[1] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_LOWERFATAL,
1041 PLDM_SENSOR_LOWERCRITICAL, PLDM_SENSOR_WARNING};
1042
1043 uint8_t retcompletion_code = 0;
1044 uint8_t retcomp_sensorCnt = 0;
1045 std::array<get_sensor_state_field, 2> retstateField{};
1046
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301047 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301048 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1049 struct pldm_get_state_sensor_readings_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301050 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301051 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
1052 response->payload);
1053
1054 resp->completion_code = completionCode;
1055 resp->comp_sensor_count = comp_sensorCnt;
1056 memcpy(resp->field, &stateField,
1057 (sizeof(get_sensor_state_field) * comp_sensorCnt));
1058
1059 auto rc = decode_get_state_sensor_readings_resp(
1060 response, responseMsg.size() - hdrSize, &retcompletion_code,
1061 &retcomp_sensorCnt, retstateField.data());
1062
1063 EXPECT_EQ(rc, PLDM_SUCCESS);
1064 EXPECT_EQ(completionCode, retcompletion_code);
1065 EXPECT_EQ(comp_sensorCnt, retcomp_sensorCnt);
1066 EXPECT_EQ(stateField[0].sensor_op_state, retstateField[0].sensor_op_state);
1067 EXPECT_EQ(stateField[0].present_state, retstateField[0].present_state);
1068 EXPECT_EQ(stateField[0].previous_state, retstateField[0].previous_state);
1069 EXPECT_EQ(stateField[0].event_state, retstateField[0].event_state);
1070 EXPECT_EQ(stateField[1].sensor_op_state, retstateField[1].sensor_op_state);
1071 EXPECT_EQ(stateField[1].present_state, retstateField[1].present_state);
1072 EXPECT_EQ(stateField[1].previous_state, retstateField[1].previous_state);
1073 EXPECT_EQ(stateField[1].event_state, retstateField[1].event_state);
1074}
1075
1076TEST(GetStateSensorReadings, testBadDecodeResponse)
1077{
1078 std::array<uint8_t, hdrSize +
1079 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
1080 sizeof(get_sensor_state_field) * 2>
1081 responseMsg{};
1082
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301083 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301084 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1085
1086 auto rc = decode_get_state_sensor_readings_resp(
1087 response, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr);
1088
1089 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1090
1091 uint8_t completionCode = 0;
1092 uint8_t comp_sensorCnt = 1;
1093
1094 std::array<get_sensor_state_field, 1> stateField{};
1095 stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_UPPERFATAL,
1096 PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_WARNING};
1097
1098 uint8_t retcompletion_code = 0;
1099 uint8_t retcomp_sensorCnt = 0;
1100 std::array<get_sensor_state_field, 1> retstateField{};
1101
1102 struct pldm_get_state_sensor_readings_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301103 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301104 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
1105 response->payload);
1106
1107 resp->completion_code = completionCode;
1108 resp->comp_sensor_count = comp_sensorCnt;
1109 memcpy(resp->field, &stateField,
1110 (sizeof(get_sensor_state_field) * comp_sensorCnt));
1111
1112 rc = decode_get_state_sensor_readings_resp(
Andrew Jeffery6ad4dc02023-04-12 15:56:45 +09301113 response, responseMsg.size() - hdrSize, &retcompletion_code,
Andrew Jeffery9c766792022-08-10 23:12:49 +09301114 &retcomp_sensorCnt, retstateField.data());
1115
Andrew Jeffery248b5ab2025-02-21 12:35:14 +10301116 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301117}
1118
1119TEST(GetStateSensorReadings, testGoodEncodeRequest)
1120{
1121 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
1122 requestMsg{};
1123
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001124 uint16_t sensorId = 0xab;
Andrew Jeffery9c766792022-08-10 23:12:49 +09301125 bitfield8_t sensorRearm;
1126 sensorRearm.byte = 0x03;
1127
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301128 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301129 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1130 auto rc = encode_get_state_sensor_readings_req(0, sensorId, sensorRearm, 0,
1131 request);
1132
1133 struct pldm_get_state_sensor_readings_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301134 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301135 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
1136 request->payload);
1137
1138 EXPECT_EQ(rc, PLDM_SUCCESS);
1139 EXPECT_EQ(sensorId, le16toh(req->sensor_id));
1140 EXPECT_EQ(sensorRearm.byte, req->sensor_rearm.byte);
1141}
1142
1143TEST(GetStateSensorReadings, testBadEncodeRequest)
1144{
1145 bitfield8_t sensorRearm;
1146 sensorRearm.byte = 0x0;
1147
1148 auto rc =
1149 encode_get_state_sensor_readings_req(0, 0, sensorRearm, 0, nullptr);
1150
1151 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1152}
1153
1154TEST(GetStateSensorReadings, testGoodDecodeRequest)
1155{
1156 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
1157 requestMsg{};
1158
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06001159 uint16_t sensorId = 0xcd;
Andrew Jeffery9c766792022-08-10 23:12:49 +09301160 bitfield8_t sensorRearm;
1161 sensorRearm.byte = 0x10;
1162
1163 uint16_t retsensorId;
1164 bitfield8_t retsensorRearm;
1165 uint8_t retreserved;
1166
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301167 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301168 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1169
1170 struct pldm_get_state_sensor_readings_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301171 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301172 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
1173 request->payload);
1174
1175 req->sensor_id = htole16(sensorId);
1176 req->sensor_rearm.byte = sensorRearm.byte;
1177
1178 auto rc = decode_get_state_sensor_readings_req(
1179 request, requestMsg.size() - hdrSize, &retsensorId, &retsensorRearm,
1180 &retreserved);
1181
1182 EXPECT_EQ(rc, PLDM_SUCCESS);
1183 EXPECT_EQ(sensorId, retsensorId);
1184 EXPECT_EQ(sensorRearm.byte, retsensorRearm.byte);
1185 EXPECT_EQ(0, retreserved);
1186}
1187
1188TEST(GetStateSensorReadings, testBadDecodeRequest)
1189{
1190 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
1191 requestMsg{};
1192
1193 auto rc = decode_get_state_sensor_readings_req(
1194 nullptr, requestMsg.size() - hdrSize, nullptr, nullptr, nullptr);
1195
1196 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1197 uint16_t sensorId = 0x11;
1198 bitfield8_t sensorRearm;
1199 sensorRearm.byte = 0x04;
1200
1201 uint16_t retsensorId;
1202 bitfield8_t retsensorRearm;
1203 uint8_t retreserved;
1204
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301205 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301206 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1207
1208 struct pldm_get_state_sensor_readings_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301209 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09301210 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
1211 request->payload);
1212
1213 req->sensor_id = htole16(sensorId);
1214 req->sensor_rearm.byte = sensorRearm.byte;
1215
1216 rc = decode_get_state_sensor_readings_req(
1217 request, requestMsg.size() - hdrSize - 1, &retsensorId, &retsensorRearm,
1218 &retreserved);
1219
1220 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1221}
1222
Dung Caod6ae8982022-11-02 10:00:10 +07001223TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeRequest)
1224{
1225 uint8_t eventBufferSize = 32;
1226
1227 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_REQ_BYTES>
1228 requestMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301229 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Caod6ae8982022-11-02 10:00:10 +07001230 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1231
1232 auto rc = encode_event_message_buffer_size_req(0, eventBufferSize, request);
1233
1234 EXPECT_EQ(rc, PLDM_SUCCESS);
1235}
1236
1237TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeResponse)
1238{
1239 uint8_t completionCode = PLDM_SUCCESS;
1240 uint16_t terminusMaxBufferSize = 256;
1241
1242 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
1243 responseMsg{};
1244
1245 uint8_t retCompletionCode;
1246 uint16_t retMaxBufferSize = 0;
1247
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301248 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Caod6ae8982022-11-02 10:00:10 +07001249 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1250 struct pldm_event_message_buffer_size_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301251 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Caod6ae8982022-11-02 10:00:10 +07001252 reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
1253 response->payload);
1254
1255 resp->completion_code = completionCode;
1256 resp->terminus_max_buffer_size = terminusMaxBufferSize;
1257
1258 auto rc = decode_event_message_buffer_size_resp(
1259 response, responseMsg.size() - hdrSize, &retCompletionCode,
1260 &retMaxBufferSize);
1261
1262 EXPECT_EQ(rc, PLDM_SUCCESS);
1263 EXPECT_EQ(retCompletionCode, completionCode);
1264 EXPECT_EQ(terminusMaxBufferSize, retMaxBufferSize);
1265}
1266
1267TEST(EventMessageBufferSize, testBadEventMessageBufferSizeResponse)
1268{
1269 uint8_t completionCode = PLDM_SUCCESS;
1270 uint16_t terminusMaxBufferSize = 256;
1271
1272 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
1273 responseMsg{};
1274
1275 uint8_t retCompletionCode;
1276 uint16_t retMaxBufferSize = 0;
1277
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301278 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Caod6ae8982022-11-02 10:00:10 +07001279 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1280 struct pldm_event_message_buffer_size_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301281 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Caod6ae8982022-11-02 10:00:10 +07001282 reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
1283 response->payload);
1284 resp->completion_code = completionCode;
1285 resp->terminus_max_buffer_size = terminusMaxBufferSize;
1286
1287 auto rc =
1288 decode_event_message_buffer_size_resp(response, 0, nullptr, nullptr);
1289 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1290
1291 rc = decode_event_message_buffer_size_resp(
1292 response, responseMsg.size(), &retCompletionCode, &retMaxBufferSize);
Andrew Jeffery248b5ab2025-02-21 12:35:14 +10301293 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Dung Caod6ae8982022-11-02 10:00:10 +07001294}
1295
Dung Cao1bf8c872022-11-29 05:32:58 +07001296TEST(PlatformEventMessageSupported, testGoodEncodeRequest)
1297{
1298 uint8_t formatVersion = 0x01;
1299
1300 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_REQ_BYTES>
1301 requestMsg{};
1302
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301303 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao1bf8c872022-11-29 05:32:58 +07001304 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1305
1306 auto rc = encode_event_message_supported_req(0, formatVersion, request);
1307
1308 struct pldm_event_message_supported_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301309 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao1bf8c872022-11-29 05:32:58 +07001310 reinterpret_cast<struct pldm_event_message_supported_req*>(
1311 request->payload);
1312
1313 EXPECT_EQ(rc, PLDM_SUCCESS);
1314 EXPECT_EQ(formatVersion, req->format_version);
1315}
1316
1317TEST(PlatformEventMessageSupported, testBadEncodeRequest)
1318{
1319 uint8_t eventData = 34;
1320 uint8_t formatVersion = 0x0;
1321
1322 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_REQ_BYTES +
1323 sizeof(eventData)>
1324 requestMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301325 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao1bf8c872022-11-29 05:32:58 +07001326 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1327
1328 auto rc = encode_event_message_supported_req(0, formatVersion, request);
1329 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1330
1331 rc = encode_event_message_supported_req(0, formatVersion, nullptr);
1332 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1333}
1334
1335TEST(PlatformEventMessageSupported, testGoodDecodeRespond)
1336{
1337 uint8_t completionCode = PLDM_SUCCESS;
1338 uint8_t synchConfiguration = PLDM_MESSAGE_TYPE_SYNCHRONOUS;
1339 bitfield8_t synchConfigSupported;
1340 synchConfigSupported.byte = 0xe;
1341 uint8_t numberEventClassReturned = 0x3;
1342 std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
1343 constexpr uint8_t eventClassCount = 3;
1344
1345 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
1346 eventClassCount>
1347 responseMsg{};
1348
1349 uint8_t retCompletionCode;
1350 uint8_t retSynchConfig = 0;
1351 uint8_t retNumberEventClass = 0;
1352 bitfield8_t retSynchConfigSupport;
1353 uint8_t retEventClass[eventClassCount] = {0};
1354
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301355 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao1bf8c872022-11-29 05:32:58 +07001356 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1357 struct pldm_event_message_supported_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301358 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao1bf8c872022-11-29 05:32:58 +07001359 reinterpret_cast<struct pldm_event_message_supported_resp*>(
1360 response->payload);
1361
1362 resp->completion_code = completionCode;
1363 resp->synchrony_configuration = synchConfiguration;
1364 resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
1365 resp->number_event_class_returned = numberEventClassReturned;
1366 memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
1367
1368 auto rc = decode_event_message_supported_resp(
1369 response, responseMsg.size() - hdrSize, &retCompletionCode,
1370 &retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
1371 retEventClass, eventClassCount);
1372
1373 EXPECT_EQ(rc, PLDM_SUCCESS);
1374 EXPECT_EQ(retCompletionCode, completionCode);
1375 EXPECT_EQ(retSynchConfig, synchConfiguration);
1376 EXPECT_EQ(retNumberEventClass, numberEventClassReturned);
1377 EXPECT_EQ(retSynchConfigSupport.byte, synchConfigSupported.byte);
1378 EXPECT_EQ(0, memcmp(eventClass.data(), resp->event_class,
1379 numberEventClassReturned));
1380}
1381
1382TEST(PlatformEventMessageSupported, testBadSynchConfiguration)
1383{
1384 uint8_t completionCode = PLDM_SUCCESS;
1385 uint8_t synchConfiguration = 0x4;
1386 bitfield8_t synchConfigSupported;
1387 synchConfigSupported.byte = 0xe;
1388 uint8_t numberEventClassReturned = 0x3;
1389 std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
1390 constexpr uint8_t eventClassCount = 3;
1391
1392 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
1393 eventClassCount>
1394 responseMsg{};
1395
1396 uint8_t retCompletionCode;
1397 uint8_t retSynchConfig = 0;
1398 uint8_t retNumberEventClass = 0;
1399 bitfield8_t retSynchConfigSupport;
1400 uint8_t retEventClass[eventClassCount] = {0};
1401
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301402 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao1bf8c872022-11-29 05:32:58 +07001403 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1404 struct pldm_event_message_supported_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301405 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao1bf8c872022-11-29 05:32:58 +07001406 reinterpret_cast<struct pldm_event_message_supported_resp*>(
1407 response->payload);
1408
1409 resp->completion_code = completionCode;
1410 resp->synchrony_configuration = synchConfiguration;
1411 resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
1412 resp->number_event_class_returned = numberEventClassReturned;
1413 memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
1414
1415 auto rc = decode_event_message_supported_resp(
1416 response, responseMsg.size() - hdrSize, &retCompletionCode,
1417 &retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
1418 retEventClass, eventClassCount);
1419
1420 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1421}
1422
1423TEST(PlatformEventMessageSupported, testBadDecodeRespond)
1424{
1425 uint8_t completionCode = PLDM_SUCCESS;
1426 uint8_t synchConfiguration = PLDM_MESSAGE_TYPE_SYNCHRONOUS;
1427 bitfield8_t synchConfigSupported;
1428 synchConfigSupported.byte = 0xe;
1429 uint8_t numberEventClassReturned = 0x3;
1430 std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
1431 constexpr uint8_t eventClassCount = 3;
1432
1433 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
1434 eventClassCount>
1435 responseMsg{};
1436
1437 uint8_t retCompletionCode;
1438 uint8_t retSynchConfig = 0;
1439 uint8_t retNumberEventClass = 0;
1440 bitfield8_t retSynchConfigSupport;
1441 uint8_t retEventClass[eventClassCount] = {0};
1442
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301443 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao1bf8c872022-11-29 05:32:58 +07001444 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1445 struct pldm_event_message_supported_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301446 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao1bf8c872022-11-29 05:32:58 +07001447 reinterpret_cast<struct pldm_event_message_supported_resp*>(
1448 response->payload);
1449 resp->completion_code = completionCode;
1450 resp->synchrony_configuration = synchConfiguration;
1451 resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
1452 resp->number_event_class_returned = numberEventClassReturned;
1453 memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
1454
1455 auto rc = decode_event_message_supported_resp(response, 0, nullptr, nullptr,
1456 nullptr, nullptr, nullptr, 0);
1457 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1458
1459 rc = decode_event_message_supported_resp(
1460 response, PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES - 1,
1461 &retCompletionCode, &retSynchConfig, &retSynchConfigSupport,
1462 &retNumberEventClass, retEventClass, eventClassCount);
1463 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1464
1465 rc = decode_event_message_supported_resp(
1466 response, responseMsg.size() - hdrSize, &retCompletionCode,
1467 &retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
1468 retEventClass, 1);
1469 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1470}
1471
Thu Nguyen387b10f2024-09-24 11:33:16 +00001472TEST(PollForPlatformEventMessage, testGoodEncodeRequestFirstPart)
Thu Nguyen159a98b2022-11-02 10:00:10 +07001473{
1474 uint8_t formatVersion = 0x01;
Thu Nguyen387b10f2024-09-24 11:33:16 +00001475 uint8_t transferOperationFlag = PLDM_GET_FIRSTPART;
1476 uint32_t dataTransferHandle = 0xaabbccdd;
1477 uint16_t eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_NULL;
Thu Nguyen159a98b2022-11-02 10:00:10 +07001478
Thu Nguyen387b10f2024-09-24 11:33:16 +00001479 PLDM_MSG_DEFINE_P(request, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
Thu Nguyen159a98b2022-11-02 10:00:10 +07001480
1481 auto rc = encode_poll_for_platform_event_message_req(
1482 0, formatVersion, transferOperationFlag, dataTransferHandle,
1483 eventIdToAcknowledge, request,
1484 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1485 EXPECT_EQ(rc, PLDM_SUCCESS);
1486
Andrew Jefferya1896962025-03-03 21:41:25 +10301487 PLDM_MSGBUF_DEFINE_P(buf);
Thu Nguyen387b10f2024-09-24 11:33:16 +00001488 rc = pldm_msgbuf_init_errno(
Andrew Jefferyc8df31c2024-05-21 16:47:43 +09301489 buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES, request->payload,
1490 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
Andrew Jefferya1896962025-03-03 21:41:25 +10301491 ASSERT_EQ(rc, 0);
Thu Nguyen159a98b2022-11-02 10:00:10 +07001492
1493 uint8_t retFormatVersion;
1494 uint8_t retTransferOperationFlag;
1495 uint32_t retDataTransferHandle;
1496 uint16_t retEventIdToAcknowledge;
1497
Andrew Jefferye5f12532024-10-01 12:18:49 +09301498 pldm_msgbuf_extract_uint8(buf, retFormatVersion);
1499 pldm_msgbuf_extract_uint8(buf, retTransferOperationFlag);
1500 pldm_msgbuf_extract_uint32(buf, retDataTransferHandle);
1501 pldm_msgbuf_extract_uint16(buf, retEventIdToAcknowledge);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301502 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
Thu Nguyen159a98b2022-11-02 10:00:10 +07001503
1504 EXPECT_EQ(retFormatVersion, formatVersion);
1505 EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1506 EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1507 EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
Thu Nguyen387b10f2024-09-24 11:33:16 +00001508}
1509
1510TEST(PollForPlatformEventMessage, testGoodEncodeRequestNextPart)
1511{
1512 uint8_t formatVersion = 0x01;
1513 uint8_t transferOperationFlag = PLDM_GET_NEXTPART;
1514 uint32_t dataTransferHandle = 0xaabbccdd;
1515 uint16_t eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_FRAGMENT;
1516
1517 PLDM_MSG_DEFINE_P(request, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1518
1519 auto rc = encode_poll_for_platform_event_message_req(
1520 0, formatVersion, transferOperationFlag, dataTransferHandle,
1521 eventIdToAcknowledge, request,
1522 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1523 EXPECT_EQ(rc, PLDM_SUCCESS);
1524
Andrew Jefferya1896962025-03-03 21:41:25 +10301525 PLDM_MSGBUF_DEFINE_P(buf);
Thu Nguyen387b10f2024-09-24 11:33:16 +00001526 rc = pldm_msgbuf_init_errno(
1527 buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES, request->payload,
1528 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
Andrew Jefferya1896962025-03-03 21:41:25 +10301529 ASSERT_EQ(rc, 0);
Thu Nguyen387b10f2024-09-24 11:33:16 +00001530
1531 uint8_t retFormatVersion;
1532 uint8_t retTransferOperationFlag;
1533 uint32_t retDataTransferHandle;
1534 uint16_t retEventIdToAcknowledge;
1535
Andrew Jefferye5f12532024-10-01 12:18:49 +09301536 pldm_msgbuf_extract_uint8(buf, retFormatVersion);
1537 pldm_msgbuf_extract_uint8(buf, retTransferOperationFlag);
1538 pldm_msgbuf_extract_uint32(buf, retDataTransferHandle);
1539 pldm_msgbuf_extract_uint16(buf, retEventIdToAcknowledge);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301540 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
Thu Nguyen387b10f2024-09-24 11:33:16 +00001541
1542 EXPECT_EQ(retFormatVersion, formatVersion);
1543 EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1544 EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1545 EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
1546}
1547
1548TEST(PollForPlatformEventMessage, testGoodEncodeRequestAckOnly)
1549{
1550 uint8_t formatVersion = 0x01;
1551 uint8_t transferOperationFlag = PLDM_ACKNOWLEDGEMENT_ONLY;
1552 uint32_t dataTransferHandle = 0xaabbccdd;
Thu Nguyen9e16b182024-10-01 03:12:16 +00001553 uint16_t eventIdToAcknowledge = 0x1234;
Thu Nguyen387b10f2024-09-24 11:33:16 +00001554
1555 PLDM_MSG_DEFINE_P(request, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1556
1557 auto rc = encode_poll_for_platform_event_message_req(
1558 0, formatVersion, transferOperationFlag, dataTransferHandle,
1559 eventIdToAcknowledge, request,
1560 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1561 EXPECT_EQ(rc, PLDM_SUCCESS);
1562
Andrew Jefferya1896962025-03-03 21:41:25 +10301563 PLDM_MSGBUF_DEFINE_P(buf);
Thu Nguyen387b10f2024-09-24 11:33:16 +00001564 rc = pldm_msgbuf_init_errno(
1565 buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES, request->payload,
1566 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
Andrew Jefferya1896962025-03-03 21:41:25 +10301567 ASSERT_EQ(rc, 0);
Thu Nguyen387b10f2024-09-24 11:33:16 +00001568
1569 uint8_t retFormatVersion;
1570 uint8_t retTransferOperationFlag;
1571 uint32_t retDataTransferHandle;
1572 uint16_t retEventIdToAcknowledge;
1573
Andrew Jefferye5f12532024-10-01 12:18:49 +09301574 pldm_msgbuf_extract_uint8(buf, retFormatVersion);
1575 pldm_msgbuf_extract_uint8(buf, retTransferOperationFlag);
1576 pldm_msgbuf_extract_uint32(buf, retDataTransferHandle);
1577 pldm_msgbuf_extract_uint16(buf, retEventIdToAcknowledge);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10301578 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
Thu Nguyen387b10f2024-09-24 11:33:16 +00001579
1580 EXPECT_EQ(retFormatVersion, formatVersion);
1581 EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1582 EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1583 EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
Thu Nguyen159a98b2022-11-02 10:00:10 +07001584}
1585
1586TEST(PollForPlatformEventMessage, testBadEncodeRequest)
1587{
1588 uint8_t formatVersion = 0x01;
Thu Nguyen387b10f2024-09-24 11:33:16 +00001589 uint8_t transferOperationFlag = PLDM_GET_FIRSTPART;
1590 uint32_t dataTransferHandle = 0xaabbccdd;
1591 uint16_t eventIdToAcknowledge = 0x1234;
Thu Nguyen159a98b2022-11-02 10:00:10 +07001592
Thu Nguyen387b10f2024-09-24 11:33:16 +00001593 PLDM_MSG_DEFINE_P(request, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
Thu Nguyen159a98b2022-11-02 10:00:10 +07001594
1595 auto rc = encode_poll_for_platform_event_message_req(
1596 0, formatVersion, transferOperationFlag, dataTransferHandle,
1597 eventIdToAcknowledge, nullptr,
1598 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
Thu Nguyen159a98b2022-11-02 10:00:10 +07001599 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1600
Thu Nguyen387b10f2024-09-24 11:33:16 +00001601 transferOperationFlag = PLDM_GET_FIRSTPART;
1602 eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_FRAGMENT;
1603 rc = encode_poll_for_platform_event_message_req(
Thu Nguyen159a98b2022-11-02 10:00:10 +07001604 0, formatVersion, transferOperationFlag, dataTransferHandle,
Thu Nguyen387b10f2024-09-24 11:33:16 +00001605 eventIdToAcknowledge, request,
1606 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1607 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1608
1609 transferOperationFlag = PLDM_GET_NEXTPART;
1610 eventIdToAcknowledge = 0x1234;
1611 rc = encode_poll_for_platform_event_message_req(
1612 0, formatVersion, transferOperationFlag, dataTransferHandle,
1613 eventIdToAcknowledge, request,
1614 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1615 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1616
1617 transferOperationFlag = PLDM_GET_NEXTPART;
1618 eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_NULL;
1619 rc = encode_poll_for_platform_event_message_req(
1620 0, formatVersion, transferOperationFlag, dataTransferHandle,
1621 eventIdToAcknowledge, request,
1622 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1623 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1624
1625 transferOperationFlag = PLDM_ACKNOWLEDGEMENT_ONLY;
Thu Nguyen9e16b182024-10-01 03:12:16 +00001626 eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_NULL;
Thu Nguyen387b10f2024-09-24 11:33:16 +00001627 rc = encode_poll_for_platform_event_message_req(
1628 0, formatVersion, transferOperationFlag, dataTransferHandle,
1629 eventIdToAcknowledge, request,
1630 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1631 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1632
1633 transferOperationFlag = PLDM_ACKNOWLEDGEMENT_ONLY;
Thu Nguyen9e16b182024-10-01 03:12:16 +00001634 eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_FRAGMENT;
Thu Nguyen387b10f2024-09-24 11:33:16 +00001635 rc = encode_poll_for_platform_event_message_req(
1636 0, formatVersion, transferOperationFlag, dataTransferHandle,
1637 eventIdToAcknowledge, request,
1638 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1639 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1640
1641 transferOperationFlag = PLDM_ACKNOWLEDGEMENT_ONLY + 1;
1642 eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_FRAGMENT;
1643 rc = encode_poll_for_platform_event_message_req(
1644 0, formatVersion, transferOperationFlag, dataTransferHandle,
1645 eventIdToAcknowledge, request,
1646 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1647 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Thu Nguyen159a98b2022-11-02 10:00:10 +07001648}
1649
1650TEST(PollForPlatformEventMessage, testGoodDecodeRespond)
1651{
1652 uint8_t completionCode = PLDM_SUCCESS;
1653 uint8_t tId = 0x9;
1654 uint16_t eventId = 159;
1655 uint32_t nextDataTransferHandle = 0x11223344;
1656 uint8_t transferFlag = PLDM_START_AND_END;
1657 uint8_t eventClass = 0x5;
1658 uint8_t eventData[5] = {0x55, 0x44, 0x33, 0x22, 0x11};
1659 constexpr uint32_t eventDataSize = 0x00000005;
1660 uint32_t eventDataIntegrityChecksum = 0x66778899;
1661
1662 std::vector<uint8_t> responseMsg{
1663 0x1,
1664 0x0,
1665 0x0,
1666 PLDM_SUCCESS,
1667 0x9, // tid
1668 159,
1669 0x0, // event id
1670 0x44,
1671 0x33,
1672 0x22,
1673 0x11, // next_data_transfer_handle
1674 PLDM_START_AND_END, // transfer_flag
1675 0x05, // event class
1676 0x05,
1677 0x00,
1678 0x00,
1679 0x00, // event_data_size
1680 0x55,
1681 0x44,
1682 0x33,
1683 0x22,
1684 0x11, // event_data[5]
1685 0x99,
1686 0x88,
1687 0x77,
1688 0x66 // event_data_integrity_checksum
1689 };
1690 const uint32_t respMsgLen = 23;
1691
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301692 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen159a98b2022-11-02 10:00:10 +07001693 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1694
1695 uint8_t retCompletionCode;
1696 uint8_t retTid = 0;
1697 uint16_t retEventId = 0;
1698 uint32_t retNextDataTransferHandle = 0;
1699 uint8_t retTransferFlag = 0;
1700 uint8_t retEventClass = 0;
1701 uint32_t retEventDataSize = 0;
1702 uint8_t* retEventData = nullptr;
1703 uint32_t retEventDataIntegrityChecksum = 0;
1704
1705 auto rc = decode_poll_for_platform_event_message_resp(
1706 response, respMsgLen, &retCompletionCode, &retTid, &retEventId,
1707 &retNextDataTransferHandle, &retTransferFlag, &retEventClass,
1708 &retEventDataSize, (void**)&retEventData,
1709 &retEventDataIntegrityChecksum);
1710
1711 EXPECT_EQ(rc, PLDM_SUCCESS);
1712 EXPECT_EQ(retCompletionCode, completionCode);
1713 EXPECT_EQ(retTid, tId);
1714 EXPECT_EQ(retEventId, eventId);
1715 EXPECT_EQ(retNextDataTransferHandle, nextDataTransferHandle);
1716 EXPECT_EQ(retTransferFlag, transferFlag);
1717 EXPECT_EQ(retEventClass, eventClass);
1718 EXPECT_EQ(retEventDataSize, eventDataSize);
1719 EXPECT_EQ(retEventDataIntegrityChecksum, eventDataIntegrityChecksum);
1720 EXPECT_EQ(0, memcmp(eventData, retEventData, eventDataSize));
1721}
1722
1723TEST(PollForPlatformEventMessage, testGoodDecodeAckOnlyRespond)
1724{
1725 uint8_t completionCode = PLDM_SUCCESS;
1726 uint8_t tId = 0x9;
1727 uint16_t eventId = 0xffff;
1728
1729 std::vector<uint8_t> responseMsg{
1730 0x1, 0x0, 0x0, PLDM_SUCCESS,
1731 0x9, // tid
1732 0xff,
1733 0xff // event id
1734 };
1735 const uint32_t respMsgLen = 4;
1736
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301737 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen159a98b2022-11-02 10:00:10 +07001738 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1739
1740 uint8_t retCompletionCode;
1741 uint8_t retTid = 0;
1742 uint16_t retEventId = 0;
1743 uint32_t retNextDataTransferHandle = 0;
1744 uint8_t retTransferFlag = 0;
1745 uint8_t retEventClass = 0;
1746 uint32_t retEventDataSize = 0;
1747 uint8_t* retEventData = nullptr;
1748 uint32_t retEventDataIntegrityChecksum = 0;
1749
1750 auto rc = decode_poll_for_platform_event_message_resp(
1751 response, respMsgLen, &retCompletionCode, &retTid, &retEventId,
1752 &retNextDataTransferHandle, &retTransferFlag, &retEventClass,
1753 &retEventDataSize, (void**)&retEventData,
1754 &retEventDataIntegrityChecksum);
1755
1756 EXPECT_EQ(rc, PLDM_SUCCESS);
1757 EXPECT_EQ(retCompletionCode, completionCode);
1758 EXPECT_EQ(retTid, tId);
1759 EXPECT_EQ(retEventId, eventId);
1760
1761 eventId = 0x0000;
1762 responseMsg[5] = 0x00;
1763 responseMsg[6] = 0x00;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301764 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen159a98b2022-11-02 10:00:10 +07001765 response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1766
1767 rc = decode_poll_for_platform_event_message_resp(
1768 response, respMsgLen, &retCompletionCode, &retTid, &retEventId,
1769 &retNextDataTransferHandle, &retTransferFlag, &retEventClass,
1770 &retEventDataSize, (void**)&retEventData,
1771 &retEventDataIntegrityChecksum);
1772
1773 EXPECT_EQ(rc, PLDM_SUCCESS);
1774 EXPECT_EQ(retCompletionCode, completionCode);
1775 EXPECT_EQ(retTid, tId);
1776 EXPECT_EQ(retEventId, eventId);
1777}
1778
1779TEST(PollForPlatformEventMessage, testBadDecodeRespond)
1780{
1781 std::vector<uint8_t> responseMsg{
1782 0x1,
1783 0x0,
1784 0x0,
1785 PLDM_SUCCESS,
1786 0x9, // tid
1787 159,
1788 0x0, // event id
1789 0x44,
1790 0x33,
1791 0x22,
1792 0x11, // next_data_transfer_handle
1793 PLDM_START_AND_END, // transfer_flag
1794 0x05, // event class
1795 0x05,
1796 0x00,
1797 0x00,
1798 0x00, // event_data_size
1799 0x55,
1800 0x44,
1801 0x33,
1802 0x22,
1803 0x11, // event_data[5]
1804 0x99,
1805 0x88,
1806 0x77,
1807 0x66 // event_data_integrity_checksum
1808 };
1809 // const uint32_t respMsgLen = 23;
1810
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301811 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen159a98b2022-11-02 10:00:10 +07001812 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1813
1814 auto rc = decode_poll_for_platform_event_message_resp(
1815 nullptr, 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
1816 nullptr, nullptr, nullptr);
1817
1818 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1819
1820 uint8_t retCompletionCode;
1821 uint8_t retTid = 0;
1822 uint16_t retEventId = 0;
1823 uint32_t retNextDataTransferHandle = 0;
1824 uint8_t retTransferFlag = 0;
1825 uint8_t retEventClass = 0;
1826 uint32_t retEventDataSize = 0;
1827 uint8_t* retEventData = nullptr;
1828 uint32_t retEventDataIntegrityChecksum = 0;
1829
1830 rc = decode_poll_for_platform_event_message_resp(
1831 response, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES - 1,
1832 &retCompletionCode, &retTid, &retEventId, &retNextDataTransferHandle,
1833 &retTransferFlag, &retEventClass, &retEventDataSize,
1834 (void**)&retEventData, &retEventDataIntegrityChecksum);
1835
1836 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1837}
1838
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001839TEST(PollForPlatformEventMessage, testGoodDecodeRequestFirstPart)
1840{
1841 uint8_t formatVersion = 0x1;
1842 uint8_t transferOperationFlag = PLDM_GET_FIRSTPART;
1843 uint32_t dataTransferHandle = 0x11223344;
Thu Nguyen387b10f2024-09-24 11:33:16 +00001844 uint16_t eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_NULL;
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001845 std::vector<uint8_t> requestMsg{0x1, 0x0, 0x0, 0x1, PLDM_GET_FIRSTPART,
1846 0x44, 0x33, 0x22, 0x11, 0x00,
1847 0x00};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301848 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001849 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1850
1851 uint8_t retFormatVersion;
1852 uint8_t retTransferOperationFlag;
1853 uint32_t retDataTransferHandle;
1854 uint16_t retEventIdToAcknowledge;
1855
1856 auto rc = decode_poll_for_platform_event_message_req(
1857 request, requestMsg.size() - hdrSize, &retFormatVersion,
1858 &retTransferOperationFlag, &retDataTransferHandle,
1859 &retEventIdToAcknowledge);
1860
1861 EXPECT_EQ(rc, PLDM_SUCCESS);
1862 EXPECT_EQ(retFormatVersion, formatVersion);
1863 EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1864 EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1865 EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
1866}
1867
1868TEST(PollForPlatformEventMessage, testGoodDecodeRequestNextPart)
1869{
1870 uint8_t formatVersion = 0x1;
1871 uint8_t transferOperationFlag = PLDM_GET_NEXTPART;
1872 uint32_t dataTransferHandle = 0x11223344;
Thu Nguyen387b10f2024-09-24 11:33:16 +00001873 uint16_t eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_FRAGMENT;
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001874 std::vector<uint8_t> requestMsg{0x1, 0x0, 0x0, 0x1, PLDM_GET_NEXTPART,
1875 0x44, 0x33, 0x22, 0x11, 0xff,
1876 0xff};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301877 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001878 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1879
1880 uint8_t retFormatVersion;
1881 uint8_t retTransferOperationFlag;
1882 uint32_t retDataTransferHandle;
1883 uint16_t retEventIdToAcknowledge;
1884
1885 auto rc = decode_poll_for_platform_event_message_req(
1886 request, requestMsg.size() - hdrSize, &retFormatVersion,
1887 &retTransferOperationFlag, &retDataTransferHandle,
1888 &retEventIdToAcknowledge);
1889
1890 EXPECT_EQ(rc, PLDM_SUCCESS);
1891 EXPECT_EQ(retFormatVersion, formatVersion);
1892 EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1893 EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1894 EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
1895}
1896
1897TEST(PollForPlatformEventMessage, testGoodDecodeRequestAck)
1898{
1899 uint8_t formatVersion = 0x1;
1900 uint8_t transferOperationFlag = PLDM_ACKNOWLEDGEMENT_ONLY;
1901 uint32_t dataTransferHandle = 0x11223344;
Thu Nguyen9e16b182024-10-01 03:12:16 +00001902 uint16_t eventIdToAcknowledge = 0x1234;
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001903 std::vector<uint8_t> requestMsg{
1904 0x1, 0x0, 0x0, 0x1, PLDM_ACKNOWLEDGEMENT_ONLY, 0x44, 0x33,
Thu Nguyen9e16b182024-10-01 03:12:16 +00001905 0x22, 0x11, 0x34, 0x12};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301906 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001907 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1908
1909 uint8_t retFormatVersion;
1910 uint8_t retTransferOperationFlag;
1911 uint32_t retDataTransferHandle;
1912 uint16_t retEventIdToAcknowledge;
1913
1914 auto rc = decode_poll_for_platform_event_message_req(
1915 request, requestMsg.size() - hdrSize, &retFormatVersion,
1916 &retTransferOperationFlag, &retDataTransferHandle,
1917 &retEventIdToAcknowledge);
1918
1919 EXPECT_EQ(rc, PLDM_SUCCESS);
1920 EXPECT_EQ(retFormatVersion, formatVersion);
1921 EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1922 EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1923 EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
1924}
1925
1926TEST(PollForPlatformEventMessage, testBadDecodeRequest)
1927{
Thu Nguyen387b10f2024-09-24 11:33:16 +00001928 /*
1929 * transfer_operation_flag is PLDM_GET_FIRSTPART and
1930 * event_id_to_acknowledge is not PLDM_PLATFORM_EVENT_ID_NULL
1931 */
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001932 std::vector<uint8_t> requestMsg{0x1, 0x0, 0x0, 0x1, PLDM_GET_FIRSTPART,
1933 0x44, 0x33, 0x22, 0x11, 0x66,
1934 0x55};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09301935 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001936 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1937
1938 uint8_t retFormatVersion;
1939 uint8_t retTransferOperationFlag;
1940 uint32_t retDataTransferHandle;
1941 uint16_t retEventIdToAcknowledge;
1942
1943 auto rc = decode_poll_for_platform_event_message_req(
1944 NULL, requestMsg.size() - hdrSize, &retFormatVersion,
1945 &retTransferOperationFlag, &retDataTransferHandle,
1946 &retEventIdToAcknowledge);
1947 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1948
1949 /*
1950 * transfer_operation_flag is not PLDM_GET_FIRSTPART or PLDM_GET_NEXTPART or
1951 * PLDM_ACKNOWLEDGEMENT_ONLY
1952 */
1953
1954 requestMsg[4] = PLDM_ACKNOWLEDGEMENT_ONLY + 1;
1955
1956 rc = decode_poll_for_platform_event_message_req(
1957 request, requestMsg.size() - hdrSize, &retFormatVersion,
1958 &retTransferOperationFlag, &retDataTransferHandle,
1959 &retEventIdToAcknowledge);
1960
1961 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001962
1963 /*
1964 * transfer_operation_flag is PLDM_GET_NEXTPART and
Thu Nguyen387b10f2024-09-24 11:33:16 +00001965 * event_id_to_acknowledge is not PLDM_PLATFORM_EVENT_ID_FRAGMENT
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001966 */
1967 requestMsg[4] = PLDM_GET_NEXTPART;
Thu Nguyen387b10f2024-09-24 11:33:16 +00001968 requestMsg[9] = 0x11;
1969 requestMsg[10] = 0x22;
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001970
1971 rc = decode_poll_for_platform_event_message_req(
1972 request, requestMsg.size() - hdrSize, &retFormatVersion,
1973 &retTransferOperationFlag, &retDataTransferHandle,
1974 &retEventIdToAcknowledge);
1975
1976 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1977
1978 /*
Thu Nguyen387b10f2024-09-24 11:33:16 +00001979 * transfer_operation_flag is PLDM_ACKNOWLEDGEMENT_ONLY and
Thu Nguyen9e16b182024-10-01 03:12:16 +00001980 * event_id_to_acknowledge is PLDM_PLATFORM_EVENT_ID_FRAGMENT
Thu Nguyen8eb20f22022-11-16 22:34:55 +07001981 */
Thu Nguyen387b10f2024-09-24 11:33:16 +00001982 requestMsg[4] = PLDM_ACKNOWLEDGEMENT_ONLY;
Thu Nguyen9e16b182024-10-01 03:12:16 +00001983 requestMsg[9] = 0xff;
1984 requestMsg[10] = 0xff;
1985
1986 rc = decode_poll_for_platform_event_message_req(
1987 request, requestMsg.size() - hdrSize, &retFormatVersion,
1988 &retTransferOperationFlag, &retDataTransferHandle,
1989 &retEventIdToAcknowledge);
1990
1991 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1992
1993 /*
1994 * transfer_operation_flag is PLDM_ACKNOWLEDGEMENT_ONLY and
1995 * event_id_to_acknowledge is PLDM_PLATFORM_EVENT_ID_NULL
1996 */
1997 requestMsg[4] = PLDM_ACKNOWLEDGEMENT_ONLY;
1998 requestMsg[9] = 0x00;
1999 requestMsg[10] = 0x00;
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002000
2001 rc = decode_poll_for_platform_event_message_req(
2002 request, requestMsg.size() - hdrSize, &retFormatVersion,
2003 &retTransferOperationFlag, &retDataTransferHandle,
2004 &retEventIdToAcknowledge);
2005
2006 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2007}
2008
2009TEST(PollForPlatformEventMessage, testGoodEncodeResposeP1)
2010{
2011 uint8_t completionCode = PLDM_SUCCESS;
2012 uint8_t instance_id = 0;
2013 uint8_t tId = 0x9;
2014 uint16_t eventId = 0x1;
2015 uint32_t nextDataTransferHandle = 0xffff;
2016 uint8_t transferFlag = PLDM_END;
2017 uint8_t eventClass = 0x5;
2018 constexpr uint32_t eventDataSize = 9;
2019 uint8_t pEventData[eventDataSize] = {0x31, 0x32, 0x33, 0x34, 0x35,
2020 0x36, 0x37, 0x38, 0x39};
2021 uint32_t eventDataIntegrityChecksum = 0x11223344;
2022 constexpr size_t payloadLength =
2023 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_RESP_BYTES + eventDataSize + 4;
2024
2025 std::array<uint8_t, hdrSize + payloadLength> responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302026 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002027 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2028
2029 auto rc = encode_poll_for_platform_event_message_resp(
2030 instance_id, completionCode, tId, eventId, nextDataTransferHandle,
2031 transferFlag, eventClass, eventDataSize, pEventData,
2032 eventDataIntegrityChecksum, response, payloadLength);
2033 EXPECT_EQ(rc, PLDM_SUCCESS);
2034
Andrew Jefferya1896962025-03-03 21:41:25 +10302035 PLDM_MSGBUF_DEFINE_P(buf);
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09302036 rc = pldm_msgbuf_init_errno(
Andrew Jefferyc8df31c2024-05-21 16:47:43 +09302037 buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES,
2038 response->payload, payloadLength);
Andrew Jefferya1896962025-03-03 21:41:25 +10302039 ASSERT_EQ(rc, 0);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002040
2041 uint8_t retCompletionCode;
2042 uint8_t retTid = 0;
2043 uint16_t retEventId = 0;
2044 uint32_t retNextDataTransferHandle = 0;
2045 uint8_t retTransferFlag = 0;
2046 uint8_t retEventClass = 0;
2047 uint32_t retEventDataSize = 0;
2048 uint8_t retEventData[payloadLength] = {0};
2049 uint32_t retEventDataIntegrityChecksum = 0;
2050
Andrew Jefferye5f12532024-10-01 12:18:49 +09302051 pldm_msgbuf_extract_uint8(buf, retCompletionCode);
2052 pldm_msgbuf_extract_uint8(buf, retTid);
2053 pldm_msgbuf_extract_uint16(buf, retEventId);
2054 pldm_msgbuf_extract_uint32(buf, retNextDataTransferHandle);
2055 pldm_msgbuf_extract_uint8(buf, retTransferFlag);
2056 pldm_msgbuf_extract_uint8(buf, retEventClass);
2057 pldm_msgbuf_extract_uint32(buf, retEventDataSize);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +00002058 rc = pldm_msgbuf_extract_array_uint8(buf, retEventDataSize, retEventData,
2059 sizeof(retEventData));
2060 ASSERT_EQ(rc, 0);
Andrew Jefferye5f12532024-10-01 12:18:49 +09302061 pldm_msgbuf_extract_uint32(buf, retEventDataIntegrityChecksum);
Andrew Jefferya1896962025-03-03 21:41:25 +10302062 ASSERT_EQ(pldm_msgbuf_complete(buf), 0);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002063
2064 EXPECT_EQ(rc, PLDM_SUCCESS);
2065 EXPECT_EQ(retCompletionCode, completionCode);
2066 EXPECT_EQ(retTid, tId);
2067 EXPECT_EQ(retEventId, eventId);
2068 EXPECT_EQ(retNextDataTransferHandle, nextDataTransferHandle);
2069 EXPECT_EQ(retTransferFlag, transferFlag);
2070 EXPECT_EQ(retEventClass, eventClass);
2071 EXPECT_EQ(retEventDataSize, eventDataSize);
2072 EXPECT_EQ(retEventDataIntegrityChecksum, eventDataIntegrityChecksum);
2073 EXPECT_EQ(0, memcmp(pEventData, retEventData, eventDataSize));
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002074}
2075
2076TEST(PollForPlatformEventMessage, testGoodEncodeResposeP2)
2077{
2078 uint8_t completionCode = PLDM_SUCCESS;
2079 uint8_t instance_id = 0;
2080 uint8_t tId = 0x9;
2081 uint16_t eventId = 0x0000;
2082 constexpr size_t payloadLength =
2083 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES;
2084
2085 std::array<uint8_t, hdrSize + payloadLength> responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302086 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002087 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2088
2089 auto rc = encode_poll_for_platform_event_message_resp(
2090 instance_id, completionCode, tId, eventId, 0, 0, 0, 0, NULL, 0,
2091 response, payloadLength);
2092 EXPECT_EQ(rc, PLDM_SUCCESS);
2093
Andrew Jefferya1896962025-03-03 21:41:25 +10302094 PLDM_MSGBUF_DEFINE_P(buf);
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09302095 rc = pldm_msgbuf_init_errno(
Andrew Jefferyc8df31c2024-05-21 16:47:43 +09302096 buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES,
2097 response->payload, payloadLength);
Andrew Jefferya1896962025-03-03 21:41:25 +10302098 ASSERT_EQ(rc, 0);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002099
2100 uint8_t retCompletionCode;
2101 uint8_t retTid = 0;
2102 uint16_t retEventId = 0;
2103
Andrew Jefferye5f12532024-10-01 12:18:49 +09302104 pldm_msgbuf_extract_uint8(buf, retCompletionCode);
2105 pldm_msgbuf_extract_uint8(buf, retTid);
2106 pldm_msgbuf_extract_uint16(buf, retEventId);
Andrew Jefferya1896962025-03-03 21:41:25 +10302107 ASSERT_EQ(pldm_msgbuf_complete(buf), 0);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002108
2109 EXPECT_EQ(rc, PLDM_SUCCESS);
2110 EXPECT_EQ(retCompletionCode, completionCode);
2111 EXPECT_EQ(retTid, tId);
2112 EXPECT_EQ(retEventId, eventId);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002113}
2114
2115TEST(PollForPlatformEventMessage, testGoodEncodeResposeP3)
2116{
2117 uint8_t completionCode = PLDM_SUCCESS;
2118 uint8_t instance_id = 0;
2119 uint8_t tId = 0x9;
2120 uint16_t eventId = 0xffff;
2121 constexpr size_t payloadLength =
2122 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES;
2123
2124 std::array<uint8_t, hdrSize + payloadLength> responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302125 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002126 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2127
2128 auto rc = encode_poll_for_platform_event_message_resp(
2129 instance_id, completionCode, tId, eventId, 0, 0, 0, 0, NULL, 0,
2130 response, payloadLength);
2131 EXPECT_EQ(rc, PLDM_SUCCESS);
2132
Andrew Jefferya1896962025-03-03 21:41:25 +10302133 PLDM_MSGBUF_DEFINE_P(buf);
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09302134 rc = pldm_msgbuf_init_errno(
Andrew Jefferyc8df31c2024-05-21 16:47:43 +09302135 buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES,
2136 response->payload, payloadLength);
Andrew Jefferya1896962025-03-03 21:41:25 +10302137 ASSERT_EQ(rc, 0);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002138
2139 uint8_t retCompletionCode;
2140 uint8_t retTid = 0;
2141 uint16_t retEventId = 0;
2142
Andrew Jefferye5f12532024-10-01 12:18:49 +09302143 pldm_msgbuf_extract_uint8(buf, retCompletionCode);
2144 pldm_msgbuf_extract_uint8(buf, retTid);
2145 pldm_msgbuf_extract_uint16(buf, retEventId);
Andrew Jefferya1896962025-03-03 21:41:25 +10302146 ASSERT_EQ(pldm_msgbuf_complete(buf), PLDM_SUCCESS);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002147
2148 EXPECT_EQ(rc, PLDM_SUCCESS);
2149 EXPECT_EQ(retCompletionCode, completionCode);
2150 EXPECT_EQ(retTid, tId);
2151 EXPECT_EQ(retEventId, eventId);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002152}
2153
2154TEST(PollForPlatformEventMessage, testGoodEncodeResposeP4)
2155{
2156 uint8_t completionCode = PLDM_SUCCESS;
2157 uint8_t instance_id = 0;
2158 uint8_t tId = 0x9;
2159 uint16_t eventId = 0x1;
2160 uint32_t nextDataTransferHandle = 0xffff;
2161 uint8_t transferFlag = PLDM_END;
2162 uint8_t eventClass = 0x5;
2163 constexpr uint32_t eventDataSize = 0;
2164 uint32_t eventDataIntegrityChecksum = 0x11223344;
2165 size_t payloadLength =
2166 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_RESP_BYTES + eventDataSize + 4;
2167
2168 std::array<uint8_t, hdrSize +
2169 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_RESP_BYTES +
2170 eventDataSize + 4>
2171 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302172 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002173 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2174
2175 auto rc = encode_poll_for_platform_event_message_resp(
2176 instance_id, completionCode, tId, eventId, nextDataTransferHandle,
2177 transferFlag, eventClass, eventDataSize, NULL,
2178 eventDataIntegrityChecksum, response, payloadLength);
2179 EXPECT_EQ(rc, PLDM_SUCCESS);
2180
Andrew Jefferya1896962025-03-03 21:41:25 +10302181 PLDM_MSGBUF_DEFINE_P(buf);
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09302182 rc = pldm_msgbuf_init_errno(
Andrew Jefferyc8df31c2024-05-21 16:47:43 +09302183 buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES,
2184 response->payload, payloadLength);
Andrew Jefferya1896962025-03-03 21:41:25 +10302185 ASSERT_EQ(rc, 0);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002186
2187 uint8_t retCompletionCode;
2188 uint8_t retTid = 0;
2189 uint16_t retEventId = 0;
2190 uint32_t retNextDataTransferHandle = 0;
2191 uint8_t retTransferFlag = 0;
2192 uint8_t retEventClass = 0;
2193 uint32_t retEventDataSize = 0;
2194 uint32_t retEventDataIntegrityChecksum = 0;
2195
Andrew Jefferye5f12532024-10-01 12:18:49 +09302196 pldm_msgbuf_extract_uint8(buf, retCompletionCode);
2197 pldm_msgbuf_extract_uint8(buf, retTid);
2198 pldm_msgbuf_extract_uint16(buf, retEventId);
2199 pldm_msgbuf_extract_uint32(buf, retNextDataTransferHandle);
2200 pldm_msgbuf_extract_uint8(buf, retTransferFlag);
2201 pldm_msgbuf_extract_uint8(buf, retEventClass);
2202 pldm_msgbuf_extract_uint32(buf, retEventDataSize);
2203 pldm_msgbuf_extract_uint32(buf, retEventDataIntegrityChecksum);
Andrew Jefferya1896962025-03-03 21:41:25 +10302204 EXPECT_EQ(pldm_msgbuf_complete(buf), 0);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002205
2206 EXPECT_EQ(rc, PLDM_SUCCESS);
2207 EXPECT_EQ(retCompletionCode, completionCode);
2208 EXPECT_EQ(retTid, tId);
2209 EXPECT_EQ(retEventId, eventId);
2210 EXPECT_EQ(retNextDataTransferHandle, nextDataTransferHandle);
2211 EXPECT_EQ(retTransferFlag, transferFlag);
2212 EXPECT_EQ(retEventClass, eventClass);
2213 EXPECT_EQ(retEventDataSize, eventDataSize);
2214 EXPECT_EQ(retEventDataIntegrityChecksum, eventDataIntegrityChecksum);
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002215}
2216
2217TEST(PollForPlatformEventMessage, testBadEncodeResponse)
2218{
2219 uint8_t completionCode = PLDM_SUCCESS;
2220 uint8_t instance_id = 0;
2221 uint8_t tId = 0x9;
2222 uint16_t eventId = 0x1;
2223 uint32_t nextDataTransferHandle = 0xffff;
2224 uint8_t transferFlag = 0x0;
2225 uint8_t eventClass = 0x5;
2226 const uint32_t eventDataSize = 0;
2227 uint32_t eventDataIntegrityChecksum = 0x11223344;
2228 constexpr size_t payloadLength =
2229 PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_RESP_BYTES + eventDataSize + 4;
2230
2231 std::array<uint8_t, hdrSize + payloadLength> responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302232 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen8eb20f22022-11-16 22:34:55 +07002233 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2234
2235 auto rc = encode_poll_for_platform_event_message_resp(
2236 instance_id, completionCode, tId, eventId, nextDataTransferHandle,
2237 transferFlag, eventClass, eventDataSize, NULL,
2238 eventDataIntegrityChecksum, NULL, payloadLength);
2239
2240 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2241
2242 rc = encode_poll_for_platform_event_message_resp(
2243 instance_id, completionCode, tId, eventId, nextDataTransferHandle,
2244 transferFlag, eventClass, 1, NULL, eventDataIntegrityChecksum, response,
2245 payloadLength);
2246 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2247}
2248
Andrew Jeffery9c766792022-08-10 23:12:49 +09302249TEST(PlatformEventMessage, testGoodStateSensorDecodeRequest)
2250{
2251 std::array<uint8_t,
2252 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
2253 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES>
2254 requestMsg{};
2255
2256 uint8_t retFormatVersion = 0;
2257 uint8_t retTid = 0;
2258 uint8_t retEventClass = 0;
2259 size_t retEventDataOffset = 0;
2260
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302261 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302262 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
2263 struct pldm_platform_event_message_req* request =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302264 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302265 reinterpret_cast<struct pldm_platform_event_message_req*>(req->payload);
2266
2267 uint8_t formatVersion = 0x01;
2268 uint8_t tid = 0x02;
2269 // Sensor Event
2270 uint8_t eventClass = 0x00;
2271
2272 request->format_version = formatVersion;
2273 request->tid = tid;
2274 request->event_class = eventClass;
2275 size_t eventDataOffset =
2276 sizeof(formatVersion) + sizeof(tid) + sizeof(eventClass);
2277
2278 auto rc = decode_platform_event_message_req(
2279 req, requestMsg.size() - hdrSize, &retFormatVersion, &retTid,
2280 &retEventClass, &retEventDataOffset);
2281
2282 EXPECT_EQ(rc, PLDM_SUCCESS);
2283 EXPECT_EQ(retFormatVersion, formatVersion);
2284 EXPECT_EQ(retTid, tid);
2285 EXPECT_EQ(retEventClass, eventClass);
2286 EXPECT_EQ(retEventDataOffset, eventDataOffset);
2287}
2288
2289TEST(PlatformEventMessage, testBadDecodeRequest)
2290{
2291 const struct pldm_msg* msg = NULL;
2292 std::array<uint8_t,
2293 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
2294 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
2295 requestMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302296 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302297 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
2298 uint8_t retFormatVersion;
2299 uint8_t retTid = 0;
2300 uint8_t retEventClass = 0;
2301 size_t retEventDataOffset;
2302
2303 auto rc = decode_platform_event_message_req(msg, sizeof(*msg), NULL, NULL,
2304 NULL, NULL);
2305 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2306
2307 rc = decode_platform_event_message_req(
2308 req,
2309 requestMsg.size() - hdrSize -
2310 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES,
2311 &retFormatVersion, &retTid, &retEventClass, &retEventDataOffset);
2312 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2313}
2314
2315TEST(PlatformEventMessage, testGoodEncodeResponse)
2316{
2317 std::array<uint8_t,
2318 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
2319 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
2320 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302321 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302322 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2323 uint8_t completionCode = 0;
2324 uint8_t instanceId = 0x01;
2325 uint8_t platformEventStatus = 0x01;
2326
2327 auto rc = encode_platform_event_message_resp(instanceId, PLDM_SUCCESS,
2328 platformEventStatus, response);
2329
2330 EXPECT_EQ(rc, PLDM_SUCCESS);
2331 EXPECT_EQ(completionCode, response->payload[0]);
2332 EXPECT_EQ(platformEventStatus, response->payload[1]);
2333}
2334
2335TEST(PlatformEventMessage, testBadEncodeResponse)
2336{
2337 auto rc = encode_platform_event_message_resp(0, PLDM_SUCCESS, 1, NULL);
2338 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2339}
2340
2341TEST(PlatformEventMessage, testGoodEncodeRequest)
2342{
John Chungb43a7782024-09-26 22:04:27 +08002343 static constexpr const uint8_t formatVersion = 0x01;
2344 static constexpr const uint8_t eventClass = 0x00;
2345 static constexpr const uint8_t eventData = 34;
2346 static constexpr const uint8_t Tid = 0x03;
2347 struct pldm_platform_event_message_req req;
Andrew Jefferya1896962025-03-03 21:41:25 +10302348 PLDM_MSGBUF_DEFINE_P(buf);
John Chungb43a7782024-09-26 22:04:27 +08002349 size_t len;
2350 void* data;
Andrew Jeffery9c766792022-08-10 23:12:49 +09302351
John Chungb43a7782024-09-26 22:04:27 +08002352 PLDM_MSG_DEFINE_P(request, PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
2353 sizeof(eventData));
Andrew Jeffery9c766792022-08-10 23:12:49 +09302354
John Chungb43a7782024-09-26 22:04:27 +08002355 /* Test with the minimum event type value */
Andrew Jeffery9c766792022-08-10 23:12:49 +09302356 auto rc = encode_platform_event_message_req(
John Chungb43a7782024-09-26 22:04:27 +08002357 0, formatVersion, Tid, eventClass, &eventData, sizeof(eventData),
2358 request, sizeof(eventData) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
2359 ASSERT_EQ(rc, PLDM_SUCCESS);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302360
John Chungb43a7782024-09-26 22:04:27 +08002361 rc = pldm_msgbuf_init_errno(
2362 buf, PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES, request->payload,
2363 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES + sizeof(eventData));
2364 ASSERT_EQ(rc, 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302365
John Chungb43a7782024-09-26 22:04:27 +08002366 pldm_msgbuf_extract_uint8(buf, req.format_version);
2367 pldm_msgbuf_extract_uint8(buf, req.tid);
2368 pldm_msgbuf_extract_uint8(buf, req.event_class);
2369 data = nullptr;
2370 pldm_msgbuf_span_remaining(buf, &data, &len);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10302371 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
John Chungb43a7782024-09-26 22:04:27 +08002372
2373 EXPECT_EQ(formatVersion, req.format_version);
2374 EXPECT_EQ(Tid, req.tid);
2375 EXPECT_EQ(eventClass, req.event_class);
2376 ASSERT_EQ(sizeof(eventData), len);
2377 EXPECT_EQ(0, memcmp(&eventData, data, len));
2378
2379 /* Test with the maximum event type value */
2380 rc = encode_platform_event_message_req(
2381 0, formatVersion, Tid, PLDM_CPER_EVENT, &eventData, sizeof(eventData),
2382 request, sizeof(eventData) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
2383 ASSERT_EQ(rc, PLDM_SUCCESS);
2384
2385 rc = pldm_msgbuf_init_errno(
2386 buf, PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES, request->payload,
2387 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES + sizeof(eventData));
2388 ASSERT_EQ(rc, 0);
2389
2390 pldm_msgbuf_extract_uint8(buf, req.format_version);
2391 pldm_msgbuf_extract_uint8(buf, req.tid);
2392 pldm_msgbuf_extract_uint8(buf, req.event_class);
2393
2394 data = nullptr;
2395 pldm_msgbuf_span_remaining(buf, &data, &len);
Andrew Jeffery70d21c92025-03-05 12:59:42 +10302396 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
John Chungb43a7782024-09-26 22:04:27 +08002397
2398 EXPECT_EQ(formatVersion, req.format_version);
2399 EXPECT_EQ(Tid, req.tid);
2400 EXPECT_EQ(PLDM_CPER_EVENT, req.event_class);
2401 ASSERT_EQ(sizeof(eventData), len);
2402 EXPECT_EQ(0, memcmp(&eventData, data, len));
Andrew Jeffery9c766792022-08-10 23:12:49 +09302403}
2404
2405TEST(PlatformEventMessage, testBadEncodeRequest)
2406{
2407 uint8_t Tid = 0x03;
2408 uint8_t eventClass = 0x00;
2409 uint8_t eventData = 34;
Andrew Jeffery9c766792022-08-10 23:12:49 +09302410 uint8_t formatVersion = 0x01;
John Chungb43a7782024-09-26 22:04:27 +08002411 static constexpr const size_t payloadLen =
2412 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES + sizeof(eventData);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302413
John Chungb43a7782024-09-26 22:04:27 +08002414 PLDM_MSG_DEFINE_P(request, payloadLen);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302415
2416 auto rc = encode_platform_event_message_req(
John Chungb43a7782024-09-26 22:04:27 +08002417 0, formatVersion, Tid, eventClass, &eventData, sizeof(eventData),
2418 nullptr, payloadLen);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302419 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
John Chungb43a7782024-09-26 22:04:27 +08002420
2421 rc = encode_platform_event_message_req(0, 0, Tid, eventClass, &eventData,
2422 sizeof(eventData), request,
2423 payloadLen);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302424 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
John Chungb43a7782024-09-26 22:04:27 +08002425
Andrew Jeffery9c766792022-08-10 23:12:49 +09302426 rc = encode_platform_event_message_req(0, formatVersion, Tid, eventClass,
2427 nullptr, 0, request, payloadLen);
2428 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
John Chungb43a7782024-09-26 22:04:27 +08002429
2430 rc = encode_platform_event_message_req(0, formatVersion, Tid, eventClass,
2431 &eventData, sizeof(eventData),
2432 request, 0);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302433 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
John Chungb43a7782024-09-26 22:04:27 +08002434
2435 rc = encode_platform_event_message_req(
2436 0, formatVersion, Tid, PLDM_CPER_EVENT + 1, &eventData,
2437 sizeof(eventData), request, payloadLen);
2438 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302439}
2440
2441TEST(PlatformEventMessage, testGoodDecodeResponse)
2442{
2443 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
2444 responseMsg{};
2445
2446 uint8_t completionCode = PLDM_SUCCESS;
2447 uint8_t platformEventStatus = 0x01;
2448
2449 uint8_t retcompletionCode;
2450 uint8_t retplatformEventStatus;
2451
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302452 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302453 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2454 struct pldm_platform_event_message_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302455 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302456 reinterpret_cast<struct pldm_platform_event_message_resp*>(
2457 response->payload);
2458
2459 resp->completion_code = completionCode;
2460 resp->platform_event_status = platformEventStatus;
2461
2462 auto rc = decode_platform_event_message_resp(
2463 response, responseMsg.size() - hdrSize, &retcompletionCode,
2464 &retplatformEventStatus);
2465
2466 EXPECT_EQ(rc, PLDM_SUCCESS);
2467 EXPECT_EQ(completionCode, retcompletionCode);
2468 EXPECT_EQ(platformEventStatus, retplatformEventStatus);
2469}
2470
2471TEST(PlatformEventMessage, testBadDecodeResponse)
2472{
2473 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
2474 responseMsg{};
2475
2476 uint8_t completionCode = PLDM_SUCCESS;
2477 uint8_t platformEventStatus = 0x01;
2478
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302479 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302480 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2481 struct pldm_platform_event_message_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302482 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302483 reinterpret_cast<struct pldm_platform_event_message_resp*>(
2484 response->payload);
2485 resp->completion_code = completionCode;
2486 resp->platform_event_status = platformEventStatus;
2487
2488 auto rc = decode_platform_event_message_resp(
2489 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr);
2490
2491 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2492
2493 rc = decode_platform_event_message_resp(
2494 response, responseMsg.size() - hdrSize - 1, &completionCode,
2495 &platformEventStatus);
2496
2497 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2498}
2499
2500TEST(PlatformEventMessage, testGoodSensorEventDataDecodeRequest)
2501{
2502 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH +
2503 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
2504 eventDataArr{};
2505 uint16_t sensorId = 0x1234;
2506 uint8_t sensorEventClassType = PLDM_SENSOR_OP_STATE;
2507
2508 struct pldm_sensor_event_data* eventData =
2509 (struct pldm_sensor_event_data*)eventDataArr.data();
2510 eventData->sensor_id = sensorId;
2511 eventData->sensor_event_class_type = sensorEventClassType;
2512
2513 size_t retSensorOpDataOffset;
2514 uint16_t retSensorId = 0;
2515 uint8_t retSensorEventClassType;
2516 size_t sensorOpDataOffset = sizeof(sensorId) + sizeof(sensorEventClassType);
2517 auto rc = decode_sensor_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302518 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302519 reinterpret_cast<uint8_t*>(eventData), eventDataArr.size(),
2520 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
2521 EXPECT_EQ(rc, PLDM_SUCCESS);
2522 EXPECT_EQ(retSensorId, sensorId);
2523 EXPECT_EQ(retSensorEventClassType, sensorEventClassType);
2524 EXPECT_EQ(retSensorOpDataOffset, sensorOpDataOffset);
2525}
2526
2527TEST(PlatformEventMessage, testBadSensorEventDataDecodeRequest)
2528{
2529
2530 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH +
2531 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
2532 eventDataArr{};
2533
2534 struct pldm_sensor_event_data* eventData =
2535 (struct pldm_sensor_event_data*)eventDataArr.data();
2536
2537 size_t retSensorOpDataOffset;
2538 uint16_t retSensorId = 0;
2539 uint8_t retSensorEventClassType;
2540 auto rc = decode_sensor_event_data(NULL, eventDataArr.size(), &retSensorId,
2541 &retSensorEventClassType,
2542 &retSensorOpDataOffset);
2543 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2544
2545 rc = decode_sensor_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302546 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302547 reinterpret_cast<uint8_t*>(eventDataArr.data()),
2548 eventDataArr.size() -
2549 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH,
2550 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
2551 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2552
2553 eventData->sensor_event_class_type = PLDM_SENSOR_OP_STATE;
2554
2555 rc = decode_sensor_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302556 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302557 reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
2558 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
2559 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2560
2561 eventData->sensor_event_class_type = PLDM_STATE_SENSOR_STATE;
2562 rc = decode_sensor_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302563 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302564 reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
2565 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
2566 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2567
2568 eventData->sensor_event_class_type = PLDM_NUMERIC_SENSOR_STATE;
2569 rc = decode_sensor_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302570 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302571 reinterpret_cast<uint8_t*>(eventDataArr.data()),
2572 eventDataArr.size() + 1, &retSensorId, &retSensorEventClassType,
2573 &retSensorOpDataOffset);
2574 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2575}
2576
Dung Cao7c250342022-11-16 22:40:37 +07002577TEST(PlatformEventMessage, testGoodPldmMsgPollEventDataDecodeRequest)
2578{
2579 std::array<uint8_t, PLDM_PLATFORM_EVENT_MESSAGE_FORMAT_VERSION +
2580 PLDM_PLATFORM_EVENT_MESSAGE_EVENT_ID +
2581 PLDM_PLATFORM_EVENT_MESSAGE_TRANFER_HANDLE>
2582 eventData{
2583 0x1, // version
2584 0x88, 0x77, // Event Id
Manojkiran Eda9e3a5d42024-06-17 16:06:42 +05302585 0x44, 0x33, 0x22, 0x11 // Transfer Handle
Dung Cao7c250342022-11-16 22:40:37 +07002586 };
2587
2588 uint8_t formatVersion = 0x01;
2589 uint16_t eventID = 0x7788;
2590 uint32_t dataTransferHandle = 0x11223344;
2591
Thu Nguyen7739d122024-07-26 11:36:39 +00002592 struct pldm_message_poll_event poll_event = {};
Dung Cao7c250342022-11-16 22:40:37 +07002593
2594 auto rc = decode_pldm_message_poll_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302595 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao7c250342022-11-16 22:40:37 +07002596 reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(),
Thu Nguyen7739d122024-07-26 11:36:39 +00002597 &poll_event);
Dung Cao7c250342022-11-16 22:40:37 +07002598
2599 EXPECT_EQ(rc, PLDM_SUCCESS);
Thu Nguyen7739d122024-07-26 11:36:39 +00002600 EXPECT_EQ(poll_event.format_version, formatVersion);
2601 EXPECT_EQ(poll_event.event_id, eventID);
2602 EXPECT_EQ(poll_event.data_transfer_handle, dataTransferHandle);
Dung Cao7c250342022-11-16 22:40:37 +07002603}
2604
2605TEST(PlatformEventMessage, testBadPldmMsgPollEventDataDecodeRequest)
2606{
2607
2608 std::array<uint8_t, PLDM_PLATFORM_EVENT_MESSAGE_FORMAT_VERSION +
2609 PLDM_PLATFORM_EVENT_MESSAGE_EVENT_ID +
2610 PLDM_PLATFORM_EVENT_MESSAGE_TRANFER_HANDLE>
2611 eventData{
2612 0x1, // version
2613 0x88, 0x77, // Event Id
Manojkiran Eda9e3a5d42024-06-17 16:06:42 +05302614 0x44, 0x33, 0x22, 0x11 // Transfer Handle
Dung Cao7c250342022-11-16 22:40:37 +07002615 };
2616
Thu Nguyen7739d122024-07-26 11:36:39 +00002617 struct pldm_message_poll_event poll_event = {};
Dung Cao7c250342022-11-16 22:40:37 +07002618
Thu Nguyen7739d122024-07-26 11:36:39 +00002619 auto rc = decode_pldm_message_poll_event_data(NULL, eventData.size(),
2620 &poll_event);
2621 EXPECT_EQ(rc, -EINVAL);
2622
2623 rc = decode_pldm_message_poll_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302624 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen7739d122024-07-26 11:36:39 +00002625 reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(), NULL);
2626 EXPECT_EQ(rc, -EINVAL);
Dung Cao7c250342022-11-16 22:40:37 +07002627
2628 rc = decode_pldm_message_poll_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302629 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao7c250342022-11-16 22:40:37 +07002630 reinterpret_cast<uint8_t*>(eventData.data()), eventData.size() - 1,
Thu Nguyen7739d122024-07-26 11:36:39 +00002631 &poll_event);
2632 EXPECT_EQ(rc, -EOVERFLOW);
Dung Cao7c250342022-11-16 22:40:37 +07002633
2634 // Event id is 0x0000
2635 eventData[1] = 0x00;
2636 eventData[2] = 0x00;
2637 rc = decode_pldm_message_poll_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302638 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao7c250342022-11-16 22:40:37 +07002639 reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(),
Thu Nguyen7739d122024-07-26 11:36:39 +00002640 &poll_event);
Dung Cao7c250342022-11-16 22:40:37 +07002641
Thu Nguyen7739d122024-07-26 11:36:39 +00002642 EXPECT_EQ(rc, -EPROTO);
Dung Cao7c250342022-11-16 22:40:37 +07002643
2644 // Event id is 0xffff
2645 eventData[1] = 0xff;
2646 eventData[2] = 0xff;
2647 rc = decode_pldm_message_poll_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302648 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Dung Cao7c250342022-11-16 22:40:37 +07002649 reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(),
Thu Nguyen7739d122024-07-26 11:36:39 +00002650 &poll_event);
Dung Cao7c250342022-11-16 22:40:37 +07002651
Thu Nguyen7739d122024-07-26 11:36:39 +00002652 EXPECT_EQ(rc, -EPROTO);
Dung Cao7c250342022-11-16 22:40:37 +07002653}
2654
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +09302655#ifdef LIBPLDM_API_TESTING
Dung Cao7c250342022-11-16 22:40:37 +07002656TEST(PlatformEventMessage, testGoodPldmMsgPollEventDataEncode)
2657{
2658 std::array<uint8_t, PLDM_PLATFORM_EVENT_MESSAGE_FORMAT_VERSION +
2659 PLDM_PLATFORM_EVENT_MESSAGE_EVENT_ID +
2660 PLDM_PLATFORM_EVENT_MESSAGE_TRANFER_HANDLE>
2661 eventData{};
2662
Thu Nguyen7739d122024-07-26 11:36:39 +00002663 struct pldm_message_poll_event poll_event = {};
2664 poll_event.format_version = 0x01;
2665 poll_event.event_id = 0x7788;
2666 poll_event.data_transfer_handle = 0x11223344;
Dung Cao7c250342022-11-16 22:40:37 +07002667
2668 int rc = encode_pldm_message_poll_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302669 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen7739d122024-07-26 11:36:39 +00002670 &poll_event, reinterpret_cast<uint8_t*>(eventData.data()),
2671 eventData.size());
Dung Cao7c250342022-11-16 22:40:37 +07002672
2673 EXPECT_EQ(rc, PLDM_SUCCESS);
2674
Andrew Jefferya1896962025-03-03 21:41:25 +10302675 PLDM_MSGBUF_DEFINE_P(buf);
Dung Cao7c250342022-11-16 22:40:37 +07002676
Andrew Jeffery830c1eb2024-10-04 10:48:10 +09302677 rc = pldm_msgbuf_init_errno(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302678 buf, PLDM_MSG_POLL_EVENT_LENGTH,
2679 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2680 reinterpret_cast<uint8_t*>(eventData.data()), eventData.size());
Andrew Jefferya1896962025-03-03 21:41:25 +10302681 ASSERT_EQ(rc, 0);
Dung Cao7c250342022-11-16 22:40:37 +07002682
2683 uint8_t retFormatVersion;
2684 uint16_t reteventID;
2685 uint32_t retDataTransferHandle;
2686
Andrew Jefferya1896962025-03-03 21:41:25 +10302687 pldm_msgbuf_extract_uint8(buf, retFormatVersion);
2688 pldm_msgbuf_extract_uint16(buf, reteventID);
2689 pldm_msgbuf_extract_uint32(buf, retDataTransferHandle);
2690 ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), PLDM_SUCCESS);
2691
Thu Nguyen7739d122024-07-26 11:36:39 +00002692 EXPECT_EQ(retFormatVersion, poll_event.format_version);
2693 EXPECT_EQ(reteventID, poll_event.event_id);
2694 EXPECT_EQ(retDataTransferHandle, poll_event.data_transfer_handle);
Dung Cao7c250342022-11-16 22:40:37 +07002695}
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +09302696#endif
Dung Cao7c250342022-11-16 22:40:37 +07002697
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +09302698#ifdef LIBPLDM_API_TESTING
Dung Cao7c250342022-11-16 22:40:37 +07002699TEST(PlatformEventMessage, testBadPldmMsgPollEventDataEncode)
2700{
2701 std::array<uint8_t, PLDM_PLATFORM_EVENT_MESSAGE_FORMAT_VERSION +
2702 PLDM_PLATFORM_EVENT_MESSAGE_EVENT_ID +
2703 PLDM_PLATFORM_EVENT_MESSAGE_TRANFER_HANDLE>
2704 eventData{};
2705
Thu Nguyen7739d122024-07-26 11:36:39 +00002706 struct pldm_message_poll_event poll_event = {};
2707 poll_event.format_version = 0x01;
2708 poll_event.event_id = 0x7788;
2709 poll_event.data_transfer_handle = 0x11223344;
Dung Cao7c250342022-11-16 22:40:37 +07002710
Thu Nguyen7739d122024-07-26 11:36:39 +00002711 int rc = encode_pldm_message_poll_event_data(&poll_event, NULL,
2712 eventData.size());
2713 EXPECT_EQ(rc, -EINVAL);
Dung Cao7c250342022-11-16 22:40:37 +07002714
Thu Nguyen7739d122024-07-26 11:36:39 +00002715 poll_event.event_id = 0x0000;
Dung Cao7c250342022-11-16 22:40:37 +07002716 rc = encode_pldm_message_poll_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302717 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen7739d122024-07-26 11:36:39 +00002718 &poll_event, reinterpret_cast<uint8_t*>(eventData.data()),
2719 eventData.size());
2720 EXPECT_EQ(rc, -EPROTO);
Dung Cao7c250342022-11-16 22:40:37 +07002721
Thu Nguyen7739d122024-07-26 11:36:39 +00002722 poll_event.event_id = 0xffff;
Dung Cao7c250342022-11-16 22:40:37 +07002723 rc = encode_pldm_message_poll_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302724 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyen7739d122024-07-26 11:36:39 +00002725 &poll_event, reinterpret_cast<uint8_t*>(eventData.data()),
2726 eventData.size());
2727 EXPECT_EQ(rc, -EPROTO);
Dung Cao7c250342022-11-16 22:40:37 +07002728}
Andrew Jeffery9d2a1c62023-06-05 13:02:16 +09302729#endif
Dung Cao7c250342022-11-16 22:40:37 +07002730
Andrew Jeffery9c766792022-08-10 23:12:49 +09302731TEST(PlatformEventMessage, testGoodSensorOpEventDataDecodeRequest)
2732{
2733 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
2734 eventDataArr{};
2735
2736 struct pldm_sensor_event_sensor_op_state* sensorData =
2737 (struct pldm_sensor_event_sensor_op_state*)eventDataArr.data();
2738 uint8_t presentState = PLDM_SENSOR_ENABLED;
2739 uint8_t previousState = PLDM_SENSOR_INITIALIZING;
2740 sensorData->present_op_state = presentState;
2741 sensorData->previous_op_state = previousState;
2742
2743 uint8_t retPresentState;
2744 uint8_t retPreviousState;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302745 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302746 auto rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData),
2747 eventDataArr.size(), &retPresentState,
2748 &retPreviousState);
2749 EXPECT_EQ(rc, PLDM_SUCCESS);
2750 EXPECT_EQ(retPresentState, presentState);
2751 EXPECT_EQ(retPreviousState, previousState);
2752}
2753
2754TEST(PlatformEventMessage, testBadSensorOpEventDataDecodeRequest)
2755{
2756 uint8_t presentOpState;
2757 uint8_t previousOpState;
2758 size_t sensorDataLength = PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH;
2759 auto rc = decode_sensor_op_data(NULL, sensorDataLength, &presentOpState,
2760 &previousOpState);
2761 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2762
2763 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
2764 sensorData{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302765 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302766 rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
2767 sensorDataLength + 1, &presentOpState,
2768 &previousOpState);
Andrew Jeffery248b5ab2025-02-21 12:35:14 +10302769 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302770
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302771 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302772 rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
2773 sensorDataLength, nullptr, &previousOpState);
2774 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2775}
2776
2777TEST(PlatformEventMessage, testGoodSensorStateEventDataDecodeRequest)
2778{
2779 std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
2780 eventDataArr{};
2781
2782 struct pldm_sensor_event_state_sensor_state* sensorData =
2783 (struct pldm_sensor_event_state_sensor_state*)eventDataArr.data();
2784 uint8_t sensorOffset = 0x02;
2785 uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
2786 uint8_t previousEventState = PLDM_SENSOR_INTEST;
2787 sensorData->sensor_offset = sensorOffset;
2788 sensorData->event_state = eventState;
2789 sensorData->previous_event_state = previousEventState;
2790
2791 uint8_t retSensorOffset;
2792 uint8_t retEventState;
2793 uint8_t retPreviousState;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302794 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302795 auto rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
2796 eventDataArr.size(), &retSensorOffset,
2797 &retEventState, &retPreviousState);
2798 EXPECT_EQ(rc, PLDM_SUCCESS);
2799 EXPECT_EQ(retSensorOffset, sensorOffset);
2800 EXPECT_EQ(retEventState, eventState);
2801 EXPECT_EQ(retPreviousState, previousEventState);
2802}
2803
2804TEST(PlatformEventMessage, testBadStateSensorEventDataDecodeRequest)
2805{
2806 uint8_t sensorOffset;
2807 uint8_t eventState;
2808 uint8_t previousEventState;
2809 size_t sensorDataLength = PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH;
2810 auto rc = decode_state_sensor_data(NULL, sensorDataLength, &sensorOffset,
2811 &eventState, &previousEventState);
2812 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2813
2814 std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
2815 sensorData{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302816 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302817 rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
2818 sensorDataLength - 1, &sensorOffset,
2819 &eventState, &previousEventState);
2820 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2821
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302822 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302823 rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
2824 sensorDataLength, &sensorOffset, nullptr,
2825 &previousEventState);
2826 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2827}
2828
2829TEST(PlatformEventMessage, testGoodNumericSensorEventDataDecodeRequest)
2830{
2831 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
2832 eventDataArr{};
2833 struct pldm_sensor_event_numeric_sensor_state* sensorData =
2834 (struct pldm_sensor_event_numeric_sensor_state*)eventDataArr.data();
2835
2836 size_t sensorDataLength =
2837 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_32BIT_DATA_LENGTH;
2838 uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
2839 uint8_t previousEventState = PLDM_SENSOR_INTEST;
2840 uint8_t sensorDataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
2841 uint32_t presentReading = 305441741;
2842 sensorData->event_state = eventState;
2843 sensorData->previous_event_state = previousEventState;
2844 sensorData->sensor_data_size = sensorDataSize;
Andrew Jeffery92f6c3c2023-04-13 15:50:10 +09302845 {
2846 uint32_t presentReadingLE = htole32(presentReading);
2847 memcpy(&sensorData->present_reading, &presentReadingLE,
2848 sizeof(presentReadingLE));
2849 }
Andrew Jeffery9c766792022-08-10 23:12:49 +09302850
2851 uint8_t retEventState;
2852 uint8_t retPreviousEventState;
2853 uint8_t retSensorDataSize;
2854 uint32_t retPresentReading;
2855
2856 auto rc = decode_numeric_sensor_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302857 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302858 reinterpret_cast<uint8_t*>(sensorData), sensorDataLength,
2859 &retEventState, &retPreviousEventState, &retSensorDataSize,
2860 &retPresentReading);
2861 EXPECT_EQ(rc, PLDM_SUCCESS);
2862 EXPECT_EQ(retEventState, eventState);
2863 EXPECT_EQ(retPreviousEventState, previousEventState);
2864 EXPECT_EQ(retSensorDataSize, sensorDataSize);
2865 EXPECT_EQ(retPresentReading, presentReading);
2866
2867 int16_t presentReadingNew = -31432;
Andrew Jeffery92f6c3c2023-04-13 15:50:10 +09302868 {
2869 int16_t presentReadingNewLE = htole16(presentReadingNew);
2870 memcpy(&sensorData->present_reading, &presentReadingNewLE,
2871 sizeof(presentReadingNewLE));
2872 }
Andrew Jeffery9c766792022-08-10 23:12:49 +09302873 sensorDataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
2874 sensorData->sensor_data_size = sensorDataSize;
2875 sensorDataLength = PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_16BIT_DATA_LENGTH;
2876
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302877 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302878 rc = decode_numeric_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
2879 sensorDataLength, &retEventState,
2880 &retPreviousEventState, &retSensorDataSize,
2881 &retPresentReading);
2882 EXPECT_EQ(rc, PLDM_SUCCESS);
2883 EXPECT_EQ(retEventState, eventState);
2884 EXPECT_EQ(retPreviousEventState, previousEventState);
2885 EXPECT_EQ(retSensorDataSize, sensorDataSize);
2886 EXPECT_EQ(static_cast<int16_t>(retPresentReading), presentReadingNew);
2887}
2888
2889TEST(PlatformEventMessage, testBadNumericSensorEventDataDecodeRequest)
2890{
2891 uint8_t eventState;
2892 uint8_t previousEventState;
2893 uint8_t sensorDataSize;
2894 uint32_t presentReading;
2895 size_t sensorDataLength =
2896 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH;
2897 auto rc = decode_numeric_sensor_data(NULL, sensorDataLength, &eventState,
2898 &previousEventState, &sensorDataSize,
2899 &presentReading);
2900 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2901
2902 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
2903 sensorData{};
2904 rc = decode_numeric_sensor_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302905 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302906 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength - 1,
2907 &eventState, &previousEventState, &sensorDataSize, &presentReading);
Andrew Jeffery248b5ab2025-02-21 12:35:14 +10302908 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302909
2910 struct pldm_sensor_event_numeric_sensor_state* numericSensorData =
2911 (struct pldm_sensor_event_numeric_sensor_state*)sensorData.data();
2912 numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT8;
2913 rc = decode_numeric_sensor_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302914 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302915 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
2916 &eventState, &previousEventState, &sensorDataSize, &presentReading);
Andrew Jeffery248b5ab2025-02-21 12:35:14 +10302917 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302918
2919 numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT16;
2920 rc = decode_numeric_sensor_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302921 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302922 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
2923 &eventState, &previousEventState, &sensorDataSize, &presentReading);
Andrew Jeffery248b5ab2025-02-21 12:35:14 +10302924 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Andrew Jeffery9c766792022-08-10 23:12:49 +09302925}
2926
2927TEST(GetNumericEffecterValue, testGoodEncodeRequest)
2928{
2929 std::vector<uint8_t> requestMsg(hdrSize +
2930 PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES);
2931
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002932 uint16_t effecter_id = 0xab01;
Andrew Jeffery9c766792022-08-10 23:12:49 +09302933
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302934 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302935 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2936
2937 auto rc = encode_get_numeric_effecter_value_req(0, effecter_id, request);
2938
2939 struct pldm_get_numeric_effecter_value_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302940 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302941 reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
2942 request->payload);
2943
2944 EXPECT_EQ(rc, PLDM_SUCCESS);
2945 EXPECT_EQ(effecter_id, le16toh(req->effecter_id));
2946}
2947
2948TEST(GetNumericEffecterValue, testBadEncodeRequest)
2949{
2950 std::vector<uint8_t> requestMsg(
2951 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
2952
2953 auto rc = encode_get_numeric_effecter_value_req(0, 0, nullptr);
2954 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2955}
2956
2957TEST(GetNumericEffecterValue, testGoodDecodeRequest)
2958{
2959 std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
2960 requestMsg{};
2961
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302962 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302963 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2964 struct pldm_get_numeric_effecter_value_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302965 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302966 reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
2967 request->payload);
2968
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002969 uint16_t effecter_id = 0x12ab;
Andrew Jeffery9c766792022-08-10 23:12:49 +09302970 req->effecter_id = htole16(effecter_id);
2971
2972 uint16_t reteffecter_id;
2973
2974 auto rc = decode_get_numeric_effecter_value_req(
2975 request, requestMsg.size() - hdrSize, &reteffecter_id);
2976
2977 EXPECT_EQ(rc, PLDM_SUCCESS);
2978 EXPECT_EQ(effecter_id, reteffecter_id);
2979}
2980
2981TEST(GetNumericEffecterValue, testBadDecodeRequest)
2982{
2983 std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
2984 requestMsg{};
2985
2986 auto rc = decode_get_numeric_effecter_value_req(
2987 nullptr, requestMsg.size() - hdrSize, nullptr);
2988
2989 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2990
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302991 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302992 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2993 struct pldm_set_numeric_effecter_value_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09302994 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09302995 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
2996 request->payload);
2997
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06002998 uint16_t effecter_id = 0x1a;
Andrew Jeffery9c766792022-08-10 23:12:49 +09302999 req->effecter_id = htole16(effecter_id);
3000 uint16_t reteffecter_id;
3001
3002 rc = decode_get_numeric_effecter_value_req(
3003 request, requestMsg.size() - hdrSize - 1, &reteffecter_id);
3004
3005 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3006}
3007
3008TEST(GetNumericEffecterValue, testGoodEncodeResponse)
3009{
3010 uint8_t completionCode = 0;
3011 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
3012 uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
3013 uint32_t pendingValue = 0x12345678;
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06003014 uint32_t presentValue = 0xabcdef11;
Andrew Jefferyf990dcf2023-04-12 20:54:48 +09303015 uint32_t val_pending;
3016 uint32_t val_present;
Andrew Jeffery9c766792022-08-10 23:12:49 +09303017
3018 std::array<uint8_t,
3019 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
3020 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303021 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303022 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3023
3024 auto rc = encode_get_numeric_effecter_value_resp(
3025 0, completionCode, effecter_dataSize, effecter_operState,
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303026 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303027 reinterpret_cast<uint8_t*>(&pendingValue),
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303028 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303029 reinterpret_cast<uint8_t*>(&presentValue), response,
3030 responseMsg.size() - hdrSize);
3031
3032 struct pldm_get_numeric_effecter_value_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303033 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303034 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
3035 response->payload);
3036
Andrew Jefferyf990dcf2023-04-12 20:54:48 +09303037 memcpy(&val_pending, &resp->pending_and_present_values[0],
3038 sizeof(val_pending));
3039 val_pending = le32toh(val_pending);
3040 memcpy(&val_present, &resp->pending_and_present_values[4],
3041 sizeof(val_present));
3042 val_present = le32toh(val_present);
Andrew Jeffery9c766792022-08-10 23:12:49 +09303043
3044 EXPECT_EQ(rc, PLDM_SUCCESS);
3045 EXPECT_EQ(effecter_dataSize, resp->effecter_data_size);
3046 EXPECT_EQ(effecter_operState, resp->effecter_oper_state);
Andrew Jefferyf990dcf2023-04-12 20:54:48 +09303047 EXPECT_EQ(pendingValue, val_pending);
3048 EXPECT_EQ(presentValue, val_present);
Andrew Jeffery9c766792022-08-10 23:12:49 +09303049}
3050
3051TEST(GetNumericEffecterValue, testBadEncodeResponse)
3052{
3053 std::array<uint8_t,
3054 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
3055 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303056 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303057 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3058
3059 uint8_t pendingValue = 0x01;
3060 uint8_t presentValue = 0x02;
3061
3062 auto rc = encode_get_numeric_effecter_value_resp(
3063 0, PLDM_SUCCESS, 0, 0, nullptr, nullptr, nullptr,
3064 responseMsg.size() - hdrSize);
3065 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3066
3067 rc = encode_get_numeric_effecter_value_resp(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303068 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303069 0, PLDM_SUCCESS, 6, 9, reinterpret_cast<uint8_t*>(&pendingValue),
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303070 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303071 reinterpret_cast<uint8_t*>(&presentValue), response,
3072 responseMsg.size() - hdrSize);
3073 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3074
3075 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
3076 uint8_t effecter_operState = EFFECTER_OPER_STATE_FAILED;
3077
3078 rc = encode_get_numeric_effecter_value_resp(
3079 0, PLDM_SUCCESS, effecter_dataSize, effecter_operState,
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303080 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303081 reinterpret_cast<uint8_t*>(&pendingValue),
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303082 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303083 reinterpret_cast<uint8_t*>(&presentValue), response,
3084 responseMsg.size() - hdrSize);
3085 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3086}
3087
3088TEST(GetNumericEffecterValue, testGoodDecodeResponse)
3089{
3090 std::array<uint8_t,
3091 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
3092 responseMsg{};
3093
3094 uint8_t completionCode = 0;
3095 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT16;
3096 uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
3097 uint16_t pendingValue = 0x4321;
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06003098 uint16_t presentValue = 0xdcba;
Andrew Jeffery9c766792022-08-10 23:12:49 +09303099
3100 uint8_t retcompletionCode;
3101 uint8_t reteffecter_dataSize;
3102 uint8_t reteffecter_operState;
3103 uint8_t retpendingValue[2];
3104 uint8_t retpresentValue[2];
3105
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303106 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303107 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3108 struct pldm_get_numeric_effecter_value_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303109 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303110 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
3111 response->payload);
3112
3113 resp->completion_code = completionCode;
3114 resp->effecter_data_size = effecter_dataSize;
3115 resp->effecter_oper_state = effecter_operState;
3116
3117 uint16_t pendingValue_le = htole16(pendingValue);
3118 memcpy(resp->pending_and_present_values, &pendingValue_le,
3119 sizeof(pendingValue_le));
3120 uint16_t presentValue_le = htole16(presentValue);
3121 memcpy(&resp->pending_and_present_values[2], &presentValue_le,
3122 sizeof(presentValue_le));
3123
3124 auto rc = decode_get_numeric_effecter_value_resp(
3125 response, responseMsg.size() - hdrSize, &retcompletionCode,
3126 &reteffecter_dataSize, &reteffecter_operState, retpendingValue,
3127 retpresentValue);
3128
3129 EXPECT_EQ(rc, PLDM_SUCCESS);
3130 EXPECT_EQ(completionCode, retcompletionCode);
3131 EXPECT_EQ(effecter_dataSize, reteffecter_dataSize);
3132 EXPECT_EQ(effecter_operState, reteffecter_operState);
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303133 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303134 EXPECT_EQ(pendingValue, *(reinterpret_cast<uint16_t*>(retpendingValue)));
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303135 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303136 EXPECT_EQ(presentValue, *(reinterpret_cast<uint16_t*>(retpresentValue)));
3137}
3138
3139TEST(GetNumericEffecterValue, testBadDecodeResponse)
3140{
3141 std::array<uint8_t,
3142 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
3143 responseMsg{};
3144
3145 auto rc = decode_get_numeric_effecter_value_resp(
3146 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
3147 nullptr, nullptr);
3148
3149 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3150
3151 uint8_t completionCode = 0;
3152 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_SINT16;
3153 uint8_t effecter_operState = EFFECTER_OPER_STATE_DISABLED;
3154 uint16_t pendingValue = 0x5678;
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06003155 uint16_t presentValue = 0xcdef;
Andrew Jeffery9c766792022-08-10 23:12:49 +09303156
3157 uint8_t retcompletionCode;
3158 uint8_t reteffecter_dataSize;
3159 uint8_t reteffecter_operState;
3160 uint8_t retpendingValue[2];
3161 uint8_t retpresentValue[2];
3162
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303163 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303164 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3165 struct pldm_get_numeric_effecter_value_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303166 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303167 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
3168 response->payload);
3169
3170 resp->completion_code = completionCode;
3171 resp->effecter_data_size = effecter_dataSize;
3172 resp->effecter_oper_state = effecter_operState;
3173
3174 uint16_t pendingValue_le = htole16(pendingValue);
3175 memcpy(resp->pending_and_present_values, &pendingValue_le,
3176 sizeof(pendingValue_le));
3177 uint16_t presentValue_le = htole16(presentValue);
3178 memcpy(&resp->pending_and_present_values[2], &presentValue_le,
3179 sizeof(presentValue_le));
3180
3181 rc = decode_get_numeric_effecter_value_resp(
3182 response, responseMsg.size() - hdrSize, &retcompletionCode,
3183 &reteffecter_dataSize, &reteffecter_operState, retpendingValue,
3184 retpresentValue);
3185
Andrew Jeffery248b5ab2025-02-21 12:35:14 +10303186 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Andrew Jeffery9c766792022-08-10 23:12:49 +09303187}
3188
3189TEST(PldmPDRRepositoryChgEventEvent, testGoodDecodeRequest)
3190{
3191 const uint8_t eventDataFormat = FORMAT_IS_PDR_HANDLES;
3192 const uint8_t numberOfChangeRecords = 2;
3193 uint8_t eventDataOperation1 = PLDM_RECORDS_DELETED;
3194 const uint8_t numberOfChangeEntries1 = 2;
3195 std::array<uint32_t, numberOfChangeEntries1> changeRecordArr1{
3196 {0x00000000, 0x12345678}};
3197 uint8_t eventDataOperation2 = PLDM_RECORDS_ADDED;
3198 const uint8_t numberOfChangeEntries2 = 5;
3199 std::array<uint32_t, numberOfChangeEntries2> changeRecordArr2{
3200 {0x01234567, 0x11223344, 0x45678901, 0x21222324, 0x98765432}};
3201 std::array<uint8_t, PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH +
3202 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH *
3203 numberOfChangeRecords +
3204 (numberOfChangeEntries1 + numberOfChangeEntries2) *
3205 sizeof(uint32_t)>
3206 eventDataArr{};
3207
3208 struct pldm_pdr_repository_chg_event_data* eventData =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303209 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303210 reinterpret_cast<struct pldm_pdr_repository_chg_event_data*>(
3211 eventDataArr.data());
3212 eventData->event_data_format = eventDataFormat;
3213 eventData->number_of_change_records = numberOfChangeRecords;
3214 struct pldm_pdr_repository_change_record_data* changeRecord1 =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303215 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303216 reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
3217 eventData->change_records);
3218 changeRecord1->event_data_operation = eventDataOperation1;
3219 changeRecord1->number_of_change_entries = numberOfChangeEntries1;
3220 memcpy(changeRecord1->change_entry, &changeRecordArr1[0],
3221 changeRecordArr1.size() * sizeof(uint32_t));
3222 struct pldm_pdr_repository_change_record_data* changeRecord2 =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303223 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303224 reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
3225 eventData->change_records +
3226 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH +
3227 (changeRecordArr1.size() * sizeof(uint32_t)));
3228 changeRecord2->event_data_operation = eventDataOperation2;
3229 changeRecord2->number_of_change_entries = numberOfChangeEntries2;
3230 memcpy(changeRecord2->change_entry, &changeRecordArr2[0],
3231 changeRecordArr2.size() * sizeof(uint32_t));
3232
3233 uint8_t retEventDataFormat{};
3234 uint8_t retNumberOfChangeRecords{};
3235 size_t retChangeRecordDataOffset{0};
3236 auto rc = decode_pldm_pdr_repository_chg_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303237 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303238 reinterpret_cast<const uint8_t*>(eventData), eventDataArr.size(),
3239 &retEventDataFormat, &retNumberOfChangeRecords,
3240 &retChangeRecordDataOffset);
3241 EXPECT_EQ(rc, PLDM_SUCCESS);
3242 EXPECT_EQ(retEventDataFormat, FORMAT_IS_PDR_HANDLES);
3243 EXPECT_EQ(retNumberOfChangeRecords, numberOfChangeRecords);
3244
3245 const uint8_t* changeRecordData =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303246 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303247 reinterpret_cast<const uint8_t*>(changeRecord1);
3248 size_t changeRecordDataSize =
3249 eventDataArr.size() - PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH;
3250 uint8_t retEventDataOperation;
3251 uint8_t retNumberOfChangeEntries;
3252 size_t retChangeEntryDataOffset;
3253
3254 rc = decode_pldm_pdr_repository_change_record_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303255 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303256 reinterpret_cast<const uint8_t*>(changeRecordData),
3257 changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
3258 &retChangeEntryDataOffset);
3259 EXPECT_EQ(rc, PLDM_SUCCESS);
3260 EXPECT_EQ(retEventDataOperation, eventDataOperation1);
3261 EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries1);
3262 changeRecordData += retChangeEntryDataOffset;
3263 EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr1[0],
3264 sizeof(uint32_t) * retNumberOfChangeEntries));
3265
3266 changeRecordData += sizeof(uint32_t) * retNumberOfChangeEntries;
3267 changeRecordDataSize -= sizeof(uint32_t) * retNumberOfChangeEntries -
3268 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH;
3269 rc = decode_pldm_pdr_repository_change_record_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303270 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303271 reinterpret_cast<const uint8_t*>(changeRecordData),
3272 changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
3273 &retChangeEntryDataOffset);
3274 EXPECT_EQ(rc, PLDM_SUCCESS);
3275 EXPECT_EQ(retEventDataOperation, eventDataOperation2);
3276 EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries2);
3277 changeRecordData += retChangeEntryDataOffset;
3278 EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr2[0],
3279 sizeof(uint32_t) * retNumberOfChangeEntries));
3280}
3281
3282TEST(PldmPDRRepositoryChgEventEvent, testBadDecodeRequest)
3283{
3284 uint8_t eventDataFormat{};
3285 uint8_t numberOfChangeRecords{};
3286 size_t changeRecordDataOffset{};
3287 auto rc = decode_pldm_pdr_repository_chg_event_data(
3288 NULL, 0, &eventDataFormat, &numberOfChangeRecords,
3289 &changeRecordDataOffset);
3290 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3291
3292 std::array<uint8_t, 2> eventData{};
3293 rc = decode_pldm_pdr_repository_chg_event_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303294 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303295 reinterpret_cast<const uint8_t*>(eventData.data()), 0, &eventDataFormat,
3296 &numberOfChangeRecords, &changeRecordDataOffset);
3297 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3298
3299 uint8_t eventDataOperation{};
3300 uint8_t numberOfChangeEntries{};
3301 size_t changeEntryDataOffset{};
3302 rc = decode_pldm_pdr_repository_change_record_data(
3303 NULL, 0, &eventDataOperation, &numberOfChangeEntries,
3304 &changeEntryDataOffset);
3305 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3306
3307 std::array<uint8_t, 2> changeRecord{};
3308 rc = decode_pldm_pdr_repository_change_record_data(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303309 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303310 reinterpret_cast<const uint8_t*>(changeRecord.data()), 0,
3311 &eventDataOperation, &numberOfChangeEntries, &changeEntryDataOffset);
3312 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3313}
3314
3315TEST(GetSensorReading, testGoodEncodeRequest)
3316{
3317 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
3318 requestMsg{};
3319
3320 uint16_t sensorId = 0x1234;
3321 bool8_t rearmEventState = 0x01;
3322
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303323 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303324 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
3325 auto rc =
3326 encode_get_sensor_reading_req(0, sensorId, rearmEventState, request);
3327
3328 struct pldm_get_sensor_reading_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303329 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303330 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
3331
3332 EXPECT_EQ(rc, PLDM_SUCCESS);
3333 EXPECT_EQ(sensorId, le16toh(req->sensor_id));
3334 EXPECT_EQ(rearmEventState, req->rearm_event_state);
3335}
3336
3337TEST(GetSensorReading, testBadEncodeRequest)
3338{
3339 auto rc = encode_get_sensor_reading_req(0, 0, 0, nullptr);
3340
3341 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3342}
3343
3344TEST(GetSensorReading, testGoodDecodeRequest)
3345{
3346 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
3347 requestMsg{};
3348
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06003349 uint16_t sensorId = 0xabcd;
3350 bool8_t rearmEventState = 0xa;
Andrew Jeffery9c766792022-08-10 23:12:49 +09303351
3352 uint16_t retsensorId;
3353 bool8_t retrearmEventState;
3354
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303355 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303356 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
3357
3358 struct pldm_get_sensor_reading_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303359 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303360 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
3361
3362 req->sensor_id = htole16(sensorId);
3363 req->rearm_event_state = rearmEventState;
3364
3365 auto rc =
3366 decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize,
3367 &retsensorId, &retrearmEventState);
3368
3369 EXPECT_EQ(rc, PLDM_SUCCESS);
3370 EXPECT_EQ(sensorId, retsensorId);
3371 EXPECT_EQ(rearmEventState, retrearmEventState);
3372}
3373
3374TEST(GetSensorReading, testBadDecodeRequest)
3375{
3376 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
3377 requestMsg{};
3378
3379 auto rc = decode_get_sensor_reading_req(
3380 nullptr, requestMsg.size() - hdrSize, nullptr, nullptr);
3381 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3382
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06003383 uint16_t sensorId = 0xabcd;
3384 bool8_t rearmEventState = 0xa;
Andrew Jeffery9c766792022-08-10 23:12:49 +09303385
3386 uint16_t retsensorId;
3387 bool8_t retrearmEventState;
3388
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303389 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303390 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
3391
3392 struct pldm_get_sensor_reading_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303393 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303394 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
3395
3396 req->sensor_id = htole16(sensorId);
3397 req->rearm_event_state = rearmEventState;
3398
3399 rc = decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize - 1,
3400 &retsensorId, &retrearmEventState);
3401
3402 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3403}
3404
3405TEST(GetSensorReading, testGoodEncodeResponse)
3406{
3407 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES>
3408 responseMsg{};
3409
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303410 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303411 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3412
3413 uint8_t completionCode = 0;
3414 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
3415 uint8_t sensor_operationalState = PLDM_SENSOR_ENABLED;
3416 uint8_t sensor_event_messageEnable = PLDM_NO_EVENT_GENERATION;
3417 uint8_t presentState = PLDM_SENSOR_NORMAL;
3418 uint8_t previousState = PLDM_SENSOR_WARNING;
3419 uint8_t eventState = PLDM_SENSOR_UPPERWARNING;
3420 uint8_t presentReading = 0x21;
3421
3422 auto rc = encode_get_sensor_reading_resp(
3423 0, completionCode, sensor_dataSize, sensor_operationalState,
3424 sensor_event_messageEnable, presentState, previousState, eventState,
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303425 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303426 reinterpret_cast<uint8_t*>(&presentReading), response,
3427 responseMsg.size() - hdrSize);
3428
3429 struct pldm_get_sensor_reading_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303430 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303431 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
3432 response->payload);
3433
3434 EXPECT_EQ(rc, PLDM_SUCCESS);
3435 EXPECT_EQ(completionCode, resp->completion_code);
3436 EXPECT_EQ(sensor_dataSize, resp->sensor_data_size);
3437 EXPECT_EQ(sensor_operationalState, resp->sensor_operational_state);
3438 EXPECT_EQ(sensor_event_messageEnable, resp->sensor_event_message_enable);
3439 EXPECT_EQ(presentState, resp->present_state);
3440 EXPECT_EQ(previousState, resp->previous_state);
3441 EXPECT_EQ(eventState, resp->event_state);
3442 EXPECT_EQ(presentReading,
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303443 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303444 *(reinterpret_cast<uint8_t*>(&resp->present_reading[0])));
3445}
3446
3447TEST(GetSensorReading, testBadEncodeResponse)
3448{
3449 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
3450 responseMsg{};
3451
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303452 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303453 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3454
3455 uint8_t presentReading = 0x1;
3456
3457 auto rc = encode_get_sensor_reading_resp(0, PLDM_SUCCESS, 0, 0, 0, 0, 0, 0,
3458 nullptr, nullptr,
3459 responseMsg.size() - hdrSize);
3460 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3461
3462 rc = encode_get_sensor_reading_resp(
3463 0, PLDM_SUCCESS, 6, 1, 1, 1, 1, 1,
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303464 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303465 reinterpret_cast<uint8_t*>(&presentReading), response,
3466 responseMsg.size() - hdrSize);
3467 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3468
3469 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
3470
3471 rc = encode_get_sensor_reading_resp(
3472 0, PLDM_SUCCESS, sensor_dataSize, 1, 1, 1, 1, 1,
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303473 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303474 reinterpret_cast<uint8_t*>(&presentReading), response,
3475 responseMsg.size() - hdrSize);
3476 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3477}
3478
3479TEST(GetSensorReading, testGoodDecodeResponse)
3480{
3481 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
3482 responseMsg{};
3483
3484 uint8_t completionCode = 0;
3485 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
3486 uint8_t sensor_operationalState = PLDM_SENSOR_STATUSUNKOWN;
3487 uint8_t sensor_event_messageEnable = PLDM_EVENTS_ENABLED;
3488 uint8_t presentState = PLDM_SENSOR_CRITICAL;
3489 uint8_t previousState = PLDM_SENSOR_UPPERCRITICAL;
3490 uint8_t eventState = PLDM_SENSOR_WARNING;
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06003491 uint32_t presentReading = 0xabcdef11;
Andrew Jeffery9c766792022-08-10 23:12:49 +09303492
3493 uint8_t retcompletionCode;
3494 uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
3495 uint8_t retsensor_operationalState;
3496 uint8_t retsensor_event_messageEnable;
3497 uint8_t retpresentState;
3498 uint8_t retpreviousState;
3499 uint8_t reteventState;
3500 uint8_t retpresentReading[4];
3501
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303502 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303503 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3504 struct pldm_get_sensor_reading_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303505 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303506 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
3507 response->payload);
3508
3509 resp->completion_code = completionCode;
3510 resp->sensor_data_size = sensor_dataSize;
3511 resp->sensor_operational_state = sensor_operationalState;
3512 resp->sensor_event_message_enable = sensor_event_messageEnable;
3513 resp->present_state = presentState;
3514 resp->previous_state = previousState;
3515 resp->event_state = eventState;
3516
3517 uint32_t presentReading_le = htole32(presentReading);
3518 memcpy(resp->present_reading, &presentReading_le,
3519 sizeof(presentReading_le));
3520
3521 auto rc = decode_get_sensor_reading_resp(
3522 response, responseMsg.size() - hdrSize, &retcompletionCode,
3523 &retsensor_dataSize, &retsensor_operationalState,
3524 &retsensor_event_messageEnable, &retpresentState, &retpreviousState,
3525 &reteventState, retpresentReading);
3526
3527 EXPECT_EQ(rc, PLDM_SUCCESS);
3528 EXPECT_EQ(completionCode, retcompletionCode);
3529 EXPECT_EQ(sensor_dataSize, retsensor_dataSize);
3530 EXPECT_EQ(sensor_operationalState, retsensor_operationalState);
3531 EXPECT_EQ(sensor_event_messageEnable, retsensor_event_messageEnable);
3532 EXPECT_EQ(presentState, retpresentState);
3533 EXPECT_EQ(previousState, retpreviousState);
3534 EXPECT_EQ(eventState, reteventState);
3535 EXPECT_EQ(presentReading,
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303536 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303537 *(reinterpret_cast<uint32_t*>(retpresentReading)));
3538}
3539
3540TEST(GetSensorReading, testBadDecodeResponse)
3541{
3542 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 1>
3543 responseMsg{};
3544
3545 auto rc = decode_get_sensor_reading_resp(
3546 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
3547 nullptr, nullptr, nullptr, nullptr, nullptr);
3548
3549 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3550
3551 uint8_t completionCode = 0;
3552 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
3553 uint8_t sensor_operationalState = PLDM_SENSOR_INTEST;
3554 uint8_t sensor_event_messageEnable = PLDM_EVENTS_DISABLED;
3555 uint8_t presentState = PLDM_SENSOR_FATAL;
3556 uint8_t previousState = PLDM_SENSOR_UPPERFATAL;
3557 uint8_t eventState = PLDM_SENSOR_WARNING;
Pavithra Barithayadc7d3b52024-02-06 23:46:49 -06003558 uint8_t presentReading = 0xa;
Andrew Jeffery9c766792022-08-10 23:12:49 +09303559
3560 uint8_t retcompletionCode;
3561 uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
3562 uint8_t retsensor_operationalState;
3563 uint8_t retsensor_event_messageEnable;
3564 uint8_t retpresent_state;
3565 uint8_t retprevious_state;
3566 uint8_t retevent_state;
3567 uint8_t retpresentReading;
3568
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303569 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303570 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3571 struct pldm_get_sensor_reading_resp* resp =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303572 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303573 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
3574 response->payload);
3575
3576 resp->completion_code = completionCode;
3577 resp->sensor_data_size = sensor_dataSize;
3578 resp->sensor_operational_state = sensor_operationalState;
3579 resp->sensor_event_message_enable = sensor_event_messageEnable;
3580 resp->present_state = presentState;
3581 resp->previous_state = previousState;
3582 resp->event_state = eventState;
3583 resp->present_reading[0] = presentReading;
3584
3585 rc = decode_get_sensor_reading_resp(
3586 response, responseMsg.size() - hdrSize, &retcompletionCode,
3587 &retsensor_dataSize, &retsensor_operationalState,
3588 &retsensor_event_messageEnable, &retpresent_state, &retprevious_state,
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303589 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303590 &retevent_state, reinterpret_cast<uint8_t*>(&retpresentReading));
3591
Andrew Jeffery248b5ab2025-02-21 12:35:14 +10303592 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Andrew Jeffery9c766792022-08-10 23:12:49 +09303593}
3594
3595TEST(SetEventReceiver, testGoodEncodeRequest)
3596{
3597 uint8_t eventMessageGlobalEnable =
3598 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
3599 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
3600 uint8_t eventReceiverAddressInfo = 0x08;
3601 uint16_t heartbeatTimer = 0x78;
3602
Andrew Jeffery2332e052024-10-08 13:52:34 +10303603 std::vector<uint8_t> requestMsg(hdrSize +
3604 PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
3605 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3606 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
Andrew Jeffery9c766792022-08-10 23:12:49 +09303607
3608 auto rc = encode_set_event_receiver_req(
3609 0, eventMessageGlobalEnable, transportProtocolType,
3610 eventReceiverAddressInfo, heartbeatTimer, request);
3611
3612 EXPECT_EQ(rc, PLDM_SUCCESS);
3613 struct pldm_set_event_receiver_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303614 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303615 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
3616 EXPECT_EQ(eventMessageGlobalEnable, req->event_message_global_enable);
3617 EXPECT_EQ(transportProtocolType, req->transport_protocol_type);
3618 EXPECT_EQ(eventReceiverAddressInfo, req->event_receiver_address_info);
3619 EXPECT_EQ(heartbeatTimer, le16toh(req->heartbeat_timer));
3620}
3621
3622TEST(SetEventReceiver, testBadEncodeRequest)
3623{
3624 uint8_t eventMessageGlobalEnable =
3625 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
3626 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
3627 uint8_t eventReceiverAddressInfo = 0x08;
3628 uint16_t heartbeatTimer = 0;
3629
Andrew Jeffery2332e052024-10-08 13:52:34 +10303630 std::vector<uint8_t> requestMsg(hdrSize +
3631 PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
3632 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3633 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
Andrew Jeffery9c766792022-08-10 23:12:49 +09303634
3635 auto rc = encode_set_event_receiver_req(
3636 0, eventMessageGlobalEnable, transportProtocolType,
3637 eventReceiverAddressInfo, heartbeatTimer, request);
3638
3639 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3640}
3641
3642TEST(SetEventReceiver, testGoodDecodeResponse)
3643{
3644 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
3645 responseMsg{};
3646
3647 uint8_t retcompletion_code = 0;
3648 responseMsg[hdrSize] = PLDM_SUCCESS;
3649
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303650 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303651 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3652 auto rc = decode_set_event_receiver_resp(
3653 response, responseMsg.size() - sizeof(pldm_msg_hdr),
3654 &retcompletion_code);
3655
3656 EXPECT_EQ(rc, PLDM_SUCCESS);
3657 EXPECT_EQ(PLDM_SUCCESS, retcompletion_code);
3658}
3659
3660TEST(SetEventReceiver, testBadDecodeResponse)
3661{
3662 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
3663 responseMsg{};
3664 uint8_t retcompletion_code = 0;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303665 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303666 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3667
3668 auto rc = decode_set_event_receiver_resp(
3669 response, responseMsg.size() - sizeof(pldm_msg_hdr), NULL);
3670
3671 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3672
3673 rc = decode_set_event_receiver_resp(
3674 nullptr, responseMsg.size() - sizeof(pldm_msg_hdr),
3675 &retcompletion_code);
3676
3677 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3678}
3679
3680TEST(SetEventReceiver, testGoodEncodeResponse)
3681{
3682 std::array<uint8_t,
3683 sizeof(pldm_msg_hdr) + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
3684 responseMsg{};
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303685 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303686 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3687 uint8_t completionCode = 0;
3688
3689 auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, response);
3690
3691 EXPECT_EQ(rc, PLDM_SUCCESS);
3692 EXPECT_EQ(completionCode, response->payload[0]);
3693}
3694
3695TEST(SetEventReceiver, testBadEncodeResponse)
3696{
3697 auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, NULL);
3698 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3699}
3700
3701TEST(SetEventReceiver, testGoodDecodeRequest)
3702{
Andrew Jeffery2332e052024-10-08 13:52:34 +10303703
3704 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
3705 requestMsg{};
Andrew Jeffery9c766792022-08-10 23:12:49 +09303706
3707 uint8_t eventMessageGlobalEnable =
3708 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
3709 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
3710 uint8_t eventReceiverAddressInfo = 0x08;
3711 uint16_t heartbeatTimer = 0x78;
3712
Andrew Jeffery2332e052024-10-08 13:52:34 +10303713 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3714 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
Andrew Jeffery9c766792022-08-10 23:12:49 +09303715 struct pldm_set_event_receiver_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303716 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303717 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
3718
3719 req->event_message_global_enable = eventMessageGlobalEnable;
3720 req->transport_protocol_type = transportProtocolType;
3721 req->event_receiver_address_info = eventReceiverAddressInfo;
3722 req->heartbeat_timer = htole16(heartbeatTimer);
3723
3724 uint8_t reteventMessageGlobalEnable;
3725 uint8_t rettransportProtocolType;
3726 uint8_t reteventReceiverAddressInfo;
3727 uint16_t retheartbeatTimer;
3728 auto rc = decode_set_event_receiver_req(
Andrew Jeffery2332e052024-10-08 13:52:34 +10303729 request, requestMsg.size() - hdrSize, &reteventMessageGlobalEnable,
3730 &rettransportProtocolType, &reteventReceiverAddressInfo,
3731 &retheartbeatTimer);
Andrew Jeffery9c766792022-08-10 23:12:49 +09303732
3733 EXPECT_EQ(rc, PLDM_SUCCESS);
3734 EXPECT_EQ(eventMessageGlobalEnable, reteventMessageGlobalEnable);
3735 EXPECT_EQ(transportProtocolType, rettransportProtocolType);
3736 EXPECT_EQ(eventReceiverAddressInfo, reteventReceiverAddressInfo);
3737 EXPECT_EQ(heartbeatTimer, retheartbeatTimer);
Gilbert Chen98e137d2024-10-08 08:00:39 +00003738
3739 eventMessageGlobalEnable = PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC;
3740 req->event_message_global_enable = eventMessageGlobalEnable;
3741 rc = decode_set_event_receiver_req(
3742 request, PLDM_SET_EVENT_RECEIVER_MIN_REQ_BYTES,
3743 &reteventMessageGlobalEnable, &rettransportProtocolType,
3744 &reteventReceiverAddressInfo, &retheartbeatTimer);
3745 EXPECT_EQ(rc, PLDM_SUCCESS);
3746 EXPECT_EQ(eventMessageGlobalEnable, reteventMessageGlobalEnable);
3747 EXPECT_EQ(transportProtocolType, rettransportProtocolType);
3748 EXPECT_EQ(eventReceiverAddressInfo, reteventReceiverAddressInfo);
Andrew Jeffery9c766792022-08-10 23:12:49 +09303749}
3750
3751TEST(SetEventReceiver, testBadDecodeRequest)
3752{
Andrew Jeffery2332e052024-10-08 13:52:34 +10303753 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
3754 requestMsg{};
Andrew Jeffery9c766792022-08-10 23:12:49 +09303755
Andrew Jeffery2332e052024-10-08 13:52:34 +10303756 auto rc = decode_set_event_receiver_req(NULL, requestMsg.size() - hdrSize,
3757 NULL, NULL, NULL, NULL);
Andrew Jeffery9c766792022-08-10 23:12:49 +09303758 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3759
3760 uint8_t eventMessageGlobalEnable =
3761 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
3762 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
3763 uint8_t eventReceiverAddressInfo = 0x08;
3764 uint16_t heartbeatTimer = 0x78;
3765
Andrew Jeffery2332e052024-10-08 13:52:34 +10303766 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3767 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
Andrew Jeffery9c766792022-08-10 23:12:49 +09303768 struct pldm_set_event_receiver_req* req =
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09303769 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Andrew Jeffery9c766792022-08-10 23:12:49 +09303770 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
3771
3772 req->event_message_global_enable = eventMessageGlobalEnable;
3773 req->transport_protocol_type = transportProtocolType;
3774 req->event_receiver_address_info = eventReceiverAddressInfo;
3775 req->heartbeat_timer = htole16(heartbeatTimer);
3776
3777 uint8_t reteventMessageGlobalEnable;
3778 uint8_t rettransportProtocolType;
3779 uint8_t reteventReceiverAddressInfo;
3780 uint16_t retheartbeatTimer;
Andrew Jeffery4f60fb72024-09-23 13:56:44 +09303781
Andrew Jeffery9c766792022-08-10 23:12:49 +09303782 rc = decode_set_event_receiver_req(
Andrew Jeffery2332e052024-10-08 13:52:34 +10303783 request, requestMsg.size() - hdrSize - 1, &reteventMessageGlobalEnable,
3784 &rettransportProtocolType, &reteventReceiverAddressInfo,
3785 &retheartbeatTimer);
Andrew Jeffery9c766792022-08-10 23:12:49 +09303786 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
Gilbert Chen98e137d2024-10-08 08:00:39 +00003787
3788 req->event_message_global_enable = PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC;
3789 rc = decode_set_event_receiver_req(
3790 request, PLDM_SET_EVENT_RECEIVER_MIN_REQ_BYTES - 1,
3791 &reteventMessageGlobalEnable, &rettransportProtocolType,
3792 &reteventReceiverAddressInfo, &retheartbeatTimer);
3793 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3794
3795 req->event_message_global_enable =
3796 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
3797 req->heartbeat_timer = 0;
3798 rc = decode_set_event_receiver_req(
3799 request, PLDM_SET_EVENT_RECEIVER_REQ_BYTES,
3800 &reteventMessageGlobalEnable, &rettransportProtocolType,
3801 &reteventReceiverAddressInfo, &retheartbeatTimer);
3802 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
Andrew Jeffery9c766792022-08-10 23:12:49 +09303803}
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303804
3805TEST(decodeNumericSensorPdrData, Uint8Test)
3806{
3807 std::vector<uint8_t> pdr1{
3808 0x1,
3809 0x0,
3810 0x0,
Andrew Jeffery01731472023-06-13 10:33:18 +09303811 0x0, // record handle
3812 0x1, // PDRHeaderVersion
3813 PLDM_NUMERIC_SENSOR_PDR, // PDRType
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303814 0x0,
Andrew Jeffery01731472023-06-13 10:33:18 +09303815 0x0, // recordChangeNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303816 PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH,
Andrew Jeffery01731472023-06-13 10:33:18 +09303817 0, // dataLength
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303818 0,
Andrew Jeffery01731472023-06-13 10:33:18 +09303819 0, // PLDMTerminusHandle
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303820 0x1,
Andrew Jeffery01731472023-06-13 10:33:18 +09303821 0x0, // sensorID=1
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303822 PLDM_ENTITY_POWER_SUPPLY,
Andrew Jeffery01731472023-06-13 10:33:18 +09303823 0, // entityType=Power Supply(120)
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303824 1,
Andrew Jeffery01731472023-06-13 10:33:18 +09303825 0, // entityInstanceNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303826 1,
3827 0, // containerID=1
3828 PLDM_NO_INIT, // sensorInit
3829 false, // sensorAuxiliaryNamesPDR
3830 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
3831 0, // unitModifier
3832 0, // rateUnit
3833 0, // baseOEMUnitHandle
3834 0, // auxUnit
3835 0, // auxUnitModifier
3836 0, // auxRateUnit
3837 0, // rel
3838 0, // auxOEMUnitHandle
3839 true, // isLinear
3840 PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize
3841 0,
3842 0,
3843 0xc0,
3844 0x3f, // resolution=1.5
3845 0,
3846 0,
3847 0x80,
3848 0x3f, // offset=1.0
3849 0,
Andrew Jeffery01731472023-06-13 10:33:18 +09303850 0, // accuracy
3851 0, // plusTolerance
3852 0, // minusTolerance
3853 3, // hysteresis = 3
3854 0, // supportedThresholds
3855 0, // thresholdAndHysteresisVolatility
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303856 0,
3857 0,
3858 0x80,
3859 0x3f, // stateTransistionInterval=1.0
3860 0,
3861 0,
3862 0x80,
3863 0x3f, // updateInverval=1.0
3864 255, // maxReadable
3865 0, // minReadable
3866 PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
3867 0, // rangeFieldsupport
3868 50, // nominalValue = 50
3869 60, // normalMax = 60
3870 40, // normalMin = 40
3871 70, // warningHigh = 70
3872 30, // warningLow = 30
3873 80, // criticalHigh = 80
3874 20, // criticalLow = 20
3875 90, // fatalHigh = 90
3876 10 // fatalLow = 10
3877 };
3878
3879 struct pldm_numeric_sensor_value_pdr decodedPdr;
3880 auto rc =
3881 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
3882 EXPECT_EQ(PLDM_SUCCESS, rc);
3883 EXPECT_EQ(1, decodedPdr.hdr.record_handle);
3884 EXPECT_EQ(1, decodedPdr.hdr.version);
3885 EXPECT_EQ(PLDM_NUMERIC_SENSOR_PDR, decodedPdr.hdr.type);
3886 EXPECT_EQ(0, decodedPdr.hdr.record_change_num);
3887 EXPECT_EQ(PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH, decodedPdr.hdr.length);
3888 EXPECT_EQ(1, decodedPdr.sensor_id);
3889 EXPECT_EQ(PLDM_ENTITY_POWER_SUPPLY, decodedPdr.entity_type);
3890 EXPECT_EQ(1, decodedPdr.entity_instance_num);
3891 EXPECT_EQ(1, decodedPdr.container_id);
3892 EXPECT_EQ(PLDM_NO_INIT, decodedPdr.sensor_init);
3893 EXPECT_EQ(false, decodedPdr.sensor_auxiliary_names_pdr);
3894 EXPECT_EQ(PLDM_SENSOR_UNIT_DEGRESS_C, decodedPdr.base_unit);
3895 EXPECT_EQ(0, decodedPdr.unit_modifier);
3896 EXPECT_EQ(0, decodedPdr.rate_unit);
3897 EXPECT_EQ(0, decodedPdr.base_oem_unit_handle);
3898 EXPECT_EQ(0, decodedPdr.aux_unit);
3899 EXPECT_EQ(0, decodedPdr.aux_unit_modifier);
3900 EXPECT_EQ(0, decodedPdr.aux_rate_unit);
3901 EXPECT_EQ(0, decodedPdr.rel);
3902 EXPECT_EQ(0, decodedPdr.aux_oem_unit_handle);
3903 EXPECT_EQ(true, decodedPdr.is_linear);
3904 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT8, decodedPdr.sensor_data_size);
3905 EXPECT_FLOAT_EQ(1.5f, decodedPdr.resolution);
3906 EXPECT_FLOAT_EQ(1.0f, decodedPdr.offset);
3907 EXPECT_EQ(0, decodedPdr.accuracy);
3908 EXPECT_EQ(0, decodedPdr.plus_tolerance);
3909 EXPECT_EQ(0, decodedPdr.minus_tolerance);
3910 EXPECT_EQ(3, decodedPdr.hysteresis.value_u8);
3911 EXPECT_EQ(0, decodedPdr.supported_thresholds.byte);
3912 EXPECT_EQ(0, decodedPdr.threshold_and_hysteresis_volatility.byte);
3913 EXPECT_FLOAT_EQ(1.0f, decodedPdr.state_transition_interval);
3914 EXPECT_FLOAT_EQ(1.0f, decodedPdr.update_interval);
3915 EXPECT_EQ(255, decodedPdr.max_readable.value_u8);
3916 EXPECT_EQ(0, decodedPdr.min_readable.value_u8);
3917 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT8, decodedPdr.range_field_format);
3918 EXPECT_EQ(0, decodedPdr.range_field_support.byte);
3919 EXPECT_EQ(50, decodedPdr.nominal_value.value_u8);
3920 EXPECT_EQ(60, decodedPdr.normal_max.value_u8);
3921 EXPECT_EQ(40, decodedPdr.normal_min.value_u8);
3922 EXPECT_EQ(70, decodedPdr.warning_high.value_u8);
3923 EXPECT_EQ(30, decodedPdr.warning_low.value_u8);
3924 EXPECT_EQ(80, decodedPdr.critical_high.value_u8);
3925 EXPECT_EQ(20, decodedPdr.critical_low.value_u8);
3926 EXPECT_EQ(90, decodedPdr.fatal_high.value_u8);
3927 EXPECT_EQ(10, decodedPdr.fatal_low.value_u8);
3928}
3929
3930TEST(decodeNumericSensorPdrData, Sint8Test)
3931{
3932 std::vector<uint8_t> pdr1{
3933 0x1,
3934 0x0,
3935 0x0,
3936 0x0, // record handle
3937 0x1, // PDRHeaderVersion
3938 PLDM_NUMERIC_SENSOR_PDR, // PDRType
3939 0x0,
Andrew Jeffery01731472023-06-13 10:33:18 +09303940 0x0, // recordChangeNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303941 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
3942 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH +
3943 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH,
Andrew Jeffery01731472023-06-13 10:33:18 +09303944 0, // dataLength
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303945 0,
Andrew Jeffery01731472023-06-13 10:33:18 +09303946 0, // PLDMTerminusHandle
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303947 0x1,
Andrew Jeffery01731472023-06-13 10:33:18 +09303948 0x0, // sensorID=1
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303949 PLDM_ENTITY_POWER_SUPPLY,
Andrew Jeffery01731472023-06-13 10:33:18 +09303950 0, // entityType=Power Supply(120)
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303951 1,
Andrew Jeffery01731472023-06-13 10:33:18 +09303952 0, // entityInstanceNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09303953 0x1,
3954 0x0, // containerID=1
3955 PLDM_NO_INIT, // sensorInit
3956 false, // sensorAuxiliaryNamesPDR
3957 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
3958 0, // unitModifier
3959 0, // rateUnit
3960 0, // baseOEMUnitHandle
3961 0, // auxUnit
3962 0, // auxUnitModifier
3963 0, // auxRateUnit
3964 0, // rel
3965 0, // auxOEMUnitHandle
3966 true, // isLinear
3967 PLDM_RANGE_FIELD_FORMAT_SINT8, // sensorDataSize
3968 0,
3969 0,
3970 0,
3971 0, // resolution
3972 0,
3973 0,
3974 0,
3975 0, // offset
3976 0,
3977 0, // accuracy
3978 0, // plusTolerance
3979 0, // minusTolerance
3980 3, // hysteresis = 3
3981 0, // supportedThresholds
3982 0, // thresholdAndHysteresisVolatility
3983 0,
3984 0,
3985 0x80,
3986 0x3f, // stateTransistionInterval=1.0
3987 0,
3988 0,
3989 0x80,
3990 0x3f, // updateInverval=1.0
3991 0x64, // maxReadable = 100
3992 0x9c, // minReadable = -100
3993 PLDM_RANGE_FIELD_FORMAT_SINT8, // rangeFieldFormat
3994 0, // rangeFieldsupport
3995 0, // nominalValue = 0
3996 5, // normalMax = 5
3997 0xfb, // normalMin = -5
3998 10, // warningHigh = 10
3999 0xf6, // warningLow = -10
4000 20, // criticalHigh = 20
4001 0xec, // criticalLow = -20
4002 30, // fatalHigh = 30
4003 0xe2 // fatalLow = -30
4004 };
4005
4006 struct pldm_numeric_sensor_value_pdr decodedPdr;
4007 auto rc =
4008 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4009 EXPECT_EQ(PLDM_SUCCESS, rc);
4010
4011 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT8, decodedPdr.sensor_data_size);
4012 EXPECT_EQ(100, decodedPdr.max_readable.value_s8);
4013 EXPECT_EQ(-100, decodedPdr.min_readable.value_s8);
4014 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT8, decodedPdr.range_field_format);
4015 EXPECT_EQ(0, decodedPdr.nominal_value.value_s8);
4016 EXPECT_EQ(5, decodedPdr.normal_max.value_s8);
4017 EXPECT_EQ(-5, decodedPdr.normal_min.value_s8);
4018 EXPECT_EQ(10, decodedPdr.warning_high.value_s8);
4019 EXPECT_EQ(-10, decodedPdr.warning_low.value_s8);
4020 EXPECT_EQ(20, decodedPdr.critical_high.value_s8);
4021 EXPECT_EQ(-20, decodedPdr.critical_low.value_s8);
4022 EXPECT_EQ(30, decodedPdr.fatal_high.value_s8);
4023 EXPECT_EQ(-30, decodedPdr.fatal_low.value_s8);
4024}
4025
4026TEST(decodeNumericSensorPdrData, Uint16Test)
4027{
4028 std::vector<uint8_t> pdr1{
4029 0x1,
4030 0x0,
4031 0x0,
4032 0x0, // record handle
4033 0x1, // PDRHeaderVersion
4034 PLDM_NUMERIC_SENSOR_PDR, // PDRType
4035 0x0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304036 0x0, // recordChangeNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304037 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
4038 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 2 +
4039 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
Andrew Jeffery01731472023-06-13 10:33:18 +09304040 0, // dataLength
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304041 0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304042 0, // PLDMTerminusHandle
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304043 0x1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304044 0x0, // sensorID=1
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304045 PLDM_ENTITY_POWER_SUPPLY,
Andrew Jeffery01731472023-06-13 10:33:18 +09304046 0, // entityType=Power Supply(120)
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304047 1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304048 0, // entityInstanceNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304049 0x1,
4050 0x0, // containerID=1
4051 PLDM_NO_INIT, // sensorInit
4052 false, // sensorAuxiliaryNamesPDR
4053 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
4054 0, // unitModifier
4055 0, // rateUnit
4056 0, // baseOEMUnitHandle
4057 0, // auxUnit
4058 0, // auxUnitModifier
4059 0, // auxRateUnit
4060 0, // rel
4061 0, // auxOEMUnitHandle
4062 true, // isLinear
4063 PLDM_SENSOR_DATA_SIZE_UINT16, // sensorDataSize
4064 0,
4065 0,
4066 0,
4067 0, // resolution
4068 0,
4069 0,
4070 0,
4071 0, // offset
4072 0,
4073 0, // accuracy
4074 0, // plusTolerance
4075 0, // minusTolerance
4076 3,
4077 0, // hysteresis = 3
4078 0, // supportedThresholds
4079 0, // thresholdAndHysteresisVolatility
4080 0,
4081 0,
4082 0x80,
4083 0x3f, // stateTransistionInterval=1.0
4084 0,
4085 0,
4086 0x80,
Andrew Jeffery01731472023-06-13 10:33:18 +09304087 0x3f, // updateInverval=1.0
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304088 0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304089 0x10, // maxReadable = 4096
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304090 0,
4091 0, // minReadable = 0
4092 PLDM_RANGE_FIELD_FORMAT_UINT16, // rangeFieldFormat
4093 0, // rangeFieldsupport
4094 0x88,
Andrew Jeffery01731472023-06-13 10:33:18 +09304095 0x13, // nominalValue = 5,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304096 0x70,
Andrew Jeffery01731472023-06-13 10:33:18 +09304097 0x17, // normalMax = 6,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304098 0xa0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304099 0x0f, // normalMin = 4,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304100 0x58,
Andrew Jeffery01731472023-06-13 10:33:18 +09304101 0x1b, // warningHigh = 7,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304102 0xb8,
Andrew Jeffery01731472023-06-13 10:33:18 +09304103 0x0b, // warningLow = 3,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304104 0x40,
Andrew Jeffery01731472023-06-13 10:33:18 +09304105 0x1f, // criticalHigh = 8,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304106 0xd0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304107 0x07, // criticalLow = 2,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304108 0x28,
Andrew Jeffery01731472023-06-13 10:33:18 +09304109 0x23, // fatalHigh = 9,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304110 0xe8,
Andrew Jeffery01731472023-06-13 10:33:18 +09304111 0x03 // fatalLow = 1,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304112 };
4113
4114 struct pldm_numeric_sensor_value_pdr decodedPdr;
4115 auto rc =
4116 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4117 EXPECT_EQ(PLDM_SUCCESS, rc);
4118
4119 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT16, decodedPdr.sensor_data_size);
4120 EXPECT_EQ(4096, decodedPdr.max_readable.value_u16);
4121 EXPECT_EQ(0, decodedPdr.min_readable.value_u16);
4122 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT16, decodedPdr.range_field_format);
4123 EXPECT_EQ(5000, decodedPdr.nominal_value.value_u16);
4124 EXPECT_EQ(6000, decodedPdr.normal_max.value_u16);
4125 EXPECT_EQ(4000, decodedPdr.normal_min.value_u16);
4126 EXPECT_EQ(7000, decodedPdr.warning_high.value_u16);
4127 EXPECT_EQ(3000, decodedPdr.warning_low.value_u16);
4128 EXPECT_EQ(8000, decodedPdr.critical_high.value_u16);
4129 EXPECT_EQ(2000, decodedPdr.critical_low.value_u16);
4130 EXPECT_EQ(9000, decodedPdr.fatal_high.value_u16);
4131 EXPECT_EQ(1000, decodedPdr.fatal_low.value_u16);
4132}
4133
4134TEST(decodeNumericSensorPdrData, Sint16Test)
4135{
4136 std::vector<uint8_t> pdr1{
4137 0x1,
4138 0x0,
4139 0x0,
4140 0x0, // record handle
4141 0x1, // PDRHeaderVersion
4142 PLDM_NUMERIC_SENSOR_PDR, // PDRType
4143 0x0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304144 0x0, // recordChangeNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304145 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
4146 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 2 +
4147 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
Andrew Jeffery01731472023-06-13 10:33:18 +09304148 0, // dataLength
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304149 0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304150 0, // PLDMTerminusHandle
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304151 0x1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304152 0x0, // sensorID=1
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304153 PLDM_ENTITY_POWER_SUPPLY,
Andrew Jeffery01731472023-06-13 10:33:18 +09304154 0, // entityType=Power Supply(120)
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304155 1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304156 0, // entityInstanceNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304157 0x1,
4158 0x0, // containerID=1
4159 PLDM_NO_INIT, // sensorInit
4160 false, // sensorAuxiliaryNamesPDR
4161 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
4162 0, // unitModifier
4163 0, // rateUnit
4164 0, // baseOEMUnitHandle
4165 0, // auxUnit
4166 0, // auxUnitModifier
4167 0, // auxRateUnit
4168 0, // rel
4169 0, // auxOEMUnitHandle
4170 true, // isLinear
4171 PLDM_SENSOR_DATA_SIZE_SINT16, // sensorDataSize
4172 0,
4173 0,
4174 0,
4175 0, // resolution
4176 0,
4177 0,
4178 0,
4179 0, // offset
4180 0,
4181 0, // accuracy
4182 0, // plusTolerance
4183 0, // minusTolerance
4184 3,
4185 0, // hysteresis
4186 0, // supportedThresholds
4187 0, // thresholdAndHysteresisVolatility
4188 0,
4189 0,
4190 0x80,
4191 0x3f, // stateTransistionInterval=1.0
4192 0,
4193 0,
4194 0x80,
Andrew Jeffery01731472023-06-13 10:33:18 +09304195 0x3f, // updateInverval=1.0
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304196 0xe8,
Andrew Jeffery01731472023-06-13 10:33:18 +09304197 0x03, // maxReadable = 1000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304198 0x18,
4199 0xfc, // minReadable = -1000
4200 PLDM_RANGE_FIELD_FORMAT_SINT16, // rangeFieldFormat
4201 0, // rangeFieldsupport
4202 0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304203 0, // nominalValue = 0
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304204 0xf4,
Andrew Jeffery01731472023-06-13 10:33:18 +09304205 0x01, // normalMax = 500
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304206 0x0c,
Andrew Jeffery01731472023-06-13 10:33:18 +09304207 0xfe, // normalMin = -500
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304208 0xe8,
Andrew Jeffery01731472023-06-13 10:33:18 +09304209 0x03, // warningHigh = 1,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304210 0x18,
Andrew Jeffery01731472023-06-13 10:33:18 +09304211 0xfc, // warningLow = -1,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304212 0xd0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304213 0x07, // criticalHigh = 2,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304214 0x30,
Andrew Jeffery01731472023-06-13 10:33:18 +09304215 0xf8, // criticalLow = -2,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304216 0xb8,
Andrew Jeffery01731472023-06-13 10:33:18 +09304217 0x0b, // fatalHigh = 3,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304218 0x48,
Andrew Jeffery01731472023-06-13 10:33:18 +09304219 0xf4 // fatalLow = -3,000
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304220 };
4221
4222 struct pldm_numeric_sensor_value_pdr decodedPdr;
4223 auto rc =
4224 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4225 EXPECT_EQ(PLDM_SUCCESS, rc);
4226
4227 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT16, decodedPdr.sensor_data_size);
4228 EXPECT_EQ(1000, decodedPdr.max_readable.value_s16);
4229 EXPECT_EQ(-1000, decodedPdr.min_readable.value_s16);
4230 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT16, decodedPdr.range_field_format);
4231 EXPECT_EQ(0, decodedPdr.nominal_value.value_s16);
4232 EXPECT_EQ(500, decodedPdr.normal_max.value_s16);
4233 EXPECT_EQ(-500, decodedPdr.normal_min.value_s16);
4234 EXPECT_EQ(1000, decodedPdr.warning_high.value_s16);
4235 EXPECT_EQ(-1000, decodedPdr.warning_low.value_s16);
4236 EXPECT_EQ(2000, decodedPdr.critical_high.value_s16);
4237 EXPECT_EQ(-2000, decodedPdr.critical_low.value_s16);
4238 EXPECT_EQ(3000, decodedPdr.fatal_high.value_s16);
4239 EXPECT_EQ(-3000, decodedPdr.fatal_low.value_s16);
4240}
4241
4242TEST(decodeNumericSensorPdrData, Uint32Test)
4243{
4244 std::vector<uint8_t> pdr1{
4245 0x1,
4246 0x0,
4247 0x0,
4248 0x0, // record handle
4249 0x1, // PDRHeaderVersion
4250 PLDM_NUMERIC_SENSOR_PDR, // PDRType
4251 0x0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304252 0x0, // recordChangeNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304253 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
4254 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
4255 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
Andrew Jeffery01731472023-06-13 10:33:18 +09304256 0, // dataLength
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304257 0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304258 0, // PLDMTerminusHandle
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304259 0x1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304260 0x0, // sensorID=1
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304261 PLDM_ENTITY_POWER_SUPPLY,
Andrew Jeffery01731472023-06-13 10:33:18 +09304262 0, // entityType=Power Supply(120)
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304263 1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304264 0, // entityInstanceNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304265 0x1,
4266 0x0, // containerID=1
4267 PLDM_NO_INIT, // sensorInit
4268 false, // sensorAuxiliaryNamesPDR
4269 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
4270 0, // unitModifier
4271 0, // rateUnit
4272 0, // baseOEMUnitHandle
4273 0, // auxUnit
4274 0, // auxUnitModifier
4275 0, // auxRateUnit
4276 0, // rel
4277 0, // auxOEMUnitHandle
4278 true, // isLinear
4279 PLDM_SENSOR_DATA_SIZE_UINT32, // sensorDataSize
4280 0,
4281 0,
4282 0,
4283 0, // resolution
4284 0,
4285 0,
4286 0,
4287 0, // offset
4288 0,
4289 0, // accuracy
4290 0, // plusTolerance
4291 0, // minusTolerance
4292 3,
4293 0,
4294 0,
4295 0, // hysteresis
4296 0, // supportedThresholds
4297 0, // thresholdAndHysteresisVolatility
4298 0,
4299 0,
4300 0x80,
4301 0x3f, // stateTransistionInterval=1.0
4302 0,
4303 0,
4304 0x80,
4305 0x3f, // updateInverval=1.0
4306 0,
4307 0x10,
4308 0,
4309 0, // maxReadable = 4096
4310 0,
4311 0,
4312 0,
4313 0, // minReadable = 0
4314 PLDM_RANGE_FIELD_FORMAT_UINT32, // rangeFieldFormat
4315 0, // rangeFieldsupport
4316 0x40,
4317 0x4b,
4318 0x4c,
4319 0x00, // nominalValue = 5,000,000
4320 0x80,
4321 0x8d,
4322 0x5b,
4323 0x00, // normalMax = 6,000,000
4324 0x00,
4325 0x09,
4326 0x3d,
4327 0x00, // normalMin = 4,000,000
4328 0xc0,
4329 0xcf,
4330 0x6a,
4331 0x00, // warningHigh = 7,000,000
4332 0xc0,
4333 0xc6,
4334 0x2d,
4335 0x00, // warningLow = 3,000,000
4336 0x00,
4337 0x12,
4338 0x7a,
4339 0x00, // criticalHigh = 8,000,000
4340 0x80,
4341 0x84,
4342 0x1e,
4343 0x00, // criticalLow = 2,000,000
4344 0x40,
4345 0x54,
4346 0x89,
4347 0x00, // fatalHigh = 9,000,000
4348 0x40,
4349 0x42,
4350 0x0f,
4351 0x00 // fatalLow = 1,000,000
4352 };
4353
4354 struct pldm_numeric_sensor_value_pdr decodedPdr;
4355 auto rc =
4356 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4357 EXPECT_EQ(PLDM_SUCCESS, rc);
4358
4359 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT32, decodedPdr.sensor_data_size);
4360 EXPECT_EQ(4096, decodedPdr.max_readable.value_u32);
4361 EXPECT_EQ(0, decodedPdr.min_readable.value_u32);
4362 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT32, decodedPdr.range_field_format);
4363 EXPECT_EQ(5000000, decodedPdr.nominal_value.value_u32);
4364 EXPECT_EQ(6000000, decodedPdr.normal_max.value_u32);
4365 EXPECT_EQ(4000000, decodedPdr.normal_min.value_u32);
4366 EXPECT_EQ(7000000, decodedPdr.warning_high.value_u32);
4367 EXPECT_EQ(3000000, decodedPdr.warning_low.value_u32);
4368 EXPECT_EQ(8000000, decodedPdr.critical_high.value_u32);
4369 EXPECT_EQ(2000000, decodedPdr.critical_low.value_u32);
4370 EXPECT_EQ(9000000, decodedPdr.fatal_high.value_u32);
4371 EXPECT_EQ(1000000, decodedPdr.fatal_low.value_u32);
4372}
4373
4374TEST(decodeNumericSensorPdrData, Sint32Test)
4375{
4376 std::vector<uint8_t> pdr1{
4377 0x1,
4378 0x0,
4379 0x0,
4380 0x0, // record handle
4381 0x1, // PDRHeaderVersion
4382 PLDM_NUMERIC_SENSOR_PDR, // PDRType
4383 0x0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304384 0x0, // recordChangeNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304385 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
4386 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
4387 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
Andrew Jeffery01731472023-06-13 10:33:18 +09304388 0, // dataLength
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304389 0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304390 0, // PLDMTerminusHandle
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304391 0x1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304392 0x0, // sensorID=1
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304393 PLDM_ENTITY_POWER_SUPPLY,
Andrew Jeffery01731472023-06-13 10:33:18 +09304394 0, // entityType=Power Supply(120)
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304395 1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304396 0, // entityInstanceNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304397 0x1,
4398 0x0, // containerID=1
4399 PLDM_NO_INIT, // sensorInit
4400 false, // sensorAuxiliaryNamesPDR
4401 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
4402 0, // unitModifier
4403 0, // rateUnit
4404 0, // baseOEMUnitHandle
4405 0, // auxUnit
4406 0, // auxUnitModifier
4407 0, // auxRateUnit
4408 0, // rel
4409 0, // auxOEMUnitHandle
4410 true, // isLinear
4411 PLDM_SENSOR_DATA_SIZE_SINT32, // sensorDataSize
4412 0,
4413 0,
4414 0,
4415 0, // resolution
4416 0,
4417 0,
4418 0,
4419 0, // offset
4420 0,
4421 0, // accuracy
4422 0, // plusTolerance
4423 0, // minusTolerance
4424 3,
4425 0,
4426 0,
4427 0, // hysteresis
4428 0, // supportedThresholds
4429 0, // thresholdAndHysteresisVolatility
4430 0,
4431 0,
4432 0x80,
4433 0x3f, // stateTransistionInterval=1.0
4434 0,
4435 0,
4436 0x80,
4437 0x3f, // updateInverval=1.0
4438 0xa0,
4439 0x86,
4440 0x01,
4441 0x00, // maxReadable = 100000
4442 0x60,
4443 0x79,
4444 0xfe,
4445 0xff, // minReadable = -10000
4446 PLDM_RANGE_FIELD_FORMAT_SINT32, // rangeFieldFormat
4447 0, // rangeFieldsupport
4448 0,
4449 0,
4450 0,
4451 0, // nominalValue = 0
4452 0x20,
4453 0xa1,
4454 0x07,
4455 0x00, // normalMax = 500,000
4456 0xe0,
4457 0x5e,
4458 0xf8,
4459 0xff, // normalMin = -500,000
4460 0x40,
4461 0x42,
4462 0x0f,
4463 0x00, // warningHigh = 1,000,000
4464 0xc0,
4465 0xbd,
4466 0xf0,
4467 0xff, // warningLow = -1,000,000
4468 0x80,
4469 0x84,
4470 0x1e,
4471 0x00, // criticalHigh = 2,000,000
4472 0x80,
4473 0x7b,
4474 0xe1,
4475 0xff, // criticalLow = -2,000,000
4476 0xc0,
4477 0xc6,
4478 0x2d,
4479 0x00, // fatalHigh = 3,000,000
4480 0x40,
4481 0x39,
4482 0xd2,
4483 0xff // fatalLow = -3,000,000
4484 };
4485
4486 struct pldm_numeric_sensor_value_pdr decodedPdr;
4487 auto rc =
4488 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4489 EXPECT_EQ(PLDM_SUCCESS, rc);
4490
4491 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT32, decodedPdr.sensor_data_size);
4492 EXPECT_EQ(100000, decodedPdr.max_readable.value_s32);
4493 EXPECT_EQ(-100000, decodedPdr.min_readable.value_s32);
4494 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT32, decodedPdr.range_field_format);
4495 EXPECT_EQ(0, decodedPdr.nominal_value.value_s32);
4496 EXPECT_EQ(500000, decodedPdr.normal_max.value_s32);
4497 EXPECT_EQ(-500000, decodedPdr.normal_min.value_s32);
4498 EXPECT_EQ(1000000, decodedPdr.warning_high.value_s32);
4499 EXPECT_EQ(-1000000, decodedPdr.warning_low.value_s32);
4500 EXPECT_EQ(2000000, decodedPdr.critical_high.value_s32);
4501 EXPECT_EQ(-2000000, decodedPdr.critical_low.value_s32);
4502 EXPECT_EQ(3000000, decodedPdr.fatal_high.value_s32);
4503 EXPECT_EQ(-3000000, decodedPdr.fatal_low.value_s32);
4504}
4505
4506TEST(decodeNumericSensorPdrData, Real32Test)
4507{
4508 std::vector<uint8_t> pdr1{
4509 0x1,
4510 0x0,
4511 0x0,
4512 0x0, // record handle
4513 0x1, // PDRHeaderVersion
4514 PLDM_NUMERIC_SENSOR_PDR, // PDRType
4515 0x0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304516 0x0, // recordChangeNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304517 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
4518 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
4519 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
Andrew Jeffery01731472023-06-13 10:33:18 +09304520 0, // dataLength
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304521 0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304522 0, // PLDMTerminusHandle
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304523 0x1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304524 0x0, // sensorID=1
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304525 PLDM_ENTITY_POWER_SUPPLY,
Andrew Jeffery01731472023-06-13 10:33:18 +09304526 0, // entityType=Power Supply(120)
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304527 1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304528 0, // entityInstanceNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304529 0x1,
4530 0x0, // containerID=1
4531 PLDM_NO_INIT, // sensorInit
4532 false, // sensorAuxiliaryNamesPDR
4533 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
4534 0, // unitModifier
4535 0, // rateUnit
4536 0, // baseOEMUnitHandle
4537 0, // auxUnit
4538 0, // auxUnitModifier
4539 0, // auxRateUnit
4540 0, // rel
4541 0, // auxOEMUnitHandle
4542 true, // isLinear
4543 PLDM_SENSOR_DATA_SIZE_SINT32, // sensorDataSize
4544 0,
4545 0,
4546 0,
4547 0, // resolution
4548 0,
4549 0,
4550 0,
4551 0, // offset
4552 0,
4553 0, // accuracy
4554 0, // plusTolerance
4555 0, // minusTolerance
4556 3,
4557 0,
4558 0,
4559 0, // hysteresis
4560 0, // supportedThresholds
4561 0, // thresholdAndHysteresisVolatility
4562 0,
4563 0,
4564 0x80,
4565 0x3f, // stateTransistionInterval=1.0
4566 0,
4567 0,
4568 0x80,
4569 0x3f, // updateInverval=1.0
4570 0xa0,
4571 0x86,
4572 0x01,
4573 0x00, // maxReadable = 100000
4574 0x60,
4575 0x79,
4576 0xfe,
4577 0xff, // minReadable = -10000
4578 PLDM_RANGE_FIELD_FORMAT_REAL32, // rangeFieldFormat
4579 0, // rangeFieldsupport
4580 0,
4581 0,
4582 0,
4583 0, // nominalValue = 0.0
4584 0x33,
4585 0x33,
4586 0x48,
4587 0x42, // normalMax = 50.05
4588 0x33,
4589 0x33,
4590 0x48,
4591 0xc2, // normalMin = -50.05
4592 0x83,
4593 0x00,
4594 0xc8,
4595 0x42, // warningHigh = 100.001
4596 0x83,
4597 0x00,
4598 0xc8,
4599 0xc2, // warningLow = -100.001
4600 0x83,
4601 0x00,
4602 0x48,
4603 0x43, // criticalHigh = 200.002
4604 0x83,
4605 0x00,
4606 0x48,
4607 0xc3, // criticalLow = -200.002
4608 0x62,
4609 0x00,
4610 0x96,
4611 0x43, // fatalHigh = 300.003
4612 0x62,
4613 0x00,
4614 0x96,
4615 0xc3 // fatalLow = -300.003
4616 };
4617
4618 struct pldm_numeric_sensor_value_pdr decodedPdr;
4619 auto rc =
4620 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4621 EXPECT_EQ(PLDM_SUCCESS, rc);
4622
4623 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT32, decodedPdr.sensor_data_size);
4624 EXPECT_EQ(100000, decodedPdr.max_readable.value_s32);
4625 EXPECT_EQ(-100000, decodedPdr.min_readable.value_s32);
4626 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_REAL32, decodedPdr.range_field_format);
4627 EXPECT_FLOAT_EQ(0, decodedPdr.nominal_value.value_f32);
4628 EXPECT_FLOAT_EQ(50.05f, decodedPdr.normal_max.value_f32);
4629 EXPECT_FLOAT_EQ(-50.05f, decodedPdr.normal_min.value_f32);
4630 EXPECT_FLOAT_EQ(100.001f, decodedPdr.warning_high.value_f32);
4631 EXPECT_FLOAT_EQ(-100.001f, decodedPdr.warning_low.value_f32);
4632 EXPECT_FLOAT_EQ(200.002f, decodedPdr.critical_high.value_f32);
4633 EXPECT_FLOAT_EQ(-200.002f, decodedPdr.critical_low.value_f32);
4634 EXPECT_FLOAT_EQ(300.003f, decodedPdr.fatal_high.value_f32);
4635 EXPECT_FLOAT_EQ(-300.003f, decodedPdr.fatal_low.value_f32);
4636}
4637
4638TEST(decodeNumericSensorPdrDataDeathTest, InvalidSizeTest)
4639{
4640 // A corrupted PDR. The data after plusTolerance missed.
4641 std::vector<uint8_t> pdr1{
4642 0x1,
4643 0x0,
4644 0x0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304645 0x0, // record handle
4646 0x1, // PDRHeaderVersion
4647 PLDM_NUMERIC_SENSOR_PDR, // PDRType
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304648 0x0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304649 0x0, // recordChangeNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304650 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH,
Andrew Jeffery01731472023-06-13 10:33:18 +09304651 0, // dataLength
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304652 0,
Andrew Jeffery01731472023-06-13 10:33:18 +09304653 0, // PLDMTerminusHandle
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304654 0x1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304655 0x0, // sensorID=1
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304656 PLDM_ENTITY_POWER_SUPPLY,
Andrew Jeffery01731472023-06-13 10:33:18 +09304657 0, // entityType=Power Supply(120)
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304658 1,
Andrew Jeffery01731472023-06-13 10:33:18 +09304659 0, // entityInstanceNumber
Andrew Jeffery7992eb82023-04-06 16:13:53 +09304660 0x1,
4661 0x0, // containerID=1
4662 PLDM_NO_INIT, // sensorInit
4663 false, // sensorAuxiliaryNamesPDR
4664 2, // baseUint(2)=degrees C
4665 0, // unitModifier
4666 0, // rateUnit
4667 0, // baseOEMUnitHandle
4668 0, // auxUnit
4669 0, // auxUnitModifier
4670 0, // auxRateUnit
4671 0, // rel
4672 0, // auxOEMUnitHandle
4673 true, // isLinear
4674 PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize
4675 0,
4676 0,
4677 0,
4678 0, // resolution
4679 0,
4680 0,
4681 0,
4682 0, // offset
4683 0,
4684 0, // accuracy
4685 0 // plusTolerance
4686 };
4687
4688 struct pldm_numeric_sensor_value_pdr decodedPdr;
4689 int rc =
4690 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4691 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
4692}
Thu Nguyend4878cd2023-11-09 10:18:33 +07004693
Andrew Jeffery688be622024-05-23 11:22:51 +09304694#ifdef LIBPLDM_API_TESTING
Thu Nguyend4878cd2023-11-09 10:18:33 +07004695TEST(decodeNumericEffecterPdrData, Uint8Test)
4696{
4697 std::vector<uint8_t> pdr1{
4698 0x1,
4699 0x0,
4700 0x0,
4701 0x0, // record handle
4702 0x1, // PDRHeaderVersion
4703 PLDM_NUMERIC_EFFECTER_PDR, // PDRType
4704 0x0,
4705 0x0, // recordChangeNumber
4706 PLDM_PDR_NUMERIC_EFFECTER_PDR_MIN_LENGTH,
4707 0, // dataLength
4708 0,
4709 0, // PLDMTerminusHandle
4710 0x1,
4711 0x0, // effecterID=1
4712 PLDM_ENTITY_POWER_SUPPLY,
4713 0, // entityType=Power Supply(120)
4714 1,
4715 0, // entityInstanceNumber
4716 1,
4717 0, // containerID=1
4718 0x2,
4719 0x0, // effecter_semantic_id=2
4720 PLDM_NO_INIT, // effecterInit
4721 false, // effecterAuxiliaryNames
4722 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
4723 0, // unitModifier
4724 0, // rateUnit
4725 0, // baseOEMUnitHandle
4726 0, // auxUnit
4727 0, // auxUnitModifier
4728 4, // auxRateUnit
4729 0, // auxOEMUnitHandle
4730 true, // isLinear
4731 PLDM_EFFECTER_DATA_SIZE_UINT8, // effecterDataSize
4732 0,
4733 0,
4734 0xc0,
4735 0x3f, // resolution=1.5
4736 0,
4737 0,
4738 0x80,
4739 0x3f, // offset=1.0
4740 0,
4741 0, // accuracy
4742 0, // plusTolerance
4743 0, // minusTolerance
4744 0,
4745 0,
4746 0x80,
4747 0x3f, // stateTransistionInterval=1.0
4748 0,
4749 0,
4750 0x80,
4751 0x3f, // transition_interval=1.0
4752 255, // maxSetdable
4753 0, // minSetable
4754 PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
4755 0x1f, // rangeFieldsupport
4756 50, // nominalValue = 50
4757 60, // normalMax = 60
4758 40, // normalMin = 40
4759 90, // rated_max = 90
4760 10 // rated_min = 10
4761 };
4762
4763 struct pldm_numeric_effecter_value_pdr decodedPdr;
4764 auto rc =
4765 decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4766 EXPECT_EQ(PLDM_SUCCESS, rc);
4767 EXPECT_EQ(1, decodedPdr.hdr.record_handle);
4768 EXPECT_EQ(1, decodedPdr.hdr.version);
4769 EXPECT_EQ(PLDM_NUMERIC_EFFECTER_PDR, decodedPdr.hdr.type);
4770 EXPECT_EQ(0, decodedPdr.hdr.record_change_num);
4771 EXPECT_EQ(PLDM_PDR_NUMERIC_EFFECTER_PDR_MIN_LENGTH, decodedPdr.hdr.length);
4772 EXPECT_EQ(1, decodedPdr.effecter_id);
4773 EXPECT_EQ(PLDM_ENTITY_POWER_SUPPLY, decodedPdr.entity_type);
4774 EXPECT_EQ(1, decodedPdr.entity_instance);
4775 EXPECT_EQ(1, decodedPdr.container_id);
4776 EXPECT_EQ(2, decodedPdr.effecter_semantic_id);
4777 EXPECT_EQ(PLDM_NO_INIT, decodedPdr.effecter_init);
4778 EXPECT_EQ(false, decodedPdr.effecter_auxiliary_names);
4779 EXPECT_EQ(PLDM_SENSOR_UNIT_DEGRESS_C, decodedPdr.base_unit);
4780 EXPECT_EQ(0, decodedPdr.unit_modifier);
4781 EXPECT_EQ(0, decodedPdr.rate_unit);
4782 EXPECT_EQ(0, decodedPdr.base_oem_unit_handle);
4783 EXPECT_EQ(0, decodedPdr.aux_unit);
4784 EXPECT_EQ(0, decodedPdr.aux_unit_modifier);
4785 EXPECT_EQ(4, decodedPdr.aux_rate_unit);
4786 EXPECT_EQ(0, decodedPdr.aux_oem_unit_handle);
4787 EXPECT_EQ(true, decodedPdr.is_linear);
4788 EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_UINT8, decodedPdr.effecter_data_size);
4789 EXPECT_FLOAT_EQ(1.5f, decodedPdr.resolution);
4790 EXPECT_FLOAT_EQ(1.0f, decodedPdr.offset);
4791 EXPECT_EQ(0, decodedPdr.accuracy);
4792 EXPECT_EQ(0, decodedPdr.plus_tolerance);
4793 EXPECT_EQ(0, decodedPdr.minus_tolerance);
4794 EXPECT_FLOAT_EQ(1.0f, decodedPdr.state_transition_interval);
4795 EXPECT_FLOAT_EQ(1.0f, decodedPdr.transition_interval);
4796 EXPECT_EQ(255, decodedPdr.max_settable.value_u8);
4797 EXPECT_EQ(0, decodedPdr.min_settable.value_u8);
4798 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT8, decodedPdr.range_field_format);
4799 EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
4800 EXPECT_EQ(50, decodedPdr.nominal_value.value_u8);
4801 EXPECT_EQ(60, decodedPdr.normal_max.value_u8);
4802 EXPECT_EQ(40, decodedPdr.normal_min.value_u8);
4803 EXPECT_EQ(90, decodedPdr.rated_max.value_u8);
4804 EXPECT_EQ(10, decodedPdr.rated_min.value_u8);
4805}
Andrew Jeffery688be622024-05-23 11:22:51 +09304806#endif
Thu Nguyend4878cd2023-11-09 10:18:33 +07004807
Andrew Jeffery688be622024-05-23 11:22:51 +09304808#ifdef LIBPLDM_API_TESTING
Thu Nguyend4878cd2023-11-09 10:18:33 +07004809TEST(decodeNumericEffecterPdrData, Sint8Test)
4810{
4811 std::vector<uint8_t> pdr1{
4812 0x1,
4813 0x0,
4814 0x0,
4815 0x0, // record handle
4816 0x1, // PDRHeaderVersion
4817 PLDM_NUMERIC_EFFECTER_PDR, // PDRType
4818 0x0,
4819 0x0, // recordChangeNumber
4820 PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
4821 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH +
4822 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH,
4823 0, // dataLength
4824 0,
4825 0, // PLDMTerminusHandle
4826 0x1,
4827 0x0, // effecterID=1
4828 PLDM_ENTITY_POWER_SUPPLY,
4829 0, // entityType=Power Supply(120)
4830 1,
4831 0, // entityInstanceNumber
4832 0x1,
4833 0x0, // containerID=1
4834 0x2,
4835 0x0, // effecter_semantic_id=2
4836 PLDM_NO_INIT, // effecterInit
4837 false, // effecterAuxiliaryNames
4838 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
4839 0, // unitModifier
4840 0, // rateUnit
4841 0, // baseOEMUnitHandle
4842 0, // auxUnit
4843 0, // auxUnitModifier
4844 0, // auxRateUnit
4845 0, // auxOEMUnitHandle
4846 true, // isLinear
4847 PLDM_RANGE_FIELD_FORMAT_SINT8, // effecterDataSize
4848 0,
4849 0,
4850 0,
4851 0, // resolution
4852 0,
4853 0,
4854 0,
4855 0, // offset
4856 0,
4857 0, // accuracy
4858 0, // plusTolerance
4859 0, // minusTolerance
4860 0,
4861 0,
4862 0x80,
4863 0x3f, // stateTransistionInterval=1.0
4864 0,
4865 0,
4866 0x80,
4867 0x3f, // transition_interval=1.0
4868 0x64, // maxSetdable = 100
4869 0x9c, // minSetable = -100
4870 PLDM_RANGE_FIELD_FORMAT_SINT8, // rangeFieldFormat
4871 0x1f, // rangeFieldsupport
4872 0, // nominalValue = 0
4873 5, // normalMax = 5
4874 0xfb, // normalMin = -5
4875 30, // rated_max = 30
4876 0xe2 // rated_min = -30
4877 };
4878
4879 struct pldm_numeric_effecter_value_pdr decodedPdr;
4880 auto rc =
4881 decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4882 EXPECT_EQ(PLDM_SUCCESS, rc);
4883
4884 EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_SINT8, decodedPdr.effecter_data_size);
4885 EXPECT_EQ(100, decodedPdr.max_settable.value_s8);
4886 EXPECT_EQ(-100, decodedPdr.min_settable.value_s8);
4887 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT8, decodedPdr.range_field_format);
4888 EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
4889 EXPECT_EQ(0, decodedPdr.nominal_value.value_s8);
4890 EXPECT_EQ(5, decodedPdr.normal_max.value_s8);
4891 EXPECT_EQ(-5, decodedPdr.normal_min.value_s8);
4892 EXPECT_EQ(30, decodedPdr.rated_max.value_s8);
4893 EXPECT_EQ(-30, decodedPdr.rated_min.value_s8);
4894}
Andrew Jeffery688be622024-05-23 11:22:51 +09304895#endif
Thu Nguyend4878cd2023-11-09 10:18:33 +07004896
Andrew Jeffery688be622024-05-23 11:22:51 +09304897#ifdef LIBPLDM_API_TESTING
Thu Nguyend4878cd2023-11-09 10:18:33 +07004898TEST(decodeNumericEffecterPdrData, Uint16Test)
4899{
4900 std::vector<uint8_t> pdr1{
4901 0x1,
4902 0x0,
4903 0x0,
4904 0x0, // record handle
4905 0x1, // PDRHeaderVersion
4906 PLDM_NUMERIC_EFFECTER_PDR, // PDRType
4907 0x0,
4908 0x0, // recordChangeNumber
4909 PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
4910 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH *
4911 2 +
4912 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
4913 0, // dataLength
4914 0,
4915 0, // PLDMTerminusHandle
4916 0x1,
4917 0x0, // effecterID=1
4918 PLDM_ENTITY_POWER_SUPPLY,
4919 0, // entityType=Power Supply(120)
4920 1,
4921 0, // entityInstanceNumber
4922 0x1,
4923 0x0, // containerID=1
4924 0x2,
4925 0x0, // effecter_semantic_id=2
4926 PLDM_NO_INIT, // effecterInit
4927 false, // effecterAuxiliaryNames
4928 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
4929 0, // unitModifier
4930 0, // rateUnit
4931 0, // baseOEMUnitHandle
4932 0, // auxUnit
4933 0, // auxUnitModifier
4934 0, // auxRateUnit
4935 0, // auxOEMUnitHandle
4936 true, // isLinear
4937 PLDM_EFFECTER_DATA_SIZE_UINT16, // effecterDataSize
4938 0,
4939 0,
4940 0,
4941 0, // resolution
4942 0,
4943 0,
4944 0,
4945 0, // offset
4946 0,
4947 0, // accuracy
4948 0, // plusTolerance
4949 0, // minusTolerance
4950 0,
4951 0,
4952 0x80,
4953 0x3f, // stateTransistionInterval=1.0
4954 0,
4955 0,
4956 0x80,
4957 0x3f, // transition_interval=1.0
4958 0,
4959 0x10, // maxSetdable = 4096
4960 0,
4961 0, // minSetable = 0
4962 PLDM_RANGE_FIELD_FORMAT_UINT16, // rangeFieldFormat
4963 0x1f, // rangeFieldsupport
4964 0x88,
4965 0x13, // nominalValue = 5,000
4966 0x70,
4967 0x17, // normalMax = 6,000
4968 0xa0,
4969 0x0f, // normalMin = 4,000
4970 0x28,
4971 0x23, // rated_max = 9,000
4972 0xe8,
4973 0x03 // rated_min = 1,000
4974 };
4975
4976 struct pldm_numeric_effecter_value_pdr decodedPdr;
4977 auto rc =
4978 decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4979 EXPECT_EQ(PLDM_SUCCESS, rc);
4980
4981 EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_UINT16, decodedPdr.effecter_data_size);
4982 EXPECT_EQ(4096, decodedPdr.max_settable.value_u16);
4983 EXPECT_EQ(0, decodedPdr.min_settable.value_u16);
4984 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT16, decodedPdr.range_field_format);
4985 EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
4986 EXPECT_EQ(5000, decodedPdr.nominal_value.value_u16);
4987 EXPECT_EQ(6000, decodedPdr.normal_max.value_u16);
4988 EXPECT_EQ(4000, decodedPdr.normal_min.value_u16);
4989 EXPECT_EQ(9000, decodedPdr.rated_max.value_u16);
4990 EXPECT_EQ(1000, decodedPdr.rated_min.value_u16);
4991}
Andrew Jeffery688be622024-05-23 11:22:51 +09304992#endif
Thu Nguyend4878cd2023-11-09 10:18:33 +07004993
Andrew Jeffery688be622024-05-23 11:22:51 +09304994#ifdef LIBPLDM_API_TESTING
Thu Nguyend4878cd2023-11-09 10:18:33 +07004995TEST(decodeNumericEffecterPdrData, Sint16Test)
4996{
4997 std::vector<uint8_t> pdr1{
4998 0x1,
4999 0x0,
5000 0x0,
5001 0x0, // record handle
5002 0x1, // PDRHeaderVersion
5003 PLDM_NUMERIC_EFFECTER_PDR, // PDRType
5004 0x0,
5005 0x0, // recordChangeNumber
5006 PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
5007 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH *
5008 2 +
5009 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
5010 0, // dataLength
5011 0,
5012 0, // PLDMTerminusHandle
5013 0x1,
5014 0x0, // effecterID=1
5015 PLDM_ENTITY_POWER_SUPPLY,
5016 0, // entityType=Power Supply(120)
5017 1,
5018 0, // entityInstanceNumber
5019 0x1,
5020 0x0, // containerID=1
5021 0x2,
5022 0x0, // effecter_semantic_id=2
5023 PLDM_NO_INIT, // effecterInit
5024 false, // effecterAuxiliaryNames
5025 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
5026 0, // unitModifier
5027 0, // rateUnit
5028 0, // baseOEMUnitHandle
5029 0, // auxUnit
5030 0, // auxUnitModifier
5031 0, // auxRateUnit
5032 0, // auxOEMUnitHandle
5033 true, // isLinear
5034 PLDM_EFFECTER_DATA_SIZE_SINT16, // effecterDataSize
5035 0,
5036 0,
5037 0,
5038 0, // resolution
5039 0,
5040 0,
5041 0,
5042 0, // offset
5043 0,
5044 0, // accuracy
5045 0, // plusTolerance
5046 0, // minusTolerance
5047 0,
5048 0,
5049 0x80,
5050 0x3f, // stateTransistionInterval=1.0
5051 0,
5052 0,
5053 0x80,
5054 0x3f, // transition_interval=1.0
5055 0xe8,
5056 0x03, // maxSetdable = 1000
5057 0x18,
5058 0xfc, // minSetable = -1000
5059 PLDM_RANGE_FIELD_FORMAT_SINT16, // rangeFieldFormat
5060 0x1f, // rangeFieldsupport
5061 0,
5062 0, // nominalValue = 0
5063 0xf4,
5064 0x01, // normalMax = 500
5065 0x0c,
5066 0xfe, // normalMin = -500
5067 0xb8,
5068 0x0b, // rated_max = 3,000
5069 0x48,
5070 0xf4 // rated_min = -3,000
5071 };
5072
5073 struct pldm_numeric_effecter_value_pdr decodedPdr;
5074 auto rc =
5075 decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
5076 EXPECT_EQ(PLDM_SUCCESS, rc);
5077
5078 EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_SINT16, decodedPdr.effecter_data_size);
5079 EXPECT_EQ(1000, decodedPdr.max_settable.value_s16);
5080 EXPECT_EQ(-1000, decodedPdr.min_settable.value_s16);
5081 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT16, decodedPdr.range_field_format);
5082 EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
5083 EXPECT_EQ(0, decodedPdr.nominal_value.value_s16);
5084 EXPECT_EQ(500, decodedPdr.normal_max.value_s16);
5085 EXPECT_EQ(-500, decodedPdr.normal_min.value_s16);
5086 EXPECT_EQ(3000, decodedPdr.rated_max.value_s16);
5087 EXPECT_EQ(-3000, decodedPdr.rated_min.value_s16);
5088}
Andrew Jeffery688be622024-05-23 11:22:51 +09305089#endif
Thu Nguyend4878cd2023-11-09 10:18:33 +07005090
Andrew Jeffery688be622024-05-23 11:22:51 +09305091#ifdef LIBPLDM_API_TESTING
Thu Nguyend4878cd2023-11-09 10:18:33 +07005092TEST(decodeNumericEffecterPdrData, Uint32Test)
5093{
5094 std::vector<uint8_t> pdr1{
5095 0x1,
5096 0x0,
5097 0x0,
5098 0x0, // record handle
5099 0x1, // PDRHeaderVersion
5100 PLDM_NUMERIC_EFFECTER_PDR, // PDRType
5101 0x0,
5102 0x0, // recordChangeNumber
5103 PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
5104 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH *
5105 4 +
5106 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
5107 0, // dataLength
5108 0,
5109 0, // PLDMTerminusHandle
5110 0x1,
5111 0x0, // effecterID=1
5112 PLDM_ENTITY_POWER_SUPPLY,
5113 0, // entityType=Power Supply(120)
5114 1,
5115 0, // entityInstanceNumber
5116 0x1,
5117 0x0, // containerID=1
5118 0x2,
5119 0x0, // effecter_semantic_id=2
5120 PLDM_NO_INIT, // effecterInit
5121 false, // effecterAuxiliaryNames
5122 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
5123 0, // unitModifier
5124 0, // rateUnit
5125 0, // baseOEMUnitHandle
5126 0, // auxUnit
5127 0, // auxUnitModifier
5128 0, // auxRateUnit
5129 0, // auxOEMUnitHandle
5130 true, // isLinear
5131 PLDM_EFFECTER_DATA_SIZE_UINT32, // effecterDataSize
5132 0,
5133 0,
5134 0,
5135 0, // resolution
5136 0,
5137 0,
5138 0,
5139 0, // offset
5140 0,
5141 0, // accuracy
5142 0, // plusTolerance
5143 0, // minusTolerance
5144 0,
5145 0,
5146 0x80,
5147 0x3f, // stateTransistionInterval=1.0
5148 0,
5149 0,
5150 0x80,
5151 0x3f, // transition_interval=1.0
5152 0,
5153 0x10,
5154 0,
5155 0, // maxSetdable = 4096
5156 0,
5157 0,
5158 0,
5159 0, // minSetable = 0
5160 PLDM_RANGE_FIELD_FORMAT_UINT32, // rangeFieldFormat
5161 0x1f, // rangeFieldsupport
5162 0x40,
5163 0x4b,
5164 0x4c,
5165 0x00, // nominalValue = 5,000,000
5166 0x80,
5167 0x8d,
5168 0x5b,
5169 0x00, // normalMax = 6,000,000
5170 0x00,
5171 0x09,
5172 0x3d,
5173 0x00, // normalMin = 4,000,000
5174 0x40,
5175 0x54,
5176 0x89,
5177 0x00, // rated_max = 9,000,000
5178 0x40,
5179 0x42,
5180 0x0f,
5181 0x00 // rated_min = 1,000,000
5182 };
5183
5184 struct pldm_numeric_effecter_value_pdr decodedPdr;
5185 auto rc =
5186 decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
5187 EXPECT_EQ(PLDM_SUCCESS, rc);
5188
5189 EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_UINT32, decodedPdr.effecter_data_size);
5190 EXPECT_EQ(4096, decodedPdr.max_settable.value_u32);
5191 EXPECT_EQ(0, decodedPdr.min_settable.value_u32);
5192 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT32, decodedPdr.range_field_format);
5193 EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
5194 EXPECT_EQ(5000000, decodedPdr.nominal_value.value_u32);
5195 EXPECT_EQ(6000000, decodedPdr.normal_max.value_u32);
5196 EXPECT_EQ(4000000, decodedPdr.normal_min.value_u32);
5197 EXPECT_EQ(9000000, decodedPdr.rated_max.value_u32);
5198 EXPECT_EQ(1000000, decodedPdr.rated_min.value_u32);
5199}
Andrew Jeffery688be622024-05-23 11:22:51 +09305200#endif
Thu Nguyend4878cd2023-11-09 10:18:33 +07005201
Andrew Jeffery688be622024-05-23 11:22:51 +09305202#ifdef LIBPLDM_API_TESTING
Thu Nguyend4878cd2023-11-09 10:18:33 +07005203TEST(decodeNumericEffecterPdrData, Sint32Test)
5204{
5205 std::vector<uint8_t> pdr1{
5206 0x1,
5207 0x0,
5208 0x0,
5209 0x0, // record handle
5210 0x1, // PDRHeaderVersion
5211 PLDM_NUMERIC_EFFECTER_PDR, // PDRType
5212 0x0,
5213 0x0, // recordChangeNumber
5214 PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
5215 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH *
5216 4 +
5217 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
5218 0, // dataLength
5219 0,
5220 0, // PLDMTerminusHandle
5221 0x1,
5222 0x0, // effecterID=1
5223 PLDM_ENTITY_POWER_SUPPLY,
5224 0, // entityType=Power Supply(120)
5225 1,
5226 0, // entityInstanceNumber
5227 0x1,
5228 0x0, // containerID=1
5229 0x2,
5230 0x0, // effecter_semantic_id=2
5231 PLDM_NO_INIT, // effecterInit
5232 false, // effecterAuxiliaryNames
5233 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
5234 0, // unitModifier
5235 0, // rateUnit
5236 0, // baseOEMUnitHandle
5237 0, // auxUnit
5238 0, // auxUnitModifier
5239 0, // auxRateUnit
5240 0, // auxOEMUnitHandle
5241 true, // isLinear
5242 PLDM_EFFECTER_DATA_SIZE_SINT32, // effecterDataSize
5243 0,
5244 0,
5245 0,
5246 0, // resolution
5247 0,
5248 0,
5249 0,
5250 0, // offset
5251 0,
5252 0, // accuracy
5253 0, // plusTolerance
5254 0, // minusTolerance
5255 0,
5256 0,
5257 0x80,
5258 0x3f, // stateTransistionInterval=1.0
5259 0,
5260 0,
5261 0x80,
5262 0x3f, // transition_interval=1.0
5263 0xa0,
5264 0x86,
5265 0x01,
5266 0x00, // maxSetdable = 100000
5267 0x60,
5268 0x79,
5269 0xfe,
5270 0xff, // minSetable = -10000
5271 PLDM_RANGE_FIELD_FORMAT_SINT32, // rangeFieldFormat
5272 0x1f, // rangeFieldsupport
5273 0,
5274 0,
5275 0,
5276 0, // nominalValue = 0
5277 0x20,
5278 0xa1,
5279 0x07,
5280 0x00, // normalMax = 500,000
5281 0xe0,
5282 0x5e,
5283 0xf8,
5284 0xff, // normalMin = -500,000
5285 0xc0,
5286 0xc6,
5287 0x2d,
5288 0x00, // rated_max = 3,000,000
5289 0x40,
5290 0x39,
5291 0xd2,
5292 0xff // rated_min = -3,000,000
5293 };
5294
5295 struct pldm_numeric_effecter_value_pdr decodedPdr;
5296 auto rc =
5297 decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
5298 EXPECT_EQ(PLDM_SUCCESS, rc);
5299 EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_SINT32, decodedPdr.effecter_data_size);
5300 EXPECT_EQ(100000, decodedPdr.max_settable.value_s32);
5301 EXPECT_EQ(-100000, decodedPdr.min_settable.value_s32);
5302 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT32, decodedPdr.range_field_format);
5303 EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
5304 EXPECT_EQ(0, decodedPdr.nominal_value.value_s32);
5305 EXPECT_EQ(500000, decodedPdr.normal_max.value_s32);
5306 EXPECT_EQ(-500000, decodedPdr.normal_min.value_s32);
5307 EXPECT_EQ(3000000, decodedPdr.rated_max.value_s32);
5308 EXPECT_EQ(-3000000, decodedPdr.rated_min.value_s32);
5309}
Andrew Jeffery688be622024-05-23 11:22:51 +09305310#endif
Thu Nguyend4878cd2023-11-09 10:18:33 +07005311
Andrew Jeffery688be622024-05-23 11:22:51 +09305312#ifdef LIBPLDM_API_TESTING
Thu Nguyend4878cd2023-11-09 10:18:33 +07005313TEST(decodeNumericEffecterPdrData, Real32Test)
5314{
5315 std::vector<uint8_t> pdr1{
5316 0x1,
5317 0x0,
5318 0x0,
5319 0x0, // record handle
5320 0x1, // PDRHeaderVersion
5321 PLDM_NUMERIC_EFFECTER_PDR, // PDRType
5322 0x0,
5323 0x0, // recordChangeNumber
5324 PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
5325 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH *
5326 4 +
5327 PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
5328 0, // dataLength
5329 0,
5330
5331 0, // PLDMTerminusHandle
5332 0x1,
5333 0x0, // effecterID=1
5334 PLDM_ENTITY_POWER_SUPPLY,
5335 0, // entityType=Power Supply(120)
5336 1,
5337 0, // entityInstanceNumber
5338 0x1,
5339 0x0, // containerID=1
5340 0x2,
5341 0x0, // effecter_semantic_id=2
5342 PLDM_NO_INIT, // effecterInit
5343 false, // effecterAuxiliaryNames
5344 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
5345 0, // unitModifier
5346 0, // rateUnit
5347 0, // baseOEMUnitHandle
5348 0, // auxUnit
5349 0, // auxUnitModifier
5350 0, // auxRateUnit
5351 0, // auxOEMUnitHandle
5352 true, // isLinear
5353 PLDM_EFFECTER_DATA_SIZE_SINT32, // effecterDataSize
5354 0,
5355 0,
5356 0,
5357 0, // resolution
5358 0,
5359 0,
5360 0,
5361 0, // offset
5362 0,
5363 0, // accuracy
5364 0, // plusTolerance
5365 0, // minusTolerance
5366 0,
5367 0,
5368 0x80,
5369 0x3f, // stateTransistionInterval=1.0
5370 0,
5371 0,
5372 0x80,
5373 0x3f, // transition_interval=1.0
5374 0xa0,
5375 0x86,
5376 0x01,
5377 0x00, // maxSetdable = 100000
5378 0x60,
5379 0x79,
5380 0xfe,
5381 0xff, // minSetable = -10000
5382 PLDM_RANGE_FIELD_FORMAT_REAL32, // rangeFieldFormat
5383 0x1f, // rangeFieldsupport
5384 0,
5385 0,
5386 0,
5387 0, // nominalValue = 0.0
5388 0x33,
5389 0x33,
5390 0x48,
5391 0x42, // normalMax = 50.05
5392 0x33,
5393 0x33,
5394 0x48,
5395 0xc2, // normalMin = -50.05
5396 0x62,
5397 0x00,
5398 0x96,
5399 0x43, // rated_max = 300.003
5400 0x62,
5401 0x00,
5402 0x96,
5403 0xc3 // rated_min = -300.003
5404 };
5405
5406 struct pldm_numeric_effecter_value_pdr decodedPdr;
5407 auto rc =
5408 decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
5409 EXPECT_EQ(PLDM_SUCCESS, rc);
5410
5411 EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_SINT32, decodedPdr.effecter_data_size);
5412 EXPECT_FLOAT_EQ(1.0f, decodedPdr.state_transition_interval);
5413 EXPECT_FLOAT_EQ(1.0f, decodedPdr.transition_interval);
5414 EXPECT_EQ(100000, decodedPdr.max_settable.value_s32);
5415 EXPECT_EQ(-100000, decodedPdr.min_settable.value_s32);
5416 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_REAL32, decodedPdr.range_field_format);
5417 EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
5418 EXPECT_FLOAT_EQ(0, decodedPdr.nominal_value.value_f32);
5419 EXPECT_FLOAT_EQ(50.05f, decodedPdr.normal_max.value_f32);
5420 EXPECT_FLOAT_EQ(-50.05f, decodedPdr.normal_min.value_f32);
5421 EXPECT_FLOAT_EQ(300.003f, decodedPdr.rated_max.value_f32);
5422 EXPECT_FLOAT_EQ(-300.003f, decodedPdr.rated_min.value_f32);
5423}
Andrew Jeffery688be622024-05-23 11:22:51 +09305424#endif
Tal Yacobia6fa5552024-05-05 16:57:38 +03005425
Tal Yacobia6fa5552024-05-05 16:57:38 +03005426TEST(GetStateEffecterStates, testEncodeAndDecodeRequest)
5427{
5428 std::array<uint8_t, hdrSize + PLDM_GET_STATE_EFFECTER_STATES_REQ_BYTES>
5429 requestMsg{};
5430
5431 constexpr std::array<uint8_t,
5432 hdrSize + PLDM_GET_STATE_EFFECTER_STATES_REQ_BYTES>
5433 expectedRequestMsg{
5434 {0x80, PLDM_PLATFORM, PLDM_GET_STATE_EFFECTER_STATES, 1, 0xab}};
5435
5436 constexpr uint16_t effecter_id = 0xab01;
5437
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305438 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Tal Yacobia6fa5552024-05-05 16:57:38 +03005439 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
5440
5441 auto rc = encode_get_state_effecter_states_req(
5442 0, effecter_id, request, PLDM_GET_STATE_EFFECTER_STATES_REQ_BYTES);
5443
5444 EXPECT_EQ(rc, PLDM_SUCCESS);
5445 EXPECT_EQ(requestMsg, expectedRequestMsg);
5446
5447 uint16_t ret_effecter_id;
5448
5449 rc = decode_get_state_effecter_states_req(
5450 request, requestMsg.size() - hdrSize, &ret_effecter_id);
5451
5452 EXPECT_EQ(rc, PLDM_SUCCESS);
5453 EXPECT_EQ(effecter_id, ret_effecter_id);
5454
5455 // Test invalid length decode request
5456
5457 rc = decode_get_state_effecter_states_req(
5458 request, requestMsg.size() - hdrSize - 1, &ret_effecter_id);
5459
Tal Yacobif490a382024-05-31 09:57:36 +03005460 EXPECT_EQ(rc, -EOVERFLOW);
Tal Yacobia6fa5552024-05-05 16:57:38 +03005461}
Tal Yacobia6fa5552024-05-05 16:57:38 +03005462
Tal Yacobia6fa5552024-05-05 16:57:38 +03005463TEST(GetStateEffecterStates, testBadEncodeRequest)
5464{
5465 std::vector<uint8_t> requestMsg(hdrSize +
5466 PLDM_GET_STATE_EFFECTER_STATES_REQ_BYTES);
5467
5468 auto rc = encode_get_state_effecter_states_req(
5469 0, 0, nullptr, PLDM_GET_STATE_EFFECTER_STATES_REQ_BYTES);
Tal Yacobif490a382024-05-31 09:57:36 +03005470 EXPECT_EQ(rc, -EINVAL);
Tal Yacobia6fa5552024-05-05 16:57:38 +03005471}
Tal Yacobia6fa5552024-05-05 16:57:38 +03005472
Tal Yacobia6fa5552024-05-05 16:57:38 +03005473TEST(GetStateEffecterStates, testBadDecodeRequest)
5474{
5475 std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
5476 requestMsg{};
5477
5478 auto rc = decode_get_state_effecter_states_req(
5479 nullptr, requestMsg.size() - hdrSize, nullptr);
5480
Tal Yacobif490a382024-05-31 09:57:36 +03005481 EXPECT_EQ(rc, -EINVAL);
Tal Yacobia6fa5552024-05-05 16:57:38 +03005482}
Tal Yacobia6fa5552024-05-05 16:57:38 +03005483
Tal Yacobia6fa5552024-05-05 16:57:38 +03005484TEST(GetStateEffecterStates, testEncodeAndDecodeResponse)
5485{
5486 constexpr uint8_t comp_effecterCnt = 0x2;
5487 constexpr uint8_t completionCode = 0;
5488 std::array<uint8_t,
5489 hdrSize + PLDM_GET_STATE_EFFECTER_STATES_MIN_RESP_BYTES +
5490 PLDM_GET_EFFECTER_STATE_FIELD_SIZE * comp_effecterCnt>
5491 expectedResponseMsg{{0, PLDM_PLATFORM, PLDM_GET_STATE_EFFECTER_STATES,
5492 completionCode, comp_effecterCnt,
5493 EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING, 2, 2,
5494 EFFECTER_OPER_STATE_ENABLED_UPDATEPENDING, 2, 3}};
5495
5496 decltype(expectedResponseMsg) responseMsg{};
5497
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305498 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Tal Yacobia6fa5552024-05-05 16:57:38 +03005499 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
5500
5501 std::array<get_effecter_state_field, comp_effecterCnt> stateField{
5502 {{EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING, 2, 2},
5503 {EFFECTER_OPER_STATE_ENABLED_UPDATEPENDING, 2, 3}}};
5504
Patrick Williamsf37edd72024-12-18 11:22:58 -05005505 struct pldm_get_state_effecter_states_resp resp_fields{
5506 PLDM_SUCCESS, comp_effecterCnt, {stateField[0], stateField[1]}};
Tal Yacobia6fa5552024-05-05 16:57:38 +03005507
5508 auto rc = encode_get_state_effecter_states_resp(
5509 0, &resp_fields, response, responseMsg.size() - hdrSize);
5510
5511 EXPECT_EQ(rc, PLDM_SUCCESS);
5512 EXPECT_EQ(expectedResponseMsg, responseMsg);
5513
5514 struct pldm_get_state_effecter_states_resp ret_resp_fields;
5515
5516 rc = decode_get_state_effecter_states_resp(
5517 response, responseMsg.size() - hdrSize, &ret_resp_fields);
5518
5519 EXPECT_EQ(rc, PLDM_SUCCESS);
5520 EXPECT_EQ(completionCode, ret_resp_fields.completion_code);
5521 EXPECT_EQ(comp_effecterCnt, ret_resp_fields.comp_effecter_count);
5522 EXPECT_EQ(stateField[0].effecter_op_state,
5523 ret_resp_fields.field[0].effecter_op_state);
5524 EXPECT_EQ(stateField[0].pending_state,
5525 ret_resp_fields.field[0].pending_state);
5526 EXPECT_EQ(stateField[0].present_state,
5527 ret_resp_fields.field[0].present_state);
5528 EXPECT_EQ(stateField[1].effecter_op_state,
5529 ret_resp_fields.field[1].effecter_op_state);
5530 EXPECT_EQ(stateField[1].pending_state,
5531 ret_resp_fields.field[1].pending_state);
5532 EXPECT_EQ(stateField[1].present_state,
5533 ret_resp_fields.field[1].present_state);
5534
5535 // Test invalid length decode
5536
5537 rc = decode_get_state_effecter_states_resp(
5538 response,
5539 responseMsg.size() - hdrSize + PLDM_GET_EFFECTER_STATE_FIELD_SIZE,
5540 &ret_resp_fields);
5541
Tal Yacobif490a382024-05-31 09:57:36 +03005542 EXPECT_EQ(rc, -EBADMSG);
Tal Yacobia6fa5552024-05-05 16:57:38 +03005543}
Tal Yacobia6fa5552024-05-05 16:57:38 +03005544
Tal Yacobia6fa5552024-05-05 16:57:38 +03005545TEST(GetStateEffecterStates, testBadEncodeResponse)
5546{
Patrick Williamsf37edd72024-12-18 11:22:58 -05005547 struct pldm_get_state_effecter_states_resp resp{PLDM_SUCCESS, 0, {}};
Tal Yacobia6fa5552024-05-05 16:57:38 +03005548 auto rc = decode_get_state_effecter_states_resp(nullptr, 0, &resp);
5549
Tal Yacobif490a382024-05-31 09:57:36 +03005550 EXPECT_EQ(rc, -EINVAL);
Tal Yacobia6fa5552024-05-05 16:57:38 +03005551}
Tal Yacobia6fa5552024-05-05 16:57:38 +03005552
Tal Yacobia6fa5552024-05-05 16:57:38 +03005553TEST(GetStateEffecterStates, testBadDecodeResponse)
5554{
5555 std::array<uint8_t, hdrSize +
5556 PLDM_GET_STATE_EFFECTER_STATES_MIN_RESP_BYTES +
5557 PLDM_GET_EFFECTER_STATE_FIELD_SIZE * 2>
5558 responseMsg{};
5559
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305560 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Tal Yacobia6fa5552024-05-05 16:57:38 +03005561 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
5562
5563 auto rc = decode_get_state_effecter_states_resp(
5564 response, responseMsg.size() - hdrSize, nullptr);
5565
Tal Yacobif490a382024-05-31 09:57:36 +03005566 EXPECT_EQ(rc, -EINVAL);
Tal Yacobia6fa5552024-05-05 16:57:38 +03005567}
Thu Nguyendacfa352024-06-22 09:53:15 +00005568
5569[[maybe_unused]] static size_t str16len(char16_t* startptr)
5570{
5571 char16_t* endptr = startptr;
5572 while (*endptr)
5573 {
5574 endptr++;
5575 }
5576 return endptr - startptr;
5577}
5578
Thu Nguyendacfa352024-06-22 09:53:15 +00005579TEST(decodeEntityAuxNamePdrData, GoodTest)
5580{
5581 std::vector<uint8_t> pdr1{
5582 // Common PDR Header
5583 0x1, 0x0, 0x0, 0x0, // record handle
5584 0x1, // PDRHeaderVersion
5585 PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
5586 0x1,
5587 0x0, // recordChangeNumber
5588 0x27,
5589 0, // dataLength
5590 /* Entity Auxiliary Names PDR Data*/
5591 3,
5592 0, // entityType system software
5593 0x1,
5594 0x0, // Entity instance number =1
5595 PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
5596 0, // Overal system
5597 0, // shared Name Count one name only
5598 03, // nameStringCount
5599 0x65, 0x6e, 0x00, // Language Tag "en"
5600 0x00, 0x53, 0x00, 0x30, 0x00, 0x53, 0x00, 0x00, // Entity Name "S0S"
5601 0x66, 0x6e, 0x00, // Language Tag "en"
5602 0x00, 0x53, 0x00, 0x31, 0x00, 0x00, // Entity Name "S1"
5603 0x67, 0x6e, 0x00, // Language Tag "en"
5604 0x00, 0x52, 0x00, 0x52, 0x00, 0x33, 0x00, 0x00 // Entity Name "RR3"
5605 };
5606
5607 const char expectTag0[] = {0x65, 0x6e, 0x00};
5608 const char expectTag1[] = {0x66, 0x6e, 0x00};
5609 const char expectTag2[] = {0x67, 0x6e, 0x00};
5610 const char expectName0[] = {0x00, 0x53, 0x00, 0x30, 0x00, 0x53, 0x00, 0x00};
5611 const char expectName1[] = {0x00, 0x53, 0x00, 0x31, 0x00, 0x00};
5612 const char expectName2[] = {0x00, 0x52, 0x00, 0x52, 0x00, 0x33, 0x00, 0x00};
5613 auto names_offset = sizeof(struct pldm_pdr_hdr) +
5614 PLDM_PDR_ENTITY_AUXILIARY_NAME_PDR_MIN_LENGTH;
5615 auto names_size = pdr1.size() - names_offset;
5616 size_t length = 0;
5617
5618 size_t decodedPdrSize =
5619 sizeof(struct pldm_entity_auxiliary_names_pdr) + names_size;
5620 auto decodedPdr =
5621 (struct pldm_entity_auxiliary_names_pdr*)malloc(decodedPdrSize);
5622 EXPECT_NE(nullptr, decodedPdr);
5623
5624 auto rc = decode_entity_auxiliary_names_pdr(pdr1.data(), pdr1.size(),
5625 decodedPdr, decodedPdrSize);
5626
5627 EXPECT_EQ(0, rc);
5628 EXPECT_EQ(1, decodedPdr->hdr.record_handle);
5629 EXPECT_EQ(1, decodedPdr->hdr.version);
5630 EXPECT_EQ(PLDM_ENTITY_AUXILIARY_NAMES_PDR, decodedPdr->hdr.type);
5631 EXPECT_EQ(1, decodedPdr->hdr.record_change_num);
5632 EXPECT_EQ(pdr1.size() - sizeof(struct pldm_pdr_hdr),
5633 decodedPdr->hdr.length);
5634 EXPECT_EQ(3, decodedPdr->container.entity_type);
5635 EXPECT_EQ(1, decodedPdr->container.entity_instance_num);
5636 EXPECT_EQ(PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
5637 decodedPdr->container.entity_container_id);
5638 EXPECT_EQ(0, decodedPdr->shared_name_count);
5639 EXPECT_EQ(3, decodedPdr->name_string_count);
5640
5641 decodedPdr->names = (struct pldm_entity_auxiliary_name*)calloc(
5642 decodedPdr->name_string_count,
5643 sizeof(struct pldm_entity_auxiliary_name));
5644 EXPECT_NE(nullptr, decodedPdr->names);
5645
5646 rc = decode_pldm_entity_auxiliary_names_pdr_index(decodedPdr);
5647 EXPECT_EQ(0, rc);
5648
5649 length = strlen(decodedPdr->names[0].tag);
5650 EXPECT_EQ(strlen(expectTag0), length);
5651 EXPECT_EQ(strncmp(expectTag0, decodedPdr->names[0].tag, length + 1), 0);
5652
5653 // NOLINTBEGIN(clang-analyzer-unix.Malloc)
5654 ASSERT_EQ(0,
5655 (uintptr_t)decodedPdr->names[0].name & (alignof(char16_t) - 1));
5656 // NOLINTEND(clang-analyzer-unix.Malloc)
5657 length = str16len((char16_t*)decodedPdr->names[0].name);
5658 EXPECT_EQ(str16len((char16_t*)expectName0), length);
5659 EXPECT_EQ(3, str16len((char16_t*)expectName0));
5660 EXPECT_EQ(memcmp(expectName0, decodedPdr->names[0].name,
5661 sizeof(char16_t) * (length + 1)),
5662 0);
5663
5664 length = strlen(decodedPdr->names[1].tag);
5665 EXPECT_EQ(strlen(expectTag1), length);
5666 EXPECT_EQ(strncmp(expectTag1, decodedPdr->names[1].tag, length + 1), 0);
5667
5668 // NOLINTBEGIN(clang-analyzer-unix.Malloc)
5669 ASSERT_EQ(0,
5670 (uintptr_t)decodedPdr->names[1].name & (alignof(char16_t) - 1));
5671 // NOLINTEND(clang-analyzer-unix.Malloc)
5672 length = str16len((char16_t*)decodedPdr->names[1].name);
5673 EXPECT_EQ(str16len((char16_t*)expectName1), length);
5674 EXPECT_EQ(2, str16len((char16_t*)expectName1));
5675 EXPECT_EQ(memcmp(expectName1, decodedPdr->names[1].name,
5676 sizeof(char16_t) * (length + 1)),
5677 0);
5678
5679 length = strlen(decodedPdr->names[2].tag);
5680 EXPECT_EQ(strlen(expectTag2), length);
5681 EXPECT_EQ(strncmp(expectTag2, decodedPdr->names[2].tag, length + 1), 0);
5682
5683 // NOLINTBEGIN(clang-analyzer-unix.Malloc)
5684 ASSERT_EQ(0,
5685 (uintptr_t)decodedPdr->names[2].name & (alignof(char16_t) - 1));
5686 // NOLINTEND(clang-analyzer-unix.Malloc)
5687 length = str16len((char16_t*)decodedPdr->names[2].name);
5688 EXPECT_EQ(str16len((char16_t*)expectName2), length);
5689 EXPECT_EQ(3, str16len((char16_t*)expectName2));
5690 EXPECT_EQ(memcmp(expectName2, decodedPdr->names[2].name,
5691 sizeof(char16_t) * (length + 1)),
5692 0);
5693
5694 free(decodedPdr->names);
5695 free(decodedPdr);
5696}
Thu Nguyendacfa352024-06-22 09:53:15 +00005697
Thu Nguyendacfa352024-06-22 09:53:15 +00005698TEST(decodeEntityAuxNamePdrData, BadTest)
5699{
5700 std::vector<uint8_t> pdr1{
5701 // Common PDR Header
5702 0x1, 0x0, 0x0, 0x0, // record handle
5703 0x1, // PDRHeaderVersion
5704 PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
5705 0x1,
5706 0x0, // recordChangeNumber
5707 0x25, // correct size is 0x27, input invalid size
5708 0, // dataLength
5709 /* Entity Auxiliary Names PDR Data*/
5710 3,
5711 0, // entityType system software
5712 0x1,
5713 0x0, // Entity instance number =1
5714 PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
5715 0, // Overal system
5716 0, // shared Name Count one name only
5717 0, // Invalid nameStringCount
5718 0x65, 0x6e, 0x00, // Language Tag "en"
5719 0x00, 0x53, 0x00, 0x30, 0x00, 0x53, 0x00, 0x00, // Entity Name "S0S"
5720 0x66, 0x6e, 0x00, // Language Tag "en"
5721 0x00, 0x53, 0x00, 0x31, 0x00, 0x00, // Entity Name "S1"
5722 0x67, 0x6e, 0x00, // Language Tag "en"
5723 0x00, 0x52, 0x00, 0x52, 0x00, 0x33, 0x00, 0x00 // Entity Name "RR3"
5724 };
5725
5726 auto names_offset = sizeof(struct pldm_pdr_hdr) +
5727 PLDM_PDR_ENTITY_AUXILIARY_NAME_PDR_MIN_LENGTH;
5728 auto names_size = pdr1.size() - names_offset;
5729
5730 size_t decodedPdrSize =
5731 sizeof(struct pldm_entity_auxiliary_names_pdr) + names_size;
5732 auto decodedPdr =
5733 (struct pldm_entity_auxiliary_names_pdr*)malloc(decodedPdrSize);
5734
5735 auto rc = decode_entity_auxiliary_names_pdr(pdr1.data(), pdr1.size(),
5736 decodedPdr, decodedPdrSize);
5737
5738 EXPECT_EQ(-EBADMSG, rc);
5739 free(decodedPdr);
5740}
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005741
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005742TEST(PlatformEventMessage, testGoodCperEventDataDecodeRequest)
5743{
5744 constexpr const size_t eventDataSize = 4;
5745 constexpr const size_t eventSize =
5746 PLDM_PLATFORM_CPER_EVENT_MIN_LENGTH + eventDataSize;
5747 std::array<uint8_t, eventSize> eventData{
5748 0x1, // format version
5749 0x0, // format type
5750 0x4, 0x0, // event data length
5751 0x44, 0x33, 0x22, 0x11 // data
5752 };
5753
5754 uint8_t expectedFormatVersion = 1;
5755 uint8_t expectedFormatType = 0;
5756 uint16_t expectedEventDataLength = 4;
5757 uint8_t expectCperEventData[] = {0x44, 0x33, 0x22, 0x11};
5758
5759 size_t cperEventSize =
5760 sizeof(struct pldm_platform_cper_event) + eventDataSize;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305761 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005762 auto cper_event = reinterpret_cast<struct pldm_platform_cper_event*>(
5763 malloc(cperEventSize));
5764
Thu Nguyen02903032024-09-03 06:39:50 +00005765 auto rc = decode_pldm_platform_cper_event(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305766 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005767 reinterpret_cast<const void*>(eventData.data()), eventData.size(),
5768 cper_event, cperEventSize);
5769
5770 EXPECT_EQ(rc, 0);
5771 EXPECT_EQ(cper_event->format_version, expectedFormatVersion);
5772 EXPECT_EQ(cper_event->format_type, expectedFormatType);
5773 EXPECT_EQ(cper_event->event_data_length, expectedEventDataLength);
5774
5775 auto cperEventData = pldm_platform_cper_event_event_data(cper_event);
5776 EXPECT_NE(cperEventData, nullptr);
5777 if (cperEventData)
5778 {
5779 EXPECT_EQ(0, memcmp(expectCperEventData, cperEventData,
5780 expectedEventDataLength));
5781 }
5782
5783 free(cper_event);
5784}
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005785
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005786TEST(PlatformEventMessage, testBadCperEventDataDecodeRequest)
5787{
5788
5789 constexpr const size_t eventDataSize = 4;
5790 constexpr const size_t eventSize =
5791 PLDM_PLATFORM_CPER_EVENT_MIN_LENGTH + eventDataSize;
5792 std::array<uint8_t, eventSize> eventData{
5793 0x1, // format version
5794 0x0, // format type
5795 0x4, 0x0, // event data length
5796 0x44, 0x33, 0x22, 0x11 // data
5797 };
5798
5799 size_t cperEventSize =
5800 sizeof(struct pldm_platform_cper_event) + eventDataSize;
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305801 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005802 auto cperEvent = reinterpret_cast<struct pldm_platform_cper_event*>(
5803 malloc(cperEventSize));
5804
Thu Nguyen02903032024-09-03 06:39:50 +00005805 auto rc = decode_pldm_platform_cper_event(NULL, eventData.size(), cperEvent,
5806 cperEventSize);
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005807 EXPECT_EQ(rc, -EINVAL);
5808
Thu Nguyen02903032024-09-03 06:39:50 +00005809 rc = decode_pldm_platform_cper_event(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305810 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005811 reinterpret_cast<const void*>(eventData.data()), eventData.size(), NULL,
5812 cperEventSize);
5813 EXPECT_EQ(rc, -EINVAL);
5814
Thu Nguyen02903032024-09-03 06:39:50 +00005815 rc = decode_pldm_platform_cper_event(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305816 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005817 reinterpret_cast<uint8_t*>(eventData.data()), eventData.size() - 1,
5818 cperEvent, cperEventSize);
Andrew Jeffery0a1be3c2024-08-11 08:34:10 +00005819 EXPECT_EQ(rc, -EOVERFLOW);
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005820
Thu Nguyen02903032024-09-03 06:39:50 +00005821 rc = decode_pldm_platform_cper_event(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305822 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005823 reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(),
5824 cperEvent, cperEventSize - 1);
5825 EXPECT_EQ(rc, -EOVERFLOW);
5826
Thu Nguyen02903032024-09-03 06:39:50 +00005827 rc = decode_pldm_platform_cper_event(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305828 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005829 reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(),
5830 cperEvent, cperEventSize + 1);
5831 EXPECT_EQ(rc, 0);
5832
5833 // Invalid CPER Event Format Type
5834 eventData[1] = 0x2;
Thu Nguyen02903032024-09-03 06:39:50 +00005835 rc = decode_pldm_platform_cper_event(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305836 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005837 reinterpret_cast<const void*>(eventData.data()), eventData.size(),
5838 cperEvent, cperEventSize);
5839
5840 EXPECT_EQ(rc, -EPROTO);
5841
5842 // Invalid cper event data size
5843 eventData[1] = 0x1;
5844 eventData[2] = 3;
Thu Nguyen02903032024-09-03 06:39:50 +00005845 rc = decode_pldm_platform_cper_event(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305846 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005847 reinterpret_cast<const void*>(eventData.data()), eventData.size(),
5848 cperEvent, cperEventSize);
5849
5850 EXPECT_EQ(rc, -EBADMSG);
5851
5852 eventData[2] = 5;
Thu Nguyen02903032024-09-03 06:39:50 +00005853 rc = decode_pldm_platform_cper_event(
Andrew Jefferyd0ba43a2024-09-09 15:50:17 +09305854 // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
Thu Nguyena5d18dc2024-08-07 08:29:34 +00005855 reinterpret_cast<const void*>(eventData.data()), eventData.size(),
5856 cperEvent, cperEventSize);
5857
5858 EXPECT_EQ(rc, -EOVERFLOW);
5859
5860 free(cperEvent);
5861}
Chau Lyed4ad702025-03-13 04:12:04 +00005862
5863#ifdef LIBPLDM_API_TESTING
5864TEST(decodePldmFileDescriptorPdr, oemFileClassificationPresentTest)
5865{
5866 std::vector<uint8_t> pdr1{
5867 // Common PDR Header
5868 0x01, 0x0, 0x0, 0x0, // Record Handle
5869 0x01, // PDR Header Version
5870 PLDM_FILE_DESCRIPTOR_PDR, // PDRType
5871 0x01, 0x00, // Record Change Number
5872 0x2A, 0x00, // Data Length = 42 bytes
5873 /* PLDM File Descriptor PDR Data*/
5874 0x01, 0x00, // Terminus Handle = 0x01
5875 0x01, 0x00, // File Identifier = 0x01
5876 0x09, 0x00, // Entity Type = Physical | Device File
5877 0x01, 0x00, // Entity instance number = 1
5878 PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
5879 0, // Container ID = Overall system
5880 0x02, 0, // Supper Dir File Identifier = 0x0002
5881 0x01, // File Classification = 0x01 (BootLog)
5882 0x01, // OEM File Classification = 0x01
5883 0x15, 0x00, // File Capabilities = 0x0015
5884 0xff, 0xff, 0xff, 0xff, // File Version = 0xffffffff (Unversioned)
5885 0x00, 0x28, 0x00, 0x00, // File Maximum Size = 10KB
5886 0x02, // File Maximum File Descriptor count = 2
5887 0x06, // File Name Length = 6
5888 0x46, 0x69, 0x6C, 0x65, 0x31,
5889 0x00, // File Name = "File1\NULL"
5890 0x09, // OEM File Classification Name Length = 9
5891 0x4F, 0x45, 0x4D, 0x20, 0x46, 0x69, 0x6C, 0x65,
5892 0x00 // OEM File Classification Name = "OEM File\NULL"
5893 };
5894
5895 const char expectFileName[] = "File1";
5896 const char expectOEMClassificationName[] = "OEM File";
5897
5898 struct pldm_file_descriptor_pdr decodedPdr = {};
5899
5900 auto rc =
5901 decode_pldm_file_descriptor_pdr(pdr1.data(), pdr1.size(), &decodedPdr);
5902
5903 ASSERT_EQ(0, rc);
5904 EXPECT_EQ(1, decodedPdr.terminus_handle);
5905 EXPECT_EQ(1, decodedPdr.file_identifier);
5906 EXPECT_EQ(9, decodedPdr.container.entity_type);
5907 EXPECT_EQ(1, decodedPdr.container.entity_instance_num);
5908 EXPECT_EQ(PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
5909 decodedPdr.container.entity_container_id);
5910 EXPECT_EQ(2, decodedPdr.superior_directory_file_identifier);
5911 EXPECT_EQ(1, decodedPdr.file_classification);
5912 EXPECT_EQ(1, decodedPdr.oem_file_classification);
5913 EXPECT_EQ(21, decodedPdr.file_capabilities.value);
5914 EXPECT_EQ(0xff, decodedPdr.file_version.alpha);
5915 EXPECT_EQ(0xff, decodedPdr.file_version.update);
5916 EXPECT_EQ(0xff, decodedPdr.file_version.minor);
5917 EXPECT_EQ(0xff, decodedPdr.file_version.major);
5918 EXPECT_EQ(10240, decodedPdr.file_maximum_size);
5919 EXPECT_EQ(2, decodedPdr.file_maximum_file_descriptor_count);
5920 EXPECT_EQ(6, decodedPdr.file_name.length);
5921
5922 EXPECT_EQ(memcmp(expectFileName, decodedPdr.file_name.ptr,
5923 sizeof(char) * decodedPdr.file_name.length),
5924 0);
5925
5926 if (decodedPdr.oem_file_classification)
5927 {
5928 EXPECT_EQ(9, decodedPdr.oem_file_classification_name.length);
5929 EXPECT_EQ(memcmp(expectOEMClassificationName,
5930 decodedPdr.oem_file_classification_name.ptr,
5931 sizeof(char) *
5932 decodedPdr.oem_file_classification_name.length),
5933 0);
5934 }
5935}
5936#endif
5937
5938#ifdef LIBPLDM_API_TESTING
5939TEST(decodePldmFileDescriptorPdr, BadTestUnAllocatedPtrParams)
5940{
5941 int rc;
5942 std::vector<uint8_t> pdr1{
5943 // Common PDR Header
5944 0x01, 0x0, 0x0, 0x0, // Record Handle
5945 0x01, // PDR Header Version
5946 PLDM_FILE_DESCRIPTOR_PDR, // PDRType
5947 0x01, 0x00, // Record Change Number
5948 0x20, 0x00, // Data Length = 32 bytes
5949 /* PLDM File Descriptor PDR Data*/
5950 0x01, 0x00, // Terminus Handle = 0x01
5951 0x01, 0x00, // File Identifier = 0x01
5952 0x09, 0x00, // Entity Type = Physical | Device File
5953 0x01, 0x00, // Entity instance number = 1
5954 PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
5955 0, // Container ID = Overall system
5956 0x02, 0, // Supper Dir File Identifier = 0x0002
5957 0x01, // File Classification = 0x01 (BootLog)
5958 0x00, // OEM File Classification = 0x00
5959 0x15, 0x00, // File Capabilities = 0x0015
5960 0xff, 0xff, 0xff, 0xff, // File Version = 0xffffffff (Unversioned)
5961 0x00, 0x28, 0x00, 0x00, // File Maximum Size = 10KB
5962 0x02, // File Maximum File Descriptor count = 2
5963 0x06, // File Name Length = 6
5964 0x46, 0x69, 0x6C, 0x65, 0x31,
5965 0x00, // File Name = "File1\NULL"
5966 };
5967
5968 struct pldm_file_descriptor_pdr decodedPdr = {};
5969
5970 rc = decode_pldm_file_descriptor_pdr(nullptr, pdr1.size(), &decodedPdr);
5971 EXPECT_EQ(-EINVAL, rc);
5972
5973 rc = decode_pldm_file_descriptor_pdr(pdr1.data(), pdr1.size(), nullptr);
5974 EXPECT_EQ(-EINVAL, rc);
5975}
5976#endif
5977
5978#ifdef LIBPLDM_API_TESTING
5979TEST(decodePldmFileDescriptorPdr, BadTestInvalidExpectedParamLength)
5980{
5981 int rc;
5982
5983 std::vector<uint8_t> pdr1{
5984 // Common PDR Header
5985 0x01, 0x0, 0x0, 0x0, // Record Handle
5986 0x01, // PDR Header Version
5987 PLDM_FILE_DESCRIPTOR_PDR, // PDRType
5988 0x01, 0x00, // Record Change Number
5989 0x20, 0x00, // Data Length = 32 bytes
5990 /* PLDM File Descriptor PDR Data*/
5991 0x01, 0x00, // Terminus Handle = 0x01
5992 0x01, 0x00, // File Identifier = 0x01
5993 0x09, 0x00, // Entity Type = Physical | Device File
5994 0x01, 0x00, // Entity instance number = 1
5995 PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
5996 0, // Container ID = Overall system
5997 0x02, 0, // Supper Dir File Identifier = 0x0002
5998 0x01, // File Classification = 0x01 (BootLog)
5999 0x00, // OEM File Classification = 0x00
6000 0x15, 0x00, // File Capabilities = 0x0015
6001 0xff, 0xff, 0xff, 0xff, // File Version = 0xffffffff (Unversioned)
6002 0x00, 0x28, 0x00, 0x00, // File Maximum Size = 10KB
6003 0x02, // File Maximum File Descriptor count = 2
6004 0x06, // File Name Length = 6
6005 0x46, 0x69, 0x6C, 0x65, 0x31,
6006 0x00, // File Name = "File1\NULL"
6007 };
6008
6009 struct pldm_file_descriptor_pdr decodedPdr = {};
6010
6011 /* Expect error: Invalid input data length*/
6012 rc = decode_pldm_file_descriptor_pdr(pdr1.data(), 1, &decodedPdr);
6013 EXPECT_EQ(-EOVERFLOW, rc);
6014}
6015#endif
6016
6017#ifdef LIBPLDM_API_TESTING
6018TEST(decodePldmFileDescriptorPdr, BadTestDataBufferOverLength)
6019{
6020 int rc;
6021
6022 /*Un-matched File Name Length*/
6023 std::vector<uint8_t> pdr1{
6024 // Common PDR Header
6025 0x01, 0x0, 0x0, 0x0, // Record Handle
6026 0x01, // PDR Header Version
6027 PLDM_FILE_DESCRIPTOR_PDR, // PDRType
6028 0x01, 0x00, // Record Change Number
6029 0x20, 0x00, // Data Length = 32 bytes
6030 /* PLDM File Descriptor PDR Data*/
6031 0x01, 0x00, // Terminus Handle = 0x01
6032 0x01, 0x00, // File Identifier = 0x01
6033 0x09, 0x00, // Entity Type = Physical | Device File
6034 0x01, 0x00, // Entity instance number = 1
6035 PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
6036 0, // Container ID = Overall system
6037 0x02, 0, // Supper Dir File Identifier = 0x0002
6038 0x01, // File Classification = 0x01 (BootLog)
6039 0x00, // OEM File Classification = 0x00
6040 0x15, 0x00, // File Capabilities = 0x0015
6041 0xff, 0xff, 0xff, 0xff, // File Version = 0xffffffff (Unversioned)
6042 0x00, 0x28, 0x00, 0x00, // File Maximum Size = 10KB
6043 0x02, // File Maximum File Descriptor count = 2
6044 0x05, // File Name Length = 5
6045 0x46, 0x69, 0x6C, 0x65, 0x31,
6046 0x00, // File Name = "File1\NULL"
6047 };
6048
6049 struct pldm_file_descriptor_pdr decodedPdr = {};
6050
6051 /*
6052 * Expect error: The original length of the data buffer is larger than
6053 * the target extract length.
6054 */
6055 rc = decode_pldm_file_descriptor_pdr(pdr1.data(), pdr1.size(), &decodedPdr);
6056 EXPECT_EQ(-EBADMSG, rc);
6057}
6058
6059TEST(decodePldmFileDescriptorPdr, BadTestDataBufferUnderLength)
6060{
6061 int rc;
6062
6063 /*Un-matched OEM File Classification Name Length*/
6064 std::vector<uint8_t> pdr1{
6065 // Common PDR Header
6066 0x01, 0x0, 0x0, 0x0, // Record Handle
6067 0x01, // PDR Header Version
6068 PLDM_FILE_DESCRIPTOR_PDR, // PDRType
6069 0x01, 0x00, // Record Change Number
6070 0x2A, 0x00, // Data Length = 42 bytes
6071 /* PLDM File Descriptor PDR Data*/
6072 0x01, 0x00, // Terminus Handle = 0x01
6073 0x01, 0x00, // File Identifier = 0x01
6074 0x09, 0x00, // Entity Type = Physical | Device File
6075 0x01, 0x00, // Entity instance number = 1
6076 PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
6077 0, // Container ID = Overall system
6078 0x02, 0, // Supper Dir File Identifier = 0x0002
6079 0x01, // File Classification = 0x01 (BootLog)
6080 0x01, // OEM File Classification = 0x01
6081 0x15, 0x00, // File Capabilities = 0x0015
6082 0xff, 0xff, 0xff, 0xff, // File Version = 0xffffffff (Unversioned)
6083 0x00, 0x28, 0x00, 0x00, // File Maximum Size = 10KB
6084 0x02, // File Maximum File Descriptor count = 2
6085 0x06, // File Name Length = 6
6086 0x46, 0x69, 0x6C, 0x65, 0x31,
6087 0x00, // File Name = "File1\NULL"
6088 0x0B, // OEM File Classification Name Length = 11
6089 0x4F, 0x45, 0x4D, 0x20, 0x46, 0x69, 0x6C, 0x65,
6090 0x00 // OEM File Classification Name = "OEM File\NULL"
6091 };
6092
6093 struct pldm_file_descriptor_pdr decodedPdr = {};
6094
6095 /*
6096 * Expect error: The original length of the data buffer is smaller than
6097 * the target extract length.
6098 */
6099 rc = decode_pldm_file_descriptor_pdr(pdr1.data(), pdr1.size(), &decodedPdr);
6100 EXPECT_EQ(-EOVERFLOW, rc);
6101}
6102#endif