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