xref: /openbmc/libpldm/tests/dsp/platform.cpp (revision 1c4c704d)
1 #include <endian.h>
2 #include <libpldm/base.h>
3 #include <libpldm/entity.h>
4 #include <libpldm/platform.h>
5 #include <libpldm/pldm_types.h>
6 
7 #include <array>
8 #include <cerrno>
9 #include <cstdint>
10 #include <cstring>
11 #include <vector>
12 
13 #include "msgbuf.h"
14 
15 #include <gtest/gtest.h>
16 
17 constexpr auto hdrSize = sizeof(pldm_msg_hdr);
18 
19 TEST(SetStateEffecterStates, testEncodeResponse)
20 {
21     std::array<uint8_t,
22                sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
23         responseMsg{};
24     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
25     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
26     uint8_t completionCode = 0;
27 
28     auto rc = encode_set_state_effecter_states_resp(0, PLDM_SUCCESS, response);
29 
30     EXPECT_EQ(rc, PLDM_SUCCESS);
31     EXPECT_EQ(completionCode, response->payload[0]);
32 }
33 
34 TEST(SetStateEffecterStates, testEncodeRequest)
35 {
36     std::array<uint8_t,
37                sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES>
38         requestMsg{};
39     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
40     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
41 
42     uint16_t effecterId = 0x0a;
43     uint8_t compEffecterCnt = 0x2;
44     std::array<set_effecter_state_field, 8> stateField{};
45     stateField[0] = {PLDM_REQUEST_SET, 2};
46     stateField[1] = {PLDM_REQUEST_SET, 3};
47 
48     auto rc = encode_set_state_effecter_states_req(
49         0, effecterId, compEffecterCnt, stateField.data(), request);
50 
51     EXPECT_EQ(rc, PLDM_SUCCESS);
52     EXPECT_EQ(effecterId, request->payload[0]);
53     EXPECT_EQ(compEffecterCnt, request->payload[sizeof(effecterId)]);
54     EXPECT_EQ(stateField[0].set_request,
55               request->payload[sizeof(effecterId) + sizeof(compEffecterCnt)]);
56     EXPECT_EQ(stateField[0].effecter_state,
57               request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
58                                sizeof(stateField[0].set_request)]);
59     EXPECT_EQ(stateField[1].set_request,
60               request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
61                                sizeof(stateField[0])]);
62     EXPECT_EQ(stateField[1].effecter_state,
63               request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
64                                sizeof(stateField[0]) +
65                                sizeof(stateField[1].set_request)]);
66 }
67 
68 TEST(SetStateEffecterStates, testGoodDecodeResponse)
69 {
70     std::array<uint8_t, hdrSize + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
71         responseMsg{};
72 
73     uint8_t retcompletion_code = 0;
74 
75     responseMsg[hdrSize] = PLDM_SUCCESS;
76 
77     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
78     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
79 
80     auto rc = decode_set_state_effecter_states_resp(
81         response, responseMsg.size() - hdrSize, &retcompletion_code);
82 
83     EXPECT_EQ(rc, PLDM_SUCCESS);
84     EXPECT_EQ(PLDM_SUCCESS, retcompletion_code);
85 }
86 
87 TEST(SetStateEffecterStates, testGoodDecodeRequest)
88 {
89     std::array<uint8_t, hdrSize + PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES>
90         requestMsg{};
91 
92     uint16_t effecterId = 0x32;
93     uint16_t effecterIdLE = htole16(effecterId);
94     uint8_t compEffecterCnt = 0x2;
95 
96     std::array<set_effecter_state_field, 8> stateField{};
97     stateField[0] = {PLDM_REQUEST_SET, 3};
98     stateField[1] = {PLDM_REQUEST_SET, 4};
99 
100     uint16_t retEffecterId = 0;
101     uint8_t retCompEffecterCnt = 0;
102 
103     std::array<set_effecter_state_field, 8> retStateField{};
104 
105     memcpy(requestMsg.data() + hdrSize, &effecterIdLE, sizeof(effecterIdLE));
106     memcpy(requestMsg.data() + sizeof(effecterIdLE) + hdrSize, &compEffecterCnt,
107            sizeof(compEffecterCnt));
108     memcpy(requestMsg.data() + sizeof(effecterIdLE) + sizeof(compEffecterCnt) +
109                hdrSize,
110            &stateField, sizeof(stateField));
111 
112     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
113     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
114 
115     auto rc = decode_set_state_effecter_states_req(
116         request, requestMsg.size() - hdrSize, &retEffecterId,
117         &retCompEffecterCnt, retStateField.data());
118 
119     EXPECT_EQ(rc, PLDM_SUCCESS);
120     EXPECT_EQ(effecterId, retEffecterId);
121     EXPECT_EQ(retCompEffecterCnt, compEffecterCnt);
122     EXPECT_EQ(retStateField[0].set_request, stateField[0].set_request);
123     EXPECT_EQ(retStateField[0].effecter_state, stateField[0].effecter_state);
124     EXPECT_EQ(retStateField[1].set_request, stateField[1].set_request);
125     EXPECT_EQ(retStateField[1].effecter_state, stateField[1].effecter_state);
126 }
127 
128 TEST(SetStateEffecterStates, testBadDecodeRequest)
129 {
130     const struct pldm_msg* msg = NULL;
131 
132     auto rc = decode_set_state_effecter_states_req(msg, sizeof(*msg), NULL,
133                                                    NULL, NULL);
134 
135     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
136 }
137 
138 TEST(SetStateEffecterStates, testBadDecodeResponse)
139 {
140     std::array<uint8_t, PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
141         responseMsg{};
142 
143     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
144     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
145 
146     auto rc = decode_set_state_effecter_states_resp(response,
147                                                     responseMsg.size(), NULL);
148 
149     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
150 }
151 
152 TEST(GetPDR, testGoodEncodeResponse)
153 {
154     uint8_t completionCode = 0;
155     uint32_t nextRecordHndl = 0x12;
156     uint32_t nextDataTransferHndl = 0x13;
157     uint8_t transferFlag = PLDM_END;
158     uint16_t respCnt = 0x5;
159     std::vector<uint8_t> recordData{1, 2, 3, 4, 5};
160     uint8_t transferCRC = 6;
161 
162     // + size of record data and transfer CRC
163     std::vector<uint8_t> responseMsg(hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES +
164                                      recordData.size() + 1);
165     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
166     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
167 
168     auto rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
169                                   nextDataTransferHndl, transferFlag, respCnt,
170                                   recordData.data(), transferCRC, response);
171 
172     EXPECT_EQ(rc, PLDM_SUCCESS);
173     struct pldm_get_pdr_resp* resp =
174         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
175         reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
176 
177     EXPECT_EQ(completionCode, resp->completion_code);
178     EXPECT_EQ(nextRecordHndl, le32toh(resp->next_record_handle));
179     EXPECT_EQ(nextDataTransferHndl, le32toh(resp->next_data_transfer_handle));
180     EXPECT_EQ(transferFlag, resp->transfer_flag);
181     EXPECT_EQ(respCnt, le16toh(resp->response_count));
182     EXPECT_EQ(0,
183               memcmp(recordData.data(), resp->record_data, recordData.size()));
184     EXPECT_EQ(*(response->payload + sizeof(pldm_get_pdr_resp) - 1 +
185                 recordData.size()),
186               transferCRC);
187 
188     transferFlag = PLDM_START_AND_END; // No CRC in this case
189     responseMsg.resize(responseMsg.size() - sizeof(transferCRC));
190     rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
191                              nextDataTransferHndl, transferFlag, respCnt,
192                              recordData.data(), transferCRC, response);
193     EXPECT_EQ(rc, PLDM_SUCCESS);
194 }
195 
196 TEST(GetPDR, testBadEncodeResponse)
197 {
198     uint32_t nextRecordHndl = 0x12;
199     uint32_t nextDataTransferHndl = 0x13;
200     uint8_t transferFlag = PLDM_START_AND_END;
201     uint16_t respCnt = 0x5;
202     std::vector<uint8_t> recordData{1, 2, 3, 4, 5};
203     uint8_t transferCRC = 0;
204 
205     auto rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
206                                   nextDataTransferHndl, transferFlag, respCnt,
207                                   recordData.data(), transferCRC, nullptr);
208 
209     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
210 }
211 
212 TEST(GetPDR, testGoodDecodeRequest)
213 {
214     std::array<uint8_t, hdrSize + PLDM_GET_PDR_REQ_BYTES> requestMsg{};
215 
216     uint32_t recordHndl = 0x32;
217     uint32_t dataTransferHndl = 0x11;
218     uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
219     uint16_t requestCnt = 0x5;
220     uint16_t recordChangeNum = 0x01;
221 
222     uint32_t retRecordHndl = 0;
223     uint32_t retDataTransferHndl = 0;
224     uint8_t retTransferOpFlag = 0;
225     uint16_t retRequestCnt = 0;
226     uint16_t retRecordChangeNum = 0;
227 
228     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
229     auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
230     struct pldm_get_pdr_req* request =
231         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
232         reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
233 
234     request->record_handle = htole32(recordHndl);
235     request->data_transfer_handle = htole32(dataTransferHndl);
236     request->transfer_op_flag = transferOpFlag;
237     request->request_count = htole16(requestCnt);
238     request->record_change_number = htole16(recordChangeNum);
239 
240     auto rc = decode_get_pdr_req(
241         req, requestMsg.size() - hdrSize, &retRecordHndl, &retDataTransferHndl,
242         &retTransferOpFlag, &retRequestCnt, &retRecordChangeNum);
243 
244     EXPECT_EQ(rc, PLDM_SUCCESS);
245     EXPECT_EQ(retRecordHndl, recordHndl);
246     EXPECT_EQ(retDataTransferHndl, dataTransferHndl);
247     EXPECT_EQ(retTransferOpFlag, transferOpFlag);
248     EXPECT_EQ(retRequestCnt, requestCnt);
249     EXPECT_EQ(retRecordChangeNum, recordChangeNum);
250 }
251 
252 TEST(GetPDR, testBadDecodeRequest)
253 {
254     std::array<uint8_t, PLDM_GET_PDR_REQ_BYTES> requestMsg{};
255     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
256     auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
257 
258     auto rc = decode_get_pdr_req(req, requestMsg.size(), NULL, NULL, NULL, NULL,
259                                  NULL);
260 
261     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
262 }
263 
264 TEST(GetPDR, testGoodEncodeRequest)
265 {
266     uint32_t record_hndl = 0;
267     uint32_t data_transfer_hndl = 0;
268     uint8_t transfer_op_flag = PLDM_GET_FIRSTPART;
269     uint16_t request_cnt = 20;
270     uint16_t record_chg_num = 0;
271 
272     std::vector<uint8_t> requestMsg(hdrSize + PLDM_GET_PDR_REQ_BYTES);
273     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
274     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
275 
276     auto rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
277                                  transfer_op_flag, request_cnt, record_chg_num,
278                                  request, PLDM_GET_PDR_REQ_BYTES);
279     EXPECT_EQ(rc, PLDM_SUCCESS);
280     struct pldm_get_pdr_req* req =
281         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
282         reinterpret_cast<struct pldm_get_pdr_req*>(request->payload);
283     EXPECT_EQ(record_hndl, le32toh(req->record_handle));
284     EXPECT_EQ(data_transfer_hndl, le32toh(req->data_transfer_handle));
285     EXPECT_EQ(transfer_op_flag, req->transfer_op_flag);
286     EXPECT_EQ(request_cnt, le16toh(req->request_count));
287     EXPECT_EQ(record_chg_num, le16toh(req->record_change_number));
288 }
289 
290 TEST(GetPDR, testBadEncodeRequest)
291 {
292     uint32_t record_hndl = 0;
293     uint32_t data_transfer_hndl = 0;
294     uint8_t transfer_op_flag = PLDM_GET_FIRSTPART;
295     uint16_t request_cnt = 32;
296     uint16_t record_chg_num = 0;
297 
298     std::vector<uint8_t> requestMsg(hdrSize + PLDM_GET_PDR_REQ_BYTES);
299     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
300     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
301 
302     auto rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
303                                  transfer_op_flag, request_cnt, record_chg_num,
304                                  nullptr, PLDM_GET_PDR_REQ_BYTES);
305     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
306 
307     rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
308                             transfer_op_flag, request_cnt, record_chg_num,
309                             request, PLDM_GET_PDR_REQ_BYTES + 1);
310     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
311 }
312 
313 TEST(GetPDR, testGoodDecodeResponse)
314 {
315     const char* recordData = "123456789";
316     uint8_t completionCode = PLDM_SUCCESS;
317     uint32_t nextRecordHndl = 0;
318     uint32_t nextDataTransferHndl = 0;
319     uint8_t transferFlag = PLDM_END;
320     constexpr uint16_t respCnt = 9;
321     uint8_t transferCRC = 96;
322     size_t recordDataLength = 32;
323     std::array<uint8_t, hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES + respCnt +
324                             sizeof(transferCRC)>
325         responseMsg{};
326 
327     uint8_t retCompletionCode = 0;
328     uint8_t retRecordData[32] = {0};
329     uint32_t retNextRecordHndl = 0;
330     uint32_t retNextDataTransferHndl = 0;
331     uint8_t retTransferFlag = 0;
332     uint16_t retRespCnt = 0;
333     uint8_t retTransferCRC = 0;
334 
335     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
336     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
337     struct pldm_get_pdr_resp* resp =
338         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
339         reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
340     resp->completion_code = completionCode;
341     resp->next_record_handle = htole32(nextRecordHndl);
342     resp->next_data_transfer_handle = htole32(nextDataTransferHndl);
343     resp->transfer_flag = transferFlag;
344     resp->response_count = htole16(respCnt);
345     memcpy(resp->record_data, recordData, respCnt);
346     response->payload[PLDM_GET_PDR_MIN_RESP_BYTES + respCnt] = transferCRC;
347 
348     auto rc = decode_get_pdr_resp(
349         response, responseMsg.size() - hdrSize, &retCompletionCode,
350         &retNextRecordHndl, &retNextDataTransferHndl, &retTransferFlag,
351         &retRespCnt, retRecordData, recordDataLength, &retTransferCRC);
352     EXPECT_EQ(rc, PLDM_SUCCESS);
353     EXPECT_EQ(retCompletionCode, completionCode);
354     EXPECT_EQ(retNextRecordHndl, nextRecordHndl);
355     EXPECT_EQ(retNextDataTransferHndl, nextDataTransferHndl);
356     EXPECT_EQ(retTransferFlag, transferFlag);
357     EXPECT_EQ(retRespCnt, respCnt);
358     EXPECT_EQ(retTransferCRC, transferCRC);
359     EXPECT_EQ(0, memcmp(recordData, resp->record_data, respCnt));
360 }
361 
362 TEST(GetPDR, testBadDecodeResponse)
363 {
364     const char* recordData = "123456789";
365     uint8_t completionCode = PLDM_SUCCESS;
366     uint32_t nextRecordHndl = 0;
367     uint32_t nextDataTransferHndl = 0;
368     uint8_t transferFlag = PLDM_END;
369     constexpr uint16_t respCnt = 9;
370     uint8_t transferCRC = 96;
371     size_t recordDataLength = respCnt - 1;
372     std::array<uint8_t, hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES + respCnt +
373                             sizeof(transferCRC)>
374         responseMsg{};
375 
376     uint8_t retCompletionCode = 0;
377     uint8_t retRecordData[32] = {0};
378     uint32_t retNextRecordHndl = 0;
379     uint32_t retNextDataTransferHndl = 0;
380     uint8_t retTransferFlag = 0;
381     uint16_t retRespCnt = 0;
382     uint8_t retTransferCRC = 0;
383 
384     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
385     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
386     struct pldm_get_pdr_resp* resp =
387         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
388         reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
389     resp->completion_code = completionCode;
390     resp->next_record_handle = htole32(nextRecordHndl);
391     resp->next_data_transfer_handle = htole32(nextDataTransferHndl);
392     resp->transfer_flag = transferFlag;
393     resp->response_count = htole16(respCnt);
394     memcpy(resp->record_data, recordData, respCnt);
395     response->payload[PLDM_GET_PDR_MIN_RESP_BYTES + respCnt] = transferCRC;
396 
397     auto rc = decode_get_pdr_resp(response, responseMsg.size() - hdrSize, NULL,
398                                   NULL, NULL, NULL, NULL, NULL, 0, NULL);
399     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
400 
401     rc = decode_get_pdr_resp(
402         response, responseMsg.size() - hdrSize - 1, &retCompletionCode,
403         &retNextRecordHndl, &retNextDataTransferHndl, &retTransferFlag,
404         &retRespCnt, retRecordData, recordDataLength, &retTransferCRC);
405     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
406 }
407 
408 #ifdef LIBPLDM_API_TESTING
409 TEST(GetPDR, testGoodDecodeResponseSafe)
410 {
411     static const char recordData[] = "123456789";
412 
413     alignas(pldm_msg) unsigned char data[sizeof(pldm_msg_hdr) +
414                                          PLDM_GET_PDR_MIN_RESP_BYTES +
415                                          sizeof(recordData) - 1 + 1];
416     struct pldm_msgbuf _buf;
417     struct pldm_msgbuf* buf = &_buf;
418     int rc;
419 
420     pldm_msg* msg = new (data) pldm_msg;
421 
422     rc = pldm_msgbuf_init_errno(buf, PLDM_GET_PDR_MIN_RESP_BYTES, msg->payload,
423                                 sizeof(data) - sizeof(msg->hdr));
424     ASSERT_EQ(rc, 0);
425 
426     pldm_msgbuf_insert_uint8(buf, PLDM_SUCCESS);
427     pldm_msgbuf_insert_uint32(buf, 0);
428     pldm_msgbuf_insert_uint32(buf, 0);
429     pldm_msgbuf_insert_uint8(buf, PLDM_END);
430     pldm_msgbuf_insert_uint16(buf, sizeof(recordData) - 1);
431     rc = pldm_msgbuf_insert_array_char(buf, sizeof(recordData) - 1, recordData,
432                                        sizeof(recordData) - 1);
433     ASSERT_EQ(rc, 0);
434     pldm_msgbuf_insert_uint8(buf, 96);
435     ASSERT_EQ(pldm_msgbuf_destroy_consumed(buf), 0);
436 
437     alignas(pldm_get_pdr_resp) unsigned char
438         resp_data[sizeof(pldm_get_pdr_resp) + sizeof(recordData) - 1];
439     pldm_get_pdr_resp* resp = new (resp_data) pldm_get_pdr_resp;
440     uint8_t crc;
441     rc = decode_get_pdr_resp_safe(msg, sizeof(data) - sizeof(msg->hdr), resp,
442                                   sizeof(resp_data) - sizeof(*resp), &crc);
443     ASSERT_EQ(rc, 0);
444     EXPECT_EQ(resp->completion_code, PLDM_SUCCESS);
445     EXPECT_EQ(resp->next_record_handle, 0);
446     EXPECT_EQ(resp->next_data_transfer_handle, 0);
447     EXPECT_EQ(resp->transfer_flag, PLDM_END);
448     ASSERT_EQ(resp->response_count, sizeof(recordData) - 1);
449     EXPECT_EQ(crc, 96);
450     EXPECT_EQ(0, memcmp(recordData, resp->record_data, resp->response_count));
451 }
452 #endif
453 
454 #ifdef LIBPLDM_API_TESTING
455 TEST(GetPDR, testBadDecodeResponseSafeTrivial)
456 {
457     pldm_get_pdr_resp resp;
458     uint8_t crc;
459     int rc;
460 
461     rc = decode_get_pdr_resp_safe(nullptr, PLDM_GET_PDR_MIN_RESP_BYTES, &resp,
462                                   sizeof(resp), &crc);
463     EXPECT_EQ(rc, -EINVAL);
464 
465     alignas(pldm_msg) unsigned char
466         msg_data[sizeof(pldm_msg_hdr) + PLDM_GET_PDR_MIN_RESP_BYTES];
467     pldm_msg* msg = new (msg_data) pldm_msg;
468     rc = decode_get_pdr_resp_safe(msg, PLDM_GET_PDR_MIN_RESP_BYTES, nullptr,
469                                   sizeof(resp), &crc);
470     EXPECT_EQ(rc, -EINVAL);
471 
472     rc = decode_get_pdr_resp_safe(msg, PLDM_GET_PDR_MIN_RESP_BYTES, &resp,
473                                   sizeof(resp), nullptr);
474     EXPECT_EQ(rc, -EINVAL);
475 
476     msg->payload[0] = PLDM_ERROR_INVALID_DATA;
477     rc = decode_get_pdr_resp_safe(msg, 1, &resp, sizeof(resp), &crc);
478     EXPECT_EQ(rc, 0);
479     EXPECT_EQ(resp.completion_code, PLDM_ERROR_INVALID_DATA);
480 }
481 #endif
482 
483 TEST(GetPDRRepositoryInfo, testGoodEncodeResponse)
484 {
485     uint8_t completionCode = 0;
486     uint8_t repositoryState = PLDM_AVAILABLE;
487     uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
488     uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
489     uint32_t recordCount = 100;
490     uint32_t repositorySize = 100;
491     uint32_t largestRecordSize = UINT32_MAX;
492     uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
493 
494     std::vector<uint8_t> responseMsg(hdrSize +
495                                      PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES);
496     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
497     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
498 
499     auto rc = encode_get_pdr_repository_info_resp(
500         0, PLDM_SUCCESS, repositoryState, updateTime, oemUpdateTime,
501         recordCount, repositorySize, largestRecordSize,
502         dataTransferHandleTimeout, response);
503 
504     EXPECT_EQ(rc, PLDM_SUCCESS);
505     struct pldm_pdr_repository_info_resp* resp =
506         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
507         reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
508             response->payload);
509 
510     EXPECT_EQ(completionCode, resp->completion_code);
511     EXPECT_EQ(repositoryState, resp->repository_state);
512     EXPECT_EQ(0, memcmp(updateTime, resp->update_time, PLDM_TIMESTAMP104_SIZE));
513     EXPECT_EQ(0, memcmp(oemUpdateTime, resp->oem_update_time,
514                         PLDM_TIMESTAMP104_SIZE));
515     EXPECT_EQ(recordCount, le32toh(resp->record_count));
516     EXPECT_EQ(repositorySize, le32toh(resp->repository_size));
517     EXPECT_EQ(largestRecordSize, le32toh(resp->largest_record_size));
518     EXPECT_EQ(dataTransferHandleTimeout, resp->data_transfer_handle_timeout);
519 }
520 
521 TEST(GetPDRRepositoryInfo, testBadEncodeResponse)
522 {
523     uint8_t repositoryState = PLDM_AVAILABLE;
524     uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
525     uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
526     uint32_t recordCount = 100;
527     uint32_t repositorySize = 100;
528     uint32_t largestRecordSize = UINT32_MAX;
529     uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
530 
531     auto rc = encode_get_pdr_repository_info_resp(
532         0, PLDM_SUCCESS, repositoryState, updateTime, oemUpdateTime,
533         recordCount, repositorySize, largestRecordSize,
534         dataTransferHandleTimeout, nullptr);
535     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
536 }
537 
538 TEST(GetPDRRepositoryInfo, testGoodDecodeResponse)
539 {
540     uint8_t completionCode = PLDM_SUCCESS;
541     uint8_t repositoryState = PLDM_AVAILABLE;
542     uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
543     uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
544     uint32_t recordCount = 100;
545     uint32_t repositorySize = 100;
546     uint32_t largestRecordSize = UINT32_MAX;
547     uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
548 
549     std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
550         responseMsg{};
551     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
552     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
553     struct pldm_pdr_repository_info_resp* resp =
554         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
555         reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
556             response->payload);
557     resp->completion_code = completionCode;
558     resp->repository_state = repositoryState;
559     memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
560     memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
561     resp->record_count = htole32(recordCount);
562     resp->repository_size = htole32(repositorySize);
563     resp->largest_record_size = htole32(largestRecordSize);
564     resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
565 
566     uint8_t retCompletionCode = 0;
567     uint8_t retRepositoryState = 0;
568     uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
569     uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
570     uint32_t retRecordCount = 0;
571     uint32_t retRepositorySize = 0;
572     uint32_t retLargestRecordSize = 0;
573     uint8_t retDataTransferHandleTimeout = 0;
574 
575     auto rc = decode_get_pdr_repository_info_resp(
576         response, responseMsg.size() - hdrSize, &retCompletionCode,
577         &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
578         &retRepositorySize, &retLargestRecordSize,
579         &retDataTransferHandleTimeout);
580 
581     EXPECT_EQ(rc, PLDM_SUCCESS);
582     EXPECT_EQ(completionCode, retCompletionCode);
583     EXPECT_EQ(repositoryState, retRepositoryState);
584     EXPECT_EQ(0, memcmp(updateTime, retUpdateTime, PLDM_TIMESTAMP104_SIZE));
585     EXPECT_EQ(0,
586               memcmp(oemUpdateTime, retOemUpdateTime, PLDM_TIMESTAMP104_SIZE));
587     EXPECT_EQ(recordCount, recordCount);
588     EXPECT_EQ(repositorySize, repositorySize);
589     EXPECT_EQ(largestRecordSize, largestRecordSize);
590     EXPECT_EQ(dataTransferHandleTimeout, dataTransferHandleTimeout);
591 }
592 
593 TEST(GetPDRRepositoryInfo, testBadDecodeResponse)
594 {
595     uint8_t completionCode = PLDM_SUCCESS;
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 = htole32(100);
600     uint32_t repositorySize = htole32(100);
601     uint32_t largestRecordSize = htole32(UINT32_MAX);
602     uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
603 
604     std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
605         responseMsg{};
606     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
607     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
608     struct pldm_pdr_repository_info_resp* resp =
609         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
610         reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
611             response->payload);
612     resp->completion_code = completionCode;
613     resp->repository_state = repositoryState;
614     memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
615     memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
616     resp->record_count = recordCount;
617     resp->repository_size = repositorySize;
618     resp->largest_record_size = largestRecordSize;
619     resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
620 
621     uint8_t retCompletionCode = 0;
622     uint8_t retRepositoryState = 0;
623     uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
624     uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
625     uint32_t retRecordCount = 0;
626     uint32_t retRepositorySize = 0;
627     uint32_t retLargestRecordSize = 0;
628     uint8_t retDataTransferHandleTimeout = 0;
629 
630     auto rc = decode_get_pdr_repository_info_resp(
631         response, responseMsg.size() - hdrSize, NULL, NULL, NULL, NULL, NULL,
632         NULL, NULL, NULL);
633     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
634 
635     rc = decode_get_pdr_repository_info_resp(
636         response, responseMsg.size() - hdrSize - 1, &retCompletionCode,
637         &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
638         &retRepositorySize, &retLargestRecordSize,
639         &retDataTransferHandleTimeout);
640     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
641 
642     resp->repository_state = PLDM_FAILED + 1;
643     rc = decode_get_pdr_repository_info_resp(
644         response, responseMsg.size() - hdrSize, &retCompletionCode,
645         &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
646         &retRepositorySize, &retLargestRecordSize,
647         &retDataTransferHandleTimeout);
648     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
649 }
650 
651 #ifdef LIBPLDM_API_TESTING
652 TEST(GetPDRRepositoryInfo, testGoodDecodeResponseSafe)
653 {
654     alignas(pldm_msg) unsigned char
655         data[sizeof(pldm_msg_hdr) + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES];
656     uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
657     uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
658     struct pldm_msgbuf _buf;
659     struct pldm_msgbuf* buf = &_buf;
660     int rc;
661 
662     pldm_msg* msg = new (data) pldm_msg;
663 
664     rc = pldm_msgbuf_init_errno(buf, PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES,
665                                 msg->payload, sizeof(data) - sizeof(msg->hdr));
666     ASSERT_EQ(rc, 0);
667     pldm_msgbuf_insert_uint8(buf, PLDM_SUCCESS);
668     pldm_msgbuf_insert_uint8(buf, PLDM_AVAILABLE);
669     rc = pldm_msgbuf_insert_array_uint8(buf, PLDM_TIMESTAMP104_SIZE, updateTime,
670                                         sizeof(updateTime));
671     ASSERT_EQ(rc, 0);
672     rc = pldm_msgbuf_insert_array_uint8(buf, PLDM_TIMESTAMP104_SIZE,
673                                         oemUpdateTime, sizeof(oemUpdateTime));
674     ASSERT_EQ(rc, 0);
675     pldm_msgbuf_insert_uint32(buf, 100);
676     pldm_msgbuf_insert_uint32(buf, 100);
677     pldm_msgbuf_insert_uint32(buf, UINT32_MAX);
678     pldm_msgbuf_insert_uint8(buf, PLDM_NO_TIMEOUT);
679     ASSERT_EQ(pldm_msgbuf_destroy_consumed(buf), 0);
680 
681     struct pldm_pdr_repository_info_resp resp;
682     rc = decode_get_pdr_repository_info_resp_safe(
683         msg, sizeof(data) - sizeof(msg->hdr), &resp);
684 
685     EXPECT_EQ(rc, 0);
686     EXPECT_EQ(PLDM_SUCCESS, resp.completion_code);
687     EXPECT_EQ(PLDM_AVAILABLE, resp.repository_state);
688     EXPECT_EQ(0,
689               memcmp(updateTime, resp.update_time, sizeof(resp.update_time)));
690     EXPECT_EQ(0, memcmp(oemUpdateTime, resp.oem_update_time,
691                         sizeof(resp.oem_update_time)));
692     EXPECT_EQ(100, resp.record_count);
693     EXPECT_EQ(100, resp.repository_size);
694     EXPECT_EQ(UINT32_MAX, resp.largest_record_size);
695     EXPECT_EQ(PLDM_NO_TIMEOUT, resp.data_transfer_handle_timeout);
696 }
697 #endif
698 
699 #ifdef LIBPLDM_API_TESTING
700 TEST(GetPDRRepositoryInfo, testBadDecodeResponseSafeTrivial)
701 {
702     struct pldm_pdr_repository_info_resp resp;
703     int rc;
704 
705     rc = decode_get_pdr_repository_info_resp_safe(
706         nullptr, PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES, &resp);
707     EXPECT_EQ(rc, -EINVAL);
708 
709     alignas(pldm_msg) unsigned char
710         msg_data[sizeof(pldm_msg) - 1 +
711                  PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES];
712     pldm_msg* msg = new (msg_data) pldm_msg;
713     rc = decode_get_pdr_repository_info_resp_safe(msg, 0, &resp);
714     EXPECT_EQ(rc, -EOVERFLOW);
715 
716     rc = decode_get_pdr_repository_info_resp_safe(
717         msg, PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES, nullptr);
718     EXPECT_EQ(rc, -EINVAL);
719 
720     msg->payload[0] = PLDM_ERROR_INVALID_DATA;
721     rc = decode_get_pdr_repository_info_resp_safe(msg, 1, &resp);
722     EXPECT_EQ(rc, 0);
723     EXPECT_EQ(resp.completion_code, PLDM_ERROR_INVALID_DATA);
724 }
725 #endif
726 
727 TEST(SetNumericEffecterValue, testGoodDecodeRequest)
728 {
729     std::array<uint8_t,
730                hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 3>
731         requestMsg{};
732 
733     uint16_t effecter_id = 32768;
734     uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT32;
735     uint32_t effecter_value = 123456789;
736 
737     uint16_t reteffecter_id;
738     uint8_t reteffecter_data_size;
739     uint8_t reteffecter_value[4];
740 
741     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
742     auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
743     struct pldm_set_numeric_effecter_value_req* request =
744         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
745         reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
746             req->payload);
747 
748     request->effecter_id = htole16(effecter_id);
749     request->effecter_data_size = effecter_data_size;
750     uint32_t effecter_value_le = htole32(effecter_value);
751     memcpy(request->effecter_value, &effecter_value_le,
752            sizeof(effecter_value_le));
753 
754     auto rc = decode_set_numeric_effecter_value_req(
755         req, requestMsg.size() - hdrSize, &reteffecter_id,
756         &reteffecter_data_size, reteffecter_value);
757 
758     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
759     uint32_t value = *(reinterpret_cast<uint32_t*>(reteffecter_value));
760     EXPECT_EQ(rc, PLDM_SUCCESS);
761     EXPECT_EQ(reteffecter_id, effecter_id);
762     EXPECT_EQ(reteffecter_data_size, effecter_data_size);
763     EXPECT_EQ(value, effecter_value);
764 }
765 
766 TEST(SetNumericEffecterValue, testBadDecodeRequest)
767 {
768     std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES>
769         requestMsg{};
770 
771     auto rc = decode_set_numeric_effecter_value_req(
772         NULL, requestMsg.size() - hdrSize, NULL, NULL, NULL);
773     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
774 
775     uint16_t effecter_id = 0x10;
776     uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT8;
777     uint8_t effecter_value = 1;
778 
779     uint16_t reteffecter_id;
780     uint8_t reteffecter_data_size;
781     uint8_t reteffecter_value[4];
782 
783     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
784     auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
785     struct pldm_set_numeric_effecter_value_req* request =
786         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
787         reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
788             req->payload);
789 
790     request->effecter_id = effecter_id;
791     request->effecter_data_size = effecter_data_size;
792     memcpy(request->effecter_value, &effecter_value, sizeof(effecter_value));
793 
794     rc = decode_set_numeric_effecter_value_req(
795         req, requestMsg.size() - hdrSize - 1, &reteffecter_id,
796         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
797         &reteffecter_data_size, reinterpret_cast<uint8_t*>(&reteffecter_value));
798     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
799 }
800 
801 TEST(SetNumericEffecterValue, testGoodEncodeRequest)
802 {
803     uint16_t effecter_id = 0;
804     uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT16;
805     uint16_t effecter_value = 65534;
806 
807     std::vector<uint8_t> requestMsg(
808         hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
809     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
810     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
811 
812     auto rc = encode_set_numeric_effecter_value_req(
813         0, effecter_id, effecter_data_size,
814         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
815         reinterpret_cast<uint8_t*>(&effecter_value), request,
816         PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
817     EXPECT_EQ(rc, PLDM_SUCCESS);
818 
819     struct pldm_set_numeric_effecter_value_req* req =
820         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
821         reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
822             request->payload);
823     EXPECT_EQ(effecter_id, req->effecter_id);
824     EXPECT_EQ(effecter_data_size, req->effecter_data_size);
825     uint16_t* val = (uint16_t*)req->effecter_value;
826     *val = le16toh(*val);
827     EXPECT_EQ(effecter_value, *val);
828 }
829 
830 TEST(SetNumericEffecterValue, testBadEncodeRequest)
831 {
832     std::vector<uint8_t> requestMsg(
833         hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
834     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
835     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
836 
837     auto rc = encode_set_numeric_effecter_value_req(
838         0, 0, 0, NULL, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
839     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
840 
841     uint16_t effecter_value;
842     rc = encode_set_numeric_effecter_value_req(
843         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
844         0, 0, 6, reinterpret_cast<uint8_t*>(&effecter_value), request,
845         PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
846     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
847 }
848 
849 TEST(SetNumericEffecterValue, testGoodDecodeResponse)
850 {
851     std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
852         responseMsg{};
853 
854     uint8_t completion_code = 0xa0;
855 
856     uint8_t retcompletion_code;
857 
858     memcpy(responseMsg.data() + hdrSize, &completion_code,
859            sizeof(completion_code));
860 
861     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
862     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
863 
864     auto rc = decode_set_numeric_effecter_value_resp(
865         response, responseMsg.size() - hdrSize, &retcompletion_code);
866 
867     EXPECT_EQ(rc, PLDM_SUCCESS);
868     EXPECT_EQ(completion_code, retcompletion_code);
869 }
870 
871 TEST(SetNumericEffecterValue, testBadDecodeResponse)
872 {
873     std::array<uint8_t, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
874         responseMsg{};
875 
876     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
877     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
878 
879     auto rc = decode_set_numeric_effecter_value_resp(response,
880                                                      responseMsg.size(), NULL);
881 
882     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
883 }
884 
885 TEST(SetNumericEffecterValue, testGoodEncodeResponse)
886 {
887     std::array<uint8_t, sizeof(pldm_msg_hdr) +
888                             PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
889         responseMsg{};
890     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
891     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
892     uint8_t completionCode = 0;
893 
894     auto rc = encode_set_numeric_effecter_value_resp(
895         0, PLDM_SUCCESS, response, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
896 
897     EXPECT_EQ(rc, PLDM_SUCCESS);
898     EXPECT_EQ(completionCode, response->payload[0]);
899 }
900 
901 TEST(SetNumericEffecterValue, testBadEncodeResponse)
902 {
903     auto rc = encode_set_numeric_effecter_value_resp(
904         0, PLDM_SUCCESS, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
905     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
906 }
907 
908 TEST(GetStateSensorReadings, testGoodEncodeResponse)
909 {
910     std::array<uint8_t, hdrSize +
911                             PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
912                             sizeof(get_sensor_state_field) * 2>
913         responseMsg{};
914 
915     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
916     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
917     uint8_t completionCode = 0;
918     uint8_t comp_sensorCnt = 0x2;
919 
920     std::array<get_sensor_state_field, 2> stateField{};
921     stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_NORMAL,
922                      PLDM_SENSOR_WARNING, PLDM_SENSOR_UNKNOWN};
923     stateField[1] = {PLDM_SENSOR_FAILED, PLDM_SENSOR_UPPERFATAL,
924                      PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_FATAL};
925 
926     auto rc = encode_get_state_sensor_readings_resp(
927         0, PLDM_SUCCESS, comp_sensorCnt, stateField.data(), response);
928 
929     struct pldm_get_state_sensor_readings_resp* resp =
930         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
931         reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
932             response->payload);
933 
934     EXPECT_EQ(rc, PLDM_SUCCESS);
935     EXPECT_EQ(completionCode, resp->completion_code);
936     EXPECT_EQ(comp_sensorCnt, resp->comp_sensor_count);
937     EXPECT_EQ(stateField[0].sensor_op_state, resp->field->sensor_op_state);
938     EXPECT_EQ(stateField[0].present_state, resp->field->present_state);
939     EXPECT_EQ(stateField[0].previous_state, resp->field->previous_state);
940     EXPECT_EQ(stateField[0].event_state, resp->field->event_state);
941     EXPECT_EQ(stateField[1].sensor_op_state, resp->field[1].sensor_op_state);
942     EXPECT_EQ(stateField[1].present_state, resp->field[1].present_state);
943     EXPECT_EQ(stateField[1].previous_state, resp->field[1].previous_state);
944     EXPECT_EQ(stateField[1].event_state, resp->field[1].event_state);
945 }
946 
947 TEST(GetStateSensorReadings, testBadEncodeResponse)
948 {
949     auto rc = encode_get_state_sensor_readings_resp(0, PLDM_SUCCESS, 0, nullptr,
950                                                     nullptr);
951 
952     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
953 }
954 
955 TEST(GetStateSensorReadings, testGoodDecodeResponse)
956 {
957     std::array<uint8_t, hdrSize +
958                             PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
959                             sizeof(get_sensor_state_field) * 2>
960         responseMsg{};
961 
962     uint8_t completionCode = 0;
963     uint8_t comp_sensorCnt = 2;
964 
965     std::array<get_sensor_state_field, 2> stateField{};
966     stateField[0] = {PLDM_SENSOR_DISABLED, PLDM_SENSOR_UNKNOWN,
967                      PLDM_SENSOR_UNKNOWN, PLDM_SENSOR_UNKNOWN};
968     stateField[1] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_LOWERFATAL,
969                      PLDM_SENSOR_LOWERCRITICAL, PLDM_SENSOR_WARNING};
970 
971     uint8_t retcompletion_code = 0;
972     uint8_t retcomp_sensorCnt = 0;
973     std::array<get_sensor_state_field, 2> retstateField{};
974 
975     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
976     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
977     struct pldm_get_state_sensor_readings_resp* resp =
978         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
979         reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
980             response->payload);
981 
982     resp->completion_code = completionCode;
983     resp->comp_sensor_count = comp_sensorCnt;
984     memcpy(resp->field, &stateField,
985            (sizeof(get_sensor_state_field) * comp_sensorCnt));
986 
987     auto rc = decode_get_state_sensor_readings_resp(
988         response, responseMsg.size() - hdrSize, &retcompletion_code,
989         &retcomp_sensorCnt, retstateField.data());
990 
991     EXPECT_EQ(rc, PLDM_SUCCESS);
992     EXPECT_EQ(completionCode, retcompletion_code);
993     EXPECT_EQ(comp_sensorCnt, retcomp_sensorCnt);
994     EXPECT_EQ(stateField[0].sensor_op_state, retstateField[0].sensor_op_state);
995     EXPECT_EQ(stateField[0].present_state, retstateField[0].present_state);
996     EXPECT_EQ(stateField[0].previous_state, retstateField[0].previous_state);
997     EXPECT_EQ(stateField[0].event_state, retstateField[0].event_state);
998     EXPECT_EQ(stateField[1].sensor_op_state, retstateField[1].sensor_op_state);
999     EXPECT_EQ(stateField[1].present_state, retstateField[1].present_state);
1000     EXPECT_EQ(stateField[1].previous_state, retstateField[1].previous_state);
1001     EXPECT_EQ(stateField[1].event_state, retstateField[1].event_state);
1002 }
1003 
1004 TEST(GetStateSensorReadings, testBadDecodeResponse)
1005 {
1006     std::array<uint8_t, hdrSize +
1007                             PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
1008                             sizeof(get_sensor_state_field) * 2>
1009         responseMsg{};
1010 
1011     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1012     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1013 
1014     auto rc = decode_get_state_sensor_readings_resp(
1015         response, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr);
1016 
1017     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1018 
1019     uint8_t completionCode = 0;
1020     uint8_t comp_sensorCnt = 1;
1021 
1022     std::array<get_sensor_state_field, 1> stateField{};
1023     stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_UPPERFATAL,
1024                      PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_WARNING};
1025 
1026     uint8_t retcompletion_code = 0;
1027     uint8_t retcomp_sensorCnt = 0;
1028     std::array<get_sensor_state_field, 1> retstateField{};
1029 
1030     struct pldm_get_state_sensor_readings_resp* resp =
1031         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1032         reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
1033             response->payload);
1034 
1035     resp->completion_code = completionCode;
1036     resp->comp_sensor_count = comp_sensorCnt;
1037     memcpy(resp->field, &stateField,
1038            (sizeof(get_sensor_state_field) * comp_sensorCnt));
1039 
1040     rc = decode_get_state_sensor_readings_resp(
1041         response, responseMsg.size() - hdrSize, &retcompletion_code,
1042         &retcomp_sensorCnt, retstateField.data());
1043 
1044     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1045 }
1046 
1047 TEST(GetStateSensorReadings, testGoodEncodeRequest)
1048 {
1049     std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
1050         requestMsg{};
1051 
1052     uint16_t sensorId = 0xab;
1053     bitfield8_t sensorRearm;
1054     sensorRearm.byte = 0x03;
1055 
1056     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1057     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1058     auto rc = encode_get_state_sensor_readings_req(0, sensorId, sensorRearm, 0,
1059                                                    request);
1060 
1061     struct pldm_get_state_sensor_readings_req* req =
1062         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1063         reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
1064             request->payload);
1065 
1066     EXPECT_EQ(rc, PLDM_SUCCESS);
1067     EXPECT_EQ(sensorId, le16toh(req->sensor_id));
1068     EXPECT_EQ(sensorRearm.byte, req->sensor_rearm.byte);
1069 }
1070 
1071 TEST(GetStateSensorReadings, testBadEncodeRequest)
1072 {
1073     bitfield8_t sensorRearm;
1074     sensorRearm.byte = 0x0;
1075 
1076     auto rc =
1077         encode_get_state_sensor_readings_req(0, 0, sensorRearm, 0, nullptr);
1078 
1079     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1080 }
1081 
1082 TEST(GetStateSensorReadings, testGoodDecodeRequest)
1083 {
1084     std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
1085         requestMsg{};
1086 
1087     uint16_t sensorId = 0xcd;
1088     bitfield8_t sensorRearm;
1089     sensorRearm.byte = 0x10;
1090 
1091     uint16_t retsensorId;
1092     bitfield8_t retsensorRearm;
1093     uint8_t retreserved;
1094 
1095     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1096     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1097 
1098     struct pldm_get_state_sensor_readings_req* req =
1099         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1100         reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
1101             request->payload);
1102 
1103     req->sensor_id = htole16(sensorId);
1104     req->sensor_rearm.byte = sensorRearm.byte;
1105 
1106     auto rc = decode_get_state_sensor_readings_req(
1107         request, requestMsg.size() - hdrSize, &retsensorId, &retsensorRearm,
1108         &retreserved);
1109 
1110     EXPECT_EQ(rc, PLDM_SUCCESS);
1111     EXPECT_EQ(sensorId, retsensorId);
1112     EXPECT_EQ(sensorRearm.byte, retsensorRearm.byte);
1113     EXPECT_EQ(0, retreserved);
1114 }
1115 
1116 TEST(GetStateSensorReadings, testBadDecodeRequest)
1117 {
1118     std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
1119         requestMsg{};
1120 
1121     auto rc = decode_get_state_sensor_readings_req(
1122         nullptr, requestMsg.size() - hdrSize, nullptr, nullptr, nullptr);
1123 
1124     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1125     uint16_t sensorId = 0x11;
1126     bitfield8_t sensorRearm;
1127     sensorRearm.byte = 0x04;
1128 
1129     uint16_t retsensorId;
1130     bitfield8_t retsensorRearm;
1131     uint8_t retreserved;
1132 
1133     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1134     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1135 
1136     struct pldm_get_state_sensor_readings_req* req =
1137         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1138         reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
1139             request->payload);
1140 
1141     req->sensor_id = htole16(sensorId);
1142     req->sensor_rearm.byte = sensorRearm.byte;
1143 
1144     rc = decode_get_state_sensor_readings_req(
1145         request, requestMsg.size() - hdrSize - 1, &retsensorId, &retsensorRearm,
1146         &retreserved);
1147 
1148     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1149 }
1150 
1151 TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeRequest)
1152 {
1153     uint8_t eventBufferSize = 32;
1154 
1155     std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_REQ_BYTES>
1156         requestMsg{};
1157     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1158     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1159 
1160     auto rc = encode_event_message_buffer_size_req(0, eventBufferSize, request);
1161 
1162     EXPECT_EQ(rc, PLDM_SUCCESS);
1163 }
1164 
1165 TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeResponse)
1166 {
1167     uint8_t completionCode = PLDM_SUCCESS;
1168     uint16_t terminusMaxBufferSize = 256;
1169 
1170     std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
1171         responseMsg{};
1172 
1173     uint8_t retCompletionCode;
1174     uint16_t retMaxBufferSize = 0;
1175 
1176     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1177     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1178     struct pldm_event_message_buffer_size_resp* resp =
1179         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1180         reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
1181             response->payload);
1182 
1183     resp->completion_code = completionCode;
1184     resp->terminus_max_buffer_size = terminusMaxBufferSize;
1185 
1186     auto rc = decode_event_message_buffer_size_resp(
1187         response, responseMsg.size() - hdrSize, &retCompletionCode,
1188         &retMaxBufferSize);
1189 
1190     EXPECT_EQ(rc, PLDM_SUCCESS);
1191     EXPECT_EQ(retCompletionCode, completionCode);
1192     EXPECT_EQ(terminusMaxBufferSize, retMaxBufferSize);
1193 }
1194 
1195 TEST(EventMessageBufferSize, testBadEventMessageBufferSizeResponse)
1196 {
1197     uint8_t completionCode = PLDM_SUCCESS;
1198     uint16_t terminusMaxBufferSize = 256;
1199 
1200     std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
1201         responseMsg{};
1202 
1203     uint8_t retCompletionCode;
1204     uint16_t retMaxBufferSize = 0;
1205 
1206     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1207     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1208     struct pldm_event_message_buffer_size_resp* resp =
1209         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1210         reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
1211             response->payload);
1212     resp->completion_code = completionCode;
1213     resp->terminus_max_buffer_size = terminusMaxBufferSize;
1214 
1215     auto rc =
1216         decode_event_message_buffer_size_resp(response, 0, nullptr, nullptr);
1217     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1218 
1219     rc = decode_event_message_buffer_size_resp(
1220         response, responseMsg.size(), &retCompletionCode, &retMaxBufferSize);
1221     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1222 }
1223 
1224 TEST(PlatformEventMessageSupported, testGoodEncodeRequest)
1225 {
1226     uint8_t formatVersion = 0x01;
1227 
1228     std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_REQ_BYTES>
1229         requestMsg{};
1230 
1231     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1232     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1233 
1234     auto rc = encode_event_message_supported_req(0, formatVersion, request);
1235 
1236     struct pldm_event_message_supported_req* req =
1237         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1238         reinterpret_cast<struct pldm_event_message_supported_req*>(
1239             request->payload);
1240 
1241     EXPECT_EQ(rc, PLDM_SUCCESS);
1242     EXPECT_EQ(formatVersion, req->format_version);
1243 }
1244 
1245 TEST(PlatformEventMessageSupported, testBadEncodeRequest)
1246 {
1247     uint8_t eventData = 34;
1248     uint8_t formatVersion = 0x0;
1249 
1250     std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_REQ_BYTES +
1251                             sizeof(eventData)>
1252         requestMsg{};
1253     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1254     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1255 
1256     auto rc = encode_event_message_supported_req(0, formatVersion, request);
1257     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1258 
1259     rc = encode_event_message_supported_req(0, formatVersion, nullptr);
1260     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1261 }
1262 
1263 TEST(PlatformEventMessageSupported, testGoodDecodeRespond)
1264 {
1265     uint8_t completionCode = PLDM_SUCCESS;
1266     uint8_t synchConfiguration = PLDM_MESSAGE_TYPE_SYNCHRONOUS;
1267     bitfield8_t synchConfigSupported;
1268     synchConfigSupported.byte = 0xe;
1269     uint8_t numberEventClassReturned = 0x3;
1270     std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
1271     constexpr uint8_t eventClassCount = 3;
1272 
1273     std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
1274                             eventClassCount>
1275         responseMsg{};
1276 
1277     uint8_t retCompletionCode;
1278     uint8_t retSynchConfig = 0;
1279     uint8_t retNumberEventClass = 0;
1280     bitfield8_t retSynchConfigSupport;
1281     uint8_t retEventClass[eventClassCount] = {0};
1282 
1283     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1284     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1285     struct pldm_event_message_supported_resp* resp =
1286         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1287         reinterpret_cast<struct pldm_event_message_supported_resp*>(
1288             response->payload);
1289 
1290     resp->completion_code = completionCode;
1291     resp->synchrony_configuration = synchConfiguration;
1292     resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
1293     resp->number_event_class_returned = numberEventClassReturned;
1294     memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
1295 
1296     auto rc = decode_event_message_supported_resp(
1297         response, responseMsg.size() - hdrSize, &retCompletionCode,
1298         &retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
1299         retEventClass, eventClassCount);
1300 
1301     EXPECT_EQ(rc, PLDM_SUCCESS);
1302     EXPECT_EQ(retCompletionCode, completionCode);
1303     EXPECT_EQ(retSynchConfig, synchConfiguration);
1304     EXPECT_EQ(retNumberEventClass, numberEventClassReturned);
1305     EXPECT_EQ(retSynchConfigSupport.byte, synchConfigSupported.byte);
1306     EXPECT_EQ(0, memcmp(eventClass.data(), resp->event_class,
1307                         numberEventClassReturned));
1308 }
1309 
1310 TEST(PlatformEventMessageSupported, testBadSynchConfiguration)
1311 {
1312     uint8_t completionCode = PLDM_SUCCESS;
1313     uint8_t synchConfiguration = 0x4;
1314     bitfield8_t synchConfigSupported;
1315     synchConfigSupported.byte = 0xe;
1316     uint8_t numberEventClassReturned = 0x3;
1317     std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
1318     constexpr uint8_t eventClassCount = 3;
1319 
1320     std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
1321                             eventClassCount>
1322         responseMsg{};
1323 
1324     uint8_t retCompletionCode;
1325     uint8_t retSynchConfig = 0;
1326     uint8_t retNumberEventClass = 0;
1327     bitfield8_t retSynchConfigSupport;
1328     uint8_t retEventClass[eventClassCount] = {0};
1329 
1330     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1331     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1332     struct pldm_event_message_supported_resp* resp =
1333         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1334         reinterpret_cast<struct pldm_event_message_supported_resp*>(
1335             response->payload);
1336 
1337     resp->completion_code = completionCode;
1338     resp->synchrony_configuration = synchConfiguration;
1339     resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
1340     resp->number_event_class_returned = numberEventClassReturned;
1341     memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
1342 
1343     auto rc = decode_event_message_supported_resp(
1344         response, responseMsg.size() - hdrSize, &retCompletionCode,
1345         &retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
1346         retEventClass, eventClassCount);
1347 
1348     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1349 }
1350 
1351 TEST(PlatformEventMessageSupported, testBadDecodeRespond)
1352 {
1353     uint8_t completionCode = PLDM_SUCCESS;
1354     uint8_t synchConfiguration = PLDM_MESSAGE_TYPE_SYNCHRONOUS;
1355     bitfield8_t synchConfigSupported;
1356     synchConfigSupported.byte = 0xe;
1357     uint8_t numberEventClassReturned = 0x3;
1358     std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
1359     constexpr uint8_t eventClassCount = 3;
1360 
1361     std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
1362                             eventClassCount>
1363         responseMsg{};
1364 
1365     uint8_t retCompletionCode;
1366     uint8_t retSynchConfig = 0;
1367     uint8_t retNumberEventClass = 0;
1368     bitfield8_t retSynchConfigSupport;
1369     uint8_t retEventClass[eventClassCount] = {0};
1370 
1371     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1372     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1373     struct pldm_event_message_supported_resp* resp =
1374         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1375         reinterpret_cast<struct pldm_event_message_supported_resp*>(
1376             response->payload);
1377     resp->completion_code = completionCode;
1378     resp->synchrony_configuration = synchConfiguration;
1379     resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
1380     resp->number_event_class_returned = numberEventClassReturned;
1381     memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
1382 
1383     auto rc = decode_event_message_supported_resp(response, 0, nullptr, nullptr,
1384                                                   nullptr, nullptr, nullptr, 0);
1385     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1386 
1387     rc = decode_event_message_supported_resp(
1388         response, PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES - 1,
1389         &retCompletionCode, &retSynchConfig, &retSynchConfigSupport,
1390         &retNumberEventClass, retEventClass, eventClassCount);
1391     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1392 
1393     rc = decode_event_message_supported_resp(
1394         response, responseMsg.size() - hdrSize, &retCompletionCode,
1395         &retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
1396         retEventClass, 1);
1397     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1398 }
1399 
1400 TEST(PollForPlatformEventMessage, testGoodEncodeRequestFirstPart)
1401 {
1402     uint8_t formatVersion = 0x01;
1403     uint8_t transferOperationFlag = PLDM_GET_FIRSTPART;
1404     uint32_t dataTransferHandle = 0xaabbccdd;
1405     uint16_t eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_NULL;
1406 
1407     PLDM_MSG_DEFINE_P(request, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1408 
1409     auto rc = encode_poll_for_platform_event_message_req(
1410         0, formatVersion, transferOperationFlag, dataTransferHandle,
1411         eventIdToAcknowledge, request,
1412         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1413     EXPECT_EQ(rc, PLDM_SUCCESS);
1414 
1415     struct pldm_msgbuf _buf;
1416     struct pldm_msgbuf* buf = &_buf;
1417     rc = pldm_msgbuf_init_errno(
1418         buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES, request->payload,
1419         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1420     EXPECT_EQ(rc, 0);
1421 
1422     uint8_t retFormatVersion;
1423     uint8_t retTransferOperationFlag;
1424     uint32_t retDataTransferHandle;
1425     uint16_t retEventIdToAcknowledge;
1426 
1427     pldm_msgbuf_extract_uint8(buf, retFormatVersion);
1428     pldm_msgbuf_extract_uint8(buf, retTransferOperationFlag);
1429     pldm_msgbuf_extract_uint32(buf, retDataTransferHandle);
1430     pldm_msgbuf_extract_uint16(buf, retEventIdToAcknowledge);
1431     ASSERT_EQ(pldm_msgbuf_destroy_consumed(buf), 0);
1432 
1433     EXPECT_EQ(retFormatVersion, formatVersion);
1434     EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1435     EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1436     EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
1437 }
1438 
1439 TEST(PollForPlatformEventMessage, testGoodEncodeRequestNextPart)
1440 {
1441     uint8_t formatVersion = 0x01;
1442     uint8_t transferOperationFlag = PLDM_GET_NEXTPART;
1443     uint32_t dataTransferHandle = 0xaabbccdd;
1444     uint16_t eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_FRAGMENT;
1445 
1446     PLDM_MSG_DEFINE_P(request, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1447 
1448     auto rc = encode_poll_for_platform_event_message_req(
1449         0, formatVersion, transferOperationFlag, dataTransferHandle,
1450         eventIdToAcknowledge, request,
1451         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1452     EXPECT_EQ(rc, PLDM_SUCCESS);
1453 
1454     struct pldm_msgbuf _buf;
1455     struct pldm_msgbuf* buf = &_buf;
1456     rc = pldm_msgbuf_init_errno(
1457         buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES, request->payload,
1458         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1459     EXPECT_EQ(rc, 0);
1460 
1461     uint8_t retFormatVersion;
1462     uint8_t retTransferOperationFlag;
1463     uint32_t retDataTransferHandle;
1464     uint16_t retEventIdToAcknowledge;
1465 
1466     pldm_msgbuf_extract_uint8(buf, retFormatVersion);
1467     pldm_msgbuf_extract_uint8(buf, retTransferOperationFlag);
1468     pldm_msgbuf_extract_uint32(buf, retDataTransferHandle);
1469     pldm_msgbuf_extract_uint16(buf, retEventIdToAcknowledge);
1470     ASSERT_EQ(pldm_msgbuf_destroy_consumed(buf), 0);
1471 
1472     EXPECT_EQ(retFormatVersion, formatVersion);
1473     EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1474     EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1475     EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
1476 }
1477 
1478 TEST(PollForPlatformEventMessage, testGoodEncodeRequestAckOnly)
1479 {
1480     uint8_t formatVersion = 0x01;
1481     uint8_t transferOperationFlag = PLDM_ACKNOWLEDGEMENT_ONLY;
1482     uint32_t dataTransferHandle = 0xaabbccdd;
1483     uint16_t eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_FRAGMENT;
1484 
1485     PLDM_MSG_DEFINE_P(request, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1486 
1487     auto rc = encode_poll_for_platform_event_message_req(
1488         0, formatVersion, transferOperationFlag, dataTransferHandle,
1489         eventIdToAcknowledge, request,
1490         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1491     EXPECT_EQ(rc, PLDM_SUCCESS);
1492 
1493     struct pldm_msgbuf _buf;
1494     struct pldm_msgbuf* buf = &_buf;
1495     rc = pldm_msgbuf_init_errno(
1496         buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES, request->payload,
1497         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1498     EXPECT_EQ(rc, 0);
1499 
1500     uint8_t retFormatVersion;
1501     uint8_t retTransferOperationFlag;
1502     uint32_t retDataTransferHandle;
1503     uint16_t retEventIdToAcknowledge;
1504 
1505     pldm_msgbuf_extract_uint8(buf, retFormatVersion);
1506     pldm_msgbuf_extract_uint8(buf, retTransferOperationFlag);
1507     pldm_msgbuf_extract_uint32(buf, retDataTransferHandle);
1508     pldm_msgbuf_extract_uint16(buf, retEventIdToAcknowledge);
1509     ASSERT_EQ(pldm_msgbuf_destroy_consumed(buf), 0);
1510 
1511     EXPECT_EQ(retFormatVersion, formatVersion);
1512     EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1513     EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1514     EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
1515 }
1516 
1517 TEST(PollForPlatformEventMessage, testBadEncodeRequest)
1518 {
1519     uint8_t formatVersion = 0x01;
1520     uint8_t transferOperationFlag = PLDM_GET_FIRSTPART;
1521     uint32_t dataTransferHandle = 0xaabbccdd;
1522     uint16_t eventIdToAcknowledge = 0x1234;
1523 
1524     PLDM_MSG_DEFINE_P(request, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1525 
1526     auto rc = encode_poll_for_platform_event_message_req(
1527         0, formatVersion, transferOperationFlag, dataTransferHandle,
1528         eventIdToAcknowledge, nullptr,
1529         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1530     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1531 
1532     transferOperationFlag = PLDM_GET_FIRSTPART;
1533     eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_FRAGMENT;
1534     rc = encode_poll_for_platform_event_message_req(
1535         0, formatVersion, transferOperationFlag, dataTransferHandle,
1536         eventIdToAcknowledge, request,
1537         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1538     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1539 
1540     transferOperationFlag = PLDM_GET_NEXTPART;
1541     eventIdToAcknowledge = 0x1234;
1542     rc = encode_poll_for_platform_event_message_req(
1543         0, formatVersion, transferOperationFlag, dataTransferHandle,
1544         eventIdToAcknowledge, request,
1545         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1546     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1547 
1548     transferOperationFlag = PLDM_GET_NEXTPART;
1549     eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_NULL;
1550     rc = encode_poll_for_platform_event_message_req(
1551         0, formatVersion, transferOperationFlag, dataTransferHandle,
1552         eventIdToAcknowledge, request,
1553         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1554     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1555 
1556     transferOperationFlag = PLDM_ACKNOWLEDGEMENT_ONLY;
1557     eventIdToAcknowledge = 0x1234;
1558     rc = encode_poll_for_platform_event_message_req(
1559         0, formatVersion, transferOperationFlag, dataTransferHandle,
1560         eventIdToAcknowledge, request,
1561         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1562     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1563 
1564     transferOperationFlag = PLDM_ACKNOWLEDGEMENT_ONLY;
1565     eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_NULL;
1566     rc = encode_poll_for_platform_event_message_req(
1567         0, formatVersion, transferOperationFlag, dataTransferHandle,
1568         eventIdToAcknowledge, request,
1569         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1570     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1571 
1572     transferOperationFlag = PLDM_ACKNOWLEDGEMENT_ONLY + 1;
1573     eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_FRAGMENT;
1574     rc = encode_poll_for_platform_event_message_req(
1575         0, formatVersion, transferOperationFlag, dataTransferHandle,
1576         eventIdToAcknowledge, request,
1577         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_REQ_BYTES);
1578     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1579 }
1580 
1581 TEST(PollForPlatformEventMessage, testGoodDecodeRespond)
1582 {
1583     uint8_t completionCode = PLDM_SUCCESS;
1584     uint8_t tId = 0x9;
1585     uint16_t eventId = 159;
1586     uint32_t nextDataTransferHandle = 0x11223344;
1587     uint8_t transferFlag = PLDM_START_AND_END;
1588     uint8_t eventClass = 0x5;
1589     uint8_t eventData[5] = {0x55, 0x44, 0x33, 0x22, 0x11};
1590     constexpr uint32_t eventDataSize = 0x00000005;
1591     uint32_t eventDataIntegrityChecksum = 0x66778899;
1592 
1593     std::vector<uint8_t> responseMsg{
1594         0x1,
1595         0x0,
1596         0x0,
1597         PLDM_SUCCESS,
1598         0x9, // tid
1599         159,
1600         0x0, // event id
1601         0x44,
1602         0x33,
1603         0x22,
1604         0x11,               // next_data_transfer_handle
1605         PLDM_START_AND_END, // transfer_flag
1606         0x05,               // event class
1607         0x05,
1608         0x00,
1609         0x00,
1610         0x00, // event_data_size
1611         0x55,
1612         0x44,
1613         0x33,
1614         0x22,
1615         0x11, // event_data[5]
1616         0x99,
1617         0x88,
1618         0x77,
1619         0x66 // event_data_integrity_checksum
1620     };
1621     const uint32_t respMsgLen = 23;
1622 
1623     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1624     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1625 
1626     uint8_t retCompletionCode;
1627     uint8_t retTid = 0;
1628     uint16_t retEventId = 0;
1629     uint32_t retNextDataTransferHandle = 0;
1630     uint8_t retTransferFlag = 0;
1631     uint8_t retEventClass = 0;
1632     uint32_t retEventDataSize = 0;
1633     uint8_t* retEventData = nullptr;
1634     uint32_t retEventDataIntegrityChecksum = 0;
1635 
1636     auto rc = decode_poll_for_platform_event_message_resp(
1637         response, respMsgLen, &retCompletionCode, &retTid, &retEventId,
1638         &retNextDataTransferHandle, &retTransferFlag, &retEventClass,
1639         &retEventDataSize, (void**)&retEventData,
1640         &retEventDataIntegrityChecksum);
1641 
1642     EXPECT_EQ(rc, PLDM_SUCCESS);
1643     EXPECT_EQ(retCompletionCode, completionCode);
1644     EXPECT_EQ(retTid, tId);
1645     EXPECT_EQ(retEventId, eventId);
1646     EXPECT_EQ(retNextDataTransferHandle, nextDataTransferHandle);
1647     EXPECT_EQ(retTransferFlag, transferFlag);
1648     EXPECT_EQ(retEventClass, eventClass);
1649     EXPECT_EQ(retEventDataSize, eventDataSize);
1650     EXPECT_EQ(retEventDataIntegrityChecksum, eventDataIntegrityChecksum);
1651     EXPECT_EQ(0, memcmp(eventData, retEventData, eventDataSize));
1652 }
1653 
1654 TEST(PollForPlatformEventMessage, testGoodDecodeAckOnlyRespond)
1655 {
1656     uint8_t completionCode = PLDM_SUCCESS;
1657     uint8_t tId = 0x9;
1658     uint16_t eventId = 0xffff;
1659 
1660     std::vector<uint8_t> responseMsg{
1661         0x1,  0x0, 0x0, PLDM_SUCCESS,
1662         0x9, // tid
1663         0xff,
1664         0xff // event id
1665     };
1666     const uint32_t respMsgLen = 4;
1667 
1668     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1669     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1670 
1671     uint8_t retCompletionCode;
1672     uint8_t retTid = 0;
1673     uint16_t retEventId = 0;
1674     uint32_t retNextDataTransferHandle = 0;
1675     uint8_t retTransferFlag = 0;
1676     uint8_t retEventClass = 0;
1677     uint32_t retEventDataSize = 0;
1678     uint8_t* retEventData = nullptr;
1679     uint32_t retEventDataIntegrityChecksum = 0;
1680 
1681     auto rc = decode_poll_for_platform_event_message_resp(
1682         response, respMsgLen, &retCompletionCode, &retTid, &retEventId,
1683         &retNextDataTransferHandle, &retTransferFlag, &retEventClass,
1684         &retEventDataSize, (void**)&retEventData,
1685         &retEventDataIntegrityChecksum);
1686 
1687     EXPECT_EQ(rc, PLDM_SUCCESS);
1688     EXPECT_EQ(retCompletionCode, completionCode);
1689     EXPECT_EQ(retTid, tId);
1690     EXPECT_EQ(retEventId, eventId);
1691 
1692     eventId = 0x0000;
1693     responseMsg[5] = 0x00;
1694     responseMsg[6] = 0x00;
1695     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1696     response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1697 
1698     rc = decode_poll_for_platform_event_message_resp(
1699         response, respMsgLen, &retCompletionCode, &retTid, &retEventId,
1700         &retNextDataTransferHandle, &retTransferFlag, &retEventClass,
1701         &retEventDataSize, (void**)&retEventData,
1702         &retEventDataIntegrityChecksum);
1703 
1704     EXPECT_EQ(rc, PLDM_SUCCESS);
1705     EXPECT_EQ(retCompletionCode, completionCode);
1706     EXPECT_EQ(retTid, tId);
1707     EXPECT_EQ(retEventId, eventId);
1708 }
1709 
1710 TEST(PollForPlatformEventMessage, testBadDecodeRespond)
1711 {
1712     std::vector<uint8_t> responseMsg{
1713         0x1,
1714         0x0,
1715         0x0,
1716         PLDM_SUCCESS,
1717         0x9, // tid
1718         159,
1719         0x0, // event id
1720         0x44,
1721         0x33,
1722         0x22,
1723         0x11,               // next_data_transfer_handle
1724         PLDM_START_AND_END, // transfer_flag
1725         0x05,               // event class
1726         0x05,
1727         0x00,
1728         0x00,
1729         0x00, // event_data_size
1730         0x55,
1731         0x44,
1732         0x33,
1733         0x22,
1734         0x11, // event_data[5]
1735         0x99,
1736         0x88,
1737         0x77,
1738         0x66 // event_data_integrity_checksum
1739     };
1740     // const uint32_t respMsgLen = 23;
1741 
1742     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1743     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1744 
1745     auto rc = decode_poll_for_platform_event_message_resp(
1746         nullptr, 0, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
1747         nullptr, nullptr, nullptr);
1748 
1749     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1750 
1751     uint8_t retCompletionCode;
1752     uint8_t retTid = 0;
1753     uint16_t retEventId = 0;
1754     uint32_t retNextDataTransferHandle = 0;
1755     uint8_t retTransferFlag = 0;
1756     uint8_t retEventClass = 0;
1757     uint32_t retEventDataSize = 0;
1758     uint8_t* retEventData = nullptr;
1759     uint32_t retEventDataIntegrityChecksum = 0;
1760 
1761     rc = decode_poll_for_platform_event_message_resp(
1762         response, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES - 1,
1763         &retCompletionCode, &retTid, &retEventId, &retNextDataTransferHandle,
1764         &retTransferFlag, &retEventClass, &retEventDataSize,
1765         (void**)&retEventData, &retEventDataIntegrityChecksum);
1766 
1767     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1768 }
1769 
1770 TEST(PollForPlatformEventMessage, testGoodDecodeRequestFirstPart)
1771 {
1772     uint8_t formatVersion = 0x1;
1773     uint8_t transferOperationFlag = PLDM_GET_FIRSTPART;
1774     uint32_t dataTransferHandle = 0x11223344;
1775     uint16_t eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_NULL;
1776     std::vector<uint8_t> requestMsg{0x1,  0x0,  0x0,  0x1,  PLDM_GET_FIRSTPART,
1777                                     0x44, 0x33, 0x22, 0x11, 0x00,
1778                                     0x00};
1779     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1780     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1781 
1782     uint8_t retFormatVersion;
1783     uint8_t retTransferOperationFlag;
1784     uint32_t retDataTransferHandle;
1785     uint16_t retEventIdToAcknowledge;
1786 
1787     auto rc = decode_poll_for_platform_event_message_req(
1788         request, requestMsg.size() - hdrSize, &retFormatVersion,
1789         &retTransferOperationFlag, &retDataTransferHandle,
1790         &retEventIdToAcknowledge);
1791 
1792     EXPECT_EQ(rc, PLDM_SUCCESS);
1793     EXPECT_EQ(retFormatVersion, formatVersion);
1794     EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1795     EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1796     EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
1797 }
1798 
1799 TEST(PollForPlatformEventMessage, testGoodDecodeRequestNextPart)
1800 {
1801     uint8_t formatVersion = 0x1;
1802     uint8_t transferOperationFlag = PLDM_GET_NEXTPART;
1803     uint32_t dataTransferHandle = 0x11223344;
1804     uint16_t eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_FRAGMENT;
1805     std::vector<uint8_t> requestMsg{0x1,  0x0,  0x0,  0x1,  PLDM_GET_NEXTPART,
1806                                     0x44, 0x33, 0x22, 0x11, 0xff,
1807                                     0xff};
1808     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1809     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1810 
1811     uint8_t retFormatVersion;
1812     uint8_t retTransferOperationFlag;
1813     uint32_t retDataTransferHandle;
1814     uint16_t retEventIdToAcknowledge;
1815 
1816     auto rc = decode_poll_for_platform_event_message_req(
1817         request, requestMsg.size() - hdrSize, &retFormatVersion,
1818         &retTransferOperationFlag, &retDataTransferHandle,
1819         &retEventIdToAcknowledge);
1820 
1821     EXPECT_EQ(rc, PLDM_SUCCESS);
1822     EXPECT_EQ(retFormatVersion, formatVersion);
1823     EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1824     EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1825     EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
1826 }
1827 
1828 TEST(PollForPlatformEventMessage, testGoodDecodeRequestAck)
1829 {
1830     uint8_t formatVersion = 0x1;
1831     uint8_t transferOperationFlag = PLDM_ACKNOWLEDGEMENT_ONLY;
1832     uint32_t dataTransferHandle = 0x11223344;
1833     uint16_t eventIdToAcknowledge = PLDM_PLATFORM_EVENT_ID_FRAGMENT;
1834     std::vector<uint8_t> requestMsg{
1835         0x1,  0x0,  0x0,  0x1, PLDM_ACKNOWLEDGEMENT_ONLY, 0x44, 0x33,
1836         0x22, 0x11, 0xff, 0xff};
1837     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1838     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1839 
1840     uint8_t retFormatVersion;
1841     uint8_t retTransferOperationFlag;
1842     uint32_t retDataTransferHandle;
1843     uint16_t retEventIdToAcknowledge;
1844 
1845     auto rc = decode_poll_for_platform_event_message_req(
1846         request, requestMsg.size() - hdrSize, &retFormatVersion,
1847         &retTransferOperationFlag, &retDataTransferHandle,
1848         &retEventIdToAcknowledge);
1849 
1850     EXPECT_EQ(rc, PLDM_SUCCESS);
1851     EXPECT_EQ(retFormatVersion, formatVersion);
1852     EXPECT_EQ(retTransferOperationFlag, transferOperationFlag);
1853     EXPECT_EQ(retDataTransferHandle, dataTransferHandle);
1854     EXPECT_EQ(retEventIdToAcknowledge, eventIdToAcknowledge);
1855 }
1856 
1857 TEST(PollForPlatformEventMessage, testBadDecodeRequest)
1858 {
1859     /*
1860      * transfer_operation_flag is PLDM_GET_FIRSTPART and
1861      * event_id_to_acknowledge is not PLDM_PLATFORM_EVENT_ID_NULL
1862      */
1863     std::vector<uint8_t> requestMsg{0x1,  0x0,  0x0,  0x1,  PLDM_GET_FIRSTPART,
1864                                     0x44, 0x33, 0x22, 0x11, 0x66,
1865                                     0x55};
1866     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1867     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1868 
1869     uint8_t retFormatVersion;
1870     uint8_t retTransferOperationFlag;
1871     uint32_t retDataTransferHandle;
1872     uint16_t retEventIdToAcknowledge;
1873 
1874     auto rc = decode_poll_for_platform_event_message_req(
1875         NULL, requestMsg.size() - hdrSize, &retFormatVersion,
1876         &retTransferOperationFlag, &retDataTransferHandle,
1877         &retEventIdToAcknowledge);
1878     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1879 
1880     /*
1881      * transfer_operation_flag is not PLDM_GET_FIRSTPART or PLDM_GET_NEXTPART or
1882      * PLDM_ACKNOWLEDGEMENT_ONLY
1883      */
1884 
1885     requestMsg[4] = PLDM_ACKNOWLEDGEMENT_ONLY + 1;
1886 
1887     rc = decode_poll_for_platform_event_message_req(
1888         request, requestMsg.size() - hdrSize, &retFormatVersion,
1889         &retTransferOperationFlag, &retDataTransferHandle,
1890         &retEventIdToAcknowledge);
1891 
1892     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1893 
1894     /*
1895      * transfer_operation_flag is PLDM_GET_NEXTPART and
1896      * event_id_to_acknowledge is not PLDM_PLATFORM_EVENT_ID_FRAGMENT
1897      */
1898     requestMsg[4] = PLDM_GET_NEXTPART;
1899     requestMsg[9] = 0x11;
1900     requestMsg[10] = 0x22;
1901 
1902     rc = decode_poll_for_platform_event_message_req(
1903         request, requestMsg.size() - hdrSize, &retFormatVersion,
1904         &retTransferOperationFlag, &retDataTransferHandle,
1905         &retEventIdToAcknowledge);
1906 
1907     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1908 
1909     /*
1910      * transfer_operation_flag is PLDM_ACKNOWLEDGEMENT_ONLY and
1911      * event_id_to_acknowledge is not PLDM_PLATFORM_EVENT_ID_FRAGMENT
1912      */
1913     requestMsg[4] = PLDM_ACKNOWLEDGEMENT_ONLY;
1914     requestMsg[9] = 0x11;
1915     requestMsg[10] = 0x22;
1916 
1917     rc = decode_poll_for_platform_event_message_req(
1918         request, requestMsg.size() - hdrSize, &retFormatVersion,
1919         &retTransferOperationFlag, &retDataTransferHandle,
1920         &retEventIdToAcknowledge);
1921 
1922     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1923 }
1924 
1925 TEST(PollForPlatformEventMessage, testGoodEncodeResposeP1)
1926 {
1927     uint8_t completionCode = PLDM_SUCCESS;
1928     uint8_t instance_id = 0;
1929     uint8_t tId = 0x9;
1930     uint16_t eventId = 0x1;
1931     uint32_t nextDataTransferHandle = 0xffff;
1932     uint8_t transferFlag = PLDM_END;
1933     uint8_t eventClass = 0x5;
1934     constexpr uint32_t eventDataSize = 9;
1935     uint8_t pEventData[eventDataSize] = {0x31, 0x32, 0x33, 0x34, 0x35,
1936                                          0x36, 0x37, 0x38, 0x39};
1937     uint32_t eventDataIntegrityChecksum = 0x11223344;
1938     constexpr size_t payloadLength =
1939         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_RESP_BYTES + eventDataSize + 4;
1940 
1941     std::array<uint8_t, hdrSize + payloadLength> responseMsg{};
1942     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
1943     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1944 
1945     auto rc = encode_poll_for_platform_event_message_resp(
1946         instance_id, completionCode, tId, eventId, nextDataTransferHandle,
1947         transferFlag, eventClass, eventDataSize, pEventData,
1948         eventDataIntegrityChecksum, response, payloadLength);
1949     EXPECT_EQ(rc, PLDM_SUCCESS);
1950 
1951     struct pldm_msgbuf _buf;
1952     struct pldm_msgbuf* buf = &_buf;
1953     rc = pldm_msgbuf_init_cc(
1954         buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES,
1955         response->payload, payloadLength);
1956     EXPECT_EQ(rc, PLDM_SUCCESS);
1957 
1958     uint8_t retCompletionCode;
1959     uint8_t retTid = 0;
1960     uint16_t retEventId = 0;
1961     uint32_t retNextDataTransferHandle = 0;
1962     uint8_t retTransferFlag = 0;
1963     uint8_t retEventClass = 0;
1964     uint32_t retEventDataSize = 0;
1965     uint8_t retEventData[payloadLength] = {0};
1966     uint32_t retEventDataIntegrityChecksum = 0;
1967 
1968     pldm_msgbuf_extract_uint8(buf, retCompletionCode);
1969     pldm_msgbuf_extract_uint8(buf, retTid);
1970     pldm_msgbuf_extract_uint16(buf, retEventId);
1971     pldm_msgbuf_extract_uint32(buf, retNextDataTransferHandle);
1972     pldm_msgbuf_extract_uint8(buf, retTransferFlag);
1973     pldm_msgbuf_extract_uint8(buf, retEventClass);
1974     pldm_msgbuf_extract_uint32(buf, retEventDataSize);
1975     rc = pldm_msgbuf_extract_array_uint8(buf, retEventDataSize, retEventData,
1976                                          sizeof(retEventData));
1977     ASSERT_EQ(rc, 0);
1978     pldm_msgbuf_extract_uint32(buf, retEventDataIntegrityChecksum);
1979 
1980     EXPECT_EQ(rc, PLDM_SUCCESS);
1981     EXPECT_EQ(retCompletionCode, completionCode);
1982     EXPECT_EQ(retTid, tId);
1983     EXPECT_EQ(retEventId, eventId);
1984     EXPECT_EQ(retNextDataTransferHandle, nextDataTransferHandle);
1985     EXPECT_EQ(retTransferFlag, transferFlag);
1986     EXPECT_EQ(retEventClass, eventClass);
1987     EXPECT_EQ(retEventDataSize, eventDataSize);
1988     EXPECT_EQ(retEventDataIntegrityChecksum, eventDataIntegrityChecksum);
1989     EXPECT_EQ(0, memcmp(pEventData, retEventData, eventDataSize));
1990 
1991     EXPECT_EQ(pldm_msgbuf_destroy(buf), PLDM_SUCCESS);
1992 }
1993 
1994 TEST(PollForPlatformEventMessage, testGoodEncodeResposeP2)
1995 {
1996     uint8_t completionCode = PLDM_SUCCESS;
1997     uint8_t instance_id = 0;
1998     uint8_t tId = 0x9;
1999     uint16_t eventId = 0x0000;
2000     constexpr size_t payloadLength =
2001         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES;
2002 
2003     std::array<uint8_t, hdrSize + payloadLength> responseMsg{};
2004     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2005     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2006 
2007     auto rc = encode_poll_for_platform_event_message_resp(
2008         instance_id, completionCode, tId, eventId, 0, 0, 0, 0, NULL, 0,
2009         response, payloadLength);
2010     EXPECT_EQ(rc, PLDM_SUCCESS);
2011 
2012     struct pldm_msgbuf _buf;
2013     struct pldm_msgbuf* buf = &_buf;
2014     rc = pldm_msgbuf_init_cc(
2015         buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES,
2016         response->payload, payloadLength);
2017     EXPECT_EQ(rc, PLDM_SUCCESS);
2018 
2019     uint8_t retCompletionCode;
2020     uint8_t retTid = 0;
2021     uint16_t retEventId = 0;
2022 
2023     pldm_msgbuf_extract_uint8(buf, retCompletionCode);
2024     pldm_msgbuf_extract_uint8(buf, retTid);
2025     pldm_msgbuf_extract_uint16(buf, retEventId);
2026 
2027     EXPECT_EQ(rc, PLDM_SUCCESS);
2028     EXPECT_EQ(retCompletionCode, completionCode);
2029     EXPECT_EQ(retTid, tId);
2030     EXPECT_EQ(retEventId, eventId);
2031     EXPECT_EQ(pldm_msgbuf_destroy(buf), PLDM_SUCCESS);
2032 }
2033 
2034 TEST(PollForPlatformEventMessage, testGoodEncodeResposeP3)
2035 {
2036     uint8_t completionCode = PLDM_SUCCESS;
2037     uint8_t instance_id = 0;
2038     uint8_t tId = 0x9;
2039     uint16_t eventId = 0xffff;
2040     constexpr size_t payloadLength =
2041         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES;
2042 
2043     std::array<uint8_t, hdrSize + payloadLength> responseMsg{};
2044     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2045     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2046 
2047     auto rc = encode_poll_for_platform_event_message_resp(
2048         instance_id, completionCode, tId, eventId, 0, 0, 0, 0, NULL, 0,
2049         response, payloadLength);
2050     EXPECT_EQ(rc, PLDM_SUCCESS);
2051 
2052     struct pldm_msgbuf _buf;
2053     struct pldm_msgbuf* buf = &_buf;
2054     rc = pldm_msgbuf_init_cc(
2055         buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES,
2056         response->payload, payloadLength);
2057     EXPECT_EQ(rc, PLDM_SUCCESS);
2058 
2059     uint8_t retCompletionCode;
2060     uint8_t retTid = 0;
2061     uint16_t retEventId = 0;
2062 
2063     pldm_msgbuf_extract_uint8(buf, retCompletionCode);
2064     pldm_msgbuf_extract_uint8(buf, retTid);
2065     pldm_msgbuf_extract_uint16(buf, retEventId);
2066 
2067     EXPECT_EQ(rc, PLDM_SUCCESS);
2068     EXPECT_EQ(retCompletionCode, completionCode);
2069     EXPECT_EQ(retTid, tId);
2070     EXPECT_EQ(retEventId, eventId);
2071     EXPECT_EQ(pldm_msgbuf_destroy(buf), PLDM_SUCCESS);
2072 }
2073 
2074 TEST(PollForPlatformEventMessage, testGoodEncodeResposeP4)
2075 {
2076     uint8_t completionCode = PLDM_SUCCESS;
2077     uint8_t instance_id = 0;
2078     uint8_t tId = 0x9;
2079     uint16_t eventId = 0x1;
2080     uint32_t nextDataTransferHandle = 0xffff;
2081     uint8_t transferFlag = PLDM_END;
2082     uint8_t eventClass = 0x5;
2083     constexpr uint32_t eventDataSize = 0;
2084     uint32_t eventDataIntegrityChecksum = 0x11223344;
2085     size_t payloadLength =
2086         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_RESP_BYTES + eventDataSize + 4;
2087 
2088     std::array<uint8_t, hdrSize +
2089                             PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_RESP_BYTES +
2090                             eventDataSize + 4>
2091         responseMsg{};
2092     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2093     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2094 
2095     auto rc = encode_poll_for_platform_event_message_resp(
2096         instance_id, completionCode, tId, eventId, nextDataTransferHandle,
2097         transferFlag, eventClass, eventDataSize, NULL,
2098         eventDataIntegrityChecksum, response, payloadLength);
2099     EXPECT_EQ(rc, PLDM_SUCCESS);
2100 
2101     struct pldm_msgbuf _buf;
2102     struct pldm_msgbuf* buf = &_buf;
2103     rc = pldm_msgbuf_init_cc(
2104         buf, PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_MIN_RESP_BYTES,
2105         response->payload, payloadLength);
2106     EXPECT_EQ(rc, PLDM_SUCCESS);
2107 
2108     uint8_t retCompletionCode;
2109     uint8_t retTid = 0;
2110     uint16_t retEventId = 0;
2111     uint32_t retNextDataTransferHandle = 0;
2112     uint8_t retTransferFlag = 0;
2113     uint8_t retEventClass = 0;
2114     uint32_t retEventDataSize = 0;
2115     uint32_t retEventDataIntegrityChecksum = 0;
2116 
2117     pldm_msgbuf_extract_uint8(buf, retCompletionCode);
2118     pldm_msgbuf_extract_uint8(buf, retTid);
2119     pldm_msgbuf_extract_uint16(buf, retEventId);
2120     pldm_msgbuf_extract_uint32(buf, retNextDataTransferHandle);
2121     pldm_msgbuf_extract_uint8(buf, retTransferFlag);
2122     pldm_msgbuf_extract_uint8(buf, retEventClass);
2123     pldm_msgbuf_extract_uint32(buf, retEventDataSize);
2124     pldm_msgbuf_extract_uint32(buf, retEventDataIntegrityChecksum);
2125 
2126     EXPECT_EQ(rc, PLDM_SUCCESS);
2127     EXPECT_EQ(retCompletionCode, completionCode);
2128     EXPECT_EQ(retTid, tId);
2129     EXPECT_EQ(retEventId, eventId);
2130     EXPECT_EQ(retNextDataTransferHandle, nextDataTransferHandle);
2131     EXPECT_EQ(retTransferFlag, transferFlag);
2132     EXPECT_EQ(retEventClass, eventClass);
2133     EXPECT_EQ(retEventDataSize, eventDataSize);
2134     EXPECT_EQ(retEventDataIntegrityChecksum, eventDataIntegrityChecksum);
2135 
2136     EXPECT_EQ(pldm_msgbuf_destroy(buf), PLDM_SUCCESS);
2137 }
2138 
2139 TEST(PollForPlatformEventMessage, testBadEncodeResponse)
2140 {
2141     uint8_t completionCode = PLDM_SUCCESS;
2142     uint8_t instance_id = 0;
2143     uint8_t tId = 0x9;
2144     uint16_t eventId = 0x1;
2145     uint32_t nextDataTransferHandle = 0xffff;
2146     uint8_t transferFlag = 0x0;
2147     uint8_t eventClass = 0x5;
2148     const uint32_t eventDataSize = 0;
2149     uint32_t eventDataIntegrityChecksum = 0x11223344;
2150     constexpr size_t payloadLength =
2151         PLDM_POLL_FOR_PLATFORM_EVENT_MESSAGE_RESP_BYTES + eventDataSize + 4;
2152 
2153     std::array<uint8_t, hdrSize + payloadLength> responseMsg{};
2154     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2155     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2156 
2157     auto rc = encode_poll_for_platform_event_message_resp(
2158         instance_id, completionCode, tId, eventId, nextDataTransferHandle,
2159         transferFlag, eventClass, eventDataSize, NULL,
2160         eventDataIntegrityChecksum, NULL, payloadLength);
2161 
2162     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2163 
2164     rc = encode_poll_for_platform_event_message_resp(
2165         instance_id, completionCode, tId, eventId, nextDataTransferHandle,
2166         transferFlag, eventClass, 1, NULL, eventDataIntegrityChecksum, response,
2167         payloadLength);
2168     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2169 }
2170 
2171 TEST(PlatformEventMessage, testGoodStateSensorDecodeRequest)
2172 {
2173     std::array<uint8_t,
2174                hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
2175                    PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES>
2176         requestMsg{};
2177 
2178     uint8_t retFormatVersion = 0;
2179     uint8_t retTid = 0;
2180     uint8_t retEventClass = 0;
2181     size_t retEventDataOffset = 0;
2182 
2183     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2184     auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
2185     struct pldm_platform_event_message_req* request =
2186         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2187         reinterpret_cast<struct pldm_platform_event_message_req*>(req->payload);
2188 
2189     uint8_t formatVersion = 0x01;
2190     uint8_t tid = 0x02;
2191     // Sensor Event
2192     uint8_t eventClass = 0x00;
2193 
2194     request->format_version = formatVersion;
2195     request->tid = tid;
2196     request->event_class = eventClass;
2197     size_t eventDataOffset =
2198         sizeof(formatVersion) + sizeof(tid) + sizeof(eventClass);
2199 
2200     auto rc = decode_platform_event_message_req(
2201         req, requestMsg.size() - hdrSize, &retFormatVersion, &retTid,
2202         &retEventClass, &retEventDataOffset);
2203 
2204     EXPECT_EQ(rc, PLDM_SUCCESS);
2205     EXPECT_EQ(retFormatVersion, formatVersion);
2206     EXPECT_EQ(retTid, tid);
2207     EXPECT_EQ(retEventClass, eventClass);
2208     EXPECT_EQ(retEventDataOffset, eventDataOffset);
2209 }
2210 
2211 TEST(PlatformEventMessage, testBadDecodeRequest)
2212 {
2213     const struct pldm_msg* msg = NULL;
2214     std::array<uint8_t,
2215                hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
2216                    PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
2217         requestMsg{};
2218     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2219     auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
2220     uint8_t retFormatVersion;
2221     uint8_t retTid = 0;
2222     uint8_t retEventClass = 0;
2223     size_t retEventDataOffset;
2224 
2225     auto rc = decode_platform_event_message_req(msg, sizeof(*msg), NULL, NULL,
2226                                                 NULL, NULL);
2227     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2228 
2229     rc = decode_platform_event_message_req(
2230         req,
2231         requestMsg.size() - hdrSize -
2232             PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES,
2233         &retFormatVersion, &retTid, &retEventClass, &retEventDataOffset);
2234     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2235 }
2236 
2237 TEST(PlatformEventMessage, testGoodEncodeResponse)
2238 {
2239     std::array<uint8_t,
2240                hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
2241                    PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
2242         responseMsg{};
2243     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2244     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2245     uint8_t completionCode = 0;
2246     uint8_t instanceId = 0x01;
2247     uint8_t platformEventStatus = 0x01;
2248 
2249     auto rc = encode_platform_event_message_resp(instanceId, PLDM_SUCCESS,
2250                                                  platformEventStatus, response);
2251 
2252     EXPECT_EQ(rc, PLDM_SUCCESS);
2253     EXPECT_EQ(completionCode, response->payload[0]);
2254     EXPECT_EQ(platformEventStatus, response->payload[1]);
2255 }
2256 
2257 TEST(PlatformEventMessage, testBadEncodeResponse)
2258 {
2259     auto rc = encode_platform_event_message_resp(0, PLDM_SUCCESS, 1, NULL);
2260     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2261 }
2262 
2263 TEST(PlatformEventMessage, testGoodEncodeRequest)
2264 {
2265     static constexpr const uint8_t formatVersion = 0x01;
2266     static constexpr const uint8_t eventClass = 0x00;
2267     static constexpr const uint8_t eventData = 34;
2268     static constexpr const uint8_t Tid = 0x03;
2269     struct pldm_platform_event_message_req req;
2270     struct pldm_msgbuf _buf;
2271     struct pldm_msgbuf* buf = &_buf;
2272     size_t len;
2273     void* data;
2274 
2275     PLDM_MSG_DEFINE_P(request, PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
2276                                    sizeof(eventData));
2277 
2278     /* Test with the minimum event type value */
2279     auto rc = encode_platform_event_message_req(
2280         0, formatVersion, Tid, eventClass, &eventData, sizeof(eventData),
2281         request, sizeof(eventData) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
2282     ASSERT_EQ(rc, PLDM_SUCCESS);
2283 
2284     rc = pldm_msgbuf_init_errno(
2285         buf, PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES, request->payload,
2286         PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES + sizeof(eventData));
2287     ASSERT_EQ(rc, 0);
2288 
2289     pldm_msgbuf_extract_uint8(buf, req.format_version);
2290     pldm_msgbuf_extract_uint8(buf, req.tid);
2291     pldm_msgbuf_extract_uint8(buf, req.event_class);
2292     data = nullptr;
2293     pldm_msgbuf_span_remaining(buf, &data, &len);
2294     ASSERT_EQ(pldm_msgbuf_destroy_consumed(buf), 0);
2295 
2296     EXPECT_EQ(formatVersion, req.format_version);
2297     EXPECT_EQ(Tid, req.tid);
2298     EXPECT_EQ(eventClass, req.event_class);
2299     ASSERT_EQ(sizeof(eventData), len);
2300     EXPECT_EQ(0, memcmp(&eventData, data, len));
2301 
2302     /* Test with the maximum event type value */
2303     rc = encode_platform_event_message_req(
2304         0, formatVersion, Tid, PLDM_CPER_EVENT, &eventData, sizeof(eventData),
2305         request, sizeof(eventData) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
2306     ASSERT_EQ(rc, PLDM_SUCCESS);
2307 
2308     rc = pldm_msgbuf_init_errno(
2309         buf, PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES, request->payload,
2310         PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES + sizeof(eventData));
2311     ASSERT_EQ(rc, 0);
2312 
2313     pldm_msgbuf_extract_uint8(buf, req.format_version);
2314     pldm_msgbuf_extract_uint8(buf, req.tid);
2315     pldm_msgbuf_extract_uint8(buf, req.event_class);
2316 
2317     data = nullptr;
2318     pldm_msgbuf_span_remaining(buf, &data, &len);
2319     ASSERT_EQ(pldm_msgbuf_destroy_consumed(buf), 0);
2320 
2321     EXPECT_EQ(formatVersion, req.format_version);
2322     EXPECT_EQ(Tid, req.tid);
2323     EXPECT_EQ(PLDM_CPER_EVENT, req.event_class);
2324     ASSERT_EQ(sizeof(eventData), len);
2325     EXPECT_EQ(0, memcmp(&eventData, data, len));
2326 }
2327 
2328 TEST(PlatformEventMessage, testBadEncodeRequest)
2329 {
2330     uint8_t Tid = 0x03;
2331     uint8_t eventClass = 0x00;
2332     uint8_t eventData = 34;
2333     uint8_t formatVersion = 0x01;
2334     static constexpr const size_t payloadLen =
2335         PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES + sizeof(eventData);
2336 
2337     PLDM_MSG_DEFINE_P(request, payloadLen);
2338 
2339     auto rc = encode_platform_event_message_req(
2340         0, formatVersion, Tid, eventClass, &eventData, sizeof(eventData),
2341         nullptr, payloadLen);
2342     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2343 
2344     rc = encode_platform_event_message_req(0, 0, Tid, eventClass, &eventData,
2345                                            sizeof(eventData), request,
2346                                            payloadLen);
2347     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2348 
2349     rc = encode_platform_event_message_req(0, formatVersion, Tid, eventClass,
2350                                            nullptr, 0, request, payloadLen);
2351     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2352 
2353     rc = encode_platform_event_message_req(0, formatVersion, Tid, eventClass,
2354                                            &eventData, sizeof(eventData),
2355                                            request, 0);
2356     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2357 
2358     rc = encode_platform_event_message_req(
2359         0, formatVersion, Tid, PLDM_CPER_EVENT + 1, &eventData,
2360         sizeof(eventData), request, payloadLen);
2361     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2362 }
2363 
2364 TEST(PlatformEventMessage, testGoodDecodeResponse)
2365 {
2366     std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
2367         responseMsg{};
2368 
2369     uint8_t completionCode = PLDM_SUCCESS;
2370     uint8_t platformEventStatus = 0x01;
2371 
2372     uint8_t retcompletionCode;
2373     uint8_t retplatformEventStatus;
2374 
2375     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2376     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2377     struct pldm_platform_event_message_resp* resp =
2378         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2379         reinterpret_cast<struct pldm_platform_event_message_resp*>(
2380             response->payload);
2381 
2382     resp->completion_code = completionCode;
2383     resp->platform_event_status = platformEventStatus;
2384 
2385     auto rc = decode_platform_event_message_resp(
2386         response, responseMsg.size() - hdrSize, &retcompletionCode,
2387         &retplatformEventStatus);
2388 
2389     EXPECT_EQ(rc, PLDM_SUCCESS);
2390     EXPECT_EQ(completionCode, retcompletionCode);
2391     EXPECT_EQ(platformEventStatus, retplatformEventStatus);
2392 }
2393 
2394 TEST(PlatformEventMessage, testBadDecodeResponse)
2395 {
2396     std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
2397         responseMsg{};
2398 
2399     uint8_t completionCode = PLDM_SUCCESS;
2400     uint8_t platformEventStatus = 0x01;
2401 
2402     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2403     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2404     struct pldm_platform_event_message_resp* resp =
2405         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2406         reinterpret_cast<struct pldm_platform_event_message_resp*>(
2407             response->payload);
2408     resp->completion_code = completionCode;
2409     resp->platform_event_status = platformEventStatus;
2410 
2411     auto rc = decode_platform_event_message_resp(
2412         nullptr, responseMsg.size() - hdrSize, nullptr, nullptr);
2413 
2414     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2415 
2416     rc = decode_platform_event_message_resp(
2417         response, responseMsg.size() - hdrSize - 1, &completionCode,
2418         &platformEventStatus);
2419 
2420     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2421 }
2422 
2423 TEST(PlatformEventMessage, testGoodSensorEventDataDecodeRequest)
2424 {
2425     std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH +
2426                             PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
2427         eventDataArr{};
2428     uint16_t sensorId = 0x1234;
2429     uint8_t sensorEventClassType = PLDM_SENSOR_OP_STATE;
2430 
2431     struct pldm_sensor_event_data* eventData =
2432         (struct pldm_sensor_event_data*)eventDataArr.data();
2433     eventData->sensor_id = sensorId;
2434     eventData->sensor_event_class_type = sensorEventClassType;
2435 
2436     size_t retSensorOpDataOffset;
2437     uint16_t retSensorId = 0;
2438     uint8_t retSensorEventClassType;
2439     size_t sensorOpDataOffset = sizeof(sensorId) + sizeof(sensorEventClassType);
2440     auto rc = decode_sensor_event_data(
2441         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2442         reinterpret_cast<uint8_t*>(eventData), eventDataArr.size(),
2443         &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
2444     EXPECT_EQ(rc, PLDM_SUCCESS);
2445     EXPECT_EQ(retSensorId, sensorId);
2446     EXPECT_EQ(retSensorEventClassType, sensorEventClassType);
2447     EXPECT_EQ(retSensorOpDataOffset, sensorOpDataOffset);
2448 }
2449 
2450 TEST(PlatformEventMessage, testBadSensorEventDataDecodeRequest)
2451 {
2452 
2453     std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH +
2454                             PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
2455         eventDataArr{};
2456 
2457     struct pldm_sensor_event_data* eventData =
2458         (struct pldm_sensor_event_data*)eventDataArr.data();
2459 
2460     size_t retSensorOpDataOffset;
2461     uint16_t retSensorId = 0;
2462     uint8_t retSensorEventClassType;
2463     auto rc = decode_sensor_event_data(NULL, eventDataArr.size(), &retSensorId,
2464                                        &retSensorEventClassType,
2465                                        &retSensorOpDataOffset);
2466     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2467 
2468     rc = decode_sensor_event_data(
2469         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2470         reinterpret_cast<uint8_t*>(eventDataArr.data()),
2471         eventDataArr.size() -
2472             PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH,
2473         &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
2474     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2475 
2476     eventData->sensor_event_class_type = PLDM_SENSOR_OP_STATE;
2477 
2478     rc = decode_sensor_event_data(
2479         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2480         reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
2481         &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
2482     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2483 
2484     eventData->sensor_event_class_type = PLDM_STATE_SENSOR_STATE;
2485     rc = decode_sensor_event_data(
2486         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2487         reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
2488         &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
2489     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2490 
2491     eventData->sensor_event_class_type = PLDM_NUMERIC_SENSOR_STATE;
2492     rc = decode_sensor_event_data(
2493         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2494         reinterpret_cast<uint8_t*>(eventDataArr.data()),
2495         eventDataArr.size() + 1, &retSensorId, &retSensorEventClassType,
2496         &retSensorOpDataOffset);
2497     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2498 }
2499 
2500 TEST(PlatformEventMessage, testGoodPldmMsgPollEventDataDecodeRequest)
2501 {
2502     std::array<uint8_t, PLDM_PLATFORM_EVENT_MESSAGE_FORMAT_VERSION +
2503                             PLDM_PLATFORM_EVENT_MESSAGE_EVENT_ID +
2504                             PLDM_PLATFORM_EVENT_MESSAGE_TRANFER_HANDLE>
2505         eventData{
2506             0x1,                   // version
2507             0x88, 0x77,            // Event Id
2508             0x44, 0x33, 0x22, 0x11 // Transfer Handle
2509         };
2510 
2511     uint8_t formatVersion = 0x01;
2512     uint16_t eventID = 0x7788;
2513     uint32_t dataTransferHandle = 0x11223344;
2514 
2515     struct pldm_message_poll_event poll_event = {};
2516 
2517     auto rc = decode_pldm_message_poll_event_data(
2518         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2519         reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(),
2520         &poll_event);
2521 
2522     EXPECT_EQ(rc, PLDM_SUCCESS);
2523     EXPECT_EQ(poll_event.format_version, formatVersion);
2524     EXPECT_EQ(poll_event.event_id, eventID);
2525     EXPECT_EQ(poll_event.data_transfer_handle, dataTransferHandle);
2526 }
2527 
2528 TEST(PlatformEventMessage, testBadPldmMsgPollEventDataDecodeRequest)
2529 {
2530 
2531     std::array<uint8_t, PLDM_PLATFORM_EVENT_MESSAGE_FORMAT_VERSION +
2532                             PLDM_PLATFORM_EVENT_MESSAGE_EVENT_ID +
2533                             PLDM_PLATFORM_EVENT_MESSAGE_TRANFER_HANDLE>
2534         eventData{
2535             0x1,                   // version
2536             0x88, 0x77,            // Event Id
2537             0x44, 0x33, 0x22, 0x11 // Transfer Handle
2538         };
2539 
2540     struct pldm_message_poll_event poll_event = {};
2541 
2542     auto rc = decode_pldm_message_poll_event_data(NULL, eventData.size(),
2543                                                   &poll_event);
2544     EXPECT_EQ(rc, -EINVAL);
2545 
2546     rc = decode_pldm_message_poll_event_data(
2547         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2548         reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(), NULL);
2549     EXPECT_EQ(rc, -EINVAL);
2550 
2551     rc = decode_pldm_message_poll_event_data(
2552         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2553         reinterpret_cast<uint8_t*>(eventData.data()), eventData.size() - 1,
2554         &poll_event);
2555     EXPECT_EQ(rc, -EOVERFLOW);
2556 
2557     // Event id is 0x0000
2558     eventData[1] = 0x00;
2559     eventData[2] = 0x00;
2560     rc = decode_pldm_message_poll_event_data(
2561         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2562         reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(),
2563         &poll_event);
2564 
2565     EXPECT_EQ(rc, -EPROTO);
2566 
2567     // Event id is 0xffff
2568     eventData[1] = 0xff;
2569     eventData[2] = 0xff;
2570     rc = decode_pldm_message_poll_event_data(
2571         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2572         reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(),
2573         &poll_event);
2574 
2575     EXPECT_EQ(rc, -EPROTO);
2576 }
2577 
2578 #ifdef LIBPLDM_API_TESTING
2579 TEST(PlatformEventMessage, testGoodPldmMsgPollEventDataEncode)
2580 {
2581     std::array<uint8_t, PLDM_PLATFORM_EVENT_MESSAGE_FORMAT_VERSION +
2582                             PLDM_PLATFORM_EVENT_MESSAGE_EVENT_ID +
2583                             PLDM_PLATFORM_EVENT_MESSAGE_TRANFER_HANDLE>
2584         eventData{};
2585 
2586     struct pldm_message_poll_event poll_event = {};
2587     poll_event.format_version = 0x01;
2588     poll_event.event_id = 0x7788;
2589     poll_event.data_transfer_handle = 0x11223344;
2590 
2591     int rc = encode_pldm_message_poll_event_data(
2592         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2593         &poll_event, reinterpret_cast<uint8_t*>(eventData.data()),
2594         eventData.size());
2595 
2596     EXPECT_EQ(rc, PLDM_SUCCESS);
2597 
2598     struct pldm_msgbuf _buf;
2599     struct pldm_msgbuf* buf = &_buf;
2600 
2601     rc = pldm_msgbuf_init_cc(
2602         buf, PLDM_MSG_POLL_EVENT_LENGTH,
2603         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2604         reinterpret_cast<uint8_t*>(eventData.data()), eventData.size());
2605     EXPECT_EQ(rc, PLDM_SUCCESS);
2606 
2607     uint8_t retFormatVersion;
2608     uint16_t reteventID;
2609     uint32_t retDataTransferHandle;
2610 
2611     EXPECT_EQ(pldm_msgbuf_extract_uint8(buf, retFormatVersion), PLDM_SUCCESS);
2612     EXPECT_EQ(pldm_msgbuf_extract_uint16(buf, reteventID), PLDM_SUCCESS);
2613     EXPECT_EQ(pldm_msgbuf_extract_uint32(buf, retDataTransferHandle),
2614               PLDM_SUCCESS);
2615     EXPECT_EQ(retFormatVersion, poll_event.format_version);
2616     EXPECT_EQ(reteventID, poll_event.event_id);
2617     EXPECT_EQ(retDataTransferHandle, poll_event.data_transfer_handle);
2618     EXPECT_EQ(pldm_msgbuf_destroy_consumed(buf), PLDM_SUCCESS);
2619 }
2620 #endif
2621 
2622 #ifdef LIBPLDM_API_TESTING
2623 TEST(PlatformEventMessage, testBadPldmMsgPollEventDataEncode)
2624 {
2625     std::array<uint8_t, PLDM_PLATFORM_EVENT_MESSAGE_FORMAT_VERSION +
2626                             PLDM_PLATFORM_EVENT_MESSAGE_EVENT_ID +
2627                             PLDM_PLATFORM_EVENT_MESSAGE_TRANFER_HANDLE>
2628         eventData{};
2629 
2630     struct pldm_message_poll_event poll_event = {};
2631     poll_event.format_version = 0x01;
2632     poll_event.event_id = 0x7788;
2633     poll_event.data_transfer_handle = 0x11223344;
2634 
2635     int rc = encode_pldm_message_poll_event_data(&poll_event, NULL,
2636                                                  eventData.size());
2637     EXPECT_EQ(rc, -EINVAL);
2638 
2639     poll_event.event_id = 0x0000;
2640     rc = encode_pldm_message_poll_event_data(
2641         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2642         &poll_event, reinterpret_cast<uint8_t*>(eventData.data()),
2643         eventData.size());
2644     EXPECT_EQ(rc, -EPROTO);
2645 
2646     poll_event.event_id = 0xffff;
2647     rc = encode_pldm_message_poll_event_data(
2648         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2649         &poll_event, reinterpret_cast<uint8_t*>(eventData.data()),
2650         eventData.size());
2651     EXPECT_EQ(rc, -EPROTO);
2652 }
2653 #endif
2654 
2655 TEST(PlatformEventMessage, testGoodSensorOpEventDataDecodeRequest)
2656 {
2657     std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
2658         eventDataArr{};
2659 
2660     struct pldm_sensor_event_sensor_op_state* sensorData =
2661         (struct pldm_sensor_event_sensor_op_state*)eventDataArr.data();
2662     uint8_t presentState = PLDM_SENSOR_ENABLED;
2663     uint8_t previousState = PLDM_SENSOR_INITIALIZING;
2664     sensorData->present_op_state = presentState;
2665     sensorData->previous_op_state = previousState;
2666 
2667     uint8_t retPresentState;
2668     uint8_t retPreviousState;
2669     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2670     auto rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData),
2671                                     eventDataArr.size(), &retPresentState,
2672                                     &retPreviousState);
2673     EXPECT_EQ(rc, PLDM_SUCCESS);
2674     EXPECT_EQ(retPresentState, presentState);
2675     EXPECT_EQ(retPreviousState, previousState);
2676 }
2677 
2678 TEST(PlatformEventMessage, testBadSensorOpEventDataDecodeRequest)
2679 {
2680     uint8_t presentOpState;
2681     uint8_t previousOpState;
2682     size_t sensorDataLength = PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH;
2683     auto rc = decode_sensor_op_data(NULL, sensorDataLength, &presentOpState,
2684                                     &previousOpState);
2685     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2686 
2687     std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
2688         sensorData{};
2689     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2690     rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
2691                                sensorDataLength + 1, &presentOpState,
2692                                &previousOpState);
2693     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2694 
2695     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2696     rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
2697                                sensorDataLength, nullptr, &previousOpState);
2698     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2699 }
2700 
2701 TEST(PlatformEventMessage, testGoodSensorStateEventDataDecodeRequest)
2702 {
2703     std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
2704         eventDataArr{};
2705 
2706     struct pldm_sensor_event_state_sensor_state* sensorData =
2707         (struct pldm_sensor_event_state_sensor_state*)eventDataArr.data();
2708     uint8_t sensorOffset = 0x02;
2709     uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
2710     uint8_t previousEventState = PLDM_SENSOR_INTEST;
2711     sensorData->sensor_offset = sensorOffset;
2712     sensorData->event_state = eventState;
2713     sensorData->previous_event_state = previousEventState;
2714 
2715     uint8_t retSensorOffset;
2716     uint8_t retEventState;
2717     uint8_t retPreviousState;
2718     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2719     auto rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
2720                                        eventDataArr.size(), &retSensorOffset,
2721                                        &retEventState, &retPreviousState);
2722     EXPECT_EQ(rc, PLDM_SUCCESS);
2723     EXPECT_EQ(retSensorOffset, sensorOffset);
2724     EXPECT_EQ(retEventState, eventState);
2725     EXPECT_EQ(retPreviousState, previousEventState);
2726 }
2727 
2728 TEST(PlatformEventMessage, testBadStateSensorEventDataDecodeRequest)
2729 {
2730     uint8_t sensorOffset;
2731     uint8_t eventState;
2732     uint8_t previousEventState;
2733     size_t sensorDataLength = PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH;
2734     auto rc = decode_state_sensor_data(NULL, sensorDataLength, &sensorOffset,
2735                                        &eventState, &previousEventState);
2736     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2737 
2738     std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
2739         sensorData{};
2740     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2741     rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
2742                                   sensorDataLength - 1, &sensorOffset,
2743                                   &eventState, &previousEventState);
2744     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2745 
2746     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2747     rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
2748                                   sensorDataLength, &sensorOffset, nullptr,
2749                                   &previousEventState);
2750     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2751 }
2752 
2753 TEST(PlatformEventMessage, testGoodNumericSensorEventDataDecodeRequest)
2754 {
2755     std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
2756         eventDataArr{};
2757     struct pldm_sensor_event_numeric_sensor_state* sensorData =
2758         (struct pldm_sensor_event_numeric_sensor_state*)eventDataArr.data();
2759 
2760     size_t sensorDataLength =
2761         PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_32BIT_DATA_LENGTH;
2762     uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
2763     uint8_t previousEventState = PLDM_SENSOR_INTEST;
2764     uint8_t sensorDataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
2765     uint32_t presentReading = 305441741;
2766     sensorData->event_state = eventState;
2767     sensorData->previous_event_state = previousEventState;
2768     sensorData->sensor_data_size = sensorDataSize;
2769     {
2770         uint32_t presentReadingLE = htole32(presentReading);
2771         memcpy(&sensorData->present_reading, &presentReadingLE,
2772                sizeof(presentReadingLE));
2773     }
2774 
2775     uint8_t retEventState;
2776     uint8_t retPreviousEventState;
2777     uint8_t retSensorDataSize;
2778     uint32_t retPresentReading;
2779 
2780     auto rc = decode_numeric_sensor_data(
2781         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2782         reinterpret_cast<uint8_t*>(sensorData), sensorDataLength,
2783         &retEventState, &retPreviousEventState, &retSensorDataSize,
2784         &retPresentReading);
2785     EXPECT_EQ(rc, PLDM_SUCCESS);
2786     EXPECT_EQ(retEventState, eventState);
2787     EXPECT_EQ(retPreviousEventState, previousEventState);
2788     EXPECT_EQ(retSensorDataSize, sensorDataSize);
2789     EXPECT_EQ(retPresentReading, presentReading);
2790 
2791     int16_t presentReadingNew = -31432;
2792     {
2793         int16_t presentReadingNewLE = htole16(presentReadingNew);
2794         memcpy(&sensorData->present_reading, &presentReadingNewLE,
2795                sizeof(presentReadingNewLE));
2796     }
2797     sensorDataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
2798     sensorData->sensor_data_size = sensorDataSize;
2799     sensorDataLength = PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_16BIT_DATA_LENGTH;
2800 
2801     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2802     rc = decode_numeric_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
2803                                     sensorDataLength, &retEventState,
2804                                     &retPreviousEventState, &retSensorDataSize,
2805                                     &retPresentReading);
2806     EXPECT_EQ(rc, PLDM_SUCCESS);
2807     EXPECT_EQ(retEventState, eventState);
2808     EXPECT_EQ(retPreviousEventState, previousEventState);
2809     EXPECT_EQ(retSensorDataSize, sensorDataSize);
2810     EXPECT_EQ(static_cast<int16_t>(retPresentReading), presentReadingNew);
2811 }
2812 
2813 TEST(PlatformEventMessage, testBadNumericSensorEventDataDecodeRequest)
2814 {
2815     uint8_t eventState;
2816     uint8_t previousEventState;
2817     uint8_t sensorDataSize;
2818     uint32_t presentReading;
2819     size_t sensorDataLength =
2820         PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH;
2821     auto rc = decode_numeric_sensor_data(NULL, sensorDataLength, &eventState,
2822                                          &previousEventState, &sensorDataSize,
2823                                          &presentReading);
2824     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2825 
2826     std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
2827         sensorData{};
2828     rc = decode_numeric_sensor_data(
2829         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2830         reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength - 1,
2831         &eventState, &previousEventState, &sensorDataSize, &presentReading);
2832     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2833 
2834     struct pldm_sensor_event_numeric_sensor_state* numericSensorData =
2835         (struct pldm_sensor_event_numeric_sensor_state*)sensorData.data();
2836     numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT8;
2837     rc = decode_numeric_sensor_data(
2838         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2839         reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
2840         &eventState, &previousEventState, &sensorDataSize, &presentReading);
2841     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2842 
2843     numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT16;
2844     rc = decode_numeric_sensor_data(
2845         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2846         reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
2847         &eventState, &previousEventState, &sensorDataSize, &presentReading);
2848     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2849 }
2850 
2851 TEST(GetNumericEffecterValue, testGoodEncodeRequest)
2852 {
2853     std::vector<uint8_t> requestMsg(hdrSize +
2854                                     PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES);
2855 
2856     uint16_t effecter_id = 0xab01;
2857 
2858     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2859     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2860 
2861     auto rc = encode_get_numeric_effecter_value_req(0, effecter_id, request);
2862 
2863     struct pldm_get_numeric_effecter_value_req* req =
2864         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2865         reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
2866             request->payload);
2867 
2868     EXPECT_EQ(rc, PLDM_SUCCESS);
2869     EXPECT_EQ(effecter_id, le16toh(req->effecter_id));
2870 }
2871 
2872 TEST(GetNumericEffecterValue, testBadEncodeRequest)
2873 {
2874     std::vector<uint8_t> requestMsg(
2875         hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
2876 
2877     auto rc = encode_get_numeric_effecter_value_req(0, 0, nullptr);
2878     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2879 }
2880 
2881 TEST(GetNumericEffecterValue, testGoodDecodeRequest)
2882 {
2883     std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
2884         requestMsg{};
2885 
2886     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2887     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2888     struct pldm_get_numeric_effecter_value_req* req =
2889         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2890         reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
2891             request->payload);
2892 
2893     uint16_t effecter_id = 0x12ab;
2894     req->effecter_id = htole16(effecter_id);
2895 
2896     uint16_t reteffecter_id;
2897 
2898     auto rc = decode_get_numeric_effecter_value_req(
2899         request, requestMsg.size() - hdrSize, &reteffecter_id);
2900 
2901     EXPECT_EQ(rc, PLDM_SUCCESS);
2902     EXPECT_EQ(effecter_id, reteffecter_id);
2903 }
2904 
2905 TEST(GetNumericEffecterValue, testBadDecodeRequest)
2906 {
2907     std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
2908         requestMsg{};
2909 
2910     auto rc = decode_get_numeric_effecter_value_req(
2911         nullptr, requestMsg.size() - hdrSize, nullptr);
2912 
2913     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2914 
2915     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2916     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2917     struct pldm_set_numeric_effecter_value_req* req =
2918         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2919         reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
2920             request->payload);
2921 
2922     uint16_t effecter_id = 0x1a;
2923     req->effecter_id = htole16(effecter_id);
2924     uint16_t reteffecter_id;
2925 
2926     rc = decode_get_numeric_effecter_value_req(
2927         request, requestMsg.size() - hdrSize - 1, &reteffecter_id);
2928 
2929     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2930 }
2931 
2932 TEST(GetNumericEffecterValue, testGoodEncodeResponse)
2933 {
2934     uint8_t completionCode = 0;
2935     uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
2936     uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
2937     uint32_t pendingValue = 0x12345678;
2938     uint32_t presentValue = 0xabcdef11;
2939     uint32_t val_pending;
2940     uint32_t val_present;
2941 
2942     std::array<uint8_t,
2943                hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
2944         responseMsg{};
2945     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2946     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2947 
2948     auto rc = encode_get_numeric_effecter_value_resp(
2949         0, completionCode, effecter_dataSize, effecter_operState,
2950         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2951         reinterpret_cast<uint8_t*>(&pendingValue),
2952         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2953         reinterpret_cast<uint8_t*>(&presentValue), response,
2954         responseMsg.size() - hdrSize);
2955 
2956     struct pldm_get_numeric_effecter_value_resp* resp =
2957         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2958         reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
2959             response->payload);
2960 
2961     memcpy(&val_pending, &resp->pending_and_present_values[0],
2962            sizeof(val_pending));
2963     val_pending = le32toh(val_pending);
2964     memcpy(&val_present, &resp->pending_and_present_values[4],
2965            sizeof(val_present));
2966     val_present = le32toh(val_present);
2967 
2968     EXPECT_EQ(rc, PLDM_SUCCESS);
2969     EXPECT_EQ(effecter_dataSize, resp->effecter_data_size);
2970     EXPECT_EQ(effecter_operState, resp->effecter_oper_state);
2971     EXPECT_EQ(pendingValue, val_pending);
2972     EXPECT_EQ(presentValue, val_present);
2973 }
2974 
2975 TEST(GetNumericEffecterValue, testBadEncodeResponse)
2976 {
2977     std::array<uint8_t,
2978                hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
2979         responseMsg{};
2980     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2981     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2982 
2983     uint8_t pendingValue = 0x01;
2984     uint8_t presentValue = 0x02;
2985 
2986     auto rc = encode_get_numeric_effecter_value_resp(
2987         0, PLDM_SUCCESS, 0, 0, nullptr, nullptr, nullptr,
2988         responseMsg.size() - hdrSize);
2989     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2990 
2991     rc = encode_get_numeric_effecter_value_resp(
2992         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2993         0, PLDM_SUCCESS, 6, 9, reinterpret_cast<uint8_t*>(&pendingValue),
2994         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
2995         reinterpret_cast<uint8_t*>(&presentValue), response,
2996         responseMsg.size() - hdrSize);
2997     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2998 
2999     uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
3000     uint8_t effecter_operState = EFFECTER_OPER_STATE_FAILED;
3001 
3002     rc = encode_get_numeric_effecter_value_resp(
3003         0, PLDM_SUCCESS, effecter_dataSize, effecter_operState,
3004         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3005         reinterpret_cast<uint8_t*>(&pendingValue),
3006         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3007         reinterpret_cast<uint8_t*>(&presentValue), response,
3008         responseMsg.size() - hdrSize);
3009     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3010 }
3011 
3012 TEST(GetNumericEffecterValue, testGoodDecodeResponse)
3013 {
3014     std::array<uint8_t,
3015                hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
3016         responseMsg{};
3017 
3018     uint8_t completionCode = 0;
3019     uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT16;
3020     uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
3021     uint16_t pendingValue = 0x4321;
3022     uint16_t presentValue = 0xdcba;
3023 
3024     uint8_t retcompletionCode;
3025     uint8_t reteffecter_dataSize;
3026     uint8_t reteffecter_operState;
3027     uint8_t retpendingValue[2];
3028     uint8_t retpresentValue[2];
3029 
3030     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3031     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3032     struct pldm_get_numeric_effecter_value_resp* resp =
3033         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3034         reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
3035             response->payload);
3036 
3037     resp->completion_code = completionCode;
3038     resp->effecter_data_size = effecter_dataSize;
3039     resp->effecter_oper_state = effecter_operState;
3040 
3041     uint16_t pendingValue_le = htole16(pendingValue);
3042     memcpy(resp->pending_and_present_values, &pendingValue_le,
3043            sizeof(pendingValue_le));
3044     uint16_t presentValue_le = htole16(presentValue);
3045     memcpy(&resp->pending_and_present_values[2], &presentValue_le,
3046            sizeof(presentValue_le));
3047 
3048     auto rc = decode_get_numeric_effecter_value_resp(
3049         response, responseMsg.size() - hdrSize, &retcompletionCode,
3050         &reteffecter_dataSize, &reteffecter_operState, retpendingValue,
3051         retpresentValue);
3052 
3053     EXPECT_EQ(rc, PLDM_SUCCESS);
3054     EXPECT_EQ(completionCode, retcompletionCode);
3055     EXPECT_EQ(effecter_dataSize, reteffecter_dataSize);
3056     EXPECT_EQ(effecter_operState, reteffecter_operState);
3057     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3058     EXPECT_EQ(pendingValue, *(reinterpret_cast<uint16_t*>(retpendingValue)));
3059     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3060     EXPECT_EQ(presentValue, *(reinterpret_cast<uint16_t*>(retpresentValue)));
3061 }
3062 
3063 TEST(GetNumericEffecterValue, testBadDecodeResponse)
3064 {
3065     std::array<uint8_t,
3066                hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
3067         responseMsg{};
3068 
3069     auto rc = decode_get_numeric_effecter_value_resp(
3070         nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
3071         nullptr, nullptr);
3072 
3073     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3074 
3075     uint8_t completionCode = 0;
3076     uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_SINT16;
3077     uint8_t effecter_operState = EFFECTER_OPER_STATE_DISABLED;
3078     uint16_t pendingValue = 0x5678;
3079     uint16_t presentValue = 0xcdef;
3080 
3081     uint8_t retcompletionCode;
3082     uint8_t reteffecter_dataSize;
3083     uint8_t reteffecter_operState;
3084     uint8_t retpendingValue[2];
3085     uint8_t retpresentValue[2];
3086 
3087     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3088     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3089     struct pldm_get_numeric_effecter_value_resp* resp =
3090         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3091         reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
3092             response->payload);
3093 
3094     resp->completion_code = completionCode;
3095     resp->effecter_data_size = effecter_dataSize;
3096     resp->effecter_oper_state = effecter_operState;
3097 
3098     uint16_t pendingValue_le = htole16(pendingValue);
3099     memcpy(resp->pending_and_present_values, &pendingValue_le,
3100            sizeof(pendingValue_le));
3101     uint16_t presentValue_le = htole16(presentValue);
3102     memcpy(&resp->pending_and_present_values[2], &presentValue_le,
3103            sizeof(presentValue_le));
3104 
3105     rc = decode_get_numeric_effecter_value_resp(
3106         response, responseMsg.size() - hdrSize, &retcompletionCode,
3107         &reteffecter_dataSize, &reteffecter_operState, retpendingValue,
3108         retpresentValue);
3109 
3110     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3111 }
3112 
3113 TEST(PldmPDRRepositoryChgEventEvent, testGoodDecodeRequest)
3114 {
3115     const uint8_t eventDataFormat = FORMAT_IS_PDR_HANDLES;
3116     const uint8_t numberOfChangeRecords = 2;
3117     uint8_t eventDataOperation1 = PLDM_RECORDS_DELETED;
3118     const uint8_t numberOfChangeEntries1 = 2;
3119     std::array<uint32_t, numberOfChangeEntries1> changeRecordArr1{
3120         {0x00000000, 0x12345678}};
3121     uint8_t eventDataOperation2 = PLDM_RECORDS_ADDED;
3122     const uint8_t numberOfChangeEntries2 = 5;
3123     std::array<uint32_t, numberOfChangeEntries2> changeRecordArr2{
3124         {0x01234567, 0x11223344, 0x45678901, 0x21222324, 0x98765432}};
3125     std::array<uint8_t, PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH +
3126                             PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH *
3127                                 numberOfChangeRecords +
3128                             (numberOfChangeEntries1 + numberOfChangeEntries2) *
3129                                 sizeof(uint32_t)>
3130         eventDataArr{};
3131 
3132     struct pldm_pdr_repository_chg_event_data* eventData =
3133         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3134         reinterpret_cast<struct pldm_pdr_repository_chg_event_data*>(
3135             eventDataArr.data());
3136     eventData->event_data_format = eventDataFormat;
3137     eventData->number_of_change_records = numberOfChangeRecords;
3138     struct pldm_pdr_repository_change_record_data* changeRecord1 =
3139         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3140         reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
3141             eventData->change_records);
3142     changeRecord1->event_data_operation = eventDataOperation1;
3143     changeRecord1->number_of_change_entries = numberOfChangeEntries1;
3144     memcpy(changeRecord1->change_entry, &changeRecordArr1[0],
3145            changeRecordArr1.size() * sizeof(uint32_t));
3146     struct pldm_pdr_repository_change_record_data* changeRecord2 =
3147         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3148         reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
3149             eventData->change_records +
3150             PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH +
3151             (changeRecordArr1.size() * sizeof(uint32_t)));
3152     changeRecord2->event_data_operation = eventDataOperation2;
3153     changeRecord2->number_of_change_entries = numberOfChangeEntries2;
3154     memcpy(changeRecord2->change_entry, &changeRecordArr2[0],
3155            changeRecordArr2.size() * sizeof(uint32_t));
3156 
3157     uint8_t retEventDataFormat{};
3158     uint8_t retNumberOfChangeRecords{};
3159     size_t retChangeRecordDataOffset{0};
3160     auto rc = decode_pldm_pdr_repository_chg_event_data(
3161         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3162         reinterpret_cast<const uint8_t*>(eventData), eventDataArr.size(),
3163         &retEventDataFormat, &retNumberOfChangeRecords,
3164         &retChangeRecordDataOffset);
3165     EXPECT_EQ(rc, PLDM_SUCCESS);
3166     EXPECT_EQ(retEventDataFormat, FORMAT_IS_PDR_HANDLES);
3167     EXPECT_EQ(retNumberOfChangeRecords, numberOfChangeRecords);
3168 
3169     const uint8_t* changeRecordData =
3170         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3171         reinterpret_cast<const uint8_t*>(changeRecord1);
3172     size_t changeRecordDataSize =
3173         eventDataArr.size() - PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH;
3174     uint8_t retEventDataOperation;
3175     uint8_t retNumberOfChangeEntries;
3176     size_t retChangeEntryDataOffset;
3177 
3178     rc = decode_pldm_pdr_repository_change_record_data(
3179         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3180         reinterpret_cast<const uint8_t*>(changeRecordData),
3181         changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
3182         &retChangeEntryDataOffset);
3183     EXPECT_EQ(rc, PLDM_SUCCESS);
3184     EXPECT_EQ(retEventDataOperation, eventDataOperation1);
3185     EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries1);
3186     changeRecordData += retChangeEntryDataOffset;
3187     EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr1[0],
3188                         sizeof(uint32_t) * retNumberOfChangeEntries));
3189 
3190     changeRecordData += sizeof(uint32_t) * retNumberOfChangeEntries;
3191     changeRecordDataSize -= sizeof(uint32_t) * retNumberOfChangeEntries -
3192                             PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH;
3193     rc = decode_pldm_pdr_repository_change_record_data(
3194         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3195         reinterpret_cast<const uint8_t*>(changeRecordData),
3196         changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
3197         &retChangeEntryDataOffset);
3198     EXPECT_EQ(rc, PLDM_SUCCESS);
3199     EXPECT_EQ(retEventDataOperation, eventDataOperation2);
3200     EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries2);
3201     changeRecordData += retChangeEntryDataOffset;
3202     EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr2[0],
3203                         sizeof(uint32_t) * retNumberOfChangeEntries));
3204 }
3205 
3206 TEST(PldmPDRRepositoryChgEventEvent, testBadDecodeRequest)
3207 {
3208     uint8_t eventDataFormat{};
3209     uint8_t numberOfChangeRecords{};
3210     size_t changeRecordDataOffset{};
3211     auto rc = decode_pldm_pdr_repository_chg_event_data(
3212         NULL, 0, &eventDataFormat, &numberOfChangeRecords,
3213         &changeRecordDataOffset);
3214     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3215 
3216     std::array<uint8_t, 2> eventData{};
3217     rc = decode_pldm_pdr_repository_chg_event_data(
3218         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3219         reinterpret_cast<const uint8_t*>(eventData.data()), 0, &eventDataFormat,
3220         &numberOfChangeRecords, &changeRecordDataOffset);
3221     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3222 
3223     uint8_t eventDataOperation{};
3224     uint8_t numberOfChangeEntries{};
3225     size_t changeEntryDataOffset{};
3226     rc = decode_pldm_pdr_repository_change_record_data(
3227         NULL, 0, &eventDataOperation, &numberOfChangeEntries,
3228         &changeEntryDataOffset);
3229     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3230 
3231     std::array<uint8_t, 2> changeRecord{};
3232     rc = decode_pldm_pdr_repository_change_record_data(
3233         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3234         reinterpret_cast<const uint8_t*>(changeRecord.data()), 0,
3235         &eventDataOperation, &numberOfChangeEntries, &changeEntryDataOffset);
3236     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3237 }
3238 
3239 TEST(GetSensorReading, testGoodEncodeRequest)
3240 {
3241     std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
3242         requestMsg{};
3243 
3244     uint16_t sensorId = 0x1234;
3245     bool8_t rearmEventState = 0x01;
3246 
3247     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3248     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
3249     auto rc =
3250         encode_get_sensor_reading_req(0, sensorId, rearmEventState, request);
3251 
3252     struct pldm_get_sensor_reading_req* req =
3253         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3254         reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
3255 
3256     EXPECT_EQ(rc, PLDM_SUCCESS);
3257     EXPECT_EQ(sensorId, le16toh(req->sensor_id));
3258     EXPECT_EQ(rearmEventState, req->rearm_event_state);
3259 }
3260 
3261 TEST(GetSensorReading, testBadEncodeRequest)
3262 {
3263     auto rc = encode_get_sensor_reading_req(0, 0, 0, nullptr);
3264 
3265     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3266 }
3267 
3268 TEST(GetSensorReading, testGoodDecodeRequest)
3269 {
3270     std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
3271         requestMsg{};
3272 
3273     uint16_t sensorId = 0xabcd;
3274     bool8_t rearmEventState = 0xa;
3275 
3276     uint16_t retsensorId;
3277     bool8_t retrearmEventState;
3278 
3279     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3280     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
3281 
3282     struct pldm_get_sensor_reading_req* req =
3283         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3284         reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
3285 
3286     req->sensor_id = htole16(sensorId);
3287     req->rearm_event_state = rearmEventState;
3288 
3289     auto rc =
3290         decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize,
3291                                       &retsensorId, &retrearmEventState);
3292 
3293     EXPECT_EQ(rc, PLDM_SUCCESS);
3294     EXPECT_EQ(sensorId, retsensorId);
3295     EXPECT_EQ(rearmEventState, retrearmEventState);
3296 }
3297 
3298 TEST(GetSensorReading, testBadDecodeRequest)
3299 {
3300     std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
3301         requestMsg{};
3302 
3303     auto rc = decode_get_sensor_reading_req(
3304         nullptr, requestMsg.size() - hdrSize, nullptr, nullptr);
3305     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3306 
3307     uint16_t sensorId = 0xabcd;
3308     bool8_t rearmEventState = 0xa;
3309 
3310     uint16_t retsensorId;
3311     bool8_t retrearmEventState;
3312 
3313     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3314     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
3315 
3316     struct pldm_get_sensor_reading_req* req =
3317         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3318         reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
3319 
3320     req->sensor_id = htole16(sensorId);
3321     req->rearm_event_state = rearmEventState;
3322 
3323     rc = decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize - 1,
3324                                        &retsensorId, &retrearmEventState);
3325 
3326     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3327 }
3328 
3329 TEST(GetSensorReading, testGoodEncodeResponse)
3330 {
3331     std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES>
3332         responseMsg{};
3333 
3334     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3335     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3336 
3337     uint8_t completionCode = 0;
3338     uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
3339     uint8_t sensor_operationalState = PLDM_SENSOR_ENABLED;
3340     uint8_t sensor_event_messageEnable = PLDM_NO_EVENT_GENERATION;
3341     uint8_t presentState = PLDM_SENSOR_NORMAL;
3342     uint8_t previousState = PLDM_SENSOR_WARNING;
3343     uint8_t eventState = PLDM_SENSOR_UPPERWARNING;
3344     uint8_t presentReading = 0x21;
3345 
3346     auto rc = encode_get_sensor_reading_resp(
3347         0, completionCode, sensor_dataSize, sensor_operationalState,
3348         sensor_event_messageEnable, presentState, previousState, eventState,
3349         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3350         reinterpret_cast<uint8_t*>(&presentReading), response,
3351         responseMsg.size() - hdrSize);
3352 
3353     struct pldm_get_sensor_reading_resp* resp =
3354         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3355         reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
3356             response->payload);
3357 
3358     EXPECT_EQ(rc, PLDM_SUCCESS);
3359     EXPECT_EQ(completionCode, resp->completion_code);
3360     EXPECT_EQ(sensor_dataSize, resp->sensor_data_size);
3361     EXPECT_EQ(sensor_operationalState, resp->sensor_operational_state);
3362     EXPECT_EQ(sensor_event_messageEnable, resp->sensor_event_message_enable);
3363     EXPECT_EQ(presentState, resp->present_state);
3364     EXPECT_EQ(previousState, resp->previous_state);
3365     EXPECT_EQ(eventState, resp->event_state);
3366     EXPECT_EQ(presentReading,
3367               // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3368               *(reinterpret_cast<uint8_t*>(&resp->present_reading[0])));
3369 }
3370 
3371 TEST(GetSensorReading, testBadEncodeResponse)
3372 {
3373     std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
3374         responseMsg{};
3375 
3376     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3377     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3378 
3379     uint8_t presentReading = 0x1;
3380 
3381     auto rc = encode_get_sensor_reading_resp(0, PLDM_SUCCESS, 0, 0, 0, 0, 0, 0,
3382                                              nullptr, nullptr,
3383                                              responseMsg.size() - hdrSize);
3384     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3385 
3386     rc = encode_get_sensor_reading_resp(
3387         0, PLDM_SUCCESS, 6, 1, 1, 1, 1, 1,
3388         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3389         reinterpret_cast<uint8_t*>(&presentReading), response,
3390         responseMsg.size() - hdrSize);
3391     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3392 
3393     uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
3394 
3395     rc = encode_get_sensor_reading_resp(
3396         0, PLDM_SUCCESS, sensor_dataSize, 1, 1, 1, 1, 1,
3397         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3398         reinterpret_cast<uint8_t*>(&presentReading), response,
3399         responseMsg.size() - hdrSize);
3400     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3401 }
3402 
3403 TEST(GetSensorReading, testGoodDecodeResponse)
3404 {
3405     std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
3406         responseMsg{};
3407 
3408     uint8_t completionCode = 0;
3409     uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
3410     uint8_t sensor_operationalState = PLDM_SENSOR_STATUSUNKOWN;
3411     uint8_t sensor_event_messageEnable = PLDM_EVENTS_ENABLED;
3412     uint8_t presentState = PLDM_SENSOR_CRITICAL;
3413     uint8_t previousState = PLDM_SENSOR_UPPERCRITICAL;
3414     uint8_t eventState = PLDM_SENSOR_WARNING;
3415     uint32_t presentReading = 0xabcdef11;
3416 
3417     uint8_t retcompletionCode;
3418     uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
3419     uint8_t retsensor_operationalState;
3420     uint8_t retsensor_event_messageEnable;
3421     uint8_t retpresentState;
3422     uint8_t retpreviousState;
3423     uint8_t reteventState;
3424     uint8_t retpresentReading[4];
3425 
3426     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3427     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3428     struct pldm_get_sensor_reading_resp* resp =
3429         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3430         reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
3431             response->payload);
3432 
3433     resp->completion_code = completionCode;
3434     resp->sensor_data_size = sensor_dataSize;
3435     resp->sensor_operational_state = sensor_operationalState;
3436     resp->sensor_event_message_enable = sensor_event_messageEnable;
3437     resp->present_state = presentState;
3438     resp->previous_state = previousState;
3439     resp->event_state = eventState;
3440 
3441     uint32_t presentReading_le = htole32(presentReading);
3442     memcpy(resp->present_reading, &presentReading_le,
3443            sizeof(presentReading_le));
3444 
3445     auto rc = decode_get_sensor_reading_resp(
3446         response, responseMsg.size() - hdrSize, &retcompletionCode,
3447         &retsensor_dataSize, &retsensor_operationalState,
3448         &retsensor_event_messageEnable, &retpresentState, &retpreviousState,
3449         &reteventState, retpresentReading);
3450 
3451     EXPECT_EQ(rc, PLDM_SUCCESS);
3452     EXPECT_EQ(completionCode, retcompletionCode);
3453     EXPECT_EQ(sensor_dataSize, retsensor_dataSize);
3454     EXPECT_EQ(sensor_operationalState, retsensor_operationalState);
3455     EXPECT_EQ(sensor_event_messageEnable, retsensor_event_messageEnable);
3456     EXPECT_EQ(presentState, retpresentState);
3457     EXPECT_EQ(previousState, retpreviousState);
3458     EXPECT_EQ(eventState, reteventState);
3459     EXPECT_EQ(presentReading,
3460               // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3461               *(reinterpret_cast<uint32_t*>(retpresentReading)));
3462 }
3463 
3464 TEST(GetSensorReading, testBadDecodeResponse)
3465 {
3466     std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 1>
3467         responseMsg{};
3468 
3469     auto rc = decode_get_sensor_reading_resp(
3470         nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
3471         nullptr, nullptr, nullptr, nullptr, nullptr);
3472 
3473     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3474 
3475     uint8_t completionCode = 0;
3476     uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
3477     uint8_t sensor_operationalState = PLDM_SENSOR_INTEST;
3478     uint8_t sensor_event_messageEnable = PLDM_EVENTS_DISABLED;
3479     uint8_t presentState = PLDM_SENSOR_FATAL;
3480     uint8_t previousState = PLDM_SENSOR_UPPERFATAL;
3481     uint8_t eventState = PLDM_SENSOR_WARNING;
3482     uint8_t presentReading = 0xa;
3483 
3484     uint8_t retcompletionCode;
3485     uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
3486     uint8_t retsensor_operationalState;
3487     uint8_t retsensor_event_messageEnable;
3488     uint8_t retpresent_state;
3489     uint8_t retprevious_state;
3490     uint8_t retevent_state;
3491     uint8_t retpresentReading;
3492 
3493     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3494     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3495     struct pldm_get_sensor_reading_resp* resp =
3496         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3497         reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
3498             response->payload);
3499 
3500     resp->completion_code = completionCode;
3501     resp->sensor_data_size = sensor_dataSize;
3502     resp->sensor_operational_state = sensor_operationalState;
3503     resp->sensor_event_message_enable = sensor_event_messageEnable;
3504     resp->present_state = presentState;
3505     resp->previous_state = previousState;
3506     resp->event_state = eventState;
3507     resp->present_reading[0] = presentReading;
3508 
3509     rc = decode_get_sensor_reading_resp(
3510         response, responseMsg.size() - hdrSize, &retcompletionCode,
3511         &retsensor_dataSize, &retsensor_operationalState,
3512         &retsensor_event_messageEnable, &retpresent_state, &retprevious_state,
3513         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3514         &retevent_state, reinterpret_cast<uint8_t*>(&retpresentReading));
3515 
3516     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3517 }
3518 
3519 TEST(SetEventReceiver, testGoodEncodeRequest)
3520 {
3521     uint8_t eventMessageGlobalEnable =
3522         PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
3523     uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
3524     uint8_t eventReceiverAddressInfo = 0x08;
3525     uint16_t heartbeatTimer = 0x78;
3526 
3527     std::vector<uint8_t> requestMsg(hdrSize +
3528                                     PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
3529     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3530     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
3531 
3532     auto rc = encode_set_event_receiver_req(
3533         0, eventMessageGlobalEnable, transportProtocolType,
3534         eventReceiverAddressInfo, heartbeatTimer, request);
3535 
3536     EXPECT_EQ(rc, PLDM_SUCCESS);
3537     struct pldm_set_event_receiver_req* req =
3538         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3539         reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
3540     EXPECT_EQ(eventMessageGlobalEnable, req->event_message_global_enable);
3541     EXPECT_EQ(transportProtocolType, req->transport_protocol_type);
3542     EXPECT_EQ(eventReceiverAddressInfo, req->event_receiver_address_info);
3543     EXPECT_EQ(heartbeatTimer, le16toh(req->heartbeat_timer));
3544 }
3545 
3546 TEST(SetEventReceiver, testBadEncodeRequest)
3547 {
3548     uint8_t eventMessageGlobalEnable =
3549         PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
3550     uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
3551     uint8_t eventReceiverAddressInfo = 0x08;
3552     uint16_t heartbeatTimer = 0;
3553 
3554     std::vector<uint8_t> requestMsg(hdrSize +
3555                                     PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
3556     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3557     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
3558 
3559     auto rc = encode_set_event_receiver_req(
3560         0, eventMessageGlobalEnable, transportProtocolType,
3561         eventReceiverAddressInfo, heartbeatTimer, request);
3562 
3563     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3564 }
3565 
3566 TEST(SetEventReceiver, testGoodDecodeResponse)
3567 {
3568     std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
3569         responseMsg{};
3570 
3571     uint8_t retcompletion_code = 0;
3572     responseMsg[hdrSize] = PLDM_SUCCESS;
3573 
3574     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3575     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3576     auto rc = decode_set_event_receiver_resp(
3577         response, responseMsg.size() - sizeof(pldm_msg_hdr),
3578         &retcompletion_code);
3579 
3580     EXPECT_EQ(rc, PLDM_SUCCESS);
3581     EXPECT_EQ(PLDM_SUCCESS, retcompletion_code);
3582 }
3583 
3584 TEST(SetEventReceiver, testBadDecodeResponse)
3585 {
3586     std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
3587         responseMsg{};
3588     uint8_t retcompletion_code = 0;
3589     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3590     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3591 
3592     auto rc = decode_set_event_receiver_resp(
3593         response, responseMsg.size() - sizeof(pldm_msg_hdr), NULL);
3594 
3595     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3596 
3597     rc = decode_set_event_receiver_resp(
3598         nullptr, responseMsg.size() - sizeof(pldm_msg_hdr),
3599         &retcompletion_code);
3600 
3601     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3602 }
3603 
3604 TEST(SetEventReceiver, testGoodEncodeResponse)
3605 {
3606     std::array<uint8_t,
3607                sizeof(pldm_msg_hdr) + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
3608         responseMsg{};
3609     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3610     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
3611     uint8_t completionCode = 0;
3612 
3613     auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, response);
3614 
3615     EXPECT_EQ(rc, PLDM_SUCCESS);
3616     EXPECT_EQ(completionCode, response->payload[0]);
3617 }
3618 
3619 TEST(SetEventReceiver, testBadEncodeResponse)
3620 {
3621     auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, NULL);
3622     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3623 }
3624 
3625 TEST(SetEventReceiver, testGoodDecodeRequest)
3626 {
3627 
3628     std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
3629         requestMsg{};
3630 
3631     uint8_t eventMessageGlobalEnable =
3632         PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
3633     uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
3634     uint8_t eventReceiverAddressInfo = 0x08;
3635     uint16_t heartbeatTimer = 0x78;
3636 
3637     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3638     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
3639     struct pldm_set_event_receiver_req* req =
3640         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3641         reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
3642 
3643     req->event_message_global_enable = eventMessageGlobalEnable;
3644     req->transport_protocol_type = transportProtocolType;
3645     req->event_receiver_address_info = eventReceiverAddressInfo;
3646     req->heartbeat_timer = htole16(heartbeatTimer);
3647 
3648     uint8_t reteventMessageGlobalEnable;
3649     uint8_t rettransportProtocolType;
3650     uint8_t reteventReceiverAddressInfo;
3651     uint16_t retheartbeatTimer;
3652     auto rc = decode_set_event_receiver_req(
3653         request, requestMsg.size() - hdrSize, &reteventMessageGlobalEnable,
3654         &rettransportProtocolType, &reteventReceiverAddressInfo,
3655         &retheartbeatTimer);
3656 
3657     EXPECT_EQ(rc, PLDM_SUCCESS);
3658     EXPECT_EQ(eventMessageGlobalEnable, reteventMessageGlobalEnable);
3659     EXPECT_EQ(transportProtocolType, rettransportProtocolType);
3660     EXPECT_EQ(eventReceiverAddressInfo, reteventReceiverAddressInfo);
3661     EXPECT_EQ(heartbeatTimer, retheartbeatTimer);
3662 }
3663 
3664 TEST(SetEventReceiver, testBadDecodeRequest)
3665 {
3666     std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
3667         requestMsg{};
3668 
3669     auto rc = decode_set_event_receiver_req(NULL, requestMsg.size() - hdrSize,
3670                                             NULL, NULL, NULL, NULL);
3671     EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
3672 
3673     uint8_t eventMessageGlobalEnable =
3674         PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
3675     uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
3676     uint8_t eventReceiverAddressInfo = 0x08;
3677     uint16_t heartbeatTimer = 0x78;
3678 
3679     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3680     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
3681     struct pldm_set_event_receiver_req* req =
3682         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
3683         reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
3684 
3685     req->event_message_global_enable = eventMessageGlobalEnable;
3686     req->transport_protocol_type = transportProtocolType;
3687     req->event_receiver_address_info = eventReceiverAddressInfo;
3688     req->heartbeat_timer = htole16(heartbeatTimer);
3689 
3690     uint8_t reteventMessageGlobalEnable;
3691     uint8_t rettransportProtocolType;
3692     uint8_t reteventReceiverAddressInfo;
3693     uint16_t retheartbeatTimer;
3694     rc = decode_set_event_receiver_req(
3695         request, requestMsg.size() - hdrSize - 1, &reteventMessageGlobalEnable,
3696         &rettransportProtocolType, &reteventReceiverAddressInfo,
3697         &retheartbeatTimer);
3698     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3699 }
3700 
3701 TEST(decodeNumericSensorPdrData, Uint8Test)
3702 {
3703     std::vector<uint8_t> pdr1{
3704         0x1,
3705         0x0,
3706         0x0,
3707         0x0,                     // record handle
3708         0x1,                     // PDRHeaderVersion
3709         PLDM_NUMERIC_SENSOR_PDR, // PDRType
3710         0x0,
3711         0x0, // recordChangeNumber
3712         PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH,
3713         0, // dataLength
3714         0,
3715         0, // PLDMTerminusHandle
3716         0x1,
3717         0x0, // sensorID=1
3718         PLDM_ENTITY_POWER_SUPPLY,
3719         0, // entityType=Power Supply(120)
3720         1,
3721         0, // entityInstanceNumber
3722         1,
3723         0,                           // containerID=1
3724         PLDM_NO_INIT,                // sensorInit
3725         false,                       // sensorAuxiliaryNamesPDR
3726         PLDM_SENSOR_UNIT_DEGRESS_C,  // baseUint(2)=degrees C
3727         0,                           // unitModifier
3728         0,                           // rateUnit
3729         0,                           // baseOEMUnitHandle
3730         0,                           // auxUnit
3731         0,                           // auxUnitModifier
3732         0,                           // auxRateUnit
3733         0,                           // rel
3734         0,                           // auxOEMUnitHandle
3735         true,                        // isLinear
3736         PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize
3737         0,
3738         0,
3739         0xc0,
3740         0x3f, // resolution=1.5
3741         0,
3742         0,
3743         0x80,
3744         0x3f, // offset=1.0
3745         0,
3746         0, // accuracy
3747         0, // plusTolerance
3748         0, // minusTolerance
3749         3, // hysteresis = 3
3750         0, // supportedThresholds
3751         0, // thresholdAndHysteresisVolatility
3752         0,
3753         0,
3754         0x80,
3755         0x3f, // stateTransistionInterval=1.0
3756         0,
3757         0,
3758         0x80,
3759         0x3f,                          // updateInverval=1.0
3760         255,                           // maxReadable
3761         0,                             // minReadable
3762         PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
3763         0,                             // rangeFieldsupport
3764         50,                            // nominalValue = 50
3765         60,                            // normalMax = 60
3766         40,                            // normalMin = 40
3767         70,                            // warningHigh = 70
3768         30,                            // warningLow = 30
3769         80,                            // criticalHigh = 80
3770         20,                            // criticalLow = 20
3771         90,                            // fatalHigh = 90
3772         10                             // fatalLow = 10
3773     };
3774 
3775     struct pldm_numeric_sensor_value_pdr decodedPdr;
3776     auto rc =
3777         decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
3778     EXPECT_EQ(PLDM_SUCCESS, rc);
3779     EXPECT_EQ(1, decodedPdr.hdr.record_handle);
3780     EXPECT_EQ(1, decodedPdr.hdr.version);
3781     EXPECT_EQ(PLDM_NUMERIC_SENSOR_PDR, decodedPdr.hdr.type);
3782     EXPECT_EQ(0, decodedPdr.hdr.record_change_num);
3783     EXPECT_EQ(PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH, decodedPdr.hdr.length);
3784     EXPECT_EQ(1, decodedPdr.sensor_id);
3785     EXPECT_EQ(PLDM_ENTITY_POWER_SUPPLY, decodedPdr.entity_type);
3786     EXPECT_EQ(1, decodedPdr.entity_instance_num);
3787     EXPECT_EQ(1, decodedPdr.container_id);
3788     EXPECT_EQ(PLDM_NO_INIT, decodedPdr.sensor_init);
3789     EXPECT_EQ(false, decodedPdr.sensor_auxiliary_names_pdr);
3790     EXPECT_EQ(PLDM_SENSOR_UNIT_DEGRESS_C, decodedPdr.base_unit);
3791     EXPECT_EQ(0, decodedPdr.unit_modifier);
3792     EXPECT_EQ(0, decodedPdr.rate_unit);
3793     EXPECT_EQ(0, decodedPdr.base_oem_unit_handle);
3794     EXPECT_EQ(0, decodedPdr.aux_unit);
3795     EXPECT_EQ(0, decodedPdr.aux_unit_modifier);
3796     EXPECT_EQ(0, decodedPdr.aux_rate_unit);
3797     EXPECT_EQ(0, decodedPdr.rel);
3798     EXPECT_EQ(0, decodedPdr.aux_oem_unit_handle);
3799     EXPECT_EQ(true, decodedPdr.is_linear);
3800     EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT8, decodedPdr.sensor_data_size);
3801     EXPECT_FLOAT_EQ(1.5f, decodedPdr.resolution);
3802     EXPECT_FLOAT_EQ(1.0f, decodedPdr.offset);
3803     EXPECT_EQ(0, decodedPdr.accuracy);
3804     EXPECT_EQ(0, decodedPdr.plus_tolerance);
3805     EXPECT_EQ(0, decodedPdr.minus_tolerance);
3806     EXPECT_EQ(3, decodedPdr.hysteresis.value_u8);
3807     EXPECT_EQ(0, decodedPdr.supported_thresholds.byte);
3808     EXPECT_EQ(0, decodedPdr.threshold_and_hysteresis_volatility.byte);
3809     EXPECT_FLOAT_EQ(1.0f, decodedPdr.state_transition_interval);
3810     EXPECT_FLOAT_EQ(1.0f, decodedPdr.update_interval);
3811     EXPECT_EQ(255, decodedPdr.max_readable.value_u8);
3812     EXPECT_EQ(0, decodedPdr.min_readable.value_u8);
3813     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT8, decodedPdr.range_field_format);
3814     EXPECT_EQ(0, decodedPdr.range_field_support.byte);
3815     EXPECT_EQ(50, decodedPdr.nominal_value.value_u8);
3816     EXPECT_EQ(60, decodedPdr.normal_max.value_u8);
3817     EXPECT_EQ(40, decodedPdr.normal_min.value_u8);
3818     EXPECT_EQ(70, decodedPdr.warning_high.value_u8);
3819     EXPECT_EQ(30, decodedPdr.warning_low.value_u8);
3820     EXPECT_EQ(80, decodedPdr.critical_high.value_u8);
3821     EXPECT_EQ(20, decodedPdr.critical_low.value_u8);
3822     EXPECT_EQ(90, decodedPdr.fatal_high.value_u8);
3823     EXPECT_EQ(10, decodedPdr.fatal_low.value_u8);
3824 }
3825 
3826 TEST(decodeNumericSensorPdrData, Sint8Test)
3827 {
3828     std::vector<uint8_t> pdr1{
3829         0x1,
3830         0x0,
3831         0x0,
3832         0x0,                     // record handle
3833         0x1,                     // PDRHeaderVersion
3834         PLDM_NUMERIC_SENSOR_PDR, // PDRType
3835         0x0,
3836         0x0, // recordChangeNumber
3837         PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
3838             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH +
3839             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH,
3840         0, // dataLength
3841         0,
3842         0, // PLDMTerminusHandle
3843         0x1,
3844         0x0, // sensorID=1
3845         PLDM_ENTITY_POWER_SUPPLY,
3846         0, // entityType=Power Supply(120)
3847         1,
3848         0, // entityInstanceNumber
3849         0x1,
3850         0x0,                           // containerID=1
3851         PLDM_NO_INIT,                  // sensorInit
3852         false,                         // sensorAuxiliaryNamesPDR
3853         PLDM_SENSOR_UNIT_DEGRESS_C,    // baseUint(2)=degrees C
3854         0,                             // unitModifier
3855         0,                             // rateUnit
3856         0,                             // baseOEMUnitHandle
3857         0,                             // auxUnit
3858         0,                             // auxUnitModifier
3859         0,                             // auxRateUnit
3860         0,                             // rel
3861         0,                             // auxOEMUnitHandle
3862         true,                          // isLinear
3863         PLDM_RANGE_FIELD_FORMAT_SINT8, // sensorDataSize
3864         0,
3865         0,
3866         0,
3867         0, // resolution
3868         0,
3869         0,
3870         0,
3871         0, // offset
3872         0,
3873         0, // accuracy
3874         0, // plusTolerance
3875         0, // minusTolerance
3876         3, // hysteresis = 3
3877         0, // supportedThresholds
3878         0, // thresholdAndHysteresisVolatility
3879         0,
3880         0,
3881         0x80,
3882         0x3f, // stateTransistionInterval=1.0
3883         0,
3884         0,
3885         0x80,
3886         0x3f,                          // updateInverval=1.0
3887         0x64,                          // maxReadable = 100
3888         0x9c,                          // minReadable = -100
3889         PLDM_RANGE_FIELD_FORMAT_SINT8, // rangeFieldFormat
3890         0,                             // rangeFieldsupport
3891         0,                             // nominalValue = 0
3892         5,                             // normalMax = 5
3893         0xfb,                          // normalMin = -5
3894         10,                            // warningHigh = 10
3895         0xf6,                          // warningLow = -10
3896         20,                            // criticalHigh = 20
3897         0xec,                          // criticalLow = -20
3898         30,                            // fatalHigh = 30
3899         0xe2                           // fatalLow = -30
3900     };
3901 
3902     struct pldm_numeric_sensor_value_pdr decodedPdr;
3903     auto rc =
3904         decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
3905     EXPECT_EQ(PLDM_SUCCESS, rc);
3906 
3907     EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT8, decodedPdr.sensor_data_size);
3908     EXPECT_EQ(100, decodedPdr.max_readable.value_s8);
3909     EXPECT_EQ(-100, decodedPdr.min_readable.value_s8);
3910     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT8, decodedPdr.range_field_format);
3911     EXPECT_EQ(0, decodedPdr.nominal_value.value_s8);
3912     EXPECT_EQ(5, decodedPdr.normal_max.value_s8);
3913     EXPECT_EQ(-5, decodedPdr.normal_min.value_s8);
3914     EXPECT_EQ(10, decodedPdr.warning_high.value_s8);
3915     EXPECT_EQ(-10, decodedPdr.warning_low.value_s8);
3916     EXPECT_EQ(20, decodedPdr.critical_high.value_s8);
3917     EXPECT_EQ(-20, decodedPdr.critical_low.value_s8);
3918     EXPECT_EQ(30, decodedPdr.fatal_high.value_s8);
3919     EXPECT_EQ(-30, decodedPdr.fatal_low.value_s8);
3920 }
3921 
3922 TEST(decodeNumericSensorPdrData, Uint16Test)
3923 {
3924     std::vector<uint8_t> pdr1{
3925         0x1,
3926         0x0,
3927         0x0,
3928         0x0,                     // record handle
3929         0x1,                     // PDRHeaderVersion
3930         PLDM_NUMERIC_SENSOR_PDR, // PDRType
3931         0x0,
3932         0x0, // recordChangeNumber
3933         PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
3934             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 2 +
3935             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
3936         0, // dataLength
3937         0,
3938         0, // PLDMTerminusHandle
3939         0x1,
3940         0x0, // sensorID=1
3941         PLDM_ENTITY_POWER_SUPPLY,
3942         0, // entityType=Power Supply(120)
3943         1,
3944         0, // entityInstanceNumber
3945         0x1,
3946         0x0,                          // containerID=1
3947         PLDM_NO_INIT,                 // sensorInit
3948         false,                        // sensorAuxiliaryNamesPDR
3949         PLDM_SENSOR_UNIT_DEGRESS_C,   // baseUint(2)=degrees C
3950         0,                            // unitModifier
3951         0,                            // rateUnit
3952         0,                            // baseOEMUnitHandle
3953         0,                            // auxUnit
3954         0,                            // auxUnitModifier
3955         0,                            // auxRateUnit
3956         0,                            // rel
3957         0,                            // auxOEMUnitHandle
3958         true,                         // isLinear
3959         PLDM_SENSOR_DATA_SIZE_UINT16, // sensorDataSize
3960         0,
3961         0,
3962         0,
3963         0, // resolution
3964         0,
3965         0,
3966         0,
3967         0, // offset
3968         0,
3969         0, // accuracy
3970         0, // plusTolerance
3971         0, // minusTolerance
3972         3,
3973         0, // hysteresis = 3
3974         0, // supportedThresholds
3975         0, // thresholdAndHysteresisVolatility
3976         0,
3977         0,
3978         0x80,
3979         0x3f, // stateTransistionInterval=1.0
3980         0,
3981         0,
3982         0x80,
3983         0x3f, // updateInverval=1.0
3984         0,
3985         0x10, // maxReadable = 4096
3986         0,
3987         0,                              // minReadable = 0
3988         PLDM_RANGE_FIELD_FORMAT_UINT16, // rangeFieldFormat
3989         0,                              // rangeFieldsupport
3990         0x88,
3991         0x13, // nominalValue = 5,000
3992         0x70,
3993         0x17, // normalMax = 6,000
3994         0xa0,
3995         0x0f, // normalMin = 4,000
3996         0x58,
3997         0x1b, // warningHigh = 7,000
3998         0xb8,
3999         0x0b, // warningLow = 3,000
4000         0x40,
4001         0x1f, // criticalHigh = 8,000
4002         0xd0,
4003         0x07, // criticalLow = 2,000
4004         0x28,
4005         0x23, // fatalHigh = 9,000
4006         0xe8,
4007         0x03 // fatalLow = 1,000
4008     };
4009 
4010     struct pldm_numeric_sensor_value_pdr decodedPdr;
4011     auto rc =
4012         decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4013     EXPECT_EQ(PLDM_SUCCESS, rc);
4014 
4015     EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT16, decodedPdr.sensor_data_size);
4016     EXPECT_EQ(4096, decodedPdr.max_readable.value_u16);
4017     EXPECT_EQ(0, decodedPdr.min_readable.value_u16);
4018     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT16, decodedPdr.range_field_format);
4019     EXPECT_EQ(5000, decodedPdr.nominal_value.value_u16);
4020     EXPECT_EQ(6000, decodedPdr.normal_max.value_u16);
4021     EXPECT_EQ(4000, decodedPdr.normal_min.value_u16);
4022     EXPECT_EQ(7000, decodedPdr.warning_high.value_u16);
4023     EXPECT_EQ(3000, decodedPdr.warning_low.value_u16);
4024     EXPECT_EQ(8000, decodedPdr.critical_high.value_u16);
4025     EXPECT_EQ(2000, decodedPdr.critical_low.value_u16);
4026     EXPECT_EQ(9000, decodedPdr.fatal_high.value_u16);
4027     EXPECT_EQ(1000, decodedPdr.fatal_low.value_u16);
4028 }
4029 
4030 TEST(decodeNumericSensorPdrData, Sint16Test)
4031 {
4032     std::vector<uint8_t> pdr1{
4033         0x1,
4034         0x0,
4035         0x0,
4036         0x0,                     // record handle
4037         0x1,                     // PDRHeaderVersion
4038         PLDM_NUMERIC_SENSOR_PDR, // PDRType
4039         0x0,
4040         0x0, // recordChangeNumber
4041         PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
4042             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 2 +
4043             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
4044         0, // dataLength
4045         0,
4046         0, // PLDMTerminusHandle
4047         0x1,
4048         0x0, // sensorID=1
4049         PLDM_ENTITY_POWER_SUPPLY,
4050         0, // entityType=Power Supply(120)
4051         1,
4052         0, // entityInstanceNumber
4053         0x1,
4054         0x0,                          // containerID=1
4055         PLDM_NO_INIT,                 // sensorInit
4056         false,                        // sensorAuxiliaryNamesPDR
4057         PLDM_SENSOR_UNIT_DEGRESS_C,   // baseUint(2)=degrees C
4058         0,                            // unitModifier
4059         0,                            // rateUnit
4060         0,                            // baseOEMUnitHandle
4061         0,                            // auxUnit
4062         0,                            // auxUnitModifier
4063         0,                            // auxRateUnit
4064         0,                            // rel
4065         0,                            // auxOEMUnitHandle
4066         true,                         // isLinear
4067         PLDM_SENSOR_DATA_SIZE_SINT16, // sensorDataSize
4068         0,
4069         0,
4070         0,
4071         0, // resolution
4072         0,
4073         0,
4074         0,
4075         0, // offset
4076         0,
4077         0, // accuracy
4078         0, // plusTolerance
4079         0, // minusTolerance
4080         3,
4081         0, // hysteresis
4082         0, // supportedThresholds
4083         0, // thresholdAndHysteresisVolatility
4084         0,
4085         0,
4086         0x80,
4087         0x3f, // stateTransistionInterval=1.0
4088         0,
4089         0,
4090         0x80,
4091         0x3f, // updateInverval=1.0
4092         0xe8,
4093         0x03, // maxReadable = 1000
4094         0x18,
4095         0xfc,                           // minReadable = -1000
4096         PLDM_RANGE_FIELD_FORMAT_SINT16, // rangeFieldFormat
4097         0,                              // rangeFieldsupport
4098         0,
4099         0, // nominalValue = 0
4100         0xf4,
4101         0x01, // normalMax = 500
4102         0x0c,
4103         0xfe, // normalMin = -500
4104         0xe8,
4105         0x03, // warningHigh = 1,000
4106         0x18,
4107         0xfc, // warningLow = -1,000
4108         0xd0,
4109         0x07, // criticalHigh = 2,000
4110         0x30,
4111         0xf8, // criticalLow = -2,000
4112         0xb8,
4113         0x0b, // fatalHigh = 3,000
4114         0x48,
4115         0xf4 // fatalLow = -3,000
4116     };
4117 
4118     struct pldm_numeric_sensor_value_pdr decodedPdr;
4119     auto rc =
4120         decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4121     EXPECT_EQ(PLDM_SUCCESS, rc);
4122 
4123     EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT16, decodedPdr.sensor_data_size);
4124     EXPECT_EQ(1000, decodedPdr.max_readable.value_s16);
4125     EXPECT_EQ(-1000, decodedPdr.min_readable.value_s16);
4126     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT16, decodedPdr.range_field_format);
4127     EXPECT_EQ(0, decodedPdr.nominal_value.value_s16);
4128     EXPECT_EQ(500, decodedPdr.normal_max.value_s16);
4129     EXPECT_EQ(-500, decodedPdr.normal_min.value_s16);
4130     EXPECT_EQ(1000, decodedPdr.warning_high.value_s16);
4131     EXPECT_EQ(-1000, decodedPdr.warning_low.value_s16);
4132     EXPECT_EQ(2000, decodedPdr.critical_high.value_s16);
4133     EXPECT_EQ(-2000, decodedPdr.critical_low.value_s16);
4134     EXPECT_EQ(3000, decodedPdr.fatal_high.value_s16);
4135     EXPECT_EQ(-3000, decodedPdr.fatal_low.value_s16);
4136 }
4137 
4138 TEST(decodeNumericSensorPdrData, Uint32Test)
4139 {
4140     std::vector<uint8_t> pdr1{
4141         0x1,
4142         0x0,
4143         0x0,
4144         0x0,                     // record handle
4145         0x1,                     // PDRHeaderVersion
4146         PLDM_NUMERIC_SENSOR_PDR, // PDRType
4147         0x0,
4148         0x0, // recordChangeNumber
4149         PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
4150             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
4151             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
4152         0, // dataLength
4153         0,
4154         0, // PLDMTerminusHandle
4155         0x1,
4156         0x0, // sensorID=1
4157         PLDM_ENTITY_POWER_SUPPLY,
4158         0, // entityType=Power Supply(120)
4159         1,
4160         0, // entityInstanceNumber
4161         0x1,
4162         0x0,                          // containerID=1
4163         PLDM_NO_INIT,                 // sensorInit
4164         false,                        // sensorAuxiliaryNamesPDR
4165         PLDM_SENSOR_UNIT_DEGRESS_C,   // baseUint(2)=degrees C
4166         0,                            // unitModifier
4167         0,                            // rateUnit
4168         0,                            // baseOEMUnitHandle
4169         0,                            // auxUnit
4170         0,                            // auxUnitModifier
4171         0,                            // auxRateUnit
4172         0,                            // rel
4173         0,                            // auxOEMUnitHandle
4174         true,                         // isLinear
4175         PLDM_SENSOR_DATA_SIZE_UINT32, // sensorDataSize
4176         0,
4177         0,
4178         0,
4179         0, // resolution
4180         0,
4181         0,
4182         0,
4183         0, // offset
4184         0,
4185         0, // accuracy
4186         0, // plusTolerance
4187         0, // minusTolerance
4188         3,
4189         0,
4190         0,
4191         0, // hysteresis
4192         0, // supportedThresholds
4193         0, // thresholdAndHysteresisVolatility
4194         0,
4195         0,
4196         0x80,
4197         0x3f, // stateTransistionInterval=1.0
4198         0,
4199         0,
4200         0x80,
4201         0x3f, // updateInverval=1.0
4202         0,
4203         0x10,
4204         0,
4205         0, // maxReadable = 4096
4206         0,
4207         0,
4208         0,
4209         0,                              // minReadable = 0
4210         PLDM_RANGE_FIELD_FORMAT_UINT32, // rangeFieldFormat
4211         0,                              // rangeFieldsupport
4212         0x40,
4213         0x4b,
4214         0x4c,
4215         0x00, // nominalValue = 5,000,000
4216         0x80,
4217         0x8d,
4218         0x5b,
4219         0x00, // normalMax = 6,000,000
4220         0x00,
4221         0x09,
4222         0x3d,
4223         0x00, // normalMin = 4,000,000
4224         0xc0,
4225         0xcf,
4226         0x6a,
4227         0x00, // warningHigh = 7,000,000
4228         0xc0,
4229         0xc6,
4230         0x2d,
4231         0x00, // warningLow = 3,000,000
4232         0x00,
4233         0x12,
4234         0x7a,
4235         0x00, // criticalHigh = 8,000,000
4236         0x80,
4237         0x84,
4238         0x1e,
4239         0x00, // criticalLow = 2,000,000
4240         0x40,
4241         0x54,
4242         0x89,
4243         0x00, // fatalHigh = 9,000,000
4244         0x40,
4245         0x42,
4246         0x0f,
4247         0x00 // fatalLow = 1,000,000
4248     };
4249 
4250     struct pldm_numeric_sensor_value_pdr decodedPdr;
4251     auto rc =
4252         decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4253     EXPECT_EQ(PLDM_SUCCESS, rc);
4254 
4255     EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT32, decodedPdr.sensor_data_size);
4256     EXPECT_EQ(4096, decodedPdr.max_readable.value_u32);
4257     EXPECT_EQ(0, decodedPdr.min_readable.value_u32);
4258     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT32, decodedPdr.range_field_format);
4259     EXPECT_EQ(5000000, decodedPdr.nominal_value.value_u32);
4260     EXPECT_EQ(6000000, decodedPdr.normal_max.value_u32);
4261     EXPECT_EQ(4000000, decodedPdr.normal_min.value_u32);
4262     EXPECT_EQ(7000000, decodedPdr.warning_high.value_u32);
4263     EXPECT_EQ(3000000, decodedPdr.warning_low.value_u32);
4264     EXPECT_EQ(8000000, decodedPdr.critical_high.value_u32);
4265     EXPECT_EQ(2000000, decodedPdr.critical_low.value_u32);
4266     EXPECT_EQ(9000000, decodedPdr.fatal_high.value_u32);
4267     EXPECT_EQ(1000000, decodedPdr.fatal_low.value_u32);
4268 }
4269 
4270 TEST(decodeNumericSensorPdrData, Sint32Test)
4271 {
4272     std::vector<uint8_t> pdr1{
4273         0x1,
4274         0x0,
4275         0x0,
4276         0x0,                     // record handle
4277         0x1,                     // PDRHeaderVersion
4278         PLDM_NUMERIC_SENSOR_PDR, // PDRType
4279         0x0,
4280         0x0, // recordChangeNumber
4281         PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
4282             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
4283             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
4284         0, // dataLength
4285         0,
4286         0, // PLDMTerminusHandle
4287         0x1,
4288         0x0, // sensorID=1
4289         PLDM_ENTITY_POWER_SUPPLY,
4290         0, // entityType=Power Supply(120)
4291         1,
4292         0, // entityInstanceNumber
4293         0x1,
4294         0x0,                          // containerID=1
4295         PLDM_NO_INIT,                 // sensorInit
4296         false,                        // sensorAuxiliaryNamesPDR
4297         PLDM_SENSOR_UNIT_DEGRESS_C,   // baseUint(2)=degrees C
4298         0,                            // unitModifier
4299         0,                            // rateUnit
4300         0,                            // baseOEMUnitHandle
4301         0,                            // auxUnit
4302         0,                            // auxUnitModifier
4303         0,                            // auxRateUnit
4304         0,                            // rel
4305         0,                            // auxOEMUnitHandle
4306         true,                         // isLinear
4307         PLDM_SENSOR_DATA_SIZE_SINT32, // sensorDataSize
4308         0,
4309         0,
4310         0,
4311         0, // resolution
4312         0,
4313         0,
4314         0,
4315         0, // offset
4316         0,
4317         0, // accuracy
4318         0, // plusTolerance
4319         0, // minusTolerance
4320         3,
4321         0,
4322         0,
4323         0, // hysteresis
4324         0, // supportedThresholds
4325         0, // thresholdAndHysteresisVolatility
4326         0,
4327         0,
4328         0x80,
4329         0x3f, // stateTransistionInterval=1.0
4330         0,
4331         0,
4332         0x80,
4333         0x3f, // updateInverval=1.0
4334         0xa0,
4335         0x86,
4336         0x01,
4337         0x00, // maxReadable = 100000
4338         0x60,
4339         0x79,
4340         0xfe,
4341         0xff,                           // minReadable = -10000
4342         PLDM_RANGE_FIELD_FORMAT_SINT32, // rangeFieldFormat
4343         0,                              // rangeFieldsupport
4344         0,
4345         0,
4346         0,
4347         0, // nominalValue = 0
4348         0x20,
4349         0xa1,
4350         0x07,
4351         0x00, // normalMax = 500,000
4352         0xe0,
4353         0x5e,
4354         0xf8,
4355         0xff, // normalMin = -500,000
4356         0x40,
4357         0x42,
4358         0x0f,
4359         0x00, // warningHigh = 1,000,000
4360         0xc0,
4361         0xbd,
4362         0xf0,
4363         0xff, // warningLow = -1,000,000
4364         0x80,
4365         0x84,
4366         0x1e,
4367         0x00, // criticalHigh = 2,000,000
4368         0x80,
4369         0x7b,
4370         0xe1,
4371         0xff, // criticalLow = -2,000,000
4372         0xc0,
4373         0xc6,
4374         0x2d,
4375         0x00, // fatalHigh = 3,000,000
4376         0x40,
4377         0x39,
4378         0xd2,
4379         0xff // fatalLow = -3,000,000
4380     };
4381 
4382     struct pldm_numeric_sensor_value_pdr decodedPdr;
4383     auto rc =
4384         decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4385     EXPECT_EQ(PLDM_SUCCESS, rc);
4386 
4387     EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT32, decodedPdr.sensor_data_size);
4388     EXPECT_EQ(100000, decodedPdr.max_readable.value_s32);
4389     EXPECT_EQ(-100000, decodedPdr.min_readable.value_s32);
4390     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT32, decodedPdr.range_field_format);
4391     EXPECT_EQ(0, decodedPdr.nominal_value.value_s32);
4392     EXPECT_EQ(500000, decodedPdr.normal_max.value_s32);
4393     EXPECT_EQ(-500000, decodedPdr.normal_min.value_s32);
4394     EXPECT_EQ(1000000, decodedPdr.warning_high.value_s32);
4395     EXPECT_EQ(-1000000, decodedPdr.warning_low.value_s32);
4396     EXPECT_EQ(2000000, decodedPdr.critical_high.value_s32);
4397     EXPECT_EQ(-2000000, decodedPdr.critical_low.value_s32);
4398     EXPECT_EQ(3000000, decodedPdr.fatal_high.value_s32);
4399     EXPECT_EQ(-3000000, decodedPdr.fatal_low.value_s32);
4400 }
4401 
4402 TEST(decodeNumericSensorPdrData, Real32Test)
4403 {
4404     std::vector<uint8_t> pdr1{
4405         0x1,
4406         0x0,
4407         0x0,
4408         0x0,                     // record handle
4409         0x1,                     // PDRHeaderVersion
4410         PLDM_NUMERIC_SENSOR_PDR, // PDRType
4411         0x0,
4412         0x0, // recordChangeNumber
4413         PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
4414             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
4415             PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
4416         0, // dataLength
4417         0,
4418         0, // PLDMTerminusHandle
4419         0x1,
4420         0x0, // sensorID=1
4421         PLDM_ENTITY_POWER_SUPPLY,
4422         0, // entityType=Power Supply(120)
4423         1,
4424         0, // entityInstanceNumber
4425         0x1,
4426         0x0,                          // containerID=1
4427         PLDM_NO_INIT,                 // sensorInit
4428         false,                        // sensorAuxiliaryNamesPDR
4429         PLDM_SENSOR_UNIT_DEGRESS_C,   // baseUint(2)=degrees C
4430         0,                            // unitModifier
4431         0,                            // rateUnit
4432         0,                            // baseOEMUnitHandle
4433         0,                            // auxUnit
4434         0,                            // auxUnitModifier
4435         0,                            // auxRateUnit
4436         0,                            // rel
4437         0,                            // auxOEMUnitHandle
4438         true,                         // isLinear
4439         PLDM_SENSOR_DATA_SIZE_SINT32, // sensorDataSize
4440         0,
4441         0,
4442         0,
4443         0, // resolution
4444         0,
4445         0,
4446         0,
4447         0, // offset
4448         0,
4449         0, // accuracy
4450         0, // plusTolerance
4451         0, // minusTolerance
4452         3,
4453         0,
4454         0,
4455         0, // hysteresis
4456         0, // supportedThresholds
4457         0, // thresholdAndHysteresisVolatility
4458         0,
4459         0,
4460         0x80,
4461         0x3f, // stateTransistionInterval=1.0
4462         0,
4463         0,
4464         0x80,
4465         0x3f, // updateInverval=1.0
4466         0xa0,
4467         0x86,
4468         0x01,
4469         0x00, // maxReadable = 100000
4470         0x60,
4471         0x79,
4472         0xfe,
4473         0xff,                           // minReadable = -10000
4474         PLDM_RANGE_FIELD_FORMAT_REAL32, // rangeFieldFormat
4475         0,                              // rangeFieldsupport
4476         0,
4477         0,
4478         0,
4479         0, // nominalValue = 0.0
4480         0x33,
4481         0x33,
4482         0x48,
4483         0x42, // normalMax = 50.05
4484         0x33,
4485         0x33,
4486         0x48,
4487         0xc2, // normalMin = -50.05
4488         0x83,
4489         0x00,
4490         0xc8,
4491         0x42, // warningHigh = 100.001
4492         0x83,
4493         0x00,
4494         0xc8,
4495         0xc2, // warningLow = -100.001
4496         0x83,
4497         0x00,
4498         0x48,
4499         0x43, // criticalHigh = 200.002
4500         0x83,
4501         0x00,
4502         0x48,
4503         0xc3, // criticalLow = -200.002
4504         0x62,
4505         0x00,
4506         0x96,
4507         0x43, // fatalHigh = 300.003
4508         0x62,
4509         0x00,
4510         0x96,
4511         0xc3 // fatalLow = -300.003
4512     };
4513 
4514     struct pldm_numeric_sensor_value_pdr decodedPdr;
4515     auto rc =
4516         decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4517     EXPECT_EQ(PLDM_SUCCESS, rc);
4518 
4519     EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT32, decodedPdr.sensor_data_size);
4520     EXPECT_EQ(100000, decodedPdr.max_readable.value_s32);
4521     EXPECT_EQ(-100000, decodedPdr.min_readable.value_s32);
4522     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_REAL32, decodedPdr.range_field_format);
4523     EXPECT_FLOAT_EQ(0, decodedPdr.nominal_value.value_f32);
4524     EXPECT_FLOAT_EQ(50.05f, decodedPdr.normal_max.value_f32);
4525     EXPECT_FLOAT_EQ(-50.05f, decodedPdr.normal_min.value_f32);
4526     EXPECT_FLOAT_EQ(100.001f, decodedPdr.warning_high.value_f32);
4527     EXPECT_FLOAT_EQ(-100.001f, decodedPdr.warning_low.value_f32);
4528     EXPECT_FLOAT_EQ(200.002f, decodedPdr.critical_high.value_f32);
4529     EXPECT_FLOAT_EQ(-200.002f, decodedPdr.critical_low.value_f32);
4530     EXPECT_FLOAT_EQ(300.003f, decodedPdr.fatal_high.value_f32);
4531     EXPECT_FLOAT_EQ(-300.003f, decodedPdr.fatal_low.value_f32);
4532 }
4533 
4534 TEST(decodeNumericSensorPdrDataDeathTest, InvalidSizeTest)
4535 {
4536     // A corrupted PDR. The data after plusTolerance missed.
4537     std::vector<uint8_t> pdr1{
4538         0x1,
4539         0x0,
4540         0x0,
4541         0x0,                     // record handle
4542         0x1,                     // PDRHeaderVersion
4543         PLDM_NUMERIC_SENSOR_PDR, // PDRType
4544         0x0,
4545         0x0, // recordChangeNumber
4546         PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH,
4547         0, // dataLength
4548         0,
4549         0, // PLDMTerminusHandle
4550         0x1,
4551         0x0, // sensorID=1
4552         PLDM_ENTITY_POWER_SUPPLY,
4553         0, // entityType=Power Supply(120)
4554         1,
4555         0, // entityInstanceNumber
4556         0x1,
4557         0x0,                         // containerID=1
4558         PLDM_NO_INIT,                // sensorInit
4559         false,                       // sensorAuxiliaryNamesPDR
4560         2,                           // baseUint(2)=degrees C
4561         0,                           // unitModifier
4562         0,                           // rateUnit
4563         0,                           // baseOEMUnitHandle
4564         0,                           // auxUnit
4565         0,                           // auxUnitModifier
4566         0,                           // auxRateUnit
4567         0,                           // rel
4568         0,                           // auxOEMUnitHandle
4569         true,                        // isLinear
4570         PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize
4571         0,
4572         0,
4573         0,
4574         0, // resolution
4575         0,
4576         0,
4577         0,
4578         0, // offset
4579         0,
4580         0, // accuracy
4581         0  // plusTolerance
4582     };
4583 
4584     struct pldm_numeric_sensor_value_pdr decodedPdr;
4585     int rc =
4586         decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4587     EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
4588 }
4589 
4590 #ifdef LIBPLDM_API_TESTING
4591 TEST(decodeNumericEffecterPdrData, Uint8Test)
4592 {
4593     std::vector<uint8_t> pdr1{
4594         0x1,
4595         0x0,
4596         0x0,
4597         0x0,                       // record handle
4598         0x1,                       // PDRHeaderVersion
4599         PLDM_NUMERIC_EFFECTER_PDR, // PDRType
4600         0x0,
4601         0x0, // recordChangeNumber
4602         PLDM_PDR_NUMERIC_EFFECTER_PDR_MIN_LENGTH,
4603         0, // dataLength
4604         0,
4605         0, // PLDMTerminusHandle
4606         0x1,
4607         0x0, // effecterID=1
4608         PLDM_ENTITY_POWER_SUPPLY,
4609         0, // entityType=Power Supply(120)
4610         1,
4611         0, // entityInstanceNumber
4612         1,
4613         0, // containerID=1
4614         0x2,
4615         0x0,                           // effecter_semantic_id=2
4616         PLDM_NO_INIT,                  // effecterInit
4617         false,                         // effecterAuxiliaryNames
4618         PLDM_SENSOR_UNIT_DEGRESS_C,    // baseUint(2)=degrees C
4619         0,                             // unitModifier
4620         0,                             // rateUnit
4621         0,                             // baseOEMUnitHandle
4622         0,                             // auxUnit
4623         0,                             // auxUnitModifier
4624         4,                             // auxRateUnit
4625         0,                             // auxOEMUnitHandle
4626         true,                          // isLinear
4627         PLDM_EFFECTER_DATA_SIZE_UINT8, // effecterDataSize
4628         0,
4629         0,
4630         0xc0,
4631         0x3f, // resolution=1.5
4632         0,
4633         0,
4634         0x80,
4635         0x3f, // offset=1.0
4636         0,
4637         0, // accuracy
4638         0, // plusTolerance
4639         0, // minusTolerance
4640         0,
4641         0,
4642         0x80,
4643         0x3f, // stateTransistionInterval=1.0
4644         0,
4645         0,
4646         0x80,
4647         0x3f,                          // transition_interval=1.0
4648         255,                           // maxSetdable
4649         0,                             // minSetable
4650         PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
4651         0x1f,                          // rangeFieldsupport
4652         50,                            // nominalValue = 50
4653         60,                            // normalMax = 60
4654         40,                            // normalMin = 40
4655         90,                            // rated_max = 90
4656         10                             // rated_min = 10
4657     };
4658 
4659     struct pldm_numeric_effecter_value_pdr decodedPdr;
4660     auto rc =
4661         decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4662     EXPECT_EQ(PLDM_SUCCESS, rc);
4663     EXPECT_EQ(1, decodedPdr.hdr.record_handle);
4664     EXPECT_EQ(1, decodedPdr.hdr.version);
4665     EXPECT_EQ(PLDM_NUMERIC_EFFECTER_PDR, decodedPdr.hdr.type);
4666     EXPECT_EQ(0, decodedPdr.hdr.record_change_num);
4667     EXPECT_EQ(PLDM_PDR_NUMERIC_EFFECTER_PDR_MIN_LENGTH, decodedPdr.hdr.length);
4668     EXPECT_EQ(1, decodedPdr.effecter_id);
4669     EXPECT_EQ(PLDM_ENTITY_POWER_SUPPLY, decodedPdr.entity_type);
4670     EXPECT_EQ(1, decodedPdr.entity_instance);
4671     EXPECT_EQ(1, decodedPdr.container_id);
4672     EXPECT_EQ(2, decodedPdr.effecter_semantic_id);
4673     EXPECT_EQ(PLDM_NO_INIT, decodedPdr.effecter_init);
4674     EXPECT_EQ(false, decodedPdr.effecter_auxiliary_names);
4675     EXPECT_EQ(PLDM_SENSOR_UNIT_DEGRESS_C, decodedPdr.base_unit);
4676     EXPECT_EQ(0, decodedPdr.unit_modifier);
4677     EXPECT_EQ(0, decodedPdr.rate_unit);
4678     EXPECT_EQ(0, decodedPdr.base_oem_unit_handle);
4679     EXPECT_EQ(0, decodedPdr.aux_unit);
4680     EXPECT_EQ(0, decodedPdr.aux_unit_modifier);
4681     EXPECT_EQ(4, decodedPdr.aux_rate_unit);
4682     EXPECT_EQ(0, decodedPdr.aux_oem_unit_handle);
4683     EXPECT_EQ(true, decodedPdr.is_linear);
4684     EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_UINT8, decodedPdr.effecter_data_size);
4685     EXPECT_FLOAT_EQ(1.5f, decodedPdr.resolution);
4686     EXPECT_FLOAT_EQ(1.0f, decodedPdr.offset);
4687     EXPECT_EQ(0, decodedPdr.accuracy);
4688     EXPECT_EQ(0, decodedPdr.plus_tolerance);
4689     EXPECT_EQ(0, decodedPdr.minus_tolerance);
4690     EXPECT_FLOAT_EQ(1.0f, decodedPdr.state_transition_interval);
4691     EXPECT_FLOAT_EQ(1.0f, decodedPdr.transition_interval);
4692     EXPECT_EQ(255, decodedPdr.max_settable.value_u8);
4693     EXPECT_EQ(0, decodedPdr.min_settable.value_u8);
4694     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT8, decodedPdr.range_field_format);
4695     EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
4696     EXPECT_EQ(50, decodedPdr.nominal_value.value_u8);
4697     EXPECT_EQ(60, decodedPdr.normal_max.value_u8);
4698     EXPECT_EQ(40, decodedPdr.normal_min.value_u8);
4699     EXPECT_EQ(90, decodedPdr.rated_max.value_u8);
4700     EXPECT_EQ(10, decodedPdr.rated_min.value_u8);
4701 }
4702 #endif
4703 
4704 #ifdef LIBPLDM_API_TESTING
4705 TEST(decodeNumericEffecterPdrData, Sint8Test)
4706 {
4707     std::vector<uint8_t> pdr1{
4708         0x1,
4709         0x0,
4710         0x0,
4711         0x0,                       // record handle
4712         0x1,                       // PDRHeaderVersion
4713         PLDM_NUMERIC_EFFECTER_PDR, // PDRType
4714         0x0,
4715         0x0, // recordChangeNumber
4716         PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
4717             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH +
4718             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH,
4719         0, // dataLength
4720         0,
4721         0, // PLDMTerminusHandle
4722         0x1,
4723         0x0, // effecterID=1
4724         PLDM_ENTITY_POWER_SUPPLY,
4725         0, // entityType=Power Supply(120)
4726         1,
4727         0, // entityInstanceNumber
4728         0x1,
4729         0x0, // containerID=1
4730         0x2,
4731         0x0,                           // effecter_semantic_id=2
4732         PLDM_NO_INIT,                  // effecterInit
4733         false,                         // effecterAuxiliaryNames
4734         PLDM_SENSOR_UNIT_DEGRESS_C,    // baseUint(2)=degrees C
4735         0,                             // unitModifier
4736         0,                             // rateUnit
4737         0,                             // baseOEMUnitHandle
4738         0,                             // auxUnit
4739         0,                             // auxUnitModifier
4740         0,                             // auxRateUnit
4741         0,                             // auxOEMUnitHandle
4742         true,                          // isLinear
4743         PLDM_RANGE_FIELD_FORMAT_SINT8, // effecterDataSize
4744         0,
4745         0,
4746         0,
4747         0, // resolution
4748         0,
4749         0,
4750         0,
4751         0, // offset
4752         0,
4753         0, // accuracy
4754         0, // plusTolerance
4755         0, // minusTolerance
4756         0,
4757         0,
4758         0x80,
4759         0x3f, // stateTransistionInterval=1.0
4760         0,
4761         0,
4762         0x80,
4763         0x3f,                          // transition_interval=1.0
4764         0x64,                          // maxSetdable = 100
4765         0x9c,                          // minSetable = -100
4766         PLDM_RANGE_FIELD_FORMAT_SINT8, // rangeFieldFormat
4767         0x1f,                          // rangeFieldsupport
4768         0,                             // nominalValue = 0
4769         5,                             // normalMax = 5
4770         0xfb,                          // normalMin = -5
4771         30,                            // rated_max = 30
4772         0xe2                           // rated_min = -30
4773     };
4774 
4775     struct pldm_numeric_effecter_value_pdr decodedPdr;
4776     auto rc =
4777         decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4778     EXPECT_EQ(PLDM_SUCCESS, rc);
4779 
4780     EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_SINT8, decodedPdr.effecter_data_size);
4781     EXPECT_EQ(100, decodedPdr.max_settable.value_s8);
4782     EXPECT_EQ(-100, decodedPdr.min_settable.value_s8);
4783     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT8, decodedPdr.range_field_format);
4784     EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
4785     EXPECT_EQ(0, decodedPdr.nominal_value.value_s8);
4786     EXPECT_EQ(5, decodedPdr.normal_max.value_s8);
4787     EXPECT_EQ(-5, decodedPdr.normal_min.value_s8);
4788     EXPECT_EQ(30, decodedPdr.rated_max.value_s8);
4789     EXPECT_EQ(-30, decodedPdr.rated_min.value_s8);
4790 }
4791 #endif
4792 
4793 #ifdef LIBPLDM_API_TESTING
4794 TEST(decodeNumericEffecterPdrData, Uint16Test)
4795 {
4796     std::vector<uint8_t> pdr1{
4797         0x1,
4798         0x0,
4799         0x0,
4800         0x0,                       // record handle
4801         0x1,                       // PDRHeaderVersion
4802         PLDM_NUMERIC_EFFECTER_PDR, // PDRType
4803         0x0,
4804         0x0, // recordChangeNumber
4805         PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
4806             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH *
4807                 2 +
4808             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
4809         0, // dataLength
4810         0,
4811         0, // PLDMTerminusHandle
4812         0x1,
4813         0x0, // effecterID=1
4814         PLDM_ENTITY_POWER_SUPPLY,
4815         0, // entityType=Power Supply(120)
4816         1,
4817         0, // entityInstanceNumber
4818         0x1,
4819         0x0, // containerID=1
4820         0x2,
4821         0x0,                            // effecter_semantic_id=2
4822         PLDM_NO_INIT,                   // effecterInit
4823         false,                          // effecterAuxiliaryNames
4824         PLDM_SENSOR_UNIT_DEGRESS_C,     // baseUint(2)=degrees C
4825         0,                              // unitModifier
4826         0,                              // rateUnit
4827         0,                              // baseOEMUnitHandle
4828         0,                              // auxUnit
4829         0,                              // auxUnitModifier
4830         0,                              // auxRateUnit
4831         0,                              // auxOEMUnitHandle
4832         true,                           // isLinear
4833         PLDM_EFFECTER_DATA_SIZE_UINT16, // effecterDataSize
4834         0,
4835         0,
4836         0,
4837         0, // resolution
4838         0,
4839         0,
4840         0,
4841         0, // offset
4842         0,
4843         0, // accuracy
4844         0, // plusTolerance
4845         0, // minusTolerance
4846         0,
4847         0,
4848         0x80,
4849         0x3f, // stateTransistionInterval=1.0
4850         0,
4851         0,
4852         0x80,
4853         0x3f, // transition_interval=1.0
4854         0,
4855         0x10, // maxSetdable = 4096
4856         0,
4857         0,                              // minSetable = 0
4858         PLDM_RANGE_FIELD_FORMAT_UINT16, // rangeFieldFormat
4859         0x1f,                           // rangeFieldsupport
4860         0x88,
4861         0x13, // nominalValue = 5,000
4862         0x70,
4863         0x17, // normalMax = 6,000
4864         0xa0,
4865         0x0f, // normalMin = 4,000
4866         0x28,
4867         0x23, // rated_max = 9,000
4868         0xe8,
4869         0x03 // rated_min = 1,000
4870     };
4871 
4872     struct pldm_numeric_effecter_value_pdr decodedPdr;
4873     auto rc =
4874         decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4875     EXPECT_EQ(PLDM_SUCCESS, rc);
4876 
4877     EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_UINT16, decodedPdr.effecter_data_size);
4878     EXPECT_EQ(4096, decodedPdr.max_settable.value_u16);
4879     EXPECT_EQ(0, decodedPdr.min_settable.value_u16);
4880     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT16, decodedPdr.range_field_format);
4881     EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
4882     EXPECT_EQ(5000, decodedPdr.nominal_value.value_u16);
4883     EXPECT_EQ(6000, decodedPdr.normal_max.value_u16);
4884     EXPECT_EQ(4000, decodedPdr.normal_min.value_u16);
4885     EXPECT_EQ(9000, decodedPdr.rated_max.value_u16);
4886     EXPECT_EQ(1000, decodedPdr.rated_min.value_u16);
4887 }
4888 #endif
4889 
4890 #ifdef LIBPLDM_API_TESTING
4891 TEST(decodeNumericEffecterPdrData, Sint16Test)
4892 {
4893     std::vector<uint8_t> pdr1{
4894         0x1,
4895         0x0,
4896         0x0,
4897         0x0,                       // record handle
4898         0x1,                       // PDRHeaderVersion
4899         PLDM_NUMERIC_EFFECTER_PDR, // PDRType
4900         0x0,
4901         0x0, // recordChangeNumber
4902         PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
4903             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH *
4904                 2 +
4905             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
4906         0, // dataLength
4907         0,
4908         0, // PLDMTerminusHandle
4909         0x1,
4910         0x0, // effecterID=1
4911         PLDM_ENTITY_POWER_SUPPLY,
4912         0, // entityType=Power Supply(120)
4913         1,
4914         0, // entityInstanceNumber
4915         0x1,
4916         0x0, // containerID=1
4917         0x2,
4918         0x0,                            // effecter_semantic_id=2
4919         PLDM_NO_INIT,                   // effecterInit
4920         false,                          // effecterAuxiliaryNames
4921         PLDM_SENSOR_UNIT_DEGRESS_C,     // baseUint(2)=degrees C
4922         0,                              // unitModifier
4923         0,                              // rateUnit
4924         0,                              // baseOEMUnitHandle
4925         0,                              // auxUnit
4926         0,                              // auxUnitModifier
4927         0,                              // auxRateUnit
4928         0,                              // auxOEMUnitHandle
4929         true,                           // isLinear
4930         PLDM_EFFECTER_DATA_SIZE_SINT16, // effecterDataSize
4931         0,
4932         0,
4933         0,
4934         0, // resolution
4935         0,
4936         0,
4937         0,
4938         0, // offset
4939         0,
4940         0, // accuracy
4941         0, // plusTolerance
4942         0, // minusTolerance
4943         0,
4944         0,
4945         0x80,
4946         0x3f, // stateTransistionInterval=1.0
4947         0,
4948         0,
4949         0x80,
4950         0x3f, // transition_interval=1.0
4951         0xe8,
4952         0x03, // maxSetdable = 1000
4953         0x18,
4954         0xfc,                           // minSetable = -1000
4955         PLDM_RANGE_FIELD_FORMAT_SINT16, // rangeFieldFormat
4956         0x1f,                           // rangeFieldsupport
4957         0,
4958         0, // nominalValue = 0
4959         0xf4,
4960         0x01, // normalMax = 500
4961         0x0c,
4962         0xfe, // normalMin = -500
4963         0xb8,
4964         0x0b, // rated_max = 3,000
4965         0x48,
4966         0xf4 // rated_min = -3,000
4967     };
4968 
4969     struct pldm_numeric_effecter_value_pdr decodedPdr;
4970     auto rc =
4971         decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
4972     EXPECT_EQ(PLDM_SUCCESS, rc);
4973 
4974     EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_SINT16, decodedPdr.effecter_data_size);
4975     EXPECT_EQ(1000, decodedPdr.max_settable.value_s16);
4976     EXPECT_EQ(-1000, decodedPdr.min_settable.value_s16);
4977     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT16, decodedPdr.range_field_format);
4978     EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
4979     EXPECT_EQ(0, decodedPdr.nominal_value.value_s16);
4980     EXPECT_EQ(500, decodedPdr.normal_max.value_s16);
4981     EXPECT_EQ(-500, decodedPdr.normal_min.value_s16);
4982     EXPECT_EQ(3000, decodedPdr.rated_max.value_s16);
4983     EXPECT_EQ(-3000, decodedPdr.rated_min.value_s16);
4984 }
4985 #endif
4986 
4987 #ifdef LIBPLDM_API_TESTING
4988 TEST(decodeNumericEffecterPdrData, Uint32Test)
4989 {
4990     std::vector<uint8_t> pdr1{
4991         0x1,
4992         0x0,
4993         0x0,
4994         0x0,                       // record handle
4995         0x1,                       // PDRHeaderVersion
4996         PLDM_NUMERIC_EFFECTER_PDR, // PDRType
4997         0x0,
4998         0x0, // recordChangeNumber
4999         PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
5000             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH *
5001                 4 +
5002             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
5003         0, // dataLength
5004         0,
5005         0, // PLDMTerminusHandle
5006         0x1,
5007         0x0, // effecterID=1
5008         PLDM_ENTITY_POWER_SUPPLY,
5009         0, // entityType=Power Supply(120)
5010         1,
5011         0, // entityInstanceNumber
5012         0x1,
5013         0x0, // containerID=1
5014         0x2,
5015         0x0,                            // effecter_semantic_id=2
5016         PLDM_NO_INIT,                   // effecterInit
5017         false,                          // effecterAuxiliaryNames
5018         PLDM_SENSOR_UNIT_DEGRESS_C,     // baseUint(2)=degrees C
5019         0,                              // unitModifier
5020         0,                              // rateUnit
5021         0,                              // baseOEMUnitHandle
5022         0,                              // auxUnit
5023         0,                              // auxUnitModifier
5024         0,                              // auxRateUnit
5025         0,                              // auxOEMUnitHandle
5026         true,                           // isLinear
5027         PLDM_EFFECTER_DATA_SIZE_UINT32, // effecterDataSize
5028         0,
5029         0,
5030         0,
5031         0, // resolution
5032         0,
5033         0,
5034         0,
5035         0, // offset
5036         0,
5037         0, // accuracy
5038         0, // plusTolerance
5039         0, // minusTolerance
5040         0,
5041         0,
5042         0x80,
5043         0x3f, // stateTransistionInterval=1.0
5044         0,
5045         0,
5046         0x80,
5047         0x3f, // transition_interval=1.0
5048         0,
5049         0x10,
5050         0,
5051         0, // maxSetdable = 4096
5052         0,
5053         0,
5054         0,
5055         0,                              // minSetable = 0
5056         PLDM_RANGE_FIELD_FORMAT_UINT32, // rangeFieldFormat
5057         0x1f,                           // rangeFieldsupport
5058         0x40,
5059         0x4b,
5060         0x4c,
5061         0x00, // nominalValue = 5,000,000
5062         0x80,
5063         0x8d,
5064         0x5b,
5065         0x00, // normalMax = 6,000,000
5066         0x00,
5067         0x09,
5068         0x3d,
5069         0x00, // normalMin = 4,000,000
5070         0x40,
5071         0x54,
5072         0x89,
5073         0x00, // rated_max = 9,000,000
5074         0x40,
5075         0x42,
5076         0x0f,
5077         0x00 // rated_min = 1,000,000
5078     };
5079 
5080     struct pldm_numeric_effecter_value_pdr decodedPdr;
5081     auto rc =
5082         decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
5083     EXPECT_EQ(PLDM_SUCCESS, rc);
5084 
5085     EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_UINT32, decodedPdr.effecter_data_size);
5086     EXPECT_EQ(4096, decodedPdr.max_settable.value_u32);
5087     EXPECT_EQ(0, decodedPdr.min_settable.value_u32);
5088     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT32, decodedPdr.range_field_format);
5089     EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
5090     EXPECT_EQ(5000000, decodedPdr.nominal_value.value_u32);
5091     EXPECT_EQ(6000000, decodedPdr.normal_max.value_u32);
5092     EXPECT_EQ(4000000, decodedPdr.normal_min.value_u32);
5093     EXPECT_EQ(9000000, decodedPdr.rated_max.value_u32);
5094     EXPECT_EQ(1000000, decodedPdr.rated_min.value_u32);
5095 }
5096 #endif
5097 
5098 #ifdef LIBPLDM_API_TESTING
5099 TEST(decodeNumericEffecterPdrData, Sint32Test)
5100 {
5101     std::vector<uint8_t> pdr1{
5102         0x1,
5103         0x0,
5104         0x0,
5105         0x0,                       // record handle
5106         0x1,                       // PDRHeaderVersion
5107         PLDM_NUMERIC_EFFECTER_PDR, // PDRType
5108         0x0,
5109         0x0, // recordChangeNumber
5110         PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
5111             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH *
5112                 4 +
5113             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
5114         0, // dataLength
5115         0,
5116         0, // PLDMTerminusHandle
5117         0x1,
5118         0x0, // effecterID=1
5119         PLDM_ENTITY_POWER_SUPPLY,
5120         0, // entityType=Power Supply(120)
5121         1,
5122         0, // entityInstanceNumber
5123         0x1,
5124         0x0, // containerID=1
5125         0x2,
5126         0x0,                            // effecter_semantic_id=2
5127         PLDM_NO_INIT,                   // effecterInit
5128         false,                          // effecterAuxiliaryNames
5129         PLDM_SENSOR_UNIT_DEGRESS_C,     // baseUint(2)=degrees C
5130         0,                              // unitModifier
5131         0,                              // rateUnit
5132         0,                              // baseOEMUnitHandle
5133         0,                              // auxUnit
5134         0,                              // auxUnitModifier
5135         0,                              // auxRateUnit
5136         0,                              // auxOEMUnitHandle
5137         true,                           // isLinear
5138         PLDM_EFFECTER_DATA_SIZE_SINT32, // effecterDataSize
5139         0,
5140         0,
5141         0,
5142         0, // resolution
5143         0,
5144         0,
5145         0,
5146         0, // offset
5147         0,
5148         0, // accuracy
5149         0, // plusTolerance
5150         0, // minusTolerance
5151         0,
5152         0,
5153         0x80,
5154         0x3f, // stateTransistionInterval=1.0
5155         0,
5156         0,
5157         0x80,
5158         0x3f, // transition_interval=1.0
5159         0xa0,
5160         0x86,
5161         0x01,
5162         0x00, // maxSetdable = 100000
5163         0x60,
5164         0x79,
5165         0xfe,
5166         0xff,                           // minSetable = -10000
5167         PLDM_RANGE_FIELD_FORMAT_SINT32, // rangeFieldFormat
5168         0x1f,                           // rangeFieldsupport
5169         0,
5170         0,
5171         0,
5172         0, // nominalValue = 0
5173         0x20,
5174         0xa1,
5175         0x07,
5176         0x00, // normalMax = 500,000
5177         0xe0,
5178         0x5e,
5179         0xf8,
5180         0xff, // normalMin = -500,000
5181         0xc0,
5182         0xc6,
5183         0x2d,
5184         0x00, // rated_max = 3,000,000
5185         0x40,
5186         0x39,
5187         0xd2,
5188         0xff // rated_min = -3,000,000
5189     };
5190 
5191     struct pldm_numeric_effecter_value_pdr decodedPdr;
5192     auto rc =
5193         decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
5194     EXPECT_EQ(PLDM_SUCCESS, rc);
5195     EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_SINT32, decodedPdr.effecter_data_size);
5196     EXPECT_EQ(100000, decodedPdr.max_settable.value_s32);
5197     EXPECT_EQ(-100000, decodedPdr.min_settable.value_s32);
5198     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT32, decodedPdr.range_field_format);
5199     EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
5200     EXPECT_EQ(0, decodedPdr.nominal_value.value_s32);
5201     EXPECT_EQ(500000, decodedPdr.normal_max.value_s32);
5202     EXPECT_EQ(-500000, decodedPdr.normal_min.value_s32);
5203     EXPECT_EQ(3000000, decodedPdr.rated_max.value_s32);
5204     EXPECT_EQ(-3000000, decodedPdr.rated_min.value_s32);
5205 }
5206 #endif
5207 
5208 #ifdef LIBPLDM_API_TESTING
5209 TEST(decodeNumericEffecterPdrData, Real32Test)
5210 {
5211     std::vector<uint8_t> pdr1{
5212         0x1,
5213         0x0,
5214         0x0,
5215         0x0,                       // record handle
5216         0x1,                       // PDRHeaderVersion
5217         PLDM_NUMERIC_EFFECTER_PDR, // PDRType
5218         0x0,
5219         0x0, // recordChangeNumber
5220         PLDM_PDR_NUMERIC_EFFECTER_PDR_FIXED_LENGTH +
5221             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_EFFECTER_DATA_SIZE_MIN_LENGTH *
5222                 4 +
5223             PLDM_PDR_NUMERIC_EFFECTER_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
5224         0, // dataLength
5225         0,
5226 
5227         0, // PLDMTerminusHandle
5228         0x1,
5229         0x0, // effecterID=1
5230         PLDM_ENTITY_POWER_SUPPLY,
5231         0, // entityType=Power Supply(120)
5232         1,
5233         0, // entityInstanceNumber
5234         0x1,
5235         0x0, // containerID=1
5236         0x2,
5237         0x0,                            // effecter_semantic_id=2
5238         PLDM_NO_INIT,                   // effecterInit
5239         false,                          // effecterAuxiliaryNames
5240         PLDM_SENSOR_UNIT_DEGRESS_C,     // baseUint(2)=degrees C
5241         0,                              // unitModifier
5242         0,                              // rateUnit
5243         0,                              // baseOEMUnitHandle
5244         0,                              // auxUnit
5245         0,                              // auxUnitModifier
5246         0,                              // auxRateUnit
5247         0,                              // auxOEMUnitHandle
5248         true,                           // isLinear
5249         PLDM_EFFECTER_DATA_SIZE_SINT32, // effecterDataSize
5250         0,
5251         0,
5252         0,
5253         0, // resolution
5254         0,
5255         0,
5256         0,
5257         0, // offset
5258         0,
5259         0, // accuracy
5260         0, // plusTolerance
5261         0, // minusTolerance
5262         0,
5263         0,
5264         0x80,
5265         0x3f, // stateTransistionInterval=1.0
5266         0,
5267         0,
5268         0x80,
5269         0x3f, // transition_interval=1.0
5270         0xa0,
5271         0x86,
5272         0x01,
5273         0x00, // maxSetdable = 100000
5274         0x60,
5275         0x79,
5276         0xfe,
5277         0xff,                           // minSetable = -10000
5278         PLDM_RANGE_FIELD_FORMAT_REAL32, // rangeFieldFormat
5279         0x1f,                           // rangeFieldsupport
5280         0,
5281         0,
5282         0,
5283         0, // nominalValue = 0.0
5284         0x33,
5285         0x33,
5286         0x48,
5287         0x42, // normalMax = 50.05
5288         0x33,
5289         0x33,
5290         0x48,
5291         0xc2, // normalMin = -50.05
5292         0x62,
5293         0x00,
5294         0x96,
5295         0x43, // rated_max = 300.003
5296         0x62,
5297         0x00,
5298         0x96,
5299         0xc3 // rated_min = -300.003
5300     };
5301 
5302     struct pldm_numeric_effecter_value_pdr decodedPdr;
5303     auto rc =
5304         decode_numeric_effecter_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
5305     EXPECT_EQ(PLDM_SUCCESS, rc);
5306 
5307     EXPECT_EQ(PLDM_EFFECTER_DATA_SIZE_SINT32, decodedPdr.effecter_data_size);
5308     EXPECT_FLOAT_EQ(1.0f, decodedPdr.state_transition_interval);
5309     EXPECT_FLOAT_EQ(1.0f, decodedPdr.transition_interval);
5310     EXPECT_EQ(100000, decodedPdr.max_settable.value_s32);
5311     EXPECT_EQ(-100000, decodedPdr.min_settable.value_s32);
5312     EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_REAL32, decodedPdr.range_field_format);
5313     EXPECT_EQ(0x1f, decodedPdr.range_field_support.byte);
5314     EXPECT_FLOAT_EQ(0, decodedPdr.nominal_value.value_f32);
5315     EXPECT_FLOAT_EQ(50.05f, decodedPdr.normal_max.value_f32);
5316     EXPECT_FLOAT_EQ(-50.05f, decodedPdr.normal_min.value_f32);
5317     EXPECT_FLOAT_EQ(300.003f, decodedPdr.rated_max.value_f32);
5318     EXPECT_FLOAT_EQ(-300.003f, decodedPdr.rated_min.value_f32);
5319 }
5320 #endif
5321 
5322 TEST(GetStateEffecterStates, testEncodeAndDecodeRequest)
5323 {
5324     std::array<uint8_t, hdrSize + PLDM_GET_STATE_EFFECTER_STATES_REQ_BYTES>
5325         requestMsg{};
5326 
5327     constexpr std::array<uint8_t,
5328                          hdrSize + PLDM_GET_STATE_EFFECTER_STATES_REQ_BYTES>
5329         expectedRequestMsg{
5330             {0x80, PLDM_PLATFORM, PLDM_GET_STATE_EFFECTER_STATES, 1, 0xab}};
5331 
5332     constexpr uint16_t effecter_id = 0xab01;
5333 
5334     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5335     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
5336 
5337     auto rc = encode_get_state_effecter_states_req(
5338         0, effecter_id, request, PLDM_GET_STATE_EFFECTER_STATES_REQ_BYTES);
5339 
5340     EXPECT_EQ(rc, PLDM_SUCCESS);
5341     EXPECT_EQ(requestMsg, expectedRequestMsg);
5342 
5343     uint16_t ret_effecter_id;
5344 
5345     rc = decode_get_state_effecter_states_req(
5346         request, requestMsg.size() - hdrSize, &ret_effecter_id);
5347 
5348     EXPECT_EQ(rc, PLDM_SUCCESS);
5349     EXPECT_EQ(effecter_id, ret_effecter_id);
5350 
5351     // Test invalid length decode request
5352 
5353     rc = decode_get_state_effecter_states_req(
5354         request, requestMsg.size() - hdrSize - 1, &ret_effecter_id);
5355 
5356     EXPECT_EQ(rc, -EOVERFLOW);
5357 }
5358 
5359 TEST(GetStateEffecterStates, testBadEncodeRequest)
5360 {
5361     std::vector<uint8_t> requestMsg(hdrSize +
5362                                     PLDM_GET_STATE_EFFECTER_STATES_REQ_BYTES);
5363 
5364     auto rc = encode_get_state_effecter_states_req(
5365         0, 0, nullptr, PLDM_GET_STATE_EFFECTER_STATES_REQ_BYTES);
5366     EXPECT_EQ(rc, -EINVAL);
5367 }
5368 
5369 TEST(GetStateEffecterStates, testBadDecodeRequest)
5370 {
5371     std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
5372         requestMsg{};
5373 
5374     auto rc = decode_get_state_effecter_states_req(
5375         nullptr, requestMsg.size() - hdrSize, nullptr);
5376 
5377     EXPECT_EQ(rc, -EINVAL);
5378 }
5379 
5380 TEST(GetStateEffecterStates, testEncodeAndDecodeResponse)
5381 {
5382     constexpr uint8_t comp_effecterCnt = 0x2;
5383     constexpr uint8_t completionCode = 0;
5384     std::array<uint8_t,
5385                hdrSize + PLDM_GET_STATE_EFFECTER_STATES_MIN_RESP_BYTES +
5386                    PLDM_GET_EFFECTER_STATE_FIELD_SIZE * comp_effecterCnt>
5387         expectedResponseMsg{{0, PLDM_PLATFORM, PLDM_GET_STATE_EFFECTER_STATES,
5388                              completionCode, comp_effecterCnt,
5389                              EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING, 2, 2,
5390                              EFFECTER_OPER_STATE_ENABLED_UPDATEPENDING, 2, 3}};
5391 
5392     decltype(expectedResponseMsg) responseMsg{};
5393 
5394     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5395     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
5396 
5397     std::array<get_effecter_state_field, comp_effecterCnt> stateField{
5398         {{EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING, 2, 2},
5399          {EFFECTER_OPER_STATE_ENABLED_UPDATEPENDING, 2, 3}}};
5400 
5401     struct pldm_get_state_effecter_states_resp resp_fields
5402     {
5403         PLDM_SUCCESS, comp_effecterCnt,
5404         {
5405             stateField[0], stateField[1]
5406         }
5407     };
5408 
5409     auto rc = encode_get_state_effecter_states_resp(
5410         0, &resp_fields, response, responseMsg.size() - hdrSize);
5411 
5412     EXPECT_EQ(rc, PLDM_SUCCESS);
5413     EXPECT_EQ(expectedResponseMsg, responseMsg);
5414 
5415     struct pldm_get_state_effecter_states_resp ret_resp_fields;
5416 
5417     rc = decode_get_state_effecter_states_resp(
5418         response, responseMsg.size() - hdrSize, &ret_resp_fields);
5419 
5420     EXPECT_EQ(rc, PLDM_SUCCESS);
5421     EXPECT_EQ(completionCode, ret_resp_fields.completion_code);
5422     EXPECT_EQ(comp_effecterCnt, ret_resp_fields.comp_effecter_count);
5423     EXPECT_EQ(stateField[0].effecter_op_state,
5424               ret_resp_fields.field[0].effecter_op_state);
5425     EXPECT_EQ(stateField[0].pending_state,
5426               ret_resp_fields.field[0].pending_state);
5427     EXPECT_EQ(stateField[0].present_state,
5428               ret_resp_fields.field[0].present_state);
5429     EXPECT_EQ(stateField[1].effecter_op_state,
5430               ret_resp_fields.field[1].effecter_op_state);
5431     EXPECT_EQ(stateField[1].pending_state,
5432               ret_resp_fields.field[1].pending_state);
5433     EXPECT_EQ(stateField[1].present_state,
5434               ret_resp_fields.field[1].present_state);
5435 
5436     // Test invalid length decode
5437 
5438     rc = decode_get_state_effecter_states_resp(
5439         response,
5440         responseMsg.size() - hdrSize + PLDM_GET_EFFECTER_STATE_FIELD_SIZE,
5441         &ret_resp_fields);
5442 
5443     EXPECT_EQ(rc, -EBADMSG);
5444 }
5445 
5446 TEST(GetStateEffecterStates, testBadEncodeResponse)
5447 {
5448     struct pldm_get_state_effecter_states_resp resp
5449     {
5450         PLDM_SUCCESS, 0,
5451         {
5452         }
5453     };
5454     auto rc = decode_get_state_effecter_states_resp(nullptr, 0, &resp);
5455 
5456     EXPECT_EQ(rc, -EINVAL);
5457 }
5458 
5459 TEST(GetStateEffecterStates, testBadDecodeResponse)
5460 {
5461     std::array<uint8_t, hdrSize +
5462                             PLDM_GET_STATE_EFFECTER_STATES_MIN_RESP_BYTES +
5463                             PLDM_GET_EFFECTER_STATE_FIELD_SIZE * 2>
5464         responseMsg{};
5465 
5466     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5467     auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
5468 
5469     auto rc = decode_get_state_effecter_states_resp(
5470         response, responseMsg.size() - hdrSize, nullptr);
5471 
5472     EXPECT_EQ(rc, -EINVAL);
5473 }
5474 
5475 [[maybe_unused]] static size_t str16len(char16_t* startptr)
5476 {
5477     char16_t* endptr = startptr;
5478     while (*endptr)
5479     {
5480         endptr++;
5481     }
5482     return endptr - startptr;
5483 }
5484 
5485 TEST(decodeEntityAuxNamePdrData, GoodTest)
5486 {
5487     std::vector<uint8_t> pdr1{
5488         // Common PDR Header
5489         0x1, 0x0, 0x0, 0x0,              // record handle
5490         0x1,                             // PDRHeaderVersion
5491         PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
5492         0x1,
5493         0x0, // recordChangeNumber
5494         0x27,
5495         0, // dataLength
5496         /* Entity Auxiliary Names PDR Data*/
5497         3,
5498         0, // entityType system software
5499         0x1,
5500         0x0, // Entity instance number =1
5501         PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
5502         0,                // Overal system
5503         0,                // shared Name Count one name only
5504         03,               // nameStringCount
5505         0x65, 0x6e, 0x00, // Language Tag "en"
5506         0x00, 0x53, 0x00, 0x30, 0x00, 0x53, 0x00, 0x00, // Entity Name "S0S"
5507         0x66, 0x6e, 0x00,                               // Language Tag "en"
5508         0x00, 0x53, 0x00, 0x31, 0x00, 0x00,             // Entity Name "S1"
5509         0x67, 0x6e, 0x00,                               // Language Tag "en"
5510         0x00, 0x52, 0x00, 0x52, 0x00, 0x33, 0x00, 0x00  // Entity Name "RR3"
5511     };
5512 
5513     const char expectTag0[] = {0x65, 0x6e, 0x00};
5514     const char expectTag1[] = {0x66, 0x6e, 0x00};
5515     const char expectTag2[] = {0x67, 0x6e, 0x00};
5516     const char expectName0[] = {0x00, 0x53, 0x00, 0x30, 0x00, 0x53, 0x00, 0x00};
5517     const char expectName1[] = {0x00, 0x53, 0x00, 0x31, 0x00, 0x00};
5518     const char expectName2[] = {0x00, 0x52, 0x00, 0x52, 0x00, 0x33, 0x00, 0x00};
5519     auto names_offset = sizeof(struct pldm_pdr_hdr) +
5520                         PLDM_PDR_ENTITY_AUXILIARY_NAME_PDR_MIN_LENGTH;
5521     auto names_size = pdr1.size() - names_offset;
5522     size_t length = 0;
5523 
5524     size_t decodedPdrSize =
5525         sizeof(struct pldm_entity_auxiliary_names_pdr) + names_size;
5526     auto decodedPdr =
5527         (struct pldm_entity_auxiliary_names_pdr*)malloc(decodedPdrSize);
5528     EXPECT_NE(nullptr, decodedPdr);
5529 
5530     auto rc = decode_entity_auxiliary_names_pdr(pdr1.data(), pdr1.size(),
5531                                                 decodedPdr, decodedPdrSize);
5532 
5533     EXPECT_EQ(0, rc);
5534     EXPECT_EQ(1, decodedPdr->hdr.record_handle);
5535     EXPECT_EQ(1, decodedPdr->hdr.version);
5536     EXPECT_EQ(PLDM_ENTITY_AUXILIARY_NAMES_PDR, decodedPdr->hdr.type);
5537     EXPECT_EQ(1, decodedPdr->hdr.record_change_num);
5538     EXPECT_EQ(pdr1.size() - sizeof(struct pldm_pdr_hdr),
5539               decodedPdr->hdr.length);
5540     EXPECT_EQ(3, decodedPdr->container.entity_type);
5541     EXPECT_EQ(1, decodedPdr->container.entity_instance_num);
5542     EXPECT_EQ(PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
5543               decodedPdr->container.entity_container_id);
5544     EXPECT_EQ(0, decodedPdr->shared_name_count);
5545     EXPECT_EQ(3, decodedPdr->name_string_count);
5546 
5547     decodedPdr->names = (struct pldm_entity_auxiliary_name*)calloc(
5548         decodedPdr->name_string_count,
5549         sizeof(struct pldm_entity_auxiliary_name));
5550     EXPECT_NE(nullptr, decodedPdr->names);
5551 
5552     rc = decode_pldm_entity_auxiliary_names_pdr_index(decodedPdr);
5553     EXPECT_EQ(0, rc);
5554 
5555     length = strlen(decodedPdr->names[0].tag);
5556     EXPECT_EQ(strlen(expectTag0), length);
5557     EXPECT_EQ(strncmp(expectTag0, decodedPdr->names[0].tag, length + 1), 0);
5558 
5559     // NOLINTBEGIN(clang-analyzer-unix.Malloc)
5560     ASSERT_EQ(0,
5561               (uintptr_t)decodedPdr->names[0].name & (alignof(char16_t) - 1));
5562     // NOLINTEND(clang-analyzer-unix.Malloc)
5563     length = str16len((char16_t*)decodedPdr->names[0].name);
5564     EXPECT_EQ(str16len((char16_t*)expectName0), length);
5565     EXPECT_EQ(3, str16len((char16_t*)expectName0));
5566     EXPECT_EQ(memcmp(expectName0, decodedPdr->names[0].name,
5567                      sizeof(char16_t) * (length + 1)),
5568               0);
5569 
5570     length = strlen(decodedPdr->names[1].tag);
5571     EXPECT_EQ(strlen(expectTag1), length);
5572     EXPECT_EQ(strncmp(expectTag1, decodedPdr->names[1].tag, length + 1), 0);
5573 
5574     // NOLINTBEGIN(clang-analyzer-unix.Malloc)
5575     ASSERT_EQ(0,
5576               (uintptr_t)decodedPdr->names[1].name & (alignof(char16_t) - 1));
5577     // NOLINTEND(clang-analyzer-unix.Malloc)
5578     length = str16len((char16_t*)decodedPdr->names[1].name);
5579     EXPECT_EQ(str16len((char16_t*)expectName1), length);
5580     EXPECT_EQ(2, str16len((char16_t*)expectName1));
5581     EXPECT_EQ(memcmp(expectName1, decodedPdr->names[1].name,
5582                      sizeof(char16_t) * (length + 1)),
5583               0);
5584 
5585     length = strlen(decodedPdr->names[2].tag);
5586     EXPECT_EQ(strlen(expectTag2), length);
5587     EXPECT_EQ(strncmp(expectTag2, decodedPdr->names[2].tag, length + 1), 0);
5588 
5589     // NOLINTBEGIN(clang-analyzer-unix.Malloc)
5590     ASSERT_EQ(0,
5591               (uintptr_t)decodedPdr->names[2].name & (alignof(char16_t) - 1));
5592     // NOLINTEND(clang-analyzer-unix.Malloc)
5593     length = str16len((char16_t*)decodedPdr->names[2].name);
5594     EXPECT_EQ(str16len((char16_t*)expectName2), length);
5595     EXPECT_EQ(3, str16len((char16_t*)expectName2));
5596     EXPECT_EQ(memcmp(expectName2, decodedPdr->names[2].name,
5597                      sizeof(char16_t) * (length + 1)),
5598               0);
5599 
5600     free(decodedPdr->names);
5601     free(decodedPdr);
5602 }
5603 
5604 TEST(decodeEntityAuxNamePdrData, BadTest)
5605 {
5606     std::vector<uint8_t> pdr1{
5607         // Common PDR Header
5608         0x1, 0x0, 0x0, 0x0,              // record handle
5609         0x1,                             // PDRHeaderVersion
5610         PLDM_ENTITY_AUXILIARY_NAMES_PDR, // PDRType
5611         0x1,
5612         0x0,  // recordChangeNumber
5613         0x25, // correct size is 0x27, input invalid size
5614         0,    // dataLength
5615         /* Entity Auxiliary Names PDR Data*/
5616         3,
5617         0, // entityType system software
5618         0x1,
5619         0x0, // Entity instance number =1
5620         PLDM_PLATFORM_ENTITY_SYSTEM_CONTAINER_ID,
5621         0,                // Overal system
5622         0,                // shared Name Count one name only
5623         0,                // Invalid nameStringCount
5624         0x65, 0x6e, 0x00, // Language Tag "en"
5625         0x00, 0x53, 0x00, 0x30, 0x00, 0x53, 0x00, 0x00, // Entity Name "S0S"
5626         0x66, 0x6e, 0x00,                               // Language Tag "en"
5627         0x00, 0x53, 0x00, 0x31, 0x00, 0x00,             // Entity Name "S1"
5628         0x67, 0x6e, 0x00,                               // Language Tag "en"
5629         0x00, 0x52, 0x00, 0x52, 0x00, 0x33, 0x00, 0x00  // Entity Name "RR3"
5630     };
5631 
5632     auto names_offset = sizeof(struct pldm_pdr_hdr) +
5633                         PLDM_PDR_ENTITY_AUXILIARY_NAME_PDR_MIN_LENGTH;
5634     auto names_size = pdr1.size() - names_offset;
5635 
5636     size_t decodedPdrSize =
5637         sizeof(struct pldm_entity_auxiliary_names_pdr) + names_size;
5638     auto decodedPdr =
5639         (struct pldm_entity_auxiliary_names_pdr*)malloc(decodedPdrSize);
5640 
5641     auto rc = decode_entity_auxiliary_names_pdr(pdr1.data(), pdr1.size(),
5642                                                 decodedPdr, decodedPdrSize);
5643 
5644     EXPECT_EQ(-EBADMSG, rc);
5645     free(decodedPdr);
5646 }
5647 
5648 TEST(PlatformEventMessage, testGoodCperEventDataDecodeRequest)
5649 {
5650     constexpr const size_t eventDataSize = 4;
5651     constexpr const size_t eventSize =
5652         PLDM_PLATFORM_CPER_EVENT_MIN_LENGTH + eventDataSize;
5653     std::array<uint8_t, eventSize> eventData{
5654         0x1,                   // format version
5655         0x0,                   // format type
5656         0x4,  0x0,             // event data length
5657         0x44, 0x33, 0x22, 0x11 // data
5658     };
5659 
5660     uint8_t expectedFormatVersion = 1;
5661     uint8_t expectedFormatType = 0;
5662     uint16_t expectedEventDataLength = 4;
5663     uint8_t expectCperEventData[] = {0x44, 0x33, 0x22, 0x11};
5664 
5665     size_t cperEventSize =
5666         sizeof(struct pldm_platform_cper_event) + eventDataSize;
5667     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5668     auto cper_event = reinterpret_cast<struct pldm_platform_cper_event*>(
5669         malloc(cperEventSize));
5670 
5671     auto rc = decode_pldm_platform_cper_event(
5672         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5673         reinterpret_cast<const void*>(eventData.data()), eventData.size(),
5674         cper_event, cperEventSize);
5675 
5676     EXPECT_EQ(rc, 0);
5677     EXPECT_EQ(cper_event->format_version, expectedFormatVersion);
5678     EXPECT_EQ(cper_event->format_type, expectedFormatType);
5679     EXPECT_EQ(cper_event->event_data_length, expectedEventDataLength);
5680 
5681     auto cperEventData = pldm_platform_cper_event_event_data(cper_event);
5682     EXPECT_NE(cperEventData, nullptr);
5683     if (cperEventData)
5684     {
5685         EXPECT_EQ(0, memcmp(expectCperEventData, cperEventData,
5686                             expectedEventDataLength));
5687     }
5688 
5689     free(cper_event);
5690 }
5691 
5692 TEST(PlatformEventMessage, testBadCperEventDataDecodeRequest)
5693 {
5694 
5695     constexpr const size_t eventDataSize = 4;
5696     constexpr const size_t eventSize =
5697         PLDM_PLATFORM_CPER_EVENT_MIN_LENGTH + eventDataSize;
5698     std::array<uint8_t, eventSize> eventData{
5699         0x1,                   // format version
5700         0x0,                   // format type
5701         0x4,  0x0,             // event data length
5702         0x44, 0x33, 0x22, 0x11 // data
5703     };
5704 
5705     size_t cperEventSize =
5706         sizeof(struct pldm_platform_cper_event) + eventDataSize;
5707     // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5708     auto cperEvent = reinterpret_cast<struct pldm_platform_cper_event*>(
5709         malloc(cperEventSize));
5710 
5711     auto rc = decode_pldm_platform_cper_event(NULL, eventData.size(), cperEvent,
5712                                               cperEventSize);
5713     EXPECT_EQ(rc, -EINVAL);
5714 
5715     rc = decode_pldm_platform_cper_event(
5716         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5717         reinterpret_cast<const void*>(eventData.data()), eventData.size(), NULL,
5718         cperEventSize);
5719     EXPECT_EQ(rc, -EINVAL);
5720 
5721 #ifdef NDEBUG
5722     rc = decode_pldm_platform_cper_event(
5723         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5724         reinterpret_cast<uint8_t*>(eventData.data()), eventData.size() - 1,
5725         cperEvent, cperEventSize);
5726     EXPECT_EQ(rc, -EOVERFLOW);
5727 #else
5728     EXPECT_DEATH(
5729         decode_pldm_platform_cper_event(
5730             // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5731             reinterpret_cast<uint8_t*>(eventData.data()), eventData.size() - 1,
5732             cperEvent, cperEventSize),
5733         "ctx->remaining >= 0");
5734 #endif
5735 
5736     rc = decode_pldm_platform_cper_event(
5737         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5738         reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(),
5739         cperEvent, cperEventSize - 1);
5740     EXPECT_EQ(rc, -EOVERFLOW);
5741 
5742     rc = decode_pldm_platform_cper_event(
5743         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5744         reinterpret_cast<uint8_t*>(eventData.data()), eventData.size(),
5745         cperEvent, cperEventSize + 1);
5746     EXPECT_EQ(rc, 0);
5747 
5748     // Invalid CPER Event Format Type
5749     eventData[1] = 0x2;
5750     rc = decode_pldm_platform_cper_event(
5751         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5752         reinterpret_cast<const void*>(eventData.data()), eventData.size(),
5753         cperEvent, cperEventSize);
5754 
5755     EXPECT_EQ(rc, -EPROTO);
5756 
5757     // Invalid cper event data size
5758     eventData[1] = 0x1;
5759     eventData[2] = 3;
5760     rc = decode_pldm_platform_cper_event(
5761         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5762         reinterpret_cast<const void*>(eventData.data()), eventData.size(),
5763         cperEvent, cperEventSize);
5764 
5765     EXPECT_EQ(rc, -EBADMSG);
5766 
5767     eventData[2] = 5;
5768     rc = decode_pldm_platform_cper_event(
5769         // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
5770         reinterpret_cast<const void*>(eventData.data()), eventData.size(),
5771         cperEvent, cperEventSize);
5772 
5773     EXPECT_EQ(rc, -EOVERFLOW);
5774 
5775     free(cperEvent);
5776 }
5777