blob: 329f4ffadf02158de7237eaf4e813edcad99dae1 [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
Gilbert Chenb7c73e52022-11-10 11:29:52 +0800437TEST(GetPDRRepositoryInfo, testGoodDecodeResponse)
438{
439 uint8_t completionCode = PLDM_SUCCESS;
440 uint8_t repositoryState = PLDM_AVAILABLE;
441 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
442 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
443 uint32_t recordCount = 100;
444 uint32_t repositorySize = 100;
445 uint32_t largestRecordSize = UINT32_MAX;
446 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
447
448 std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
449 responseMsg{};
450 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
451 struct pldm_pdr_repository_info_resp* resp =
452 reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
453 response->payload);
454 resp->completion_code = completionCode;
455 resp->repository_state = repositoryState;
456 memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
457 memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
458 resp->record_count = htole32(recordCount);
459 resp->repository_size = htole32(repositorySize);
460 resp->largest_record_size = htole32(largestRecordSize);
461 resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
462
463 uint8_t retCompletionCode = 0;
464 uint8_t retRepositoryState = 0;
465 uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
466 uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
467 uint32_t retRecordCount = 0;
468 uint32_t retRepositorySize = 0;
469 uint32_t retLargestRecordSize = 0;
470 uint8_t retDataTransferHandleTimeout = 0;
471
472 auto rc = decode_get_pdr_repository_info_resp(
473 response, responseMsg.size() - hdrSize, &retCompletionCode,
474 &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
475 &retRepositorySize, &retLargestRecordSize,
476 &retDataTransferHandleTimeout);
477
478 EXPECT_EQ(rc, PLDM_SUCCESS);
479 EXPECT_EQ(completionCode, retCompletionCode);
480 EXPECT_EQ(repositoryState, retRepositoryState);
481 EXPECT_EQ(0, memcmp(updateTime, retUpdateTime, PLDM_TIMESTAMP104_SIZE));
482 EXPECT_EQ(0,
483 memcmp(oemUpdateTime, retOemUpdateTime, PLDM_TIMESTAMP104_SIZE));
484 EXPECT_EQ(recordCount, recordCount);
485 EXPECT_EQ(repositorySize, repositorySize);
486 EXPECT_EQ(largestRecordSize, largestRecordSize);
487 EXPECT_EQ(dataTransferHandleTimeout, dataTransferHandleTimeout);
488}
489
490TEST(GetPDRRepositoryInfo, testBadDecodeResponse)
491{
492 uint8_t completionCode = PLDM_SUCCESS;
493 uint8_t repositoryState = PLDM_AVAILABLE;
494 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
495 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
496 uint32_t recordCount = htole32(100);
497 uint32_t repositorySize = htole32(100);
498 uint32_t largestRecordSize = htole32(UINT32_MAX);
499 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
500
501 std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
502 responseMsg{};
503 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
504 struct pldm_pdr_repository_info_resp* resp =
505 reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
506 response->payload);
507 resp->completion_code = completionCode;
508 resp->repository_state = repositoryState;
509 memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
510 memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
511 resp->record_count = recordCount;
512 resp->repository_size = repositorySize;
513 resp->largest_record_size = largestRecordSize;
514 resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
515
516 uint8_t retCompletionCode = 0;
517 uint8_t retRepositoryState = 0;
518 uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
519 uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
520 uint32_t retRecordCount = 0;
521 uint32_t retRepositorySize = 0;
522 uint32_t retLargestRecordSize = 0;
523 uint8_t retDataTransferHandleTimeout = 0;
524
525 auto rc = decode_get_pdr_repository_info_resp(
526 response, responseMsg.size() - hdrSize, NULL, NULL, NULL, NULL, NULL,
527 NULL, NULL, NULL);
528 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
529
530 rc = decode_get_pdr_repository_info_resp(
531 response, responseMsg.size() - hdrSize - 1, &retCompletionCode,
532 &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
533 &retRepositorySize, &retLargestRecordSize,
534 &retDataTransferHandleTimeout);
535 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
536
537 resp->repository_state = PLDM_FAILED + 1;
538 rc = decode_get_pdr_repository_info_resp(
539 response, responseMsg.size() - hdrSize, &retCompletionCode,
540 &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
541 &retRepositorySize, &retLargestRecordSize,
542 &retDataTransferHandleTimeout);
543 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
544}
545
Andrew Jeffery9c766792022-08-10 23:12:49 +0930546TEST(SetNumericEffecterValue, testGoodDecodeRequest)
547{
548 std::array<uint8_t,
549 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 3>
550 requestMsg{};
551
552 uint16_t effecter_id = 32768;
553 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT32;
554 uint32_t effecter_value = 123456789;
555
556 uint16_t reteffecter_id;
557 uint8_t reteffecter_data_size;
558 uint8_t reteffecter_value[4];
559
560 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
561 struct pldm_set_numeric_effecter_value_req* request =
562 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
563 req->payload);
564
565 request->effecter_id = htole16(effecter_id);
566 request->effecter_data_size = effecter_data_size;
567 uint32_t effecter_value_le = htole32(effecter_value);
568 memcpy(request->effecter_value, &effecter_value_le,
569 sizeof(effecter_value_le));
570
571 auto rc = decode_set_numeric_effecter_value_req(
572 req, requestMsg.size() - hdrSize, &reteffecter_id,
573 &reteffecter_data_size, reteffecter_value);
574
575 uint32_t value = *(reinterpret_cast<uint32_t*>(reteffecter_value));
576 EXPECT_EQ(rc, PLDM_SUCCESS);
577 EXPECT_EQ(reteffecter_id, effecter_id);
578 EXPECT_EQ(reteffecter_data_size, effecter_data_size);
579 EXPECT_EQ(value, effecter_value);
580}
581
582TEST(SetNumericEffecterValue, testBadDecodeRequest)
583{
584 std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES>
585 requestMsg{};
586
587 auto rc = decode_set_numeric_effecter_value_req(
588 NULL, requestMsg.size() - hdrSize, NULL, NULL, NULL);
589 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
590
591 uint16_t effecter_id = 0x10;
592 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT8;
593 uint8_t effecter_value = 1;
594
595 uint16_t reteffecter_id;
596 uint8_t reteffecter_data_size;
597 uint8_t reteffecter_value[4];
598
599 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
600 struct pldm_set_numeric_effecter_value_req* request =
601 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
602 req->payload);
603
604 request->effecter_id = effecter_id;
605 request->effecter_data_size = effecter_data_size;
606 memcpy(request->effecter_value, &effecter_value, sizeof(effecter_value));
607
608 rc = decode_set_numeric_effecter_value_req(
609 req, requestMsg.size() - hdrSize - 1, &reteffecter_id,
610 &reteffecter_data_size, reinterpret_cast<uint8_t*>(&reteffecter_value));
611 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
612}
613
614TEST(SetNumericEffecterValue, testGoodEncodeRequest)
615{
616 uint16_t effecter_id = 0;
617 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT16;
618 uint16_t effecter_value = 65534;
619
620 std::vector<uint8_t> requestMsg(
621 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
622 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
623
624 auto rc = encode_set_numeric_effecter_value_req(
625 0, effecter_id, effecter_data_size,
626 reinterpret_cast<uint8_t*>(&effecter_value), request,
627 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
628 EXPECT_EQ(rc, PLDM_SUCCESS);
629
630 struct pldm_set_numeric_effecter_value_req* req =
631 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
632 request->payload);
633 EXPECT_EQ(effecter_id, req->effecter_id);
634 EXPECT_EQ(effecter_data_size, req->effecter_data_size);
635 uint16_t* val = (uint16_t*)req->effecter_value;
636 *val = le16toh(*val);
637 EXPECT_EQ(effecter_value, *val);
638}
639
640TEST(SetNumericEffecterValue, testBadEncodeRequest)
641{
642 std::vector<uint8_t> requestMsg(
643 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
644 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
645
646 auto rc = encode_set_numeric_effecter_value_req(
647 0, 0, 0, NULL, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
648 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
649
650 uint16_t effecter_value;
651 rc = encode_set_numeric_effecter_value_req(
652 0, 0, 6, reinterpret_cast<uint8_t*>(&effecter_value), request,
653 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
654 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
655}
656
657TEST(SetNumericEffecterValue, testGoodDecodeResponse)
658{
659 std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
660 responseMsg{};
661
662 uint8_t completion_code = 0xA0;
663
664 uint8_t retcompletion_code;
665
666 memcpy(responseMsg.data() + hdrSize, &completion_code,
667 sizeof(completion_code));
668
669 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
670
671 auto rc = decode_set_numeric_effecter_value_resp(
672 response, responseMsg.size() - hdrSize, &retcompletion_code);
673
674 EXPECT_EQ(rc, PLDM_SUCCESS);
675 EXPECT_EQ(completion_code, retcompletion_code);
676}
677
678TEST(SetNumericEffecterValue, testBadDecodeResponse)
679{
680 std::array<uint8_t, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
681 responseMsg{};
682
683 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
684
685 auto rc = decode_set_numeric_effecter_value_resp(response,
686 responseMsg.size(), NULL);
687
688 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
689}
690
691TEST(SetNumericEffecterValue, testGoodEncodeResponse)
692{
693 std::array<uint8_t, sizeof(pldm_msg_hdr) +
694 PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
695 responseMsg{};
696 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
697 uint8_t completionCode = 0;
698
699 auto rc = encode_set_numeric_effecter_value_resp(
700 0, PLDM_SUCCESS, response, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
701
702 EXPECT_EQ(rc, PLDM_SUCCESS);
703 EXPECT_EQ(completionCode, response->payload[0]);
704}
705
706TEST(SetNumericEffecterValue, testBadEncodeResponse)
707{
708 auto rc = encode_set_numeric_effecter_value_resp(
709 0, PLDM_SUCCESS, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
710 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
711}
712
713TEST(GetStateSensorReadings, testGoodEncodeResponse)
714{
715 std::array<uint8_t, hdrSize +
716 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
717 sizeof(get_sensor_state_field) * 2>
718 responseMsg{};
719
720 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
721 uint8_t completionCode = 0;
722 uint8_t comp_sensorCnt = 0x2;
723
724 std::array<get_sensor_state_field, 2> stateField{};
725 stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_NORMAL,
726 PLDM_SENSOR_WARNING, PLDM_SENSOR_UNKNOWN};
727 stateField[1] = {PLDM_SENSOR_FAILED, PLDM_SENSOR_UPPERFATAL,
728 PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_FATAL};
729
730 auto rc = encode_get_state_sensor_readings_resp(
731 0, PLDM_SUCCESS, comp_sensorCnt, stateField.data(), response);
732
733 struct pldm_get_state_sensor_readings_resp* resp =
734 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
735 response->payload);
736
737 EXPECT_EQ(rc, PLDM_SUCCESS);
738 EXPECT_EQ(completionCode, resp->completion_code);
739 EXPECT_EQ(comp_sensorCnt, resp->comp_sensor_count);
740 EXPECT_EQ(stateField[0].sensor_op_state, resp->field->sensor_op_state);
741 EXPECT_EQ(stateField[0].present_state, resp->field->present_state);
742 EXPECT_EQ(stateField[0].previous_state, resp->field->previous_state);
743 EXPECT_EQ(stateField[0].event_state, resp->field->event_state);
744 EXPECT_EQ(stateField[1].sensor_op_state, resp->field[1].sensor_op_state);
745 EXPECT_EQ(stateField[1].present_state, resp->field[1].present_state);
746 EXPECT_EQ(stateField[1].previous_state, resp->field[1].previous_state);
747 EXPECT_EQ(stateField[1].event_state, resp->field[1].event_state);
748}
749
750TEST(GetStateSensorReadings, testBadEncodeResponse)
751{
752 auto rc = encode_get_state_sensor_readings_resp(0, PLDM_SUCCESS, 0, nullptr,
753 nullptr);
754
755 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
756}
757
758TEST(GetStateSensorReadings, testGoodDecodeResponse)
759{
760 std::array<uint8_t, hdrSize +
761 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
762 sizeof(get_sensor_state_field) * 2>
763 responseMsg{};
764
765 uint8_t completionCode = 0;
766 uint8_t comp_sensorCnt = 2;
767
768 std::array<get_sensor_state_field, 2> stateField{};
769 stateField[0] = {PLDM_SENSOR_DISABLED, PLDM_SENSOR_UNKNOWN,
770 PLDM_SENSOR_UNKNOWN, PLDM_SENSOR_UNKNOWN};
771 stateField[1] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_LOWERFATAL,
772 PLDM_SENSOR_LOWERCRITICAL, PLDM_SENSOR_WARNING};
773
774 uint8_t retcompletion_code = 0;
775 uint8_t retcomp_sensorCnt = 0;
776 std::array<get_sensor_state_field, 2> retstateField{};
777
778 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
779 struct pldm_get_state_sensor_readings_resp* resp =
780 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
781 response->payload);
782
783 resp->completion_code = completionCode;
784 resp->comp_sensor_count = comp_sensorCnt;
785 memcpy(resp->field, &stateField,
786 (sizeof(get_sensor_state_field) * comp_sensorCnt));
787
788 auto rc = decode_get_state_sensor_readings_resp(
789 response, responseMsg.size() - hdrSize, &retcompletion_code,
790 &retcomp_sensorCnt, retstateField.data());
791
792 EXPECT_EQ(rc, PLDM_SUCCESS);
793 EXPECT_EQ(completionCode, retcompletion_code);
794 EXPECT_EQ(comp_sensorCnt, retcomp_sensorCnt);
795 EXPECT_EQ(stateField[0].sensor_op_state, retstateField[0].sensor_op_state);
796 EXPECT_EQ(stateField[0].present_state, retstateField[0].present_state);
797 EXPECT_EQ(stateField[0].previous_state, retstateField[0].previous_state);
798 EXPECT_EQ(stateField[0].event_state, retstateField[0].event_state);
799 EXPECT_EQ(stateField[1].sensor_op_state, retstateField[1].sensor_op_state);
800 EXPECT_EQ(stateField[1].present_state, retstateField[1].present_state);
801 EXPECT_EQ(stateField[1].previous_state, retstateField[1].previous_state);
802 EXPECT_EQ(stateField[1].event_state, retstateField[1].event_state);
803}
804
805TEST(GetStateSensorReadings, testBadDecodeResponse)
806{
807 std::array<uint8_t, hdrSize +
808 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
809 sizeof(get_sensor_state_field) * 2>
810 responseMsg{};
811
812 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
813
814 auto rc = decode_get_state_sensor_readings_resp(
815 response, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr);
816
817 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
818
819 uint8_t completionCode = 0;
820 uint8_t comp_sensorCnt = 1;
821
822 std::array<get_sensor_state_field, 1> stateField{};
823 stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_UPPERFATAL,
824 PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_WARNING};
825
826 uint8_t retcompletion_code = 0;
827 uint8_t retcomp_sensorCnt = 0;
828 std::array<get_sensor_state_field, 1> retstateField{};
829
830 struct pldm_get_state_sensor_readings_resp* resp =
831 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
832 response->payload);
833
834 resp->completion_code = completionCode;
835 resp->comp_sensor_count = comp_sensorCnt;
836 memcpy(resp->field, &stateField,
837 (sizeof(get_sensor_state_field) * comp_sensorCnt));
838
839 rc = decode_get_state_sensor_readings_resp(
840 response, responseMsg.size() - hdrSize + 1, &retcompletion_code,
841 &retcomp_sensorCnt, retstateField.data());
842
843 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
844}
845
846TEST(GetStateSensorReadings, testGoodEncodeRequest)
847{
848 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
849 requestMsg{};
850
851 uint16_t sensorId = 0xAB;
852 bitfield8_t sensorRearm;
853 sensorRearm.byte = 0x03;
854
855 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
856 auto rc = encode_get_state_sensor_readings_req(0, sensorId, sensorRearm, 0,
857 request);
858
859 struct pldm_get_state_sensor_readings_req* req =
860 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
861 request->payload);
862
863 EXPECT_EQ(rc, PLDM_SUCCESS);
864 EXPECT_EQ(sensorId, le16toh(req->sensor_id));
865 EXPECT_EQ(sensorRearm.byte, req->sensor_rearm.byte);
866}
867
868TEST(GetStateSensorReadings, testBadEncodeRequest)
869{
870 bitfield8_t sensorRearm;
871 sensorRearm.byte = 0x0;
872
873 auto rc =
874 encode_get_state_sensor_readings_req(0, 0, sensorRearm, 0, nullptr);
875
876 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
877}
878
879TEST(GetStateSensorReadings, testGoodDecodeRequest)
880{
881 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
882 requestMsg{};
883
884 uint16_t sensorId = 0xCD;
885 bitfield8_t sensorRearm;
886 sensorRearm.byte = 0x10;
887
888 uint16_t retsensorId;
889 bitfield8_t retsensorRearm;
890 uint8_t retreserved;
891
892 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
893
894 struct pldm_get_state_sensor_readings_req* req =
895 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
896 request->payload);
897
898 req->sensor_id = htole16(sensorId);
899 req->sensor_rearm.byte = sensorRearm.byte;
900
901 auto rc = decode_get_state_sensor_readings_req(
902 request, requestMsg.size() - hdrSize, &retsensorId, &retsensorRearm,
903 &retreserved);
904
905 EXPECT_EQ(rc, PLDM_SUCCESS);
906 EXPECT_EQ(sensorId, retsensorId);
907 EXPECT_EQ(sensorRearm.byte, retsensorRearm.byte);
908 EXPECT_EQ(0, retreserved);
909}
910
911TEST(GetStateSensorReadings, testBadDecodeRequest)
912{
913 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
914 requestMsg{};
915
916 auto rc = decode_get_state_sensor_readings_req(
917 nullptr, requestMsg.size() - hdrSize, nullptr, nullptr, nullptr);
918
919 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
920 uint16_t sensorId = 0x11;
921 bitfield8_t sensorRearm;
922 sensorRearm.byte = 0x04;
923
924 uint16_t retsensorId;
925 bitfield8_t retsensorRearm;
926 uint8_t retreserved;
927
928 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
929
930 struct pldm_get_state_sensor_readings_req* req =
931 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
932 request->payload);
933
934 req->sensor_id = htole16(sensorId);
935 req->sensor_rearm.byte = sensorRearm.byte;
936
937 rc = decode_get_state_sensor_readings_req(
938 request, requestMsg.size() - hdrSize - 1, &retsensorId, &retsensorRearm,
939 &retreserved);
940
941 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
942}
943
Dung Caod6ae8982022-11-02 10:00:10 +0700944TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeRequest)
945{
946 uint8_t eventBufferSize = 32;
947
948 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_REQ_BYTES>
949 requestMsg{};
950 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
951
952 auto rc = encode_event_message_buffer_size_req(0, eventBufferSize, request);
953
954 EXPECT_EQ(rc, PLDM_SUCCESS);
955}
956
957TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeResponse)
958{
959 uint8_t completionCode = PLDM_SUCCESS;
960 uint16_t terminusMaxBufferSize = 256;
961
962 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
963 responseMsg{};
964
965 uint8_t retCompletionCode;
966 uint16_t retMaxBufferSize = 0;
967
968 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
969 struct pldm_event_message_buffer_size_resp* resp =
970 reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
971 response->payload);
972
973 resp->completion_code = completionCode;
974 resp->terminus_max_buffer_size = terminusMaxBufferSize;
975
976 auto rc = decode_event_message_buffer_size_resp(
977 response, responseMsg.size() - hdrSize, &retCompletionCode,
978 &retMaxBufferSize);
979
980 EXPECT_EQ(rc, PLDM_SUCCESS);
981 EXPECT_EQ(retCompletionCode, completionCode);
982 EXPECT_EQ(terminusMaxBufferSize, retMaxBufferSize);
983}
984
985TEST(EventMessageBufferSize, testBadEventMessageBufferSizeResponse)
986{
987 uint8_t completionCode = PLDM_SUCCESS;
988 uint16_t terminusMaxBufferSize = 256;
989
990 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
991 responseMsg{};
992
993 uint8_t retCompletionCode;
994 uint16_t retMaxBufferSize = 0;
995
996 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
997 struct pldm_event_message_buffer_size_resp* resp =
998 reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
999 response->payload);
1000 resp->completion_code = completionCode;
1001 resp->terminus_max_buffer_size = terminusMaxBufferSize;
1002
1003 auto rc =
1004 decode_event_message_buffer_size_resp(response, 0, nullptr, nullptr);
1005 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1006
1007 rc = decode_event_message_buffer_size_resp(
1008 response, responseMsg.size(), &retCompletionCode, &retMaxBufferSize);
1009 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1010}
1011
Andrew Jeffery9c766792022-08-10 23:12:49 +09301012TEST(PlatformEventMessage, testGoodStateSensorDecodeRequest)
1013{
1014 std::array<uint8_t,
1015 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
1016 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES>
1017 requestMsg{};
1018
1019 uint8_t retFormatVersion = 0;
1020 uint8_t retTid = 0;
1021 uint8_t retEventClass = 0;
1022 size_t retEventDataOffset = 0;
1023
1024 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
1025 struct pldm_platform_event_message_req* request =
1026 reinterpret_cast<struct pldm_platform_event_message_req*>(req->payload);
1027
1028 uint8_t formatVersion = 0x01;
1029 uint8_t tid = 0x02;
1030 // Sensor Event
1031 uint8_t eventClass = 0x00;
1032
1033 request->format_version = formatVersion;
1034 request->tid = tid;
1035 request->event_class = eventClass;
1036 size_t eventDataOffset =
1037 sizeof(formatVersion) + sizeof(tid) + sizeof(eventClass);
1038
1039 auto rc = decode_platform_event_message_req(
1040 req, requestMsg.size() - hdrSize, &retFormatVersion, &retTid,
1041 &retEventClass, &retEventDataOffset);
1042
1043 EXPECT_EQ(rc, PLDM_SUCCESS);
1044 EXPECT_EQ(retFormatVersion, formatVersion);
1045 EXPECT_EQ(retTid, tid);
1046 EXPECT_EQ(retEventClass, eventClass);
1047 EXPECT_EQ(retEventDataOffset, eventDataOffset);
1048}
1049
1050TEST(PlatformEventMessage, testBadDecodeRequest)
1051{
1052 const struct pldm_msg* msg = NULL;
1053 std::array<uint8_t,
1054 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
1055 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
1056 requestMsg{};
1057 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
1058 uint8_t retFormatVersion;
1059 uint8_t retTid = 0;
1060 uint8_t retEventClass = 0;
1061 size_t retEventDataOffset;
1062
1063 auto rc = decode_platform_event_message_req(msg, sizeof(*msg), NULL, NULL,
1064 NULL, NULL);
1065 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1066
1067 rc = decode_platform_event_message_req(
1068 req,
1069 requestMsg.size() - hdrSize -
1070 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES,
1071 &retFormatVersion, &retTid, &retEventClass, &retEventDataOffset);
1072 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1073}
1074
1075TEST(PlatformEventMessage, testGoodEncodeResponse)
1076{
1077 std::array<uint8_t,
1078 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
1079 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
1080 responseMsg{};
1081 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1082 uint8_t completionCode = 0;
1083 uint8_t instanceId = 0x01;
1084 uint8_t platformEventStatus = 0x01;
1085
1086 auto rc = encode_platform_event_message_resp(instanceId, PLDM_SUCCESS,
1087 platformEventStatus, response);
1088
1089 EXPECT_EQ(rc, PLDM_SUCCESS);
1090 EXPECT_EQ(completionCode, response->payload[0]);
1091 EXPECT_EQ(platformEventStatus, response->payload[1]);
1092}
1093
1094TEST(PlatformEventMessage, testBadEncodeResponse)
1095{
1096 auto rc = encode_platform_event_message_resp(0, PLDM_SUCCESS, 1, NULL);
1097 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1098}
1099
1100TEST(PlatformEventMessage, testGoodEncodeRequest)
1101{
1102 uint8_t formatVersion = 0x01;
1103 uint8_t Tid = 0x03;
1104 uint8_t eventClass = 0x00;
1105 uint8_t eventData = 34;
1106
1107 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
1108 sizeof(eventData)>
1109 requestMsg{};
1110
1111 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1112 auto rc = encode_platform_event_message_req(
1113 0, formatVersion, Tid, eventClass,
1114 reinterpret_cast<uint8_t*>(&eventData), sizeof(eventData), request,
1115 sizeof(eventData) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
1116
1117 struct pldm_platform_event_message_req* req =
1118 reinterpret_cast<struct pldm_platform_event_message_req*>(
1119 request->payload);
1120
1121 EXPECT_EQ(rc, PLDM_SUCCESS);
1122 EXPECT_EQ(formatVersion, req->format_version);
1123 EXPECT_EQ(Tid, req->tid);
1124 EXPECT_EQ(eventClass, req->event_class);
1125 EXPECT_EQ(0, memcmp(&eventData, req->event_data, sizeof(eventData)));
1126}
1127
1128TEST(PlatformEventMessage, testBadEncodeRequest)
1129{
1130 uint8_t Tid = 0x03;
1131 uint8_t eventClass = 0x00;
1132 uint8_t eventData = 34;
1133 size_t sz_eventData = sizeof(eventData);
1134 size_t payloadLen =
1135 sz_eventData + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES;
1136 uint8_t formatVersion = 0x01;
1137
1138 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
1139 sizeof(eventData)>
1140 requestMsg{};
1141 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1142
1143 auto rc = encode_platform_event_message_req(
1144 0, formatVersion, Tid, eventClass,
1145 reinterpret_cast<uint8_t*>(&eventData), sz_eventData, nullptr,
1146 payloadLen);
1147 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1148 rc = encode_platform_event_message_req(
1149 0, 0, Tid, eventClass, reinterpret_cast<uint8_t*>(&eventData),
1150 sz_eventData, request, payloadLen);
1151 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1152 rc = encode_platform_event_message_req(0, formatVersion, Tid, eventClass,
1153 nullptr, 0, request, payloadLen);
1154 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1155 rc = encode_platform_event_message_req(
1156 0, formatVersion, Tid, eventClass,
1157 reinterpret_cast<uint8_t*>(&eventData), sz_eventData, request, 0);
1158 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1159}
1160
1161TEST(PlatformEventMessage, testGoodDecodeResponse)
1162{
1163 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
1164 responseMsg{};
1165
1166 uint8_t completionCode = PLDM_SUCCESS;
1167 uint8_t platformEventStatus = 0x01;
1168
1169 uint8_t retcompletionCode;
1170 uint8_t retplatformEventStatus;
1171
1172 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1173 struct pldm_platform_event_message_resp* resp =
1174 reinterpret_cast<struct pldm_platform_event_message_resp*>(
1175 response->payload);
1176
1177 resp->completion_code = completionCode;
1178 resp->platform_event_status = platformEventStatus;
1179
1180 auto rc = decode_platform_event_message_resp(
1181 response, responseMsg.size() - hdrSize, &retcompletionCode,
1182 &retplatformEventStatus);
1183
1184 EXPECT_EQ(rc, PLDM_SUCCESS);
1185 EXPECT_EQ(completionCode, retcompletionCode);
1186 EXPECT_EQ(platformEventStatus, retplatformEventStatus);
1187}
1188
1189TEST(PlatformEventMessage, testBadDecodeResponse)
1190{
1191 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
1192 responseMsg{};
1193
1194 uint8_t completionCode = PLDM_SUCCESS;
1195 uint8_t platformEventStatus = 0x01;
1196
1197 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1198 struct pldm_platform_event_message_resp* resp =
1199 reinterpret_cast<struct pldm_platform_event_message_resp*>(
1200 response->payload);
1201 resp->completion_code = completionCode;
1202 resp->platform_event_status = platformEventStatus;
1203
1204 auto rc = decode_platform_event_message_resp(
1205 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr);
1206
1207 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1208
1209 rc = decode_platform_event_message_resp(
1210 response, responseMsg.size() - hdrSize - 1, &completionCode,
1211 &platformEventStatus);
1212
1213 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1214}
1215
1216TEST(PlatformEventMessage, testGoodSensorEventDataDecodeRequest)
1217{
1218 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH +
1219 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
1220 eventDataArr{};
1221 uint16_t sensorId = 0x1234;
1222 uint8_t sensorEventClassType = PLDM_SENSOR_OP_STATE;
1223
1224 struct pldm_sensor_event_data* eventData =
1225 (struct pldm_sensor_event_data*)eventDataArr.data();
1226 eventData->sensor_id = sensorId;
1227 eventData->sensor_event_class_type = sensorEventClassType;
1228
1229 size_t retSensorOpDataOffset;
1230 uint16_t retSensorId = 0;
1231 uint8_t retSensorEventClassType;
1232 size_t sensorOpDataOffset = sizeof(sensorId) + sizeof(sensorEventClassType);
1233 auto rc = decode_sensor_event_data(
1234 reinterpret_cast<uint8_t*>(eventData), eventDataArr.size(),
1235 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1236 EXPECT_EQ(rc, PLDM_SUCCESS);
1237 EXPECT_EQ(retSensorId, sensorId);
1238 EXPECT_EQ(retSensorEventClassType, sensorEventClassType);
1239 EXPECT_EQ(retSensorOpDataOffset, sensorOpDataOffset);
1240}
1241
1242TEST(PlatformEventMessage, testBadSensorEventDataDecodeRequest)
1243{
1244
1245 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH +
1246 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
1247 eventDataArr{};
1248
1249 struct pldm_sensor_event_data* eventData =
1250 (struct pldm_sensor_event_data*)eventDataArr.data();
1251
1252 size_t retSensorOpDataOffset;
1253 uint16_t retSensorId = 0;
1254 uint8_t retSensorEventClassType;
1255 auto rc = decode_sensor_event_data(NULL, eventDataArr.size(), &retSensorId,
1256 &retSensorEventClassType,
1257 &retSensorOpDataOffset);
1258 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1259
1260 rc = decode_sensor_event_data(
1261 reinterpret_cast<uint8_t*>(eventDataArr.data()),
1262 eventDataArr.size() -
1263 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH,
1264 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1265 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1266
1267 eventData->sensor_event_class_type = PLDM_SENSOR_OP_STATE;
1268
1269 rc = decode_sensor_event_data(
1270 reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
1271 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1272 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1273
1274 eventData->sensor_event_class_type = PLDM_STATE_SENSOR_STATE;
1275 rc = decode_sensor_event_data(
1276 reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
1277 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1278 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1279
1280 eventData->sensor_event_class_type = PLDM_NUMERIC_SENSOR_STATE;
1281 rc = decode_sensor_event_data(
1282 reinterpret_cast<uint8_t*>(eventDataArr.data()),
1283 eventDataArr.size() + 1, &retSensorId, &retSensorEventClassType,
1284 &retSensorOpDataOffset);
1285 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1286}
1287
1288TEST(PlatformEventMessage, testGoodSensorOpEventDataDecodeRequest)
1289{
1290 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
1291 eventDataArr{};
1292
1293 struct pldm_sensor_event_sensor_op_state* sensorData =
1294 (struct pldm_sensor_event_sensor_op_state*)eventDataArr.data();
1295 uint8_t presentState = PLDM_SENSOR_ENABLED;
1296 uint8_t previousState = PLDM_SENSOR_INITIALIZING;
1297 sensorData->present_op_state = presentState;
1298 sensorData->previous_op_state = previousState;
1299
1300 uint8_t retPresentState;
1301 uint8_t retPreviousState;
1302 auto rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData),
1303 eventDataArr.size(), &retPresentState,
1304 &retPreviousState);
1305 EXPECT_EQ(rc, PLDM_SUCCESS);
1306 EXPECT_EQ(retPresentState, presentState);
1307 EXPECT_EQ(retPreviousState, previousState);
1308}
1309
1310TEST(PlatformEventMessage, testBadSensorOpEventDataDecodeRequest)
1311{
1312 uint8_t presentOpState;
1313 uint8_t previousOpState;
1314 size_t sensorDataLength = PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH;
1315 auto rc = decode_sensor_op_data(NULL, sensorDataLength, &presentOpState,
1316 &previousOpState);
1317 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1318
1319 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
1320 sensorData{};
1321 rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1322 sensorDataLength + 1, &presentOpState,
1323 &previousOpState);
1324 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1325
1326 rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1327 sensorDataLength, nullptr, &previousOpState);
1328 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1329}
1330
1331TEST(PlatformEventMessage, testGoodSensorStateEventDataDecodeRequest)
1332{
1333 std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
1334 eventDataArr{};
1335
1336 struct pldm_sensor_event_state_sensor_state* sensorData =
1337 (struct pldm_sensor_event_state_sensor_state*)eventDataArr.data();
1338 uint8_t sensorOffset = 0x02;
1339 uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
1340 uint8_t previousEventState = PLDM_SENSOR_INTEST;
1341 sensorData->sensor_offset = sensorOffset;
1342 sensorData->event_state = eventState;
1343 sensorData->previous_event_state = previousEventState;
1344
1345 uint8_t retSensorOffset;
1346 uint8_t retEventState;
1347 uint8_t retPreviousState;
1348 auto rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
1349 eventDataArr.size(), &retSensorOffset,
1350 &retEventState, &retPreviousState);
1351 EXPECT_EQ(rc, PLDM_SUCCESS);
1352 EXPECT_EQ(retSensorOffset, sensorOffset);
1353 EXPECT_EQ(retEventState, eventState);
1354 EXPECT_EQ(retPreviousState, previousEventState);
1355}
1356
1357TEST(PlatformEventMessage, testBadStateSensorEventDataDecodeRequest)
1358{
1359 uint8_t sensorOffset;
1360 uint8_t eventState;
1361 uint8_t previousEventState;
1362 size_t sensorDataLength = PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH;
1363 auto rc = decode_state_sensor_data(NULL, sensorDataLength, &sensorOffset,
1364 &eventState, &previousEventState);
1365 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1366
1367 std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
1368 sensorData{};
1369 rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1370 sensorDataLength - 1, &sensorOffset,
1371 &eventState, &previousEventState);
1372 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1373
1374 rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1375 sensorDataLength, &sensorOffset, nullptr,
1376 &previousEventState);
1377 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1378}
1379
1380TEST(PlatformEventMessage, testGoodNumericSensorEventDataDecodeRequest)
1381{
1382 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
1383 eventDataArr{};
1384 struct pldm_sensor_event_numeric_sensor_state* sensorData =
1385 (struct pldm_sensor_event_numeric_sensor_state*)eventDataArr.data();
1386
1387 size_t sensorDataLength =
1388 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_32BIT_DATA_LENGTH;
1389 uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
1390 uint8_t previousEventState = PLDM_SENSOR_INTEST;
1391 uint8_t sensorDataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
1392 uint32_t presentReading = 305441741;
1393 sensorData->event_state = eventState;
1394 sensorData->previous_event_state = previousEventState;
1395 sensorData->sensor_data_size = sensorDataSize;
1396 sensorData->present_reading[3] =
1397 static_cast<uint8_t>(htole32(presentReading) & (0x000000ff));
1398 sensorData->present_reading[2] =
1399 static_cast<uint8_t>((htole32(presentReading) & (0x0000ff00)) >> 8);
1400 sensorData->present_reading[1] =
1401 static_cast<uint8_t>((htole32(presentReading) & (0x00ff0000)) >> 16);
1402 sensorData->present_reading[0] =
1403 static_cast<uint8_t>((htole32(presentReading) & (0xff000000)) >> 24);
1404
1405 uint8_t retEventState;
1406 uint8_t retPreviousEventState;
1407 uint8_t retSensorDataSize;
1408 uint32_t retPresentReading;
1409
1410 auto rc = decode_numeric_sensor_data(
1411 reinterpret_cast<uint8_t*>(sensorData), sensorDataLength,
1412 &retEventState, &retPreviousEventState, &retSensorDataSize,
1413 &retPresentReading);
1414 EXPECT_EQ(rc, PLDM_SUCCESS);
1415 EXPECT_EQ(retEventState, eventState);
1416 EXPECT_EQ(retPreviousEventState, previousEventState);
1417 EXPECT_EQ(retSensorDataSize, sensorDataSize);
1418 EXPECT_EQ(retPresentReading, presentReading);
1419
1420 int16_t presentReadingNew = -31432;
1421 sensorData->present_reading[1] =
1422 static_cast<uint8_t>(htole16(presentReadingNew) & (0x000000ff));
1423 sensorData->present_reading[0] =
1424 static_cast<uint8_t>((htole16(presentReadingNew) & (0x0000ff00)) >> 8);
1425 sensorDataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
1426 sensorData->sensor_data_size = sensorDataSize;
1427 sensorDataLength = PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_16BIT_DATA_LENGTH;
1428
1429 rc = decode_numeric_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
1430 sensorDataLength, &retEventState,
1431 &retPreviousEventState, &retSensorDataSize,
1432 &retPresentReading);
1433 EXPECT_EQ(rc, PLDM_SUCCESS);
1434 EXPECT_EQ(retEventState, eventState);
1435 EXPECT_EQ(retPreviousEventState, previousEventState);
1436 EXPECT_EQ(retSensorDataSize, sensorDataSize);
1437 EXPECT_EQ(static_cast<int16_t>(retPresentReading), presentReadingNew);
1438}
1439
1440TEST(PlatformEventMessage, testBadNumericSensorEventDataDecodeRequest)
1441{
1442 uint8_t eventState;
1443 uint8_t previousEventState;
1444 uint8_t sensorDataSize;
1445 uint32_t presentReading;
1446 size_t sensorDataLength =
1447 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH;
1448 auto rc = decode_numeric_sensor_data(NULL, sensorDataLength, &eventState,
1449 &previousEventState, &sensorDataSize,
1450 &presentReading);
1451 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1452
1453 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
1454 sensorData{};
1455 rc = decode_numeric_sensor_data(
1456 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength - 1,
1457 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1458 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1459
1460 struct pldm_sensor_event_numeric_sensor_state* numericSensorData =
1461 (struct pldm_sensor_event_numeric_sensor_state*)sensorData.data();
1462 numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT8;
1463 rc = decode_numeric_sensor_data(
1464 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
1465 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1466 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1467
1468 numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT16;
1469 rc = decode_numeric_sensor_data(
1470 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
1471 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1472 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1473
1474 numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT32;
1475 rc = decode_numeric_sensor_data(
1476 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength - 1,
1477 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1478 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1479}
1480
1481TEST(GetNumericEffecterValue, testGoodEncodeRequest)
1482{
1483 std::vector<uint8_t> requestMsg(hdrSize +
1484 PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES);
1485
1486 uint16_t effecter_id = 0xAB01;
1487
1488 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1489
1490 auto rc = encode_get_numeric_effecter_value_req(0, effecter_id, request);
1491
1492 struct pldm_get_numeric_effecter_value_req* req =
1493 reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
1494 request->payload);
1495
1496 EXPECT_EQ(rc, PLDM_SUCCESS);
1497 EXPECT_EQ(effecter_id, le16toh(req->effecter_id));
1498}
1499
1500TEST(GetNumericEffecterValue, testBadEncodeRequest)
1501{
1502 std::vector<uint8_t> requestMsg(
1503 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
1504
1505 auto rc = encode_get_numeric_effecter_value_req(0, 0, nullptr);
1506 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1507}
1508
1509TEST(GetNumericEffecterValue, testGoodDecodeRequest)
1510{
1511 std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
1512 requestMsg{};
1513
1514 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1515 struct pldm_get_numeric_effecter_value_req* req =
1516 reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
1517 request->payload);
1518
1519 uint16_t effecter_id = 0x12AB;
1520 req->effecter_id = htole16(effecter_id);
1521
1522 uint16_t reteffecter_id;
1523
1524 auto rc = decode_get_numeric_effecter_value_req(
1525 request, requestMsg.size() - hdrSize, &reteffecter_id);
1526
1527 EXPECT_EQ(rc, PLDM_SUCCESS);
1528 EXPECT_EQ(effecter_id, reteffecter_id);
1529}
1530
1531TEST(GetNumericEffecterValue, testBadDecodeRequest)
1532{
1533 std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
1534 requestMsg{};
1535
1536 auto rc = decode_get_numeric_effecter_value_req(
1537 nullptr, requestMsg.size() - hdrSize, nullptr);
1538
1539 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1540
1541 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1542 struct pldm_set_numeric_effecter_value_req* req =
1543 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
1544 request->payload);
1545
1546 uint16_t effecter_id = 0x1A;
1547 req->effecter_id = htole16(effecter_id);
1548 uint16_t reteffecter_id;
1549
1550 rc = decode_get_numeric_effecter_value_req(
1551 request, requestMsg.size() - hdrSize - 1, &reteffecter_id);
1552
1553 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1554}
1555
1556TEST(GetNumericEffecterValue, testGoodEncodeResponse)
1557{
1558 uint8_t completionCode = 0;
1559 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
1560 uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
1561 uint32_t pendingValue = 0x12345678;
1562 uint32_t presentValue = 0xABCDEF11;
1563
1564 std::array<uint8_t,
1565 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
1566 responseMsg{};
1567 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1568
1569 auto rc = encode_get_numeric_effecter_value_resp(
1570 0, completionCode, effecter_dataSize, effecter_operState,
1571 reinterpret_cast<uint8_t*>(&pendingValue),
1572 reinterpret_cast<uint8_t*>(&presentValue), response,
1573 responseMsg.size() - hdrSize);
1574
1575 struct pldm_get_numeric_effecter_value_resp* resp =
1576 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
1577 response->payload);
1578
1579 uint32_t* val_pending = (uint32_t*)(&resp->pending_and_present_values[0]);
1580 *val_pending = le32toh(*val_pending);
1581 uint32_t* val_present = (uint32_t*)(&resp->pending_and_present_values[4]);
1582 *val_present = le32toh(*val_present);
1583
1584 EXPECT_EQ(rc, PLDM_SUCCESS);
1585 EXPECT_EQ(effecter_dataSize, resp->effecter_data_size);
1586 EXPECT_EQ(effecter_operState, resp->effecter_oper_state);
1587 EXPECT_EQ(pendingValue, *val_pending);
1588 EXPECT_EQ(presentValue, *val_present);
1589}
1590
1591TEST(GetNumericEffecterValue, testBadEncodeResponse)
1592{
1593 std::array<uint8_t,
1594 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
1595 responseMsg{};
1596 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1597
1598 uint8_t pendingValue = 0x01;
1599 uint8_t presentValue = 0x02;
1600
1601 auto rc = encode_get_numeric_effecter_value_resp(
1602 0, PLDM_SUCCESS, 0, 0, nullptr, nullptr, nullptr,
1603 responseMsg.size() - hdrSize);
1604 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1605
1606 rc = encode_get_numeric_effecter_value_resp(
1607 0, PLDM_SUCCESS, 6, 9, reinterpret_cast<uint8_t*>(&pendingValue),
1608 reinterpret_cast<uint8_t*>(&presentValue), response,
1609 responseMsg.size() - hdrSize);
1610 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1611
1612 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
1613 uint8_t effecter_operState = EFFECTER_OPER_STATE_FAILED;
1614
1615 rc = encode_get_numeric_effecter_value_resp(
1616 0, PLDM_SUCCESS, effecter_dataSize, effecter_operState,
1617 reinterpret_cast<uint8_t*>(&pendingValue),
1618 reinterpret_cast<uint8_t*>(&presentValue), response,
1619 responseMsg.size() - hdrSize);
1620 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1621}
1622
1623TEST(GetNumericEffecterValue, testGoodDecodeResponse)
1624{
1625 std::array<uint8_t,
1626 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
1627 responseMsg{};
1628
1629 uint8_t completionCode = 0;
1630 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT16;
1631 uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
1632 uint16_t pendingValue = 0x4321;
1633 uint16_t presentValue = 0xDCBA;
1634
1635 uint8_t retcompletionCode;
1636 uint8_t reteffecter_dataSize;
1637 uint8_t reteffecter_operState;
1638 uint8_t retpendingValue[2];
1639 uint8_t retpresentValue[2];
1640
1641 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1642 struct pldm_get_numeric_effecter_value_resp* resp =
1643 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
1644 response->payload);
1645
1646 resp->completion_code = completionCode;
1647 resp->effecter_data_size = effecter_dataSize;
1648 resp->effecter_oper_state = effecter_operState;
1649
1650 uint16_t pendingValue_le = htole16(pendingValue);
1651 memcpy(resp->pending_and_present_values, &pendingValue_le,
1652 sizeof(pendingValue_le));
1653 uint16_t presentValue_le = htole16(presentValue);
1654 memcpy(&resp->pending_and_present_values[2], &presentValue_le,
1655 sizeof(presentValue_le));
1656
1657 auto rc = decode_get_numeric_effecter_value_resp(
1658 response, responseMsg.size() - hdrSize, &retcompletionCode,
1659 &reteffecter_dataSize, &reteffecter_operState, retpendingValue,
1660 retpresentValue);
1661
1662 EXPECT_EQ(rc, PLDM_SUCCESS);
1663 EXPECT_EQ(completionCode, retcompletionCode);
1664 EXPECT_EQ(effecter_dataSize, reteffecter_dataSize);
1665 EXPECT_EQ(effecter_operState, reteffecter_operState);
1666 EXPECT_EQ(pendingValue, *(reinterpret_cast<uint16_t*>(retpendingValue)));
1667 EXPECT_EQ(presentValue, *(reinterpret_cast<uint16_t*>(retpresentValue)));
1668}
1669
1670TEST(GetNumericEffecterValue, testBadDecodeResponse)
1671{
1672 std::array<uint8_t,
1673 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
1674 responseMsg{};
1675
1676 auto rc = decode_get_numeric_effecter_value_resp(
1677 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
1678 nullptr, nullptr);
1679
1680 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1681
1682 uint8_t completionCode = 0;
1683 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_SINT16;
1684 uint8_t effecter_operState = EFFECTER_OPER_STATE_DISABLED;
1685 uint16_t pendingValue = 0x5678;
1686 uint16_t presentValue = 0xCDEF;
1687
1688 uint8_t retcompletionCode;
1689 uint8_t reteffecter_dataSize;
1690 uint8_t reteffecter_operState;
1691 uint8_t retpendingValue[2];
1692 uint8_t retpresentValue[2];
1693
1694 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1695 struct pldm_get_numeric_effecter_value_resp* resp =
1696 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
1697 response->payload);
1698
1699 resp->completion_code = completionCode;
1700 resp->effecter_data_size = effecter_dataSize;
1701 resp->effecter_oper_state = effecter_operState;
1702
1703 uint16_t pendingValue_le = htole16(pendingValue);
1704 memcpy(resp->pending_and_present_values, &pendingValue_le,
1705 sizeof(pendingValue_le));
1706 uint16_t presentValue_le = htole16(presentValue);
1707 memcpy(&resp->pending_and_present_values[2], &presentValue_le,
1708 sizeof(presentValue_le));
1709
1710 rc = decode_get_numeric_effecter_value_resp(
1711 response, responseMsg.size() - hdrSize, &retcompletionCode,
1712 &reteffecter_dataSize, &reteffecter_operState, retpendingValue,
1713 retpresentValue);
1714
1715 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1716}
1717
1718TEST(PldmPDRRepositoryChgEventEvent, testGoodDecodeRequest)
1719{
1720 const uint8_t eventDataFormat = FORMAT_IS_PDR_HANDLES;
1721 const uint8_t numberOfChangeRecords = 2;
1722 uint8_t eventDataOperation1 = PLDM_RECORDS_DELETED;
1723 const uint8_t numberOfChangeEntries1 = 2;
1724 std::array<uint32_t, numberOfChangeEntries1> changeRecordArr1{
1725 {0x00000000, 0x12345678}};
1726 uint8_t eventDataOperation2 = PLDM_RECORDS_ADDED;
1727 const uint8_t numberOfChangeEntries2 = 5;
1728 std::array<uint32_t, numberOfChangeEntries2> changeRecordArr2{
1729 {0x01234567, 0x11223344, 0x45678901, 0x21222324, 0x98765432}};
1730 std::array<uint8_t, PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH +
1731 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH *
1732 numberOfChangeRecords +
1733 (numberOfChangeEntries1 + numberOfChangeEntries2) *
1734 sizeof(uint32_t)>
1735 eventDataArr{};
1736
1737 struct pldm_pdr_repository_chg_event_data* eventData =
1738 reinterpret_cast<struct pldm_pdr_repository_chg_event_data*>(
1739 eventDataArr.data());
1740 eventData->event_data_format = eventDataFormat;
1741 eventData->number_of_change_records = numberOfChangeRecords;
1742 struct pldm_pdr_repository_change_record_data* changeRecord1 =
1743 reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
1744 eventData->change_records);
1745 changeRecord1->event_data_operation = eventDataOperation1;
1746 changeRecord1->number_of_change_entries = numberOfChangeEntries1;
1747 memcpy(changeRecord1->change_entry, &changeRecordArr1[0],
1748 changeRecordArr1.size() * sizeof(uint32_t));
1749 struct pldm_pdr_repository_change_record_data* changeRecord2 =
1750 reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
1751 eventData->change_records +
1752 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH +
1753 (changeRecordArr1.size() * sizeof(uint32_t)));
1754 changeRecord2->event_data_operation = eventDataOperation2;
1755 changeRecord2->number_of_change_entries = numberOfChangeEntries2;
1756 memcpy(changeRecord2->change_entry, &changeRecordArr2[0],
1757 changeRecordArr2.size() * sizeof(uint32_t));
1758
1759 uint8_t retEventDataFormat{};
1760 uint8_t retNumberOfChangeRecords{};
1761 size_t retChangeRecordDataOffset{0};
1762 auto rc = decode_pldm_pdr_repository_chg_event_data(
1763 reinterpret_cast<const uint8_t*>(eventData), eventDataArr.size(),
1764 &retEventDataFormat, &retNumberOfChangeRecords,
1765 &retChangeRecordDataOffset);
1766 EXPECT_EQ(rc, PLDM_SUCCESS);
1767 EXPECT_EQ(retEventDataFormat, FORMAT_IS_PDR_HANDLES);
1768 EXPECT_EQ(retNumberOfChangeRecords, numberOfChangeRecords);
1769
1770 const uint8_t* changeRecordData =
1771 reinterpret_cast<const uint8_t*>(changeRecord1);
1772 size_t changeRecordDataSize =
1773 eventDataArr.size() - PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH;
1774 uint8_t retEventDataOperation;
1775 uint8_t retNumberOfChangeEntries;
1776 size_t retChangeEntryDataOffset;
1777
1778 rc = decode_pldm_pdr_repository_change_record_data(
1779 reinterpret_cast<const uint8_t*>(changeRecordData),
1780 changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
1781 &retChangeEntryDataOffset);
1782 EXPECT_EQ(rc, PLDM_SUCCESS);
1783 EXPECT_EQ(retEventDataOperation, eventDataOperation1);
1784 EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries1);
1785 changeRecordData += retChangeEntryDataOffset;
1786 EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr1[0],
1787 sizeof(uint32_t) * retNumberOfChangeEntries));
1788
1789 changeRecordData += sizeof(uint32_t) * retNumberOfChangeEntries;
1790 changeRecordDataSize -= sizeof(uint32_t) * retNumberOfChangeEntries -
1791 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH;
1792 rc = decode_pldm_pdr_repository_change_record_data(
1793 reinterpret_cast<const uint8_t*>(changeRecordData),
1794 changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
1795 &retChangeEntryDataOffset);
1796 EXPECT_EQ(rc, PLDM_SUCCESS);
1797 EXPECT_EQ(retEventDataOperation, eventDataOperation2);
1798 EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries2);
1799 changeRecordData += retChangeEntryDataOffset;
1800 EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr2[0],
1801 sizeof(uint32_t) * retNumberOfChangeEntries));
1802}
1803
1804TEST(PldmPDRRepositoryChgEventEvent, testBadDecodeRequest)
1805{
1806 uint8_t eventDataFormat{};
1807 uint8_t numberOfChangeRecords{};
1808 size_t changeRecordDataOffset{};
1809 auto rc = decode_pldm_pdr_repository_chg_event_data(
1810 NULL, 0, &eventDataFormat, &numberOfChangeRecords,
1811 &changeRecordDataOffset);
1812 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1813
1814 std::array<uint8_t, 2> eventData{};
1815 rc = decode_pldm_pdr_repository_chg_event_data(
1816 reinterpret_cast<const uint8_t*>(eventData.data()), 0, &eventDataFormat,
1817 &numberOfChangeRecords, &changeRecordDataOffset);
1818 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1819
1820 uint8_t eventDataOperation{};
1821 uint8_t numberOfChangeEntries{};
1822 size_t changeEntryDataOffset{};
1823 rc = decode_pldm_pdr_repository_change_record_data(
1824 NULL, 0, &eventDataOperation, &numberOfChangeEntries,
1825 &changeEntryDataOffset);
1826 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1827
1828 std::array<uint8_t, 2> changeRecord{};
1829 rc = decode_pldm_pdr_repository_change_record_data(
1830 reinterpret_cast<const uint8_t*>(changeRecord.data()), 0,
1831 &eventDataOperation, &numberOfChangeEntries, &changeEntryDataOffset);
1832 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1833}
1834
1835TEST(GetSensorReading, testGoodEncodeRequest)
1836{
1837 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
1838 requestMsg{};
1839
1840 uint16_t sensorId = 0x1234;
1841 bool8_t rearmEventState = 0x01;
1842
1843 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1844 auto rc =
1845 encode_get_sensor_reading_req(0, sensorId, rearmEventState, request);
1846
1847 struct pldm_get_sensor_reading_req* req =
1848 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
1849
1850 EXPECT_EQ(rc, PLDM_SUCCESS);
1851 EXPECT_EQ(sensorId, le16toh(req->sensor_id));
1852 EXPECT_EQ(rearmEventState, req->rearm_event_state);
1853}
1854
1855TEST(GetSensorReading, testBadEncodeRequest)
1856{
1857 auto rc = encode_get_sensor_reading_req(0, 0, 0, nullptr);
1858
1859 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1860}
1861
1862TEST(GetSensorReading, testGoodDecodeRequest)
1863{
1864 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
1865 requestMsg{};
1866
1867 uint16_t sensorId = 0xABCD;
1868 bool8_t rearmEventState = 0xA;
1869
1870 uint16_t retsensorId;
1871 bool8_t retrearmEventState;
1872
1873 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1874
1875 struct pldm_get_sensor_reading_req* req =
1876 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
1877
1878 req->sensor_id = htole16(sensorId);
1879 req->rearm_event_state = rearmEventState;
1880
1881 auto rc =
1882 decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize,
1883 &retsensorId, &retrearmEventState);
1884
1885 EXPECT_EQ(rc, PLDM_SUCCESS);
1886 EXPECT_EQ(sensorId, retsensorId);
1887 EXPECT_EQ(rearmEventState, retrearmEventState);
1888}
1889
1890TEST(GetSensorReading, testBadDecodeRequest)
1891{
1892 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
1893 requestMsg{};
1894
1895 auto rc = decode_get_sensor_reading_req(
1896 nullptr, requestMsg.size() - hdrSize, nullptr, nullptr);
1897 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1898
1899 uint16_t sensorId = 0xABCD;
1900 bool8_t rearmEventState = 0xA;
1901
1902 uint16_t retsensorId;
1903 bool8_t retrearmEventState;
1904
1905 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1906
1907 struct pldm_get_sensor_reading_req* req =
1908 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
1909
1910 req->sensor_id = htole16(sensorId);
1911 req->rearm_event_state = rearmEventState;
1912
1913 rc = decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize - 1,
1914 &retsensorId, &retrearmEventState);
1915
1916 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1917}
1918
1919TEST(GetSensorReading, testGoodEncodeResponse)
1920{
1921 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES>
1922 responseMsg{};
1923
1924 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1925
1926 uint8_t completionCode = 0;
1927 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
1928 uint8_t sensor_operationalState = PLDM_SENSOR_ENABLED;
1929 uint8_t sensor_event_messageEnable = PLDM_NO_EVENT_GENERATION;
1930 uint8_t presentState = PLDM_SENSOR_NORMAL;
1931 uint8_t previousState = PLDM_SENSOR_WARNING;
1932 uint8_t eventState = PLDM_SENSOR_UPPERWARNING;
1933 uint8_t presentReading = 0x21;
1934
1935 auto rc = encode_get_sensor_reading_resp(
1936 0, completionCode, sensor_dataSize, sensor_operationalState,
1937 sensor_event_messageEnable, presentState, previousState, eventState,
1938 reinterpret_cast<uint8_t*>(&presentReading), response,
1939 responseMsg.size() - hdrSize);
1940
1941 struct pldm_get_sensor_reading_resp* resp =
1942 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
1943 response->payload);
1944
1945 EXPECT_EQ(rc, PLDM_SUCCESS);
1946 EXPECT_EQ(completionCode, resp->completion_code);
1947 EXPECT_EQ(sensor_dataSize, resp->sensor_data_size);
1948 EXPECT_EQ(sensor_operationalState, resp->sensor_operational_state);
1949 EXPECT_EQ(sensor_event_messageEnable, resp->sensor_event_message_enable);
1950 EXPECT_EQ(presentState, resp->present_state);
1951 EXPECT_EQ(previousState, resp->previous_state);
1952 EXPECT_EQ(eventState, resp->event_state);
1953 EXPECT_EQ(presentReading,
1954 *(reinterpret_cast<uint8_t*>(&resp->present_reading[0])));
1955}
1956
1957TEST(GetSensorReading, testBadEncodeResponse)
1958{
1959 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
1960 responseMsg{};
1961
1962 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1963
1964 uint8_t presentReading = 0x1;
1965
1966 auto rc = encode_get_sensor_reading_resp(0, PLDM_SUCCESS, 0, 0, 0, 0, 0, 0,
1967 nullptr, nullptr,
1968 responseMsg.size() - hdrSize);
1969 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1970
1971 rc = encode_get_sensor_reading_resp(
1972 0, PLDM_SUCCESS, 6, 1, 1, 1, 1, 1,
1973 reinterpret_cast<uint8_t*>(&presentReading), response,
1974 responseMsg.size() - hdrSize);
1975 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1976
1977 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
1978
1979 rc = encode_get_sensor_reading_resp(
1980 0, PLDM_SUCCESS, sensor_dataSize, 1, 1, 1, 1, 1,
1981 reinterpret_cast<uint8_t*>(&presentReading), response,
1982 responseMsg.size() - hdrSize);
1983 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1984}
1985
1986TEST(GetSensorReading, testGoodDecodeResponse)
1987{
1988 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
1989 responseMsg{};
1990
1991 uint8_t completionCode = 0;
1992 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
1993 uint8_t sensor_operationalState = PLDM_SENSOR_STATUSUNKOWN;
1994 uint8_t sensor_event_messageEnable = PLDM_EVENTS_ENABLED;
1995 uint8_t presentState = PLDM_SENSOR_CRITICAL;
1996 uint8_t previousState = PLDM_SENSOR_UPPERCRITICAL;
1997 uint8_t eventState = PLDM_SENSOR_WARNING;
1998 uint32_t presentReading = 0xABCDEF11;
1999
2000 uint8_t retcompletionCode;
2001 uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
2002 uint8_t retsensor_operationalState;
2003 uint8_t retsensor_event_messageEnable;
2004 uint8_t retpresentState;
2005 uint8_t retpreviousState;
2006 uint8_t reteventState;
2007 uint8_t retpresentReading[4];
2008
2009 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2010 struct pldm_get_sensor_reading_resp* resp =
2011 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
2012 response->payload);
2013
2014 resp->completion_code = completionCode;
2015 resp->sensor_data_size = sensor_dataSize;
2016 resp->sensor_operational_state = sensor_operationalState;
2017 resp->sensor_event_message_enable = sensor_event_messageEnable;
2018 resp->present_state = presentState;
2019 resp->previous_state = previousState;
2020 resp->event_state = eventState;
2021
2022 uint32_t presentReading_le = htole32(presentReading);
2023 memcpy(resp->present_reading, &presentReading_le,
2024 sizeof(presentReading_le));
2025
2026 auto rc = decode_get_sensor_reading_resp(
2027 response, responseMsg.size() - hdrSize, &retcompletionCode,
2028 &retsensor_dataSize, &retsensor_operationalState,
2029 &retsensor_event_messageEnable, &retpresentState, &retpreviousState,
2030 &reteventState, retpresentReading);
2031
2032 EXPECT_EQ(rc, PLDM_SUCCESS);
2033 EXPECT_EQ(completionCode, retcompletionCode);
2034 EXPECT_EQ(sensor_dataSize, retsensor_dataSize);
2035 EXPECT_EQ(sensor_operationalState, retsensor_operationalState);
2036 EXPECT_EQ(sensor_event_messageEnable, retsensor_event_messageEnable);
2037 EXPECT_EQ(presentState, retpresentState);
2038 EXPECT_EQ(previousState, retpreviousState);
2039 EXPECT_EQ(eventState, reteventState);
2040 EXPECT_EQ(presentReading,
2041 *(reinterpret_cast<uint32_t*>(retpresentReading)));
2042}
2043
2044TEST(GetSensorReading, testBadDecodeResponse)
2045{
2046 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 1>
2047 responseMsg{};
2048
2049 auto rc = decode_get_sensor_reading_resp(
2050 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
2051 nullptr, nullptr, nullptr, nullptr, nullptr);
2052
2053 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2054
2055 uint8_t completionCode = 0;
2056 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
2057 uint8_t sensor_operationalState = PLDM_SENSOR_INTEST;
2058 uint8_t sensor_event_messageEnable = PLDM_EVENTS_DISABLED;
2059 uint8_t presentState = PLDM_SENSOR_FATAL;
2060 uint8_t previousState = PLDM_SENSOR_UPPERFATAL;
2061 uint8_t eventState = PLDM_SENSOR_WARNING;
2062 uint8_t presentReading = 0xA;
2063
2064 uint8_t retcompletionCode;
2065 uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
2066 uint8_t retsensor_operationalState;
2067 uint8_t retsensor_event_messageEnable;
2068 uint8_t retpresent_state;
2069 uint8_t retprevious_state;
2070 uint8_t retevent_state;
2071 uint8_t retpresentReading;
2072
2073 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2074 struct pldm_get_sensor_reading_resp* resp =
2075 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
2076 response->payload);
2077
2078 resp->completion_code = completionCode;
2079 resp->sensor_data_size = sensor_dataSize;
2080 resp->sensor_operational_state = sensor_operationalState;
2081 resp->sensor_event_message_enable = sensor_event_messageEnable;
2082 resp->present_state = presentState;
2083 resp->previous_state = previousState;
2084 resp->event_state = eventState;
2085 resp->present_reading[0] = presentReading;
2086
2087 rc = decode_get_sensor_reading_resp(
2088 response, responseMsg.size() - hdrSize, &retcompletionCode,
2089 &retsensor_dataSize, &retsensor_operationalState,
2090 &retsensor_event_messageEnable, &retpresent_state, &retprevious_state,
2091 &retevent_state, reinterpret_cast<uint8_t*>(&retpresentReading));
2092
2093 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2094}
2095
2096TEST(SetEventReceiver, testGoodEncodeRequest)
2097{
2098 uint8_t eventMessageGlobalEnable =
2099 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
2100 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
2101 uint8_t eventReceiverAddressInfo = 0x08;
2102 uint16_t heartbeatTimer = 0x78;
2103
2104 std::vector<uint8_t> requestMsg(hdrSize +
2105 PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
2106 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2107
2108 auto rc = encode_set_event_receiver_req(
2109 0, eventMessageGlobalEnable, transportProtocolType,
2110 eventReceiverAddressInfo, heartbeatTimer, request);
2111
2112 EXPECT_EQ(rc, PLDM_SUCCESS);
2113 struct pldm_set_event_receiver_req* req =
2114 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
2115 EXPECT_EQ(eventMessageGlobalEnable, req->event_message_global_enable);
2116 EXPECT_EQ(transportProtocolType, req->transport_protocol_type);
2117 EXPECT_EQ(eventReceiverAddressInfo, req->event_receiver_address_info);
2118 EXPECT_EQ(heartbeatTimer, le16toh(req->heartbeat_timer));
2119}
2120
2121TEST(SetEventReceiver, testBadEncodeRequest)
2122{
2123 uint8_t eventMessageGlobalEnable =
2124 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
2125 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
2126 uint8_t eventReceiverAddressInfo = 0x08;
2127 uint16_t heartbeatTimer = 0;
2128
2129 std::vector<uint8_t> requestMsg(hdrSize +
2130 PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
2131 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2132
2133 auto rc = encode_set_event_receiver_req(
2134 0, eventMessageGlobalEnable, transportProtocolType,
2135 eventReceiverAddressInfo, heartbeatTimer, request);
2136
2137 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2138}
2139
2140TEST(SetEventReceiver, testGoodDecodeResponse)
2141{
2142 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
2143 responseMsg{};
2144
2145 uint8_t retcompletion_code = 0;
2146 responseMsg[hdrSize] = PLDM_SUCCESS;
2147
2148 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2149 auto rc = decode_set_event_receiver_resp(
2150 response, responseMsg.size() - sizeof(pldm_msg_hdr),
2151 &retcompletion_code);
2152
2153 EXPECT_EQ(rc, PLDM_SUCCESS);
2154 EXPECT_EQ(PLDM_SUCCESS, retcompletion_code);
2155}
2156
2157TEST(SetEventReceiver, testBadDecodeResponse)
2158{
2159 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
2160 responseMsg{};
2161 uint8_t retcompletion_code = 0;
2162 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2163
2164 auto rc = decode_set_event_receiver_resp(
2165 response, responseMsg.size() - sizeof(pldm_msg_hdr), NULL);
2166
2167 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2168
2169 rc = decode_set_event_receiver_resp(
2170 nullptr, responseMsg.size() - sizeof(pldm_msg_hdr),
2171 &retcompletion_code);
2172
2173 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2174}
2175
2176TEST(SetEventReceiver, testGoodEncodeResponse)
2177{
2178 std::array<uint8_t,
2179 sizeof(pldm_msg_hdr) + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
2180 responseMsg{};
2181 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2182 uint8_t completionCode = 0;
2183
2184 auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, response);
2185
2186 EXPECT_EQ(rc, PLDM_SUCCESS);
2187 EXPECT_EQ(completionCode, response->payload[0]);
2188}
2189
2190TEST(SetEventReceiver, testBadEncodeResponse)
2191{
2192 auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, NULL);
2193 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2194}
2195
2196TEST(SetEventReceiver, testGoodDecodeRequest)
2197{
2198
2199 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
2200 requestMsg{};
2201
2202 uint8_t eventMessageGlobalEnable =
2203 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
2204 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
2205 uint8_t eventReceiverAddressInfo = 0x08;
2206 uint16_t heartbeatTimer = 0x78;
2207
2208 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2209 struct pldm_set_event_receiver_req* req =
2210 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
2211
2212 req->event_message_global_enable = eventMessageGlobalEnable;
2213 req->transport_protocol_type = transportProtocolType;
2214 req->event_receiver_address_info = eventReceiverAddressInfo;
2215 req->heartbeat_timer = htole16(heartbeatTimer);
2216
2217 uint8_t reteventMessageGlobalEnable;
2218 uint8_t rettransportProtocolType;
2219 uint8_t reteventReceiverAddressInfo;
2220 uint16_t retheartbeatTimer;
2221 auto rc = decode_set_event_receiver_req(
2222 request, requestMsg.size() - hdrSize, &reteventMessageGlobalEnable,
2223 &rettransportProtocolType, &reteventReceiverAddressInfo,
2224 &retheartbeatTimer);
2225
2226 EXPECT_EQ(rc, PLDM_SUCCESS);
2227 EXPECT_EQ(eventMessageGlobalEnable, reteventMessageGlobalEnable);
2228 EXPECT_EQ(transportProtocolType, rettransportProtocolType);
2229 EXPECT_EQ(eventReceiverAddressInfo, reteventReceiverAddressInfo);
2230 EXPECT_EQ(heartbeatTimer, retheartbeatTimer);
2231}
2232
2233TEST(SetEventReceiver, testBadDecodeRequest)
2234{
2235 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
2236 requestMsg{};
2237
2238 auto rc = decode_set_event_receiver_req(NULL, requestMsg.size() - hdrSize,
2239 NULL, NULL, NULL, NULL);
2240 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2241
2242 uint8_t eventMessageGlobalEnable =
2243 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
2244 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
2245 uint8_t eventReceiverAddressInfo = 0x08;
2246 uint16_t heartbeatTimer = 0x78;
2247
2248 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2249 struct pldm_set_event_receiver_req* req =
2250 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
2251
2252 req->event_message_global_enable = eventMessageGlobalEnable;
2253 req->transport_protocol_type = transportProtocolType;
2254 req->event_receiver_address_info = eventReceiverAddressInfo;
2255 req->heartbeat_timer = htole16(heartbeatTimer);
2256
2257 uint8_t reteventMessageGlobalEnable;
2258 uint8_t rettransportProtocolType;
2259 uint8_t reteventReceiverAddressInfo;
2260 uint16_t retheartbeatTimer;
2261 rc = decode_set_event_receiver_req(
2262 request, requestMsg.size() - hdrSize - 1, &reteventMessageGlobalEnable,
2263 &rettransportProtocolType, &reteventReceiverAddressInfo,
2264 &retheartbeatTimer);
2265 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2266}