blob: 04d14c0028152b2e5e0392eaeb17dbd735a668d6 [file] [log] [blame]
#include <string.h>
#include <array>
#include "libpldm/base.h"
#include <gtest/gtest.h>
TEST(PackPLDMMessage, BadPathTest)
{
struct pldm_header_info hdr;
struct pldm_header_info* hdr_ptr = NULL;
pldm_msg_hdr msg{};
// PLDM header information pointer is NULL
auto rc = pack_pldm_header(hdr_ptr, &msg);
ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
// PLDM message pointer is NULL
rc = pack_pldm_header(&hdr, nullptr);
ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
// PLDM header information pointer and PLDM message pointer is NULL
rc = pack_pldm_header(hdr_ptr, nullptr);
ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
// RESERVED message type
hdr.msg_type = PLDM_RESERVED;
rc = pack_pldm_header(&hdr, &msg);
ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
// Instance ID out of range
hdr.msg_type = PLDM_REQUEST;
hdr.instance = 32;
rc = pack_pldm_header(&hdr, &msg);
ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
// PLDM type out of range
hdr.msg_type = PLDM_REQUEST;
hdr.instance = 31;
hdr.pldm_type = 64;
rc = pack_pldm_header(&hdr, &msg);
ASSERT_EQ(rc, PLDM_ERROR_INVALID_PLDM_TYPE);
}
TEST(PackPLDMMessage, RequestMessageGoodPath)
{
struct pldm_header_info hdr;
pldm_msg_hdr msg{};
// Message type is REQUEST and lower range of the field values
hdr.msg_type = PLDM_REQUEST;
hdr.instance = 0;
hdr.pldm_type = 0;
hdr.command = 0;
auto rc = pack_pldm_header(&hdr, &msg);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(msg.request, 1);
ASSERT_EQ(msg.datagram, 0);
ASSERT_EQ(msg.instance_id, 0);
ASSERT_EQ(msg.type, 0);
ASSERT_EQ(msg.command, 0);
// Message type is REQUEST and upper range of the field values
hdr.instance = 31;
hdr.pldm_type = 63;
hdr.command = 255;
rc = pack_pldm_header(&hdr, &msg);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(msg.request, 1);
ASSERT_EQ(msg.datagram, 0);
ASSERT_EQ(msg.instance_id, 31);
ASSERT_EQ(msg.type, 63);
ASSERT_EQ(msg.command, 255);
// Message type is PLDM_ASYNC_REQUEST_NOTIFY
hdr.msg_type = PLDM_ASYNC_REQUEST_NOTIFY;
rc = pack_pldm_header(&hdr, &msg);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(msg.request, 1);
ASSERT_EQ(msg.datagram, 1);
ASSERT_EQ(msg.instance_id, 31);
ASSERT_EQ(msg.type, 63);
ASSERT_EQ(msg.command, 255);
}
TEST(PackPLDMMessage, ResponseMessageGoodPath)
{
struct pldm_header_info hdr;
pldm_msg_hdr msg{};
// Message type is PLDM_RESPONSE and lower range of the field values
hdr.msg_type = PLDM_RESPONSE;
hdr.instance = 0;
hdr.pldm_type = 0;
hdr.command = 0;
auto rc = pack_pldm_header(&hdr, &msg);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(msg.request, 0);
ASSERT_EQ(msg.datagram, 0);
ASSERT_EQ(msg.instance_id, 0);
ASSERT_EQ(msg.type, 0);
ASSERT_EQ(msg.command, 0);
// Message type is PLDM_RESPONSE and upper range of the field values
hdr.instance = 31;
hdr.pldm_type = 63;
hdr.command = 255;
rc = pack_pldm_header(&hdr, &msg);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(msg.request, 0);
ASSERT_EQ(msg.datagram, 0);
ASSERT_EQ(msg.instance_id, 31);
ASSERT_EQ(msg.type, 63);
ASSERT_EQ(msg.command, 255);
}
TEST(UnpackPLDMMessage, BadPathTest)
{
struct pldm_header_info hdr;
// PLDM message pointer is NULL
auto rc = unpack_pldm_header(nullptr, &hdr);
ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
TEST(UnpackPLDMMessage, RequestMessageGoodPath)
{
struct pldm_header_info hdr;
pldm_msg_hdr msg{};
// Unpack PLDM request message and lower range of field values
msg.request = 1;
auto rc = unpack_pldm_header(&msg, &hdr);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(hdr.msg_type, PLDM_REQUEST);
ASSERT_EQ(hdr.instance, 0);
ASSERT_EQ(hdr.pldm_type, 0);
ASSERT_EQ(hdr.command, 0);
// Unpack PLDM async request message and lower range of field values
msg.datagram = 1;
rc = unpack_pldm_header(&msg, &hdr);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(hdr.msg_type, PLDM_ASYNC_REQUEST_NOTIFY);
// Unpack PLDM request message and upper range of field values
msg.datagram = 0;
msg.instance_id = 31;
msg.type = 63;
msg.command = 255;
rc = unpack_pldm_header(&msg, &hdr);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(hdr.msg_type, PLDM_REQUEST);
ASSERT_EQ(hdr.instance, 31);
ASSERT_EQ(hdr.pldm_type, 63);
ASSERT_EQ(hdr.command, 255);
}
TEST(UnpackPLDMMessage, ResponseMessageGoodPath)
{
struct pldm_header_info hdr;
pldm_msg_hdr msg{};
// Unpack PLDM response message and lower range of field values
auto rc = unpack_pldm_header(&msg, &hdr);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(hdr.msg_type, PLDM_RESPONSE);
ASSERT_EQ(hdr.instance, 0);
ASSERT_EQ(hdr.pldm_type, 0);
ASSERT_EQ(hdr.command, 0);
// Unpack PLDM response message and upper range of field values
msg.instance_id = 31;
msg.type = 63;
msg.command = 255;
rc = unpack_pldm_header(&msg, &hdr);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(hdr.msg_type, PLDM_RESPONSE);
ASSERT_EQ(hdr.instance, 31);
ASSERT_EQ(hdr.pldm_type, 63);
ASSERT_EQ(hdr.command, 255);
}
TEST(GetPLDMCommands, testEncodeRequest)
{
uint8_t pldmType = 0x05;
pldm_version version{0xFF, 0xFF, 0xFF, 0xFF};
std::array<uint8_t, PLDM_GET_COMMANDS_REQ_BYTES> requestMsg{};
pldm_msg request{};
request.body.payload = requestMsg.data();
request.body.payload_length = requestMsg.size();
auto rc = encode_get_commands_req(0, pldmType, version, &request);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(0, memcmp(request.body.payload, &pldmType, sizeof(pldmType)));
ASSERT_EQ(0, memcmp(request.body.payload + sizeof(pldmType), &version,
sizeof(version)));
}
TEST(GetPLDMCommands, testDecodeRequest)
{
uint8_t pldmType = 0x05;
pldm_version version{0xFF, 0xFF, 0xFF, 0xFF};
uint8_t pldmTypeOut{};
pldm_version versionOut{0xFF, 0xFF, 0xFF, 0xFF};
std::array<uint8_t, PLDM_GET_COMMANDS_REQ_BYTES> requestMsg{};
pldm_msg_payload request{};
request.payload = requestMsg.data();
request.payload_length = requestMsg.size();
memcpy(request.payload, &pldmType, sizeof(pldmType));
memcpy(request.payload + sizeof(pldmType), &version, sizeof(version));
auto rc = decode_get_commands_req(&request, &pldmTypeOut, &versionOut);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(pldmTypeOut, pldmType);
ASSERT_EQ(0, memcmp(&versionOut, &version, sizeof(version)));
}
TEST(GetPLDMCommands, testEncodeResponse)
{
uint8_t completionCode = 0;
std::array<uint8_t, PLDM_GET_COMMANDS_RESP_BYTES> responseMsg{};
pldm_msg response{};
response.body.payload = responseMsg.data();
response.body.payload_length = responseMsg.size();
std::array<uint8_t, PLDM_MAX_CMDS_PER_TYPE / 8> commands{};
commands[0] = 1;
commands[1] = 2;
commands[2] = 3;
auto rc =
encode_get_commands_resp(0, PLDM_SUCCESS, commands.data(), &response);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(completionCode, response.body.payload[0]);
ASSERT_EQ(1, response.body.payload[1]);
ASSERT_EQ(2, response.body.payload[2]);
ASSERT_EQ(3, response.body.payload[3]);
}
TEST(GetPLDMTypes, testEncodeResponse)
{
uint8_t completionCode = 0;
std::array<uint8_t, PLDM_GET_TYPES_RESP_BYTES> responseMsg{};
pldm_msg response{};
response.body.payload = responseMsg.data();
response.body.payload_length = responseMsg.size();
std::array<uint8_t, PLDM_MAX_TYPES / 8> types{};
types[0] = 1;
types[1] = 2;
types[2] = 3;
auto rc = encode_get_types_resp(0, PLDM_SUCCESS, types.data(), &response);
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(completionCode, response.body.payload[0]);
ASSERT_EQ(1, response.body.payload[1]);
ASSERT_EQ(2, response.body.payload[2]);
ASSERT_EQ(3, response.body.payload[3]);
}
TEST(GetPLDMTypes, testDecodeResponse)
{
std::array<uint8_t, PLDM_GET_TYPES_RESP_BYTES> responseMsg{};
pldm_msg_payload response{};
response.payload = responseMsg.data();
response.payload_length = responseMsg.size();
response.payload[1] = 1;
response.payload[2] = 2;
response.payload[3] = 3;
std::array<uint8_t, PLDM_MAX_TYPES / 8> outTypes{};
auto rc = decode_get_types_resp(&response, outTypes.data());
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(response.payload[1], outTypes[0]);
ASSERT_EQ(response.payload[2], outTypes[1]);
ASSERT_EQ(response.payload[3], outTypes[2]);
}
TEST(GetPLDMCommands, testDecodeResponse)
{
std::array<uint8_t, PLDM_MAX_CMDS_PER_TYPE> responseMsg{};
pldm_msg_payload response{};
response.payload = responseMsg.data();
response.payload_length = responseMsg.size();
response.payload[1] = 1;
response.payload[2] = 2;
response.payload[3] = 3;
std::array<uint8_t, PLDM_MAX_CMDS_PER_TYPE / 8> outTypes{};
auto rc = decode_get_commands_resp(&response, outTypes.data());
ASSERT_EQ(rc, PLDM_SUCCESS);
ASSERT_EQ(response.payload[1], outTypes[0]);
ASSERT_EQ(response.payload[2], outTypes[1]);
ASSERT_EQ(response.payload[3], outTypes[2]);
}