| #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 |