blob: 93ba8475525bc3bd1238bad2a57716d0327aa503 [file] [log] [blame]
#include <libpldm/file.h>
#include <libpldm/pldm_types.h>
#include <array>
#include <cstdint>
#include <cstring>
#include <vector>
#include "msgbuf.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#ifdef LIBPLDM_API_TESTING
TEST(EncodeDfOpenReq, GoodTest)
{
uint8_t instance_id = 0;
uint16_t file_identifier = 0x0100;
bitfield16_t file_attribute;
file_attribute.value = 0x0400;
std::array<uint8_t, PLDM_DF_OPEN_REQ_BYTES> requestMsg = {0x00, 0x01, 0x00,
0x04};
const struct pldm_file_df_open_req req_data = {file_identifier,
file_attribute};
PLDM_MSG_DEFINE_P(requestPtr, PLDM_DF_OPEN_REQ_BYTES);
auto rc = encode_pldm_file_df_open_req(instance_id, &req_data, requestPtr,
PLDM_DF_OPEN_REQ_BYTES);
ASSERT_EQ(rc, 0);
EXPECT_EQ(
0, memcmp(requestPtr->payload, requestMsg.data(), sizeof(requestMsg)));
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(EncodeDfOpenReq, BadTestUnAllocatedPtrParams)
{
uint8_t instance_id = 0;
uint16_t file_identifier = 0x0100;
bitfield16_t file_attribute;
file_attribute.value = 0x0400;
int rc;
const struct pldm_file_df_open_req req_data = {file_identifier,
file_attribute};
PLDM_MSG_DEFINE_P(requestPtr, PLDM_DF_OPEN_REQ_BYTES);
rc = encode_pldm_file_df_open_req(instance_id, &req_data, nullptr,
PLDM_DF_OPEN_REQ_BYTES);
EXPECT_EQ(rc, -EINVAL);
rc = encode_pldm_file_df_open_req(instance_id, nullptr, requestPtr,
PLDM_DF_OPEN_REQ_BYTES);
EXPECT_EQ(rc, -EINVAL);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(EncodeDfOpenReq, BadTestInvalidExpectedOutputMsgLength)
{
uint8_t instance_id = 0;
uint16_t file_identifier = 0x0100;
bitfield16_t file_attribute;
file_attribute.value = 0x0400;
int rc;
const struct pldm_file_df_open_req req_data = {file_identifier,
file_attribute};
PLDM_MSG_DEFINE_P(requestPtr, PLDM_DF_OPEN_REQ_BYTES);
rc = encode_pldm_file_df_open_req(instance_id, &req_data, requestPtr, 1);
EXPECT_EQ(rc, -EOVERFLOW);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(DecodeDfOpenResp, GoodTest)
{
uint8_t completion_code = PLDM_SUCCESS;
uint16_t file_descriptor = 20;
struct pldm_file_df_open_resp resp_data = {};
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
static constexpr const size_t payload_length = PLDM_DF_OPEN_RESP_BYTES;
PLDM_MSG_DEFINE_P(responseMsg, payload_length);
rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
ASSERT_EQ(rc, 0);
pldm_msgbuf_insert_uint8(buf, completion_code);
pldm_msgbuf_insert_uint16(buf, file_descriptor);
ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
rc = decode_pldm_file_df_open_resp(responseMsg, payload_length, &resp_data);
ASSERT_EQ(rc, 0);
EXPECT_EQ(resp_data.completion_code, completion_code);
EXPECT_EQ(resp_data.file_descriptor, file_descriptor);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(DecodeDfOpenResp, BadTestUnAllocatedPtrParams)
{
uint8_t completion_code = PLDM_SUCCESS;
uint16_t file_descriptor = 20;
struct pldm_file_df_open_resp resp_data = {};
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
static constexpr const size_t payload_length = PLDM_DF_OPEN_RESP_BYTES;
PLDM_MSG_DEFINE_P(responseMsg, payload_length);
rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
ASSERT_EQ(rc, 0);
pldm_msgbuf_insert_uint8(buf, completion_code);
pldm_msgbuf_insert_uint16(buf, file_descriptor);
ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
rc = decode_pldm_file_df_open_resp(nullptr, payload_length, &resp_data);
EXPECT_EQ(rc, -EINVAL);
rc = decode_pldm_file_df_open_resp(responseMsg, payload_length, nullptr);
EXPECT_EQ(rc, -EINVAL);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(DecodeDfOpenResp, BadTestInvalidExpectedInputMsgLength)
{
uint8_t completion_code = PLDM_SUCCESS;
uint16_t file_descriptor = 20;
struct pldm_file_df_open_resp resp_data = {};
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
static constexpr const size_t payload_length = PLDM_DF_OPEN_RESP_BYTES;
PLDM_MSG_DEFINE_P(responseMsg, payload_length);
rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
ASSERT_EQ(rc, 0);
pldm_msgbuf_insert_uint8(buf, completion_code);
pldm_msgbuf_insert_uint16(buf, file_descriptor);
ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
rc = decode_pldm_file_df_open_resp(responseMsg, 0, &resp_data);
EXPECT_EQ(rc, -EOVERFLOW);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(EncodeDfCloseReq, GoodTest)
{
uint8_t instance_id = 0;
uint16_t file_descriptor = 0x0200;
bitfield16_t df_close_options;
df_close_options.value = 0x0100;
std::array<uint8_t, PLDM_DF_CLOSE_REQ_BYTES> requestMsg = {0x00, 0x02, 0x00,
0x01};
const struct pldm_file_df_close_req req_data = {file_descriptor,
df_close_options};
PLDM_MSG_DEFINE_P(requestPtr, PLDM_DF_OPEN_REQ_BYTES);
auto rc = encode_pldm_file_df_close_req(instance_id, &req_data, requestPtr,
PLDM_DF_CLOSE_REQ_BYTES);
ASSERT_EQ(rc, 0);
EXPECT_EQ(
0, memcmp(requestPtr->payload, requestMsg.data(), sizeof(requestMsg)));
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(EncodeDfCloseReq, BadTestUnAllocatedPtrParams)
{
uint8_t instance_id = 0;
uint16_t file_descriptor = 0x0200;
bitfield16_t df_close_options;
df_close_options.value = 0x0100;
int rc;
const struct pldm_file_df_close_req req_data = {file_descriptor,
df_close_options};
PLDM_MSG_DEFINE_P(requestPtr, PLDM_DF_CLOSE_REQ_BYTES);
rc = encode_pldm_file_df_close_req(instance_id, &req_data, nullptr,
PLDM_DF_CLOSE_REQ_BYTES);
EXPECT_EQ(rc, -EINVAL);
rc = encode_pldm_file_df_close_req(instance_id, nullptr, requestPtr,
PLDM_DF_CLOSE_REQ_BYTES);
EXPECT_EQ(rc, -EINVAL);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(EncodeDfCloseReq, BadTestInvalidExpectedOutputMsgLength)
{
uint8_t instance_id = 0;
uint16_t file_descriptor = 0x0200;
bitfield16_t df_close_options;
df_close_options.value = 0x0100;
int rc;
const struct pldm_file_df_close_req req_data = {file_descriptor,
df_close_options};
PLDM_MSG_DEFINE_P(requestPtr, PLDM_DF_CLOSE_REQ_BYTES);
rc = encode_pldm_file_df_close_req(instance_id, &req_data, requestPtr, 1);
EXPECT_EQ(rc, -EOVERFLOW);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(DecodeDfCloseResp, GoodTest)
{
uint8_t completion_code = PLDM_SUCCESS;
struct pldm_file_df_close_resp resp_data = {};
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
static constexpr const size_t payload_length = PLDM_DF_CLOSE_RESP_BYTES;
PLDM_MSG_DEFINE_P(responseMsg, payload_length);
rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
ASSERT_EQ(rc, 0);
pldm_msgbuf_insert_uint8(buf, completion_code);
ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
rc =
decode_pldm_file_df_close_resp(responseMsg, payload_length, &resp_data);
ASSERT_EQ(rc, 0);
EXPECT_EQ(resp_data.completion_code, completion_code);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(DecodeDfCloseResp, BadTestUnAllocatedPtrParams)
{
uint8_t completion_code = PLDM_SUCCESS;
struct pldm_file_df_close_resp resp_data = {};
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
static constexpr const size_t payload_length = PLDM_DF_CLOSE_RESP_BYTES;
PLDM_MSG_DEFINE_P(responseMsg, payload_length);
rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
ASSERT_EQ(rc, 0);
pldm_msgbuf_insert_uint8(buf, completion_code);
ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
rc = decode_pldm_file_df_close_resp(nullptr, payload_length, &resp_data);
EXPECT_EQ(rc, -EINVAL);
rc = decode_pldm_file_df_close_resp(responseMsg, payload_length, nullptr);
EXPECT_EQ(rc, -EINVAL);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(EncodeDfHeartbeatReq, GoodTest)
{
uint8_t instance_id = 0;
uint16_t file_descriptor = 0x0200;
uint32_t requester_max_interval = 0x88130000; // 5000 ms
std::array<uint8_t, PLDM_DF_HEARTBEAT_REQ_BYTES> requestMsg = {
0x00, 0x02, 0x00, 0x00, 0x13, 0x88};
const struct pldm_file_df_heartbeat_req req_data = {file_descriptor,
requester_max_interval};
PLDM_MSG_DEFINE_P(requestPtr, PLDM_DF_HEARTBEAT_REQ_BYTES);
auto rc = encode_pldm_file_df_heartbeat_req(
instance_id, &req_data, requestPtr, PLDM_DF_HEARTBEAT_REQ_BYTES);
ASSERT_EQ(rc, 0);
EXPECT_EQ(
0, memcmp(requestPtr->payload, requestMsg.data(), sizeof(requestMsg)));
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(EncodeDfHeartbeatReq, BadTestUnAllocatedPtrParams)
{
uint8_t instance_id = 0;
uint16_t file_descriptor = 0x0200;
uint32_t requester_max_interval = 0x88130000; // 5000 ms
int rc;
const struct pldm_file_df_heartbeat_req req_data = {file_descriptor,
requester_max_interval};
PLDM_MSG_DEFINE_P(requestPtr, PLDM_DF_HEARTBEAT_REQ_BYTES);
rc = encode_pldm_file_df_heartbeat_req(instance_id, &req_data, nullptr,
PLDM_DF_HEARTBEAT_REQ_BYTES);
EXPECT_EQ(rc, -EINVAL);
rc = encode_pldm_file_df_heartbeat_req(instance_id, nullptr, requestPtr,
PLDM_DF_HEARTBEAT_REQ_BYTES);
EXPECT_EQ(rc, -EINVAL);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(EncodeDfHeartbeatReq, BadTestInvalidExpectedOutputMsgLength)
{
uint8_t instance_id = 0;
uint16_t file_descriptor = 0x0200;
uint32_t requester_max_interval = 0x88130000; // 5000 ms
int rc;
const struct pldm_file_df_heartbeat_req req_data = {file_descriptor,
requester_max_interval};
PLDM_MSG_DEFINE_P(requestPtr, PLDM_DF_HEARTBEAT_REQ_BYTES);
rc = encode_pldm_file_df_heartbeat_req(instance_id, &req_data, requestPtr,
1);
EXPECT_EQ(rc, -EOVERFLOW);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(DecodeDfHeartbeatResp, GoodTest)
{
uint8_t completion_code = PLDM_SUCCESS;
uint32_t responder_max_interval = 0xa00f0000; // 4000 ms
struct pldm_file_df_heartbeat_resp resp_data = {};
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
static constexpr const size_t payload_length = PLDM_DF_HEARTBEAT_RESP_BYTES;
PLDM_MSG_DEFINE_P(responseMsg, payload_length);
rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
ASSERT_EQ(rc, 0);
pldm_msgbuf_insert_uint8(buf, completion_code);
pldm_msgbuf_insert_uint32(buf, responder_max_interval);
ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
rc = decode_pldm_file_df_heartbeat_resp(responseMsg, payload_length,
&resp_data);
ASSERT_EQ(rc, 0);
EXPECT_EQ(resp_data.completion_code, completion_code);
EXPECT_EQ(resp_data.responder_max_interval, responder_max_interval);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(DecodeDfHeartbeatResp, BadTestUnAllocatedPtrParams)
{
uint8_t completion_code = PLDM_SUCCESS;
uint32_t responder_max_interval = 0xa00f0000; // 4000 ms
struct pldm_file_df_heartbeat_resp resp_data = {};
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
static constexpr const size_t payload_length = PLDM_DF_HEARTBEAT_RESP_BYTES;
PLDM_MSG_DEFINE_P(responseMsg, payload_length);
rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
ASSERT_EQ(rc, 0);
pldm_msgbuf_insert_uint8(buf, completion_code);
pldm_msgbuf_insert_uint32(buf, responder_max_interval);
ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
rc =
decode_pldm_file_df_heartbeat_resp(nullptr, payload_length, &resp_data);
EXPECT_EQ(rc, -EINVAL);
rc = decode_pldm_file_df_heartbeat_resp(responseMsg, payload_length,
nullptr);
EXPECT_EQ(rc, -EINVAL);
}
#endif
#ifdef LIBPLDM_API_TESTING
TEST(DecodeDfHeartbeatResp, BadTestInvalidExpectedInputMsgLength)
{
uint8_t completion_code = PLDM_SUCCESS;
uint32_t responder_max_interval = 0xa00f0000; // 4000 ms
struct pldm_file_df_heartbeat_resp resp_data = {};
PLDM_MSGBUF_DEFINE_P(buf);
int rc;
static constexpr const size_t payload_length = PLDM_DF_HEARTBEAT_RESP_BYTES;
PLDM_MSG_DEFINE_P(responseMsg, payload_length);
rc = pldm_msgbuf_init_errno(buf, 0, responseMsg->payload, payload_length);
ASSERT_EQ(rc, 0);
pldm_msgbuf_insert_uint8(buf, completion_code);
pldm_msgbuf_insert_uint32(buf, responder_max_interval);
ASSERT_EQ(pldm_msgbuf_complete_consumed(buf), 0);
rc = decode_pldm_file_df_heartbeat_resp(responseMsg, 0, &resp_data);
EXPECT_EQ(rc, -EOVERFLOW);
}
#endif