blob: 58242fb6a56691699a9f2695cbc5fdfbcdb8184e [file] [log] [blame]
#include <endian.h>
#include <array>
#include <cstdint>
#include <cstring>
#include <vector>
#include "libpldm/base.h"
#include "libpldm/entity.h"
#include "libpldm/platform.h"
#include "pldm_types.h"
#include <gtest/gtest.h>
constexpr auto hdrSize = sizeof(pldm_msg_hdr);
TEST(SetStateEffecterStates, testEncodeResponse)
{
std::array<uint8_t,
sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
uint8_t completionCode = 0;
auto rc = encode_set_state_effecter_states_resp(0, PLDM_SUCCESS, response);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completionCode, response->payload[0]);
}
TEST(SetStateEffecterStates, testEncodeRequest)
{
std::array<uint8_t,
sizeof(pldm_msg_hdr) + PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES>
requestMsg{};
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
uint16_t effecterId = 0x0A;
uint8_t compEffecterCnt = 0x2;
std::array<set_effecter_state_field, 8> stateField{};
stateField[0] = {PLDM_REQUEST_SET, 2};
stateField[1] = {PLDM_REQUEST_SET, 3};
auto rc = encode_set_state_effecter_states_req(
0, effecterId, compEffecterCnt, stateField.data(), request);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(effecterId, request->payload[0]);
EXPECT_EQ(compEffecterCnt, request->payload[sizeof(effecterId)]);
EXPECT_EQ(stateField[0].set_request,
request->payload[sizeof(effecterId) + sizeof(compEffecterCnt)]);
EXPECT_EQ(stateField[0].effecter_state,
request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
sizeof(stateField[0].set_request)]);
EXPECT_EQ(stateField[1].set_request,
request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
sizeof(stateField[0])]);
EXPECT_EQ(stateField[1].effecter_state,
request->payload[sizeof(effecterId) + sizeof(compEffecterCnt) +
sizeof(stateField[0]) +
sizeof(stateField[1].set_request)]);
}
TEST(SetStateEffecterStates, testGoodDecodeResponse)
{
std::array<uint8_t, hdrSize + PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
responseMsg{};
uint8_t retcompletion_code = 0;
responseMsg[hdrSize] = PLDM_SUCCESS;
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
auto rc = decode_set_state_effecter_states_resp(
response, responseMsg.size() - hdrSize, &retcompletion_code);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(PLDM_SUCCESS, retcompletion_code);
}
TEST(SetStateEffecterStates, testGoodDecodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_SET_STATE_EFFECTER_STATES_REQ_BYTES>
requestMsg{};
uint16_t effecterId = 0x32;
uint16_t effecterIdLE = htole16(effecterId);
uint8_t compEffecterCnt = 0x2;
std::array<set_effecter_state_field, 8> stateField{};
stateField[0] = {PLDM_REQUEST_SET, 3};
stateField[1] = {PLDM_REQUEST_SET, 4};
uint16_t retEffecterId = 0;
uint8_t retCompEffecterCnt = 0;
std::array<set_effecter_state_field, 8> retStateField{};
memcpy(requestMsg.data() + hdrSize, &effecterIdLE, sizeof(effecterIdLE));
memcpy(requestMsg.data() + sizeof(effecterIdLE) + hdrSize, &compEffecterCnt,
sizeof(compEffecterCnt));
memcpy(requestMsg.data() + sizeof(effecterIdLE) + sizeof(compEffecterCnt) +
hdrSize,
&stateField, sizeof(stateField));
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = decode_set_state_effecter_states_req(
request, requestMsg.size() - hdrSize, &retEffecterId,
&retCompEffecterCnt, retStateField.data());
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(effecterId, retEffecterId);
EXPECT_EQ(retCompEffecterCnt, compEffecterCnt);
EXPECT_EQ(retStateField[0].set_request, stateField[0].set_request);
EXPECT_EQ(retStateField[0].effecter_state, stateField[0].effecter_state);
EXPECT_EQ(retStateField[1].set_request, stateField[1].set_request);
EXPECT_EQ(retStateField[1].effecter_state, stateField[1].effecter_state);
}
TEST(SetStateEffecterStates, testBadDecodeRequest)
{
const struct pldm_msg* msg = NULL;
auto rc = decode_set_state_effecter_states_req(msg, sizeof(*msg), NULL,
NULL, NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(SetStateEffecterStates, testBadDecodeResponse)
{
std::array<uint8_t, PLDM_SET_STATE_EFFECTER_STATES_RESP_BYTES>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
auto rc = decode_set_state_effecter_states_resp(response,
responseMsg.size(), NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(GetPDR, testGoodEncodeResponse)
{
uint8_t completionCode = 0;
uint32_t nextRecordHndl = 0x12;
uint32_t nextDataTransferHndl = 0x13;
uint8_t transferFlag = PLDM_END;
uint16_t respCnt = 0x5;
std::vector<uint8_t> recordData{1, 2, 3, 4, 5};
uint8_t transferCRC = 6;
// + size of record data and transfer CRC
std::vector<uint8_t> responseMsg(hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES +
recordData.size() + 1);
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
auto rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
nextDataTransferHndl, transferFlag, respCnt,
recordData.data(), transferCRC, response);
EXPECT_EQ(rc, PLDM_SUCCESS);
struct pldm_get_pdr_resp* resp =
reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
EXPECT_EQ(completionCode, resp->completion_code);
EXPECT_EQ(nextRecordHndl, le32toh(resp->next_record_handle));
EXPECT_EQ(nextDataTransferHndl, le32toh(resp->next_data_transfer_handle));
EXPECT_EQ(transferFlag, resp->transfer_flag);
EXPECT_EQ(respCnt, le16toh(resp->response_count));
EXPECT_EQ(0,
memcmp(recordData.data(), resp->record_data, recordData.size()));
EXPECT_EQ(*(response->payload + sizeof(pldm_get_pdr_resp) - 1 +
recordData.size()),
transferCRC);
transferFlag = PLDM_START_AND_END; // No CRC in this case
responseMsg.resize(responseMsg.size() - sizeof(transferCRC));
rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
nextDataTransferHndl, transferFlag, respCnt,
recordData.data(), transferCRC, response);
EXPECT_EQ(rc, PLDM_SUCCESS);
}
TEST(GetPDR, testBadEncodeResponse)
{
uint32_t nextRecordHndl = 0x12;
uint32_t nextDataTransferHndl = 0x13;
uint8_t transferFlag = PLDM_START_AND_END;
uint16_t respCnt = 0x5;
std::vector<uint8_t> recordData{1, 2, 3, 4, 5};
uint8_t transferCRC = 0;
auto rc = encode_get_pdr_resp(0, PLDM_SUCCESS, nextRecordHndl,
nextDataTransferHndl, transferFlag, respCnt,
recordData.data(), transferCRC, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(GetPDR, testGoodDecodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_GET_PDR_REQ_BYTES> requestMsg{};
uint32_t recordHndl = 0x32;
uint32_t dataTransferHndl = 0x11;
uint8_t transferOpFlag = PLDM_GET_FIRSTPART;
uint16_t requestCnt = 0x5;
uint16_t recordChangeNum = 0x01;
uint32_t retRecordHndl = 0;
uint32_t retDataTransferHndl = 0;
uint8_t retTransferOpFlag = 0;
uint16_t retRequestCnt = 0;
uint16_t retRecordChangeNum = 0;
auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_get_pdr_req* request =
reinterpret_cast<struct pldm_get_pdr_req*>(req->payload);
request->record_handle = htole32(recordHndl);
request->data_transfer_handle = htole32(dataTransferHndl);
request->transfer_op_flag = transferOpFlag;
request->request_count = htole16(requestCnt);
request->record_change_number = htole16(recordChangeNum);
auto rc = decode_get_pdr_req(
req, requestMsg.size() - hdrSize, &retRecordHndl, &retDataTransferHndl,
&retTransferOpFlag, &retRequestCnt, &retRecordChangeNum);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retRecordHndl, recordHndl);
EXPECT_EQ(retDataTransferHndl, dataTransferHndl);
EXPECT_EQ(retTransferOpFlag, transferOpFlag);
EXPECT_EQ(retRequestCnt, requestCnt);
EXPECT_EQ(retRecordChangeNum, recordChangeNum);
}
TEST(GetPDR, testBadDecodeRequest)
{
std::array<uint8_t, PLDM_GET_PDR_REQ_BYTES> requestMsg{};
auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = decode_get_pdr_req(req, requestMsg.size(), NULL, NULL, NULL, NULL,
NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(GetPDR, testGoodEncodeRequest)
{
uint32_t record_hndl = 0;
uint32_t data_transfer_hndl = 0;
uint8_t transfer_op_flag = PLDM_GET_FIRSTPART;
uint16_t request_cnt = 20;
uint16_t record_chg_num = 0;
std::vector<uint8_t> requestMsg(hdrSize + PLDM_GET_PDR_REQ_BYTES);
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
transfer_op_flag, request_cnt, record_chg_num,
request, PLDM_GET_PDR_REQ_BYTES);
EXPECT_EQ(rc, PLDM_SUCCESS);
struct pldm_get_pdr_req* req =
reinterpret_cast<struct pldm_get_pdr_req*>(request->payload);
EXPECT_EQ(record_hndl, le32toh(req->record_handle));
EXPECT_EQ(data_transfer_hndl, le32toh(req->data_transfer_handle));
EXPECT_EQ(transfer_op_flag, req->transfer_op_flag);
EXPECT_EQ(request_cnt, le16toh(req->request_count));
EXPECT_EQ(record_chg_num, le16toh(req->record_change_number));
}
TEST(GetPDR, testBadEncodeRequest)
{
uint32_t record_hndl = 0;
uint32_t data_transfer_hndl = 0;
uint8_t transfer_op_flag = PLDM_GET_FIRSTPART;
uint16_t request_cnt = 32;
uint16_t record_chg_num = 0;
std::vector<uint8_t> requestMsg(hdrSize + PLDM_GET_PDR_REQ_BYTES);
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
transfer_op_flag, request_cnt, record_chg_num,
nullptr, PLDM_GET_PDR_REQ_BYTES);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = encode_get_pdr_req(0, record_hndl, data_transfer_hndl,
transfer_op_flag, request_cnt, record_chg_num,
request, PLDM_GET_PDR_REQ_BYTES + 1);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(GetPDR, testGoodDecodeResponse)
{
const char* recordData = "123456789";
uint8_t completionCode = PLDM_SUCCESS;
uint32_t nextRecordHndl = 0;
uint32_t nextDataTransferHndl = 0;
uint8_t transferFlag = PLDM_END;
constexpr uint16_t respCnt = 9;
uint8_t transferCRC = 96;
size_t recordDataLength = 32;
std::array<uint8_t, hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES + respCnt +
sizeof(transferCRC)>
responseMsg{};
uint8_t retCompletionCode = 0;
uint8_t retRecordData[32] = {0};
uint32_t retNextRecordHndl = 0;
uint32_t retNextDataTransferHndl = 0;
uint8_t retTransferFlag = 0;
uint16_t retRespCnt = 0;
uint8_t retTransferCRC = 0;
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_get_pdr_resp* resp =
reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
resp->completion_code = completionCode;
resp->next_record_handle = htole32(nextRecordHndl);
resp->next_data_transfer_handle = htole32(nextDataTransferHndl);
resp->transfer_flag = transferFlag;
resp->response_count = htole16(respCnt);
memcpy(resp->record_data, recordData, respCnt);
response->payload[PLDM_GET_PDR_MIN_RESP_BYTES + respCnt] = transferCRC;
auto rc = decode_get_pdr_resp(
response, responseMsg.size() - hdrSize, &retCompletionCode,
&retNextRecordHndl, &retNextDataTransferHndl, &retTransferFlag,
&retRespCnt, retRecordData, recordDataLength, &retTransferCRC);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retCompletionCode, completionCode);
EXPECT_EQ(retNextRecordHndl, nextRecordHndl);
EXPECT_EQ(retNextDataTransferHndl, nextDataTransferHndl);
EXPECT_EQ(retTransferFlag, transferFlag);
EXPECT_EQ(retRespCnt, respCnt);
EXPECT_EQ(retTransferCRC, transferCRC);
EXPECT_EQ(0, memcmp(recordData, resp->record_data, respCnt));
}
TEST(GetPDR, testBadDecodeResponse)
{
const char* recordData = "123456789";
uint8_t completionCode = PLDM_SUCCESS;
uint32_t nextRecordHndl = 0;
uint32_t nextDataTransferHndl = 0;
uint8_t transferFlag = PLDM_END;
constexpr uint16_t respCnt = 9;
uint8_t transferCRC = 96;
size_t recordDataLength = 32;
std::array<uint8_t, hdrSize + PLDM_GET_PDR_MIN_RESP_BYTES + respCnt +
sizeof(transferCRC)>
responseMsg{};
uint8_t retCompletionCode = 0;
uint8_t retRecordData[32] = {0};
uint32_t retNextRecordHndl = 0;
uint32_t retNextDataTransferHndl = 0;
uint8_t retTransferFlag = 0;
uint16_t retRespCnt = 0;
uint8_t retTransferCRC = 0;
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_get_pdr_resp* resp =
reinterpret_cast<struct pldm_get_pdr_resp*>(response->payload);
resp->completion_code = completionCode;
resp->next_record_handle = htole32(nextRecordHndl);
resp->next_data_transfer_handle = htole32(nextDataTransferHndl);
resp->transfer_flag = transferFlag;
resp->response_count = htole16(respCnt);
memcpy(resp->record_data, recordData, respCnt);
response->payload[PLDM_GET_PDR_MIN_RESP_BYTES + respCnt] = transferCRC;
auto rc = decode_get_pdr_resp(response, responseMsg.size() - hdrSize, NULL,
NULL, NULL, NULL, NULL, NULL, 0, NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = decode_get_pdr_resp(
response, responseMsg.size() - hdrSize - 1, &retCompletionCode,
&retNextRecordHndl, &retNextDataTransferHndl, &retTransferFlag,
&retRespCnt, retRecordData, recordDataLength, &retTransferCRC);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(GetPDRRepositoryInfo, testGoodEncodeResponse)
{
uint8_t completionCode = 0;
uint8_t repositoryState = PLDM_AVAILABLE;
uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint32_t recordCount = 100;
uint32_t repositorySize = 100;
uint32_t largestRecordSize = UINT32_MAX;
uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
std::vector<uint8_t> responseMsg(hdrSize +
PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES);
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
auto rc = encode_get_pdr_repository_info_resp(
0, PLDM_SUCCESS, repositoryState, updateTime, oemUpdateTime,
recordCount, repositorySize, largestRecordSize,
dataTransferHandleTimeout, response);
EXPECT_EQ(rc, PLDM_SUCCESS);
struct pldm_pdr_repository_info_resp* resp =
reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
response->payload);
EXPECT_EQ(completionCode, resp->completion_code);
EXPECT_EQ(repositoryState, resp->repository_state);
EXPECT_EQ(0, memcmp(updateTime, resp->update_time, PLDM_TIMESTAMP104_SIZE));
EXPECT_EQ(0, memcmp(oemUpdateTime, resp->oem_update_time,
PLDM_TIMESTAMP104_SIZE));
EXPECT_EQ(recordCount, le32toh(resp->record_count));
EXPECT_EQ(repositorySize, le32toh(resp->repository_size));
EXPECT_EQ(largestRecordSize, le32toh(resp->largest_record_size));
EXPECT_EQ(dataTransferHandleTimeout, resp->data_transfer_handle_timeout);
}
TEST(GetPDRRepositoryInfo, testBadEncodeResponse)
{
uint8_t repositoryState = PLDM_AVAILABLE;
uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint32_t recordCount = 100;
uint32_t repositorySize = 100;
uint32_t largestRecordSize = UINT32_MAX;
uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
auto rc = encode_get_pdr_repository_info_resp(
0, PLDM_SUCCESS, repositoryState, updateTime, oemUpdateTime,
recordCount, repositorySize, largestRecordSize,
dataTransferHandleTimeout, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(GetPDRRepositoryInfo, testGoodDecodeResponse)
{
uint8_t completionCode = PLDM_SUCCESS;
uint8_t repositoryState = PLDM_AVAILABLE;
uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint32_t recordCount = 100;
uint32_t repositorySize = 100;
uint32_t largestRecordSize = UINT32_MAX;
uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_pdr_repository_info_resp* resp =
reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->repository_state = repositoryState;
memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
resp->record_count = htole32(recordCount);
resp->repository_size = htole32(repositorySize);
resp->largest_record_size = htole32(largestRecordSize);
resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
uint8_t retCompletionCode = 0;
uint8_t retRepositoryState = 0;
uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint32_t retRecordCount = 0;
uint32_t retRepositorySize = 0;
uint32_t retLargestRecordSize = 0;
uint8_t retDataTransferHandleTimeout = 0;
auto rc = decode_get_pdr_repository_info_resp(
response, responseMsg.size() - hdrSize, &retCompletionCode,
&retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
&retRepositorySize, &retLargestRecordSize,
&retDataTransferHandleTimeout);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completionCode, retCompletionCode);
EXPECT_EQ(repositoryState, retRepositoryState);
EXPECT_EQ(0, memcmp(updateTime, retUpdateTime, PLDM_TIMESTAMP104_SIZE));
EXPECT_EQ(0,
memcmp(oemUpdateTime, retOemUpdateTime, PLDM_TIMESTAMP104_SIZE));
EXPECT_EQ(recordCount, recordCount);
EXPECT_EQ(repositorySize, repositorySize);
EXPECT_EQ(largestRecordSize, largestRecordSize);
EXPECT_EQ(dataTransferHandleTimeout, dataTransferHandleTimeout);
}
TEST(GetPDRRepositoryInfo, testBadDecodeResponse)
{
uint8_t completionCode = PLDM_SUCCESS;
uint8_t repositoryState = PLDM_AVAILABLE;
uint8_t updateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint8_t oemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint32_t recordCount = htole32(100);
uint32_t repositorySize = htole32(100);
uint32_t largestRecordSize = htole32(UINT32_MAX);
uint8_t dataTransferHandleTimeout = PLDM_NO_TIMEOUT;
std::array<uint8_t, hdrSize + PLDM_GET_PDR_REPOSITORY_INFO_RESP_BYTES>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_pdr_repository_info_resp* resp =
reinterpret_cast<struct pldm_pdr_repository_info_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->repository_state = repositoryState;
memcpy(resp->update_time, updateTime, PLDM_TIMESTAMP104_SIZE);
memcpy(resp->oem_update_time, oemUpdateTime, PLDM_TIMESTAMP104_SIZE);
resp->record_count = recordCount;
resp->repository_size = repositorySize;
resp->largest_record_size = largestRecordSize;
resp->data_transfer_handle_timeout = dataTransferHandleTimeout;
uint8_t retCompletionCode = 0;
uint8_t retRepositoryState = 0;
uint8_t retUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint8_t retOemUpdateTime[PLDM_TIMESTAMP104_SIZE] = {0};
uint32_t retRecordCount = 0;
uint32_t retRepositorySize = 0;
uint32_t retLargestRecordSize = 0;
uint8_t retDataTransferHandleTimeout = 0;
auto rc = decode_get_pdr_repository_info_resp(
response, responseMsg.size() - hdrSize, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = decode_get_pdr_repository_info_resp(
response, responseMsg.size() - hdrSize - 1, &retCompletionCode,
&retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
&retRepositorySize, &retLargestRecordSize,
&retDataTransferHandleTimeout);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
resp->repository_state = PLDM_FAILED + 1;
rc = decode_get_pdr_repository_info_resp(
response, responseMsg.size() - hdrSize, &retCompletionCode,
&retRepositoryState, retUpdateTime, retOemUpdateTime, &retRecordCount,
&retRepositorySize, &retLargestRecordSize,
&retDataTransferHandleTimeout);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(SetNumericEffecterValue, testGoodDecodeRequest)
{
std::array<uint8_t,
hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 3>
requestMsg{};
uint16_t effecter_id = 32768;
uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT32;
uint32_t effecter_value = 123456789;
uint16_t reteffecter_id;
uint8_t reteffecter_data_size;
uint8_t reteffecter_value[4];
auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_set_numeric_effecter_value_req* request =
reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
req->payload);
request->effecter_id = htole16(effecter_id);
request->effecter_data_size = effecter_data_size;
uint32_t effecter_value_le = htole32(effecter_value);
memcpy(request->effecter_value, &effecter_value_le,
sizeof(effecter_value_le));
auto rc = decode_set_numeric_effecter_value_req(
req, requestMsg.size() - hdrSize, &reteffecter_id,
&reteffecter_data_size, reteffecter_value);
uint32_t value = *(reinterpret_cast<uint32_t*>(reteffecter_value));
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(reteffecter_id, effecter_id);
EXPECT_EQ(reteffecter_data_size, effecter_data_size);
EXPECT_EQ(value, effecter_value);
}
TEST(SetNumericEffecterValue, testBadDecodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES>
requestMsg{};
auto rc = decode_set_numeric_effecter_value_req(
NULL, requestMsg.size() - hdrSize, NULL, NULL, NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
uint16_t effecter_id = 0x10;
uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT8;
uint8_t effecter_value = 1;
uint16_t reteffecter_id;
uint8_t reteffecter_data_size;
uint8_t reteffecter_value[4];
auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_set_numeric_effecter_value_req* request =
reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
req->payload);
request->effecter_id = effecter_id;
request->effecter_data_size = effecter_data_size;
memcpy(request->effecter_value, &effecter_value, sizeof(effecter_value));
rc = decode_set_numeric_effecter_value_req(
req, requestMsg.size() - hdrSize - 1, &reteffecter_id,
&reteffecter_data_size, reinterpret_cast<uint8_t*>(&reteffecter_value));
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(SetNumericEffecterValue, testGoodEncodeRequest)
{
uint16_t effecter_id = 0;
uint8_t effecter_data_size = PLDM_EFFECTER_DATA_SIZE_UINT16;
uint16_t effecter_value = 65534;
std::vector<uint8_t> requestMsg(
hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_set_numeric_effecter_value_req(
0, effecter_id, effecter_data_size,
reinterpret_cast<uint8_t*>(&effecter_value), request,
PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES + 1);
EXPECT_EQ(rc, PLDM_SUCCESS);
struct pldm_set_numeric_effecter_value_req* req =
reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
request->payload);
EXPECT_EQ(effecter_id, req->effecter_id);
EXPECT_EQ(effecter_data_size, req->effecter_data_size);
uint16_t* val = (uint16_t*)req->effecter_value;
*val = le16toh(*val);
EXPECT_EQ(effecter_value, *val);
}
TEST(SetNumericEffecterValue, testBadEncodeRequest)
{
std::vector<uint8_t> requestMsg(
hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_set_numeric_effecter_value_req(
0, 0, 0, NULL, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
uint16_t effecter_value;
rc = encode_set_numeric_effecter_value_req(
0, 0, 6, reinterpret_cast<uint8_t*>(&effecter_value), request,
PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(SetNumericEffecterValue, testGoodDecodeResponse)
{
std::array<uint8_t, hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
responseMsg{};
uint8_t completion_code = 0xA0;
uint8_t retcompletion_code;
memcpy(responseMsg.data() + hdrSize, &completion_code,
sizeof(completion_code));
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
auto rc = decode_set_numeric_effecter_value_resp(
response, responseMsg.size() - hdrSize, &retcompletion_code);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completion_code, retcompletion_code);
}
TEST(SetNumericEffecterValue, testBadDecodeResponse)
{
std::array<uint8_t, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
auto rc = decode_set_numeric_effecter_value_resp(response,
responseMsg.size(), NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(SetNumericEffecterValue, testGoodEncodeResponse)
{
std::array<uint8_t, sizeof(pldm_msg_hdr) +
PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
uint8_t completionCode = 0;
auto rc = encode_set_numeric_effecter_value_resp(
0, PLDM_SUCCESS, response, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completionCode, response->payload[0]);
}
TEST(SetNumericEffecterValue, testBadEncodeResponse)
{
auto rc = encode_set_numeric_effecter_value_resp(
0, PLDM_SUCCESS, NULL, PLDM_SET_NUMERIC_EFFECTER_VALUE_RESP_BYTES);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(GetStateSensorReadings, testGoodEncodeResponse)
{
std::array<uint8_t, hdrSize +
PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
sizeof(get_sensor_state_field) * 2>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
uint8_t completionCode = 0;
uint8_t comp_sensorCnt = 0x2;
std::array<get_sensor_state_field, 2> stateField{};
stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_NORMAL,
PLDM_SENSOR_WARNING, PLDM_SENSOR_UNKNOWN};
stateField[1] = {PLDM_SENSOR_FAILED, PLDM_SENSOR_UPPERFATAL,
PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_FATAL};
auto rc = encode_get_state_sensor_readings_resp(
0, PLDM_SUCCESS, comp_sensorCnt, stateField.data(), response);
struct pldm_get_state_sensor_readings_resp* resp =
reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
response->payload);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completionCode, resp->completion_code);
EXPECT_EQ(comp_sensorCnt, resp->comp_sensor_count);
EXPECT_EQ(stateField[0].sensor_op_state, resp->field->sensor_op_state);
EXPECT_EQ(stateField[0].present_state, resp->field->present_state);
EXPECT_EQ(stateField[0].previous_state, resp->field->previous_state);
EXPECT_EQ(stateField[0].event_state, resp->field->event_state);
EXPECT_EQ(stateField[1].sensor_op_state, resp->field[1].sensor_op_state);
EXPECT_EQ(stateField[1].present_state, resp->field[1].present_state);
EXPECT_EQ(stateField[1].previous_state, resp->field[1].previous_state);
EXPECT_EQ(stateField[1].event_state, resp->field[1].event_state);
}
TEST(GetStateSensorReadings, testBadEncodeResponse)
{
auto rc = encode_get_state_sensor_readings_resp(0, PLDM_SUCCESS, 0, nullptr,
nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(GetStateSensorReadings, testGoodDecodeResponse)
{
std::array<uint8_t, hdrSize +
PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
sizeof(get_sensor_state_field) * 2>
responseMsg{};
uint8_t completionCode = 0;
uint8_t comp_sensorCnt = 2;
std::array<get_sensor_state_field, 2> stateField{};
stateField[0] = {PLDM_SENSOR_DISABLED, PLDM_SENSOR_UNKNOWN,
PLDM_SENSOR_UNKNOWN, PLDM_SENSOR_UNKNOWN};
stateField[1] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_LOWERFATAL,
PLDM_SENSOR_LOWERCRITICAL, PLDM_SENSOR_WARNING};
uint8_t retcompletion_code = 0;
uint8_t retcomp_sensorCnt = 0;
std::array<get_sensor_state_field, 2> retstateField{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_get_state_sensor_readings_resp* resp =
reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->comp_sensor_count = comp_sensorCnt;
memcpy(resp->field, &stateField,
(sizeof(get_sensor_state_field) * comp_sensorCnt));
auto rc = decode_get_state_sensor_readings_resp(
response, responseMsg.size() - hdrSize, &retcompletion_code,
&retcomp_sensorCnt, retstateField.data());
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completionCode, retcompletion_code);
EXPECT_EQ(comp_sensorCnt, retcomp_sensorCnt);
EXPECT_EQ(stateField[0].sensor_op_state, retstateField[0].sensor_op_state);
EXPECT_EQ(stateField[0].present_state, retstateField[0].present_state);
EXPECT_EQ(stateField[0].previous_state, retstateField[0].previous_state);
EXPECT_EQ(stateField[0].event_state, retstateField[0].event_state);
EXPECT_EQ(stateField[1].sensor_op_state, retstateField[1].sensor_op_state);
EXPECT_EQ(stateField[1].present_state, retstateField[1].present_state);
EXPECT_EQ(stateField[1].previous_state, retstateField[1].previous_state);
EXPECT_EQ(stateField[1].event_state, retstateField[1].event_state);
}
TEST(GetStateSensorReadings, testBadDecodeResponse)
{
std::array<uint8_t, hdrSize +
PLDM_GET_STATE_SENSOR_READINGS_MIN_RESP_BYTES +
sizeof(get_sensor_state_field) * 2>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
auto rc = decode_get_state_sensor_readings_resp(
response, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
uint8_t completionCode = 0;
uint8_t comp_sensorCnt = 1;
std::array<get_sensor_state_field, 1> stateField{};
stateField[0] = {PLDM_SENSOR_ENABLED, PLDM_SENSOR_UPPERFATAL,
PLDM_SENSOR_UPPERCRITICAL, PLDM_SENSOR_WARNING};
uint8_t retcompletion_code = 0;
uint8_t retcomp_sensorCnt = 0;
std::array<get_sensor_state_field, 1> retstateField{};
struct pldm_get_state_sensor_readings_resp* resp =
reinterpret_cast<struct pldm_get_state_sensor_readings_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->comp_sensor_count = comp_sensorCnt;
memcpy(resp->field, &stateField,
(sizeof(get_sensor_state_field) * comp_sensorCnt));
rc = decode_get_state_sensor_readings_resp(
response, responseMsg.size() - hdrSize + 1, &retcompletion_code,
&retcomp_sensorCnt, retstateField.data());
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(GetStateSensorReadings, testGoodEncodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
requestMsg{};
uint16_t sensorId = 0xAB;
bitfield8_t sensorRearm;
sensorRearm.byte = 0x03;
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_get_state_sensor_readings_req(0, sensorId, sensorRearm, 0,
request);
struct pldm_get_state_sensor_readings_req* req =
reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
request->payload);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(sensorId, le16toh(req->sensor_id));
EXPECT_EQ(sensorRearm.byte, req->sensor_rearm.byte);
}
TEST(GetStateSensorReadings, testBadEncodeRequest)
{
bitfield8_t sensorRearm;
sensorRearm.byte = 0x0;
auto rc =
encode_get_state_sensor_readings_req(0, 0, sensorRearm, 0, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(GetStateSensorReadings, testGoodDecodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
requestMsg{};
uint16_t sensorId = 0xCD;
bitfield8_t sensorRearm;
sensorRearm.byte = 0x10;
uint16_t retsensorId;
bitfield8_t retsensorRearm;
uint8_t retreserved;
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_get_state_sensor_readings_req* req =
reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
request->payload);
req->sensor_id = htole16(sensorId);
req->sensor_rearm.byte = sensorRearm.byte;
auto rc = decode_get_state_sensor_readings_req(
request, requestMsg.size() - hdrSize, &retsensorId, &retsensorRearm,
&retreserved);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(sensorId, retsensorId);
EXPECT_EQ(sensorRearm.byte, retsensorRearm.byte);
EXPECT_EQ(0, retreserved);
}
TEST(GetStateSensorReadings, testBadDecodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_GET_STATE_SENSOR_READINGS_REQ_BYTES>
requestMsg{};
auto rc = decode_get_state_sensor_readings_req(
nullptr, requestMsg.size() - hdrSize, nullptr, nullptr, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
uint16_t sensorId = 0x11;
bitfield8_t sensorRearm;
sensorRearm.byte = 0x04;
uint16_t retsensorId;
bitfield8_t retsensorRearm;
uint8_t retreserved;
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_get_state_sensor_readings_req* req =
reinterpret_cast<struct pldm_get_state_sensor_readings_req*>(
request->payload);
req->sensor_id = htole16(sensorId);
req->sensor_rearm.byte = sensorRearm.byte;
rc = decode_get_state_sensor_readings_req(
request, requestMsg.size() - hdrSize - 1, &retsensorId, &retsensorRearm,
&retreserved);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeRequest)
{
uint8_t eventBufferSize = 32;
std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_REQ_BYTES>
requestMsg{};
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_event_message_buffer_size_req(0, eventBufferSize, request);
EXPECT_EQ(rc, PLDM_SUCCESS);
}
TEST(EventMessageBufferSize, testGoodEventMessageBufferSizeResponse)
{
uint8_t completionCode = PLDM_SUCCESS;
uint16_t terminusMaxBufferSize = 256;
std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
responseMsg{};
uint8_t retCompletionCode;
uint16_t retMaxBufferSize = 0;
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_event_message_buffer_size_resp* resp =
reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->terminus_max_buffer_size = terminusMaxBufferSize;
auto rc = decode_event_message_buffer_size_resp(
response, responseMsg.size() - hdrSize, &retCompletionCode,
&retMaxBufferSize);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retCompletionCode, completionCode);
EXPECT_EQ(terminusMaxBufferSize, retMaxBufferSize);
}
TEST(EventMessageBufferSize, testBadEventMessageBufferSizeResponse)
{
uint8_t completionCode = PLDM_SUCCESS;
uint16_t terminusMaxBufferSize = 256;
std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_BUFFER_SIZE_RESP_BYTES>
responseMsg{};
uint8_t retCompletionCode;
uint16_t retMaxBufferSize = 0;
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_event_message_buffer_size_resp* resp =
reinterpret_cast<struct pldm_event_message_buffer_size_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->terminus_max_buffer_size = terminusMaxBufferSize;
auto rc =
decode_event_message_buffer_size_resp(response, 0, nullptr, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = decode_event_message_buffer_size_resp(
response, responseMsg.size(), &retCompletionCode, &retMaxBufferSize);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(PlatformEventMessageSupported, testGoodEncodeRequest)
{
uint8_t formatVersion = 0x01;
std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_REQ_BYTES>
requestMsg{};
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_event_message_supported_req(0, formatVersion, request);
struct pldm_event_message_supported_req* req =
reinterpret_cast<struct pldm_event_message_supported_req*>(
request->payload);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(formatVersion, req->format_version);
}
TEST(PlatformEventMessageSupported, testBadEncodeRequest)
{
uint8_t eventData = 34;
uint8_t formatVersion = 0x0;
std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_REQ_BYTES +
sizeof(eventData)>
requestMsg{};
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_event_message_supported_req(0, formatVersion, request);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = encode_event_message_supported_req(0, formatVersion, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(PlatformEventMessageSupported, testGoodDecodeRespond)
{
uint8_t completionCode = PLDM_SUCCESS;
uint8_t synchConfiguration = PLDM_MESSAGE_TYPE_SYNCHRONOUS;
bitfield8_t synchConfigSupported;
synchConfigSupported.byte = 0xe;
uint8_t numberEventClassReturned = 0x3;
std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
constexpr uint8_t eventClassCount = 3;
std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
eventClassCount>
responseMsg{};
uint8_t retCompletionCode;
uint8_t retSynchConfig = 0;
uint8_t retNumberEventClass = 0;
bitfield8_t retSynchConfigSupport;
uint8_t retEventClass[eventClassCount] = {0};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_event_message_supported_resp* resp =
reinterpret_cast<struct pldm_event_message_supported_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->synchrony_configuration = synchConfiguration;
resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
resp->number_event_class_returned = numberEventClassReturned;
memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
auto rc = decode_event_message_supported_resp(
response, responseMsg.size() - hdrSize, &retCompletionCode,
&retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
retEventClass, eventClassCount);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retCompletionCode, completionCode);
EXPECT_EQ(retSynchConfig, synchConfiguration);
EXPECT_EQ(retNumberEventClass, numberEventClassReturned);
EXPECT_EQ(retSynchConfigSupport.byte, synchConfigSupported.byte);
EXPECT_EQ(0, memcmp(eventClass.data(), resp->event_class,
numberEventClassReturned));
}
TEST(PlatformEventMessageSupported, testBadSynchConfiguration)
{
uint8_t completionCode = PLDM_SUCCESS;
uint8_t synchConfiguration = 0x4;
bitfield8_t synchConfigSupported;
synchConfigSupported.byte = 0xe;
uint8_t numberEventClassReturned = 0x3;
std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
constexpr uint8_t eventClassCount = 3;
std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
eventClassCount>
responseMsg{};
uint8_t retCompletionCode;
uint8_t retSynchConfig = 0;
uint8_t retNumberEventClass = 0;
bitfield8_t retSynchConfigSupport;
uint8_t retEventClass[eventClassCount] = {0};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_event_message_supported_resp* resp =
reinterpret_cast<struct pldm_event_message_supported_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->synchrony_configuration = synchConfiguration;
resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
resp->number_event_class_returned = numberEventClassReturned;
memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
auto rc = decode_event_message_supported_resp(
response, responseMsg.size() - hdrSize, &retCompletionCode,
&retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
retEventClass, eventClassCount);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(PlatformEventMessageSupported, testBadDecodeRespond)
{
uint8_t completionCode = PLDM_SUCCESS;
uint8_t synchConfiguration = PLDM_MESSAGE_TYPE_SYNCHRONOUS;
bitfield8_t synchConfigSupported;
synchConfigSupported.byte = 0xe;
uint8_t numberEventClassReturned = 0x3;
std::vector<uint8_t> eventClass{0x0, 0x5, 0xfa};
constexpr uint8_t eventClassCount = 3;
std::array<uint8_t, hdrSize + PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES +
eventClassCount>
responseMsg{};
uint8_t retCompletionCode;
uint8_t retSynchConfig = 0;
uint8_t retNumberEventClass = 0;
bitfield8_t retSynchConfigSupport;
uint8_t retEventClass[eventClassCount] = {0};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_event_message_supported_resp* resp =
reinterpret_cast<struct pldm_event_message_supported_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->synchrony_configuration = synchConfiguration;
resp->synchrony_configuration_supported.byte = synchConfigSupported.byte;
resp->number_event_class_returned = numberEventClassReturned;
memcpy(resp->event_class, eventClass.data(), numberEventClassReturned);
auto rc = decode_event_message_supported_resp(response, 0, nullptr, nullptr,
nullptr, nullptr, nullptr, 0);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = decode_event_message_supported_resp(
response, PLDM_EVENT_MESSAGE_SUPPORTED_MIN_RESP_BYTES - 1,
&retCompletionCode, &retSynchConfig, &retSynchConfigSupport,
&retNumberEventClass, retEventClass, eventClassCount);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
rc = decode_event_message_supported_resp(
response, responseMsg.size() - hdrSize, &retCompletionCode,
&retSynchConfig, &retSynchConfigSupport, &retNumberEventClass,
retEventClass, 1);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(PlatformEventMessage, testGoodStateSensorDecodeRequest)
{
std::array<uint8_t,
hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES>
requestMsg{};
uint8_t retFormatVersion = 0;
uint8_t retTid = 0;
uint8_t retEventClass = 0;
size_t retEventDataOffset = 0;
auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_platform_event_message_req* request =
reinterpret_cast<struct pldm_platform_event_message_req*>(req->payload);
uint8_t formatVersion = 0x01;
uint8_t tid = 0x02;
// Sensor Event
uint8_t eventClass = 0x00;
request->format_version = formatVersion;
request->tid = tid;
request->event_class = eventClass;
size_t eventDataOffset =
sizeof(formatVersion) + sizeof(tid) + sizeof(eventClass);
auto rc = decode_platform_event_message_req(
req, requestMsg.size() - hdrSize, &retFormatVersion, &retTid,
&retEventClass, &retEventDataOffset);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retFormatVersion, formatVersion);
EXPECT_EQ(retTid, tid);
EXPECT_EQ(retEventClass, eventClass);
EXPECT_EQ(retEventDataOffset, eventDataOffset);
}
TEST(PlatformEventMessage, testBadDecodeRequest)
{
const struct pldm_msg* msg = NULL;
std::array<uint8_t,
hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
requestMsg{};
auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
uint8_t retFormatVersion;
uint8_t retTid = 0;
uint8_t retEventClass = 0;
size_t retEventDataOffset;
auto rc = decode_platform_event_message_req(msg, sizeof(*msg), NULL, NULL,
NULL, NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = decode_platform_event_message_req(
req,
requestMsg.size() - hdrSize -
PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES,
&retFormatVersion, &retTid, &retEventClass, &retEventDataOffset);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(PlatformEventMessage, testGoodEncodeResponse)
{
std::array<uint8_t,
hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
PLDM_PLATFORM_EVENT_MESSAGE_STATE_SENSOR_STATE_REQ_BYTES - 1>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
uint8_t completionCode = 0;
uint8_t instanceId = 0x01;
uint8_t platformEventStatus = 0x01;
auto rc = encode_platform_event_message_resp(instanceId, PLDM_SUCCESS,
platformEventStatus, response);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completionCode, response->payload[0]);
EXPECT_EQ(platformEventStatus, response->payload[1]);
}
TEST(PlatformEventMessage, testBadEncodeResponse)
{
auto rc = encode_platform_event_message_resp(0, PLDM_SUCCESS, 1, NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(PlatformEventMessage, testGoodEncodeRequest)
{
uint8_t formatVersion = 0x01;
uint8_t Tid = 0x03;
uint8_t eventClass = 0x00;
uint8_t eventData = 34;
std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
sizeof(eventData)>
requestMsg{};
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_platform_event_message_req(
0, formatVersion, Tid, eventClass,
reinterpret_cast<uint8_t*>(&eventData), sizeof(eventData), request,
sizeof(eventData) + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES);
struct pldm_platform_event_message_req* req =
reinterpret_cast<struct pldm_platform_event_message_req*>(
request->payload);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(formatVersion, req->format_version);
EXPECT_EQ(Tid, req->tid);
EXPECT_EQ(eventClass, req->event_class);
EXPECT_EQ(0, memcmp(&eventData, req->event_data, sizeof(eventData)));
}
TEST(PlatformEventMessage, testBadEncodeRequest)
{
uint8_t Tid = 0x03;
uint8_t eventClass = 0x00;
uint8_t eventData = 34;
size_t sz_eventData = sizeof(eventData);
size_t payloadLen =
sz_eventData + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES;
uint8_t formatVersion = 0x01;
std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES +
sizeof(eventData)>
requestMsg{};
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_platform_event_message_req(
0, formatVersion, Tid, eventClass,
reinterpret_cast<uint8_t*>(&eventData), sz_eventData, nullptr,
payloadLen);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = encode_platform_event_message_req(
0, 0, Tid, eventClass, reinterpret_cast<uint8_t*>(&eventData),
sz_eventData, request, payloadLen);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = encode_platform_event_message_req(0, formatVersion, Tid, eventClass,
nullptr, 0, request, payloadLen);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = encode_platform_event_message_req(
0, formatVersion, Tid, eventClass,
reinterpret_cast<uint8_t*>(&eventData), sz_eventData, request, 0);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(PlatformEventMessage, testGoodDecodeResponse)
{
std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
responseMsg{};
uint8_t completionCode = PLDM_SUCCESS;
uint8_t platformEventStatus = 0x01;
uint8_t retcompletionCode;
uint8_t retplatformEventStatus;
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_platform_event_message_resp* resp =
reinterpret_cast<struct pldm_platform_event_message_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->platform_event_status = platformEventStatus;
auto rc = decode_platform_event_message_resp(
response, responseMsg.size() - hdrSize, &retcompletionCode,
&retplatformEventStatus);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completionCode, retcompletionCode);
EXPECT_EQ(platformEventStatus, retplatformEventStatus);
}
TEST(PlatformEventMessage, testBadDecodeResponse)
{
std::array<uint8_t, hdrSize + PLDM_PLATFORM_EVENT_MESSAGE_RESP_BYTES>
responseMsg{};
uint8_t completionCode = PLDM_SUCCESS;
uint8_t platformEventStatus = 0x01;
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_platform_event_message_resp* resp =
reinterpret_cast<struct pldm_platform_event_message_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->platform_event_status = platformEventStatus;
auto rc = decode_platform_event_message_resp(
nullptr, responseMsg.size() - hdrSize, nullptr, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = decode_platform_event_message_resp(
response, responseMsg.size() - hdrSize - 1, &completionCode,
&platformEventStatus);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(PlatformEventMessage, testGoodSensorEventDataDecodeRequest)
{
std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH +
PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
eventDataArr{};
uint16_t sensorId = 0x1234;
uint8_t sensorEventClassType = PLDM_SENSOR_OP_STATE;
struct pldm_sensor_event_data* eventData =
(struct pldm_sensor_event_data*)eventDataArr.data();
eventData->sensor_id = sensorId;
eventData->sensor_event_class_type = sensorEventClassType;
size_t retSensorOpDataOffset;
uint16_t retSensorId = 0;
uint8_t retSensorEventClassType;
size_t sensorOpDataOffset = sizeof(sensorId) + sizeof(sensorEventClassType);
auto rc = decode_sensor_event_data(
reinterpret_cast<uint8_t*>(eventData), eventDataArr.size(),
&retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retSensorId, sensorId);
EXPECT_EQ(retSensorEventClassType, sensorEventClassType);
EXPECT_EQ(retSensorOpDataOffset, sensorOpDataOffset);
}
TEST(PlatformEventMessage, testBadSensorEventDataDecodeRequest)
{
std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH +
PLDM_PLATFORM_EVENT_MESSAGE_MIN_REQ_BYTES>
eventDataArr{};
struct pldm_sensor_event_data* eventData =
(struct pldm_sensor_event_data*)eventDataArr.data();
size_t retSensorOpDataOffset;
uint16_t retSensorId = 0;
uint8_t retSensorEventClassType;
auto rc = decode_sensor_event_data(NULL, eventDataArr.size(), &retSensorId,
&retSensorEventClassType,
&retSensorOpDataOffset);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = decode_sensor_event_data(
reinterpret_cast<uint8_t*>(eventDataArr.data()),
eventDataArr.size() -
PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH,
&retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
eventData->sensor_event_class_type = PLDM_SENSOR_OP_STATE;
rc = decode_sensor_event_data(
reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
&retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
eventData->sensor_event_class_type = PLDM_STATE_SENSOR_STATE;
rc = decode_sensor_event_data(
reinterpret_cast<uint8_t*>(eventDataArr.data()), eventDataArr.size(),
&retSensorId, &retSensorEventClassType, &retSensorOpDataOffset);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
eventData->sensor_event_class_type = PLDM_NUMERIC_SENSOR_STATE;
rc = decode_sensor_event_data(
reinterpret_cast<uint8_t*>(eventDataArr.data()),
eventDataArr.size() + 1, &retSensorId, &retSensorEventClassType,
&retSensorOpDataOffset);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(PlatformEventMessage, testGoodSensorOpEventDataDecodeRequest)
{
std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
eventDataArr{};
struct pldm_sensor_event_sensor_op_state* sensorData =
(struct pldm_sensor_event_sensor_op_state*)eventDataArr.data();
uint8_t presentState = PLDM_SENSOR_ENABLED;
uint8_t previousState = PLDM_SENSOR_INITIALIZING;
sensorData->present_op_state = presentState;
sensorData->previous_op_state = previousState;
uint8_t retPresentState;
uint8_t retPreviousState;
auto rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData),
eventDataArr.size(), &retPresentState,
&retPreviousState);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retPresentState, presentState);
EXPECT_EQ(retPreviousState, previousState);
}
TEST(PlatformEventMessage, testBadSensorOpEventDataDecodeRequest)
{
uint8_t presentOpState;
uint8_t previousOpState;
size_t sensorDataLength = PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH;
auto rc = decode_sensor_op_data(NULL, sensorDataLength, &presentOpState,
&previousOpState);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
std::array<uint8_t, PLDM_SENSOR_EVENT_SENSOR_OP_STATE_DATA_LENGTH>
sensorData{};
rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
sensorDataLength + 1, &presentOpState,
&previousOpState);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
rc = decode_sensor_op_data(reinterpret_cast<uint8_t*>(sensorData.data()),
sensorDataLength, nullptr, &previousOpState);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(PlatformEventMessage, testGoodSensorStateEventDataDecodeRequest)
{
std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
eventDataArr{};
struct pldm_sensor_event_state_sensor_state* sensorData =
(struct pldm_sensor_event_state_sensor_state*)eventDataArr.data();
uint8_t sensorOffset = 0x02;
uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
uint8_t previousEventState = PLDM_SENSOR_INTEST;
sensorData->sensor_offset = sensorOffset;
sensorData->event_state = eventState;
sensorData->previous_event_state = previousEventState;
uint8_t retSensorOffset;
uint8_t retEventState;
uint8_t retPreviousState;
auto rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
eventDataArr.size(), &retSensorOffset,
&retEventState, &retPreviousState);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retSensorOffset, sensorOffset);
EXPECT_EQ(retEventState, eventState);
EXPECT_EQ(retPreviousState, previousEventState);
}
TEST(PlatformEventMessage, testBadStateSensorEventDataDecodeRequest)
{
uint8_t sensorOffset;
uint8_t eventState;
uint8_t previousEventState;
size_t sensorDataLength = PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH;
auto rc = decode_state_sensor_data(NULL, sensorDataLength, &sensorOffset,
&eventState, &previousEventState);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
std::array<uint8_t, PLDM_SENSOR_EVENT_STATE_SENSOR_STATE_DATA_LENGTH>
sensorData{};
rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
sensorDataLength - 1, &sensorOffset,
&eventState, &previousEventState);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
rc = decode_state_sensor_data(reinterpret_cast<uint8_t*>(sensorData.data()),
sensorDataLength, &sensorOffset, nullptr,
&previousEventState);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(PlatformEventMessage, testGoodNumericSensorEventDataDecodeRequest)
{
std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
eventDataArr{};
struct pldm_sensor_event_numeric_sensor_state* sensorData =
(struct pldm_sensor_event_numeric_sensor_state*)eventDataArr.data();
size_t sensorDataLength =
PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_32BIT_DATA_LENGTH;
uint8_t eventState = PLDM_SENSOR_SHUTTINGDOWN;
uint8_t previousEventState = PLDM_SENSOR_INTEST;
uint8_t sensorDataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
uint32_t presentReading = 305441741;
sensorData->event_state = eventState;
sensorData->previous_event_state = previousEventState;
sensorData->sensor_data_size = sensorDataSize;
sensorData->present_reading[3] =
static_cast<uint8_t>(htole32(presentReading) & (0x000000ff));
sensorData->present_reading[2] =
static_cast<uint8_t>((htole32(presentReading) & (0x0000ff00)) >> 8);
sensorData->present_reading[1] =
static_cast<uint8_t>((htole32(presentReading) & (0x00ff0000)) >> 16);
sensorData->present_reading[0] =
static_cast<uint8_t>((htole32(presentReading) & (0xff000000)) >> 24);
uint8_t retEventState;
uint8_t retPreviousEventState;
uint8_t retSensorDataSize;
uint32_t retPresentReading;
auto rc = decode_numeric_sensor_data(
reinterpret_cast<uint8_t*>(sensorData), sensorDataLength,
&retEventState, &retPreviousEventState, &retSensorDataSize,
&retPresentReading);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retEventState, eventState);
EXPECT_EQ(retPreviousEventState, previousEventState);
EXPECT_EQ(retSensorDataSize, sensorDataSize);
EXPECT_EQ(retPresentReading, presentReading);
int16_t presentReadingNew = -31432;
sensorData->present_reading[1] =
static_cast<uint8_t>(htole16(presentReadingNew) & (0x000000ff));
sensorData->present_reading[0] =
static_cast<uint8_t>((htole16(presentReadingNew) & (0x0000ff00)) >> 8);
sensorDataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
sensorData->sensor_data_size = sensorDataSize;
sensorDataLength = PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_16BIT_DATA_LENGTH;
rc = decode_numeric_sensor_data(reinterpret_cast<uint8_t*>(sensorData),
sensorDataLength, &retEventState,
&retPreviousEventState, &retSensorDataSize,
&retPresentReading);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retEventState, eventState);
EXPECT_EQ(retPreviousEventState, previousEventState);
EXPECT_EQ(retSensorDataSize, sensorDataSize);
EXPECT_EQ(static_cast<int16_t>(retPresentReading), presentReadingNew);
}
TEST(PlatformEventMessage, testBadNumericSensorEventDataDecodeRequest)
{
uint8_t eventState;
uint8_t previousEventState;
uint8_t sensorDataSize;
uint32_t presentReading;
size_t sensorDataLength =
PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH;
auto rc = decode_numeric_sensor_data(NULL, sensorDataLength, &eventState,
&previousEventState, &sensorDataSize,
&presentReading);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
std::array<uint8_t, PLDM_SENSOR_EVENT_NUMERIC_SENSOR_STATE_MAX_DATA_LENGTH>
sensorData{};
rc = decode_numeric_sensor_data(
reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength - 1,
&eventState, &previousEventState, &sensorDataSize, &presentReading);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
struct pldm_sensor_event_numeric_sensor_state* numericSensorData =
(struct pldm_sensor_event_numeric_sensor_state*)sensorData.data();
numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT8;
rc = decode_numeric_sensor_data(
reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
&eventState, &previousEventState, &sensorDataSize, &presentReading);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT16;
rc = decode_numeric_sensor_data(
reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength,
&eventState, &previousEventState, &sensorDataSize, &presentReading);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
numericSensorData->sensor_data_size = PLDM_SENSOR_DATA_SIZE_UINT32;
rc = decode_numeric_sensor_data(
reinterpret_cast<uint8_t*>(sensorData.data()), sensorDataLength - 1,
&eventState, &previousEventState, &sensorDataSize, &presentReading);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(GetNumericEffecterValue, testGoodEncodeRequest)
{
std::vector<uint8_t> requestMsg(hdrSize +
PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES);
uint16_t effecter_id = 0xAB01;
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_get_numeric_effecter_value_req(0, effecter_id, request);
struct pldm_get_numeric_effecter_value_req* req =
reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
request->payload);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(effecter_id, le16toh(req->effecter_id));
}
TEST(GetNumericEffecterValue, testBadEncodeRequest)
{
std::vector<uint8_t> requestMsg(
hdrSize + PLDM_SET_NUMERIC_EFFECTER_VALUE_MIN_REQ_BYTES);
auto rc = encode_get_numeric_effecter_value_req(0, 0, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(GetNumericEffecterValue, testGoodDecodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
requestMsg{};
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_get_numeric_effecter_value_req* req =
reinterpret_cast<struct pldm_get_numeric_effecter_value_req*>(
request->payload);
uint16_t effecter_id = 0x12AB;
req->effecter_id = htole16(effecter_id);
uint16_t reteffecter_id;
auto rc = decode_get_numeric_effecter_value_req(
request, requestMsg.size() - hdrSize, &reteffecter_id);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(effecter_id, reteffecter_id);
}
TEST(GetNumericEffecterValue, testBadDecodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_REQ_BYTES>
requestMsg{};
auto rc = decode_get_numeric_effecter_value_req(
nullptr, requestMsg.size() - hdrSize, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_set_numeric_effecter_value_req* req =
reinterpret_cast<struct pldm_set_numeric_effecter_value_req*>(
request->payload);
uint16_t effecter_id = 0x1A;
req->effecter_id = htole16(effecter_id);
uint16_t reteffecter_id;
rc = decode_get_numeric_effecter_value_req(
request, requestMsg.size() - hdrSize - 1, &reteffecter_id);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(GetNumericEffecterValue, testGoodEncodeResponse)
{
uint8_t completionCode = 0;
uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
uint32_t pendingValue = 0x12345678;
uint32_t presentValue = 0xABCDEF11;
uint32_t val_pending;
uint32_t val_present;
std::array<uint8_t,
hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
auto rc = encode_get_numeric_effecter_value_resp(
0, completionCode, effecter_dataSize, effecter_operState,
reinterpret_cast<uint8_t*>(&pendingValue),
reinterpret_cast<uint8_t*>(&presentValue), response,
responseMsg.size() - hdrSize);
struct pldm_get_numeric_effecter_value_resp* resp =
reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
response->payload);
memcpy(&val_pending, &resp->pending_and_present_values[0],
sizeof(val_pending));
val_pending = le32toh(val_pending);
memcpy(&val_present, &resp->pending_and_present_values[4],
sizeof(val_present));
val_present = le32toh(val_present);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(effecter_dataSize, resp->effecter_data_size);
EXPECT_EQ(effecter_operState, resp->effecter_oper_state);
EXPECT_EQ(pendingValue, val_pending);
EXPECT_EQ(presentValue, val_present);
}
TEST(GetNumericEffecterValue, testBadEncodeResponse)
{
std::array<uint8_t,
hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
uint8_t pendingValue = 0x01;
uint8_t presentValue = 0x02;
auto rc = encode_get_numeric_effecter_value_resp(
0, PLDM_SUCCESS, 0, 0, nullptr, nullptr, nullptr,
responseMsg.size() - hdrSize);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = encode_get_numeric_effecter_value_resp(
0, PLDM_SUCCESS, 6, 9, reinterpret_cast<uint8_t*>(&pendingValue),
reinterpret_cast<uint8_t*>(&presentValue), response,
responseMsg.size() - hdrSize);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
uint8_t effecter_operState = EFFECTER_OPER_STATE_FAILED;
rc = encode_get_numeric_effecter_value_resp(
0, PLDM_SUCCESS, effecter_dataSize, effecter_operState,
reinterpret_cast<uint8_t*>(&pendingValue),
reinterpret_cast<uint8_t*>(&presentValue), response,
responseMsg.size() - hdrSize);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(GetNumericEffecterValue, testGoodDecodeResponse)
{
std::array<uint8_t,
hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 2>
responseMsg{};
uint8_t completionCode = 0;
uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT16;
uint8_t effecter_operState = EFFECTER_OPER_STATE_ENABLED_NOUPDATEPENDING;
uint16_t pendingValue = 0x4321;
uint16_t presentValue = 0xDCBA;
uint8_t retcompletionCode;
uint8_t reteffecter_dataSize;
uint8_t reteffecter_operState;
uint8_t retpendingValue[2];
uint8_t retpresentValue[2];
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_get_numeric_effecter_value_resp* resp =
reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->effecter_data_size = effecter_dataSize;
resp->effecter_oper_state = effecter_operState;
uint16_t pendingValue_le = htole16(pendingValue);
memcpy(resp->pending_and_present_values, &pendingValue_le,
sizeof(pendingValue_le));
uint16_t presentValue_le = htole16(presentValue);
memcpy(&resp->pending_and_present_values[2], &presentValue_le,
sizeof(presentValue_le));
auto rc = decode_get_numeric_effecter_value_resp(
response, responseMsg.size() - hdrSize, &retcompletionCode,
&reteffecter_dataSize, &reteffecter_operState, retpendingValue,
retpresentValue);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completionCode, retcompletionCode);
EXPECT_EQ(effecter_dataSize, reteffecter_dataSize);
EXPECT_EQ(effecter_operState, reteffecter_operState);
EXPECT_EQ(pendingValue, *(reinterpret_cast<uint16_t*>(retpendingValue)));
EXPECT_EQ(presentValue, *(reinterpret_cast<uint16_t*>(retpresentValue)));
}
TEST(GetNumericEffecterValue, testBadDecodeResponse)
{
std::array<uint8_t,
hdrSize + PLDM_GET_NUMERIC_EFFECTER_VALUE_MIN_RESP_BYTES + 6>
responseMsg{};
auto rc = decode_get_numeric_effecter_value_resp(
nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
nullptr, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
uint8_t completionCode = 0;
uint8_t effecter_dataSize = PLDM_EFFECTER_DATA_SIZE_SINT16;
uint8_t effecter_operState = EFFECTER_OPER_STATE_DISABLED;
uint16_t pendingValue = 0x5678;
uint16_t presentValue = 0xCDEF;
uint8_t retcompletionCode;
uint8_t reteffecter_dataSize;
uint8_t reteffecter_operState;
uint8_t retpendingValue[2];
uint8_t retpresentValue[2];
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_get_numeric_effecter_value_resp* resp =
reinterpret_cast<struct pldm_get_numeric_effecter_value_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->effecter_data_size = effecter_dataSize;
resp->effecter_oper_state = effecter_operState;
uint16_t pendingValue_le = htole16(pendingValue);
memcpy(resp->pending_and_present_values, &pendingValue_le,
sizeof(pendingValue_le));
uint16_t presentValue_le = htole16(presentValue);
memcpy(&resp->pending_and_present_values[2], &presentValue_le,
sizeof(presentValue_le));
rc = decode_get_numeric_effecter_value_resp(
response, responseMsg.size() - hdrSize, &retcompletionCode,
&reteffecter_dataSize, &reteffecter_operState, retpendingValue,
retpresentValue);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(PldmPDRRepositoryChgEventEvent, testGoodDecodeRequest)
{
const uint8_t eventDataFormat = FORMAT_IS_PDR_HANDLES;
const uint8_t numberOfChangeRecords = 2;
uint8_t eventDataOperation1 = PLDM_RECORDS_DELETED;
const uint8_t numberOfChangeEntries1 = 2;
std::array<uint32_t, numberOfChangeEntries1> changeRecordArr1{
{0x00000000, 0x12345678}};
uint8_t eventDataOperation2 = PLDM_RECORDS_ADDED;
const uint8_t numberOfChangeEntries2 = 5;
std::array<uint32_t, numberOfChangeEntries2> changeRecordArr2{
{0x01234567, 0x11223344, 0x45678901, 0x21222324, 0x98765432}};
std::array<uint8_t, PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH +
PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH *
numberOfChangeRecords +
(numberOfChangeEntries1 + numberOfChangeEntries2) *
sizeof(uint32_t)>
eventDataArr{};
struct pldm_pdr_repository_chg_event_data* eventData =
reinterpret_cast<struct pldm_pdr_repository_chg_event_data*>(
eventDataArr.data());
eventData->event_data_format = eventDataFormat;
eventData->number_of_change_records = numberOfChangeRecords;
struct pldm_pdr_repository_change_record_data* changeRecord1 =
reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
eventData->change_records);
changeRecord1->event_data_operation = eventDataOperation1;
changeRecord1->number_of_change_entries = numberOfChangeEntries1;
memcpy(changeRecord1->change_entry, &changeRecordArr1[0],
changeRecordArr1.size() * sizeof(uint32_t));
struct pldm_pdr_repository_change_record_data* changeRecord2 =
reinterpret_cast<struct pldm_pdr_repository_change_record_data*>(
eventData->change_records +
PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH +
(changeRecordArr1.size() * sizeof(uint32_t)));
changeRecord2->event_data_operation = eventDataOperation2;
changeRecord2->number_of_change_entries = numberOfChangeEntries2;
memcpy(changeRecord2->change_entry, &changeRecordArr2[0],
changeRecordArr2.size() * sizeof(uint32_t));
uint8_t retEventDataFormat{};
uint8_t retNumberOfChangeRecords{};
size_t retChangeRecordDataOffset{0};
auto rc = decode_pldm_pdr_repository_chg_event_data(
reinterpret_cast<const uint8_t*>(eventData), eventDataArr.size(),
&retEventDataFormat, &retNumberOfChangeRecords,
&retChangeRecordDataOffset);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retEventDataFormat, FORMAT_IS_PDR_HANDLES);
EXPECT_EQ(retNumberOfChangeRecords, numberOfChangeRecords);
const uint8_t* changeRecordData =
reinterpret_cast<const uint8_t*>(changeRecord1);
size_t changeRecordDataSize =
eventDataArr.size() - PLDM_PDR_REPOSITORY_CHG_EVENT_MIN_LENGTH;
uint8_t retEventDataOperation;
uint8_t retNumberOfChangeEntries;
size_t retChangeEntryDataOffset;
rc = decode_pldm_pdr_repository_change_record_data(
reinterpret_cast<const uint8_t*>(changeRecordData),
changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
&retChangeEntryDataOffset);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retEventDataOperation, eventDataOperation1);
EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries1);
changeRecordData += retChangeEntryDataOffset;
EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr1[0],
sizeof(uint32_t) * retNumberOfChangeEntries));
changeRecordData += sizeof(uint32_t) * retNumberOfChangeEntries;
changeRecordDataSize -= sizeof(uint32_t) * retNumberOfChangeEntries -
PLDM_PDR_REPOSITORY_CHANGE_RECORD_MIN_LENGTH;
rc = decode_pldm_pdr_repository_change_record_data(
reinterpret_cast<const uint8_t*>(changeRecordData),
changeRecordDataSize, &retEventDataOperation, &retNumberOfChangeEntries,
&retChangeEntryDataOffset);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(retEventDataOperation, eventDataOperation2);
EXPECT_EQ(retNumberOfChangeEntries, numberOfChangeEntries2);
changeRecordData += retChangeEntryDataOffset;
EXPECT_EQ(0, memcmp(changeRecordData, &changeRecordArr2[0],
sizeof(uint32_t) * retNumberOfChangeEntries));
}
TEST(PldmPDRRepositoryChgEventEvent, testBadDecodeRequest)
{
uint8_t eventDataFormat{};
uint8_t numberOfChangeRecords{};
size_t changeRecordDataOffset{};
auto rc = decode_pldm_pdr_repository_chg_event_data(
NULL, 0, &eventDataFormat, &numberOfChangeRecords,
&changeRecordDataOffset);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
std::array<uint8_t, 2> eventData{};
rc = decode_pldm_pdr_repository_chg_event_data(
reinterpret_cast<const uint8_t*>(eventData.data()), 0, &eventDataFormat,
&numberOfChangeRecords, &changeRecordDataOffset);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
uint8_t eventDataOperation{};
uint8_t numberOfChangeEntries{};
size_t changeEntryDataOffset{};
rc = decode_pldm_pdr_repository_change_record_data(
NULL, 0, &eventDataOperation, &numberOfChangeEntries,
&changeEntryDataOffset);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
std::array<uint8_t, 2> changeRecord{};
rc = decode_pldm_pdr_repository_change_record_data(
reinterpret_cast<const uint8_t*>(changeRecord.data()), 0,
&eventDataOperation, &numberOfChangeEntries, &changeEntryDataOffset);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(GetSensorReading, testGoodEncodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
requestMsg{};
uint16_t sensorId = 0x1234;
bool8_t rearmEventState = 0x01;
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc =
encode_get_sensor_reading_req(0, sensorId, rearmEventState, request);
struct pldm_get_sensor_reading_req* req =
reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(sensorId, le16toh(req->sensor_id));
EXPECT_EQ(rearmEventState, req->rearm_event_state);
}
TEST(GetSensorReading, testBadEncodeRequest)
{
auto rc = encode_get_sensor_reading_req(0, 0, 0, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(GetSensorReading, testGoodDecodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
requestMsg{};
uint16_t sensorId = 0xABCD;
bool8_t rearmEventState = 0xA;
uint16_t retsensorId;
bool8_t retrearmEventState;
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_get_sensor_reading_req* req =
reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
req->sensor_id = htole16(sensorId);
req->rearm_event_state = rearmEventState;
auto rc =
decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize,
&retsensorId, &retrearmEventState);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(sensorId, retsensorId);
EXPECT_EQ(rearmEventState, retrearmEventState);
}
TEST(GetSensorReading, testBadDecodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_REQ_BYTES>
requestMsg{};
auto rc = decode_get_sensor_reading_req(
nullptr, requestMsg.size() - hdrSize, nullptr, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
uint16_t sensorId = 0xABCD;
bool8_t rearmEventState = 0xA;
uint16_t retsensorId;
bool8_t retrearmEventState;
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_get_sensor_reading_req* req =
reinterpret_cast<struct pldm_get_sensor_reading_req*>(request->payload);
req->sensor_id = htole16(sensorId);
req->rearm_event_state = rearmEventState;
rc = decode_get_sensor_reading_req(request, requestMsg.size() - hdrSize - 1,
&retsensorId, &retrearmEventState);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(GetSensorReading, testGoodEncodeResponse)
{
std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
uint8_t completionCode = 0;
uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
uint8_t sensor_operationalState = PLDM_SENSOR_ENABLED;
uint8_t sensor_event_messageEnable = PLDM_NO_EVENT_GENERATION;
uint8_t presentState = PLDM_SENSOR_NORMAL;
uint8_t previousState = PLDM_SENSOR_WARNING;
uint8_t eventState = PLDM_SENSOR_UPPERWARNING;
uint8_t presentReading = 0x21;
auto rc = encode_get_sensor_reading_resp(
0, completionCode, sensor_dataSize, sensor_operationalState,
sensor_event_messageEnable, presentState, previousState, eventState,
reinterpret_cast<uint8_t*>(&presentReading), response,
responseMsg.size() - hdrSize);
struct pldm_get_sensor_reading_resp* resp =
reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
response->payload);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completionCode, resp->completion_code);
EXPECT_EQ(sensor_dataSize, resp->sensor_data_size);
EXPECT_EQ(sensor_operationalState, resp->sensor_operational_state);
EXPECT_EQ(sensor_event_messageEnable, resp->sensor_event_message_enable);
EXPECT_EQ(presentState, resp->present_state);
EXPECT_EQ(previousState, resp->previous_state);
EXPECT_EQ(eventState, resp->event_state);
EXPECT_EQ(presentReading,
*(reinterpret_cast<uint8_t*>(&resp->present_reading[0])));
}
TEST(GetSensorReading, testBadEncodeResponse)
{
std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
uint8_t presentReading = 0x1;
auto rc = encode_get_sensor_reading_resp(0, PLDM_SUCCESS, 0, 0, 0, 0, 0, 0,
nullptr, nullptr,
responseMsg.size() - hdrSize);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = encode_get_sensor_reading_resp(
0, PLDM_SUCCESS, 6, 1, 1, 1, 1, 1,
reinterpret_cast<uint8_t*>(&presentReading), response,
responseMsg.size() - hdrSize);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
rc = encode_get_sensor_reading_resp(
0, PLDM_SUCCESS, sensor_dataSize, 1, 1, 1, 1, 1,
reinterpret_cast<uint8_t*>(&presentReading), response,
responseMsg.size() - hdrSize);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(GetSensorReading, testGoodDecodeResponse)
{
std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 3>
responseMsg{};
uint8_t completionCode = 0;
uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT32;
uint8_t sensor_operationalState = PLDM_SENSOR_STATUSUNKOWN;
uint8_t sensor_event_messageEnable = PLDM_EVENTS_ENABLED;
uint8_t presentState = PLDM_SENSOR_CRITICAL;
uint8_t previousState = PLDM_SENSOR_UPPERCRITICAL;
uint8_t eventState = PLDM_SENSOR_WARNING;
uint32_t presentReading = 0xABCDEF11;
uint8_t retcompletionCode;
uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_UINT32;
uint8_t retsensor_operationalState;
uint8_t retsensor_event_messageEnable;
uint8_t retpresentState;
uint8_t retpreviousState;
uint8_t reteventState;
uint8_t retpresentReading[4];
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_get_sensor_reading_resp* resp =
reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->sensor_data_size = sensor_dataSize;
resp->sensor_operational_state = sensor_operationalState;
resp->sensor_event_message_enable = sensor_event_messageEnable;
resp->present_state = presentState;
resp->previous_state = previousState;
resp->event_state = eventState;
uint32_t presentReading_le = htole32(presentReading);
memcpy(resp->present_reading, &presentReading_le,
sizeof(presentReading_le));
auto rc = decode_get_sensor_reading_resp(
response, responseMsg.size() - hdrSize, &retcompletionCode,
&retsensor_dataSize, &retsensor_operationalState,
&retsensor_event_messageEnable, &retpresentState, &retpreviousState,
&reteventState, retpresentReading);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completionCode, retcompletionCode);
EXPECT_EQ(sensor_dataSize, retsensor_dataSize);
EXPECT_EQ(sensor_operationalState, retsensor_operationalState);
EXPECT_EQ(sensor_event_messageEnable, retsensor_event_messageEnable);
EXPECT_EQ(presentState, retpresentState);
EXPECT_EQ(previousState, retpreviousState);
EXPECT_EQ(eventState, reteventState);
EXPECT_EQ(presentReading,
*(reinterpret_cast<uint32_t*>(retpresentReading)));
}
TEST(GetSensorReading, testBadDecodeResponse)
{
std::array<uint8_t, hdrSize + PLDM_GET_SENSOR_READING_MIN_RESP_BYTES + 1>
responseMsg{};
auto rc = decode_get_sensor_reading_resp(
nullptr, responseMsg.size() - hdrSize, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
uint8_t completionCode = 0;
uint8_t sensor_dataSize = PLDM_EFFECTER_DATA_SIZE_UINT8;
uint8_t sensor_operationalState = PLDM_SENSOR_INTEST;
uint8_t sensor_event_messageEnable = PLDM_EVENTS_DISABLED;
uint8_t presentState = PLDM_SENSOR_FATAL;
uint8_t previousState = PLDM_SENSOR_UPPERFATAL;
uint8_t eventState = PLDM_SENSOR_WARNING;
uint8_t presentReading = 0xA;
uint8_t retcompletionCode;
uint8_t retsensor_dataSize = PLDM_SENSOR_DATA_SIZE_SINT16;
uint8_t retsensor_operationalState;
uint8_t retsensor_event_messageEnable;
uint8_t retpresent_state;
uint8_t retprevious_state;
uint8_t retevent_state;
uint8_t retpresentReading;
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
struct pldm_get_sensor_reading_resp* resp =
reinterpret_cast<struct pldm_get_sensor_reading_resp*>(
response->payload);
resp->completion_code = completionCode;
resp->sensor_data_size = sensor_dataSize;
resp->sensor_operational_state = sensor_operationalState;
resp->sensor_event_message_enable = sensor_event_messageEnable;
resp->present_state = presentState;
resp->previous_state = previousState;
resp->event_state = eventState;
resp->present_reading[0] = presentReading;
rc = decode_get_sensor_reading_resp(
response, responseMsg.size() - hdrSize, &retcompletionCode,
&retsensor_dataSize, &retsensor_operationalState,
&retsensor_event_messageEnable, &retpresent_state, &retprevious_state,
&retevent_state, reinterpret_cast<uint8_t*>(&retpresentReading));
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(SetEventReceiver, testGoodEncodeRequest)
{
uint8_t eventMessageGlobalEnable =
PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
uint8_t eventReceiverAddressInfo = 0x08;
uint16_t heartbeatTimer = 0x78;
std::vector<uint8_t> requestMsg(hdrSize +
PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_set_event_receiver_req(
0, eventMessageGlobalEnable, transportProtocolType,
eventReceiverAddressInfo, heartbeatTimer, request);
EXPECT_EQ(rc, PLDM_SUCCESS);
struct pldm_set_event_receiver_req* req =
reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
EXPECT_EQ(eventMessageGlobalEnable, req->event_message_global_enable);
EXPECT_EQ(transportProtocolType, req->transport_protocol_type);
EXPECT_EQ(eventReceiverAddressInfo, req->event_receiver_address_info);
EXPECT_EQ(heartbeatTimer, le16toh(req->heartbeat_timer));
}
TEST(SetEventReceiver, testBadEncodeRequest)
{
uint8_t eventMessageGlobalEnable =
PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
uint8_t eventReceiverAddressInfo = 0x08;
uint16_t heartbeatTimer = 0;
std::vector<uint8_t> requestMsg(hdrSize +
PLDM_SET_EVENT_RECEIVER_REQ_BYTES);
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
auto rc = encode_set_event_receiver_req(
0, eventMessageGlobalEnable, transportProtocolType,
eventReceiverAddressInfo, heartbeatTimer, request);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(SetEventReceiver, testGoodDecodeResponse)
{
std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
responseMsg{};
uint8_t retcompletion_code = 0;
responseMsg[hdrSize] = PLDM_SUCCESS;
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
auto rc = decode_set_event_receiver_resp(
response, responseMsg.size() - sizeof(pldm_msg_hdr),
&retcompletion_code);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(PLDM_SUCCESS, retcompletion_code);
}
TEST(SetEventReceiver, testBadDecodeResponse)
{
std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
responseMsg{};
uint8_t retcompletion_code = 0;
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
auto rc = decode_set_event_receiver_resp(
response, responseMsg.size() - sizeof(pldm_msg_hdr), NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
rc = decode_set_event_receiver_resp(
nullptr, responseMsg.size() - sizeof(pldm_msg_hdr),
&retcompletion_code);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(SetEventReceiver, testGoodEncodeResponse)
{
std::array<uint8_t,
sizeof(pldm_msg_hdr) + PLDM_SET_EVENT_RECEIVER_RESP_BYTES>
responseMsg{};
auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
uint8_t completionCode = 0;
auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, response);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(completionCode, response->payload[0]);
}
TEST(SetEventReceiver, testBadEncodeResponse)
{
auto rc = encode_set_event_receiver_resp(0, PLDM_SUCCESS, NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(SetEventReceiver, testGoodDecodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
requestMsg{};
uint8_t eventMessageGlobalEnable =
PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
uint8_t eventReceiverAddressInfo = 0x08;
uint16_t heartbeatTimer = 0x78;
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_set_event_receiver_req* req =
reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
req->event_message_global_enable = eventMessageGlobalEnable;
req->transport_protocol_type = transportProtocolType;
req->event_receiver_address_info = eventReceiverAddressInfo;
req->heartbeat_timer = htole16(heartbeatTimer);
uint8_t reteventMessageGlobalEnable;
uint8_t rettransportProtocolType;
uint8_t reteventReceiverAddressInfo;
uint16_t retheartbeatTimer;
auto rc = decode_set_event_receiver_req(
request, requestMsg.size() - hdrSize, &reteventMessageGlobalEnable,
&rettransportProtocolType, &reteventReceiverAddressInfo,
&retheartbeatTimer);
EXPECT_EQ(rc, PLDM_SUCCESS);
EXPECT_EQ(eventMessageGlobalEnable, reteventMessageGlobalEnable);
EXPECT_EQ(transportProtocolType, rettransportProtocolType);
EXPECT_EQ(eventReceiverAddressInfo, reteventReceiverAddressInfo);
EXPECT_EQ(heartbeatTimer, retheartbeatTimer);
}
TEST(SetEventReceiver, testBadDecodeRequest)
{
std::array<uint8_t, hdrSize + PLDM_SET_EVENT_RECEIVER_REQ_BYTES>
requestMsg{};
auto rc = decode_set_event_receiver_req(NULL, requestMsg.size() - hdrSize,
NULL, NULL, NULL, NULL);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
uint8_t eventMessageGlobalEnable =
PLDM_EVENT_MESSAGE_GLOBAL_ENABLE_ASYNC_KEEP_ALIVE;
uint8_t transportProtocolType = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
uint8_t eventReceiverAddressInfo = 0x08;
uint16_t heartbeatTimer = 0x78;
auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
struct pldm_set_event_receiver_req* req =
reinterpret_cast<struct pldm_set_event_receiver_req*>(request->payload);
req->event_message_global_enable = eventMessageGlobalEnable;
req->transport_protocol_type = transportProtocolType;
req->event_receiver_address_info = eventReceiverAddressInfo;
req->heartbeat_timer = htole16(heartbeatTimer);
uint8_t reteventMessageGlobalEnable;
uint8_t rettransportProtocolType;
uint8_t reteventReceiverAddressInfo;
uint16_t retheartbeatTimer;
rc = decode_set_event_receiver_req(
request, requestMsg.size() - hdrSize - 1, &reteventMessageGlobalEnable,
&rettransportProtocolType, &reteventReceiverAddressInfo,
&retheartbeatTimer);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}
TEST(decodeNumericSensorPdrData, Uint8Test)
{
std::vector<uint8_t> pdr1{
0x1,
0x0,
0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_NUMERIC_SENSOR_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH,
0, // dataLength
0,
0, // PLDMTerminusHandle
0x1,
0x0, // sensorID=1
PLDM_ENTITY_POWER_SUPPLY,
0, // entityType=Power Supply(120)
1,
0, // entityInstanceNumber
1,
0, // containerID=1
PLDM_NO_INIT, // sensorInit
false, // sensorAuxiliaryNamesPDR
PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
0, // unitModifier
0, // rateUnit
0, // baseOEMUnitHandle
0, // auxUnit
0, // auxUnitModifier
0, // auxRateUnit
0, // rel
0, // auxOEMUnitHandle
true, // isLinear
PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize
0,
0,
0xc0,
0x3f, // resolution=1.5
0,
0,
0x80,
0x3f, // offset=1.0
0,
0, // accuracy
0, // plusTolerance
0, // minusTolerance
3, // hysteresis = 3
0, // supportedThresholds
0, // thresholdAndHysteresisVolatility
0,
0,
0x80,
0x3f, // stateTransistionInterval=1.0
0,
0,
0x80,
0x3f, // updateInverval=1.0
255, // maxReadable
0, // minReadable
PLDM_RANGE_FIELD_FORMAT_UINT8, // rangeFieldFormat
0, // rangeFieldsupport
50, // nominalValue = 50
60, // normalMax = 60
40, // normalMin = 40
70, // warningHigh = 70
30, // warningLow = 30
80, // criticalHigh = 80
20, // criticalLow = 20
90, // fatalHigh = 90
10 // fatalLow = 10
};
struct pldm_numeric_sensor_value_pdr decodedPdr;
auto rc =
decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
EXPECT_EQ(PLDM_SUCCESS, rc);
EXPECT_EQ(1, decodedPdr.hdr.record_handle);
EXPECT_EQ(1, decodedPdr.hdr.version);
EXPECT_EQ(PLDM_NUMERIC_SENSOR_PDR, decodedPdr.hdr.type);
EXPECT_EQ(0, decodedPdr.hdr.record_change_num);
EXPECT_EQ(PLDM_PDR_NUMERIC_SENSOR_PDR_MIN_LENGTH, decodedPdr.hdr.length);
EXPECT_EQ(1, decodedPdr.sensor_id);
EXPECT_EQ(PLDM_ENTITY_POWER_SUPPLY, decodedPdr.entity_type);
EXPECT_EQ(1, decodedPdr.entity_instance_num);
EXPECT_EQ(1, decodedPdr.container_id);
EXPECT_EQ(PLDM_NO_INIT, decodedPdr.sensor_init);
EXPECT_EQ(false, decodedPdr.sensor_auxiliary_names_pdr);
EXPECT_EQ(PLDM_SENSOR_UNIT_DEGRESS_C, decodedPdr.base_unit);
EXPECT_EQ(0, decodedPdr.unit_modifier);
EXPECT_EQ(0, decodedPdr.rate_unit);
EXPECT_EQ(0, decodedPdr.base_oem_unit_handle);
EXPECT_EQ(0, decodedPdr.aux_unit);
EXPECT_EQ(0, decodedPdr.aux_unit_modifier);
EXPECT_EQ(0, decodedPdr.aux_rate_unit);
EXPECT_EQ(0, decodedPdr.rel);
EXPECT_EQ(0, decodedPdr.aux_oem_unit_handle);
EXPECT_EQ(true, decodedPdr.is_linear);
EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT8, decodedPdr.sensor_data_size);
EXPECT_FLOAT_EQ(1.5f, decodedPdr.resolution);
EXPECT_FLOAT_EQ(1.0f, decodedPdr.offset);
EXPECT_EQ(0, decodedPdr.accuracy);
EXPECT_EQ(0, decodedPdr.plus_tolerance);
EXPECT_EQ(0, decodedPdr.minus_tolerance);
EXPECT_EQ(3, decodedPdr.hysteresis.value_u8);
EXPECT_EQ(0, decodedPdr.supported_thresholds.byte);
EXPECT_EQ(0, decodedPdr.threshold_and_hysteresis_volatility.byte);
EXPECT_FLOAT_EQ(1.0f, decodedPdr.state_transition_interval);
EXPECT_FLOAT_EQ(1.0f, decodedPdr.update_interval);
EXPECT_EQ(255, decodedPdr.max_readable.value_u8);
EXPECT_EQ(0, decodedPdr.min_readable.value_u8);
EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT8, decodedPdr.range_field_format);
EXPECT_EQ(0, decodedPdr.range_field_support.byte);
EXPECT_EQ(50, decodedPdr.nominal_value.value_u8);
EXPECT_EQ(60, decodedPdr.normal_max.value_u8);
EXPECT_EQ(40, decodedPdr.normal_min.value_u8);
EXPECT_EQ(70, decodedPdr.warning_high.value_u8);
EXPECT_EQ(30, decodedPdr.warning_low.value_u8);
EXPECT_EQ(80, decodedPdr.critical_high.value_u8);
EXPECT_EQ(20, decodedPdr.critical_low.value_u8);
EXPECT_EQ(90, decodedPdr.fatal_high.value_u8);
EXPECT_EQ(10, decodedPdr.fatal_low.value_u8);
}
TEST(decodeNumericSensorPdrData, Sint8Test)
{
std::vector<uint8_t> pdr1{
0x1,
0x0,
0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_NUMERIC_SENSOR_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH,
0, // dataLength
0,
0, // PLDMTerminusHandle
0x1,
0x0, // sensorID=1
PLDM_ENTITY_POWER_SUPPLY,
0, // entityType=Power Supply(120)
1,
0, // entityInstanceNumber
0x1,
0x0, // containerID=1
PLDM_NO_INIT, // sensorInit
false, // sensorAuxiliaryNamesPDR
PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
0, // unitModifier
0, // rateUnit
0, // baseOEMUnitHandle
0, // auxUnit
0, // auxUnitModifier
0, // auxRateUnit
0, // rel
0, // auxOEMUnitHandle
true, // isLinear
PLDM_RANGE_FIELD_FORMAT_SINT8, // sensorDataSize
0,
0,
0,
0, // resolution
0,
0,
0,
0, // offset
0,
0, // accuracy
0, // plusTolerance
0, // minusTolerance
3, // hysteresis = 3
0, // supportedThresholds
0, // thresholdAndHysteresisVolatility
0,
0,
0x80,
0x3f, // stateTransistionInterval=1.0
0,
0,
0x80,
0x3f, // updateInverval=1.0
0x64, // maxReadable = 100
0x9c, // minReadable = -100
PLDM_RANGE_FIELD_FORMAT_SINT8, // rangeFieldFormat
0, // rangeFieldsupport
0, // nominalValue = 0
5, // normalMax = 5
0xfb, // normalMin = -5
10, // warningHigh = 10
0xf6, // warningLow = -10
20, // criticalHigh = 20
0xec, // criticalLow = -20
30, // fatalHigh = 30
0xe2 // fatalLow = -30
};
struct pldm_numeric_sensor_value_pdr decodedPdr;
auto rc =
decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
EXPECT_EQ(PLDM_SUCCESS, rc);
EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT8, decodedPdr.sensor_data_size);
EXPECT_EQ(100, decodedPdr.max_readable.value_s8);
EXPECT_EQ(-100, decodedPdr.min_readable.value_s8);
EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT8, decodedPdr.range_field_format);
EXPECT_EQ(0, decodedPdr.nominal_value.value_s8);
EXPECT_EQ(5, decodedPdr.normal_max.value_s8);
EXPECT_EQ(-5, decodedPdr.normal_min.value_s8);
EXPECT_EQ(10, decodedPdr.warning_high.value_s8);
EXPECT_EQ(-10, decodedPdr.warning_low.value_s8);
EXPECT_EQ(20, decodedPdr.critical_high.value_s8);
EXPECT_EQ(-20, decodedPdr.critical_low.value_s8);
EXPECT_EQ(30, decodedPdr.fatal_high.value_s8);
EXPECT_EQ(-30, decodedPdr.fatal_low.value_s8);
}
TEST(decodeNumericSensorPdrData, Uint16Test)
{
std::vector<uint8_t> pdr1{
0x1,
0x0,
0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_NUMERIC_SENSOR_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 2 +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
0, // dataLength
0,
0, // PLDMTerminusHandle
0x1,
0x0, // sensorID=1
PLDM_ENTITY_POWER_SUPPLY,
0, // entityType=Power Supply(120)
1,
0, // entityInstanceNumber
0x1,
0x0, // containerID=1
PLDM_NO_INIT, // sensorInit
false, // sensorAuxiliaryNamesPDR
PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
0, // unitModifier
0, // rateUnit
0, // baseOEMUnitHandle
0, // auxUnit
0, // auxUnitModifier
0, // auxRateUnit
0, // rel
0, // auxOEMUnitHandle
true, // isLinear
PLDM_SENSOR_DATA_SIZE_UINT16, // sensorDataSize
0,
0,
0,
0, // resolution
0,
0,
0,
0, // offset
0,
0, // accuracy
0, // plusTolerance
0, // minusTolerance
3,
0, // hysteresis = 3
0, // supportedThresholds
0, // thresholdAndHysteresisVolatility
0,
0,
0x80,
0x3f, // stateTransistionInterval=1.0
0,
0,
0x80,
0x3f, // updateInverval=1.0
0,
0x10, // maxReadable = 4096
0,
0, // minReadable = 0
PLDM_RANGE_FIELD_FORMAT_UINT16, // rangeFieldFormat
0, // rangeFieldsupport
0x88,
0x13, // nominalValue = 5,000
0x70,
0x17, // normalMax = 6,000
0xa0,
0x0f, // normalMin = 4,000
0x58,
0x1b, // warningHigh = 7,000
0xb8,
0x0b, // warningLow = 3,000
0x40,
0x1f, // criticalHigh = 8,000
0xd0,
0x07, // criticalLow = 2,000
0x28,
0x23, // fatalHigh = 9,000
0xe8,
0x03 // fatalLow = 1,000
};
struct pldm_numeric_sensor_value_pdr decodedPdr;
auto rc =
decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
EXPECT_EQ(PLDM_SUCCESS, rc);
EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT16, decodedPdr.sensor_data_size);
EXPECT_EQ(4096, decodedPdr.max_readable.value_u16);
EXPECT_EQ(0, decodedPdr.min_readable.value_u16);
EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT16, decodedPdr.range_field_format);
EXPECT_EQ(5000, decodedPdr.nominal_value.value_u16);
EXPECT_EQ(6000, decodedPdr.normal_max.value_u16);
EXPECT_EQ(4000, decodedPdr.normal_min.value_u16);
EXPECT_EQ(7000, decodedPdr.warning_high.value_u16);
EXPECT_EQ(3000, decodedPdr.warning_low.value_u16);
EXPECT_EQ(8000, decodedPdr.critical_high.value_u16);
EXPECT_EQ(2000, decodedPdr.critical_low.value_u16);
EXPECT_EQ(9000, decodedPdr.fatal_high.value_u16);
EXPECT_EQ(1000, decodedPdr.fatal_low.value_u16);
}
TEST(decodeNumericSensorPdrData, Sint16Test)
{
std::vector<uint8_t> pdr1{
0x1,
0x0,
0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_NUMERIC_SENSOR_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 2 +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 2,
0, // dataLength
0,
0, // PLDMTerminusHandle
0x1,
0x0, // sensorID=1
PLDM_ENTITY_POWER_SUPPLY,
0, // entityType=Power Supply(120)
1,
0, // entityInstanceNumber
0x1,
0x0, // containerID=1
PLDM_NO_INIT, // sensorInit
false, // sensorAuxiliaryNamesPDR
PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
0, // unitModifier
0, // rateUnit
0, // baseOEMUnitHandle
0, // auxUnit
0, // auxUnitModifier
0, // auxRateUnit
0, // rel
0, // auxOEMUnitHandle
true, // isLinear
PLDM_SENSOR_DATA_SIZE_SINT16, // sensorDataSize
0,
0,
0,
0, // resolution
0,
0,
0,
0, // offset
0,
0, // accuracy
0, // plusTolerance
0, // minusTolerance
3,
0, // hysteresis
0, // supportedThresholds
0, // thresholdAndHysteresisVolatility
0,
0,
0x80,
0x3f, // stateTransistionInterval=1.0
0,
0,
0x80,
0x3f, // updateInverval=1.0
0xe8,
0x03, // maxReadable = 1000
0x18,
0xfc, // minReadable = -1000
PLDM_RANGE_FIELD_FORMAT_SINT16, // rangeFieldFormat
0, // rangeFieldsupport
0,
0, // nominalValue = 0
0xf4,
0x01, // normalMax = 500
0x0c,
0xfe, // normalMin = -500
0xe8,
0x03, // warningHigh = 1,000
0x18,
0xfc, // warningLow = -1,000
0xd0,
0x07, // criticalHigh = 2,000
0x30,
0xf8, // criticalLow = -2,000
0xb8,
0x0b, // fatalHigh = 3,000
0x48,
0xf4 // fatalLow = -3,000
};
struct pldm_numeric_sensor_value_pdr decodedPdr;
auto rc =
decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
EXPECT_EQ(PLDM_SUCCESS, rc);
EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT16, decodedPdr.sensor_data_size);
EXPECT_EQ(1000, decodedPdr.max_readable.value_s16);
EXPECT_EQ(-1000, decodedPdr.min_readable.value_s16);
EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT16, decodedPdr.range_field_format);
EXPECT_EQ(0, decodedPdr.nominal_value.value_s16);
EXPECT_EQ(500, decodedPdr.normal_max.value_s16);
EXPECT_EQ(-500, decodedPdr.normal_min.value_s16);
EXPECT_EQ(1000, decodedPdr.warning_high.value_s16);
EXPECT_EQ(-1000, decodedPdr.warning_low.value_s16);
EXPECT_EQ(2000, decodedPdr.critical_high.value_s16);
EXPECT_EQ(-2000, decodedPdr.critical_low.value_s16);
EXPECT_EQ(3000, decodedPdr.fatal_high.value_s16);
EXPECT_EQ(-3000, decodedPdr.fatal_low.value_s16);
}
TEST(decodeNumericSensorPdrData, Uint32Test)
{
std::vector<uint8_t> pdr1{
0x1,
0x0,
0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_NUMERIC_SENSOR_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
0, // dataLength
0,
0, // PLDMTerminusHandle
0x1,
0x0, // sensorID=1
PLDM_ENTITY_POWER_SUPPLY,
0, // entityType=Power Supply(120)
1,
0, // entityInstanceNumber
0x1,
0x0, // containerID=1
PLDM_NO_INIT, // sensorInit
false, // sensorAuxiliaryNamesPDR
PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
0, // unitModifier
0, // rateUnit
0, // baseOEMUnitHandle
0, // auxUnit
0, // auxUnitModifier
0, // auxRateUnit
0, // rel
0, // auxOEMUnitHandle
true, // isLinear
PLDM_SENSOR_DATA_SIZE_UINT32, // sensorDataSize
0,
0,
0,
0, // resolution
0,
0,
0,
0, // offset
0,
0, // accuracy
0, // plusTolerance
0, // minusTolerance
3,
0,
0,
0, // hysteresis
0, // supportedThresholds
0, // thresholdAndHysteresisVolatility
0,
0,
0x80,
0x3f, // stateTransistionInterval=1.0
0,
0,
0x80,
0x3f, // updateInverval=1.0
0,
0x10,
0,
0, // maxReadable = 4096
0,
0,
0,
0, // minReadable = 0
PLDM_RANGE_FIELD_FORMAT_UINT32, // rangeFieldFormat
0, // rangeFieldsupport
0x40,
0x4b,
0x4c,
0x00, // nominalValue = 5,000,000
0x80,
0x8d,
0x5b,
0x00, // normalMax = 6,000,000
0x00,
0x09,
0x3d,
0x00, // normalMin = 4,000,000
0xc0,
0xcf,
0x6a,
0x00, // warningHigh = 7,000,000
0xc0,
0xc6,
0x2d,
0x00, // warningLow = 3,000,000
0x00,
0x12,
0x7a,
0x00, // criticalHigh = 8,000,000
0x80,
0x84,
0x1e,
0x00, // criticalLow = 2,000,000
0x40,
0x54,
0x89,
0x00, // fatalHigh = 9,000,000
0x40,
0x42,
0x0f,
0x00 // fatalLow = 1,000,000
};
struct pldm_numeric_sensor_value_pdr decodedPdr;
auto rc =
decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
EXPECT_EQ(PLDM_SUCCESS, rc);
EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_UINT32, decodedPdr.sensor_data_size);
EXPECT_EQ(4096, decodedPdr.max_readable.value_u32);
EXPECT_EQ(0, decodedPdr.min_readable.value_u32);
EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_UINT32, decodedPdr.range_field_format);
EXPECT_EQ(5000000, decodedPdr.nominal_value.value_u32);
EXPECT_EQ(6000000, decodedPdr.normal_max.value_u32);
EXPECT_EQ(4000000, decodedPdr.normal_min.value_u32);
EXPECT_EQ(7000000, decodedPdr.warning_high.value_u32);
EXPECT_EQ(3000000, decodedPdr.warning_low.value_u32);
EXPECT_EQ(8000000, decodedPdr.critical_high.value_u32);
EXPECT_EQ(2000000, decodedPdr.critical_low.value_u32);
EXPECT_EQ(9000000, decodedPdr.fatal_high.value_u32);
EXPECT_EQ(1000000, decodedPdr.fatal_low.value_u32);
}
TEST(decodeNumericSensorPdrData, Sint32Test)
{
std::vector<uint8_t> pdr1{
0x1,
0x0,
0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_NUMERIC_SENSOR_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
0, // dataLength
0,
0, // PLDMTerminusHandle
0x1,
0x0, // sensorID=1
PLDM_ENTITY_POWER_SUPPLY,
0, // entityType=Power Supply(120)
1,
0, // entityInstanceNumber
0x1,
0x0, // containerID=1
PLDM_NO_INIT, // sensorInit
false, // sensorAuxiliaryNamesPDR
PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
0, // unitModifier
0, // rateUnit
0, // baseOEMUnitHandle
0, // auxUnit
0, // auxUnitModifier
0, // auxRateUnit
0, // rel
0, // auxOEMUnitHandle
true, // isLinear
PLDM_SENSOR_DATA_SIZE_SINT32, // sensorDataSize
0,
0,
0,
0, // resolution
0,
0,
0,
0, // offset
0,
0, // accuracy
0, // plusTolerance
0, // minusTolerance
3,
0,
0,
0, // hysteresis
0, // supportedThresholds
0, // thresholdAndHysteresisVolatility
0,
0,
0x80,
0x3f, // stateTransistionInterval=1.0
0,
0,
0x80,
0x3f, // updateInverval=1.0
0xa0,
0x86,
0x01,
0x00, // maxReadable = 100000
0x60,
0x79,
0xfe,
0xff, // minReadable = -10000
PLDM_RANGE_FIELD_FORMAT_SINT32, // rangeFieldFormat
0, // rangeFieldsupport
0,
0,
0,
0, // nominalValue = 0
0x20,
0xa1,
0x07,
0x00, // normalMax = 500,000
0xe0,
0x5e,
0xf8,
0xff, // normalMin = -500,000
0x40,
0x42,
0x0f,
0x00, // warningHigh = 1,000,000
0xc0,
0xbd,
0xf0,
0xff, // warningLow = -1,000,000
0x80,
0x84,
0x1e,
0x00, // criticalHigh = 2,000,000
0x80,
0x7b,
0xe1,
0xff, // criticalLow = -2,000,000
0xc0,
0xc6,
0x2d,
0x00, // fatalHigh = 3,000,000
0x40,
0x39,
0xd2,
0xff // fatalLow = -3,000,000
};
struct pldm_numeric_sensor_value_pdr decodedPdr;
auto rc =
decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
EXPECT_EQ(PLDM_SUCCESS, rc);
EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT32, decodedPdr.sensor_data_size);
EXPECT_EQ(100000, decodedPdr.max_readable.value_s32);
EXPECT_EQ(-100000, decodedPdr.min_readable.value_s32);
EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_SINT32, decodedPdr.range_field_format);
EXPECT_EQ(0, decodedPdr.nominal_value.value_s32);
EXPECT_EQ(500000, decodedPdr.normal_max.value_s32);
EXPECT_EQ(-500000, decodedPdr.normal_min.value_s32);
EXPECT_EQ(1000000, decodedPdr.warning_high.value_s32);
EXPECT_EQ(-1000000, decodedPdr.warning_low.value_s32);
EXPECT_EQ(2000000, decodedPdr.critical_high.value_s32);
EXPECT_EQ(-2000000, decodedPdr.critical_low.value_s32);
EXPECT_EQ(3000000, decodedPdr.fatal_high.value_s32);
EXPECT_EQ(-3000000, decodedPdr.fatal_low.value_s32);
}
TEST(decodeNumericSensorPdrData, Real32Test)
{
std::vector<uint8_t> pdr1{
0x1,
0x0,
0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_NUMERIC_SENSOR_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_SENSOR_DATA_SIZE_MIN_LENGTH * 4 +
PLDM_PDR_NUMERIC_SENSOR_PDR_VARIED_RANGE_FIELD_MIN_LENGTH * 4,
0, // dataLength
0,
0, // PLDMTerminusHandle
0x1,
0x0, // sensorID=1
PLDM_ENTITY_POWER_SUPPLY,
0, // entityType=Power Supply(120)
1,
0, // entityInstanceNumber
0x1,
0x0, // containerID=1
PLDM_NO_INIT, // sensorInit
false, // sensorAuxiliaryNamesPDR
PLDM_SENSOR_UNIT_DEGRESS_C, // baseUint(2)=degrees C
0, // unitModifier
0, // rateUnit
0, // baseOEMUnitHandle
0, // auxUnit
0, // auxUnitModifier
0, // auxRateUnit
0, // rel
0, // auxOEMUnitHandle
true, // isLinear
PLDM_SENSOR_DATA_SIZE_SINT32, // sensorDataSize
0,
0,
0,
0, // resolution
0,
0,
0,
0, // offset
0,
0, // accuracy
0, // plusTolerance
0, // minusTolerance
3,
0,
0,
0, // hysteresis
0, // supportedThresholds
0, // thresholdAndHysteresisVolatility
0,
0,
0x80,
0x3f, // stateTransistionInterval=1.0
0,
0,
0x80,
0x3f, // updateInverval=1.0
0xa0,
0x86,
0x01,
0x00, // maxReadable = 100000
0x60,
0x79,
0xfe,
0xff, // minReadable = -10000
PLDM_RANGE_FIELD_FORMAT_REAL32, // rangeFieldFormat
0, // rangeFieldsupport
0,
0,
0,
0, // nominalValue = 0.0
0x33,
0x33,
0x48,
0x42, // normalMax = 50.05
0x33,
0x33,
0x48,
0xc2, // normalMin = -50.05
0x83,
0x00,
0xc8,
0x42, // warningHigh = 100.001
0x83,
0x00,
0xc8,
0xc2, // warningLow = -100.001
0x83,
0x00,
0x48,
0x43, // criticalHigh = 200.002
0x83,
0x00,
0x48,
0xc3, // criticalLow = -200.002
0x62,
0x00,
0x96,
0x43, // fatalHigh = 300.003
0x62,
0x00,
0x96,
0xc3 // fatalLow = -300.003
};
struct pldm_numeric_sensor_value_pdr decodedPdr;
auto rc =
decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
EXPECT_EQ(PLDM_SUCCESS, rc);
EXPECT_EQ(PLDM_SENSOR_DATA_SIZE_SINT32, decodedPdr.sensor_data_size);
EXPECT_EQ(100000, decodedPdr.max_readable.value_s32);
EXPECT_EQ(-100000, decodedPdr.min_readable.value_s32);
EXPECT_EQ(PLDM_RANGE_FIELD_FORMAT_REAL32, decodedPdr.range_field_format);
EXPECT_FLOAT_EQ(0, decodedPdr.nominal_value.value_f32);
EXPECT_FLOAT_EQ(50.05f, decodedPdr.normal_max.value_f32);
EXPECT_FLOAT_EQ(-50.05f, decodedPdr.normal_min.value_f32);
EXPECT_FLOAT_EQ(100.001f, decodedPdr.warning_high.value_f32);
EXPECT_FLOAT_EQ(-100.001f, decodedPdr.warning_low.value_f32);
EXPECT_FLOAT_EQ(200.002f, decodedPdr.critical_high.value_f32);
EXPECT_FLOAT_EQ(-200.002f, decodedPdr.critical_low.value_f32);
EXPECT_FLOAT_EQ(300.003f, decodedPdr.fatal_high.value_f32);
EXPECT_FLOAT_EQ(-300.003f, decodedPdr.fatal_low.value_f32);
}
TEST(decodeNumericSensorPdrDataDeathTest, InvalidSizeTest)
{
// A corrupted PDR. The data after plusTolerance missed.
std::vector<uint8_t> pdr1{
0x1,
0x0,
0x0,
0x0, // record handle
0x1, // PDRHeaderVersion
PLDM_NUMERIC_SENSOR_PDR, // PDRType
0x0,
0x0, // recordChangeNumber
PLDM_PDR_NUMERIC_SENSOR_PDR_FIXED_LENGTH,
0, // dataLength
0,
0, // PLDMTerminusHandle
0x1,
0x0, // sensorID=1
PLDM_ENTITY_POWER_SUPPLY,
0, // entityType=Power Supply(120)
1,
0, // entityInstanceNumber
0x1,
0x0, // containerID=1
PLDM_NO_INIT, // sensorInit
false, // sensorAuxiliaryNamesPDR
2, // baseUint(2)=degrees C
0, // unitModifier
0, // rateUnit
0, // baseOEMUnitHandle
0, // auxUnit
0, // auxUnitModifier
0, // auxRateUnit
0, // rel
0, // auxOEMUnitHandle
true, // isLinear
PLDM_SENSOR_DATA_SIZE_UINT8, // sensorDataSize
0,
0,
0,
0, // resolution
0,
0,
0,
0, // offset
0,
0, // accuracy
0 // plusTolerance
};
struct pldm_numeric_sensor_value_pdr decodedPdr;
int rc =
decode_numeric_sensor_pdr_data(pdr1.data(), pdr1.size(), &decodedPdr);
EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
}