pldmd: implement a new handler registration scheme

Implement a PLDM request handler registration scheme that requires
handlers to be C++ objects rather than plain functions. This was needed
for a couple of reasons:

- Perform specific actions at the PLDM daemon startup (that's when the
  handlers are loaded).
- Share data across PLDM request messages (for eg FRU/BIOS tables),
  without having to resort to globals and statics.

Tested:
- existing unit tests still pass
- added tests for the new registration scheme

Signed-off-by: Deepak Kodihalli <dkodihal@in.ibm.com>
Change-Id: I1cf1c0a6fccd15da54f08120e61a5f256df6bc36
diff --git a/oem/ibm/libpldmresponder/file_io.cpp b/oem/ibm/libpldmresponder/file_io.cpp
index 05051b6..963a6b6 100644
--- a/oem/ibm/libpldmresponder/file_io.cpp
+++ b/oem/ibm/libpldmresponder/file_io.cpp
@@ -5,7 +5,6 @@
 #include "file_io_by_type.hpp"
 #include "file_table.hpp"
 #include "libpldmresponder/utils.hpp"
-#include "registration.hpp"
 #include "xyz/openbmc_project/Common/error.hpp"
 
 #include <fcntl.h>
@@ -31,28 +30,6 @@
 namespace responder
 {
 
-namespace oem_ibm
-{
-
-void registerHandlers()
-{
-    registerHandler(PLDM_OEM, PLDM_GET_FILE_TABLE, std::move(getFileTable));
-    registerHandler(PLDM_OEM, PLDM_READ_FILE_INTO_MEMORY,
-                    std::move(readFileIntoMemory));
-    registerHandler(PLDM_OEM, PLDM_WRITE_FILE_FROM_MEMORY,
-                    std::move(writeFileFromMemory));
-    registerHandler(PLDM_OEM, PLDM_READ_FILE, std::move(readFile));
-    registerHandler(PLDM_OEM, PLDM_WRITE_FILE, std::move(writeFile));
-    registerHandler(PLDM_OEM, PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY,
-                    std::move(writeFileByTypeFromMemory));
-    registerHandler(PLDM_OEM, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY,
-                    std::move(readFileByTypeIntoMemory));
-    registerHandler(PLDM_OEM, PLDM_READ_FILE_BY_TYPE,
-                    std::move(readFileByType));
-}
-
-} // namespace oem_ibm
-
 namespace fs = std::filesystem;
 using namespace phosphor::logging;
 
@@ -173,7 +150,11 @@
 
 } // namespace dma
 
-Response readFileIntoMemory(const pldm_msg* request, size_t payloadLength)
+namespace oem_ibm
+{
+
+Response Handler::readFileIntoMemory(const pldm_msg* request,
+                                     size_t payloadLength)
 {
     uint32_t fileHandle = 0;
     uint32_t offset = 0;
@@ -254,7 +235,8 @@
                             request->hdr.instance_id);
 }
 
-Response writeFileFromMemory(const pldm_msg* request, size_t payloadLength)
+Response Handler::writeFileFromMemory(const pldm_msg* request,
+                                      size_t payloadLength)
 {
     uint32_t fileHandle = 0;
     uint32_t offset = 0;
@@ -330,7 +312,7 @@
                             request->hdr.instance_id);
 }
 
-Response getFileTable(const pldm_msg* request, size_t payloadLength)
+Response Handler::getFileTable(const pldm_msg* request, size_t payloadLength)
 {
     uint32_t transferHandle = 0;
     uint8_t transferFlag = 0;
@@ -385,7 +367,7 @@
     return response;
 }
 
-Response readFile(const pldm_msg* request, size_t payloadLength)
+Response Handler::readFile(const pldm_msg* request, size_t payloadLength)
 {
     uint32_t fileHandle = 0;
     uint32_t offset = 0;
@@ -465,7 +447,7 @@
     return response;
 }
 
-Response writeFile(const pldm_msg* request, size_t payloadLength)
+Response Handler::writeFile(const pldm_msg* request, size_t payloadLength)
 {
     uint32_t fileHandle = 0;
     uint32_t offset = 0;
@@ -601,20 +583,21 @@
     return response;
 }
 
-Response writeFileByTypeFromMemory(const pldm_msg* request,
-                                   size_t payloadLength)
+Response Handler::writeFileByTypeFromMemory(const pldm_msg* request,
+                                            size_t payloadLength)
 {
     return rwFileByTypeIntoMemory(PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY, request,
                                   payloadLength);
 }
 
-Response readFileByTypeIntoMemory(const pldm_msg* request, size_t payloadLength)
+Response Handler::readFileByTypeIntoMemory(const pldm_msg* request,
+                                           size_t payloadLength)
 {
     return rwFileByTypeIntoMemory(PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, request,
                                   payloadLength);
 }
 
-Response readFileByType(const pldm_msg* request, size_t payloadLength)
+Response Handler::readFileByType(const pldm_msg* request, size_t payloadLength)
 {
     Response response(sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_RESP_BYTES);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
@@ -661,5 +644,6 @@
     return response;
 }
 
+} // namespace oem_ibm
 } // namespace responder
 } // namespace pldm
diff --git a/oem/ibm/libpldmresponder/file_io.hpp b/oem/ibm/libpldmresponder/file_io.hpp
index 07a13aa..231222c 100644
--- a/oem/ibm/libpldmresponder/file_io.hpp
+++ b/oem/ibm/libpldmresponder/file_io.hpp
@@ -1,5 +1,7 @@
 #pragma once
 
+#include "handler.hpp"
+
 #include <stdint.h>
 #include <unistd.h>
 
@@ -11,19 +13,8 @@
 
 namespace pldm
 {
-
 namespace responder
 {
-
-namespace oem_ibm
-{
-/** @brief Register handlers for command from the platform spec
- */
-void registerHandlers();
-} // namespace oem_ibm
-
-using Response = std::vector<uint8_t>;
-
 namespace dma
 {
 
@@ -121,79 +112,128 @@
 
 } // namespace dma
 
-/** @brief Handler for readFileIntoMemory command
- *
- *  @param[in] request - pointer to PLDM request payload
- *  @param[in] payloadLength - length of the message
- *
- *  @return PLDM response message
- */
-Response readFileIntoMemory(const pldm_msg* request, size_t payloadLength);
+namespace oem_ibm
+{
 
-/** @brief Handler for writeFileIntoMemory command
- *
- *  @param[in] request - pointer to PLDM request payload
- *  @param[in] payloadLength - length of the message
- *
- *  @return PLDM response message
- */
-Response writeFileFromMemory(const pldm_msg* request, size_t payloadLength);
+class Handler : public CmdHandler
+{
+  public:
+    Handler()
+    {
+        handlers.emplace(PLDM_READ_FILE_INTO_MEMORY,
+                         [this](const pldm_msg* request, size_t payloadLength) {
+                             return this->readFileIntoMemory(request,
+                                                             payloadLength);
+                         });
+        handlers.emplace(PLDM_WRITE_FILE_FROM_MEMORY,
+                         [this](const pldm_msg* request, size_t payloadLength) {
+                             return this->writeFileFromMemory(request,
+                                                              payloadLength);
+                         });
+        handlers.emplace(PLDM_WRITE_FILE_BY_TYPE_FROM_MEMORY,
+                         [this](const pldm_msg* request, size_t payloadLength) {
+                             return this->writeFileByTypeFromMemory(
+                                 request, payloadLength);
+                         });
+        handlers.emplace(PLDM_READ_FILE_BY_TYPE_INTO_MEMORY,
+                         [this](const pldm_msg* request, size_t payloadLength) {
+                             return this->readFileByTypeIntoMemory(
+                                 request, payloadLength);
+                         });
+        handlers.emplace(PLDM_READ_FILE_BY_TYPE, [this](const pldm_msg* request,
+                                                        size_t payloadLength) {
+            return this->readFileByType(request, payloadLength);
+        });
+        handlers.emplace(PLDM_GET_FILE_TABLE,
+                         [this](const pldm_msg* request, size_t payloadLength) {
+                             return this->getFileTable(request, payloadLength);
+                         });
+        handlers.emplace(PLDM_READ_FILE,
+                         [this](const pldm_msg* request, size_t payloadLength) {
+                             return this->readFile(request, payloadLength);
+                         });
+        handlers.emplace(PLDM_WRITE_FILE,
+                         [this](const pldm_msg* request, size_t payloadLength) {
+                             return this->writeFile(request, payloadLength);
+                         });
+    }
 
-/** @brief Handler for writeFileByTypeFromMemory command
- *
- *  @param[in] request - pointer to PLDM request payload
- *  @param[in] payloadLength - length of the message
- *
- *  @return PLDM response message
- */
+    /** @brief Handler for readFileIntoMemory command
+     *
+     *  @param[in] request - pointer to PLDM request payload
+     *  @param[in] payloadLength - length of the message
+     *
+     *  @return PLDM response message
+     */
+    Response readFileIntoMemory(const pldm_msg* request, size_t payloadLength);
 
-Response writeFileByTypeFromMemory(const pldm_msg* request,
-                                   size_t payloadLength);
+    /** @brief Handler for writeFileIntoMemory command
+     *
+     *  @param[in] request - pointer to PLDM request payload
+     *  @param[in] payloadLength - length of the message
+     *
+     *  @return PLDM response message
+     */
+    Response writeFileFromMemory(const pldm_msg* request, size_t payloadLength);
 
-/** @brief Handler for readFileByTypeIntoMemory command
- *
- *  @param[in] request - pointer to PLDM request payload
- *  @param[in] payloadLength - length of the message
- *
- *  @return PLDM response message
- */
-Response readFileByTypeIntoMemory(const pldm_msg* request,
-                                  size_t payloadLength);
+    /** @brief Handler for writeFileByTypeFromMemory command
+     *
+     *  @param[in] request - pointer to PLDM request payload
+     *  @param[in] payloadLength - length of the message
+     *
+     *  @return PLDM response message
+     */
 
-/** @brief Handler for readFileByType command
- *
- *  @param[in] request - pointer to PLDM request payload
- *  @param[in] payloadLength - length of the message
- *
- *  @return PLDM response message
- */
-Response readFileByType(const pldm_msg* request, size_t payloadLength);
+    Response writeFileByTypeFromMemory(const pldm_msg* request,
+                                       size_t payloadLength);
 
-/** @brief Handler for GetFileTable command
- *
- *  @param[in] request - pointer to PLDM request payload
- *  @param[in] payloadLength - length of the message payload
- *
- *  @return PLDM response message
- */
-Response getFileTable(const pldm_msg* request, size_t payloadLength);
+    /** @brief Handler for readFileByTypeIntoMemory command
+     *
+     *  @param[in] request - pointer to PLDM request payload
+     *  @param[in] payloadLength - length of the message
+     *
+     *  @return PLDM response message
+     */
+    Response readFileByTypeIntoMemory(const pldm_msg* request,
+                                      size_t payloadLength);
 
-/** @brief Handler for readFile command
- *
- *  @param[in] request - PLDM request msg
- *  @param[in] payloadLength - length of the message payload
- *
- *  @return PLDM response message
- */
-Response readFile(const pldm_msg* request, size_t payloadLength);
+    /** @brief Handler for readFileByType command
+     *
+     *  @param[in] request - pointer to PLDM request payload
+     *  @param[in] payloadLength - length of the message
+     *
+     *  @return PLDM response message
+     */
+    Response readFileByType(const pldm_msg* request, size_t payloadLength);
 
-/** @brief Handler for writeFile command
- *
- *  @param[in] request - PLDM request msg
- *  @param[in] payloadLength - length of the message payload
- *
- *  @return PLDM response message
- */
-Response writeFile(const pldm_msg* request, size_t payloadLength);
+    /** @brief Handler for GetFileTable command
+     *
+     *  @param[in] request - pointer to PLDM request payload
+     *  @param[in] payloadLength - length of the message payload
+     *
+     *  @return PLDM response message
+     */
+    Response getFileTable(const pldm_msg* request, size_t payloadLength);
+
+    /** @brief Handler for readFile command
+     *
+     *  @param[in] request - PLDM request msg
+     *  @param[in] payloadLength - length of the message payload
+     *
+     *  @return PLDM response message
+     */
+    Response readFile(const pldm_msg* request, size_t payloadLength);
+
+    /** @brief Handler for writeFile command
+     *
+     *  @param[in] request - PLDM request msg
+     *  @param[in] payloadLength - length of the message payload
+     *
+     *  @return PLDM response message
+     */
+    Response writeFile(const pldm_msg* request, size_t payloadLength);
+};
+
+} // namespace oem_ibm
 } // namespace responder
 } // namespace pldm
diff --git a/oem/ibm/test/libpldmresponder_fileio_test.cpp b/oem/ibm/test/libpldmresponder_fileio_test.cpp
index 3894ff3..e62e8e1 100644
--- a/oem/ibm/test/libpldmresponder_fileio_test.cpp
+++ b/oem/ibm/test/libpldmresponder_fileio_test.cpp
@@ -20,6 +20,7 @@
 namespace fs = std::filesystem;
 using Json = nlohmann::json;
 using namespace pldm::filetable;
+using namespace pldm::responder;
 
 class TestFileTable : public testing::Test
 {
@@ -213,7 +214,8 @@
            &address, sizeof(address));
 
     // Pass invalid payload length
-    auto response = readFileIntoMemory(request, 0);
+    oem_ibm::Handler handler;
+    auto response = handler.readFileIntoMemory(request, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
 }
@@ -242,7 +244,8 @@
     // Initialise the file table with 2 valid file handles 0 & 1.
     auto& table = buildFileTable(fileTableConfig.c_str());
 
-    auto response = readFileIntoMemory(request, requestPayloadLength);
+    oem_ibm::Handler handler;
+    auto response = handler.readFileIntoMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
     // Clear the file table contents.
@@ -272,7 +275,8 @@
     using namespace pldm::filetable;
     auto& table = buildFileTable(fileTableConfig.c_str());
 
-    auto response = readFileIntoMemory(request, requestPayloadLength);
+    oem_ibm::Handler handler;
+    auto response = handler.readFileIntoMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
     // Clear the file table contents.
@@ -302,7 +306,8 @@
     using namespace pldm::filetable;
     auto& table = buildFileTable(fileTableConfig.c_str());
 
-    auto response = readFileIntoMemory(request, requestPayloadLength);
+    oem_ibm::Handler handler;
+    auto response = handler.readFileIntoMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_READ_LENGTH);
     // Clear the file table contents.
@@ -335,7 +340,8 @@
     using namespace pldm::filetable;
     auto& table = buildFileTable(fileTableConfig.c_str());
 
-    auto response = readFileIntoMemory(request, requestPayloadLength);
+    oem_ibm::Handler handler;
+    auto response = handler.readFileIntoMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_READ_LENGTH);
     // Clear the file table contents.
@@ -362,12 +368,13 @@
            &address, sizeof(address));
 
     // Pass invalid payload length
-    auto response = writeFileFromMemory(request, 0);
+    oem_ibm::Handler handler;
+    auto response = handler.writeFileFromMemory(request, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
 
     // The length field is not a multiple of DMA minsize
-    response = writeFileFromMemory(request, requestPayloadLength);
+    response = handler.writeFileFromMemory(request, requestPayloadLength);
     responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_WRITE_LENGTH);
 }
@@ -396,7 +403,8 @@
     // Initialise the file table with 2 valid file handles 0 & 1.
     auto& table = buildFileTable(fileTableConfig.c_str());
 
-    auto response = writeFileFromMemory(request, requestPayloadLength);
+    oem_ibm::Handler handler;
+    auto response = handler.writeFileFromMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
     // Clear the file table contents.
@@ -427,7 +435,8 @@
     // Initialise the file table with 2 valid file handles 0 & 1.
     auto& table = buildFileTable(TestFileTable::fileTableConfig.c_str());
 
-    auto response = writeFileFromMemory(request, requestPayloadLength);
+    oem_ibm::Handler handler;
+    auto response = handler.writeFileFromMemory(request, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
     // Clear the file table contents.
@@ -495,7 +504,8 @@
     request->operation_flag = opFlag;
     request->table_type = type;
 
-    auto response = getFileTable(requestMsgPtr, requestPayloadLength);
+    oem_ibm::Handler handler;
+    auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_SUCCESS);
     size_t offsetSize = sizeof(responsePtr->payload[0]);
@@ -517,7 +527,8 @@
     auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
 
     // Pass invalid command payload length
-    auto response = getFileTable(request, 0);
+    oem_ibm::Handler handler;
+    auto response = handler.getFileTable(request, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
 }
@@ -538,7 +549,8 @@
     request->operation_flag = opFlag;
     request->table_type = type;
 
-    auto response = getFileTable(requestMsgPtr, requestPayloadLength);
+    oem_ibm::Handler handler;
+    auto response = handler.getFileTable(requestMsgPtr, requestPayloadLength);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_TABLE_TYPE);
 }
@@ -565,21 +577,22 @@
     auto& table = buildFileTable(fileTableConfig.c_str());
 
     // Invalid payload length
-    auto response = readFile(requestMsgPtr, 0);
+    oem_ibm::Handler handler;
+    auto response = handler.readFile(requestMsgPtr, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
 
     // Data out of range. File size is 1024, offset = 1024 is invalid.
     request->offset = 1024;
 
-    response = readFile(requestMsgPtr, payload_length);
+    response = handler.readFile(requestMsgPtr, payload_length);
     responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
 
     // Invalid file handle
     request->file_handle = 2;
 
-    response = readFile(requestMsgPtr, payload_length);
+    response = handler.readFile(requestMsgPtr, payload_length);
     responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
 
@@ -614,7 +627,8 @@
     std::vector<char> buffer(length);
     stream.read(buffer.data(), length);
 
-    auto responseMsg = readFile(requestMsgPtr, payload_length);
+    oem_ibm::Handler handler;
+    auto responseMsg = handler.readFile(requestMsgPtr, payload_length);
     auto response = reinterpret_cast<pldm_read_file_resp*>(
         responseMsg.data() + sizeof(pldm_msg_hdr));
     ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
@@ -630,7 +644,7 @@
     buffer.resize(fileSize - request->offset);
     stream.read(buffer.data(), (fileSize - request->offset));
 
-    responseMsg = readFile(requestMsgPtr, payload_length);
+    responseMsg = handler.readFile(requestMsgPtr, payload_length);
     response = reinterpret_cast<pldm_read_file_resp*>(responseMsg.data() +
                                                       sizeof(pldm_msg_hdr));
     ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
@@ -663,21 +677,22 @@
     request->length = length;
 
     // Invalid payload length
-    auto response = writeFile(requestMsgPtr, 0);
+    oem_ibm::Handler handler;
+    auto response = handler.writeFile(requestMsgPtr, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR_INVALID_LENGTH);
 
     // Data out of range. File size is 1024, offset = 1024 is invalid.
     request->offset = 1024;
 
-    response = writeFile(requestMsgPtr, payload_length);
+    response = handler.writeFile(requestMsgPtr, payload_length);
     responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_DATA_OUT_OF_RANGE);
 
     // Invalid file handle
     request->file_handle = 2;
 
-    response = writeFile(requestMsgPtr, payload_length);
+    response = handler.writeFile(requestMsgPtr, payload_length);
     responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     ASSERT_EQ(responsePtr->payload[0], PLDM_INVALID_FILE_HANDLE);
 
@@ -709,7 +724,8 @@
     request->length = length;
     memcpy(request->file_data, fileData.data(), fileData.size());
 
-    auto responseMsg = writeFile(requestMsgPtr, payload_length);
+    oem_ibm::Handler handler;
+    auto responseMsg = handler.writeFile(requestMsgPtr, payload_length);
     auto response = reinterpret_cast<pldm_read_file_resp*>(
         responseMsg.data() + sizeof(pldm_msg_hdr));
 
@@ -741,7 +757,8 @@
     request->length = 17;
     request->address = 0;
 
-    auto response = writeFileByTypeFromMemory(req, 0);
+    oem_ibm::Handler handler;
+    auto response = handler.writeFileByTypeFromMemory(req, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
 
     struct pldm_read_write_file_by_type_memory_resp* resp =
@@ -749,7 +766,7 @@
             responsePtr->payload);
     ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
 
-    response = writeFileByTypeFromMemory(req, requestPayloadLength);
+    response = handler.writeFileByTypeFromMemory(req, requestPayloadLength);
     responsePtr = reinterpret_cast<pldm_msg*>(response.data());
 
     resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
@@ -792,23 +809,24 @@
     request->length = 17;
     request->address = 0;
 
-    auto response = readFileByTypeIntoMemory(req, 0);
+    oem_ibm::Handler handler;
+    auto response = handler.readFileByTypeIntoMemory(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 =
-        readFileByTypeIntoMemory(req, PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES);
+    response = handler.readFileByTypeIntoMemory(
+        req, PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES);
     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);
 
     request->length = 16;
-    response =
-        readFileByTypeIntoMemory(req, PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES);
+    response = handler.readFileByTypeIntoMemory(
+        req, PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES);
     responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     resp = reinterpret_cast<struct pldm_read_write_file_by_type_memory_resp*>(
         responsePtr->payload);
@@ -829,14 +847,15 @@
     request->offset = 0;
     request->length = 13;
 
-    auto response = readFileByType(req, 0);
+    oem_ibm::Handler handler;
+    auto response = handler.readFileByType(req, 0);
     auto responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     struct pldm_read_write_file_by_type_resp* resp =
         reinterpret_cast<struct pldm_read_write_file_by_type_resp*>(
             responsePtr->payload);
     ASSERT_EQ(PLDM_ERROR_INVALID_LENGTH, resp->completion_code);
 
-    response = readFileByType(req, payloadLength);
+    response = handler.readFileByType(req, payloadLength);
     responsePtr = reinterpret_cast<pldm_msg*>(response.data());
     resp = reinterpret_cast<struct pldm_read_write_file_by_type_resp*>(
         responsePtr->payload);