blob: 9c5e3b0a241f58175e5a74788c0c721607c9b526 [file] [log] [blame]
Andrew Jeffery9c766792022-08-10 23:12:49 +09301#include <string.h>
2
3#include <array>
4
5#include "libpldm/base.h"
6#include "libpldm/platform.h"
7
8#include <gtest/gtest.h>
9
10constexpr auto hdrSize = sizeof(pldm_msg_hdr);
11
12TEST(SetStateEffecterStates, testEncodeResponse)
13{
14 std::array<uint8_t,
15 sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
16 responseMsg{};
17 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
18 uint8_t completionCode = 0;
19
20 auto rc = encode_set_state_effecter_states_resp(0, PLDM_SUCCESS, response);
21
22 EXPECT_EQ(rc, PLDM_SUCCESS);
23 EXPECT_EQ(completionCode, response->payload[0]);
24}
25
26TEST(SetStateEffecterStates, testEncodeRequest)
27{
28 std::array<uint8_t,
29 sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES>
30 requestMsg{};
31 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
32
33 uint16_t effecterId = 0x0A;
34 uint8_t compEffecterCnt = 0x2;
35 std::array<set_effecter_state_field, 8> stateField{};
36 stateField[0] = {PLDM_REQUEST_SET, 2};
37 stateField[1] = {PLDM_REQUEST_SET, 3};
38
39 auto rc = encode_set_state_effecter_states_req(
40 0, effecterId, compEffecterCnt, stateField.data(), request);
41
42 EXPECT_EQ(rc, PLDM_SUCCESS);
43 EXPECT_EQ(effecterId, request->payload[0]);
44 EXPECT_EQ(compEffecterCnt, request->payload[sizeof(effecterId)]);
45 EXPECT_EQ(stateField[0].set_request,
46 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt)]);
47 EXPECT_EQ(stateField[0].effecter_state,
48 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
49 sizeof(stateField[0].set_request)]);
50 EXPECT_EQ(stateField[1].set_request,
51 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
52 sizeof(stateField[0])]);
53 EXPECT_EQ(stateField[1].effecter_state,
54 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
55 sizeof(stateField[0]) +
56 sizeof(stateField[1].set_request)]);
57}
58
59TEST(SetStateEffecterStates, testGoodDecodeResponse)
60{
61 std::array<uint8_t, hdrSize + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
62 responseMsg{};
63
64 uint8_t retcompletion_code = 0;
65
66 responseMsg[hdrSize] = PLDM_SUCCESS;
67
68 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
69
70 auto rc = decode_set_state_effecter_states_resp(
71 response, responseMsg.size() - hdrSize, &retcompletion_code);
72
73 EXPECT_EQ(rc, PLDM_SUCCESS);
74 EXPECT_EQ(PLDM_SUCCESS, retcompletion_code);
75}
76
77TEST(SetStateEffecterStates, testGoodDecodeRequest)
78{
79 std::array<uint8_t, hdrSize + PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES>
80 requestMsg{};
81
82 uint16_t effecterId = 0x32;
83 uint16_t effecterIdLE = htole16(effecterId);
84 uint8_t compEffecterCnt = 0x2;
85
86 std::array<set_effecter_state_field, 8> stateField{};
87 stateField[0] = {PLDM_REQUEST_SET, 3};
88 stateField[1] = {PLDM_REQUEST_SET, 4};
89
90 uint16_t retEffecterId = 0;
91 uint8_t retCompEffecterCnt = 0;
92
93 std::array<set_effecter_state_field, 8> retStateField{};
94
95 memcpy(requestMsg.data() + hdrSize, &effecterIdLE, sizeof(effecterIdLE));
96 memcpy(requestMsg.data() + sizeof(effecterIdLE) + hdrSize, &compEffecterCnt,
97 sizeof(compEffecterCnt));
98 memcpy(requestMsg.data() + sizeof(effecterIdLE) + sizeof(compEffecterCnt) +
99 hdrSize,
100 &stateField, sizeof(stateField));
101
102 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
103
104 auto rc = decode_set_state_effecter_states_req(
105 request, requestMsg.size() - hdrSize, &retEffecterId,
106 &retCompEffecterCnt, retStateField.data());
107
108 EXPECT_EQ(rc, PLDM_SUCCESS);
109 EXPECT_EQ(effecterId, retEffecterId);
110 EXPECT_EQ(retCompEffecterCnt, compEffecterCnt);
111 EXPECT_EQ(retStateField[0].set_request, stateField[0].set_request);
112 EXPECT_EQ(retStateField[0].effecter_state, stateField[0].effecter_state);
113 EXPECT_EQ(retStateField[1].set_request, stateField[1].set_request);
114 EXPECT_EQ(retStateField[1].effecter_state, stateField[1].effecter_state);
115}
116
117TEST(SetStateEffecterStates, testBadDecodeRequest)
118{
119 const struct pldm_msg* msg = NULL;
120
121 auto rc = decode_set_state_effecter_states_req(msg, sizeof(*msg), NULL,
122 NULL, NULL);
123
124 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
125}
126
127TEST(SetStateEffecterStates, testBadDecodeResponse)
128{
129 std::array<uint8_t, PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
130 responseMsg{};
131
132 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
133
134 auto rc = decode_set_state_effecter_states_resp(response,
135 responseMsg.size(), NULL);
136
137 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
138}
139
140TEST(GetPDR, testGoodEncodeResponse)
141{
142 uint8_t completionCode = 0;
143 uint32_t nextRecordHndl = 0x12;
144 uint32_t nextDataTransferHndl = 0x13;
145 uint8_t transferFlag = PLDM_END;
146 uint16_t respCnt = 0x5;
147 std::vector<uint8_t> recordData{1, 2, 3, 4, 5};
148 uint8_t transferCRC = 6;
149
150 // + size of record data and transfer CRC
151 std::vector<uint8_t> responseMsg(hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES +
152 recordData.size() + 1);
153 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
154
155 auto rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
156 nextDataTransferHndl, transferFlag, respCnt,
157 recordData.data(), transferCRC, response);
158
159 EXPECT_EQ(rc, PLDM_SUCCESS);
160 struct pldm_get_pdr_resp* resp =
161 reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
162
163 EXPECT_EQ(completionCode, resp->completion_code);
164 EXPECT_EQ(nextRecordHndl, le32toh(resp->next_record_handle));
165 EXPECT_EQ(nextDataTransferHndl, le32toh(resp->next_data_transfer_handle));
166 EXPECT_EQ(transferFlag, resp->transfer_flag);
167 EXPECT_EQ(respCnt, le16toh(resp->response_count));
168 EXPECT_EQ(0,
169 memcmp(recordData.data(), resp->record_data, recordData.size()));
170 EXPECT_EQ(*(response->payload + sizeof(pldm_get_pdr_resp) - 1 +
171 recordData.size()),
172 transferCRC);
173
174 transferFlag = PLDM_START_AND_END; // No CRC in this case
175 responseMsg.resize(responseMsg.size() - sizeof(transferCRC));
176 rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
177 nextDataTransferHndl, transferFlag, respCnt,
178 recordData.data(), transferCRC, response);
179 EXPECT_EQ(rc, PLDM_SUCCESS);
180}
181
182TEST(GetPDR, testBadEncodeResponse)
183{
184 uint32_t nextRecordHndl = 0x12;
185 uint32_t nextDataTransferHndl = 0x13;
186 uint8_t transferFlag = PLDM_START_AND_END;
187 uint16_t respCnt = 0x5;
188 std::vector<uint8_t> recordData{1, 2, 3, 4, 5};
189 uint8_t transferCRC = 0;
190
191 auto rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
192 nextDataTransferHndl, transferFlag, respCnt,
193 recordData.data(), transferCRC, nullptr);
194
195 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
196}
197
198TEST(GetPDR, testGoodDecodeRequest)
199{
200 std::array<uint8_t, hdrSize + PLDM_GET_PDR_REQ_BYTES> requestMsg{};
201
202 uint32_t recordHndl = 0x32;
203 uint32_t dataTransferHndl = 0x11;
204 uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
205 uint16_t requestCnt = 0x5;
206 uint16_t recordChangeNum = 0x01;
207
208 uint32_t retRecordHndl = 0;
209 uint32_t retDataTransferHndl = 0;
210 uint8_t retTransferOpFlag = 0;
211 uint16_t retRequestCnt = 0;
212 uint16_t retRecordChangeNum = 0;
213
214 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
215 struct pldm_get_pdr_req* request =
216 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
217
218 request->record_handle = htole32(recordHndl);
219 request->data_transfer_handle = htole32(dataTransferHndl);
220 request->transfer_op_flag = transferOpFlag;
221 request->request_count = htole16(requestCnt);
222 request->record_change_number = htole16(recordChangeNum);
223
224 auto rc = decode_get_pdr_req(
225 req, requestMsg.size() - hdrSize, &retRecordHndl, &retDataTransferHndl,
226 &retTransferOpFlag, &retRequestCnt, &retRecordChangeNum);
227
228 EXPECT_EQ(rc, PLDM_SUCCESS);
229 EXPECT_EQ(retRecordHndl, recordHndl);
230 EXPECT_EQ(retDataTransferHndl, dataTransferHndl);
231 EXPECT_EQ(retTransferOpFlag, transferOpFlag);
232 EXPECT_EQ(retRequestCnt, requestCnt);
233 EXPECT_EQ(retRecordChangeNum, recordChangeNum);
234}
235
236TEST(GetPDR, testBadDecodeRequest)
237{
238 std::array<uint8_t, PLDM_GET_PDR_REQ_BYTES> requestMsg{};
239 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
240
241 auto rc = decode_get_pdr_req(req, requestMsg.size(), NULL, NULL, NULL, NULL,
242 NULL);
243
244 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
245}
246
247TEST(GetPDR, testGoodEncodeRequest)
248{
249 uint32_t record_hndl = 0;
250 uint32_t data_transfer_hndl = 0;
251 uint8_t transfer_op_flag = PLDM_GET_FIRSTPART;
252 uint16_t request_cnt = 20;
253 uint16_t record_chg_num = 0;
254
255 std::vector<uint8_t> requestMsg(hdrSize + PLDM_GET_PDR_REQ_BYTES);
256 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
257
258 auto rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
259 transfer_op_flag, request_cnt, record_chg_num,
260 request, PLDM_GET_PDR_REQ_BYTES);
261 EXPECT_EQ(rc, PLDM_SUCCESS);
262 struct pldm_get_pdr_req* req =
263 reinterpret_cast<struct pldm_get_pdr_req*>(request->payload);
264 EXPECT_EQ(record_hndl, le32toh(req->record_handle));
265 EXPECT_EQ(data_transfer_hndl, le32toh(req->data_transfer_handle));
266 EXPECT_EQ(transfer_op_flag, req->transfer_op_flag);
267 EXPECT_EQ(request_cnt, le16toh(req->request_count));
268 EXPECT_EQ(record_chg_num, le16toh(req->record_change_number));
269}
270
271TEST(GetPDR, testBadEncodeRequest)
272{
273 uint32_t record_hndl = 0;
274 uint32_t data_transfer_hndl = 0;
275 uint8_t transfer_op_flag = PLDM_GET_FIRSTPART;
276 uint16_t request_cnt = 32;
277 uint16_t record_chg_num = 0;
278
279 std::vector<uint8_t> requestMsg(hdrSize + PLDM_GET_PDR_REQ_BYTES);
280 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
281
282 auto rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
283 transfer_op_flag, request_cnt, record_chg_num,
284 nullptr, PLDM_GET_PDR_REQ_BYTES);
285 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
286
287 rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
288 transfer_op_flag, request_cnt, record_chg_num,
289 request, PLDM_GET_PDR_REQ_BYTES + 1);
290 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
291}
292
293TEST(GetPDR, testGoodDecodeResponse)
294{
295 const char* recordData = "123456789";
296 uint8_t completionCode = PLDM_SUCCESS;
297 uint32_t nextRecordHndl = 0;
298 uint32_t nextDataTransferHndl = 0;
299 uint8_t transferFlag = PLDM_END;
300 constexpr uint16_t respCnt = 9;
301 uint8_t transferCRC = 96;
302 size_t recordDataLength = 32;
303 std::array<uint8_t, hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES + respCnt +
304 sizeof(transferCRC)>
305 responseMsg{};
306
307 uint8_t retCompletionCode = 0;
308 uint8_t retRecordData[32] = {0};
309 uint32_t retNextRecordHndl = 0;
310 uint32_t retNextDataTransferHndl = 0;
311 uint8_t retTransferFlag = 0;
312 uint16_t retRespCnt = 0;
313 uint8_t retTransferCRC = 0;
314
315 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
316 struct pldm_get_pdr_resp* resp =
317 reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
318 resp->completion_code = completionCode;
319 resp->next_record_handle = htole32(nextRecordHndl);
320 resp->next_data_transfer_handle = htole32(nextDataTransferHndl);
321 resp->transfer_flag = transferFlag;
322 resp->response_count = htole16(respCnt);
323 memcpy(resp->record_data, recordData, respCnt);
324 response->payload[PLDM_GET_PDR_MIN_RESP_BYTES + respCnt] = transferCRC;
325
326 auto rc = decode_get_pdr_resp(
327 response, responseMsg.size() - hdrSize, &retCompletionCode,
328 &retNextRecordHndl, &retNextDataTransferHndl, &retTransferFlag,
329 &retRespCnt, retRecordData, recordDataLength, &retTransferCRC);
330 EXPECT_EQ(rc, PLDM_SUCCESS);
331 EXPECT_EQ(retCompletionCode, completionCode);
332 EXPECT_EQ(retNextRecordHndl, nextRecordHndl);
333 EXPECT_EQ(retNextDataTransferHndl, nextDataTransferHndl);
334 EXPECT_EQ(retTransferFlag, transferFlag);
335 EXPECT_EQ(retRespCnt, respCnt);
336 EXPECT_EQ(retTransferCRC, transferCRC);
337 EXPECT_EQ(0, memcmp(recordData, resp->record_data, respCnt));
338}
339
340TEST(GetPDR, testBadDecodeResponse)
341{
342 const char* recordData = "123456789";
343 uint8_t completionCode = PLDM_SUCCESS;
344 uint32_t nextRecordHndl = 0;
345 uint32_t nextDataTransferHndl = 0;
346 uint8_t transferFlag = PLDM_END;
347 constexpr uint16_t respCnt = 9;
348 uint8_t transferCRC = 96;
349 size_t recordDataLength = 32;
350 std::array<uint8_t, hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES + respCnt +
351 sizeof(transferCRC)>
352 responseMsg{};
353
354 uint8_t retCompletionCode = 0;
355 uint8_t retRecordData[32] = {0};
356 uint32_t retNextRecordHndl = 0;
357 uint32_t retNextDataTransferHndl = 0;
358 uint8_t retTransferFlag = 0;
359 uint16_t retRespCnt = 0;
360 uint8_t retTransferCRC = 0;
361
362 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
363 struct pldm_get_pdr_resp* resp =
364 reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
365 resp->completion_code = completionCode;
366 resp->next_record_handle = htole32(nextRecordHndl);
367 resp->next_data_transfer_handle = htole32(nextDataTransferHndl);
368 resp->transfer_flag = transferFlag;
369 resp->response_count = htole16(respCnt);
370 memcpy(resp->record_data, recordData, respCnt);
371 response->payload[PLDM_GET_PDR_MIN_RESP_BYTES + respCnt] = transferCRC;
372
373 auto rc = decode_get_pdr_resp(response, responseMsg.size() - hdrSize, NULL,
374 NULL, NULL, NULL, NULL, NULL, 0, NULL);
375 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
376
377 rc = decode_get_pdr_resp(
378 response, responseMsg.size() - hdrSize - 1, &retCompletionCode,
379 &retNextRecordHndl, &retNextDataTransferHndl, &retTransferFlag,
380 &retRespCnt, retRecordData, recordDataLength, &retTransferCRC);
381 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
382}
383
384TEST(GetPDRRepositoryInfo, testGoodEncodeResponse)
385{
386 uint8_t completionCode = 0;
387 uint8_t repositoryState = PLDM_AVAILABLE;
388 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
389 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
390 uint32_t recordCount = 100;
391 uint32_t repositorySize = 100;
392 uint32_t largestRecordSize = UINT32_MAX;
393 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
394
395 std::vector<uint8_t> responseMsg(hdrSize +
396 PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES);
397 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
398
399 auto rc = encode_get_pdr_repository_info_resp(
400 0, PLDM_SUCCESS, repositoryState, updateTime, oemUpdateTime,
401 recordCount, repositorySize, largestRecordSize,
402 dataTransferHandleTimeout, response);
403
404 EXPECT_EQ(rc, PLDM_SUCCESS);
405 struct pldm_pdr_repository_info_resp* resp =
406 reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
407 response->payload);
408
409 EXPECT_EQ(completionCode, resp->completion_code);
410 EXPECT_EQ(repositoryState, resp->repository_state);
411 EXPECT_EQ(0, memcmp(updateTime, resp->update_time, PLDM_TIMESTAMP104_SIZE));
412 EXPECT_EQ(0, memcmp(oemUpdateTime, resp->oem_update_time,
413 PLDM_TIMESTAMP104_SIZE));
414 EXPECT_EQ(recordCount, le32toh(resp->record_count));
415 EXPECT_EQ(repositorySize, le32toh(resp->repository_size));
416 EXPECT_EQ(largestRecordSize, le32toh(resp->largest_record_size));
417 EXPECT_EQ(dataTransferHandleTimeout, resp->data_transfer_handle_timeout);
418}
419
420TEST(GetPDRRepositoryInfo, testBadEncodeResponse)
421{
422 uint8_t repositoryState = PLDM_AVAILABLE;
423 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
424 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
425 uint32_t recordCount = 100;
426 uint32_t repositorySize = 100;
427 uint32_t largestRecordSize = UINT32_MAX;
428 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
429
430 auto rc = encode_get_pdr_repository_info_resp(
431 0, PLDM_SUCCESS, repositoryState, updateTime, oemUpdateTime,
432 recordCount, repositorySize, largestRecordSize,
433 dataTransferHandleTimeout, nullptr);
434 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
435}
436
437TEST(SetNumericEffecterValue, testGoodDecodeRequest)
438{
439 std::array<uint8_t,
440 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 3>
441 requestMsg{};
442
443 uint16_t effecter_id = 32768;
444 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT32;
445 uint32_t effecter_value = 123456789;
446
447 uint16_t reteffecter_id;
448 uint8_t reteffecter_data_size;
449 uint8_t reteffecter_value[4];
450
451 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
452 struct pldm_set_numeric_effecter_value_req* request =
453 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
454 req->payload);
455
456 request->effecter_id = htole16(effecter_id);
457 request->effecter_data_size = effecter_data_size;
458 uint32_t effecter_value_le = htole32(effecter_value);
459 memcpy(request->effecter_value, &effecter_value_le,
460 sizeof(effecter_value_le));
461
462 auto rc = decode_set_numeric_effecter_value_req(
463 req, requestMsg.size() - hdrSize, &reteffecter_id,
464 &reteffecter_data_size, reteffecter_value);
465
466 uint32_t value = *(reinterpret_cast<uint32_t*>(reteffecter_value));
467 EXPECT_EQ(rc, PLDM_SUCCESS);
468 EXPECT_EQ(reteffecter_id, effecter_id);
469 EXPECT_EQ(reteffecter_data_size, effecter_data_size);
470 EXPECT_EQ(value, effecter_value);
471}
472
473TEST(SetNumericEffecterValue, testBadDecodeRequest)
474{
475 std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES>
476 requestMsg{};
477
478 auto rc = decode_set_numeric_effecter_value_req(
479 NULL, requestMsg.size() - hdrSize, NULL, NULL, NULL);
480 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
481
482 uint16_t effecter_id = 0x10;
483 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT8;
484 uint8_t effecter_value = 1;
485
486 uint16_t reteffecter_id;
487 uint8_t reteffecter_data_size;
488 uint8_t reteffecter_value[4];
489
490 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
491 struct pldm_set_numeric_effecter_value_req* request =
492 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
493 req->payload);
494
495 request->effecter_id = effecter_id;
496 request->effecter_data_size = effecter_data_size;
497 memcpy(request->effecter_value, &effecter_value, sizeof(effecter_value));
498
499 rc = decode_set_numeric_effecter_value_req(
500 req, requestMsg.size() - hdrSize - 1, &reteffecter_id,
501 &reteffecter_data_size, reinterpret_cast<uint8_t*>(&reteffecter_value));
502 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
503}
504
505TEST(SetNumericEffecterValue, testGoodEncodeRequest)
506{
507 uint16_t effecter_id = 0;
508 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT16;
509 uint16_t effecter_value = 65534;
510
511 std::vector<uint8_t> requestMsg(
512 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
513 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
514
515 auto rc = encode_set_numeric_effecter_value_req(
516 0, effecter_id, effecter_data_size,
517 reinterpret_cast<uint8_t*>(&effecter_value), request,
518 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
519 EXPECT_EQ(rc, PLDM_SUCCESS);
520
521 struct pldm_set_numeric_effecter_value_req* req =
522 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
523 request->payload);
524 EXPECT_EQ(effecter_id, req->effecter_id);
525 EXPECT_EQ(effecter_data_size, req->effecter_data_size);
526 uint16_t* val = (uint16_t*)req->effecter_value;
527 *val = le16toh(*val);
528 EXPECT_EQ(effecter_value, *val);
529}
530
531TEST(SetNumericEffecterValue, testBadEncodeRequest)
532{
533 std::vector<uint8_t> requestMsg(
534 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
535 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
536
537 auto rc = encode_set_numeric_effecter_value_req(
538 0, 0, 0, NULL, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
539 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
540
541 uint16_t effecter_value;
542 rc = encode_set_numeric_effecter_value_req(
543 0, 0, 6, reinterpret_cast<uint8_t*>(&effecter_value), request,
544 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
545 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
546}
547
548TEST(SetNumericEffecterValue, testGoodDecodeResponse)
549{
550 std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
551 responseMsg{};
552
553 uint8_t completion_code = 0xA0;
554
555 uint8_t retcompletion_code;
556
557 memcpy(responseMsg.data() + hdrSize, &completion_code,
558 sizeof(completion_code));
559
560 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
561
562 auto rc = decode_set_numeric_effecter_value_resp(
563 response, responseMsg.size() - hdrSize, &retcompletion_code);
564
565 EXPECT_EQ(rc, PLDM_SUCCESS);
566 EXPECT_EQ(completion_code, retcompletion_code);
567}
568
569TEST(SetNumericEffecterValue, testBadDecodeResponse)
570{
571 std::array<uint8_t, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
572 responseMsg{};
573
574 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
575
576 auto rc = decode_set_numeric_effecter_value_resp(response,
577 responseMsg.size(), NULL);
578
579 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
580}
581
582TEST(SetNumericEffecterValue, testGoodEncodeResponse)
583{
584 std::array<uint8_t, sizeof(pldm_msg_hdr) +
585 PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
586 responseMsg{};
587 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
588 uint8_t completionCode = 0;
589
590 auto rc = encode_set_numeric_effecter_value_resp(
591 0, PLDM_SUCCESS, response, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
592
593 EXPECT_EQ(rc, PLDM_SUCCESS);
594 EXPECT_EQ(completionCode, response->payload[0]);
595}
596
597TEST(SetNumericEffecterValue, testBadEncodeResponse)
598{
599 auto rc = encode_set_numeric_effecter_value_resp(
600 0, PLDM_SUCCESS, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
601 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
602}
603
604TEST(GetStateSensorReadings, testGoodEncodeResponse)
605{
606 std::array<uint8_t, hdrSize +
607 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
608 sizeof(get_sensor_state_field) * 2>
609 responseMsg{};
610
611 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
612 uint8_t completionCode = 0;
613 uint8_t comp_sensorCnt = 0x2;
614
615 std::array<get_sensor_state_field, 2> stateField{};
616 stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_NORMAL,
617 PLDM_SENSOR_WARNING, PLDM_SENSOR_UNKNOWN};
618 stateField[1] = {PLDM_SENSOR_FAILED, PLDM_SENSOR_UPPERFATAL,
619 PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_FATAL};
620
621 auto rc = encode_get_state_sensor_readings_resp(
622 0, PLDM_SUCCESS, comp_sensorCnt, stateField.data(), response);
623
624 struct pldm_get_state_sensor_readings_resp* resp =
625 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
626 response->payload);
627
628 EXPECT_EQ(rc, PLDM_SUCCESS);
629 EXPECT_EQ(completionCode, resp->completion_code);
630 EXPECT_EQ(comp_sensorCnt, resp->comp_sensor_count);
631 EXPECT_EQ(stateField[0].sensor_op_state, resp->field->sensor_op_state);
632 EXPECT_EQ(stateField[0].present_state, resp->field->present_state);
633 EXPECT_EQ(stateField[0].previous_state, resp->field->previous_state);
634 EXPECT_EQ(stateField[0].event_state, resp->field->event_state);
635 EXPECT_EQ(stateField[1].sensor_op_state, resp->field[1].sensor_op_state);
636 EXPECT_EQ(stateField[1].present_state, resp->field[1].present_state);
637 EXPECT_EQ(stateField[1].previous_state, resp->field[1].previous_state);
638 EXPECT_EQ(stateField[1].event_state, resp->field[1].event_state);
639}
640
641TEST(GetStateSensorReadings, testBadEncodeResponse)
642{
643 auto rc = encode_get_state_sensor_readings_resp(0, PLDM_SUCCESS, 0, nullptr,
644 nullptr);
645
646 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
647}
648
649TEST(GetStateSensorReadings, testGoodDecodeResponse)
650{
651 std::array<uint8_t, hdrSize +
652 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
653 sizeof(get_sensor_state_field) * 2>
654 responseMsg{};
655
656 uint8_t completionCode = 0;
657 uint8_t comp_sensorCnt = 2;
658
659 std::array<get_sensor_state_field, 2> stateField{};
660 stateField[0] = {PLDM_SENSOR_DISABLED, PLDM_SENSOR_UNKNOWN,
661 PLDM_SENSOR_UNKNOWN, PLDM_SENSOR_UNKNOWN};
662 stateField[1] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_LOWERFATAL,
663 PLDM_SENSOR_LOWERCRITICAL, PLDM_SENSOR_WARNING};
664
665 uint8_t retcompletion_code = 0;
666 uint8_t retcomp_sensorCnt = 0;
667 std::array<get_sensor_state_field, 2> retstateField{};
668
669 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
670 struct pldm_get_state_sensor_readings_resp* resp =
671 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
672 response->payload);
673
674 resp->completion_code = completionCode;
675 resp->comp_sensor_count = comp_sensorCnt;
676 memcpy(resp->field, &stateField,
677 (sizeof(get_sensor_state_field) * comp_sensorCnt));
678
679 auto rc = decode_get_state_sensor_readings_resp(
680 response, responseMsg.size() - hdrSize, &retcompletion_code,
681 &retcomp_sensorCnt, retstateField.data());
682
683 EXPECT_EQ(rc, PLDM_SUCCESS);
684 EXPECT_EQ(completionCode, retcompletion_code);
685 EXPECT_EQ(comp_sensorCnt, retcomp_sensorCnt);
686 EXPECT_EQ(stateField[0].sensor_op_state, retstateField[0].sensor_op_state);
687 EXPECT_EQ(stateField[0].present_state, retstateField[0].present_state);
688 EXPECT_EQ(stateField[0].previous_state, retstateField[0].previous_state);
689 EXPECT_EQ(stateField[0].event_state, retstateField[0].event_state);
690 EXPECT_EQ(stateField[1].sensor_op_state, retstateField[1].sensor_op_state);
691 EXPECT_EQ(stateField[1].present_state, retstateField[1].present_state);
692 EXPECT_EQ(stateField[1].previous_state, retstateField[1].previous_state);
693 EXPECT_EQ(stateField[1].event_state, retstateField[1].event_state);
694}
695
696TEST(GetStateSensorReadings, testBadDecodeResponse)
697{
698 std::array<uint8_t, hdrSize +
699 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
700 sizeof(get_sensor_state_field) * 2>
701 responseMsg{};
702
703 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
704
705 auto rc = decode_get_state_sensor_readings_resp(
706 response, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr);
707
708 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
709
710 uint8_t completionCode = 0;
711 uint8_t comp_sensorCnt = 1;
712
713 std::array<get_sensor_state_field, 1> stateField{};
714 stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_UPPERFATAL,
715 PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_WARNING};
716
717 uint8_t retcompletion_code = 0;
718 uint8_t retcomp_sensorCnt = 0;
719 std::array<get_sensor_state_field, 1> retstateField{};
720
721 struct pldm_get_state_sensor_readings_resp* resp =
722 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
723 response->payload);
724
725 resp->completion_code = completionCode;
726 resp->comp_sensor_count = comp_sensorCnt;
727 memcpy(resp->field, &stateField,
728 (sizeof(get_sensor_state_field) * comp_sensorCnt));
729
730 rc = decode_get_state_sensor_readings_resp(
731 response, responseMsg.size() - hdrSize + 1, &retcompletion_code,
732 &retcomp_sensorCnt, retstateField.data());
733
734 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
735}
736
737TEST(GetStateSensorReadings, testGoodEncodeRequest)
738{
739 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
740 requestMsg{};
741
742 uint16_t sensorId = 0xAB;
743 bitfield8_t sensorRearm;
744 sensorRearm.byte = 0x03;
745
746 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
747 auto rc = encode_get_state_sensor_readings_req(0, sensorId, sensorRearm, 0,
748 request);
749
750 struct pldm_get_state_sensor_readings_req* req =
751 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
752 request->payload);
753
754 EXPECT_EQ(rc, PLDM_SUCCESS);
755 EXPECT_EQ(sensorId, le16toh(req->sensor_id));
756 EXPECT_EQ(sensorRearm.byte, req->sensor_rearm.byte);
757}
758
759TEST(GetStateSensorReadings, testBadEncodeRequest)
760{
761 bitfield8_t sensorRearm;
762 sensorRearm.byte = 0x0;
763
764 auto rc =
765 encode_get_state_sensor_readings_req(0, 0, sensorRearm, 0, nullptr);
766
767 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
768}
769
770TEST(GetStateSensorReadings, testGoodDecodeRequest)
771{
772 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
773 requestMsg{};
774
775 uint16_t sensorId = 0xCD;
776 bitfield8_t sensorRearm;
777 sensorRearm.byte = 0x10;
778
779 uint16_t retsensorId;
780 bitfield8_t retsensorRearm;
781 uint8_t retreserved;
782
783 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
784
785 struct pldm_get_state_sensor_readings_req* req =
786 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
787 request->payload);
788
789 req->sensor_id = htole16(sensorId);
790 req->sensor_rearm.byte = sensorRearm.byte;
791
792 auto rc = decode_get_state_sensor_readings_req(
793 request, requestMsg.size() - hdrSize, &retsensorId, &retsensorRearm,
794 &retreserved);
795
796 EXPECT_EQ(rc, PLDM_SUCCESS);
797 EXPECT_EQ(sensorId, retsensorId);
798 EXPECT_EQ(sensorRearm.byte, retsensorRearm.byte);
799 EXPECT_EQ(0, retreserved);
800}
801
802TEST(GetStateSensorReadings, testBadDecodeRequest)
803{
804 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
805 requestMsg{};
806
807 auto rc = decode_get_state_sensor_readings_req(
808 nullptr, requestMsg.size() - hdrSize, nullptr, nullptr, nullptr);
809
810 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
811 uint16_t sensorId = 0x11;
812 bitfield8_t sensorRearm;
813 sensorRearm.byte = 0x04;
814
815 uint16_t retsensorId;
816 bitfield8_t retsensorRearm;
817 uint8_t retreserved;
818
819 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
820
821 struct pldm_get_state_sensor_readings_req* req =
822 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
823 request->payload);
824
825 req->sensor_id = htole16(sensorId);
826 req->sensor_rearm.byte = sensorRearm.byte;
827
828 rc = decode_get_state_sensor_readings_req(
829 request, requestMsg.size() - hdrSize - 1, &retsensorId, &retsensorRearm,
830 &retreserved);
831
832 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
833}
834
Dung Caod6ae8982022-11-02 10:00:10 +0700835TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeRequest)
836{
837 uint8_t eventBufferSize = 32;
838
839 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_REQ_BYTES>
840 requestMsg{};
841 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
842
843 auto rc = encode_event_message_buffer_size_req(0, eventBufferSize, request);
844
845 EXPECT_EQ(rc, PLDM_SUCCESS);
846}
847
848TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeResponse)
849{
850 uint8_t completionCode = PLDM_SUCCESS;
851 uint16_t terminusMaxBufferSize = 256;
852
853 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
854 responseMsg{};
855
856 uint8_t retCompletionCode;
857 uint16_t retMaxBufferSize = 0;
858
859 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
860 struct pldm_event_message_buffer_size_resp* resp =
861 reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
862 response->payload);
863
864 resp->completion_code = completionCode;
865 resp->terminus_max_buffer_size = terminusMaxBufferSize;
866
867 auto rc = decode_event_message_buffer_size_resp(
868 response, responseMsg.size() - hdrSize, &retCompletionCode,
869 &retMaxBufferSize);
870
871 EXPECT_EQ(rc, PLDM_SUCCESS);
872 EXPECT_EQ(retCompletionCode, completionCode);
873 EXPECT_EQ(terminusMaxBufferSize, retMaxBufferSize);
874}
875
876TEST(EventMessageBufferSize, testBadEventMessageBufferSizeResponse)
877{
878 uint8_t completionCode = PLDM_SUCCESS;
879 uint16_t terminusMaxBufferSize = 256;
880
881 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
882 responseMsg{};
883
884 uint8_t retCompletionCode;
885 uint16_t retMaxBufferSize = 0;
886
887 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
888 struct pldm_event_message_buffer_size_resp* resp =
889 reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
890 response->payload);
891 resp->completion_code = completionCode;
892 resp->terminus_max_buffer_size = terminusMaxBufferSize;
893
894 auto rc =
895 decode_event_message_buffer_size_resp(response, 0, nullptr, nullptr);
896 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
897
898 rc = decode_event_message_buffer_size_resp(
899 response, responseMsg.size(), &retCompletionCode, &retMaxBufferSize);
900 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
901}
902
Andrew Jeffery9c766792022-08-10 23:12:49 +0930903TEST(PlatformEventMessage, testGoodStateSensorDecodeRequest)
904{
905 std::array<uint8_t,
906 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
907 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES>
908 requestMsg{};
909
910 uint8_t retFormatVersion = 0;
911 uint8_t retTid = 0;
912 uint8_t retEventClass = 0;
913 size_t retEventDataOffset = 0;
914
915 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
916 struct pldm_platform_event_message_req* request =
917 reinterpret_cast<struct pldm_platform_event_message_req*>(req->payload);
918
919 uint8_t formatVersion = 0x01;
920 uint8_t tid = 0x02;
921 // Sensor Event
922 uint8_t eventClass = 0x00;
923
924 request->format_version = formatVersion;
925 request->tid = tid;
926 request->event_class = eventClass;
927 size_t eventDataOffset =
928 sizeof(formatVersion) + sizeof(tid) + sizeof(eventClass);
929
930 auto rc = decode_platform_event_message_req(
931 req, requestMsg.size() - hdrSize, &retFormatVersion, &retTid,
932 &retEventClass, &retEventDataOffset);
933
934 EXPECT_EQ(rc, PLDM_SUCCESS);
935 EXPECT_EQ(retFormatVersion, formatVersion);
936 EXPECT_EQ(retTid, tid);
937 EXPECT_EQ(retEventClass, eventClass);
938 EXPECT_EQ(retEventDataOffset, eventDataOffset);
939}
940
941TEST(PlatformEventMessage, testBadDecodeRequest)
942{
943 const struct pldm_msg* msg = NULL;
944 std::array<uint8_t,
945 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
946 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
947 requestMsg{};
948 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
949 uint8_t retFormatVersion;
950 uint8_t retTid = 0;
951 uint8_t retEventClass = 0;
952 size_t retEventDataOffset;
953
954 auto rc = decode_platform_event_message_req(msg, sizeof(*msg), NULL, NULL,
955 NULL, NULL);
956 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
957
958 rc = decode_platform_event_message_req(
959 req,
960 requestMsg.size() - hdrSize -
961 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES,
962 &retFormatVersion, &retTid, &retEventClass, &retEventDataOffset);
963 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
964}
965
966TEST(PlatformEventMessage, testGoodEncodeResponse)
967{
968 std::array<uint8_t,
969 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
970 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
971 responseMsg{};
972 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
973 uint8_t completionCode = 0;
974 uint8_t instanceId = 0x01;
975 uint8_t platformEventStatus = 0x01;
976
977 auto rc = encode_platform_event_message_resp(instanceId, PLDM_SUCCESS,
978 platformEventStatus, response);
979
980 EXPECT_EQ(rc, PLDM_SUCCESS);
981 EXPECT_EQ(completionCode, response->payload[0]);
982 EXPECT_EQ(platformEventStatus, response->payload[1]);
983}
984
985TEST(PlatformEventMessage, testBadEncodeResponse)
986{
987 auto rc = encode_platform_event_message_resp(0, PLDM_SUCCESS, 1, NULL);
988 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
989}
990
991TEST(PlatformEventMessage, testGoodEncodeRequest)
992{
993 uint8_t formatVersion = 0x01;
994 uint8_t Tid = 0x03;
995 uint8_t eventClass = 0x00;
996 uint8_t eventData = 34;
997
998 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
999 sizeof(eventData)>
1000 requestMsg{};
1001
1002 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1003 auto rc = encode_platform_event_message_req(
1004 0, formatVersion, Tid, eventClass,
1005 reinterpret_cast<uint8_t*>(&eventData), sizeof(eventData), request,
1006 sizeof(eventData) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
1007
1008 struct pldm_platform_event_message_req* req =
1009 reinterpret_cast<struct pldm_platform_event_message_req*>(
1010 request->payload);
1011
1012 EXPECT_EQ(rc, PLDM_SUCCESS);
1013 EXPECT_EQ(formatVersion, req->format_version);
1014 EXPECT_EQ(Tid, req->tid);
1015 EXPECT_EQ(eventClass, req->event_class);
1016 EXPECT_EQ(0, memcmp(&eventData, req->event_data, sizeof(eventData)));
1017}
1018
1019TEST(PlatformEventMessage, testBadEncodeRequest)
1020{
1021 uint8_t Tid = 0x03;
1022 uint8_t eventClass = 0x00;
1023 uint8_t eventData = 34;
1024 size_t sz_eventData = sizeof(eventData);
1025 size_t payloadLen =
1026 sz_eventData + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES;
1027 uint8_t formatVersion = 0x01;
1028
1029 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
1030 sizeof(eventData)>
1031 requestMsg{};
1032 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1033
1034 auto rc = encode_platform_event_message_req(
1035 0, formatVersion, Tid, eventClass,
1036 reinterpret_cast<uint8_t*>(&eventData), sz_eventData, nullptr,
1037 payloadLen);
1038 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1039 rc = encode_platform_event_message_req(
1040 0, 0, Tid, eventClass, reinterpret_cast<uint8_t*>(&eventData),
1041 sz_eventData, request, payloadLen);
1042 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1043 rc = encode_platform_event_message_req(0, formatVersion, Tid, eventClass,
1044 nullptr, 0, request, payloadLen);
1045 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1046 rc = encode_platform_event_message_req(
1047 0, formatVersion, Tid, eventClass,
1048 reinterpret_cast<uint8_t*>(&eventData), sz_eventData, request, 0);
1049 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1050}
1051
1052TEST(PlatformEventMessage, testGoodDecodeResponse)
1053{
1054 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
1055 responseMsg{};
1056
1057 uint8_t completionCode = PLDM_SUCCESS;
1058 uint8_t platformEventStatus = 0x01;
1059
1060 uint8_t retcompletionCode;
1061 uint8_t retplatformEventStatus;
1062
1063 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1064 struct pldm_platform_event_message_resp* resp =
1065 reinterpret_cast<struct pldm_platform_event_message_resp*>(
1066 response->payload);
1067
1068 resp->completion_code = completionCode;
1069 resp->platform_event_status = platformEventStatus;
1070
1071 auto rc = decode_platform_event_message_resp(
1072 response, responseMsg.size() - hdrSize, &retcompletionCode,
1073 &retplatformEventStatus);
1074
1075 EXPECT_EQ(rc, PLDM_SUCCESS);
1076 EXPECT_EQ(completionCode, retcompletionCode);
1077 EXPECT_EQ(platformEventStatus, retplatformEventStatus);
1078}
1079
1080TEST(PlatformEventMessage, testBadDecodeResponse)
1081{
1082 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
1083 responseMsg{};
1084
1085 uint8_t completionCode = PLDM_SUCCESS;
1086 uint8_t platformEventStatus = 0x01;
1087
1088 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1089 struct pldm_platform_event_message_resp* resp =
1090 reinterpret_cast<struct pldm_platform_event_message_resp*>(
1091 response->payload);
1092 resp->completion_code = completionCode;
1093 resp->platform_event_status = platformEventStatus;
1094
1095 auto rc = decode_platform_event_message_resp(
1096 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr);
1097
1098 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1099
1100 rc = decode_platform_event_message_resp(
1101 response, responseMsg.size() - hdrSize - 1, &completionCode,
1102 &platformEventStatus);
1103
1104 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1105}
1106
1107TEST(PlatformEventMessage, testGoodSensorEventDataDecodeRequest)
1108{
1109 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH +
1110 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
1111 eventDataArr{};
1112 uint16_t sensorId = 0x1234;
1113 uint8_t sensorEventClassType = PLDM_SENSOR_OP_STATE;
1114
1115 struct pldm_sensor_event_data* eventData =
1116 (struct pldm_sensor_event_data*)eventDataArr.data();
1117 eventData->sensor_id = sensorId;
1118 eventData->sensor_event_class_type = sensorEventClassType;
1119
1120 size_t retSensorOpDataOffset;
1121 uint16_t retSensorId = 0;
1122 uint8_t retSensorEventClassType;
1123 size_t sensorOpDataOffset = sizeof(sensorId) + sizeof(sensorEventClassType);
1124 auto rc = decode_sensor_event_data(
1125 reinterpret_cast<uint8_t*>(eventData), eventDataArr.size(),
1126 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1127 EXPECT_EQ(rc, PLDM_SUCCESS);
1128 EXPECT_EQ(retSensorId, sensorId);
1129 EXPECT_EQ(retSensorEventClassType, sensorEventClassType);
1130 EXPECT_EQ(retSensorOpDataOffset, sensorOpDataOffset);
1131}
1132
1133TEST(PlatformEventMessage, testBadSensorEventDataDecodeRequest)
1134{
1135
1136 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH +
1137 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
1138 eventDataArr{};
1139
1140 struct pldm_sensor_event_data* eventData =
1141 (struct pldm_sensor_event_data*)eventDataArr.data();
1142
1143 size_t retSensorOpDataOffset;
1144 uint16_t retSensorId = 0;
1145 uint8_t retSensorEventClassType;
1146 auto rc = decode_sensor_event_data(NULL, eventDataArr.size(), &retSensorId,
1147 &retSensorEventClassType,
1148 &retSensorOpDataOffset);
1149 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1150
1151 rc = decode_sensor_event_data(
1152 reinterpret_cast<uint8_t*>(eventDataArr.data()),
1153 eventDataArr.size() -
1154 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH,
1155 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1156 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1157
1158 eventData->sensor_event_class_type = PLDM_SENSOR_OP_STATE;
1159
1160 rc = decode_sensor_event_data(
1161 reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
1162 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1163 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1164
1165 eventData->sensor_event_class_type = PLDM_STATE_SENSOR_STATE;
1166 rc = decode_sensor_event_data(
1167 reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
1168 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1169 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1170
1171 eventData->sensor_event_class_type = PLDM_NUMERIC_SENSOR_STATE;
1172 rc = decode_sensor_event_data(
1173 reinterpret_cast<uint8_t*>(eventDataArr.data()),
1174 eventDataArr.size() + 1, &retSensorId, &retSensorEventClassType,
1175 &retSensorOpDataOffset);
1176 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1177}
1178
1179TEST(PlatformEventMessage, testGoodSensorOpEventDataDecodeRequest)
1180{
1181 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
1182 eventDataArr{};
1183
1184 struct pldm_sensor_event_sensor_op_state* sensorData =
1185 (struct pldm_sensor_event_sensor_op_state*)eventDataArr.data();
1186 uint8_t presentState = PLDM_SENSOR_ENABLED;
1187 uint8_t previousState = PLDM_SENSOR_INITIALIZING;
1188 sensorData->present_op_state = presentState;
1189 sensorData->previous_op_state = previousState;
1190
1191 uint8_t retPresentState;
1192 uint8_t retPreviousState;
1193 auto rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData),
1194 eventDataArr.size(), &retPresentState,
1195 &retPreviousState);
1196 EXPECT_EQ(rc, PLDM_SUCCESS);
1197 EXPECT_EQ(retPresentState, presentState);
1198 EXPECT_EQ(retPreviousState, previousState);
1199}
1200
1201TEST(PlatformEventMessage, testBadSensorOpEventDataDecodeRequest)
1202{
1203 uint8_t presentOpState;
1204 uint8_t previousOpState;
1205 size_t sensorDataLength = PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH;
1206 auto rc = decode_sensor_op_data(NULL, sensorDataLength, &presentOpState,
1207 &previousOpState);
1208 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1209
1210 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
1211 sensorData{};
1212 rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1213 sensorDataLength + 1, &presentOpState,
1214 &previousOpState);
1215 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1216
1217 rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1218 sensorDataLength, nullptr, &previousOpState);
1219 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1220}
1221
1222TEST(PlatformEventMessage, testGoodSensorStateEventDataDecodeRequest)
1223{
1224 std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
1225 eventDataArr{};
1226
1227 struct pldm_sensor_event_state_sensor_state* sensorData =
1228 (struct pldm_sensor_event_state_sensor_state*)eventDataArr.data();
1229 uint8_t sensorOffset = 0x02;
1230 uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
1231 uint8_t previousEventState = PLDM_SENSOR_INTEST;
1232 sensorData->sensor_offset = sensorOffset;
1233 sensorData->event_state = eventState;
1234 sensorData->previous_event_state = previousEventState;
1235
1236 uint8_t retSensorOffset;
1237 uint8_t retEventState;
1238 uint8_t retPreviousState;
1239 auto rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
1240 eventDataArr.size(), &retSensorOffset,
1241 &retEventState, &retPreviousState);
1242 EXPECT_EQ(rc, PLDM_SUCCESS);
1243 EXPECT_EQ(retSensorOffset, sensorOffset);
1244 EXPECT_EQ(retEventState, eventState);
1245 EXPECT_EQ(retPreviousState, previousEventState);
1246}
1247
1248TEST(PlatformEventMessage, testBadStateSensorEventDataDecodeRequest)
1249{
1250 uint8_t sensorOffset;
1251 uint8_t eventState;
1252 uint8_t previousEventState;
1253 size_t sensorDataLength = PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH;
1254 auto rc = decode_state_sensor_data(NULL, sensorDataLength, &sensorOffset,
1255 &eventState, &previousEventState);
1256 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1257
1258 std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
1259 sensorData{};
1260 rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1261 sensorDataLength - 1, &sensorOffset,
1262 &eventState, &previousEventState);
1263 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1264
1265 rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1266 sensorDataLength, &sensorOffset, nullptr,
1267 &previousEventState);
1268 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1269}
1270
1271TEST(PlatformEventMessage, testGoodNumericSensorEventDataDecodeRequest)
1272{
1273 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
1274 eventDataArr{};
1275 struct pldm_sensor_event_numeric_sensor_state* sensorData =
1276 (struct pldm_sensor_event_numeric_sensor_state*)eventDataArr.data();
1277
1278 size_t sensorDataLength =
1279 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_32BIT_DATA_LENGTH;
1280 uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
1281 uint8_t previousEventState = PLDM_SENSOR_INTEST;
1282 uint8_t sensorDataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
1283 uint32_t presentReading = 305441741;
1284 sensorData->event_state = eventState;
1285 sensorData->previous_event_state = previousEventState;
1286 sensorData->sensor_data_size = sensorDataSize;
1287 sensorData->present_reading[3] =
1288 static_cast<uint8_t>(htole32(presentReading) & (0x000000ff));
1289 sensorData->present_reading[2] =
1290 static_cast<uint8_t>((htole32(presentReading) & (0x0000ff00)) >> 8);
1291 sensorData->present_reading[1] =
1292 static_cast<uint8_t>((htole32(presentReading) & (0x00ff0000)) >> 16);
1293 sensorData->present_reading[0] =
1294 static_cast<uint8_t>((htole32(presentReading) & (0xff000000)) >> 24);
1295
1296 uint8_t retEventState;
1297 uint8_t retPreviousEventState;
1298 uint8_t retSensorDataSize;
1299 uint32_t retPresentReading;
1300
1301 auto rc = decode_numeric_sensor_data(
1302 reinterpret_cast<uint8_t*>(sensorData), sensorDataLength,
1303 &retEventState, &retPreviousEventState, &retSensorDataSize,
1304 &retPresentReading);
1305 EXPECT_EQ(rc, PLDM_SUCCESS);
1306 EXPECT_EQ(retEventState, eventState);
1307 EXPECT_EQ(retPreviousEventState, previousEventState);
1308 EXPECT_EQ(retSensorDataSize, sensorDataSize);
1309 EXPECT_EQ(retPresentReading, presentReading);
1310
1311 int16_t presentReadingNew = -31432;
1312 sensorData->present_reading[1] =
1313 static_cast<uint8_t>(htole16(presentReadingNew) & (0x000000ff));
1314 sensorData->present_reading[0] =
1315 static_cast<uint8_t>((htole16(presentReadingNew) & (0x0000ff00)) >> 8);
1316 sensorDataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
1317 sensorData->sensor_data_size = sensorDataSize;
1318 sensorDataLength = PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_16BIT_DATA_LENGTH;
1319
1320 rc = decode_numeric_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
1321 sensorDataLength, &retEventState,
1322 &retPreviousEventState, &retSensorDataSize,
1323 &retPresentReading);
1324 EXPECT_EQ(rc, PLDM_SUCCESS);
1325 EXPECT_EQ(retEventState, eventState);
1326 EXPECT_EQ(retPreviousEventState, previousEventState);
1327 EXPECT_EQ(retSensorDataSize, sensorDataSize);
1328 EXPECT_EQ(static_cast<int16_t>(retPresentReading), presentReadingNew);
1329}
1330
1331TEST(PlatformEventMessage, testBadNumericSensorEventDataDecodeRequest)
1332{
1333 uint8_t eventState;
1334 uint8_t previousEventState;
1335 uint8_t sensorDataSize;
1336 uint32_t presentReading;
1337 size_t sensorDataLength =
1338 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH;
1339 auto rc = decode_numeric_sensor_data(NULL, sensorDataLength, &eventState,
1340 &previousEventState, &sensorDataSize,
1341 &presentReading);
1342 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1343
1344 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
1345 sensorData{};
1346 rc = decode_numeric_sensor_data(
1347 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength - 1,
1348 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1349 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1350
1351 struct pldm_sensor_event_numeric_sensor_state* numericSensorData =
1352 (struct pldm_sensor_event_numeric_sensor_state*)sensorData.data();
1353 numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT8;
1354 rc = decode_numeric_sensor_data(
1355 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
1356 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1357 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1358
1359 numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT16;
1360 rc = decode_numeric_sensor_data(
1361 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
1362 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1363 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1364
1365 numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT32;
1366 rc = decode_numeric_sensor_data(
1367 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength - 1,
1368 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1369 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1370}
1371
1372TEST(GetNumericEffecterValue, testGoodEncodeRequest)
1373{
1374 std::vector<uint8_t> requestMsg(hdrSize +
1375 PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES);
1376
1377 uint16_t effecter_id = 0xAB01;
1378
1379 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1380
1381 auto rc = encode_get_numeric_effecter_value_req(0, effecter_id, request);
1382
1383 struct pldm_get_numeric_effecter_value_req* req =
1384 reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
1385 request->payload);
1386
1387 EXPECT_EQ(rc, PLDM_SUCCESS);
1388 EXPECT_EQ(effecter_id, le16toh(req->effecter_id));
1389}
1390
1391TEST(GetNumericEffecterValue, testBadEncodeRequest)
1392{
1393 std::vector<uint8_t> requestMsg(
1394 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
1395
1396 auto rc = encode_get_numeric_effecter_value_req(0, 0, nullptr);
1397 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1398}
1399
1400TEST(GetNumericEffecterValue, testGoodDecodeRequest)
1401{
1402 std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
1403 requestMsg{};
1404
1405 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1406 struct pldm_get_numeric_effecter_value_req* req =
1407 reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
1408 request->payload);
1409
1410 uint16_t effecter_id = 0x12AB;
1411 req->effecter_id = htole16(effecter_id);
1412
1413 uint16_t reteffecter_id;
1414
1415 auto rc = decode_get_numeric_effecter_value_req(
1416 request, requestMsg.size() - hdrSize, &reteffecter_id);
1417
1418 EXPECT_EQ(rc, PLDM_SUCCESS);
1419 EXPECT_EQ(effecter_id, reteffecter_id);
1420}
1421
1422TEST(GetNumericEffecterValue, testBadDecodeRequest)
1423{
1424 std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
1425 requestMsg{};
1426
1427 auto rc = decode_get_numeric_effecter_value_req(
1428 nullptr, requestMsg.size() - hdrSize, nullptr);
1429
1430 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1431
1432 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1433 struct pldm_set_numeric_effecter_value_req* req =
1434 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
1435 request->payload);
1436
1437 uint16_t effecter_id = 0x1A;
1438 req->effecter_id = htole16(effecter_id);
1439 uint16_t reteffecter_id;
1440
1441 rc = decode_get_numeric_effecter_value_req(
1442 request, requestMsg.size() - hdrSize - 1, &reteffecter_id);
1443
1444 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1445}
1446
1447TEST(GetNumericEffecterValue, testGoodEncodeResponse)
1448{
1449 uint8_t completionCode = 0;
1450 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
1451 uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
1452 uint32_t pendingValue = 0x12345678;
1453 uint32_t presentValue = 0xABCDEF11;
1454
1455 std::array<uint8_t,
1456 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
1457 responseMsg{};
1458 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1459
1460 auto rc = encode_get_numeric_effecter_value_resp(
1461 0, completionCode, effecter_dataSize, effecter_operState,
1462 reinterpret_cast<uint8_t*>(&pendingValue),
1463 reinterpret_cast<uint8_t*>(&presentValue), response,
1464 responseMsg.size() - hdrSize);
1465
1466 struct pldm_get_numeric_effecter_value_resp* resp =
1467 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
1468 response->payload);
1469
1470 uint32_t* val_pending = (uint32_t*)(&resp->pending_and_present_values[0]);
1471 *val_pending = le32toh(*val_pending);
1472 uint32_t* val_present = (uint32_t*)(&resp->pending_and_present_values[4]);
1473 *val_present = le32toh(*val_present);
1474
1475 EXPECT_EQ(rc, PLDM_SUCCESS);
1476 EXPECT_EQ(effecter_dataSize, resp->effecter_data_size);
1477 EXPECT_EQ(effecter_operState, resp->effecter_oper_state);
1478 EXPECT_EQ(pendingValue, *val_pending);
1479 EXPECT_EQ(presentValue, *val_present);
1480}
1481
1482TEST(GetNumericEffecterValue, testBadEncodeResponse)
1483{
1484 std::array<uint8_t,
1485 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
1486 responseMsg{};
1487 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1488
1489 uint8_t pendingValue = 0x01;
1490 uint8_t presentValue = 0x02;
1491
1492 auto rc = encode_get_numeric_effecter_value_resp(
1493 0, PLDM_SUCCESS, 0, 0, nullptr, nullptr, nullptr,
1494 responseMsg.size() - hdrSize);
1495 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1496
1497 rc = encode_get_numeric_effecter_value_resp(
1498 0, PLDM_SUCCESS, 6, 9, reinterpret_cast<uint8_t*>(&pendingValue),
1499 reinterpret_cast<uint8_t*>(&presentValue), response,
1500 responseMsg.size() - hdrSize);
1501 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1502
1503 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
1504 uint8_t effecter_operState = EFFECTER_OPER_STATE_FAILED;
1505
1506 rc = encode_get_numeric_effecter_value_resp(
1507 0, PLDM_SUCCESS, effecter_dataSize, effecter_operState,
1508 reinterpret_cast<uint8_t*>(&pendingValue),
1509 reinterpret_cast<uint8_t*>(&presentValue), response,
1510 responseMsg.size() - hdrSize);
1511 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1512}
1513
1514TEST(GetNumericEffecterValue, testGoodDecodeResponse)
1515{
1516 std::array<uint8_t,
1517 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
1518 responseMsg{};
1519
1520 uint8_t completionCode = 0;
1521 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT16;
1522 uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
1523 uint16_t pendingValue = 0x4321;
1524 uint16_t presentValue = 0xDCBA;
1525
1526 uint8_t retcompletionCode;
1527 uint8_t reteffecter_dataSize;
1528 uint8_t reteffecter_operState;
1529 uint8_t retpendingValue[2];
1530 uint8_t retpresentValue[2];
1531
1532 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1533 struct pldm_get_numeric_effecter_value_resp* resp =
1534 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
1535 response->payload);
1536
1537 resp->completion_code = completionCode;
1538 resp->effecter_data_size = effecter_dataSize;
1539 resp->effecter_oper_state = effecter_operState;
1540
1541 uint16_t pendingValue_le = htole16(pendingValue);
1542 memcpy(resp->pending_and_present_values, &pendingValue_le,
1543 sizeof(pendingValue_le));
1544 uint16_t presentValue_le = htole16(presentValue);
1545 memcpy(&resp->pending_and_present_values[2], &presentValue_le,
1546 sizeof(presentValue_le));
1547
1548 auto rc = decode_get_numeric_effecter_value_resp(
1549 response, responseMsg.size() - hdrSize, &retcompletionCode,
1550 &reteffecter_dataSize, &reteffecter_operState, retpendingValue,
1551 retpresentValue);
1552
1553 EXPECT_EQ(rc, PLDM_SUCCESS);
1554 EXPECT_EQ(completionCode, retcompletionCode);
1555 EXPECT_EQ(effecter_dataSize, reteffecter_dataSize);
1556 EXPECT_EQ(effecter_operState, reteffecter_operState);
1557 EXPECT_EQ(pendingValue, *(reinterpret_cast<uint16_t*>(retpendingValue)));
1558 EXPECT_EQ(presentValue, *(reinterpret_cast<uint16_t*>(retpresentValue)));
1559}
1560
1561TEST(GetNumericEffecterValue, testBadDecodeResponse)
1562{
1563 std::array<uint8_t,
1564 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
1565 responseMsg{};
1566
1567 auto rc = decode_get_numeric_effecter_value_resp(
1568 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
1569 nullptr, nullptr);
1570
1571 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1572
1573 uint8_t completionCode = 0;
1574 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_SINT16;
1575 uint8_t effecter_operState = EFFECTER_OPER_STATE_DISABLED;
1576 uint16_t pendingValue = 0x5678;
1577 uint16_t presentValue = 0xCDEF;
1578
1579 uint8_t retcompletionCode;
1580 uint8_t reteffecter_dataSize;
1581 uint8_t reteffecter_operState;
1582 uint8_t retpendingValue[2];
1583 uint8_t retpresentValue[2];
1584
1585 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1586 struct pldm_get_numeric_effecter_value_resp* resp =
1587 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
1588 response->payload);
1589
1590 resp->completion_code = completionCode;
1591 resp->effecter_data_size = effecter_dataSize;
1592 resp->effecter_oper_state = effecter_operState;
1593
1594 uint16_t pendingValue_le = htole16(pendingValue);
1595 memcpy(resp->pending_and_present_values, &pendingValue_le,
1596 sizeof(pendingValue_le));
1597 uint16_t presentValue_le = htole16(presentValue);
1598 memcpy(&resp->pending_and_present_values[2], &presentValue_le,
1599 sizeof(presentValue_le));
1600
1601 rc = decode_get_numeric_effecter_value_resp(
1602 response, responseMsg.size() - hdrSize, &retcompletionCode,
1603 &reteffecter_dataSize, &reteffecter_operState, retpendingValue,
1604 retpresentValue);
1605
1606 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1607}
1608
1609TEST(PldmPDRRepositoryChgEventEvent, testGoodDecodeRequest)
1610{
1611 const uint8_t eventDataFormat = FORMAT_IS_PDR_HANDLES;
1612 const uint8_t numberOfChangeRecords = 2;
1613 uint8_t eventDataOperation1 = PLDM_RECORDS_DELETED;
1614 const uint8_t numberOfChangeEntries1 = 2;
1615 std::array<uint32_t, numberOfChangeEntries1> changeRecordArr1{
1616 {0x00000000, 0x12345678}};
1617 uint8_t eventDataOperation2 = PLDM_RECORDS_ADDED;
1618 const uint8_t numberOfChangeEntries2 = 5;
1619 std::array<uint32_t, numberOfChangeEntries2> changeRecordArr2{
1620 {0x01234567, 0x11223344, 0x45678901, 0x21222324, 0x98765432}};
1621 std::array<uint8_t, PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH +
1622 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH *
1623 numberOfChangeRecords +
1624 (numberOfChangeEntries1 + numberOfChangeEntries2) *
1625 sizeof(uint32_t)>
1626 eventDataArr{};
1627
1628 struct pldm_pdr_repository_chg_event_data* eventData =
1629 reinterpret_cast<struct pldm_pdr_repository_chg_event_data*>(
1630 eventDataArr.data());
1631 eventData->event_data_format = eventDataFormat;
1632 eventData->number_of_change_records = numberOfChangeRecords;
1633 struct pldm_pdr_repository_change_record_data* changeRecord1 =
1634 reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
1635 eventData->change_records);
1636 changeRecord1->event_data_operation = eventDataOperation1;
1637 changeRecord1->number_of_change_entries = numberOfChangeEntries1;
1638 memcpy(changeRecord1->change_entry, &changeRecordArr1[0],
1639 changeRecordArr1.size() * sizeof(uint32_t));
1640 struct pldm_pdr_repository_change_record_data* changeRecord2 =
1641 reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
1642 eventData->change_records +
1643 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH +
1644 (changeRecordArr1.size() * sizeof(uint32_t)));
1645 changeRecord2->event_data_operation = eventDataOperation2;
1646 changeRecord2->number_of_change_entries = numberOfChangeEntries2;
1647 memcpy(changeRecord2->change_entry, &changeRecordArr2[0],
1648 changeRecordArr2.size() * sizeof(uint32_t));
1649
1650 uint8_t retEventDataFormat{};
1651 uint8_t retNumberOfChangeRecords{};
1652 size_t retChangeRecordDataOffset{0};
1653 auto rc = decode_pldm_pdr_repository_chg_event_data(
1654 reinterpret_cast<const uint8_t*>(eventData), eventDataArr.size(),
1655 &retEventDataFormat, &retNumberOfChangeRecords,
1656 &retChangeRecordDataOffset);
1657 EXPECT_EQ(rc, PLDM_SUCCESS);
1658 EXPECT_EQ(retEventDataFormat, FORMAT_IS_PDR_HANDLES);
1659 EXPECT_EQ(retNumberOfChangeRecords, numberOfChangeRecords);
1660
1661 const uint8_t* changeRecordData =
1662 reinterpret_cast<const uint8_t*>(changeRecord1);
1663 size_t changeRecordDataSize =
1664 eventDataArr.size() - PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH;
1665 uint8_t retEventDataOperation;
1666 uint8_t retNumberOfChangeEntries;
1667 size_t retChangeEntryDataOffset;
1668
1669 rc = decode_pldm_pdr_repository_change_record_data(
1670 reinterpret_cast<const uint8_t*>(changeRecordData),
1671 changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
1672 &retChangeEntryDataOffset);
1673 EXPECT_EQ(rc, PLDM_SUCCESS);
1674 EXPECT_EQ(retEventDataOperation, eventDataOperation1);
1675 EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries1);
1676 changeRecordData += retChangeEntryDataOffset;
1677 EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr1[0],
1678 sizeof(uint32_t) * retNumberOfChangeEntries));
1679
1680 changeRecordData += sizeof(uint32_t) * retNumberOfChangeEntries;
1681 changeRecordDataSize -= sizeof(uint32_t) * retNumberOfChangeEntries -
1682 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH;
1683 rc = decode_pldm_pdr_repository_change_record_data(
1684 reinterpret_cast<const uint8_t*>(changeRecordData),
1685 changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
1686 &retChangeEntryDataOffset);
1687 EXPECT_EQ(rc, PLDM_SUCCESS);
1688 EXPECT_EQ(retEventDataOperation, eventDataOperation2);
1689 EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries2);
1690 changeRecordData += retChangeEntryDataOffset;
1691 EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr2[0],
1692 sizeof(uint32_t) * retNumberOfChangeEntries));
1693}
1694
1695TEST(PldmPDRRepositoryChgEventEvent, testBadDecodeRequest)
1696{
1697 uint8_t eventDataFormat{};
1698 uint8_t numberOfChangeRecords{};
1699 size_t changeRecordDataOffset{};
1700 auto rc = decode_pldm_pdr_repository_chg_event_data(
1701 NULL, 0, &eventDataFormat, &numberOfChangeRecords,
1702 &changeRecordDataOffset);
1703 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1704
1705 std::array<uint8_t, 2> eventData{};
1706 rc = decode_pldm_pdr_repository_chg_event_data(
1707 reinterpret_cast<const uint8_t*>(eventData.data()), 0, &eventDataFormat,
1708 &numberOfChangeRecords, &changeRecordDataOffset);
1709 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1710
1711 uint8_t eventDataOperation{};
1712 uint8_t numberOfChangeEntries{};
1713 size_t changeEntryDataOffset{};
1714 rc = decode_pldm_pdr_repository_change_record_data(
1715 NULL, 0, &eventDataOperation, &numberOfChangeEntries,
1716 &changeEntryDataOffset);
1717 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1718
1719 std::array<uint8_t, 2> changeRecord{};
1720 rc = decode_pldm_pdr_repository_change_record_data(
1721 reinterpret_cast<const uint8_t*>(changeRecord.data()), 0,
1722 &eventDataOperation, &numberOfChangeEntries, &changeEntryDataOffset);
1723 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1724}
1725
1726TEST(GetSensorReading, testGoodEncodeRequest)
1727{
1728 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
1729 requestMsg{};
1730
1731 uint16_t sensorId = 0x1234;
1732 bool8_t rearmEventState = 0x01;
1733
1734 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1735 auto rc =
1736 encode_get_sensor_reading_req(0, sensorId, rearmEventState, request);
1737
1738 struct pldm_get_sensor_reading_req* req =
1739 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
1740
1741 EXPECT_EQ(rc, PLDM_SUCCESS);
1742 EXPECT_EQ(sensorId, le16toh(req->sensor_id));
1743 EXPECT_EQ(rearmEventState, req->rearm_event_state);
1744}
1745
1746TEST(GetSensorReading, testBadEncodeRequest)
1747{
1748 auto rc = encode_get_sensor_reading_req(0, 0, 0, nullptr);
1749
1750 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1751}
1752
1753TEST(GetSensorReading, testGoodDecodeRequest)
1754{
1755 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
1756 requestMsg{};
1757
1758 uint16_t sensorId = 0xABCD;
1759 bool8_t rearmEventState = 0xA;
1760
1761 uint16_t retsensorId;
1762 bool8_t retrearmEventState;
1763
1764 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1765
1766 struct pldm_get_sensor_reading_req* req =
1767 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
1768
1769 req->sensor_id = htole16(sensorId);
1770 req->rearm_event_state = rearmEventState;
1771
1772 auto rc =
1773 decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize,
1774 &retsensorId, &retrearmEventState);
1775
1776 EXPECT_EQ(rc, PLDM_SUCCESS);
1777 EXPECT_EQ(sensorId, retsensorId);
1778 EXPECT_EQ(rearmEventState, retrearmEventState);
1779}
1780
1781TEST(GetSensorReading, testBadDecodeRequest)
1782{
1783 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
1784 requestMsg{};
1785
1786 auto rc = decode_get_sensor_reading_req(
1787 nullptr, requestMsg.size() - hdrSize, nullptr, nullptr);
1788 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1789
1790 uint16_t sensorId = 0xABCD;
1791 bool8_t rearmEventState = 0xA;
1792
1793 uint16_t retsensorId;
1794 bool8_t retrearmEventState;
1795
1796 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1797
1798 struct pldm_get_sensor_reading_req* req =
1799 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
1800
1801 req->sensor_id = htole16(sensorId);
1802 req->rearm_event_state = rearmEventState;
1803
1804 rc = decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize - 1,
1805 &retsensorId, &retrearmEventState);
1806
1807 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1808}
1809
1810TEST(GetSensorReading, testGoodEncodeResponse)
1811{
1812 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES>
1813 responseMsg{};
1814
1815 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1816
1817 uint8_t completionCode = 0;
1818 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
1819 uint8_t sensor_operationalState = PLDM_SENSOR_ENABLED;
1820 uint8_t sensor_event_messageEnable = PLDM_NO_EVENT_GENERATION;
1821 uint8_t presentState = PLDM_SENSOR_NORMAL;
1822 uint8_t previousState = PLDM_SENSOR_WARNING;
1823 uint8_t eventState = PLDM_SENSOR_UPPERWARNING;
1824 uint8_t presentReading = 0x21;
1825
1826 auto rc = encode_get_sensor_reading_resp(
1827 0, completionCode, sensor_dataSize, sensor_operationalState,
1828 sensor_event_messageEnable, presentState, previousState, eventState,
1829 reinterpret_cast<uint8_t*>(&presentReading), response,
1830 responseMsg.size() - hdrSize);
1831
1832 struct pldm_get_sensor_reading_resp* resp =
1833 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
1834 response->payload);
1835
1836 EXPECT_EQ(rc, PLDM_SUCCESS);
1837 EXPECT_EQ(completionCode, resp->completion_code);
1838 EXPECT_EQ(sensor_dataSize, resp->sensor_data_size);
1839 EXPECT_EQ(sensor_operationalState, resp->sensor_operational_state);
1840 EXPECT_EQ(sensor_event_messageEnable, resp->sensor_event_message_enable);
1841 EXPECT_EQ(presentState, resp->present_state);
1842 EXPECT_EQ(previousState, resp->previous_state);
1843 EXPECT_EQ(eventState, resp->event_state);
1844 EXPECT_EQ(presentReading,
1845 *(reinterpret_cast<uint8_t*>(&resp->present_reading[0])));
1846}
1847
1848TEST(GetSensorReading, testBadEncodeResponse)
1849{
1850 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
1851 responseMsg{};
1852
1853 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1854
1855 uint8_t presentReading = 0x1;
1856
1857 auto rc = encode_get_sensor_reading_resp(0, PLDM_SUCCESS, 0, 0, 0, 0, 0, 0,
1858 nullptr, nullptr,
1859 responseMsg.size() - hdrSize);
1860 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1861
1862 rc = encode_get_sensor_reading_resp(
1863 0, PLDM_SUCCESS, 6, 1, 1, 1, 1, 1,
1864 reinterpret_cast<uint8_t*>(&presentReading), response,
1865 responseMsg.size() - hdrSize);
1866 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1867
1868 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
1869
1870 rc = encode_get_sensor_reading_resp(
1871 0, PLDM_SUCCESS, sensor_dataSize, 1, 1, 1, 1, 1,
1872 reinterpret_cast<uint8_t*>(&presentReading), response,
1873 responseMsg.size() - hdrSize);
1874 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1875}
1876
1877TEST(GetSensorReading, testGoodDecodeResponse)
1878{
1879 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
1880 responseMsg{};
1881
1882 uint8_t completionCode = 0;
1883 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
1884 uint8_t sensor_operationalState = PLDM_SENSOR_STATUSUNKOWN;
1885 uint8_t sensor_event_messageEnable = PLDM_EVENTS_ENABLED;
1886 uint8_t presentState = PLDM_SENSOR_CRITICAL;
1887 uint8_t previousState = PLDM_SENSOR_UPPERCRITICAL;
1888 uint8_t eventState = PLDM_SENSOR_WARNING;
1889 uint32_t presentReading = 0xABCDEF11;
1890
1891 uint8_t retcompletionCode;
1892 uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
1893 uint8_t retsensor_operationalState;
1894 uint8_t retsensor_event_messageEnable;
1895 uint8_t retpresentState;
1896 uint8_t retpreviousState;
1897 uint8_t reteventState;
1898 uint8_t retpresentReading[4];
1899
1900 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1901 struct pldm_get_sensor_reading_resp* resp =
1902 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
1903 response->payload);
1904
1905 resp->completion_code = completionCode;
1906 resp->sensor_data_size = sensor_dataSize;
1907 resp->sensor_operational_state = sensor_operationalState;
1908 resp->sensor_event_message_enable = sensor_event_messageEnable;
1909 resp->present_state = presentState;
1910 resp->previous_state = previousState;
1911 resp->event_state = eventState;
1912
1913 uint32_t presentReading_le = htole32(presentReading);
1914 memcpy(resp->present_reading, &presentReading_le,
1915 sizeof(presentReading_le));
1916
1917 auto rc = decode_get_sensor_reading_resp(
1918 response, responseMsg.size() - hdrSize, &retcompletionCode,
1919 &retsensor_dataSize, &retsensor_operationalState,
1920 &retsensor_event_messageEnable, &retpresentState, &retpreviousState,
1921 &reteventState, retpresentReading);
1922
1923 EXPECT_EQ(rc, PLDM_SUCCESS);
1924 EXPECT_EQ(completionCode, retcompletionCode);
1925 EXPECT_EQ(sensor_dataSize, retsensor_dataSize);
1926 EXPECT_EQ(sensor_operationalState, retsensor_operationalState);
1927 EXPECT_EQ(sensor_event_messageEnable, retsensor_event_messageEnable);
1928 EXPECT_EQ(presentState, retpresentState);
1929 EXPECT_EQ(previousState, retpreviousState);
1930 EXPECT_EQ(eventState, reteventState);
1931 EXPECT_EQ(presentReading,
1932 *(reinterpret_cast<uint32_t*>(retpresentReading)));
1933}
1934
1935TEST(GetSensorReading, testBadDecodeResponse)
1936{
1937 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 1>
1938 responseMsg{};
1939
1940 auto rc = decode_get_sensor_reading_resp(
1941 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
1942 nullptr, nullptr, nullptr, nullptr, nullptr);
1943
1944 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1945
1946 uint8_t completionCode = 0;
1947 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
1948 uint8_t sensor_operationalState = PLDM_SENSOR_INTEST;
1949 uint8_t sensor_event_messageEnable = PLDM_EVENTS_DISABLED;
1950 uint8_t presentState = PLDM_SENSOR_FATAL;
1951 uint8_t previousState = PLDM_SENSOR_UPPERFATAL;
1952 uint8_t eventState = PLDM_SENSOR_WARNING;
1953 uint8_t presentReading = 0xA;
1954
1955 uint8_t retcompletionCode;
1956 uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
1957 uint8_t retsensor_operationalState;
1958 uint8_t retsensor_event_messageEnable;
1959 uint8_t retpresent_state;
1960 uint8_t retprevious_state;
1961 uint8_t retevent_state;
1962 uint8_t retpresentReading;
1963
1964 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1965 struct pldm_get_sensor_reading_resp* resp =
1966 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
1967 response->payload);
1968
1969 resp->completion_code = completionCode;
1970 resp->sensor_data_size = sensor_dataSize;
1971 resp->sensor_operational_state = sensor_operationalState;
1972 resp->sensor_event_message_enable = sensor_event_messageEnable;
1973 resp->present_state = presentState;
1974 resp->previous_state = previousState;
1975 resp->event_state = eventState;
1976 resp->present_reading[0] = presentReading;
1977
1978 rc = decode_get_sensor_reading_resp(
1979 response, responseMsg.size() - hdrSize, &retcompletionCode,
1980 &retsensor_dataSize, &retsensor_operationalState,
1981 &retsensor_event_messageEnable, &retpresent_state, &retprevious_state,
1982 &retevent_state, reinterpret_cast<uint8_t*>(&retpresentReading));
1983
1984 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1985}
1986
1987TEST(SetEventReceiver, testGoodEncodeRequest)
1988{
1989 uint8_t eventMessageGlobalEnable =
1990 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
1991 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
1992 uint8_t eventReceiverAddressInfo = 0x08;
1993 uint16_t heartbeatTimer = 0x78;
1994
1995 std::vector<uint8_t> requestMsg(hdrSize +
1996 PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
1997 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1998
1999 auto rc = encode_set_event_receiver_req(
2000 0, eventMessageGlobalEnable, transportProtocolType,
2001 eventReceiverAddressInfo, heartbeatTimer, request);
2002
2003 EXPECT_EQ(rc, PLDM_SUCCESS);
2004 struct pldm_set_event_receiver_req* req =
2005 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
2006 EXPECT_EQ(eventMessageGlobalEnable, req->event_message_global_enable);
2007 EXPECT_EQ(transportProtocolType, req->transport_protocol_type);
2008 EXPECT_EQ(eventReceiverAddressInfo, req->event_receiver_address_info);
2009 EXPECT_EQ(heartbeatTimer, le16toh(req->heartbeat_timer));
2010}
2011
2012TEST(SetEventReceiver, testBadEncodeRequest)
2013{
2014 uint8_t eventMessageGlobalEnable =
2015 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
2016 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
2017 uint8_t eventReceiverAddressInfo = 0x08;
2018 uint16_t heartbeatTimer = 0;
2019
2020 std::vector<uint8_t> requestMsg(hdrSize +
2021 PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
2022 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2023
2024 auto rc = encode_set_event_receiver_req(
2025 0, eventMessageGlobalEnable, transportProtocolType,
2026 eventReceiverAddressInfo, heartbeatTimer, request);
2027
2028 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2029}
2030
2031TEST(SetEventReceiver, testGoodDecodeResponse)
2032{
2033 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
2034 responseMsg{};
2035
2036 uint8_t retcompletion_code = 0;
2037 responseMsg[hdrSize] = PLDM_SUCCESS;
2038
2039 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2040 auto rc = decode_set_event_receiver_resp(
2041 response, responseMsg.size() - sizeof(pldm_msg_hdr),
2042 &retcompletion_code);
2043
2044 EXPECT_EQ(rc, PLDM_SUCCESS);
2045 EXPECT_EQ(PLDM_SUCCESS, retcompletion_code);
2046}
2047
2048TEST(SetEventReceiver, testBadDecodeResponse)
2049{
2050 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
2051 responseMsg{};
2052 uint8_t retcompletion_code = 0;
2053 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2054
2055 auto rc = decode_set_event_receiver_resp(
2056 response, responseMsg.size() - sizeof(pldm_msg_hdr), NULL);
2057
2058 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2059
2060 rc = decode_set_event_receiver_resp(
2061 nullptr, responseMsg.size() - sizeof(pldm_msg_hdr),
2062 &retcompletion_code);
2063
2064 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2065}
2066
2067TEST(SetEventReceiver, testGoodEncodeResponse)
2068{
2069 std::array<uint8_t,
2070 sizeof(pldm_msg_hdr) + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
2071 responseMsg{};
2072 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2073 uint8_t completionCode = 0;
2074
2075 auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, response);
2076
2077 EXPECT_EQ(rc, PLDM_SUCCESS);
2078 EXPECT_EQ(completionCode, response->payload[0]);
2079}
2080
2081TEST(SetEventReceiver, testBadEncodeResponse)
2082{
2083 auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, NULL);
2084 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2085}
2086
2087TEST(SetEventReceiver, testGoodDecodeRequest)
2088{
2089
2090 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
2091 requestMsg{};
2092
2093 uint8_t eventMessageGlobalEnable =
2094 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
2095 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
2096 uint8_t eventReceiverAddressInfo = 0x08;
2097 uint16_t heartbeatTimer = 0x78;
2098
2099 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2100 struct pldm_set_event_receiver_req* req =
2101 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
2102
2103 req->event_message_global_enable = eventMessageGlobalEnable;
2104 req->transport_protocol_type = transportProtocolType;
2105 req->event_receiver_address_info = eventReceiverAddressInfo;
2106 req->heartbeat_timer = htole16(heartbeatTimer);
2107
2108 uint8_t reteventMessageGlobalEnable;
2109 uint8_t rettransportProtocolType;
2110 uint8_t reteventReceiverAddressInfo;
2111 uint16_t retheartbeatTimer;
2112 auto rc = decode_set_event_receiver_req(
2113 request, requestMsg.size() - hdrSize, &reteventMessageGlobalEnable,
2114 &rettransportProtocolType, &reteventReceiverAddressInfo,
2115 &retheartbeatTimer);
2116
2117 EXPECT_EQ(rc, PLDM_SUCCESS);
2118 EXPECT_EQ(eventMessageGlobalEnable, reteventMessageGlobalEnable);
2119 EXPECT_EQ(transportProtocolType, rettransportProtocolType);
2120 EXPECT_EQ(eventReceiverAddressInfo, reteventReceiverAddressInfo);
2121 EXPECT_EQ(heartbeatTimer, retheartbeatTimer);
2122}
2123
2124TEST(SetEventReceiver, testBadDecodeRequest)
2125{
2126 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
2127 requestMsg{};
2128
2129 auto rc = decode_set_event_receiver_req(NULL, requestMsg.size() - hdrSize,
2130 NULL, NULL, NULL, NULL);
2131 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2132
2133 uint8_t eventMessageGlobalEnable =
2134 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
2135 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
2136 uint8_t eventReceiverAddressInfo = 0x08;
2137 uint16_t heartbeatTimer = 0x78;
2138
2139 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2140 struct pldm_set_event_receiver_req* req =
2141 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
2142
2143 req->event_message_global_enable = eventMessageGlobalEnable;
2144 req->transport_protocol_type = transportProtocolType;
2145 req->event_receiver_address_info = eventReceiverAddressInfo;
2146 req->heartbeat_timer = htole16(heartbeatTimer);
2147
2148 uint8_t reteventMessageGlobalEnable;
2149 uint8_t rettransportProtocolType;
2150 uint8_t reteventReceiverAddressInfo;
2151 uint16_t retheartbeatTimer;
2152 rc = decode_set_event_receiver_req(
2153 request, requestMsg.size() - hdrSize - 1, &reteventMessageGlobalEnable,
2154 &rettransportProtocolType, &reteventReceiverAddressInfo,
2155 &retheartbeatTimer);
2156 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2157}