dsp: platform: Add encode req & decode resp for GetEventReceiver command
Add encode and decode API for the Get Event Receiver command
This command is defined in DSP0248 as a conditional command.
The GetEventReceiver command is used to verify the values that were set
into an Event Generator using the SetEventReceiver command.
Change-Id: I411cc939d00bc69867507fe58911c813d0c1e2ae
Signed-off-by: Roger G. Coscojuela <roger.gili-coscojuela@sipearl.com>
diff --git a/tests/dsp/platform.cpp b/tests/dsp/platform.cpp
index 0586c2e..1cfdb0a 100644
--- a/tests/dsp/platform.cpp
+++ b/tests/dsp/platform.cpp
@@ -6,6 +6,7 @@
#include <array>
#include <cerrno>
+#include <cstddef>
#include <cstdint>
#include <cstring>
#include <vector>
@@ -3592,6 +3593,129 @@
EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
}
+#ifdef LIBPLDM_API_TESTING
+TEST(GetEventReceiver, testGoodEncodeRequest)
+{
+ std::array<uint8_t, hdrSize> requestMsg{};
+ // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast)
+ auto request = new (requestMsg.data()) pldm_msg;
+ auto rc =
+ encode_get_event_receiver_req(0, request, sizeof(struct pldm_msg));
+ ASSERT_EQ(rc, 0);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(GetEventReceiver, testBadEncodeRequest)
+{
+ auto rc =
+ encode_get_event_receiver_req(0, nullptr, sizeof(struct pldm_msg));
+ EXPECT_EQ(rc, -EINVAL);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(GetEventReceiver, testGoodEncodeResponse)
+{
+ struct pldm_get_event_receiver_resp request_event_receiver_values;
+ request_event_receiver_values.completion_code = 0;
+ request_event_receiver_values.transport_protocol_type =
+ PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
+ request_event_receiver_values.event_receiver_address.mctp_eid = 84;
+ size_t payload_lenght = PLDM_GET_EVENT_RECEIVER_MIN_RESP_BYTES + 1;
+ std::array<uint8_t, hdrSize + sizeof(pldm_get_event_receiver_resp)>
+ responseMsg{};
+ auto response = new (responseMsg.data()) pldm_msg;
+ auto rc = encode_get_event_receiver_resp(0, &request_event_receiver_values,
+ response, &payload_lenght);
+ EXPECT_EQ(rc, 0);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(GetEventReceiver, testBadEncodeResponse)
+{
+ std::array<uint8_t, hdrSize + sizeof(pldm_get_event_receiver_resp)>
+ responseMsg{};
+ auto response = new (responseMsg.data()) pldm_msg;
+ struct pldm_get_event_receiver_resp request_event_receiver_values;
+ request_event_receiver_values.completion_code = 0;
+ request_event_receiver_values.transport_protocol_type =
+ PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
+ request_event_receiver_values.event_receiver_address.mctp_eid = 64;
+ size_t payload_lenght = PLDM_GET_EVENT_RECEIVER_MIN_RESP_BYTES;
+ // msg can not be null
+ auto rc = encode_get_event_receiver_resp(0, &request_event_receiver_values,
+ nullptr, &payload_lenght);
+ EXPECT_EQ(rc, -EINVAL);
+ // unsupported protocol
+ request_event_receiver_values.transport_protocol_type = 1;
+ rc = encode_get_event_receiver_resp(0, &request_event_receiver_values,
+ response, &payload_lenght);
+ EXPECT_EQ(rc, -ENOTSUP);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(GetEventReceiver, testGoodDecodeResponse)
+{
+ struct pldm_get_event_receiver_resp request_event_receiver_values;
+ request_event_receiver_values.completion_code = 0;
+ request_event_receiver_values.transport_protocol_type =
+ PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
+ request_event_receiver_values.event_receiver_address.mctp_eid = 34;
+ size_t payload_lenght = PLDM_GET_EVENT_RECEIVER_MIN_RESP_BYTES + 1;
+ struct pldm_get_event_receiver_resp decoded_resp;
+ std::array<uint8_t, hdrSize + sizeof(pldm_get_event_receiver_resp)>
+ responseMsg{};
+ auto response = new (responseMsg.data()) pldm_msg;
+ auto rc = encode_get_event_receiver_resp(0, &request_event_receiver_values,
+ response, &payload_lenght);
+ EXPECT_EQ(rc, 0);
+ rc = decode_get_event_receiver_resp(
+ response, PLDM_GET_EVENT_RECEIVER_MIN_RESP_BYTES + 1, &decoded_resp);
+ EXPECT_EQ(rc, 0);
+ EXPECT_EQ(decoded_resp.completion_code, PLDM_SUCCESS);
+ EXPECT_EQ(decoded_resp.transport_protocol_type,
+ request_event_receiver_values.transport_protocol_type);
+ EXPECT_EQ(decoded_resp.event_receiver_address.mctp_eid,
+ request_event_receiver_values.event_receiver_address.mctp_eid);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(GetEventReceiver, testBadDecodeResponse)
+{
+ struct pldm_get_event_receiver_resp decoded_resp;
+ struct pldm_get_event_receiver_resp expected_resp;
+ expected_resp.completion_code = 0;
+ expected_resp.transport_protocol_type = PLDM_TRANSPORT_PROTOCOL_TYPE_MCTP;
+ expected_resp.event_receiver_address.mctp_eid = 34;
+ std::array<uint8_t, hdrSize + sizeof(pldm_get_event_receiver_resp)>
+ responseMsg{};
+ auto response = new (responseMsg.data()) pldm_msg;
+ size_t payload_lenght = PLDM_GET_EVENT_RECEIVER_MIN_RESP_BYTES + 1;
+ auto rc = encode_get_event_receiver_resp(0, &expected_resp, response,
+ &payload_lenght);
+ EXPECT_EQ(rc, 0);
+ // message can not be null
+ rc = decode_get_event_receiver_resp(
+ nullptr, responseMsg.size() - sizeof(pldm_msg_hdr), &decoded_resp);
+ EXPECT_EQ(rc, -EINVAL);
+ // Allocated less than expected
+ rc = decode_get_event_receiver_resp(
+ response, PLDM_GET_EVENT_RECEIVER_MIN_RESP_BYTES - 1, &decoded_resp);
+ EXPECT_EQ(rc, -EOVERFLOW);
+ // Not supported protocol
+ size_t transport_protocol_type_offset = hdrSize + 1;
+ // Manually modify the transport_protocol_type to a not supported one
+ responseMsg[transport_protocol_type_offset] = 1;
+ rc = decode_get_event_receiver_resp(
+ response, responseMsg.size() - sizeof(pldm_msg_hdr), &decoded_resp);
+ EXPECT_EQ(rc, -ENOTSUP);
+}
+#endif
+
TEST(SetEventReceiver, testGoodEncodeRequest)
{
uint8_t eventMessageGlobalEnable =