oem-ibm: implement WriteFileByTypeFromMemory handler

This commit implements a framework for handling oem file types
received to/from host. Along with that it also implements the responder
for oem command WriteFileByTypeFromMemory and processes PELs received
from the host firmware.

Change-Id: Ice866aed0343b90769013c4be31a0c730f6e6bcd
Signed-off-by: Sampa Misra <sampmisr@in.ibm.com>
diff --git a/oem/ibm/test/libpldmresponder_fileio_test.cpp b/oem/ibm/test/libpldmresponder_fileio_test.cpp
index 3ebf96a..603c0c6 100644
--- a/oem/ibm/test/libpldmresponder_fileio_test.cpp
+++ b/oem/ibm/test/libpldmresponder_fileio_test.cpp
@@ -1,9 +1,13 @@
 #include "libpldmresponder/file_io.hpp"
+#include "libpldmresponder/file_io_by_type.hpp"
+#include "libpldmresponder/file_io_type_pel.hpp"
 #include "libpldmresponder/file_table.hpp"
+#include "xyz/openbmc_project/Common/error.hpp"
 
 #include <filesystem>
 #include <fstream>
 #include <nlohmann/json.hpp>
+#include <phosphor-logging/elog-errors.hpp>
 
 #include "libpldm/base.h"
 #include "libpldm/file_io.h"
@@ -719,3 +723,46 @@
 
     table.clear();
 }
+
+TEST(writeFileByTypeFromMemory, testBadPath)
+{
+    const auto hdr_size = sizeof(pldm_msg_hdr);
+    std::array<uint8_t, hdr_size + PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES>
+        requestMsg{};
+    auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    size_t requestPayloadLength = requestMsg.size() - hdr_size;
+    struct pldm_read_write_file_by_type_memory_req* request =
+        reinterpret_cast<struct pldm_read_write_file_by_type_memory_req*>(
+            req->payload);
+    request->file_type = PLDM_FILE_TYPE_PEL;
+    request->file_handle = 0xFFFFFFFF;
+    request->offset = 0;
+    request->length = 17;
+    request->address = 0;
+
+    auto response = writeFileByTypeFromMemory(req, 0);
+    auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
+
+    struct pldm_read_write_file_by_type_memory_resp* resp =
+        reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
+            responsePtr->payload);
+    ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
+
+    response = writeFileByTypeFromMemory(req, requestPayloadLength);
+    responsePtr = reinterpret_cast<pldm_msg*>(response.data());
+
+    resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
+        responsePtr->payload);
+    ASSERT_EQ(PLDM_INVALID_WRITE_LENGTH, resp->completion_code);
+}
+
+TEST(getHandlerByType, allPaths)
+{
+    uint32_t fileHandle{};
+    auto handler = getHandlerByType(PLDM_FILE_TYPE_PEL, fileHandle);
+    auto pelType = dynamic_cast<PelHandler*>(handler.get());
+    ASSERT_TRUE(pelType != nullptr);
+
+    using namespace sdbusplus::xyz::openbmc_project::Common::Error;
+    ASSERT_THROW(getHandlerByType(0xFFFF, fileHandle), InternalFailure);
+}