blob: 58242fb6a56691699a9f2695cbc5fdfbcdb8184e [file] [log] [blame]
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05301#include <endian.h>
Andrew Jeffery9c766792022-08-10 23:12:49 +09302
3#include <array>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05304#include <cstdint>
Andrew Jeffery5a706072023-04-05 19:45:31 +09305#include <cstring>
Manojkiran Eda9a8e4972022-11-28 16:38:21 +05306#include <vector>
Andrew Jeffery9c766792022-08-10 23:12:49 +09307
8#include "libpldm/base.h"
Andrew Jeffery7992eb82023-04-06 16:13:53 +09309#include "libpldm/entity.h"
Andrew Jeffery9c766792022-08-10 23:12:49 +093010#include "libpldm/platform.h"
Manojkiran Eda9a8e4972022-11-28 16:38:21 +053011#include "pldm_types.h"
Andrew Jeffery9c766792022-08-10 23:12:49 +093012
13#include <gtest/gtest.h>
14
15constexpr auto hdrSize = sizeof(pldm_msg_hdr);
16
17TEST(SetStateEffecterStates, testEncodeResponse)
18{
19 std::array<uint8_t,
20 sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
21 responseMsg{};
22 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
23 uint8_t completionCode = 0;
24
25 auto rc = encode_set_state_effecter_states_resp(0, PLDM_SUCCESS, response);
26
27 EXPECT_EQ(rc, PLDM_SUCCESS);
28 EXPECT_EQ(completionCode, response->payload[0]);
29}
30
31TEST(SetStateEffecterStates, testEncodeRequest)
32{
33 std::array<uint8_t,
34 sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES>
35 requestMsg{};
36 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
37
38 uint16_t effecterId = 0x0A;
39 uint8_t compEffecterCnt = 0x2;
40 std::array<set_effecter_state_field, 8> stateField{};
41 stateField[0] = {PLDM_REQUEST_SET, 2};
42 stateField[1] = {PLDM_REQUEST_SET, 3};
43
44 auto rc = encode_set_state_effecter_states_req(
45 0, effecterId, compEffecterCnt, stateField.data(), request);
46
47 EXPECT_EQ(rc, PLDM_SUCCESS);
48 EXPECT_EQ(effecterId, request->payload[0]);
49 EXPECT_EQ(compEffecterCnt, request->payload[sizeof(effecterId)]);
50 EXPECT_EQ(stateField[0].set_request,
51 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt)]);
52 EXPECT_EQ(stateField[0].effecter_state,
53 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
54 sizeof(stateField[0].set_request)]);
55 EXPECT_EQ(stateField[1].set_request,
56 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
57 sizeof(stateField[0])]);
58 EXPECT_EQ(stateField[1].effecter_state,
59 request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
60 sizeof(stateField[0]) +
61 sizeof(stateField[1].set_request)]);
62}
63
64TEST(SetStateEffecterStates, testGoodDecodeResponse)
65{
66 std::array<uint8_t, hdrSize + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
67 responseMsg{};
68
69 uint8_t retcompletion_code = 0;
70
71 responseMsg[hdrSize] = PLDM_SUCCESS;
72
73 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
74
75 auto rc = decode_set_state_effecter_states_resp(
76 response, responseMsg.size() - hdrSize, &retcompletion_code);
77
78 EXPECT_EQ(rc, PLDM_SUCCESS);
79 EXPECT_EQ(PLDM_SUCCESS, retcompletion_code);
80}
81
82TEST(SetStateEffecterStates, testGoodDecodeRequest)
83{
84 std::array<uint8_t, hdrSize + PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES>
85 requestMsg{};
86
87 uint16_t effecterId = 0x32;
88 uint16_t effecterIdLE = htole16(effecterId);
89 uint8_t compEffecterCnt = 0x2;
90
91 std::array<set_effecter_state_field, 8> stateField{};
92 stateField[0] = {PLDM_REQUEST_SET, 3};
93 stateField[1] = {PLDM_REQUEST_SET, 4};
94
95 uint16_t retEffecterId = 0;
96 uint8_t retCompEffecterCnt = 0;
97
98 std::array<set_effecter_state_field, 8> retStateField{};
99
100 memcpy(requestMsg.data() + hdrSize, &effecterIdLE, sizeof(effecterIdLE));
101 memcpy(requestMsg.data() + sizeof(effecterIdLE) + hdrSize, &compEffecterCnt,
102 sizeof(compEffecterCnt));
103 memcpy(requestMsg.data() + sizeof(effecterIdLE) + sizeof(compEffecterCnt) +
104 hdrSize,
105 &stateField, sizeof(stateField));
106
107 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
108
109 auto rc = decode_set_state_effecter_states_req(
110 request, requestMsg.size() - hdrSize, &retEffecterId,
111 &retCompEffecterCnt, retStateField.data());
112
113 EXPECT_EQ(rc, PLDM_SUCCESS);
114 EXPECT_EQ(effecterId, retEffecterId);
115 EXPECT_EQ(retCompEffecterCnt, compEffecterCnt);
116 EXPECT_EQ(retStateField[0].set_request, stateField[0].set_request);
117 EXPECT_EQ(retStateField[0].effecter_state, stateField[0].effecter_state);
118 EXPECT_EQ(retStateField[1].set_request, stateField[1].set_request);
119 EXPECT_EQ(retStateField[1].effecter_state, stateField[1].effecter_state);
120}
121
122TEST(SetStateEffecterStates, testBadDecodeRequest)
123{
124 const struct pldm_msg* msg = NULL;
125
126 auto rc = decode_set_state_effecter_states_req(msg, sizeof(*msg), NULL,
127 NULL, NULL);
128
129 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
130}
131
132TEST(SetStateEffecterStates, testBadDecodeResponse)
133{
134 std::array<uint8_t, PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
135 responseMsg{};
136
137 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
138
139 auto rc = decode_set_state_effecter_states_resp(response,
140 responseMsg.size(), NULL);
141
142 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
143}
144
145TEST(GetPDR, testGoodEncodeResponse)
146{
147 uint8_t completionCode = 0;
148 uint32_t nextRecordHndl = 0x12;
149 uint32_t nextDataTransferHndl = 0x13;
150 uint8_t transferFlag = PLDM_END;
151 uint16_t respCnt = 0x5;
152 std::vector<uint8_t> recordData{1, 2, 3, 4, 5};
153 uint8_t transferCRC = 6;
154
155 // + size of record data and transfer CRC
156 std::vector<uint8_t> responseMsg(hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES +
157 recordData.size() + 1);
158 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
159
160 auto rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
161 nextDataTransferHndl, transferFlag, respCnt,
162 recordData.data(), transferCRC, response);
163
164 EXPECT_EQ(rc, PLDM_SUCCESS);
165 struct pldm_get_pdr_resp* resp =
166 reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
167
168 EXPECT_EQ(completionCode, resp->completion_code);
169 EXPECT_EQ(nextRecordHndl, le32toh(resp->next_record_handle));
170 EXPECT_EQ(nextDataTransferHndl, le32toh(resp->next_data_transfer_handle));
171 EXPECT_EQ(transferFlag, resp->transfer_flag);
172 EXPECT_EQ(respCnt, le16toh(resp->response_count));
173 EXPECT_EQ(0,
174 memcmp(recordData.data(), resp->record_data, recordData.size()));
175 EXPECT_EQ(*(response->payload + sizeof(pldm_get_pdr_resp) - 1 +
176 recordData.size()),
177 transferCRC);
178
179 transferFlag = PLDM_START_AND_END; // No CRC in this case
180 responseMsg.resize(responseMsg.size() - sizeof(transferCRC));
181 rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
182 nextDataTransferHndl, transferFlag, respCnt,
183 recordData.data(), transferCRC, response);
184 EXPECT_EQ(rc, PLDM_SUCCESS);
185}
186
187TEST(GetPDR, testBadEncodeResponse)
188{
189 uint32_t nextRecordHndl = 0x12;
190 uint32_t nextDataTransferHndl = 0x13;
191 uint8_t transferFlag = PLDM_START_AND_END;
192 uint16_t respCnt = 0x5;
193 std::vector<uint8_t> recordData{1, 2, 3, 4, 5};
194 uint8_t transferCRC = 0;
195
196 auto rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
197 nextDataTransferHndl, transferFlag, respCnt,
198 recordData.data(), transferCRC, nullptr);
199
200 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
201}
202
203TEST(GetPDR, testGoodDecodeRequest)
204{
205 std::array<uint8_t, hdrSize + PLDM_GET_PDR_REQ_BYTES> requestMsg{};
206
207 uint32_t recordHndl = 0x32;
208 uint32_t dataTransferHndl = 0x11;
209 uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
210 uint16_t requestCnt = 0x5;
211 uint16_t recordChangeNum = 0x01;
212
213 uint32_t retRecordHndl = 0;
214 uint32_t retDataTransferHndl = 0;
215 uint8_t retTransferOpFlag = 0;
216 uint16_t retRequestCnt = 0;
217 uint16_t retRecordChangeNum = 0;
218
219 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
220 struct pldm_get_pdr_req* request =
221 reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
222
223 request->record_handle = htole32(recordHndl);
224 request->data_transfer_handle = htole32(dataTransferHndl);
225 request->transfer_op_flag = transferOpFlag;
226 request->request_count = htole16(requestCnt);
227 request->record_change_number = htole16(recordChangeNum);
228
229 auto rc = decode_get_pdr_req(
230 req, requestMsg.size() - hdrSize, &retRecordHndl, &retDataTransferHndl,
231 &retTransferOpFlag, &retRequestCnt, &retRecordChangeNum);
232
233 EXPECT_EQ(rc, PLDM_SUCCESS);
234 EXPECT_EQ(retRecordHndl, recordHndl);
235 EXPECT_EQ(retDataTransferHndl, dataTransferHndl);
236 EXPECT_EQ(retTransferOpFlag, transferOpFlag);
237 EXPECT_EQ(retRequestCnt, requestCnt);
238 EXPECT_EQ(retRecordChangeNum, recordChangeNum);
239}
240
241TEST(GetPDR, testBadDecodeRequest)
242{
243 std::array<uint8_t, PLDM_GET_PDR_REQ_BYTES> requestMsg{};
244 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
245
246 auto rc = decode_get_pdr_req(req, requestMsg.size(), NULL, NULL, NULL, NULL,
247 NULL);
248
249 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
250}
251
252TEST(GetPDR, testGoodEncodeRequest)
253{
254 uint32_t record_hndl = 0;
255 uint32_t data_transfer_hndl = 0;
256 uint8_t transfer_op_flag = PLDM_GET_FIRSTPART;
257 uint16_t request_cnt = 20;
258 uint16_t record_chg_num = 0;
259
260 std::vector<uint8_t> requestMsg(hdrSize + PLDM_GET_PDR_REQ_BYTES);
261 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
262
263 auto rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
264 transfer_op_flag, request_cnt, record_chg_num,
265 request, PLDM_GET_PDR_REQ_BYTES);
266 EXPECT_EQ(rc, PLDM_SUCCESS);
267 struct pldm_get_pdr_req* req =
268 reinterpret_cast<struct pldm_get_pdr_req*>(request->payload);
269 EXPECT_EQ(record_hndl, le32toh(req->record_handle));
270 EXPECT_EQ(data_transfer_hndl, le32toh(req->data_transfer_handle));
271 EXPECT_EQ(transfer_op_flag, req->transfer_op_flag);
272 EXPECT_EQ(request_cnt, le16toh(req->request_count));
273 EXPECT_EQ(record_chg_num, le16toh(req->record_change_number));
274}
275
276TEST(GetPDR, testBadEncodeRequest)
277{
278 uint32_t record_hndl = 0;
279 uint32_t data_transfer_hndl = 0;
280 uint8_t transfer_op_flag = PLDM_GET_FIRSTPART;
281 uint16_t request_cnt = 32;
282 uint16_t record_chg_num = 0;
283
284 std::vector<uint8_t> requestMsg(hdrSize + PLDM_GET_PDR_REQ_BYTES);
285 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
286
287 auto rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
288 transfer_op_flag, request_cnt, record_chg_num,
289 nullptr, PLDM_GET_PDR_REQ_BYTES);
290 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
291
292 rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
293 transfer_op_flag, request_cnt, record_chg_num,
294 request, PLDM_GET_PDR_REQ_BYTES + 1);
295 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
296}
297
298TEST(GetPDR, testGoodDecodeResponse)
299{
300 const char* recordData = "123456789";
301 uint8_t completionCode = PLDM_SUCCESS;
302 uint32_t nextRecordHndl = 0;
303 uint32_t nextDataTransferHndl = 0;
304 uint8_t transferFlag = PLDM_END;
305 constexpr uint16_t respCnt = 9;
306 uint8_t transferCRC = 96;
307 size_t recordDataLength = 32;
308 std::array<uint8_t, hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES + respCnt +
309 sizeof(transferCRC)>
310 responseMsg{};
311
312 uint8_t retCompletionCode = 0;
313 uint8_t retRecordData[32] = {0};
314 uint32_t retNextRecordHndl = 0;
315 uint32_t retNextDataTransferHndl = 0;
316 uint8_t retTransferFlag = 0;
317 uint16_t retRespCnt = 0;
318 uint8_t retTransferCRC = 0;
319
320 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
321 struct pldm_get_pdr_resp* resp =
322 reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
323 resp->completion_code = completionCode;
324 resp->next_record_handle = htole32(nextRecordHndl);
325 resp->next_data_transfer_handle = htole32(nextDataTransferHndl);
326 resp->transfer_flag = transferFlag;
327 resp->response_count = htole16(respCnt);
328 memcpy(resp->record_data, recordData, respCnt);
329 response->payload[PLDM_GET_PDR_MIN_RESP_BYTES + respCnt] = transferCRC;
330
331 auto rc = decode_get_pdr_resp(
332 response, responseMsg.size() - hdrSize, &retCompletionCode,
333 &retNextRecordHndl, &retNextDataTransferHndl, &retTransferFlag,
334 &retRespCnt, retRecordData, recordDataLength, &retTransferCRC);
335 EXPECT_EQ(rc, PLDM_SUCCESS);
336 EXPECT_EQ(retCompletionCode, completionCode);
337 EXPECT_EQ(retNextRecordHndl, nextRecordHndl);
338 EXPECT_EQ(retNextDataTransferHndl, nextDataTransferHndl);
339 EXPECT_EQ(retTransferFlag, transferFlag);
340 EXPECT_EQ(retRespCnt, respCnt);
341 EXPECT_EQ(retTransferCRC, transferCRC);
342 EXPECT_EQ(0, memcmp(recordData, resp->record_data, respCnt));
343}
344
345TEST(GetPDR, testBadDecodeResponse)
346{
347 const char* recordData = "123456789";
348 uint8_t completionCode = PLDM_SUCCESS;
349 uint32_t nextRecordHndl = 0;
350 uint32_t nextDataTransferHndl = 0;
351 uint8_t transferFlag = PLDM_END;
352 constexpr uint16_t respCnt = 9;
353 uint8_t transferCRC = 96;
354 size_t recordDataLength = 32;
355 std::array<uint8_t, hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES + respCnt +
356 sizeof(transferCRC)>
357 responseMsg{};
358
359 uint8_t retCompletionCode = 0;
360 uint8_t retRecordData[32] = {0};
361 uint32_t retNextRecordHndl = 0;
362 uint32_t retNextDataTransferHndl = 0;
363 uint8_t retTransferFlag = 0;
364 uint16_t retRespCnt = 0;
365 uint8_t retTransferCRC = 0;
366
367 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
368 struct pldm_get_pdr_resp* resp =
369 reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
370 resp->completion_code = completionCode;
371 resp->next_record_handle = htole32(nextRecordHndl);
372 resp->next_data_transfer_handle = htole32(nextDataTransferHndl);
373 resp->transfer_flag = transferFlag;
374 resp->response_count = htole16(respCnt);
375 memcpy(resp->record_data, recordData, respCnt);
376 response->payload[PLDM_GET_PDR_MIN_RESP_BYTES + respCnt] = transferCRC;
377
378 auto rc = decode_get_pdr_resp(response, responseMsg.size() - hdrSize, NULL,
379 NULL, NULL, NULL, NULL, NULL, 0, NULL);
380 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
381
382 rc = decode_get_pdr_resp(
383 response, responseMsg.size() - hdrSize - 1, &retCompletionCode,
384 &retNextRecordHndl, &retNextDataTransferHndl, &retTransferFlag,
385 &retRespCnt, retRecordData, recordDataLength, &retTransferCRC);
386 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
387}
388
389TEST(GetPDRRepositoryInfo, testGoodEncodeResponse)
390{
391 uint8_t completionCode = 0;
392 uint8_t repositoryState = PLDM_AVAILABLE;
393 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
394 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
395 uint32_t recordCount = 100;
396 uint32_t repositorySize = 100;
397 uint32_t largestRecordSize = UINT32_MAX;
398 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
399
400 std::vector<uint8_t> responseMsg(hdrSize +
401 PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES);
402 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
403
404 auto rc = encode_get_pdr_repository_info_resp(
405 0, PLDM_SUCCESS, repositoryState, updateTime, oemUpdateTime,
406 recordCount, repositorySize, largestRecordSize,
407 dataTransferHandleTimeout, response);
408
409 EXPECT_EQ(rc, PLDM_SUCCESS);
410 struct pldm_pdr_repository_info_resp* resp =
411 reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
412 response->payload);
413
414 EXPECT_EQ(completionCode, resp->completion_code);
415 EXPECT_EQ(repositoryState, resp->repository_state);
416 EXPECT_EQ(0, memcmp(updateTime, resp->update_time, PLDM_TIMESTAMP104_SIZE));
417 EXPECT_EQ(0, memcmp(oemUpdateTime, resp->oem_update_time,
418 PLDM_TIMESTAMP104_SIZE));
419 EXPECT_EQ(recordCount, le32toh(resp->record_count));
420 EXPECT_EQ(repositorySize, le32toh(resp->repository_size));
421 EXPECT_EQ(largestRecordSize, le32toh(resp->largest_record_size));
422 EXPECT_EQ(dataTransferHandleTimeout, resp->data_transfer_handle_timeout);
423}
424
425TEST(GetPDRRepositoryInfo, testBadEncodeResponse)
426{
427 uint8_t repositoryState = PLDM_AVAILABLE;
428 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
429 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
430 uint32_t recordCount = 100;
431 uint32_t repositorySize = 100;
432 uint32_t largestRecordSize = UINT32_MAX;
433 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
434
435 auto rc = encode_get_pdr_repository_info_resp(
436 0, PLDM_SUCCESS, repositoryState, updateTime, oemUpdateTime,
437 recordCount, repositorySize, largestRecordSize,
438 dataTransferHandleTimeout, nullptr);
439 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
440}
441
Gilbert Chenb7c73e52022-11-10 11:29:52 +0800442TEST(GetPDRRepositoryInfo, testGoodDecodeResponse)
443{
444 uint8_t completionCode = PLDM_SUCCESS;
445 uint8_t repositoryState = PLDM_AVAILABLE;
446 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
447 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
448 uint32_t recordCount = 100;
449 uint32_t repositorySize = 100;
450 uint32_t largestRecordSize = UINT32_MAX;
451 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
452
453 std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
454 responseMsg{};
455 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
456 struct pldm_pdr_repository_info_resp* resp =
457 reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
458 response->payload);
459 resp->completion_code = completionCode;
460 resp->repository_state = repositoryState;
461 memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
462 memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
463 resp->record_count = htole32(recordCount);
464 resp->repository_size = htole32(repositorySize);
465 resp->largest_record_size = htole32(largestRecordSize);
466 resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
467
468 uint8_t retCompletionCode = 0;
469 uint8_t retRepositoryState = 0;
470 uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
471 uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
472 uint32_t retRecordCount = 0;
473 uint32_t retRepositorySize = 0;
474 uint32_t retLargestRecordSize = 0;
475 uint8_t retDataTransferHandleTimeout = 0;
476
477 auto rc = decode_get_pdr_repository_info_resp(
478 response, responseMsg.size() - hdrSize, &retCompletionCode,
479 &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
480 &retRepositorySize, &retLargestRecordSize,
481 &retDataTransferHandleTimeout);
482
483 EXPECT_EQ(rc, PLDM_SUCCESS);
484 EXPECT_EQ(completionCode, retCompletionCode);
485 EXPECT_EQ(repositoryState, retRepositoryState);
486 EXPECT_EQ(0, memcmp(updateTime, retUpdateTime, PLDM_TIMESTAMP104_SIZE));
487 EXPECT_EQ(0,
488 memcmp(oemUpdateTime, retOemUpdateTime, PLDM_TIMESTAMP104_SIZE));
489 EXPECT_EQ(recordCount, recordCount);
490 EXPECT_EQ(repositorySize, repositorySize);
491 EXPECT_EQ(largestRecordSize, largestRecordSize);
492 EXPECT_EQ(dataTransferHandleTimeout, dataTransferHandleTimeout);
493}
494
495TEST(GetPDRRepositoryInfo, testBadDecodeResponse)
496{
497 uint8_t completionCode = PLDM_SUCCESS;
498 uint8_t repositoryState = PLDM_AVAILABLE;
499 uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
500 uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
501 uint32_t recordCount = htole32(100);
502 uint32_t repositorySize = htole32(100);
503 uint32_t largestRecordSize = htole32(UINT32_MAX);
504 uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
505
506 std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
507 responseMsg{};
508 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
509 struct pldm_pdr_repository_info_resp* resp =
510 reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
511 response->payload);
512 resp->completion_code = completionCode;
513 resp->repository_state = repositoryState;
514 memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
515 memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
516 resp->record_count = recordCount;
517 resp->repository_size = repositorySize;
518 resp->largest_record_size = largestRecordSize;
519 resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
520
521 uint8_t retCompletionCode = 0;
522 uint8_t retRepositoryState = 0;
523 uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
524 uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
525 uint32_t retRecordCount = 0;
526 uint32_t retRepositorySize = 0;
527 uint32_t retLargestRecordSize = 0;
528 uint8_t retDataTransferHandleTimeout = 0;
529
530 auto rc = decode_get_pdr_repository_info_resp(
531 response, responseMsg.size() - hdrSize, NULL, NULL, NULL, NULL, NULL,
532 NULL, NULL, NULL);
533 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
534
535 rc = decode_get_pdr_repository_info_resp(
536 response, responseMsg.size() - hdrSize - 1, &retCompletionCode,
537 &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
538 &retRepositorySize, &retLargestRecordSize,
539 &retDataTransferHandleTimeout);
540 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
541
542 resp->repository_state = PLDM_FAILED + 1;
543 rc = decode_get_pdr_repository_info_resp(
544 response, responseMsg.size() - hdrSize, &retCompletionCode,
545 &retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
546 &retRepositorySize, &retLargestRecordSize,
547 &retDataTransferHandleTimeout);
548 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
549}
550
Andrew Jeffery9c766792022-08-10 23:12:49 +0930551TEST(SetNumericEffecterValue, testGoodDecodeRequest)
552{
553 std::array<uint8_t,
554 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 3>
555 requestMsg{};
556
557 uint16_t effecter_id = 32768;
558 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT32;
559 uint32_t effecter_value = 123456789;
560
561 uint16_t reteffecter_id;
562 uint8_t reteffecter_data_size;
563 uint8_t reteffecter_value[4];
564
565 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
566 struct pldm_set_numeric_effecter_value_req* request =
567 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
568 req->payload);
569
570 request->effecter_id = htole16(effecter_id);
571 request->effecter_data_size = effecter_data_size;
572 uint32_t effecter_value_le = htole32(effecter_value);
573 memcpy(request->effecter_value, &effecter_value_le,
574 sizeof(effecter_value_le));
575
576 auto rc = decode_set_numeric_effecter_value_req(
577 req, requestMsg.size() - hdrSize, &reteffecter_id,
578 &reteffecter_data_size, reteffecter_value);
579
580 uint32_t value = *(reinterpret_cast<uint32_t*>(reteffecter_value));
581 EXPECT_EQ(rc, PLDM_SUCCESS);
582 EXPECT_EQ(reteffecter_id, effecter_id);
583 EXPECT_EQ(reteffecter_data_size, effecter_data_size);
584 EXPECT_EQ(value, effecter_value);
585}
586
587TEST(SetNumericEffecterValue, testBadDecodeRequest)
588{
589 std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES>
590 requestMsg{};
591
592 auto rc = decode_set_numeric_effecter_value_req(
593 NULL, requestMsg.size() - hdrSize, NULL, NULL, NULL);
594 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
595
596 uint16_t effecter_id = 0x10;
597 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT8;
598 uint8_t effecter_value = 1;
599
600 uint16_t reteffecter_id;
601 uint8_t reteffecter_data_size;
602 uint8_t reteffecter_value[4];
603
604 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
605 struct pldm_set_numeric_effecter_value_req* request =
606 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
607 req->payload);
608
609 request->effecter_id = effecter_id;
610 request->effecter_data_size = effecter_data_size;
611 memcpy(request->effecter_value, &effecter_value, sizeof(effecter_value));
612
613 rc = decode_set_numeric_effecter_value_req(
614 req, requestMsg.size() - hdrSize - 1, &reteffecter_id,
615 &reteffecter_data_size, reinterpret_cast<uint8_t*>(&reteffecter_value));
616 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
617}
618
619TEST(SetNumericEffecterValue, testGoodEncodeRequest)
620{
621 uint16_t effecter_id = 0;
622 uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT16;
623 uint16_t effecter_value = 65534;
624
625 std::vector<uint8_t> requestMsg(
626 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
627 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
628
629 auto rc = encode_set_numeric_effecter_value_req(
630 0, effecter_id, effecter_data_size,
631 reinterpret_cast<uint8_t*>(&effecter_value), request,
632 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
633 EXPECT_EQ(rc, PLDM_SUCCESS);
634
635 struct pldm_set_numeric_effecter_value_req* req =
636 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
637 request->payload);
638 EXPECT_EQ(effecter_id, req->effecter_id);
639 EXPECT_EQ(effecter_data_size, req->effecter_data_size);
640 uint16_t* val = (uint16_t*)req->effecter_value;
641 *val = le16toh(*val);
642 EXPECT_EQ(effecter_value, *val);
643}
644
645TEST(SetNumericEffecterValue, testBadEncodeRequest)
646{
647 std::vector<uint8_t> requestMsg(
648 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
649 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
650
651 auto rc = encode_set_numeric_effecter_value_req(
652 0, 0, 0, NULL, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
653 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
654
655 uint16_t effecter_value;
656 rc = encode_set_numeric_effecter_value_req(
657 0, 0, 6, reinterpret_cast<uint8_t*>(&effecter_value), request,
658 PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
659 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
660}
661
662TEST(SetNumericEffecterValue, testGoodDecodeResponse)
663{
664 std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
665 responseMsg{};
666
667 uint8_t completion_code = 0xA0;
668
669 uint8_t retcompletion_code;
670
671 memcpy(responseMsg.data() + hdrSize, &completion_code,
672 sizeof(completion_code));
673
674 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
675
676 auto rc = decode_set_numeric_effecter_value_resp(
677 response, responseMsg.size() - hdrSize, &retcompletion_code);
678
679 EXPECT_EQ(rc, PLDM_SUCCESS);
680 EXPECT_EQ(completion_code, retcompletion_code);
681}
682
683TEST(SetNumericEffecterValue, testBadDecodeResponse)
684{
685 std::array<uint8_t, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
686 responseMsg{};
687
688 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
689
690 auto rc = decode_set_numeric_effecter_value_resp(response,
691 responseMsg.size(), NULL);
692
693 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
694}
695
696TEST(SetNumericEffecterValue, testGoodEncodeResponse)
697{
698 std::array<uint8_t, sizeof(pldm_msg_hdr) +
699 PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
700 responseMsg{};
701 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
702 uint8_t completionCode = 0;
703
704 auto rc = encode_set_numeric_effecter_value_resp(
705 0, PLDM_SUCCESS, response, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
706
707 EXPECT_EQ(rc, PLDM_SUCCESS);
708 EXPECT_EQ(completionCode, response->payload[0]);
709}
710
711TEST(SetNumericEffecterValue, testBadEncodeResponse)
712{
713 auto rc = encode_set_numeric_effecter_value_resp(
714 0, PLDM_SUCCESS, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
715 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
716}
717
718TEST(GetStateSensorReadings, testGoodEncodeResponse)
719{
720 std::array<uint8_t, hdrSize +
721 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
722 sizeof(get_sensor_state_field) * 2>
723 responseMsg{};
724
725 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
726 uint8_t completionCode = 0;
727 uint8_t comp_sensorCnt = 0x2;
728
729 std::array<get_sensor_state_field, 2> stateField{};
730 stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_NORMAL,
731 PLDM_SENSOR_WARNING, PLDM_SENSOR_UNKNOWN};
732 stateField[1] = {PLDM_SENSOR_FAILED, PLDM_SENSOR_UPPERFATAL,
733 PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_FATAL};
734
735 auto rc = encode_get_state_sensor_readings_resp(
736 0, PLDM_SUCCESS, comp_sensorCnt, stateField.data(), response);
737
738 struct pldm_get_state_sensor_readings_resp* resp =
739 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
740 response->payload);
741
742 EXPECT_EQ(rc, PLDM_SUCCESS);
743 EXPECT_EQ(completionCode, resp->completion_code);
744 EXPECT_EQ(comp_sensorCnt, resp->comp_sensor_count);
745 EXPECT_EQ(stateField[0].sensor_op_state, resp->field->sensor_op_state);
746 EXPECT_EQ(stateField[0].present_state, resp->field->present_state);
747 EXPECT_EQ(stateField[0].previous_state, resp->field->previous_state);
748 EXPECT_EQ(stateField[0].event_state, resp->field->event_state);
749 EXPECT_EQ(stateField[1].sensor_op_state, resp->field[1].sensor_op_state);
750 EXPECT_EQ(stateField[1].present_state, resp->field[1].present_state);
751 EXPECT_EQ(stateField[1].previous_state, resp->field[1].previous_state);
752 EXPECT_EQ(stateField[1].event_state, resp->field[1].event_state);
753}
754
755TEST(GetStateSensorReadings, testBadEncodeResponse)
756{
757 auto rc = encode_get_state_sensor_readings_resp(0, PLDM_SUCCESS, 0, nullptr,
758 nullptr);
759
760 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
761}
762
763TEST(GetStateSensorReadings, testGoodDecodeResponse)
764{
765 std::array<uint8_t, hdrSize +
766 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
767 sizeof(get_sensor_state_field) * 2>
768 responseMsg{};
769
770 uint8_t completionCode = 0;
771 uint8_t comp_sensorCnt = 2;
772
773 std::array<get_sensor_state_field, 2> stateField{};
774 stateField[0] = {PLDM_SENSOR_DISABLED, PLDM_SENSOR_UNKNOWN,
775 PLDM_SENSOR_UNKNOWN, PLDM_SENSOR_UNKNOWN};
776 stateField[1] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_LOWERFATAL,
777 PLDM_SENSOR_LOWERCRITICAL, PLDM_SENSOR_WARNING};
778
779 uint8_t retcompletion_code = 0;
780 uint8_t retcomp_sensorCnt = 0;
781 std::array<get_sensor_state_field, 2> retstateField{};
782
783 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
784 struct pldm_get_state_sensor_readings_resp* resp =
785 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
786 response->payload);
787
788 resp->completion_code = completionCode;
789 resp->comp_sensor_count = comp_sensorCnt;
790 memcpy(resp->field, &stateField,
791 (sizeof(get_sensor_state_field) * comp_sensorCnt));
792
793 auto rc = decode_get_state_sensor_readings_resp(
794 response, responseMsg.size() - hdrSize, &retcompletion_code,
795 &retcomp_sensorCnt, retstateField.data());
796
797 EXPECT_EQ(rc, PLDM_SUCCESS);
798 EXPECT_EQ(completionCode, retcompletion_code);
799 EXPECT_EQ(comp_sensorCnt, retcomp_sensorCnt);
800 EXPECT_EQ(stateField[0].sensor_op_state, retstateField[0].sensor_op_state);
801 EXPECT_EQ(stateField[0].present_state, retstateField[0].present_state);
802 EXPECT_EQ(stateField[0].previous_state, retstateField[0].previous_state);
803 EXPECT_EQ(stateField[0].event_state, retstateField[0].event_state);
804 EXPECT_EQ(stateField[1].sensor_op_state, retstateField[1].sensor_op_state);
805 EXPECT_EQ(stateField[1].present_state, retstateField[1].present_state);
806 EXPECT_EQ(stateField[1].previous_state, retstateField[1].previous_state);
807 EXPECT_EQ(stateField[1].event_state, retstateField[1].event_state);
808}
809
810TEST(GetStateSensorReadings, testBadDecodeResponse)
811{
812 std::array<uint8_t, hdrSize +
813 PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
814 sizeof(get_sensor_state_field) * 2>
815 responseMsg{};
816
817 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
818
819 auto rc = decode_get_state_sensor_readings_resp(
820 response, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr);
821
822 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
823
824 uint8_t completionCode = 0;
825 uint8_t comp_sensorCnt = 1;
826
827 std::array<get_sensor_state_field, 1> stateField{};
828 stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_UPPERFATAL,
829 PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_WARNING};
830
831 uint8_t retcompletion_code = 0;
832 uint8_t retcomp_sensorCnt = 0;
833 std::array<get_sensor_state_field, 1> retstateField{};
834
835 struct pldm_get_state_sensor_readings_resp* resp =
836 reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
837 response->payload);
838
839 resp->completion_code = completionCode;
840 resp->comp_sensor_count = comp_sensorCnt;
841 memcpy(resp->field, &stateField,
842 (sizeof(get_sensor_state_field) * comp_sensorCnt));
843
844 rc = decode_get_state_sensor_readings_resp(
845 response, responseMsg.size() - hdrSize + 1, &retcompletion_code,
846 &retcomp_sensorCnt, retstateField.data());
847
848 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
849}
850
851TEST(GetStateSensorReadings, testGoodEncodeRequest)
852{
853 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
854 requestMsg{};
855
856 uint16_t sensorId = 0xAB;
857 bitfield8_t sensorRearm;
858 sensorRearm.byte = 0x03;
859
860 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
861 auto rc = encode_get_state_sensor_readings_req(0, sensorId, sensorRearm, 0,
862 request);
863
864 struct pldm_get_state_sensor_readings_req* req =
865 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
866 request->payload);
867
868 EXPECT_EQ(rc, PLDM_SUCCESS);
869 EXPECT_EQ(sensorId, le16toh(req->sensor_id));
870 EXPECT_EQ(sensorRearm.byte, req->sensor_rearm.byte);
871}
872
873TEST(GetStateSensorReadings, testBadEncodeRequest)
874{
875 bitfield8_t sensorRearm;
876 sensorRearm.byte = 0x0;
877
878 auto rc =
879 encode_get_state_sensor_readings_req(0, 0, sensorRearm, 0, nullptr);
880
881 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
882}
883
884TEST(GetStateSensorReadings, testGoodDecodeRequest)
885{
886 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
887 requestMsg{};
888
889 uint16_t sensorId = 0xCD;
890 bitfield8_t sensorRearm;
891 sensorRearm.byte = 0x10;
892
893 uint16_t retsensorId;
894 bitfield8_t retsensorRearm;
895 uint8_t retreserved;
896
897 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
898
899 struct pldm_get_state_sensor_readings_req* req =
900 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
901 request->payload);
902
903 req->sensor_id = htole16(sensorId);
904 req->sensor_rearm.byte = sensorRearm.byte;
905
906 auto rc = decode_get_state_sensor_readings_req(
907 request, requestMsg.size() - hdrSize, &retsensorId, &retsensorRearm,
908 &retreserved);
909
910 EXPECT_EQ(rc, PLDM_SUCCESS);
911 EXPECT_EQ(sensorId, retsensorId);
912 EXPECT_EQ(sensorRearm.byte, retsensorRearm.byte);
913 EXPECT_EQ(0, retreserved);
914}
915
916TEST(GetStateSensorReadings, testBadDecodeRequest)
917{
918 std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
919 requestMsg{};
920
921 auto rc = decode_get_state_sensor_readings_req(
922 nullptr, requestMsg.size() - hdrSize, nullptr, nullptr, nullptr);
923
924 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
925 uint16_t sensorId = 0x11;
926 bitfield8_t sensorRearm;
927 sensorRearm.byte = 0x04;
928
929 uint16_t retsensorId;
930 bitfield8_t retsensorRearm;
931 uint8_t retreserved;
932
933 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
934
935 struct pldm_get_state_sensor_readings_req* req =
936 reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
937 request->payload);
938
939 req->sensor_id = htole16(sensorId);
940 req->sensor_rearm.byte = sensorRearm.byte;
941
942 rc = decode_get_state_sensor_readings_req(
943 request, requestMsg.size() - hdrSize - 1, &retsensorId, &retsensorRearm,
944 &retreserved);
945
946 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
947}
948
Dung Caod6ae8982022-11-02 10:00:10 +0700949TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeRequest)
950{
951 uint8_t eventBufferSize = 32;
952
953 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_REQ_BYTES>
954 requestMsg{};
955 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
956
957 auto rc = encode_event_message_buffer_size_req(0, eventBufferSize, request);
958
959 EXPECT_EQ(rc, PLDM_SUCCESS);
960}
961
962TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeResponse)
963{
964 uint8_t completionCode = PLDM_SUCCESS;
965 uint16_t terminusMaxBufferSize = 256;
966
967 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
968 responseMsg{};
969
970 uint8_t retCompletionCode;
971 uint16_t retMaxBufferSize = 0;
972
973 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
974 struct pldm_event_message_buffer_size_resp* resp =
975 reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
976 response->payload);
977
978 resp->completion_code = completionCode;
979 resp->terminus_max_buffer_size = terminusMaxBufferSize;
980
981 auto rc = decode_event_message_buffer_size_resp(
982 response, responseMsg.size() - hdrSize, &retCompletionCode,
983 &retMaxBufferSize);
984
985 EXPECT_EQ(rc, PLDM_SUCCESS);
986 EXPECT_EQ(retCompletionCode, completionCode);
987 EXPECT_EQ(terminusMaxBufferSize, retMaxBufferSize);
988}
989
990TEST(EventMessageBufferSize, testBadEventMessageBufferSizeResponse)
991{
992 uint8_t completionCode = PLDM_SUCCESS;
993 uint16_t terminusMaxBufferSize = 256;
994
995 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
996 responseMsg{};
997
998 uint8_t retCompletionCode;
999 uint16_t retMaxBufferSize = 0;
1000
1001 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1002 struct pldm_event_message_buffer_size_resp* resp =
1003 reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
1004 response->payload);
1005 resp->completion_code = completionCode;
1006 resp->terminus_max_buffer_size = terminusMaxBufferSize;
1007
1008 auto rc =
1009 decode_event_message_buffer_size_resp(response, 0, nullptr, nullptr);
1010 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1011
1012 rc = decode_event_message_buffer_size_resp(
1013 response, responseMsg.size(), &retCompletionCode, &retMaxBufferSize);
1014 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1015}
1016
Dung Cao1bf8c872022-11-29 05:32:58 +07001017TEST(PlatformEventMessageSupported, testGoodEncodeRequest)
1018{
1019 uint8_t formatVersion = 0x01;
1020
1021 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_REQ_BYTES>
1022 requestMsg{};
1023
1024 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1025
1026 auto rc = encode_event_message_supported_req(0, formatVersion, request);
1027
1028 struct pldm_event_message_supported_req* req =
1029 reinterpret_cast<struct pldm_event_message_supported_req*>(
1030 request->payload);
1031
1032 EXPECT_EQ(rc, PLDM_SUCCESS);
1033 EXPECT_EQ(formatVersion, req->format_version);
1034}
1035
1036TEST(PlatformEventMessageSupported, testBadEncodeRequest)
1037{
1038 uint8_t eventData = 34;
1039 uint8_t formatVersion = 0x0;
1040
1041 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_REQ_BYTES +
1042 sizeof(eventData)>
1043 requestMsg{};
1044 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1045
1046 auto rc = encode_event_message_supported_req(0, formatVersion, request);
1047 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1048
1049 rc = encode_event_message_supported_req(0, formatVersion, nullptr);
1050 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1051}
1052
1053TEST(PlatformEventMessageSupported, testGoodDecodeRespond)
1054{
1055 uint8_t completionCode = PLDM_SUCCESS;
1056 uint8_t synchConfiguration = PLDM_MESSAGE_TYPE_SYNCHRONOUS;
1057 bitfield8_t synchConfigSupported;
1058 synchConfigSupported.byte = 0xe;
1059 uint8_t numberEventClassReturned = 0x3;
1060 std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
1061 constexpr uint8_t eventClassCount = 3;
1062
1063 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
1064 eventClassCount>
1065 responseMsg{};
1066
1067 uint8_t retCompletionCode;
1068 uint8_t retSynchConfig = 0;
1069 uint8_t retNumberEventClass = 0;
1070 bitfield8_t retSynchConfigSupport;
1071 uint8_t retEventClass[eventClassCount] = {0};
1072
1073 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1074 struct pldm_event_message_supported_resp* resp =
1075 reinterpret_cast<struct pldm_event_message_supported_resp*>(
1076 response->payload);
1077
1078 resp->completion_code = completionCode;
1079 resp->synchrony_configuration = synchConfiguration;
1080 resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
1081 resp->number_event_class_returned = numberEventClassReturned;
1082 memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
1083
1084 auto rc = decode_event_message_supported_resp(
1085 response, responseMsg.size() - hdrSize, &retCompletionCode,
1086 &retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
1087 retEventClass, eventClassCount);
1088
1089 EXPECT_EQ(rc, PLDM_SUCCESS);
1090 EXPECT_EQ(retCompletionCode, completionCode);
1091 EXPECT_EQ(retSynchConfig, synchConfiguration);
1092 EXPECT_EQ(retNumberEventClass, numberEventClassReturned);
1093 EXPECT_EQ(retSynchConfigSupport.byte, synchConfigSupported.byte);
1094 EXPECT_EQ(0, memcmp(eventClass.data(), resp->event_class,
1095 numberEventClassReturned));
1096}
1097
1098TEST(PlatformEventMessageSupported, testBadSynchConfiguration)
1099{
1100 uint8_t completionCode = PLDM_SUCCESS;
1101 uint8_t synchConfiguration = 0x4;
1102 bitfield8_t synchConfigSupported;
1103 synchConfigSupported.byte = 0xe;
1104 uint8_t numberEventClassReturned = 0x3;
1105 std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
1106 constexpr uint8_t eventClassCount = 3;
1107
1108 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
1109 eventClassCount>
1110 responseMsg{};
1111
1112 uint8_t retCompletionCode;
1113 uint8_t retSynchConfig = 0;
1114 uint8_t retNumberEventClass = 0;
1115 bitfield8_t retSynchConfigSupport;
1116 uint8_t retEventClass[eventClassCount] = {0};
1117
1118 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1119 struct pldm_event_message_supported_resp* resp =
1120 reinterpret_cast<struct pldm_event_message_supported_resp*>(
1121 response->payload);
1122
1123 resp->completion_code = completionCode;
1124 resp->synchrony_configuration = synchConfiguration;
1125 resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
1126 resp->number_event_class_returned = numberEventClassReturned;
1127 memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
1128
1129 auto rc = decode_event_message_supported_resp(
1130 response, responseMsg.size() - hdrSize, &retCompletionCode,
1131 &retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
1132 retEventClass, eventClassCount);
1133
1134 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1135}
1136
1137TEST(PlatformEventMessageSupported, testBadDecodeRespond)
1138{
1139 uint8_t completionCode = PLDM_SUCCESS;
1140 uint8_t synchConfiguration = PLDM_MESSAGE_TYPE_SYNCHRONOUS;
1141 bitfield8_t synchConfigSupported;
1142 synchConfigSupported.byte = 0xe;
1143 uint8_t numberEventClassReturned = 0x3;
1144 std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
1145 constexpr uint8_t eventClassCount = 3;
1146
1147 std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
1148 eventClassCount>
1149 responseMsg{};
1150
1151 uint8_t retCompletionCode;
1152 uint8_t retSynchConfig = 0;
1153 uint8_t retNumberEventClass = 0;
1154 bitfield8_t retSynchConfigSupport;
1155 uint8_t retEventClass[eventClassCount] = {0};
1156
1157 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1158 struct pldm_event_message_supported_resp* resp =
1159 reinterpret_cast<struct pldm_event_message_supported_resp*>(
1160 response->payload);
1161 resp->completion_code = completionCode;
1162 resp->synchrony_configuration = synchConfiguration;
1163 resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
1164 resp->number_event_class_returned = numberEventClassReturned;
1165 memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
1166
1167 auto rc = decode_event_message_supported_resp(response, 0, nullptr, nullptr,
1168 nullptr, nullptr, nullptr, 0);
1169 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1170
1171 rc = decode_event_message_supported_resp(
1172 response, PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES - 1,
1173 &retCompletionCode, &retSynchConfig, &retSynchConfigSupport,
1174 &retNumberEventClass, retEventClass, eventClassCount);
1175 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1176
1177 rc = decode_event_message_supported_resp(
1178 response, responseMsg.size() - hdrSize, &retCompletionCode,
1179 &retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
1180 retEventClass, 1);
1181 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1182}
1183
Andrew Jeffery9c766792022-08-10 23:12:49 +09301184TEST(PlatformEventMessage, testGoodStateSensorDecodeRequest)
1185{
1186 std::array<uint8_t,
1187 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
1188 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES>
1189 requestMsg{};
1190
1191 uint8_t retFormatVersion = 0;
1192 uint8_t retTid = 0;
1193 uint8_t retEventClass = 0;
1194 size_t retEventDataOffset = 0;
1195
1196 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
1197 struct pldm_platform_event_message_req* request =
1198 reinterpret_cast<struct pldm_platform_event_message_req*>(req->payload);
1199
1200 uint8_t formatVersion = 0x01;
1201 uint8_t tid = 0x02;
1202 // Sensor Event
1203 uint8_t eventClass = 0x00;
1204
1205 request->format_version = formatVersion;
1206 request->tid = tid;
1207 request->event_class = eventClass;
1208 size_t eventDataOffset =
1209 sizeof(formatVersion) + sizeof(tid) + sizeof(eventClass);
1210
1211 auto rc = decode_platform_event_message_req(
1212 req, requestMsg.size() - hdrSize, &retFormatVersion, &retTid,
1213 &retEventClass, &retEventDataOffset);
1214
1215 EXPECT_EQ(rc, PLDM_SUCCESS);
1216 EXPECT_EQ(retFormatVersion, formatVersion);
1217 EXPECT_EQ(retTid, tid);
1218 EXPECT_EQ(retEventClass, eventClass);
1219 EXPECT_EQ(retEventDataOffset, eventDataOffset);
1220}
1221
1222TEST(PlatformEventMessage, testBadDecodeRequest)
1223{
1224 const struct pldm_msg* msg = NULL;
1225 std::array<uint8_t,
1226 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
1227 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
1228 requestMsg{};
1229 auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
1230 uint8_t retFormatVersion;
1231 uint8_t retTid = 0;
1232 uint8_t retEventClass = 0;
1233 size_t retEventDataOffset;
1234
1235 auto rc = decode_platform_event_message_req(msg, sizeof(*msg), NULL, NULL,
1236 NULL, NULL);
1237 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1238
1239 rc = decode_platform_event_message_req(
1240 req,
1241 requestMsg.size() - hdrSize -
1242 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES,
1243 &retFormatVersion, &retTid, &retEventClass, &retEventDataOffset);
1244 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1245}
1246
1247TEST(PlatformEventMessage, testGoodEncodeResponse)
1248{
1249 std::array<uint8_t,
1250 hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
1251 PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
1252 responseMsg{};
1253 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1254 uint8_t completionCode = 0;
1255 uint8_t instanceId = 0x01;
1256 uint8_t platformEventStatus = 0x01;
1257
1258 auto rc = encode_platform_event_message_resp(instanceId, PLDM_SUCCESS,
1259 platformEventStatus, response);
1260
1261 EXPECT_EQ(rc, PLDM_SUCCESS);
1262 EXPECT_EQ(completionCode, response->payload[0]);
1263 EXPECT_EQ(platformEventStatus, response->payload[1]);
1264}
1265
1266TEST(PlatformEventMessage, testBadEncodeResponse)
1267{
1268 auto rc = encode_platform_event_message_resp(0, PLDM_SUCCESS, 1, NULL);
1269 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1270}
1271
1272TEST(PlatformEventMessage, testGoodEncodeRequest)
1273{
1274 uint8_t formatVersion = 0x01;
1275 uint8_t Tid = 0x03;
1276 uint8_t eventClass = 0x00;
1277 uint8_t eventData = 34;
1278
1279 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
1280 sizeof(eventData)>
1281 requestMsg{};
1282
1283 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1284 auto rc = encode_platform_event_message_req(
1285 0, formatVersion, Tid, eventClass,
1286 reinterpret_cast<uint8_t*>(&eventData), sizeof(eventData), request,
1287 sizeof(eventData) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
1288
1289 struct pldm_platform_event_message_req* req =
1290 reinterpret_cast<struct pldm_platform_event_message_req*>(
1291 request->payload);
1292
1293 EXPECT_EQ(rc, PLDM_SUCCESS);
1294 EXPECT_EQ(formatVersion, req->format_version);
1295 EXPECT_EQ(Tid, req->tid);
1296 EXPECT_EQ(eventClass, req->event_class);
1297 EXPECT_EQ(0, memcmp(&eventData, req->event_data, sizeof(eventData)));
1298}
1299
1300TEST(PlatformEventMessage, testBadEncodeRequest)
1301{
1302 uint8_t Tid = 0x03;
1303 uint8_t eventClass = 0x00;
1304 uint8_t eventData = 34;
1305 size_t sz_eventData = sizeof(eventData);
1306 size_t payloadLen =
1307 sz_eventData + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES;
1308 uint8_t formatVersion = 0x01;
1309
1310 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
1311 sizeof(eventData)>
1312 requestMsg{};
1313 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1314
1315 auto rc = encode_platform_event_message_req(
1316 0, formatVersion, Tid, eventClass,
1317 reinterpret_cast<uint8_t*>(&eventData), sz_eventData, nullptr,
1318 payloadLen);
1319 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1320 rc = encode_platform_event_message_req(
1321 0, 0, Tid, eventClass, reinterpret_cast<uint8_t*>(&eventData),
1322 sz_eventData, request, payloadLen);
1323 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1324 rc = encode_platform_event_message_req(0, formatVersion, Tid, eventClass,
1325 nullptr, 0, request, payloadLen);
1326 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1327 rc = encode_platform_event_message_req(
1328 0, formatVersion, Tid, eventClass,
1329 reinterpret_cast<uint8_t*>(&eventData), sz_eventData, request, 0);
1330 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1331}
1332
1333TEST(PlatformEventMessage, testGoodDecodeResponse)
1334{
1335 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
1336 responseMsg{};
1337
1338 uint8_t completionCode = PLDM_SUCCESS;
1339 uint8_t platformEventStatus = 0x01;
1340
1341 uint8_t retcompletionCode;
1342 uint8_t retplatformEventStatus;
1343
1344 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1345 struct pldm_platform_event_message_resp* resp =
1346 reinterpret_cast<struct pldm_platform_event_message_resp*>(
1347 response->payload);
1348
1349 resp->completion_code = completionCode;
1350 resp->platform_event_status = platformEventStatus;
1351
1352 auto rc = decode_platform_event_message_resp(
1353 response, responseMsg.size() - hdrSize, &retcompletionCode,
1354 &retplatformEventStatus);
1355
1356 EXPECT_EQ(rc, PLDM_SUCCESS);
1357 EXPECT_EQ(completionCode, retcompletionCode);
1358 EXPECT_EQ(platformEventStatus, retplatformEventStatus);
1359}
1360
1361TEST(PlatformEventMessage, testBadDecodeResponse)
1362{
1363 std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
1364 responseMsg{};
1365
1366 uint8_t completionCode = PLDM_SUCCESS;
1367 uint8_t platformEventStatus = 0x01;
1368
1369 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1370 struct pldm_platform_event_message_resp* resp =
1371 reinterpret_cast<struct pldm_platform_event_message_resp*>(
1372 response->payload);
1373 resp->completion_code = completionCode;
1374 resp->platform_event_status = platformEventStatus;
1375
1376 auto rc = decode_platform_event_message_resp(
1377 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr);
1378
1379 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1380
1381 rc = decode_platform_event_message_resp(
1382 response, responseMsg.size() - hdrSize - 1, &completionCode,
1383 &platformEventStatus);
1384
1385 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1386}
1387
1388TEST(PlatformEventMessage, testGoodSensorEventDataDecodeRequest)
1389{
1390 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH +
1391 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
1392 eventDataArr{};
1393 uint16_t sensorId = 0x1234;
1394 uint8_t sensorEventClassType = PLDM_SENSOR_OP_STATE;
1395
1396 struct pldm_sensor_event_data* eventData =
1397 (struct pldm_sensor_event_data*)eventDataArr.data();
1398 eventData->sensor_id = sensorId;
1399 eventData->sensor_event_class_type = sensorEventClassType;
1400
1401 size_t retSensorOpDataOffset;
1402 uint16_t retSensorId = 0;
1403 uint8_t retSensorEventClassType;
1404 size_t sensorOpDataOffset = sizeof(sensorId) + sizeof(sensorEventClassType);
1405 auto rc = decode_sensor_event_data(
1406 reinterpret_cast<uint8_t*>(eventData), eventDataArr.size(),
1407 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1408 EXPECT_EQ(rc, PLDM_SUCCESS);
1409 EXPECT_EQ(retSensorId, sensorId);
1410 EXPECT_EQ(retSensorEventClassType, sensorEventClassType);
1411 EXPECT_EQ(retSensorOpDataOffset, sensorOpDataOffset);
1412}
1413
1414TEST(PlatformEventMessage, testBadSensorEventDataDecodeRequest)
1415{
1416
1417 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH +
1418 PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
1419 eventDataArr{};
1420
1421 struct pldm_sensor_event_data* eventData =
1422 (struct pldm_sensor_event_data*)eventDataArr.data();
1423
1424 size_t retSensorOpDataOffset;
1425 uint16_t retSensorId = 0;
1426 uint8_t retSensorEventClassType;
1427 auto rc = decode_sensor_event_data(NULL, eventDataArr.size(), &retSensorId,
1428 &retSensorEventClassType,
1429 &retSensorOpDataOffset);
1430 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1431
1432 rc = decode_sensor_event_data(
1433 reinterpret_cast<uint8_t*>(eventDataArr.data()),
1434 eventDataArr.size() -
1435 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH,
1436 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1437 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1438
1439 eventData->sensor_event_class_type = PLDM_SENSOR_OP_STATE;
1440
1441 rc = decode_sensor_event_data(
1442 reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
1443 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1444 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1445
1446 eventData->sensor_event_class_type = PLDM_STATE_SENSOR_STATE;
1447 rc = decode_sensor_event_data(
1448 reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
1449 &retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
1450 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1451
1452 eventData->sensor_event_class_type = PLDM_NUMERIC_SENSOR_STATE;
1453 rc = decode_sensor_event_data(
1454 reinterpret_cast<uint8_t*>(eventDataArr.data()),
1455 eventDataArr.size() + 1, &retSensorId, &retSensorEventClassType,
1456 &retSensorOpDataOffset);
1457 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1458}
1459
1460TEST(PlatformEventMessage, testGoodSensorOpEventDataDecodeRequest)
1461{
1462 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
1463 eventDataArr{};
1464
1465 struct pldm_sensor_event_sensor_op_state* sensorData =
1466 (struct pldm_sensor_event_sensor_op_state*)eventDataArr.data();
1467 uint8_t presentState = PLDM_SENSOR_ENABLED;
1468 uint8_t previousState = PLDM_SENSOR_INITIALIZING;
1469 sensorData->present_op_state = presentState;
1470 sensorData->previous_op_state = previousState;
1471
1472 uint8_t retPresentState;
1473 uint8_t retPreviousState;
1474 auto rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData),
1475 eventDataArr.size(), &retPresentState,
1476 &retPreviousState);
1477 EXPECT_EQ(rc, PLDM_SUCCESS);
1478 EXPECT_EQ(retPresentState, presentState);
1479 EXPECT_EQ(retPreviousState, previousState);
1480}
1481
1482TEST(PlatformEventMessage, testBadSensorOpEventDataDecodeRequest)
1483{
1484 uint8_t presentOpState;
1485 uint8_t previousOpState;
1486 size_t sensorDataLength = PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH;
1487 auto rc = decode_sensor_op_data(NULL, sensorDataLength, &presentOpState,
1488 &previousOpState);
1489 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1490
1491 std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
1492 sensorData{};
1493 rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1494 sensorDataLength + 1, &presentOpState,
1495 &previousOpState);
1496 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1497
1498 rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1499 sensorDataLength, nullptr, &previousOpState);
1500 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1501}
1502
1503TEST(PlatformEventMessage, testGoodSensorStateEventDataDecodeRequest)
1504{
1505 std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
1506 eventDataArr{};
1507
1508 struct pldm_sensor_event_state_sensor_state* sensorData =
1509 (struct pldm_sensor_event_state_sensor_state*)eventDataArr.data();
1510 uint8_t sensorOffset = 0x02;
1511 uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
1512 uint8_t previousEventState = PLDM_SENSOR_INTEST;
1513 sensorData->sensor_offset = sensorOffset;
1514 sensorData->event_state = eventState;
1515 sensorData->previous_event_state = previousEventState;
1516
1517 uint8_t retSensorOffset;
1518 uint8_t retEventState;
1519 uint8_t retPreviousState;
1520 auto rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
1521 eventDataArr.size(), &retSensorOffset,
1522 &retEventState, &retPreviousState);
1523 EXPECT_EQ(rc, PLDM_SUCCESS);
1524 EXPECT_EQ(retSensorOffset, sensorOffset);
1525 EXPECT_EQ(retEventState, eventState);
1526 EXPECT_EQ(retPreviousState, previousEventState);
1527}
1528
1529TEST(PlatformEventMessage, testBadStateSensorEventDataDecodeRequest)
1530{
1531 uint8_t sensorOffset;
1532 uint8_t eventState;
1533 uint8_t previousEventState;
1534 size_t sensorDataLength = PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH;
1535 auto rc = decode_state_sensor_data(NULL, sensorDataLength, &sensorOffset,
1536 &eventState, &previousEventState);
1537 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1538
1539 std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
1540 sensorData{};
1541 rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1542 sensorDataLength - 1, &sensorOffset,
1543 &eventState, &previousEventState);
1544 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1545
1546 rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
1547 sensorDataLength, &sensorOffset, nullptr,
1548 &previousEventState);
1549 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1550}
1551
1552TEST(PlatformEventMessage, testGoodNumericSensorEventDataDecodeRequest)
1553{
1554 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
1555 eventDataArr{};
1556 struct pldm_sensor_event_numeric_sensor_state* sensorData =
1557 (struct pldm_sensor_event_numeric_sensor_state*)eventDataArr.data();
1558
1559 size_t sensorDataLength =
1560 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_32BIT_DATA_LENGTH;
1561 uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
1562 uint8_t previousEventState = PLDM_SENSOR_INTEST;
1563 uint8_t sensorDataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
1564 uint32_t presentReading = 305441741;
1565 sensorData->event_state = eventState;
1566 sensorData->previous_event_state = previousEventState;
1567 sensorData->sensor_data_size = sensorDataSize;
1568 sensorData->present_reading[3] =
1569 static_cast<uint8_t>(htole32(presentReading) & (0x000000ff));
1570 sensorData->present_reading[2] =
1571 static_cast<uint8_t>((htole32(presentReading) & (0x0000ff00)) >> 8);
1572 sensorData->present_reading[1] =
1573 static_cast<uint8_t>((htole32(presentReading) & (0x00ff0000)) >> 16);
1574 sensorData->present_reading[0] =
1575 static_cast<uint8_t>((htole32(presentReading) & (0xff000000)) >> 24);
1576
1577 uint8_t retEventState;
1578 uint8_t retPreviousEventState;
1579 uint8_t retSensorDataSize;
1580 uint32_t retPresentReading;
1581
1582 auto rc = decode_numeric_sensor_data(
1583 reinterpret_cast<uint8_t*>(sensorData), sensorDataLength,
1584 &retEventState, &retPreviousEventState, &retSensorDataSize,
1585 &retPresentReading);
1586 EXPECT_EQ(rc, PLDM_SUCCESS);
1587 EXPECT_EQ(retEventState, eventState);
1588 EXPECT_EQ(retPreviousEventState, previousEventState);
1589 EXPECT_EQ(retSensorDataSize, sensorDataSize);
1590 EXPECT_EQ(retPresentReading, presentReading);
1591
1592 int16_t presentReadingNew = -31432;
1593 sensorData->present_reading[1] =
1594 static_cast<uint8_t>(htole16(presentReadingNew) & (0x000000ff));
1595 sensorData->present_reading[0] =
1596 static_cast<uint8_t>((htole16(presentReadingNew) & (0x0000ff00)) >> 8);
1597 sensorDataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
1598 sensorData->sensor_data_size = sensorDataSize;
1599 sensorDataLength = PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_16BIT_DATA_LENGTH;
1600
1601 rc = decode_numeric_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
1602 sensorDataLength, &retEventState,
1603 &retPreviousEventState, &retSensorDataSize,
1604 &retPresentReading);
1605 EXPECT_EQ(rc, PLDM_SUCCESS);
1606 EXPECT_EQ(retEventState, eventState);
1607 EXPECT_EQ(retPreviousEventState, previousEventState);
1608 EXPECT_EQ(retSensorDataSize, sensorDataSize);
1609 EXPECT_EQ(static_cast<int16_t>(retPresentReading), presentReadingNew);
1610}
1611
1612TEST(PlatformEventMessage, testBadNumericSensorEventDataDecodeRequest)
1613{
1614 uint8_t eventState;
1615 uint8_t previousEventState;
1616 uint8_t sensorDataSize;
1617 uint32_t presentReading;
1618 size_t sensorDataLength =
1619 PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH;
1620 auto rc = decode_numeric_sensor_data(NULL, sensorDataLength, &eventState,
1621 &previousEventState, &sensorDataSize,
1622 &presentReading);
1623 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1624
1625 std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
1626 sensorData{};
1627 rc = decode_numeric_sensor_data(
1628 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength - 1,
1629 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1630 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1631
1632 struct pldm_sensor_event_numeric_sensor_state* numericSensorData =
1633 (struct pldm_sensor_event_numeric_sensor_state*)sensorData.data();
1634 numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT8;
1635 rc = decode_numeric_sensor_data(
1636 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
1637 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1638 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1639
1640 numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT16;
1641 rc = decode_numeric_sensor_data(
1642 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
1643 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1644 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1645
1646 numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT32;
1647 rc = decode_numeric_sensor_data(
1648 reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength - 1,
1649 &eventState, &previousEventState, &sensorDataSize, &presentReading);
1650 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1651}
1652
1653TEST(GetNumericEffecterValue, testGoodEncodeRequest)
1654{
1655 std::vector<uint8_t> requestMsg(hdrSize +
1656 PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES);
1657
1658 uint16_t effecter_id = 0xAB01;
1659
1660 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1661
1662 auto rc = encode_get_numeric_effecter_value_req(0, effecter_id, request);
1663
1664 struct pldm_get_numeric_effecter_value_req* req =
1665 reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
1666 request->payload);
1667
1668 EXPECT_EQ(rc, PLDM_SUCCESS);
1669 EXPECT_EQ(effecter_id, le16toh(req->effecter_id));
1670}
1671
1672TEST(GetNumericEffecterValue, testBadEncodeRequest)
1673{
1674 std::vector<uint8_t> requestMsg(
1675 hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
1676
1677 auto rc = encode_get_numeric_effecter_value_req(0, 0, nullptr);
1678 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1679}
1680
1681TEST(GetNumericEffecterValue, testGoodDecodeRequest)
1682{
1683 std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
1684 requestMsg{};
1685
1686 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1687 struct pldm_get_numeric_effecter_value_req* req =
1688 reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
1689 request->payload);
1690
1691 uint16_t effecter_id = 0x12AB;
1692 req->effecter_id = htole16(effecter_id);
1693
1694 uint16_t reteffecter_id;
1695
1696 auto rc = decode_get_numeric_effecter_value_req(
1697 request, requestMsg.size() - hdrSize, &reteffecter_id);
1698
1699 EXPECT_EQ(rc, PLDM_SUCCESS);
1700 EXPECT_EQ(effecter_id, reteffecter_id);
1701}
1702
1703TEST(GetNumericEffecterValue, testBadDecodeRequest)
1704{
1705 std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
1706 requestMsg{};
1707
1708 auto rc = decode_get_numeric_effecter_value_req(
1709 nullptr, requestMsg.size() - hdrSize, nullptr);
1710
1711 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1712
1713 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
1714 struct pldm_set_numeric_effecter_value_req* req =
1715 reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
1716 request->payload);
1717
1718 uint16_t effecter_id = 0x1A;
1719 req->effecter_id = htole16(effecter_id);
1720 uint16_t reteffecter_id;
1721
1722 rc = decode_get_numeric_effecter_value_req(
1723 request, requestMsg.size() - hdrSize - 1, &reteffecter_id);
1724
1725 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1726}
1727
1728TEST(GetNumericEffecterValue, testGoodEncodeResponse)
1729{
1730 uint8_t completionCode = 0;
1731 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
1732 uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
1733 uint32_t pendingValue = 0x12345678;
1734 uint32_t presentValue = 0xABCDEF11;
Andrew Jefferyf990dcf2023-04-12 20:54:48 +09301735 uint32_t val_pending;
1736 uint32_t val_present;
Andrew Jeffery9c766792022-08-10 23:12:49 +09301737
1738 std::array<uint8_t,
1739 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
1740 responseMsg{};
1741 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1742
1743 auto rc = encode_get_numeric_effecter_value_resp(
1744 0, completionCode, effecter_dataSize, effecter_operState,
1745 reinterpret_cast<uint8_t*>(&pendingValue),
1746 reinterpret_cast<uint8_t*>(&presentValue), response,
1747 responseMsg.size() - hdrSize);
1748
1749 struct pldm_get_numeric_effecter_value_resp* resp =
1750 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
1751 response->payload);
1752
Andrew Jefferyf990dcf2023-04-12 20:54:48 +09301753 memcpy(&val_pending, &resp->pending_and_present_values[0],
1754 sizeof(val_pending));
1755 val_pending = le32toh(val_pending);
1756 memcpy(&val_present, &resp->pending_and_present_values[4],
1757 sizeof(val_present));
1758 val_present = le32toh(val_present);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301759
1760 EXPECT_EQ(rc, PLDM_SUCCESS);
1761 EXPECT_EQ(effecter_dataSize, resp->effecter_data_size);
1762 EXPECT_EQ(effecter_operState, resp->effecter_oper_state);
Andrew Jefferyf990dcf2023-04-12 20:54:48 +09301763 EXPECT_EQ(pendingValue, val_pending);
1764 EXPECT_EQ(presentValue, val_present);
Andrew Jeffery9c766792022-08-10 23:12:49 +09301765}
1766
1767TEST(GetNumericEffecterValue, testBadEncodeResponse)
1768{
1769 std::array<uint8_t,
1770 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
1771 responseMsg{};
1772 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1773
1774 uint8_t pendingValue = 0x01;
1775 uint8_t presentValue = 0x02;
1776
1777 auto rc = encode_get_numeric_effecter_value_resp(
1778 0, PLDM_SUCCESS, 0, 0, nullptr, nullptr, nullptr,
1779 responseMsg.size() - hdrSize);
1780 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1781
1782 rc = encode_get_numeric_effecter_value_resp(
1783 0, PLDM_SUCCESS, 6, 9, reinterpret_cast<uint8_t*>(&pendingValue),
1784 reinterpret_cast<uint8_t*>(&presentValue), response,
1785 responseMsg.size() - hdrSize);
1786 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1787
1788 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
1789 uint8_t effecter_operState = EFFECTER_OPER_STATE_FAILED;
1790
1791 rc = encode_get_numeric_effecter_value_resp(
1792 0, PLDM_SUCCESS, effecter_dataSize, effecter_operState,
1793 reinterpret_cast<uint8_t*>(&pendingValue),
1794 reinterpret_cast<uint8_t*>(&presentValue), response,
1795 responseMsg.size() - hdrSize);
1796 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1797}
1798
1799TEST(GetNumericEffecterValue, testGoodDecodeResponse)
1800{
1801 std::array<uint8_t,
1802 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
1803 responseMsg{};
1804
1805 uint8_t completionCode = 0;
1806 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT16;
1807 uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
1808 uint16_t pendingValue = 0x4321;
1809 uint16_t presentValue = 0xDCBA;
1810
1811 uint8_t retcompletionCode;
1812 uint8_t reteffecter_dataSize;
1813 uint8_t reteffecter_operState;
1814 uint8_t retpendingValue[2];
1815 uint8_t retpresentValue[2];
1816
1817 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1818 struct pldm_get_numeric_effecter_value_resp* resp =
1819 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
1820 response->payload);
1821
1822 resp->completion_code = completionCode;
1823 resp->effecter_data_size = effecter_dataSize;
1824 resp->effecter_oper_state = effecter_operState;
1825
1826 uint16_t pendingValue_le = htole16(pendingValue);
1827 memcpy(resp->pending_and_present_values, &pendingValue_le,
1828 sizeof(pendingValue_le));
1829 uint16_t presentValue_le = htole16(presentValue);
1830 memcpy(&resp->pending_and_present_values[2], &presentValue_le,
1831 sizeof(presentValue_le));
1832
1833 auto rc = decode_get_numeric_effecter_value_resp(
1834 response, responseMsg.size() - hdrSize, &retcompletionCode,
1835 &reteffecter_dataSize, &reteffecter_operState, retpendingValue,
1836 retpresentValue);
1837
1838 EXPECT_EQ(rc, PLDM_SUCCESS);
1839 EXPECT_EQ(completionCode, retcompletionCode);
1840 EXPECT_EQ(effecter_dataSize, reteffecter_dataSize);
1841 EXPECT_EQ(effecter_operState, reteffecter_operState);
1842 EXPECT_EQ(pendingValue, *(reinterpret_cast<uint16_t*>(retpendingValue)));
1843 EXPECT_EQ(presentValue, *(reinterpret_cast<uint16_t*>(retpresentValue)));
1844}
1845
1846TEST(GetNumericEffecterValue, testBadDecodeResponse)
1847{
1848 std::array<uint8_t,
1849 hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
1850 responseMsg{};
1851
1852 auto rc = decode_get_numeric_effecter_value_resp(
1853 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
1854 nullptr, nullptr);
1855
1856 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1857
1858 uint8_t completionCode = 0;
1859 uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_SINT16;
1860 uint8_t effecter_operState = EFFECTER_OPER_STATE_DISABLED;
1861 uint16_t pendingValue = 0x5678;
1862 uint16_t presentValue = 0xCDEF;
1863
1864 uint8_t retcompletionCode;
1865 uint8_t reteffecter_dataSize;
1866 uint8_t reteffecter_operState;
1867 uint8_t retpendingValue[2];
1868 uint8_t retpresentValue[2];
1869
1870 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
1871 struct pldm_get_numeric_effecter_value_resp* resp =
1872 reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
1873 response->payload);
1874
1875 resp->completion_code = completionCode;
1876 resp->effecter_data_size = effecter_dataSize;
1877 resp->effecter_oper_state = effecter_operState;
1878
1879 uint16_t pendingValue_le = htole16(pendingValue);
1880 memcpy(resp->pending_and_present_values, &pendingValue_le,
1881 sizeof(pendingValue_le));
1882 uint16_t presentValue_le = htole16(presentValue);
1883 memcpy(&resp->pending_and_present_values[2], &presentValue_le,
1884 sizeof(presentValue_le));
1885
1886 rc = decode_get_numeric_effecter_value_resp(
1887 response, responseMsg.size() - hdrSize, &retcompletionCode,
1888 &reteffecter_dataSize, &reteffecter_operState, retpendingValue,
1889 retpresentValue);
1890
1891 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1892}
1893
1894TEST(PldmPDRRepositoryChgEventEvent, testGoodDecodeRequest)
1895{
1896 const uint8_t eventDataFormat = FORMAT_IS_PDR_HANDLES;
1897 const uint8_t numberOfChangeRecords = 2;
1898 uint8_t eventDataOperation1 = PLDM_RECORDS_DELETED;
1899 const uint8_t numberOfChangeEntries1 = 2;
1900 std::array<uint32_t, numberOfChangeEntries1> changeRecordArr1{
1901 {0x00000000, 0x12345678}};
1902 uint8_t eventDataOperation2 = PLDM_RECORDS_ADDED;
1903 const uint8_t numberOfChangeEntries2 = 5;
1904 std::array<uint32_t, numberOfChangeEntries2> changeRecordArr2{
1905 {0x01234567, 0x11223344, 0x45678901, 0x21222324, 0x98765432}};
1906 std::array<uint8_t, PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH +
1907 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH *
1908 numberOfChangeRecords +
1909 (numberOfChangeEntries1 + numberOfChangeEntries2) *
1910 sizeof(uint32_t)>
1911 eventDataArr{};
1912
1913 struct pldm_pdr_repository_chg_event_data* eventData =
1914 reinterpret_cast<struct pldm_pdr_repository_chg_event_data*>(
1915 eventDataArr.data());
1916 eventData->event_data_format = eventDataFormat;
1917 eventData->number_of_change_records = numberOfChangeRecords;
1918 struct pldm_pdr_repository_change_record_data* changeRecord1 =
1919 reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
1920 eventData->change_records);
1921 changeRecord1->event_data_operation = eventDataOperation1;
1922 changeRecord1->number_of_change_entries = numberOfChangeEntries1;
1923 memcpy(changeRecord1->change_entry, &changeRecordArr1[0],
1924 changeRecordArr1.size() * sizeof(uint32_t));
1925 struct pldm_pdr_repository_change_record_data* changeRecord2 =
1926 reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
1927 eventData->change_records +
1928 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH +
1929 (changeRecordArr1.size() * sizeof(uint32_t)));
1930 changeRecord2->event_data_operation = eventDataOperation2;
1931 changeRecord2->number_of_change_entries = numberOfChangeEntries2;
1932 memcpy(changeRecord2->change_entry, &changeRecordArr2[0],
1933 changeRecordArr2.size() * sizeof(uint32_t));
1934
1935 uint8_t retEventDataFormat{};
1936 uint8_t retNumberOfChangeRecords{};
1937 size_t retChangeRecordDataOffset{0};
1938 auto rc = decode_pldm_pdr_repository_chg_event_data(
1939 reinterpret_cast<const uint8_t*>(eventData), eventDataArr.size(),
1940 &retEventDataFormat, &retNumberOfChangeRecords,
1941 &retChangeRecordDataOffset);
1942 EXPECT_EQ(rc, PLDM_SUCCESS);
1943 EXPECT_EQ(retEventDataFormat, FORMAT_IS_PDR_HANDLES);
1944 EXPECT_EQ(retNumberOfChangeRecords, numberOfChangeRecords);
1945
1946 const uint8_t* changeRecordData =
1947 reinterpret_cast<const uint8_t*>(changeRecord1);
1948 size_t changeRecordDataSize =
1949 eventDataArr.size() - PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH;
1950 uint8_t retEventDataOperation;
1951 uint8_t retNumberOfChangeEntries;
1952 size_t retChangeEntryDataOffset;
1953
1954 rc = decode_pldm_pdr_repository_change_record_data(
1955 reinterpret_cast<const uint8_t*>(changeRecordData),
1956 changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
1957 &retChangeEntryDataOffset);
1958 EXPECT_EQ(rc, PLDM_SUCCESS);
1959 EXPECT_EQ(retEventDataOperation, eventDataOperation1);
1960 EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries1);
1961 changeRecordData += retChangeEntryDataOffset;
1962 EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr1[0],
1963 sizeof(uint32_t) * retNumberOfChangeEntries));
1964
1965 changeRecordData += sizeof(uint32_t) * retNumberOfChangeEntries;
1966 changeRecordDataSize -= sizeof(uint32_t) * retNumberOfChangeEntries -
1967 PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH;
1968 rc = decode_pldm_pdr_repository_change_record_data(
1969 reinterpret_cast<const uint8_t*>(changeRecordData),
1970 changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
1971 &retChangeEntryDataOffset);
1972 EXPECT_EQ(rc, PLDM_SUCCESS);
1973 EXPECT_EQ(retEventDataOperation, eventDataOperation2);
1974 EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries2);
1975 changeRecordData += retChangeEntryDataOffset;
1976 EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr2[0],
1977 sizeof(uint32_t) * retNumberOfChangeEntries));
1978}
1979
1980TEST(PldmPDRRepositoryChgEventEvent, testBadDecodeRequest)
1981{
1982 uint8_t eventDataFormat{};
1983 uint8_t numberOfChangeRecords{};
1984 size_t changeRecordDataOffset{};
1985 auto rc = decode_pldm_pdr_repository_chg_event_data(
1986 NULL, 0, &eventDataFormat, &numberOfChangeRecords,
1987 &changeRecordDataOffset);
1988 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
1989
1990 std::array<uint8_t, 2> eventData{};
1991 rc = decode_pldm_pdr_repository_chg_event_data(
1992 reinterpret_cast<const uint8_t*>(eventData.data()), 0, &eventDataFormat,
1993 &numberOfChangeRecords, &changeRecordDataOffset);
1994 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
1995
1996 uint8_t eventDataOperation{};
1997 uint8_t numberOfChangeEntries{};
1998 size_t changeEntryDataOffset{};
1999 rc = decode_pldm_pdr_repository_change_record_data(
2000 NULL, 0, &eventDataOperation, &numberOfChangeEntries,
2001 &changeEntryDataOffset);
2002 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2003
2004 std::array<uint8_t, 2> changeRecord{};
2005 rc = decode_pldm_pdr_repository_change_record_data(
2006 reinterpret_cast<const uint8_t*>(changeRecord.data()), 0,
2007 &eventDataOperation, &numberOfChangeEntries, &changeEntryDataOffset);
2008 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2009}
2010
2011TEST(GetSensorReading, testGoodEncodeRequest)
2012{
2013 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
2014 requestMsg{};
2015
2016 uint16_t sensorId = 0x1234;
2017 bool8_t rearmEventState = 0x01;
2018
2019 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2020 auto rc =
2021 encode_get_sensor_reading_req(0, sensorId, rearmEventState, request);
2022
2023 struct pldm_get_sensor_reading_req* req =
2024 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
2025
2026 EXPECT_EQ(rc, PLDM_SUCCESS);
2027 EXPECT_EQ(sensorId, le16toh(req->sensor_id));
2028 EXPECT_EQ(rearmEventState, req->rearm_event_state);
2029}
2030
2031TEST(GetSensorReading, testBadEncodeRequest)
2032{
2033 auto rc = encode_get_sensor_reading_req(0, 0, 0, nullptr);
2034
2035 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2036}
2037
2038TEST(GetSensorReading, testGoodDecodeRequest)
2039{
2040 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
2041 requestMsg{};
2042
2043 uint16_t sensorId = 0xABCD;
2044 bool8_t rearmEventState = 0xA;
2045
2046 uint16_t retsensorId;
2047 bool8_t retrearmEventState;
2048
2049 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2050
2051 struct pldm_get_sensor_reading_req* req =
2052 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
2053
2054 req->sensor_id = htole16(sensorId);
2055 req->rearm_event_state = rearmEventState;
2056
2057 auto rc =
2058 decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize,
2059 &retsensorId, &retrearmEventState);
2060
2061 EXPECT_EQ(rc, PLDM_SUCCESS);
2062 EXPECT_EQ(sensorId, retsensorId);
2063 EXPECT_EQ(rearmEventState, retrearmEventState);
2064}
2065
2066TEST(GetSensorReading, testBadDecodeRequest)
2067{
2068 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
2069 requestMsg{};
2070
2071 auto rc = decode_get_sensor_reading_req(
2072 nullptr, requestMsg.size() - hdrSize, nullptr, nullptr);
2073 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2074
2075 uint16_t sensorId = 0xABCD;
2076 bool8_t rearmEventState = 0xA;
2077
2078 uint16_t retsensorId;
2079 bool8_t retrearmEventState;
2080
2081 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2082
2083 struct pldm_get_sensor_reading_req* req =
2084 reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
2085
2086 req->sensor_id = htole16(sensorId);
2087 req->rearm_event_state = rearmEventState;
2088
2089 rc = decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize - 1,
2090 &retsensorId, &retrearmEventState);
2091
2092 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2093}
2094
2095TEST(GetSensorReading, testGoodEncodeResponse)
2096{
2097 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES>
2098 responseMsg{};
2099
2100 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2101
2102 uint8_t completionCode = 0;
2103 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
2104 uint8_t sensor_operationalState = PLDM_SENSOR_ENABLED;
2105 uint8_t sensor_event_messageEnable = PLDM_NO_EVENT_GENERATION;
2106 uint8_t presentState = PLDM_SENSOR_NORMAL;
2107 uint8_t previousState = PLDM_SENSOR_WARNING;
2108 uint8_t eventState = PLDM_SENSOR_UPPERWARNING;
2109 uint8_t presentReading = 0x21;
2110
2111 auto rc = encode_get_sensor_reading_resp(
2112 0, completionCode, sensor_dataSize, sensor_operationalState,
2113 sensor_event_messageEnable, presentState, previousState, eventState,
2114 reinterpret_cast<uint8_t*>(&presentReading), response,
2115 responseMsg.size() - hdrSize);
2116
2117 struct pldm_get_sensor_reading_resp* resp =
2118 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
2119 response->payload);
2120
2121 EXPECT_EQ(rc, PLDM_SUCCESS);
2122 EXPECT_EQ(completionCode, resp->completion_code);
2123 EXPECT_EQ(sensor_dataSize, resp->sensor_data_size);
2124 EXPECT_EQ(sensor_operationalState, resp->sensor_operational_state);
2125 EXPECT_EQ(sensor_event_messageEnable, resp->sensor_event_message_enable);
2126 EXPECT_EQ(presentState, resp->present_state);
2127 EXPECT_EQ(previousState, resp->previous_state);
2128 EXPECT_EQ(eventState, resp->event_state);
2129 EXPECT_EQ(presentReading,
2130 *(reinterpret_cast<uint8_t*>(&resp->present_reading[0])));
2131}
2132
2133TEST(GetSensorReading, testBadEncodeResponse)
2134{
2135 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
2136 responseMsg{};
2137
2138 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2139
2140 uint8_t presentReading = 0x1;
2141
2142 auto rc = encode_get_sensor_reading_resp(0, PLDM_SUCCESS, 0, 0, 0, 0, 0, 0,
2143 nullptr, nullptr,
2144 responseMsg.size() - hdrSize);
2145 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2146
2147 rc = encode_get_sensor_reading_resp(
2148 0, PLDM_SUCCESS, 6, 1, 1, 1, 1, 1,
2149 reinterpret_cast<uint8_t*>(&presentReading), response,
2150 responseMsg.size() - hdrSize);
2151 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2152
2153 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
2154
2155 rc = encode_get_sensor_reading_resp(
2156 0, PLDM_SUCCESS, sensor_dataSize, 1, 1, 1, 1, 1,
2157 reinterpret_cast<uint8_t*>(&presentReading), response,
2158 responseMsg.size() - hdrSize);
2159 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2160}
2161
2162TEST(GetSensorReading, testGoodDecodeResponse)
2163{
2164 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
2165 responseMsg{};
2166
2167 uint8_t completionCode = 0;
2168 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
2169 uint8_t sensor_operationalState = PLDM_SENSOR_STATUSUNKOWN;
2170 uint8_t sensor_event_messageEnable = PLDM_EVENTS_ENABLED;
2171 uint8_t presentState = PLDM_SENSOR_CRITICAL;
2172 uint8_t previousState = PLDM_SENSOR_UPPERCRITICAL;
2173 uint8_t eventState = PLDM_SENSOR_WARNING;
2174 uint32_t presentReading = 0xABCDEF11;
2175
2176 uint8_t retcompletionCode;
2177 uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
2178 uint8_t retsensor_operationalState;
2179 uint8_t retsensor_event_messageEnable;
2180 uint8_t retpresentState;
2181 uint8_t retpreviousState;
2182 uint8_t reteventState;
2183 uint8_t retpresentReading[4];
2184
2185 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2186 struct pldm_get_sensor_reading_resp* resp =
2187 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
2188 response->payload);
2189
2190 resp->completion_code = completionCode;
2191 resp->sensor_data_size = sensor_dataSize;
2192 resp->sensor_operational_state = sensor_operationalState;
2193 resp->sensor_event_message_enable = sensor_event_messageEnable;
2194 resp->present_state = presentState;
2195 resp->previous_state = previousState;
2196 resp->event_state = eventState;
2197
2198 uint32_t presentReading_le = htole32(presentReading);
2199 memcpy(resp->present_reading, &presentReading_le,
2200 sizeof(presentReading_le));
2201
2202 auto rc = decode_get_sensor_reading_resp(
2203 response, responseMsg.size() - hdrSize, &retcompletionCode,
2204 &retsensor_dataSize, &retsensor_operationalState,
2205 &retsensor_event_messageEnable, &retpresentState, &retpreviousState,
2206 &reteventState, retpresentReading);
2207
2208 EXPECT_EQ(rc, PLDM_SUCCESS);
2209 EXPECT_EQ(completionCode, retcompletionCode);
2210 EXPECT_EQ(sensor_dataSize, retsensor_dataSize);
2211 EXPECT_EQ(sensor_operationalState, retsensor_operationalState);
2212 EXPECT_EQ(sensor_event_messageEnable, retsensor_event_messageEnable);
2213 EXPECT_EQ(presentState, retpresentState);
2214 EXPECT_EQ(previousState, retpreviousState);
2215 EXPECT_EQ(eventState, reteventState);
2216 EXPECT_EQ(presentReading,
2217 *(reinterpret_cast<uint32_t*>(retpresentReading)));
2218}
2219
2220TEST(GetSensorReading, testBadDecodeResponse)
2221{
2222 std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 1>
2223 responseMsg{};
2224
2225 auto rc = decode_get_sensor_reading_resp(
2226 nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
2227 nullptr, nullptr, nullptr, nullptr, nullptr);
2228
2229 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2230
2231 uint8_t completionCode = 0;
2232 uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
2233 uint8_t sensor_operationalState = PLDM_SENSOR_INTEST;
2234 uint8_t sensor_event_messageEnable = PLDM_EVENTS_DISABLED;
2235 uint8_t presentState = PLDM_SENSOR_FATAL;
2236 uint8_t previousState = PLDM_SENSOR_UPPERFATAL;
2237 uint8_t eventState = PLDM_SENSOR_WARNING;
2238 uint8_t presentReading = 0xA;
2239
2240 uint8_t retcompletionCode;
2241 uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
2242 uint8_t retsensor_operationalState;
2243 uint8_t retsensor_event_messageEnable;
2244 uint8_t retpresent_state;
2245 uint8_t retprevious_state;
2246 uint8_t retevent_state;
2247 uint8_t retpresentReading;
2248
2249 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2250 struct pldm_get_sensor_reading_resp* resp =
2251 reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
2252 response->payload);
2253
2254 resp->completion_code = completionCode;
2255 resp->sensor_data_size = sensor_dataSize;
2256 resp->sensor_operational_state = sensor_operationalState;
2257 resp->sensor_event_message_enable = sensor_event_messageEnable;
2258 resp->present_state = presentState;
2259 resp->previous_state = previousState;
2260 resp->event_state = eventState;
2261 resp->present_reading[0] = presentReading;
2262
2263 rc = decode_get_sensor_reading_resp(
2264 response, responseMsg.size() - hdrSize, &retcompletionCode,
2265 &retsensor_dataSize, &retsensor_operationalState,
2266 &retsensor_event_messageEnable, &retpresent_state, &retprevious_state,
2267 &retevent_state, reinterpret_cast<uint8_t*>(&retpresentReading));
2268
2269 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2270}
2271
2272TEST(SetEventReceiver, testGoodEncodeRequest)
2273{
2274 uint8_t eventMessageGlobalEnable =
2275 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
2276 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
2277 uint8_t eventReceiverAddressInfo = 0x08;
2278 uint16_t heartbeatTimer = 0x78;
2279
2280 std::vector<uint8_t> requestMsg(hdrSize +
2281 PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
2282 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2283
2284 auto rc = encode_set_event_receiver_req(
2285 0, eventMessageGlobalEnable, transportProtocolType,
2286 eventReceiverAddressInfo, heartbeatTimer, request);
2287
2288 EXPECT_EQ(rc, PLDM_SUCCESS);
2289 struct pldm_set_event_receiver_req* req =
2290 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
2291 EXPECT_EQ(eventMessageGlobalEnable, req->event_message_global_enable);
2292 EXPECT_EQ(transportProtocolType, req->transport_protocol_type);
2293 EXPECT_EQ(eventReceiverAddressInfo, req->event_receiver_address_info);
2294 EXPECT_EQ(heartbeatTimer, le16toh(req->heartbeat_timer));
2295}
2296
2297TEST(SetEventReceiver, testBadEncodeRequest)
2298{
2299 uint8_t eventMessageGlobalEnable =
2300 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
2301 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
2302 uint8_t eventReceiverAddressInfo = 0x08;
2303 uint16_t heartbeatTimer = 0;
2304
2305 std::vector<uint8_t> requestMsg(hdrSize +
2306 PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
2307 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2308
2309 auto rc = encode_set_event_receiver_req(
2310 0, eventMessageGlobalEnable, transportProtocolType,
2311 eventReceiverAddressInfo, heartbeatTimer, request);
2312
2313 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2314}
2315
2316TEST(SetEventReceiver, testGoodDecodeResponse)
2317{
2318 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
2319 responseMsg{};
2320
2321 uint8_t retcompletion_code = 0;
2322 responseMsg[hdrSize] = PLDM_SUCCESS;
2323
2324 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2325 auto rc = decode_set_event_receiver_resp(
2326 response, responseMsg.size() - sizeof(pldm_msg_hdr),
2327 &retcompletion_code);
2328
2329 EXPECT_EQ(rc, PLDM_SUCCESS);
2330 EXPECT_EQ(PLDM_SUCCESS, retcompletion_code);
2331}
2332
2333TEST(SetEventReceiver, testBadDecodeResponse)
2334{
2335 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
2336 responseMsg{};
2337 uint8_t retcompletion_code = 0;
2338 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2339
2340 auto rc = decode_set_event_receiver_resp(
2341 response, responseMsg.size() - sizeof(pldm_msg_hdr), NULL);
2342
2343 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2344
2345 rc = decode_set_event_receiver_resp(
2346 nullptr, responseMsg.size() - sizeof(pldm_msg_hdr),
2347 &retcompletion_code);
2348
2349 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2350}
2351
2352TEST(SetEventReceiver, testGoodEncodeResponse)
2353{
2354 std::array<uint8_t,
2355 sizeof(pldm_msg_hdr) + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
2356 responseMsg{};
2357 auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
2358 uint8_t completionCode = 0;
2359
2360 auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, response);
2361
2362 EXPECT_EQ(rc, PLDM_SUCCESS);
2363 EXPECT_EQ(completionCode, response->payload[0]);
2364}
2365
2366TEST(SetEventReceiver, testBadEncodeResponse)
2367{
2368 auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, NULL);
2369 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2370}
2371
2372TEST(SetEventReceiver, testGoodDecodeRequest)
2373{
2374
2375 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
2376 requestMsg{};
2377
2378 uint8_t eventMessageGlobalEnable =
2379 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
2380 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
2381 uint8_t eventReceiverAddressInfo = 0x08;
2382 uint16_t heartbeatTimer = 0x78;
2383
2384 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2385 struct pldm_set_event_receiver_req* req =
2386 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
2387
2388 req->event_message_global_enable = eventMessageGlobalEnable;
2389 req->transport_protocol_type = transportProtocolType;
2390 req->event_receiver_address_info = eventReceiverAddressInfo;
2391 req->heartbeat_timer = htole16(heartbeatTimer);
2392
2393 uint8_t reteventMessageGlobalEnable;
2394 uint8_t rettransportProtocolType;
2395 uint8_t reteventReceiverAddressInfo;
2396 uint16_t retheartbeatTimer;
2397 auto rc = decode_set_event_receiver_req(
2398 request, requestMsg.size() - hdrSize, &reteventMessageGlobalEnable,
2399 &rettransportProtocolType, &reteventReceiverAddressInfo,
2400 &retheartbeatTimer);
2401
2402 EXPECT_EQ(rc, PLDM_SUCCESS);
2403 EXPECT_EQ(eventMessageGlobalEnable, reteventMessageGlobalEnable);
2404 EXPECT_EQ(transportProtocolType, rettransportProtocolType);
2405 EXPECT_EQ(eventReceiverAddressInfo, reteventReceiverAddressInfo);
2406 EXPECT_EQ(heartbeatTimer, retheartbeatTimer);
2407}
2408
2409TEST(SetEventReceiver, testBadDecodeRequest)
2410{
2411 std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
2412 requestMsg{};
2413
2414 auto rc = decode_set_event_receiver_req(NULL, requestMsg.size() - hdrSize,
2415 NULL, NULL, NULL, NULL);
2416 EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
2417
2418 uint8_t eventMessageGlobalEnable =
2419 PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
2420 uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
2421 uint8_t eventReceiverAddressInfo = 0x08;
2422 uint16_t heartbeatTimer = 0x78;
2423
2424 auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
2425 struct pldm_set_event_receiver_req* req =
2426 reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
2427
2428 req->event_message_global_enable = eventMessageGlobalEnable;
2429 req->transport_protocol_type = transportProtocolType;
2430 req->event_receiver_address_info = eventReceiverAddressInfo;
2431 req->heartbeat_timer = htole16(heartbeatTimer);
2432
2433 uint8_t reteventMessageGlobalEnable;
2434 uint8_t rettransportProtocolType;
2435 uint8_t reteventReceiverAddressInfo;
2436 uint16_t retheartbeatTimer;
2437 rc = decode_set_event_receiver_req(
2438 request, requestMsg.size() - hdrSize - 1, &reteventMessageGlobalEnable,
2439 &rettransportProtocolType, &reteventReceiverAddressInfo,
2440 &retheartbeatTimer);
2441 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
2442}
Andrew Jeffery7992eb82023-04-06 16:13:53 +09302443
2444TEST(decodeNumericSensorPdrData, Uint8Test)
2445{
2446 std::vector<uint8_t> pdr1{
2447 0x1,
2448 0x0,
2449 0x0,
2450 0x0, // record handle
2451 0x1, // PDRHeaderVersion
2452 PLDM_NUMERIC_SENSOR_PDR, // PDRType
2453 0x0,
2454 0x0, // recordChangeNumber
2455 PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH,
2456 0, // dataLength
2457 0,
2458 0, // PLDMTerminusHandle
2459 0x1,
2460 0x0, // sensorID=1
2461 PLDM_ENTITY_POWER_SUPPLY,
2462 0, // entityType=Power Supply(120)
2463 1,
2464 0, // entityInstanceNumber
2465 1,
2466 0, // containerID=1
2467 PLDM_NO_INIT, // sensorInit
2468 false, // sensorAuxiliaryNamesPDR
2469 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
2470 0, // unitModifier
2471 0, // rateUnit
2472 0, // baseOEMUnitHandle
2473 0, // auxUnit
2474 0, // auxUnitModifier
2475 0, // auxRateUnit
2476 0, // rel
2477 0, // auxOEMUnitHandle
2478 true, // isLinear
2479 PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize
2480 0,
2481 0,
2482 0xc0,
2483 0x3f, // resolution=1.5
2484 0,
2485 0,
2486 0x80,
2487 0x3f, // offset=1.0
2488 0,
2489 0, // accuracy
2490 0, // plusTolerance
2491 0, // minusTolerance
2492 3, // hysteresis = 3
2493 0, // supportedThresholds
2494 0, // thresholdAndHysteresisVolatility
2495 0,
2496 0,
2497 0x80,
2498 0x3f, // stateTransistionInterval=1.0
2499 0,
2500 0,
2501 0x80,
2502 0x3f, // updateInverval=1.0
2503 255, // maxReadable
2504 0, // minReadable
2505 PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
2506 0, // rangeFieldsupport
2507 50, // nominalValue = 50
2508 60, // normalMax = 60
2509 40, // normalMin = 40
2510 70, // warningHigh = 70
2511 30, // warningLow = 30
2512 80, // criticalHigh = 80
2513 20, // criticalLow = 20
2514 90, // fatalHigh = 90
2515 10 // fatalLow = 10
2516 };
2517
2518 struct pldm_numeric_sensor_value_pdr decodedPdr;
2519 auto rc =
2520 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
2521 EXPECT_EQ(PLDM_SUCCESS, rc);
2522 EXPECT_EQ(1, decodedPdr.hdr.record_handle);
2523 EXPECT_EQ(1, decodedPdr.hdr.version);
2524 EXPECT_EQ(PLDM_NUMERIC_SENSOR_PDR, decodedPdr.hdr.type);
2525 EXPECT_EQ(0, decodedPdr.hdr.record_change_num);
2526 EXPECT_EQ(PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH, decodedPdr.hdr.length);
2527 EXPECT_EQ(1, decodedPdr.sensor_id);
2528 EXPECT_EQ(PLDM_ENTITY_POWER_SUPPLY, decodedPdr.entity_type);
2529 EXPECT_EQ(1, decodedPdr.entity_instance_num);
2530 EXPECT_EQ(1, decodedPdr.container_id);
2531 EXPECT_EQ(PLDM_NO_INIT, decodedPdr.sensor_init);
2532 EXPECT_EQ(false, decodedPdr.sensor_auxiliary_names_pdr);
2533 EXPECT_EQ(PLDM_SENSOR_UNIT_DEGRESS_C, decodedPdr.base_unit);
2534 EXPECT_EQ(0, decodedPdr.unit_modifier);
2535 EXPECT_EQ(0, decodedPdr.rate_unit);
2536 EXPECT_EQ(0, decodedPdr.base_oem_unit_handle);
2537 EXPECT_EQ(0, decodedPdr.aux_unit);
2538 EXPECT_EQ(0, decodedPdr.aux_unit_modifier);
2539 EXPECT_EQ(0, decodedPdr.aux_rate_unit);
2540 EXPECT_EQ(0, decodedPdr.rel);
2541 EXPECT_EQ(0, decodedPdr.aux_oem_unit_handle);
2542 EXPECT_EQ(true, decodedPdr.is_linear);
2543 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT8, decodedPdr.sensor_data_size);
2544 EXPECT_FLOAT_EQ(1.5f, decodedPdr.resolution);
2545 EXPECT_FLOAT_EQ(1.0f, decodedPdr.offset);
2546 EXPECT_EQ(0, decodedPdr.accuracy);
2547 EXPECT_EQ(0, decodedPdr.plus_tolerance);
2548 EXPECT_EQ(0, decodedPdr.minus_tolerance);
2549 EXPECT_EQ(3, decodedPdr.hysteresis.value_u8);
2550 EXPECT_EQ(0, decodedPdr.supported_thresholds.byte);
2551 EXPECT_EQ(0, decodedPdr.threshold_and_hysteresis_volatility.byte);
2552 EXPECT_FLOAT_EQ(1.0f, decodedPdr.state_transition_interval);
2553 EXPECT_FLOAT_EQ(1.0f, decodedPdr.update_interval);
2554 EXPECT_EQ(255, decodedPdr.max_readable.value_u8);
2555 EXPECT_EQ(0, decodedPdr.min_readable.value_u8);
2556 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT8, decodedPdr.range_field_format);
2557 EXPECT_EQ(0, decodedPdr.range_field_support.byte);
2558 EXPECT_EQ(50, decodedPdr.nominal_value.value_u8);
2559 EXPECT_EQ(60, decodedPdr.normal_max.value_u8);
2560 EXPECT_EQ(40, decodedPdr.normal_min.value_u8);
2561 EXPECT_EQ(70, decodedPdr.warning_high.value_u8);
2562 EXPECT_EQ(30, decodedPdr.warning_low.value_u8);
2563 EXPECT_EQ(80, decodedPdr.critical_high.value_u8);
2564 EXPECT_EQ(20, decodedPdr.critical_low.value_u8);
2565 EXPECT_EQ(90, decodedPdr.fatal_high.value_u8);
2566 EXPECT_EQ(10, decodedPdr.fatal_low.value_u8);
2567}
2568
2569TEST(decodeNumericSensorPdrData, Sint8Test)
2570{
2571 std::vector<uint8_t> pdr1{
2572 0x1,
2573 0x0,
2574 0x0,
2575 0x0, // record handle
2576 0x1, // PDRHeaderVersion
2577 PLDM_NUMERIC_SENSOR_PDR, // PDRType
2578 0x0,
2579 0x0, // recordChangeNumber
2580 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
2581 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH +
2582 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH,
2583 0, // dataLength
2584 0,
2585 0, // PLDMTerminusHandle
2586 0x1,
2587 0x0, // sensorID=1
2588 PLDM_ENTITY_POWER_SUPPLY,
2589 0, // entityType=Power Supply(120)
2590 1,
2591 0, // entityInstanceNumber
2592 0x1,
2593 0x0, // containerID=1
2594 PLDM_NO_INIT, // sensorInit
2595 false, // sensorAuxiliaryNamesPDR
2596 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
2597 0, // unitModifier
2598 0, // rateUnit
2599 0, // baseOEMUnitHandle
2600 0, // auxUnit
2601 0, // auxUnitModifier
2602 0, // auxRateUnit
2603 0, // rel
2604 0, // auxOEMUnitHandle
2605 true, // isLinear
2606 PLDM_RANGE_FIELD_FORMAT_SINT8, // sensorDataSize
2607 0,
2608 0,
2609 0,
2610 0, // resolution
2611 0,
2612 0,
2613 0,
2614 0, // offset
2615 0,
2616 0, // accuracy
2617 0, // plusTolerance
2618 0, // minusTolerance
2619 3, // hysteresis = 3
2620 0, // supportedThresholds
2621 0, // thresholdAndHysteresisVolatility
2622 0,
2623 0,
2624 0x80,
2625 0x3f, // stateTransistionInterval=1.0
2626 0,
2627 0,
2628 0x80,
2629 0x3f, // updateInverval=1.0
2630 0x64, // maxReadable = 100
2631 0x9c, // minReadable = -100
2632 PLDM_RANGE_FIELD_FORMAT_SINT8, // rangeFieldFormat
2633 0, // rangeFieldsupport
2634 0, // nominalValue = 0
2635 5, // normalMax = 5
2636 0xfb, // normalMin = -5
2637 10, // warningHigh = 10
2638 0xf6, // warningLow = -10
2639 20, // criticalHigh = 20
2640 0xec, // criticalLow = -20
2641 30, // fatalHigh = 30
2642 0xe2 // fatalLow = -30
2643 };
2644
2645 struct pldm_numeric_sensor_value_pdr decodedPdr;
2646 auto rc =
2647 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
2648 EXPECT_EQ(PLDM_SUCCESS, rc);
2649
2650 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT8, decodedPdr.sensor_data_size);
2651 EXPECT_EQ(100, decodedPdr.max_readable.value_s8);
2652 EXPECT_EQ(-100, decodedPdr.min_readable.value_s8);
2653 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT8, decodedPdr.range_field_format);
2654 EXPECT_EQ(0, decodedPdr.nominal_value.value_s8);
2655 EXPECT_EQ(5, decodedPdr.normal_max.value_s8);
2656 EXPECT_EQ(-5, decodedPdr.normal_min.value_s8);
2657 EXPECT_EQ(10, decodedPdr.warning_high.value_s8);
2658 EXPECT_EQ(-10, decodedPdr.warning_low.value_s8);
2659 EXPECT_EQ(20, decodedPdr.critical_high.value_s8);
2660 EXPECT_EQ(-20, decodedPdr.critical_low.value_s8);
2661 EXPECT_EQ(30, decodedPdr.fatal_high.value_s8);
2662 EXPECT_EQ(-30, decodedPdr.fatal_low.value_s8);
2663}
2664
2665TEST(decodeNumericSensorPdrData, Uint16Test)
2666{
2667 std::vector<uint8_t> pdr1{
2668 0x1,
2669 0x0,
2670 0x0,
2671 0x0, // record handle
2672 0x1, // PDRHeaderVersion
2673 PLDM_NUMERIC_SENSOR_PDR, // PDRType
2674 0x0,
2675 0x0, // recordChangeNumber
2676 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
2677 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 2 +
2678 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
2679 0, // dataLength
2680 0,
2681 0, // PLDMTerminusHandle
2682 0x1,
2683 0x0, // sensorID=1
2684 PLDM_ENTITY_POWER_SUPPLY,
2685 0, // entityType=Power Supply(120)
2686 1,
2687 0, // entityInstanceNumber
2688 0x1,
2689 0x0, // containerID=1
2690 PLDM_NO_INIT, // sensorInit
2691 false, // sensorAuxiliaryNamesPDR
2692 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
2693 0, // unitModifier
2694 0, // rateUnit
2695 0, // baseOEMUnitHandle
2696 0, // auxUnit
2697 0, // auxUnitModifier
2698 0, // auxRateUnit
2699 0, // rel
2700 0, // auxOEMUnitHandle
2701 true, // isLinear
2702 PLDM_SENSOR_DATA_SIZE_UINT16, // sensorDataSize
2703 0,
2704 0,
2705 0,
2706 0, // resolution
2707 0,
2708 0,
2709 0,
2710 0, // offset
2711 0,
2712 0, // accuracy
2713 0, // plusTolerance
2714 0, // minusTolerance
2715 3,
2716 0, // hysteresis = 3
2717 0, // supportedThresholds
2718 0, // thresholdAndHysteresisVolatility
2719 0,
2720 0,
2721 0x80,
2722 0x3f, // stateTransistionInterval=1.0
2723 0,
2724 0,
2725 0x80,
2726 0x3f, // updateInverval=1.0
2727 0,
2728 0x10, // maxReadable = 4096
2729 0,
2730 0, // minReadable = 0
2731 PLDM_RANGE_FIELD_FORMAT_UINT16, // rangeFieldFormat
2732 0, // rangeFieldsupport
2733 0x88,
2734 0x13, // nominalValue = 5,000
2735 0x70,
2736 0x17, // normalMax = 6,000
2737 0xa0,
2738 0x0f, // normalMin = 4,000
2739 0x58,
2740 0x1b, // warningHigh = 7,000
2741 0xb8,
2742 0x0b, // warningLow = 3,000
2743 0x40,
2744 0x1f, // criticalHigh = 8,000
2745 0xd0,
2746 0x07, // criticalLow = 2,000
2747 0x28,
2748 0x23, // fatalHigh = 9,000
2749 0xe8,
2750 0x03 // fatalLow = 1,000
2751 };
2752
2753 struct pldm_numeric_sensor_value_pdr decodedPdr;
2754 auto rc =
2755 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
2756 EXPECT_EQ(PLDM_SUCCESS, rc);
2757
2758 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT16, decodedPdr.sensor_data_size);
2759 EXPECT_EQ(4096, decodedPdr.max_readable.value_u16);
2760 EXPECT_EQ(0, decodedPdr.min_readable.value_u16);
2761 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT16, decodedPdr.range_field_format);
2762 EXPECT_EQ(5000, decodedPdr.nominal_value.value_u16);
2763 EXPECT_EQ(6000, decodedPdr.normal_max.value_u16);
2764 EXPECT_EQ(4000, decodedPdr.normal_min.value_u16);
2765 EXPECT_EQ(7000, decodedPdr.warning_high.value_u16);
2766 EXPECT_EQ(3000, decodedPdr.warning_low.value_u16);
2767 EXPECT_EQ(8000, decodedPdr.critical_high.value_u16);
2768 EXPECT_EQ(2000, decodedPdr.critical_low.value_u16);
2769 EXPECT_EQ(9000, decodedPdr.fatal_high.value_u16);
2770 EXPECT_EQ(1000, decodedPdr.fatal_low.value_u16);
2771}
2772
2773TEST(decodeNumericSensorPdrData, Sint16Test)
2774{
2775 std::vector<uint8_t> pdr1{
2776 0x1,
2777 0x0,
2778 0x0,
2779 0x0, // record handle
2780 0x1, // PDRHeaderVersion
2781 PLDM_NUMERIC_SENSOR_PDR, // PDRType
2782 0x0,
2783 0x0, // recordChangeNumber
2784 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
2785 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 2 +
2786 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
2787 0, // dataLength
2788 0,
2789 0, // PLDMTerminusHandle
2790 0x1,
2791 0x0, // sensorID=1
2792 PLDM_ENTITY_POWER_SUPPLY,
2793 0, // entityType=Power Supply(120)
2794 1,
2795 0, // entityInstanceNumber
2796 0x1,
2797 0x0, // containerID=1
2798 PLDM_NO_INIT, // sensorInit
2799 false, // sensorAuxiliaryNamesPDR
2800 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
2801 0, // unitModifier
2802 0, // rateUnit
2803 0, // baseOEMUnitHandle
2804 0, // auxUnit
2805 0, // auxUnitModifier
2806 0, // auxRateUnit
2807 0, // rel
2808 0, // auxOEMUnitHandle
2809 true, // isLinear
2810 PLDM_SENSOR_DATA_SIZE_SINT16, // sensorDataSize
2811 0,
2812 0,
2813 0,
2814 0, // resolution
2815 0,
2816 0,
2817 0,
2818 0, // offset
2819 0,
2820 0, // accuracy
2821 0, // plusTolerance
2822 0, // minusTolerance
2823 3,
2824 0, // hysteresis
2825 0, // supportedThresholds
2826 0, // thresholdAndHysteresisVolatility
2827 0,
2828 0,
2829 0x80,
2830 0x3f, // stateTransistionInterval=1.0
2831 0,
2832 0,
2833 0x80,
2834 0x3f, // updateInverval=1.0
2835 0xe8,
2836 0x03, // maxReadable = 1000
2837 0x18,
2838 0xfc, // minReadable = -1000
2839 PLDM_RANGE_FIELD_FORMAT_SINT16, // rangeFieldFormat
2840 0, // rangeFieldsupport
2841 0,
2842 0, // nominalValue = 0
2843 0xf4,
2844 0x01, // normalMax = 500
2845 0x0c,
2846 0xfe, // normalMin = -500
2847 0xe8,
2848 0x03, // warningHigh = 1,000
2849 0x18,
2850 0xfc, // warningLow = -1,000
2851 0xd0,
2852 0x07, // criticalHigh = 2,000
2853 0x30,
2854 0xf8, // criticalLow = -2,000
2855 0xb8,
2856 0x0b, // fatalHigh = 3,000
2857 0x48,
2858 0xf4 // fatalLow = -3,000
2859 };
2860
2861 struct pldm_numeric_sensor_value_pdr decodedPdr;
2862 auto rc =
2863 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
2864 EXPECT_EQ(PLDM_SUCCESS, rc);
2865
2866 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT16, decodedPdr.sensor_data_size);
2867 EXPECT_EQ(1000, decodedPdr.max_readable.value_s16);
2868 EXPECT_EQ(-1000, decodedPdr.min_readable.value_s16);
2869 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT16, decodedPdr.range_field_format);
2870 EXPECT_EQ(0, decodedPdr.nominal_value.value_s16);
2871 EXPECT_EQ(500, decodedPdr.normal_max.value_s16);
2872 EXPECT_EQ(-500, decodedPdr.normal_min.value_s16);
2873 EXPECT_EQ(1000, decodedPdr.warning_high.value_s16);
2874 EXPECT_EQ(-1000, decodedPdr.warning_low.value_s16);
2875 EXPECT_EQ(2000, decodedPdr.critical_high.value_s16);
2876 EXPECT_EQ(-2000, decodedPdr.critical_low.value_s16);
2877 EXPECT_EQ(3000, decodedPdr.fatal_high.value_s16);
2878 EXPECT_EQ(-3000, decodedPdr.fatal_low.value_s16);
2879}
2880
2881TEST(decodeNumericSensorPdrData, Uint32Test)
2882{
2883 std::vector<uint8_t> pdr1{
2884 0x1,
2885 0x0,
2886 0x0,
2887 0x0, // record handle
2888 0x1, // PDRHeaderVersion
2889 PLDM_NUMERIC_SENSOR_PDR, // PDRType
2890 0x0,
2891 0x0, // recordChangeNumber
2892 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
2893 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
2894 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
2895 0, // dataLength
2896 0,
2897 0, // PLDMTerminusHandle
2898 0x1,
2899 0x0, // sensorID=1
2900 PLDM_ENTITY_POWER_SUPPLY,
2901 0, // entityType=Power Supply(120)
2902 1,
2903 0, // entityInstanceNumber
2904 0x1,
2905 0x0, // containerID=1
2906 PLDM_NO_INIT, // sensorInit
2907 false, // sensorAuxiliaryNamesPDR
2908 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
2909 0, // unitModifier
2910 0, // rateUnit
2911 0, // baseOEMUnitHandle
2912 0, // auxUnit
2913 0, // auxUnitModifier
2914 0, // auxRateUnit
2915 0, // rel
2916 0, // auxOEMUnitHandle
2917 true, // isLinear
2918 PLDM_SENSOR_DATA_SIZE_UINT32, // sensorDataSize
2919 0,
2920 0,
2921 0,
2922 0, // resolution
2923 0,
2924 0,
2925 0,
2926 0, // offset
2927 0,
2928 0, // accuracy
2929 0, // plusTolerance
2930 0, // minusTolerance
2931 3,
2932 0,
2933 0,
2934 0, // hysteresis
2935 0, // supportedThresholds
2936 0, // thresholdAndHysteresisVolatility
2937 0,
2938 0,
2939 0x80,
2940 0x3f, // stateTransistionInterval=1.0
2941 0,
2942 0,
2943 0x80,
2944 0x3f, // updateInverval=1.0
2945 0,
2946 0x10,
2947 0,
2948 0, // maxReadable = 4096
2949 0,
2950 0,
2951 0,
2952 0, // minReadable = 0
2953 PLDM_RANGE_FIELD_FORMAT_UINT32, // rangeFieldFormat
2954 0, // rangeFieldsupport
2955 0x40,
2956 0x4b,
2957 0x4c,
2958 0x00, // nominalValue = 5,000,000
2959 0x80,
2960 0x8d,
2961 0x5b,
2962 0x00, // normalMax = 6,000,000
2963 0x00,
2964 0x09,
2965 0x3d,
2966 0x00, // normalMin = 4,000,000
2967 0xc0,
2968 0xcf,
2969 0x6a,
2970 0x00, // warningHigh = 7,000,000
2971 0xc0,
2972 0xc6,
2973 0x2d,
2974 0x00, // warningLow = 3,000,000
2975 0x00,
2976 0x12,
2977 0x7a,
2978 0x00, // criticalHigh = 8,000,000
2979 0x80,
2980 0x84,
2981 0x1e,
2982 0x00, // criticalLow = 2,000,000
2983 0x40,
2984 0x54,
2985 0x89,
2986 0x00, // fatalHigh = 9,000,000
2987 0x40,
2988 0x42,
2989 0x0f,
2990 0x00 // fatalLow = 1,000,000
2991 };
2992
2993 struct pldm_numeric_sensor_value_pdr decodedPdr;
2994 auto rc =
2995 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
2996 EXPECT_EQ(PLDM_SUCCESS, rc);
2997
2998 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT32, decodedPdr.sensor_data_size);
2999 EXPECT_EQ(4096, decodedPdr.max_readable.value_u32);
3000 EXPECT_EQ(0, decodedPdr.min_readable.value_u32);
3001 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT32, decodedPdr.range_field_format);
3002 EXPECT_EQ(5000000, decodedPdr.nominal_value.value_u32);
3003 EXPECT_EQ(6000000, decodedPdr.normal_max.value_u32);
3004 EXPECT_EQ(4000000, decodedPdr.normal_min.value_u32);
3005 EXPECT_EQ(7000000, decodedPdr.warning_high.value_u32);
3006 EXPECT_EQ(3000000, decodedPdr.warning_low.value_u32);
3007 EXPECT_EQ(8000000, decodedPdr.critical_high.value_u32);
3008 EXPECT_EQ(2000000, decodedPdr.critical_low.value_u32);
3009 EXPECT_EQ(9000000, decodedPdr.fatal_high.value_u32);
3010 EXPECT_EQ(1000000, decodedPdr.fatal_low.value_u32);
3011}
3012
3013TEST(decodeNumericSensorPdrData, Sint32Test)
3014{
3015 std::vector<uint8_t> pdr1{
3016 0x1,
3017 0x0,
3018 0x0,
3019 0x0, // record handle
3020 0x1, // PDRHeaderVersion
3021 PLDM_NUMERIC_SENSOR_PDR, // PDRType
3022 0x0,
3023 0x0, // recordChangeNumber
3024 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
3025 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
3026 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
3027 0, // dataLength
3028 0,
3029 0, // PLDMTerminusHandle
3030 0x1,
3031 0x0, // sensorID=1
3032 PLDM_ENTITY_POWER_SUPPLY,
3033 0, // entityType=Power Supply(120)
3034 1,
3035 0, // entityInstanceNumber
3036 0x1,
3037 0x0, // containerID=1
3038 PLDM_NO_INIT, // sensorInit
3039 false, // sensorAuxiliaryNamesPDR
3040 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
3041 0, // unitModifier
3042 0, // rateUnit
3043 0, // baseOEMUnitHandle
3044 0, // auxUnit
3045 0, // auxUnitModifier
3046 0, // auxRateUnit
3047 0, // rel
3048 0, // auxOEMUnitHandle
3049 true, // isLinear
3050 PLDM_SENSOR_DATA_SIZE_SINT32, // sensorDataSize
3051 0,
3052 0,
3053 0,
3054 0, // resolution
3055 0,
3056 0,
3057 0,
3058 0, // offset
3059 0,
3060 0, // accuracy
3061 0, // plusTolerance
3062 0, // minusTolerance
3063 3,
3064 0,
3065 0,
3066 0, // hysteresis
3067 0, // supportedThresholds
3068 0, // thresholdAndHysteresisVolatility
3069 0,
3070 0,
3071 0x80,
3072 0x3f, // stateTransistionInterval=1.0
3073 0,
3074 0,
3075 0x80,
3076 0x3f, // updateInverval=1.0
3077 0xa0,
3078 0x86,
3079 0x01,
3080 0x00, // maxReadable = 100000
3081 0x60,
3082 0x79,
3083 0xfe,
3084 0xff, // minReadable = -10000
3085 PLDM_RANGE_FIELD_FORMAT_SINT32, // rangeFieldFormat
3086 0, // rangeFieldsupport
3087 0,
3088 0,
3089 0,
3090 0, // nominalValue = 0
3091 0x20,
3092 0xa1,
3093 0x07,
3094 0x00, // normalMax = 500,000
3095 0xe0,
3096 0x5e,
3097 0xf8,
3098 0xff, // normalMin = -500,000
3099 0x40,
3100 0x42,
3101 0x0f,
3102 0x00, // warningHigh = 1,000,000
3103 0xc0,
3104 0xbd,
3105 0xf0,
3106 0xff, // warningLow = -1,000,000
3107 0x80,
3108 0x84,
3109 0x1e,
3110 0x00, // criticalHigh = 2,000,000
3111 0x80,
3112 0x7b,
3113 0xe1,
3114 0xff, // criticalLow = -2,000,000
3115 0xc0,
3116 0xc6,
3117 0x2d,
3118 0x00, // fatalHigh = 3,000,000
3119 0x40,
3120 0x39,
3121 0xd2,
3122 0xff // fatalLow = -3,000,000
3123 };
3124
3125 struct pldm_numeric_sensor_value_pdr decodedPdr;
3126 auto rc =
3127 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
3128 EXPECT_EQ(PLDM_SUCCESS, rc);
3129
3130 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT32, decodedPdr.sensor_data_size);
3131 EXPECT_EQ(100000, decodedPdr.max_readable.value_s32);
3132 EXPECT_EQ(-100000, decodedPdr.min_readable.value_s32);
3133 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT32, decodedPdr.range_field_format);
3134 EXPECT_EQ(0, decodedPdr.nominal_value.value_s32);
3135 EXPECT_EQ(500000, decodedPdr.normal_max.value_s32);
3136 EXPECT_EQ(-500000, decodedPdr.normal_min.value_s32);
3137 EXPECT_EQ(1000000, decodedPdr.warning_high.value_s32);
3138 EXPECT_EQ(-1000000, decodedPdr.warning_low.value_s32);
3139 EXPECT_EQ(2000000, decodedPdr.critical_high.value_s32);
3140 EXPECT_EQ(-2000000, decodedPdr.critical_low.value_s32);
3141 EXPECT_EQ(3000000, decodedPdr.fatal_high.value_s32);
3142 EXPECT_EQ(-3000000, decodedPdr.fatal_low.value_s32);
3143}
3144
3145TEST(decodeNumericSensorPdrData, Real32Test)
3146{
3147 std::vector<uint8_t> pdr1{
3148 0x1,
3149 0x0,
3150 0x0,
3151 0x0, // record handle
3152 0x1, // PDRHeaderVersion
3153 PLDM_NUMERIC_SENSOR_PDR, // PDRType
3154 0x0,
3155 0x0, // recordChangeNumber
3156 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
3157 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
3158 PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
3159 0, // dataLength
3160 0,
3161 0, // PLDMTerminusHandle
3162 0x1,
3163 0x0, // sensorID=1
3164 PLDM_ENTITY_POWER_SUPPLY,
3165 0, // entityType=Power Supply(120)
3166 1,
3167 0, // entityInstanceNumber
3168 0x1,
3169 0x0, // containerID=1
3170 PLDM_NO_INIT, // sensorInit
3171 false, // sensorAuxiliaryNamesPDR
3172 PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
3173 0, // unitModifier
3174 0, // rateUnit
3175 0, // baseOEMUnitHandle
3176 0, // auxUnit
3177 0, // auxUnitModifier
3178 0, // auxRateUnit
3179 0, // rel
3180 0, // auxOEMUnitHandle
3181 true, // isLinear
3182 PLDM_SENSOR_DATA_SIZE_SINT32, // sensorDataSize
3183 0,
3184 0,
3185 0,
3186 0, // resolution
3187 0,
3188 0,
3189 0,
3190 0, // offset
3191 0,
3192 0, // accuracy
3193 0, // plusTolerance
3194 0, // minusTolerance
3195 3,
3196 0,
3197 0,
3198 0, // hysteresis
3199 0, // supportedThresholds
3200 0, // thresholdAndHysteresisVolatility
3201 0,
3202 0,
3203 0x80,
3204 0x3f, // stateTransistionInterval=1.0
3205 0,
3206 0,
3207 0x80,
3208 0x3f, // updateInverval=1.0
3209 0xa0,
3210 0x86,
3211 0x01,
3212 0x00, // maxReadable = 100000
3213 0x60,
3214 0x79,
3215 0xfe,
3216 0xff, // minReadable = -10000
3217 PLDM_RANGE_FIELD_FORMAT_REAL32, // rangeFieldFormat
3218 0, // rangeFieldsupport
3219 0,
3220 0,
3221 0,
3222 0, // nominalValue = 0.0
3223 0x33,
3224 0x33,
3225 0x48,
3226 0x42, // normalMax = 50.05
3227 0x33,
3228 0x33,
3229 0x48,
3230 0xc2, // normalMin = -50.05
3231 0x83,
3232 0x00,
3233 0xc8,
3234 0x42, // warningHigh = 100.001
3235 0x83,
3236 0x00,
3237 0xc8,
3238 0xc2, // warningLow = -100.001
3239 0x83,
3240 0x00,
3241 0x48,
3242 0x43, // criticalHigh = 200.002
3243 0x83,
3244 0x00,
3245 0x48,
3246 0xc3, // criticalLow = -200.002
3247 0x62,
3248 0x00,
3249 0x96,
3250 0x43, // fatalHigh = 300.003
3251 0x62,
3252 0x00,
3253 0x96,
3254 0xc3 // fatalLow = -300.003
3255 };
3256
3257 struct pldm_numeric_sensor_value_pdr decodedPdr;
3258 auto rc =
3259 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
3260 EXPECT_EQ(PLDM_SUCCESS, rc);
3261
3262 EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT32, decodedPdr.sensor_data_size);
3263 EXPECT_EQ(100000, decodedPdr.max_readable.value_s32);
3264 EXPECT_EQ(-100000, decodedPdr.min_readable.value_s32);
3265 EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_REAL32, decodedPdr.range_field_format);
3266 EXPECT_FLOAT_EQ(0, decodedPdr.nominal_value.value_f32);
3267 EXPECT_FLOAT_EQ(50.05f, decodedPdr.normal_max.value_f32);
3268 EXPECT_FLOAT_EQ(-50.05f, decodedPdr.normal_min.value_f32);
3269 EXPECT_FLOAT_EQ(100.001f, decodedPdr.warning_high.value_f32);
3270 EXPECT_FLOAT_EQ(-100.001f, decodedPdr.warning_low.value_f32);
3271 EXPECT_FLOAT_EQ(200.002f, decodedPdr.critical_high.value_f32);
3272 EXPECT_FLOAT_EQ(-200.002f, decodedPdr.critical_low.value_f32);
3273 EXPECT_FLOAT_EQ(300.003f, decodedPdr.fatal_high.value_f32);
3274 EXPECT_FLOAT_EQ(-300.003f, decodedPdr.fatal_low.value_f32);
3275}
3276
3277TEST(decodeNumericSensorPdrDataDeathTest, InvalidSizeTest)
3278{
3279 // A corrupted PDR. The data after plusTolerance missed.
3280 std::vector<uint8_t> pdr1{
3281 0x1,
3282 0x0,
3283 0x0,
3284 0x0, // record handle
3285 0x1, // PDRHeaderVersion
3286 PLDM_NUMERIC_SENSOR_PDR, // PDRType
3287 0x0,
3288 0x0, // recordChangeNumber
3289 PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH,
3290 0, // dataLength
3291 0,
3292 0, // PLDMTerminusHandle
3293 0x1,
3294 0x0, // sensorID=1
3295 PLDM_ENTITY_POWER_SUPPLY,
3296 0, // entityType=Power Supply(120)
3297 1,
3298 0, // entityInstanceNumber
3299 0x1,
3300 0x0, // containerID=1
3301 PLDM_NO_INIT, // sensorInit
3302 false, // sensorAuxiliaryNamesPDR
3303 2, // baseUint(2)=degrees C
3304 0, // unitModifier
3305 0, // rateUnit
3306 0, // baseOEMUnitHandle
3307 0, // auxUnit
3308 0, // auxUnitModifier
3309 0, // auxRateUnit
3310 0, // rel
3311 0, // auxOEMUnitHandle
3312 true, // isLinear
3313 PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize
3314 0,
3315 0,
3316 0,
3317 0, // resolution
3318 0,
3319 0,
3320 0,
3321 0, // offset
3322 0,
3323 0, // accuracy
3324 0 // plusTolerance
3325 };
3326
3327 struct pldm_numeric_sensor_value_pdr decodedPdr;
3328 int rc =
3329 decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
3330 EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
3331}