oem: meta: Add encode_oem_meta_file_io_read_resp()

Add encode_oem_meta_file_io_read_resp function

This function is used to encode the message of reading file IO.
Assemble responses to read file IO messages, but the response
content other than the completion code needs to be additionally
appended.

Change-Id: Ib030ac9f37fe73b66fb762dcf8b8297bce79836a
Signed-off-by: Lora Lin <lora.lin.wiwynn@gmail.com>
diff --git a/tests/oem/meta/fileio.cpp b/tests/oem/meta/fileio.cpp
index a40e43b..de004a4 100644
--- a/tests/oem/meta/fileio.cpp
+++ b/tests/oem/meta/fileio.cpp
@@ -7,6 +7,7 @@
 
 #include "msgbuf.h"
 
+#include "gmock/gmock.h"
 #include <gtest/gtest.h>
 
 #ifdef LIBPLDM_API_TESTING
@@ -158,3 +159,108 @@
     EXPECT_EQ(rc, -EOVERFLOW);
 }
 #endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(EncodeOemMetaFileIoReadResp, testGoodEncodeReadAttrResponse)
+{
+    int rc;
+
+    alignas(pldm_oem_meta_file_io_read_resp) unsigned char
+        decodedBuf[sizeof(pldm_oem_meta_file_io_read_resp)];
+    auto* resp = new (decodedBuf) pldm_oem_meta_file_io_read_resp;
+    resp->version = sizeof(struct pldm_oem_meta_file_io_read_resp);
+    resp->completion_code = PLDM_SUCCESS;
+    resp->handle = 1;
+    resp->option = PLDM_OEM_META_FILE_IO_READ_ATTR;
+    resp->length = 0;
+    resp->info.attr.size = 0x1284;
+    resp->info.attr.crc32 = 0xab715432;
+
+    constexpr size_t payloadLen = PLDM_OEM_META_FILE_IO_READ_RESP_MIN_SIZE +
+                                  PLDM_OEM_META_FILE_IO_READ_ATTR_INFO_LENGTH;
+    alignas(pldm_msg) unsigned char
+        encodedBuf[sizeof(pldm_msg_hdr) + payloadLen] = {};
+    auto* msg = new (encodedBuf) pldm_msg;
+
+    rc = encode_oem_meta_file_io_read_resp(
+        0, resp, sizeof(pldm_oem_meta_file_io_read_resp), msg, payloadLen);
+    ASSERT_EQ(rc, 0);
+
+    EXPECT_THAT(encodedBuf, testing::ElementsAreArray(
+                                {0x00, 0x3f, 0x03, 0x00, 0x01, 0x00, 0x00, 0x84,
+                                 0x12, 0x32, 0x54, 0x71, 0xab}));
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(EncodeOemMetaFileIoReadResp, testGoodEncodeReadDataResponse)
+{
+    constexpr static const uint8_t readbuf[4] = {0x23, 0xca, 0x84, 0x9d};
+    int rc;
+
+    alignas(pldm_oem_meta_file_io_read_resp) unsigned char
+        decodedBuf[sizeof(pldm_oem_meta_file_io_read_resp) + sizeof(readbuf)];
+    auto* resp = new (decodedBuf) pldm_oem_meta_file_io_read_resp;
+    resp->version = sizeof(struct pldm_oem_meta_file_io_read_resp);
+    resp->completion_code = PLDM_SUCCESS;
+    resp->handle = 1;
+    resp->option = PLDM_OEM_META_FILE_IO_READ_DATA;
+    resp->length = 4;
+    resp->info.data.transferFlag = 0x05;
+    resp->info.data.offset = 0x75cd;
+    memcpy(pldm_oem_meta_file_io_read_resp_data(resp), readbuf,
+           sizeof(readbuf));
+
+    constexpr size_t payloadLen = PLDM_OEM_META_FILE_IO_READ_RESP_MIN_SIZE +
+                                  PLDM_OEM_META_FILE_IO_READ_DATA_INFO_LENGTH +
+                                  sizeof(readbuf);
+    alignas(pldm_msg) unsigned char
+        encodedBuf[sizeof(pldm_msg_hdr) + payloadLen] = {};
+    auto* msg = new (encodedBuf) pldm_msg;
+
+    rc = encode_oem_meta_file_io_read_resp(
+        0, resp, sizeof(pldm_oem_meta_file_io_read_resp) + sizeof(readbuf), msg,
+        payloadLen);
+    ASSERT_EQ(rc, 0);
+
+    EXPECT_THAT(encodedBuf, testing::ElementsAreArray(
+                                {0x00, 0x3f, 0x03, 0x00, 0x01, 0x01, 0x04, 0x05,
+                                 0xcd, 0x75, 0x23, 0xca, 0x84, 0x9d}));
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(EncodeOemMetaFileIoReadResp, testInvalidFieldsEncodeResponse)
+{
+    struct pldm_msg msg = {};
+
+    auto rc = encode_oem_meta_file_io_read_resp(
+        0, NULL, 0, &msg, PLDM_OEM_META_FILE_IO_READ_RESP_MIN_SIZE);
+    EXPECT_EQ(rc, -EINVAL);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(EncodeOemMetaFileIoReadResp, testInvalidLengthEncodeResponse)
+{
+    struct pldm_oem_meta_file_io_read_resp resp = {};
+    struct pldm_msg msg = {};
+
+    auto rc =
+        encode_oem_meta_file_io_read_resp(0, &resp, sizeof(resp), &msg, 0);
+    EXPECT_EQ(rc, -EOVERFLOW);
+}
+#endif
+
+#ifdef LIBPLDM_API_TESTING
+TEST(EncodeOemMetaFileIoReadResp, testInvalidDataEncodeResponse)
+{
+    struct pldm_oem_meta_file_io_read_resp resp = {};
+    struct pldm_msg msg = {};
+
+    auto rc = encode_oem_meta_file_io_read_resp(
+        0, &resp, sizeof(resp), &msg,
+        PLDM_OEM_META_FILE_IO_READ_RESP_MIN_SIZE - 1);
+    EXPECT_EQ(rc, -EOVERFLOW);
+}
+#endif