diff --git a/.gitignore b/.gitignore
index 8ad1400..516b46f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
 subprojects/*
+!subprojects/libpldm*
 !subprojects/*.wrap
 
 # Template from
diff --git a/fw-update/inventory_manager.hpp b/fw-update/inventory_manager.hpp
index a14d58c..c71130b 100644
--- a/fw-update/inventory_manager.hpp
+++ b/fw-update/inventory_manager.hpp
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "common/types.hpp"
 #include "pldmd/dbus_impl_requester.hpp"
diff --git a/fw-update/manager.hpp b/fw-update/manager.hpp
index 9bdcbe2..8b09026 100644
--- a/fw-update/manager.hpp
+++ b/fw-update/manager.hpp
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "activation.hpp"
 #include "common/types.hpp"
diff --git a/fw-update/update_manager.hpp b/fw-update/update_manager.hpp
index 5d4fe47..e33ab56 100644
--- a/fw-update/update_manager.hpp
+++ b/fw-update/update_manager.hpp
@@ -1,7 +1,7 @@
 #pragma once
 
 #include "libpldm/base.h"
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "common/types.hpp"
 #include "device_updater.hpp"
@@ -133,4 +133,4 @@
 
 } // namespace fw_update
 
-} // namespace pldm
\ No newline at end of file
+} // namespace pldm
diff --git a/host-bmc/dbus_to_event_handler.cpp b/host-bmc/dbus_to_event_handler.cpp
index 9fcf3ba..5501e56 100644
--- a/host-bmc/dbus_to_event_handler.cpp
+++ b/host-bmc/dbus_to_event_handler.cpp
@@ -1,6 +1,6 @@
 #include "dbus_to_event_handler.hpp"
 
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "libpldmresponder/pdr.hpp"
 
diff --git a/host-bmc/dbus_to_host_effecters.cpp b/host-bmc/dbus_to_host_effecters.cpp
index 86c00e8..299abd3 100644
--- a/host-bmc/dbus_to_host_effecters.cpp
+++ b/host-bmc/dbus_to_host_effecters.cpp
@@ -2,7 +2,7 @@
 
 #include "libpldm/pdr.h"
 #include "libpldm/platform.h"
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include <xyz/openbmc_project/Common/error.hpp>
 #include <xyz/openbmc_project/State/OperatingSystem/Status/server.hpp>
diff --git a/host-bmc/host_pdr_handler.cpp b/host-bmc/host_pdr_handler.cpp
index 75d3e61..52b6206 100644
--- a/host-bmc/host_pdr_handler.cpp
+++ b/host-bmc/host_pdr_handler.cpp
@@ -2,7 +2,7 @@
 
 #include "host_pdr_handler.hpp"
 
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include <assert.h>
 
diff --git a/libpldm/meson.build b/libpldm/meson.build
deleted file mode 100644
index 9c719d3..0000000
--- a/libpldm/meson.build
+++ /dev/null
@@ -1,79 +0,0 @@
-headers = [
-  'base.h',
-  'pldm_types.h',
-  'platform.h',
-  'bios.h',
-  'bios_table.h',
-  'entity.h',
-  'states.h',
-  'state_set.h',
-  'fru.h',
-  'utils.h',
-  'pdr.h',
-  'firmware_update.h'
-]
-
-sources = [
-  'base.c',
-  'platform.c',
-  'bios.c',
-  'bios_table.c',
-  'fru.c',
-  'utils.c',
-  'pdr.c',
-  'firmware_update.c'
-]
-
-libpldm_headers = ['.', '..']
-
-if get_option('oem-ibm').enabled()
-  headers += [
-    'oem/ibm/libpldm/entity_oem_ibm.h',
-    'oem/ibm/libpldm/file_io.h',
-    'oem/ibm/libpldm/host.h',
-    'oem/ibm/libpldm/platform_oem_ibm.h',
-    'oem/ibm/libpldm/state_set_oem_ibm.h'
-  ]
-  sources += [
-    'oem/ibm/libpldm/file_io.c',
-    'oem/ibm/libpldm/host.c',
-    'oem/ibm/libpldm/platform_oem_ibm.c'
-  ]
-  libpldm_headers += ['oem/ibm']
-endif
-
-if get_option('requester-api').enabled()
-  headers += [
-    'requester/pldm.h'
-  ]
-  sources += [
-    'requester/pldm.c'
-  ]
-  libpldm_headers += ['requester']
-endif
-
-install_headers(
-  headers,
-  subdir: 'libpldm')
-
-libpldm = library(
-  'pldm',
-  sources,
-  implicit_include_directories: false,
-  include_directories: include_directories(libpldm_headers),
-  version: meson.project_version(),
-  install: true)
-
-libpldm_dep = declare_dependency(
-  include_directories: include_directories(libpldm_headers),
-  link_with: libpldm)
-
-import('pkgconfig').generate(
-  name: 'libpldm',
-  description: 'PLDM protocol encode/decode C lib',
-  version: meson.project_version(),
-  libraries: libpldm)
-
-if get_option('tests').enabled()
-  subdir('tests')
-endif
diff --git a/libpldm/oem/ibm/libpldm/tests/libpldm_fileio_test.cpp b/libpldm/oem/ibm/libpldm/tests/libpldm_fileio_test.cpp
deleted file mode 100644
index 5979ff4..0000000
--- a/libpldm/oem/ibm/libpldm/tests/libpldm_fileio_test.cpp
+++ /dev/null
@@ -1,2180 +0,0 @@
-#include "libpldm/base.h"
-#include "libpldm/file_io.h"
-
-#include <string.h>
-
-#include <array>
-
-#include <gtest/gtest.h>
-
-constexpr auto hdrSize = sizeof(pldm_msg_hdr);
-
-TEST(ReadWriteFileMemory, testGoodDecodeRequest)
-{
-	std::array<uint8_t, PLDM_RW_FILE_MEM_REQ_BYTES + hdrSize> requestMsg{};
-
-	// Random value for fileHandle, offset, length, address
-	uint32_t fileHandle = 0x12345678;
-	uint32_t offset = 0x87654321;
-	uint32_t length = 0x13245768;
-	uint64_t address = 0x124356879ACBDE0F;
-	uint32_t fileHandleLe = htole32(fileHandle);
-	uint32_t offsetLe = htole32(offset);
-	uint32_t lengthLe = htole32(length);
-	uint64_t addressLe = htole64(address);
-
-	memcpy(requestMsg.data() + hdrSize, &fileHandleLe,
-	       sizeof(fileHandleLe));
-	memcpy(requestMsg.data() + sizeof(fileHandleLe) + hdrSize, &offsetLe,
-	       sizeof(offsetLe));
-	memcpy(requestMsg.data() + sizeof(fileHandleLe) + sizeof(offsetLe) +
-		   hdrSize,
-	       &lengthLe, sizeof(lengthLe));
-	memcpy(requestMsg.data() + sizeof(fileHandleLe) + sizeof(offsetLe) +
-		   sizeof(lengthLe) + hdrSize,
-	       &addressLe, sizeof(addressLe));
-
-	uint32_t retFileHandle = 0;
-	uint32_t retOffset = 0;
-	uint32_t retLength = 0;
-	uint64_t retAddress = 0;
-
-	auto request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// Invoke decode the read file memory request
-	auto rc = decode_rw_file_memory_req(
-	    request, requestMsg.size() - hdrSize, &retFileHandle, &retOffset,
-	    &retLength, &retAddress);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(fileHandle, retFileHandle);
-	ASSERT_EQ(offset, retOffset);
-	ASSERT_EQ(length, retLength);
-	ASSERT_EQ(address, retAddress);
-}
-
-TEST(ReadWriteFileMemory, testBadDecodeRequest)
-{
-	uint32_t fileHandle = 0;
-	uint32_t offset = 0;
-	uint32_t length = 0;
-	uint64_t address = 0;
-
-	// Request payload message is missing
-	auto rc = decode_rw_file_memory_req(NULL, 0, &fileHandle, &offset,
-					    &length, &address);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t, PLDM_RW_FILE_MEM_REQ_BYTES> requestMsg{};
-
-	auto request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// Address is NULL
-	rc = decode_rw_file_memory_req(request, requestMsg.size() - hdrSize,
-				       &fileHandle, &offset, &length, NULL);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	// Payload length is invalid
-	rc = decode_rw_file_memory_req(request, 0, &fileHandle, &offset,
-				       &length, &address);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ReadWriteFileMemory, testGoodEncodeResponse)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_RESP_BYTES>
-	    responseMsg{};
-	uint32_t length = 0xFF00EE11;
-	uint32_t lengthLe = htole32(length);
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// ReadFileIntoMemory
-	auto rc = encode_rw_file_memory_resp(0, PLDM_READ_FILE_INTO_MEMORY,
-					     PLDM_SUCCESS, length, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_INTO_MEMORY);
-	ASSERT_EQ(response->payload[0], PLDM_SUCCESS);
-	ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
-			    &lengthLe, sizeof(lengthLe)));
-
-	// WriteFileFromMemory
-	rc = encode_rw_file_memory_resp(0, PLDM_WRITE_FILE_FROM_MEMORY,
-					PLDM_SUCCESS, length, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_WRITE_FILE_FROM_MEMORY);
-	ASSERT_EQ(response->payload[0], PLDM_SUCCESS);
-	ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
-			    &lengthLe, sizeof(lengthLe)));
-}
-
-TEST(ReadWriteFileMemory, testBadEncodeResponse)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_RESP_BYTES>
-	    responseMsg{};
-	uint32_t length = 0;
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// ReadFileIntoMemory
-	auto rc = encode_rw_file_memory_resp(0, PLDM_READ_FILE_INTO_MEMORY,
-					     PLDM_ERROR, length, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_INTO_MEMORY);
-	ASSERT_EQ(response->payload[0], PLDM_ERROR);
-
-	// WriteFileFromMemory
-	rc = encode_rw_file_memory_resp(0, PLDM_WRITE_FILE_FROM_MEMORY,
-					PLDM_ERROR, length, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_WRITE_FILE_FROM_MEMORY);
-	ASSERT_EQ(response->payload[0], PLDM_ERROR);
-}
-
-TEST(ReadWriteFileIntoMemory, testGoodDecodeResponse)
-{
-	std::array<uint8_t, PLDM_RW_FILE_MEM_RESP_BYTES + hdrSize>
-	    responseMsg{};
-	// Random value for length
-	uint32_t length = 0xFF00EE12;
-	uint32_t lengthLe = htole32(length);
-	uint8_t completionCode = 0;
-
-	memcpy(responseMsg.data() + hdrSize, &completionCode,
-	       sizeof(completionCode));
-	memcpy(responseMsg.data() + sizeof(completionCode) + hdrSize, &lengthLe,
-	       sizeof(lengthLe));
-
-	uint8_t retCompletionCode = 0;
-	uint32_t retLength = 0;
-
-	auto response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// Invoke decode the read file memory response
-	auto rc =
-	    decode_rw_file_memory_resp(response, responseMsg.size() - hdrSize,
-				       &retCompletionCode, &retLength);
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(completionCode, retCompletionCode);
-	ASSERT_EQ(length, retLength);
-}
-
-TEST(ReadWriteFileIntoMemory, testBadDecodeResponse)
-{
-	uint32_t length = 0;
-	uint8_t completionCode = 0;
-
-	// Request payload message is missing
-	auto rc = decode_rw_file_memory_resp(NULL, 0, &completionCode, &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t, PLDM_RW_FILE_MEM_RESP_BYTES> responseMsg{};
-
-	auto response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// Payload length is invalid
-	rc = decode_rw_file_memory_resp(response, 0, &completionCode, &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ReadWriteFileIntoMemory, testGoodEncodeRequest)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
-	    requestMsg{};
-
-	uint32_t fileHandle = 0x12345678;
-	uint32_t offset = 0x87654321;
-	uint32_t length = 0x13245768;
-	uint64_t address = 0x124356879ACBDE0F;
-	uint32_t fileHandleLe = htole32(fileHandle);
-	uint32_t offsetLe = htole32(offset);
-	uint32_t lengthLe = htole32(length);
-	uint64_t addressLe = htole64(address);
-
-	pldm_msg *request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	auto rc =
-	    encode_rw_file_memory_req(0, PLDM_READ_FILE_INTO_MEMORY, fileHandle,
-				      offset, length, address, request);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
-	ASSERT_EQ(request->hdr.instance_id, 0);
-	ASSERT_EQ(request->hdr.type, PLDM_OEM);
-	ASSERT_EQ(request->hdr.command, PLDM_READ_FILE_INTO_MEMORY);
-
-	ASSERT_EQ(
-	    0, memcmp(request->payload, &fileHandleLe, sizeof(fileHandleLe)));
-
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileHandleLe), &offsetLe,
-			    sizeof(offsetLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileHandleLe) +
-				sizeof(offsetLe),
-			    &lengthLe, sizeof(lengthLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileHandleLe) +
-				sizeof(offsetLe) + sizeof(lengthLe),
-			    &addressLe, sizeof(addressLe)));
-}
-
-TEST(ReadWriteFileIntoMemory, testBadEncodeRequest)
-{
-	uint32_t fileHandle = 0;
-	uint32_t offset = 0;
-	uint32_t length = 0;
-	uint64_t address = 0;
-
-	auto rc =
-	    encode_rw_file_memory_req(0, PLDM_READ_FILE_INTO_MEMORY, fileHandle,
-				      offset, length, address, NULL);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(GetFileTable, GoodDecodeRequest)
-{
-	std::array<uint8_t, PLDM_GET_FILE_TABLE_REQ_BYTES + hdrSize>
-	    requestMsg{};
-
-	// Random value for DataTransferHandle, TransferOperationFlag, TableType
-	uint32_t transferHandle = 0x12345678;
-	uint32_t transferHandleLe = htole32(transferHandle);
-	uint8_t transferOpFlag = 1;
-	uint8_t tableType = 1;
-
-	memcpy(requestMsg.data() + hdrSize, &transferHandleLe,
-	       sizeof(transferHandleLe));
-	memcpy(requestMsg.data() + sizeof(transferHandle) + hdrSize,
-	       &transferOpFlag, sizeof(transferOpFlag));
-	memcpy(requestMsg.data() + sizeof(transferHandle) +
-		   sizeof(transferOpFlag) + hdrSize,
-	       &tableType, sizeof(tableType));
-
-	uint32_t retTransferHandle = 0;
-	uint8_t retTransferOpFlag = 0;
-	uint8_t retTableType = 0;
-
-	auto request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// Invoke decode get file table request
-	auto rc = decode_get_file_table_req(
-	    request, requestMsg.size() - hdrSize, &retTransferHandle,
-	    &retTransferOpFlag, &retTableType);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(transferHandle, retTransferHandle);
-	ASSERT_EQ(transferOpFlag, retTransferOpFlag);
-	ASSERT_EQ(tableType, retTableType);
-}
-
-TEST(GetFileTable, BadDecodeRequest)
-{
-	uint32_t transferHandle = 0;
-	uint8_t transferOpFlag = 0;
-	uint8_t tableType = 0;
-
-	// Request payload message is missing
-	auto rc = decode_get_file_table_req(nullptr, 0, &transferHandle,
-					    &transferOpFlag, &tableType);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t, PLDM_GET_FILE_TABLE_REQ_BYTES> requestMsg{};
-
-	auto request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// TableType is NULL
-	rc = decode_get_file_table_req(request, requestMsg.size() - hdrSize,
-				       &transferHandle, &transferOpFlag,
-				       nullptr);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	// Payload length is invalid
-	rc = decode_get_file_table_req(request, 0, &transferHandle,
-				       &transferOpFlag, &tableType);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(GetFileTable, GoodEncodeResponse)
-{
-	// Random value for NextDataTransferHandle and TransferFlag
-	uint8_t completionCode = 0;
-	uint32_t nextTransferHandle = 0x87654321;
-	uint32_t nextTransferHandleLe = htole32(nextTransferHandle);
-	uint8_t transferFlag = 5;
-	// Mock file table contents of size 5
-	std::array<uint8_t, 5> fileTable = {1, 2, 3, 4, 5};
-	constexpr size_t responseSize = sizeof(completionCode) +
-					sizeof(nextTransferHandle) +
-					sizeof(transferFlag) + fileTable.size();
-
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + responseSize> responseMsg{};
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// GetFileTable
-	auto rc = encode_get_file_table_resp(
-	    0, PLDM_SUCCESS, nextTransferHandle, transferFlag, fileTable.data(),
-	    fileTable.size(), response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_GET_FILE_TABLE);
-	ASSERT_EQ(response->payload[0], PLDM_SUCCESS);
-	ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
-			    &nextTransferHandleLe, sizeof(nextTransferHandle)));
-	ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
-				sizeof(nextTransferHandle),
-			    &transferFlag, sizeof(transferFlag)));
-	ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
-				sizeof(nextTransferHandle),
-			    &transferFlag, sizeof(transferFlag)));
-	ASSERT_EQ(0,
-		  memcmp(response->payload + sizeof(response->payload[0]) +
-			     sizeof(nextTransferHandle) + sizeof(transferFlag),
-			 fileTable.data(), fileTable.size()));
-}
-
-TEST(GetFileTable, BadEncodeResponse)
-{
-	uint8_t completionCode = 0;
-	uint32_t nextTransferHandle = 0;
-	uint8_t transferFlag = 0;
-	constexpr size_t responseSize = sizeof(completionCode) +
-					sizeof(nextTransferHandle) +
-					sizeof(transferFlag);
-
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + responseSize> responseMsg{};
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// GetFileTable
-	auto rc =
-	    encode_get_file_table_resp(0, PLDM_ERROR, nextTransferHandle,
-				       transferFlag, nullptr, 0, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_GET_FILE_TABLE);
-	ASSERT_EQ(response->payload[0], PLDM_ERROR);
-}
-
-TEST(GetFileTable, GoodEncodeRequest)
-{
-	std::array<uint8_t,
-		   sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
-	    requestMsg{};
-	uint32_t transferHandle = 0x0;
-	uint8_t transferOpFlag = 0x01;
-	uint8_t tableType = PLDM_FILE_ATTRIBUTE_TABLE;
-
-	auto request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	auto rc = encode_get_file_table_req(0, transferHandle, transferOpFlag,
-					    tableType, request);
-	EXPECT_EQ(rc, PLDM_SUCCESS);
-
-	struct pldm_get_file_table_req *req =
-	    reinterpret_cast<struct pldm_get_file_table_req *>(
-		request->payload);
-	EXPECT_EQ(transferHandle, le32toh(req->transfer_handle));
-	EXPECT_EQ(transferOpFlag, req->operation_flag);
-	EXPECT_EQ(tableType, req->table_type);
-}
-
-TEST(GetFileTable, BadEncodeRequest)
-{
-	uint32_t transferHandle = 0x0;
-	uint8_t transferOpFlag = 0x01;
-	uint8_t tableType = PLDM_FILE_ATTRIBUTE_TABLE;
-
-	auto rc = encode_get_file_table_req(0, transferHandle, transferOpFlag,
-					    tableType, nullptr);
-
-	EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(GetFileTable, GoodDecodeResponse)
-{
-	uint32_t nextTransferHandle = 32;
-	uint8_t completionCode = PLDM_SUCCESS;
-	uint8_t transferFlag = PLDM_START_AND_END;
-	std::vector<uint8_t> fileTableData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
-
-	std::vector<uint8_t> responseMsg(hdrSize +
-					 PLDM_GET_FILE_TABLE_MIN_RESP_BYTES +
-					 fileTableData.size());
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	size_t payload_length = responseMsg.size() - hdrSize;
-
-	auto resp = reinterpret_cast<struct pldm_get_file_table_resp *>(
-	    responsePtr->payload);
-
-	resp->completion_code = completionCode;
-	resp->next_transfer_handle = htole32(nextTransferHandle);
-	resp->transfer_flag = transferFlag;
-	memcpy(resp->table_data, fileTableData.data(), fileTableData.size());
-
-	uint8_t retCompletionCode;
-	uint32_t retNextTransferHandle;
-	uint8_t retTransferFlag;
-	std::vector<uint8_t> retFileTableData(9, 0);
-	size_t retFileTableDataLength = 0;
-
-	auto rc = decode_get_file_table_resp(
-	    responsePtr, payload_length, &retCompletionCode,
-	    &retNextTransferHandle, &retTransferFlag, retFileTableData.data(),
-	    &retFileTableDataLength);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(completionCode, retCompletionCode);
-	ASSERT_EQ(nextTransferHandle, retNextTransferHandle);
-	ASSERT_EQ(transferFlag, retTransferFlag);
-	ASSERT_EQ(0, memcmp(fileTableData.data(), resp->table_data,
-			    retFileTableDataLength));
-	ASSERT_EQ(fileTableData.size(), retFileTableDataLength);
-}
-
-TEST(GetFileTable, BadDecodeResponse)
-{
-	uint32_t nextTransferHandle = 32;
-	uint8_t completionCode = PLDM_SUCCESS;
-	uint8_t transferFlag = PLDM_START_AND_END;
-	std::vector<uint8_t> fileTableData(9, 0);
-	size_t file_table_data_length = 0;
-
-	std::vector<uint8_t> responseMsg(hdrSize +
-					 PLDM_GET_FILE_TABLE_MIN_RESP_BYTES +
-					 fileTableData.size());
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	auto rc = decode_get_file_table_resp(
-	    nullptr, 0, &completionCode, &nextTransferHandle, &transferFlag,
-	    fileTableData.data(), &file_table_data_length);
-
-	EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	rc = decode_get_file_table_resp(
-	    responsePtr, 0, &completionCode, &nextTransferHandle, &transferFlag,
-	    fileTableData.data(), &file_table_data_length);
-
-	EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ReadFile, testGoodDecodeRequest)
-{
-	std::array<uint8_t, PLDM_READ_FILE_REQ_BYTES + sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
-	auto request =
-	    reinterpret_cast<pldm_read_file_req *>(requestPtr->payload);
-
-	// Random value for fileHandle, offset and length
-	uint32_t fileHandle = 0x12345678;
-	uint32_t offset = 0x87654321;
-	uint32_t length = 0x13245768;
-
-	request->file_handle = htole32(fileHandle);
-	request->offset = htole32(offset);
-	request->length = htole32(length);
-
-	uint32_t retFileHandle = 0;
-	uint32_t retOffset = 0;
-	uint32_t retLength = 0;
-
-	// Invoke decode the read file request
-	auto rc = decode_read_file_req(requestPtr, payload_length,
-				       &retFileHandle, &retOffset, &retLength);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(fileHandle, retFileHandle);
-	ASSERT_EQ(offset, retOffset);
-	ASSERT_EQ(length, retLength);
-}
-
-TEST(WriteFile, testGoodDecodeRequest)
-{
-	// Random value for fileHandle, offset, length and file data
-	uint32_t fileHandle = 0x12345678;
-	uint32_t offset = 0x87654321;
-	uint32_t length = 0x467;
-
-	std::vector<uint8_t> requestMsg(PLDM_WRITE_FILE_REQ_BYTES +
-					sizeof(pldm_msg_hdr) + length);
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
-	auto request =
-	    reinterpret_cast<pldm_write_file_req *>(requestPtr->payload);
-
-	size_t fileDataOffset =
-	    sizeof(fileHandle) + sizeof(offset) + sizeof(length);
-
-	request->file_handle = htole32(fileHandle);
-	request->offset = htole32(offset);
-	request->length = htole32(length);
-
-	uint32_t retFileHandle = 0;
-	uint32_t retOffset = 0;
-	uint32_t retLength = 0;
-	size_t retFileDataOffset = 0;
-
-	// Invoke decode the write file request
-	auto rc =
-	    decode_write_file_req(requestPtr, payload_length, &retFileHandle,
-				  &retOffset, &retLength, &retFileDataOffset);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(fileHandle, retFileHandle);
-	ASSERT_EQ(offset, retOffset);
-	ASSERT_EQ(length, retLength);
-	ASSERT_EQ(fileDataOffset, retFileDataOffset);
-}
-
-TEST(ReadFile, testGoodDecodeResponse)
-{
-	// Random value for length
-	uint32_t length = 0x10;
-	uint8_t completionCode = PLDM_SUCCESS;
-
-	std::vector<uint8_t> responseMsg(PLDM_READ_FILE_RESP_BYTES +
-					 sizeof(pldm_msg_hdr) + length);
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
-	auto response =
-	    reinterpret_cast<pldm_read_file_resp *>(responsePtr->payload);
-
-	response->completion_code = completionCode;
-	response->length = htole32(length);
-
-	size_t fileDataOffset = sizeof(completionCode) + sizeof(length);
-
-	uint32_t retLength = 0;
-	uint8_t retCompletionCode = 0;
-	size_t retFileDataOffset = 0;
-
-	// Invoke decode the read file response
-	auto rc = decode_read_file_resp(responsePtr, payload_length,
-					&retCompletionCode, &retLength,
-					&retFileDataOffset);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(completionCode, retCompletionCode);
-	ASSERT_EQ(length, retLength);
-	ASSERT_EQ(fileDataOffset, retFileDataOffset);
-}
-
-TEST(WriteFile, testGoodDecodeResponse)
-{
-	std::array<uint8_t, PLDM_WRITE_FILE_RESP_BYTES + sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
-	auto response =
-	    reinterpret_cast<pldm_write_file_resp *>(responsePtr->payload);
-
-	uint8_t completionCode = PLDM_SUCCESS;
-	uint32_t length = 0x4678;
-
-	response->completion_code = completionCode;
-	response->length = htole32(length);
-
-	uint32_t retLength = 0;
-	uint8_t retCompletionCode = 0;
-
-	// Invoke decode the write file response
-	auto rc = decode_write_file_resp(responsePtr, payload_length,
-					 &retCompletionCode, &retLength);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(completionCode, retCompletionCode);
-	ASSERT_EQ(length, retLength);
-}
-
-TEST(ReadWriteFile, testBadDecodeResponse)
-{
-	uint32_t length = 0;
-	uint8_t completionCode = 0;
-	size_t fileDataOffset = 0;
-
-	// Bad decode response for read file
-	std::vector<uint8_t> responseMsg(PLDM_READ_FILE_RESP_BYTES +
-					 sizeof(pldm_msg_hdr) + length);
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// Request payload message is missing
-	auto rc = decode_read_file_resp(NULL, 0, &completionCode, &length,
-					&fileDataOffset);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	// Payload length is invalid
-	rc = decode_read_file_resp(responsePtr, 0, &completionCode, &length,
-				   &fileDataOffset);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-	// Bad decode response for write file
-	std::array<uint8_t, PLDM_WRITE_FILE_RESP_BYTES + sizeof(pldm_msg_hdr)>
-	    responseMsgWr{};
-	auto responseWr = reinterpret_cast<pldm_msg *>(responseMsgWr.data());
-
-	// Request payload message is missing
-	rc = decode_write_file_resp(NULL, 0, &completionCode, &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	// Payload length is invalid
-	rc = decode_write_file_resp(responseWr, 0, &completionCode, &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ReadWriteFile, testBadDecodeRequest)
-{
-	uint32_t fileHandle = 0;
-	uint32_t offset = 0;
-	uint32_t length = 0;
-
-	// Bad decode request for read file
-	std::array<uint8_t, PLDM_READ_FILE_REQ_BYTES + sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// Request payload message is missing
-	auto rc = decode_read_file_req(NULL, 0, &fileHandle, &offset, &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	// Payload length is invalid
-	rc = decode_read_file_req(requestPtr, 0, &fileHandle, &offset, &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-	// Bad decode request for write file
-	size_t fileDataOffset = 0;
-	std::array<uint8_t, PLDM_WRITE_FILE_REQ_BYTES> requestMsgWr{};
-	auto requestWr = reinterpret_cast<pldm_msg *>(requestMsgWr.data());
-
-	// Request payload message is missing
-	rc = decode_write_file_req(NULL, 0, &fileHandle, &offset, &length,
-				   &fileDataOffset);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	// Payload length is invalid
-	rc = decode_write_file_req(requestWr, 0, &fileHandle, &offset, &length,
-				   &fileDataOffset);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ReadFile, testGoodEncodeResponse)
-{
-	// Good encode response for read file
-	uint32_t length = 0x4;
-
-	std::vector<uint8_t> responseMsg(PLDM_READ_FILE_RESP_BYTES +
-					 sizeof(pldm_msg_hdr) + length);
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	auto response =
-	    reinterpret_cast<pldm_read_file_resp *>(responsePtr->payload);
-
-	// ReadFile
-	auto rc = encode_read_file_resp(0, PLDM_SUCCESS, length, responsePtr);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(responsePtr->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(responsePtr->hdr.instance_id, 0);
-	ASSERT_EQ(responsePtr->hdr.type, PLDM_OEM);
-	ASSERT_EQ(responsePtr->hdr.command, PLDM_READ_FILE);
-	ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
-	ASSERT_EQ(le32toh(response->length), length);
-}
-
-TEST(WriteFile, testGoodEncodeResponse)
-{
-	uint32_t length = 0x467;
-
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_WRITE_FILE_RESP_BYTES>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	auto response =
-	    reinterpret_cast<pldm_write_file_resp *>(responsePtr->payload);
-
-	// WriteFile
-	auto rc = encode_write_file_resp(0, PLDM_SUCCESS, length, responsePtr);
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(responsePtr->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(responsePtr->hdr.instance_id, 0);
-	ASSERT_EQ(responsePtr->hdr.type, PLDM_OEM);
-	ASSERT_EQ(responsePtr->hdr.command, PLDM_WRITE_FILE);
-	ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
-	ASSERT_EQ(le32toh(response->length), length);
-}
-
-TEST(ReadFile, testGoodEncodeRequest)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
-	    requestMsg{};
-
-	uint32_t fileHandle = 0x12345678;
-	uint32_t offset = 0x87654321;
-	uint32_t length = 0x13245768;
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	auto request =
-	    reinterpret_cast<pldm_read_file_req *>(requestPtr->payload);
-
-	// ReadFile
-	auto rc =
-	    encode_read_file_req(0, fileHandle, offset, length, requestPtr);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(requestPtr->hdr.request, PLDM_REQUEST);
-	ASSERT_EQ(requestPtr->hdr.instance_id, 0);
-	ASSERT_EQ(requestPtr->hdr.type, PLDM_OEM);
-	ASSERT_EQ(requestPtr->hdr.command, PLDM_READ_FILE);
-	ASSERT_EQ(le32toh(request->file_handle), fileHandle);
-	ASSERT_EQ(le32toh(request->offset), offset);
-	ASSERT_EQ(le32toh(request->length), length);
-}
-
-TEST(WriteFile, testGoodEncodeRequest)
-{
-	uint32_t fileHandle = 0x12345678;
-	uint32_t offset = 0x87654321;
-	uint32_t length = 0x456;
-
-	std::vector<uint8_t> requestMsg(PLDM_WRITE_FILE_REQ_BYTES +
-					sizeof(pldm_msg_hdr) + length);
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	auto request =
-	    reinterpret_cast<pldm_write_file_req *>(requestPtr->payload);
-
-	// WriteFile
-	auto rc =
-	    encode_write_file_req(0, fileHandle, offset, length, requestPtr);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(requestPtr->hdr.request, PLDM_REQUEST);
-	ASSERT_EQ(requestPtr->hdr.instance_id, 0);
-	ASSERT_EQ(requestPtr->hdr.type, PLDM_OEM);
-	ASSERT_EQ(requestPtr->hdr.command, PLDM_WRITE_FILE);
-	ASSERT_EQ(le32toh(request->file_handle), fileHandle);
-	ASSERT_EQ(le32toh(request->offset), offset);
-	ASSERT_EQ(le32toh(request->length), length);
-}
-
-TEST(ReadWriteFile, testBadEncodeRequest)
-{
-	// Bad encode request for read file
-	uint32_t fileHandle = 0;
-	uint32_t offset = 0;
-	uint32_t length = 0;
-
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
-	    requestMsg{};
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// ReadFile check invalid file length
-	auto rc =
-	    encode_read_file_req(0, fileHandle, offset, length, requestPtr);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-
-	// Bad encode request for write file
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_WRITE_FILE_REQ_BYTES>
-	    requestMsgWr{};
-	auto requestWr = reinterpret_cast<pldm_msg *>(requestMsgWr.data());
-
-	// WriteFile check for invalid file length
-	rc = encode_write_file_req(0, fileHandle, offset, length, requestWr);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ReadWriteFile, testBadEncodeResponse)
-{
-	// Bad encode response for read file
-	uint32_t length = 0;
-
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_RESP_BYTES>
-	    responseMsg{};
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// ReadFile
-	auto rc = encode_read_file_resp(0, PLDM_ERROR, length, responsePtr);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(responsePtr->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(responsePtr->hdr.instance_id, 0);
-	ASSERT_EQ(responsePtr->hdr.type, PLDM_OEM);
-	ASSERT_EQ(responsePtr->hdr.command, PLDM_READ_FILE);
-	ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR);
-
-	// Bad encode response for write file
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_WRITE_FILE_RESP_BYTES>
-	    responseMsgWr{};
-	auto responseWr = reinterpret_cast<pldm_msg *>(responseMsgWr.data());
-
-	// WriteFile
-	rc = encode_write_file_resp(0, PLDM_ERROR, length, responseWr);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(responseWr->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(responseWr->hdr.instance_id, 0);
-	ASSERT_EQ(responseWr->hdr.type, PLDM_OEM);
-	ASSERT_EQ(responseWr->hdr.command, PLDM_WRITE_FILE);
-	ASSERT_EQ(responseWr->payload[0], PLDM_ERROR);
-}
-
-TEST(ReadWriteFileByTypeMemory, testGoodDecodeRequest)
-{
-	std::array<uint8_t,
-		   PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES + sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
-	auto request =
-	    reinterpret_cast<pldm_read_write_file_by_type_memory_req *>(
-		requestPtr->payload);
-
-	// Random value for fileHandle, offset and length
-	uint16_t fileType = 0;
-	uint32_t fileHandle = 0x12345678;
-	uint32_t offset = 0x87654321;
-	uint32_t length = 0x13245768;
-	uint64_t address = 0x124356879ACBD456;
-
-	request->file_type = htole16(fileType);
-	request->file_handle = htole32(fileHandle);
-	request->offset = htole32(offset);
-	request->length = htole32(length);
-	request->address = htole64(address);
-
-	uint16_t retFileType = 0x1;
-	uint32_t retFileHandle = 0;
-	uint32_t retOffset = 0;
-	uint32_t retLength = 0;
-	uint64_t retAddress = 0;
-
-	// Invoke decode the read file request
-	auto rc = decode_rw_file_by_type_memory_req(
-	    requestPtr, payload_length, &retFileType, &retFileHandle,
-	    &retOffset, &retLength, &retAddress);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(fileType, retFileType);
-	ASSERT_EQ(fileHandle, retFileHandle);
-	ASSERT_EQ(offset, retOffset);
-	ASSERT_EQ(length, retLength);
-	ASSERT_EQ(address, retAddress);
-}
-
-TEST(ReadWriteFileByTypeMemory, testGoodDecodeResponse)
-{
-	std::array<uint8_t,
-		   PLDM_RW_FILE_BY_TYPE_MEM_RESP_BYTES + sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
-	auto response =
-	    reinterpret_cast<pldm_read_write_file_by_type_memory_resp *>(
-		responsePtr->payload);
-
-	// Random value for completion code and length
-	uint8_t completionCode = 0x0;
-	uint32_t length = 0x13245768;
-
-	response->completion_code = completionCode;
-	response->length = htole32(length);
-
-	uint8_t retCompletionCode = 0x1;
-	uint32_t retLength = 0;
-
-	// Invoke decode the read/write file response
-	auto rc = decode_rw_file_by_type_memory_resp(
-	    responsePtr, payload_length, &retCompletionCode, &retLength);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(completionCode, retCompletionCode);
-	ASSERT_EQ(length, retLength);
-}
-
-TEST(ReadWriteFileByTypeMemory, testBadDecodeRequest)
-{
-	uint16_t fileType = 0;
-	uint32_t fileHandle = 0;
-	uint32_t offset = 0;
-	uint32_t length = 0;
-	uint64_t address = 0;
-
-	// Request payload message is missing
-	auto rc = decode_rw_file_by_type_memory_req(
-	    NULL, 0, &fileType, &fileHandle, &offset, &length, &address);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t,
-		   PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES + sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// Address is NULL
-	rc = decode_rw_file_by_type_memory_req(
-	    requestPtr, requestMsg.size() - hdrSize, &fileType, &fileHandle,
-	    &offset, &length, NULL);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	// Payload length is invalid
-	rc = decode_rw_file_by_type_memory_req(
-	    requestPtr, 0, &fileType, &fileHandle, &offset, &length, &address);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ReadWriteFileByTypeMemory, testBadDecodeResponse)
-{
-	uint32_t length = 0;
-	uint8_t completionCode = 0;
-
-	// Request payload message is missing
-	auto rc = decode_rw_file_by_type_memory_resp(NULL, 0, &completionCode,
-						     &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t,
-		   PLDM_RW_FILE_BY_TYPE_MEM_RESP_BYTES + sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// Length is NULL
-	rc = decode_rw_file_by_type_memory_resp(
-	    responsePtr, responseMsg.size() - hdrSize, &completionCode, NULL);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	// Payload length is invalid
-	rc = decode_rw_file_by_type_memory_resp(responsePtr, 0, &completionCode,
-						&length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ReadWriteFileByTypeMemory, testGoodEncodeRequest)
-{
-	std::array<uint8_t,
-		   sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES>
-	    requestMsg{};
-
-	uint16_t fileType = 0;
-	uint32_t fileHandle = 0x12345678;
-	uint32_t offset = 0x87654321;
-	uint32_t length = 0x13245768;
-	uint64_t address = 0x124356879ACBDE0F;
-	uint16_t fileTypeLe = htole16(fileType);
-	uint32_t fileHandleLe = htole32(fileHandle);
-	uint32_t offsetLe = htole32(offset);
-	uint32_t lengthLe = htole32(length);
-	uint64_t addressLe = htole64(address);
-
-	pldm_msg *request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	auto rc = encode_rw_file_by_type_memory_req(
-	    0, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, fileType, fileHandle, offset,
-	    length, address, request);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
-	ASSERT_EQ(request->hdr.instance_id, 0);
-	ASSERT_EQ(request->hdr.type, PLDM_OEM);
-	ASSERT_EQ(request->hdr.command, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY);
-
-	ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe),
-			    &fileHandleLe, sizeof(fileHandleLe)));
-
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe),
-			    &offsetLe, sizeof(offsetLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe) + sizeof(offsetLe),
-			    &lengthLe, sizeof(lengthLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe) + sizeof(offsetLe) +
-				sizeof(lengthLe),
-			    &addressLe, sizeof(addressLe)));
-}
-
-TEST(ReadWriteFileByTypeMemory, testGoodEncodeResponse)
-{
-	std::array<uint8_t,
-		   sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_MEM_RESP_BYTES>
-	    responseMsg{};
-
-	uint32_t length = 0x13245768;
-	uint32_t lengthLe = htole32(length);
-	uint8_t completionCode = 0x0;
-
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	auto rc = encode_rw_file_by_type_memory_resp(
-	    0, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, completionCode, length,
-	    response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY);
-
-	ASSERT_EQ(0, memcmp(response->payload, &completionCode,
-			    sizeof(completionCode)));
-	ASSERT_EQ(0, memcmp(response->payload + sizeof(completionCode),
-			    &lengthLe, sizeof(lengthLe)));
-}
-
-TEST(ReadWriteFileByTypeMemory, testBadEncodeResponse)
-{
-	std::array<uint8_t,
-		   sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_MEM_RESP_BYTES>
-	    responseMsg{};
-	uint32_t length = 0;
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// completion code is PLDM_ERROR
-	auto rc = encode_rw_file_by_type_memory_resp(
-	    0, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, PLDM_ERROR, length,
-	    response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY);
-	ASSERT_EQ(response->payload[0], PLDM_ERROR);
-
-	// response is NULL pointer
-	rc = encode_rw_file_by_type_memory_resp(
-	    0, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, PLDM_SUCCESS, length, NULL);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(ReadWriteFileByTypeMemory, testBadEncodeRequest)
-{
-	uint8_t fileType = 0;
-	uint32_t fileHandle = 0;
-	uint32_t offset = 0;
-	uint32_t length = 0;
-	uint64_t address = 0;
-
-	// request is NULL pointer
-	auto rc = encode_rw_file_by_type_memory_req(
-	    0, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, fileType, fileHandle, offset,
-	    length, address, NULL);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(NewFile, testGoodDecodeRequest)
-{
-	std::array<uint8_t, PLDM_NEW_FILE_REQ_BYTES + sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
-	auto request =
-	    reinterpret_cast<pldm_new_file_req *>(requestPtr->payload);
-
-	// Random value for fileHandle and length
-	uint16_t fileType = 0xFF;
-	uint32_t fileHandle = 0x12345678;
-	uint64_t length = 0x13245768;
-
-	request->file_type = htole16(fileType);
-	request->file_handle = htole32(fileHandle);
-	request->length = htole64(length);
-
-	uint16_t retFileType = 0xFF;
-	uint32_t retFileHandle = 0;
-	uint64_t retLength = 0;
-
-	// Invoke decode the read file request
-	auto rc = decode_new_file_req(requestPtr, payload_length, &retFileType,
-				      &retFileHandle, &retLength);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(fileType, retFileType);
-	ASSERT_EQ(fileHandle, retFileHandle);
-	ASSERT_EQ(length, retLength);
-}
-
-TEST(NewFile, testGoodDecodeResponse)
-{
-	std::array<uint8_t, PLDM_NEW_FILE_RESP_BYTES + sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
-	auto response =
-	    reinterpret_cast<pldm_new_file_resp *>(responsePtr->payload);
-
-	// Random value for completion code
-	uint8_t completionCode = 0x0;
-
-	response->completion_code = completionCode;
-
-	uint8_t retCompletionCode = PLDM_SUCCESS;
-
-	// Invoke decode the read/write file response
-	auto rc = decode_new_file_resp(responsePtr, payload_length,
-				       &retCompletionCode);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(completionCode, retCompletionCode);
-}
-
-TEST(NewFile, testBadDecodeRequest)
-{
-	uint16_t fileType = 0;
-	uint32_t fileHandle = 0;
-	uint64_t length = 0;
-
-	// Request payload message is missing
-	auto rc = decode_new_file_req(NULL, 0, &fileType, &fileHandle, &length);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t, PLDM_NEW_FILE_REQ_BYTES + sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// Payload length is invalid
-	rc =
-	    decode_new_file_req(requestPtr, 0, &fileType, &fileHandle, &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(NewFile, testBadDecodeResponse)
-{
-	uint8_t completionCode = 0;
-
-	// Request payload message is missing
-	auto rc = decode_new_file_resp(NULL, 0, &completionCode);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t, PLDM_NEW_FILE_RESP_BYTES + sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// Payload length is invalid
-	rc = decode_new_file_resp(responsePtr, 0, &completionCode);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(NewFile, testGoodEncodeRequest)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_NEW_FILE_REQ_BYTES>
-	    requestMsg{};
-
-	uint16_t fileType = 0xFF;
-	uint32_t fileHandle = 0x12345678;
-	uint32_t length = 0x13245768;
-	uint16_t fileTypeLe = htole16(fileType);
-	uint32_t fileHandleLe = htole32(fileHandle);
-	uint32_t lengthLe = htole32(length);
-
-	pldm_msg *request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	auto rc = encode_new_file_req(0, fileType, fileHandle, length, request);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
-	ASSERT_EQ(request->hdr.instance_id, 0);
-	ASSERT_EQ(request->hdr.type, PLDM_OEM);
-	ASSERT_EQ(request->hdr.command, PLDM_NEW_FILE_AVAILABLE);
-	ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe),
-			    &fileHandleLe, sizeof(fileHandleLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe),
-			    &lengthLe, sizeof(lengthLe)));
-}
-
-TEST(NewFile, testGoodEncodeResponse)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_NEW_FILE_RESP_BYTES>
-	    responseMsg{};
-
-	uint8_t completionCode = 0x0;
-
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	auto rc = encode_new_file_resp(0, completionCode, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_NEW_FILE_AVAILABLE);
-	ASSERT_EQ(0, memcmp(response->payload, &completionCode,
-			    sizeof(completionCode)));
-}
-
-TEST(NewFile, testBadEncodeResponse)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_NEW_FILE_RESP_BYTES>
-	    responseMsg{};
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// completion code is PLDM_ERROR
-	auto rc = encode_new_file_resp(0, PLDM_ERROR, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_NEW_FILE_AVAILABLE);
-	ASSERT_EQ(response->payload[0], PLDM_ERROR);
-
-	// response is NULL pointer
-	rc = encode_new_file_resp(0, PLDM_SUCCESS, NULL);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(NewFile, testBadEncodeRequest)
-{
-	uint8_t fileType = 0xFF;
-	uint32_t fileHandle = 0;
-	uint32_t length = 0;
-
-	// request is NULL pointer
-	auto rc = encode_new_file_req(0, fileType, fileHandle, length, NULL);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(ReadWriteFileByType, testGoodDecodeRequest)
-{
-	std::array<uint8_t,
-		   PLDM_RW_FILE_BY_TYPE_REQ_BYTES + sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
-	auto request = reinterpret_cast<pldm_read_write_file_by_type_req *>(
-	    requestPtr->payload);
-
-	// Random value for fileHandle, offset and length
-	uint16_t fileType = 0;
-	uint32_t fileHandle = 0x12345678;
-	uint32_t offset = 0x87654321;
-	uint32_t length = 0x13245768;
-
-	request->file_handle = htole32(fileHandle);
-	request->offset = htole32(offset);
-	request->length = htole32(length);
-
-	uint16_t retFileType = 0x1;
-	uint32_t retFileHandle = 0;
-	uint32_t retOffset = 0;
-	uint32_t retLength = 0;
-
-	// Invoke decode the read file request
-	auto rc =
-	    decode_rw_file_by_type_req(requestPtr, payload_length, &retFileType,
-				       &retFileHandle, &retOffset, &retLength);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(fileType, retFileType);
-	ASSERT_EQ(fileHandle, retFileHandle);
-	ASSERT_EQ(offset, retOffset);
-	ASSERT_EQ(length, retLength);
-}
-
-TEST(ReadWriteFileByType, testGoodDecodeResponse)
-{
-	std::array<uint8_t,
-		   PLDM_RW_FILE_BY_TYPE_RESP_BYTES + sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
-	auto response = reinterpret_cast<pldm_read_write_file_by_type_resp *>(
-	    responsePtr->payload);
-
-	// Random value for completion code and length
-	uint8_t completionCode = 0x0;
-	uint32_t length = 0x13245768;
-
-	response->completion_code = completionCode;
-	response->length = htole32(length);
-
-	uint8_t retCompletionCode = 0x1;
-	uint32_t retLength = 0;
-
-	// Invoke decode the read/write file response
-	auto rc = decode_rw_file_by_type_resp(responsePtr, payload_length,
-					      &retCompletionCode, &retLength);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(completionCode, retCompletionCode);
-	ASSERT_EQ(length, retLength);
-}
-
-TEST(ReadWriteFileByType, testBadDecodeRequest)
-{
-	uint16_t fileType = 0;
-	uint32_t fileHandle = 0;
-	uint32_t offset = 0;
-	uint32_t length = 0;
-
-	// Request payload message is missing
-	auto rc = decode_rw_file_by_type_req(NULL, 0, &fileType, &fileHandle,
-					     &offset, &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t,
-		   PLDM_RW_FILE_BY_TYPE_REQ_BYTES + sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// Payload length is invalid
-	rc = decode_rw_file_by_type_req(requestPtr, 0, &fileType, &fileHandle,
-					&offset, &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ReadWriteFileByType, testBadDecodeResponse)
-{
-	uint32_t length = 0;
-	uint8_t completionCode = 0;
-
-	// Request payload message is missing
-	auto rc =
-	    decode_rw_file_by_type_resp(NULL, 0, &completionCode, &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t,
-		   PLDM_RW_FILE_BY_TYPE_RESP_BYTES + sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// Length is NULL
-	rc = decode_rw_file_by_type_resp(
-	    responsePtr, responseMsg.size() - hdrSize, &completionCode, NULL);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	// Payload length is invalid
-	rc = decode_rw_file_by_type_resp(responsePtr, 0, &completionCode,
-					 &length);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(ReadWriteFileByType, testGoodEncodeRequest)
-{
-	std::array<uint8_t,
-		   sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_REQ_BYTES>
-	    requestMsg{};
-
-	uint16_t fileType = 0;
-	uint32_t fileHandle = 0x12345678;
-	uint32_t offset = 0x87654321;
-	uint32_t length = 0x13245768;
-	uint16_t fileTypeLe = htole16(fileType);
-	uint32_t fileHandleLe = htole32(fileHandle);
-	uint32_t offsetLe = htole32(offset);
-	uint32_t lengthLe = htole32(length);
-
-	pldm_msg *request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	auto rc =
-	    encode_rw_file_by_type_req(0, PLDM_READ_FILE_BY_TYPE, fileType,
-				       fileHandle, offset, length, request);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
-	ASSERT_EQ(request->hdr.instance_id, 0);
-	ASSERT_EQ(request->hdr.type, PLDM_OEM);
-	ASSERT_EQ(request->hdr.command, PLDM_READ_FILE_BY_TYPE);
-
-	ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe),
-			    &fileHandleLe, sizeof(fileHandleLe)));
-
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe),
-			    &offsetLe, sizeof(offsetLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe) + sizeof(offsetLe),
-			    &lengthLe, sizeof(lengthLe)));
-}
-
-TEST(ReadWriteFileByType, testGoodEncodeResponse)
-{
-	std::array<uint8_t,
-		   sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_RESP_BYTES>
-	    responseMsg{};
-
-	uint32_t length = 0x13245768;
-	uint32_t lengthLe = htole32(length);
-	uint8_t completionCode = 0x0;
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	auto rc = encode_rw_file_by_type_resp(0, PLDM_READ_FILE_BY_TYPE,
-					      completionCode, length, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_BY_TYPE);
-
-	ASSERT_EQ(0, memcmp(response->payload, &completionCode,
-			    sizeof(completionCode)));
-	ASSERT_EQ(0, memcmp(response->payload + sizeof(completionCode),
-			    &lengthLe, sizeof(lengthLe)));
-}
-
-TEST(ReadWriteFileByType, testBadEncodeResponse)
-{
-	std::array<uint8_t,
-		   sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_RESP_BYTES>
-	    responseMsg{};
-	uint32_t length = 0;
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// completion code is PLDM_ERROR
-	auto rc = encode_rw_file_by_type_resp(0, PLDM_READ_FILE_BY_TYPE,
-					      PLDM_ERROR, length, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_BY_TYPE);
-	ASSERT_EQ(response->payload[0], PLDM_ERROR);
-
-	// response is NULL pointer
-	rc = encode_rw_file_by_type_resp(0, PLDM_READ_FILE_BY_TYPE,
-					 PLDM_SUCCESS, length, NULL);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(ReadWriteFileByType, testBadEncodeRequest)
-{
-	uint8_t fileType = 0;
-	uint32_t fileHandle = 0;
-	uint32_t offset = 0;
-	uint32_t length = 0;
-
-	// request is NULL pointer
-	auto rc =
-	    encode_rw_file_by_type_req(0, PLDM_READ_FILE_BY_TYPE, fileType,
-				       fileHandle, offset, length, NULL);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(FileAck, testGoodDecodeRequest)
-{
-	std::array<uint8_t, PLDM_FILE_ACK_REQ_BYTES + sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
-	auto request =
-	    reinterpret_cast<pldm_file_ack_req *>(requestPtr->payload);
-
-	// Random value for fileHandle
-	uint16_t fileType = 0xFFFF;
-	uint32_t fileHandle = 0x12345678;
-	uint8_t fileStatus = 0xFF;
-
-	request->file_type = htole16(fileType);
-	request->file_handle = htole32(fileHandle);
-	request->file_status = fileStatus;
-
-	uint16_t retFileType = 0xFF;
-	uint32_t retFileHandle = 0;
-	uint8_t retFileStatus = 0;
-
-	// Invoke decode the read file request
-	auto rc = decode_file_ack_req(requestPtr, payload_length, &retFileType,
-				      &retFileHandle, &retFileStatus);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(fileType, retFileType);
-	ASSERT_EQ(fileHandle, retFileHandle);
-	ASSERT_EQ(fileStatus, retFileStatus);
-}
-
-TEST(FileAck, testGoodDecodeResponse)
-{
-	std::array<uint8_t, PLDM_FILE_ACK_RESP_BYTES + sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
-	auto response =
-	    reinterpret_cast<pldm_file_ack_resp *>(responsePtr->payload);
-
-	// Random value for completion code
-	uint8_t completionCode = 0x0;
-
-	response->completion_code = completionCode;
-
-	uint8_t retCompletionCode = PLDM_SUCCESS;
-
-	// Invoke decode the read/write file response
-	auto rc = decode_file_ack_resp(responsePtr, payload_length,
-				       &retCompletionCode);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(completionCode, retCompletionCode);
-}
-
-TEST(FileAck, testBadDecodeRequest)
-{
-	uint16_t fileType = 0;
-	uint32_t fileHandle = 0;
-	uint8_t fileStatus = 0;
-
-	// Request payload message is missing
-	auto rc =
-	    decode_file_ack_req(NULL, 0, &fileType, &fileHandle, &fileStatus);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t, PLDM_FILE_ACK_REQ_BYTES + sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// Payload length is invalid
-	rc = decode_file_ack_req(requestPtr, 0, &fileType, &fileHandle,
-				 &fileStatus);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(FileAck, testBadDecodeResponse)
-{
-	uint8_t completionCode = 0;
-
-	// Request payload message is missing
-	auto rc = decode_file_ack_resp(NULL, 0, &completionCode);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t, PLDM_FILE_ACK_RESP_BYTES + sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// Payload length is invalid
-	rc = decode_file_ack_resp(responsePtr, 0, &completionCode);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(FileAck, testGoodEncodeRequest)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_FILE_ACK_REQ_BYTES>
-	    requestMsg{};
-
-	uint16_t fileType = 0xFFFF;
-	uint32_t fileHandle = 0x12345678;
-	uint8_t fileStatus = 0xFF;
-	uint16_t fileTypeLe = htole16(fileType);
-	uint32_t fileHandleLe = htole32(fileHandle);
-
-	pldm_msg *request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	auto rc =
-	    encode_file_ack_req(0, fileType, fileHandle, fileStatus, request);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
-	ASSERT_EQ(request->hdr.instance_id, 0);
-	ASSERT_EQ(request->hdr.type, PLDM_OEM);
-	ASSERT_EQ(request->hdr.command, PLDM_FILE_ACK);
-	ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe),
-			    &fileHandleLe, sizeof(fileHandleLe)));
-}
-
-TEST(FileAck, testGoodEncodeResponse)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_FILE_ACK_RESP_BYTES>
-	    responseMsg{};
-
-	uint8_t completionCode = 0x0;
-
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	auto rc = encode_file_ack_resp(0, completionCode, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_FILE_ACK);
-	ASSERT_EQ(0, memcmp(response->payload, &completionCode,
-			    sizeof(completionCode)));
-}
-
-TEST(FileAck, testBadEncodeResponse)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_FILE_ACK_RESP_BYTES>
-	    responseMsg{};
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// completion code is PLDM_ERROR
-	auto rc = encode_file_ack_resp(0, PLDM_ERROR, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_FILE_ACK);
-	ASSERT_EQ(response->payload[0], PLDM_ERROR);
-
-	// response is NULL pointer
-	rc = encode_file_ack_resp(0, PLDM_SUCCESS, NULL);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(FileAck, testBadEncodeRequest)
-{
-	uint8_t fileType = 0xFF;
-	uint32_t fileHandle = 0;
-	uint8_t fileStatus = 0;
-
-	// request is NULL pointer
-	auto rc =
-	    encode_file_ack_req(0, fileType, fileHandle, fileStatus, nullptr);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(FileAckWithMetadata, testGoodEncodeResponse)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) +
-				PLDM_FILE_ACK_WITH_META_DATA_RESP_BYTES>
-	    responseMsg{};
-
-	uint8_t completionCode = 0x0;
-
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	auto rc =
-	    encode_file_ack_with_meta_data_resp(0, completionCode, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_FILE_ACK_WITH_META_DATA);
-	ASSERT_EQ(0, memcmp(response->payload, &completionCode,
-			    sizeof(completionCode)));
-}
-
-TEST(FileAckWithMetadata, testBadEncodeResponse)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) +
-				PLDM_FILE_ACK_WITH_META_DATA_RESP_BYTES>
-	    responseMsg{};
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// completion code is PLDM_ERROR
-	auto rc = encode_file_ack_with_meta_data_resp(0, PLDM_ERROR, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command, PLDM_FILE_ACK_WITH_META_DATA);
-	ASSERT_EQ(response->payload[0], PLDM_ERROR);
-
-	// response is NULL pointer
-	rc = encode_file_ack_with_meta_data_resp(0, PLDM_SUCCESS, NULL);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(FileAckWithMetadata, testGoodDecodeResponse)
-{
-	std::array<uint8_t, PLDM_FILE_ACK_WITH_META_DATA_RESP_BYTES +
-				sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
-	auto response = reinterpret_cast<pldm_file_ack_with_meta_data_resp *>(
-	    responsePtr->payload);
-
-	// Random value for completion code
-	uint8_t completionCode = 0x0;
-
-	response->completion_code = completionCode;
-
-	uint8_t retCompletionCode = PLDM_SUCCESS;
-
-	// Invoke decode the read/write file response
-	auto rc = decode_file_ack_with_meta_data_resp(
-	    responsePtr, payload_length, &retCompletionCode);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(completionCode, retCompletionCode);
-}
-
-TEST(FileAckWithMetadata, testBadDecodeResponse)
-{
-	uint8_t completionCode = 0;
-
-	// Request payload message is missing
-	auto rc = decode_file_ack_with_meta_data_resp(NULL, 0, &completionCode);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t, PLDM_FILE_ACK_WITH_META_DATA_RESP_BYTES +
-				sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// Payload length is invalid
-	rc = decode_file_ack_with_meta_data_resp(responsePtr, 0,
-						 &completionCode);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(FileAckWithMetadata, testGoodEncodeRequest)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) +
-				PLDM_FILE_ACK_WITH_META_DATA_REQ_BYTES>
-	    requestMsg{};
-
-	uint16_t fileType = 0xFFFF;
-	uint32_t fileHandle = 0x12345678;
-	uint8_t fileStatus = 0xFF;
-	uint32_t fileMetaData1 = 0xFFFFFFFF;
-	uint32_t fileMetaData2 = 0xFFFFFFFF;
-	uint32_t fileMetaData3 = 0xFFFFFFFF;
-	uint32_t fileMetaData4 = 0xFFFFFFFF;
-
-	uint16_t fileTypeLe = htole16(fileType);
-	uint32_t fileHandleLe = htole32(fileHandle);
-	uint32_t fileMetaData1Le = htole32(fileMetaData1);
-	uint32_t fileMetaData2Le = htole32(fileMetaData2);
-	uint32_t fileMetaData3Le = htole32(fileMetaData3);
-	uint32_t fileMetaData4Le = htole32(fileMetaData4);
-
-	pldm_msg *request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	auto rc = encode_file_ack_with_meta_data_req(
-	    0, fileType, fileHandle, fileStatus, fileMetaData1, fileMetaData2,
-	    fileMetaData3, fileMetaData4, request);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
-	ASSERT_EQ(request->hdr.instance_id, 0);
-	ASSERT_EQ(request->hdr.type, PLDM_OEM);
-	ASSERT_EQ(request->hdr.command, PLDM_FILE_ACK_WITH_META_DATA);
-	ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe),
-			    &fileHandleLe, sizeof(fileHandleLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe),
-			    &fileStatus, sizeof(fileStatus)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe) + sizeof(fileStatus),
-			    &fileMetaData1Le, sizeof(fileMetaData1Le)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe) + sizeof(fileStatus) +
-				sizeof(fileMetaData1Le),
-			    &fileMetaData2Le, sizeof(fileMetaData2Le)));
-
-	ASSERT_EQ(0,
-		  memcmp(request->payload + sizeof(fileTypeLe) +
-			     sizeof(fileHandleLe) + sizeof(fileStatus) +
-			     sizeof(fileMetaData1Le) + sizeof(fileMetaData2Le),
-			 &fileMetaData3Le, sizeof(fileMetaData3Le)));
-
-	ASSERT_EQ(0,
-		  memcmp(request->payload + sizeof(fileTypeLe) +
-			     sizeof(fileHandleLe) + sizeof(fileStatus) +
-			     sizeof(fileMetaData1Le) + sizeof(fileMetaData2Le) +
-			     sizeof(fileMetaData3Le),
-			 &fileMetaData4Le, sizeof(fileMetaData4Le)));
-}
-
-TEST(FileAckWithMetadata, testBadEncodeRequest)
-{
-	uint8_t fileType = 0xFF;
-	uint32_t fileHandle = 0;
-	uint8_t fileStatus = 0;
-	uint32_t fileMetaData1 = 0;
-	uint32_t fileMetaData2 = 0;
-	uint32_t fileMetaData3 = 0;
-	uint32_t fileMetaData4 = 0;
-
-	// request is NULL pointer
-	auto rc = encode_file_ack_with_meta_data_req(
-	    0, fileType, fileHandle, fileStatus, fileMetaData1, fileMetaData2,
-	    fileMetaData3, fileMetaData4, nullptr);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(FileAckWithMetadata, testGoodDecodeRequest)
-{
-	std::array<uint8_t, sizeof(pldm_msg_hdr) +
-				PLDM_FILE_ACK_WITH_META_DATA_REQ_BYTES>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
-	auto request = reinterpret_cast<pldm_file_ack_with_meta_data_req *>(
-	    requestPtr->payload);
-
-	uint16_t fileType = 0xFFFF;
-	uint32_t fileHandle = 0x12345678;
-	uint8_t fileStatus = 0xFF;
-	uint32_t fileMetaData1 = 0x12345678;
-	uint32_t fileMetaData2 = 0x87654321;
-	uint32_t fileMetaData3 = 0x22121117;
-	uint32_t fileMetaData4 = 0x12334345;
-
-	request->file_type = htole16(fileType);
-	request->file_handle = htole32(fileHandle);
-	request->file_status = fileStatus;
-	request->file_meta_data_1 = htole32(fileMetaData1);
-	request->file_meta_data_2 = htole32(fileMetaData2);
-	request->file_meta_data_3 = htole32(fileMetaData3);
-	request->file_meta_data_4 = htole32(fileMetaData4);
-
-	uint16_t retFileType = 0xFFFF;
-	uint32_t retFileHandle = 0;
-	uint8_t retFileStatus = 0;
-	uint32_t retFileMetaData1 = 0;
-	uint32_t retFileMetaData2 = 0;
-	uint32_t retFileMetaData3 = 0;
-	uint32_t retFileMetaData4 = 0;
-
-	auto rc = decode_file_ack_with_meta_data_req(
-	    requestPtr, payload_length, &retFileType, &retFileHandle,
-	    &retFileStatus, &retFileMetaData1, &retFileMetaData2,
-	    &retFileMetaData3, &retFileMetaData4);
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(fileType, retFileType);
-	ASSERT_EQ(fileHandle, retFileHandle);
-	ASSERT_EQ(fileStatus, retFileStatus);
-	ASSERT_EQ(fileMetaData1, retFileMetaData1);
-	ASSERT_EQ(fileMetaData2, retFileMetaData2);
-	ASSERT_EQ(fileMetaData3, retFileMetaData3);
-	ASSERT_EQ(fileMetaData4, retFileMetaData4);
-}
-
-TEST(FileAckWithMetadata, testBadDecodeRequest)
-{
-	uint16_t fileType = 0;
-	uint32_t fileHandle = 0;
-	uint8_t fileStatus = 0;
-	uint32_t fileMetaData1 = 0;
-	uint32_t fileMetaData2 = 0;
-	uint32_t fileMetaData3 = 0;
-	uint32_t fileMetaData4 = 0;
-
-	// Request payload message is missing
-	auto rc = decode_file_ack_with_meta_data_req(
-	    NULL, 0, &fileType, &fileHandle, &fileStatus, &fileMetaData1,
-	    &fileMetaData2, &fileMetaData3, &fileMetaData4);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t, PLDM_FILE_ACK_WITH_META_DATA_REQ_BYTES +
-				sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// Payload length is invalid
-	rc = decode_file_ack_with_meta_data_req(
-	    requestPtr, 0, &fileType, &fileHandle, &fileStatus, &fileMetaData1,
-	    &fileMetaData2, &fileMetaData3, &fileMetaData4);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(NewFileAvailableWithMetaData, testGoodEncodeResponse)
-{
-	std::array<uint8_t,
-		   sizeof(pldm_msg_hdr) +
-		       PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_RESP_BYTES>
-	    responseMsg{};
-
-	uint8_t completionCode = 0x0;
-
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	auto rc =
-	    encode_new_file_with_metadata_resp(0, completionCode, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command,
-		  PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA);
-	ASSERT_EQ(0, memcmp(response->payload, &completionCode,
-			    sizeof(completionCode)));
-}
-
-TEST(NewFileAvailableWithMetaData, testBadEncodeResponse)
-{
-	std::array<uint8_t,
-		   sizeof(pldm_msg_hdr) +
-		       PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_RESP_BYTES>
-	    responseMsg{};
-	pldm_msg *response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// completion code is PLDM_ERROR
-	auto rc = encode_new_file_with_metadata_resp(0, PLDM_ERROR, response);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
-	ASSERT_EQ(response->hdr.instance_id, 0);
-	ASSERT_EQ(response->hdr.type, PLDM_OEM);
-	ASSERT_EQ(response->hdr.command,
-		  PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA);
-	ASSERT_EQ(response->payload[0], PLDM_ERROR);
-
-	// response is NULL pointer
-	rc = encode_new_file_resp(0, PLDM_SUCCESS, NULL);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(NewFileAvailableWithMetaData, testGoodDecodeResponse)
-{
-	std::array<uint8_t, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_RESP_BYTES +
-				sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
-	auto response = reinterpret_cast<pldm_file_ack_with_meta_data_resp *>(
-	    responsePtr->payload);
-
-	// Random value for completion code
-	uint8_t completionCode = 0x0;
-
-	response->completion_code = completionCode;
-
-	uint8_t retCompletionCode = PLDM_SUCCESS;
-
-	// Invoke decode the read/write file response
-	auto rc = decode_new_file_with_metadata_resp(
-	    responsePtr, payload_length, &retCompletionCode);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(completionCode, retCompletionCode);
-}
-
-TEST(NewFileAvailableWithMetaData, testBadDecodeResponse)
-{
-	uint8_t completionCode = 0;
-
-	// Request payload message is missing
-	auto rc = decode_new_file_with_metadata_resp(NULL, 0, &completionCode);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_RESP_BYTES +
-				sizeof(pldm_msg_hdr)>
-	    responseMsg{};
-
-	auto responsePtr = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	// Payload length is invalid
-	rc =
-	    decode_new_file_with_metadata_resp(responsePtr, 0, &completionCode);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(NewFileAvailableWithMetaData, testGoodEncodeRequest)
-{
-	std::array<uint8_t,
-		   sizeof(pldm_msg_hdr) +
-		       PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_REQ_BYTES>
-	    requestMsg{};
-
-	uint16_t fileType = 0xFFFF;
-	uint32_t fileHandle = 0x12345678;
-	uint32_t length = 0x13245768;
-	uint64_t fileMetaData1 = 0xFFFFFFFF;
-	uint32_t fileMetaData2 = 0xFFFFFFFF;
-	uint32_t fileMetaData3 = 0xFFFFFFFF;
-	uint32_t fileMetaData4 = 0xFFFFFFFF;
-
-	uint16_t fileTypeLe = htole16(fileType);
-	uint32_t fileHandleLe = htole32(fileHandle);
-	uint64_t lengthLe = htole64(length);
-	uint32_t fileMetaData1Le = htole32(fileMetaData1);
-	uint32_t fileMetaData2Le = htole32(fileMetaData2);
-	uint32_t fileMetaData3Le = htole32(fileMetaData3);
-	uint32_t fileMetaData4Le = htole32(fileMetaData4);
-
-	pldm_msg *request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	auto rc = encode_new_file_with_metadata_req(
-	    0, fileType, fileHandle, length, fileMetaData1, fileMetaData2,
-	    fileMetaData3, fileMetaData4, request);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
-	ASSERT_EQ(request->hdr.instance_id, 0);
-	ASSERT_EQ(request->hdr.type, PLDM_OEM);
-	ASSERT_EQ(request->hdr.command, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA);
-	ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe),
-			    &fileHandleLe, sizeof(fileHandleLe)));
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe),
-			    &lengthLe, sizeof(lengthLe)));
-
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe) + sizeof(lengthLe),
-			    &fileMetaData1Le, sizeof(fileMetaData1Le)));
-
-	ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
-				sizeof(fileHandleLe) + sizeof(lengthLe) +
-				sizeof(fileMetaData1Le),
-			    &fileMetaData2Le, sizeof(fileMetaData2Le)));
-
-	ASSERT_EQ(0,
-		  memcmp(request->payload + sizeof(fileTypeLe) +
-			     sizeof(fileHandleLe) + sizeof(lengthLe) +
-			     sizeof(fileMetaData1Le) + sizeof(fileMetaData2Le),
-			 &fileMetaData3Le, sizeof(fileMetaData3Le)));
-
-	ASSERT_EQ(0,
-		  memcmp(request->payload + sizeof(fileTypeLe) +
-			     sizeof(fileHandleLe) + sizeof(lengthLe) +
-			     sizeof(fileMetaData1Le) + sizeof(fileMetaData2Le) +
-			     sizeof(fileMetaData3Le),
-			 &fileMetaData4Le, sizeof(fileMetaData4Le)));
-}
-
-TEST(NewFileAvailableWithMetaData, testBadEncodeRequest)
-{
-	uint8_t fileType = 0xFF;
-	uint32_t fileHandle = 0;
-	uint32_t length = 0;
-	uint32_t fileMetaData1 = 0;
-	uint32_t fileMetaData2 = 0;
-	uint32_t fileMetaData3 = 0;
-	uint32_t fileMetaData4 = 0;
-
-	// request is NULL pointer
-	auto rc = encode_new_file_with_metadata_req(
-	    0, fileType, fileHandle, length, fileMetaData1, fileMetaData2,
-	    fileMetaData3, fileMetaData4, NULL);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(NewFileAvailableWithMetaData, testGoodDecodeRequest)
-{
-	std::array<uint8_t, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_REQ_BYTES +
-				sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
-	auto request = reinterpret_cast<pldm_new_file_with_metadata_req *>(
-	    requestPtr->payload);
-
-	// Random value for fileHandle and length
-	uint16_t fileType = 0xFFFF;
-	uint32_t fileHandle = 0x12345678;
-	uint64_t length = 0x13245768;
-	uint32_t fileMetaData1 = 0x12345678;
-	uint32_t fileMetaData2 = 0x87654321;
-	uint32_t fileMetaData3 = 0x22121117;
-	uint32_t fileMetaData4 = 0x12334345;
-
-	request->file_type = htole16(fileType);
-	request->file_handle = htole32(fileHandle);
-	request->length = htole64(length);
-	request->file_meta_data_1 = htole32(fileMetaData1);
-	request->file_meta_data_2 = htole32(fileMetaData2);
-	request->file_meta_data_3 = htole32(fileMetaData3);
-	request->file_meta_data_4 = htole32(fileMetaData4);
-
-	uint16_t retFileType = 0xFFFF;
-	uint32_t retFileHandle = 0;
-	uint64_t retLength = 0;
-	uint32_t retFileMetaData1 = 0;
-	uint32_t retFileMetaData2 = 0;
-	uint32_t retFileMetaData3 = 0;
-	uint32_t retFileMetaData4 = 0;
-
-	// Invoke decode the read file request
-	auto rc = decode_new_file_with_metadata_req(
-	    requestPtr, payload_length, &retFileType, &retFileHandle,
-	    &retLength, &retFileMetaData1, &retFileMetaData2, &retFileMetaData3,
-	    &retFileMetaData4);
-
-	ASSERT_EQ(rc, PLDM_SUCCESS);
-	ASSERT_EQ(fileType, retFileType);
-	ASSERT_EQ(fileHandle, retFileHandle);
-	ASSERT_EQ(length, retLength);
-	ASSERT_EQ(fileMetaData1, retFileMetaData1);
-	ASSERT_EQ(fileMetaData2, retFileMetaData2);
-	ASSERT_EQ(fileMetaData3, retFileMetaData3);
-	ASSERT_EQ(fileMetaData4, retFileMetaData4);
-}
-
-TEST(NewFileAvailableWithMetaData, testBadDecodeRequest)
-{
-	uint16_t fileType = 0;
-	uint32_t fileHandle = 0;
-	uint64_t length = 0;
-	uint32_t fileMetaData1 = 0;
-	uint32_t fileMetaData2 = 0;
-	uint32_t fileMetaData3 = 0;
-	uint32_t fileMetaData4 = 0;
-
-	// Request payload message is missing
-	auto rc = decode_new_file_with_metadata_req(
-	    NULL, 0, &fileType, &fileHandle, &length, &fileMetaData1,
-	    &fileMetaData2, &fileMetaData3, &fileMetaData4);
-
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	std::array<uint8_t, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_REQ_BYTES +
-				sizeof(pldm_msg_hdr)>
-	    requestMsg{};
-
-	auto requestPtr = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	// Payload length is invalid
-	rc = decode_new_file_with_metadata_req(
-	    requestPtr, 0, &fileType, &fileHandle, &length, &fileMetaData1,
-	    &fileMetaData2, &fileMetaData3, &fileMetaData4);
-	ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
diff --git a/libpldm/oem/ibm/libpldm/tests/libpldm_host_test.cpp b/libpldm/oem/ibm/libpldm/tests/libpldm_host_test.cpp
deleted file mode 100644
index 39f8e70..0000000
--- a/libpldm/oem/ibm/libpldm/tests/libpldm_host_test.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-#include "oem/ibm/libpldm/host.h"
-
-#include <string.h>
-
-#include <array>
-
-#include <gtest/gtest.h>
-
-constexpr auto hdrSize = sizeof(pldm_msg_hdr);
-
-TEST(GetAlertStatus, testGoodEncodeRequest)
-{
-	std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES>
-	    requestMsg{};
-
-	uint8_t versionId = 0x0;
-
-	auto request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	auto rc = encode_get_alert_status_req(0, versionId, request,
-					      PLDM_GET_ALERT_STATUS_REQ_BYTES);
-	EXPECT_EQ(rc, PLDM_SUCCESS);
-	EXPECT_EQ(versionId, request->payload[0]);
-}
-
-TEST(GetAlertStatus, testBadEncodeRequest)
-{
-	std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES>
-	    requestMsg{};
-
-	auto request = reinterpret_cast<pldm_msg *>(requestMsg.data());
-	auto rc = encode_get_alert_status_req(
-	    0, 0x0, request, PLDM_GET_ALERT_STATUS_REQ_BYTES + 1);
-	EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(GetAlertStatus, testGoodDecodeResponse)
-{
-	uint8_t completionCode = PLDM_SUCCESS;
-	uint32_t rack_entry = 0xFF000030;
-	uint32_t pri_cec_node = 0x00008030;
-	std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_RESP_BYTES>
-	    responseMsg{};
-
-	uint8_t retCompletionCode = 0;
-	uint32_t retRack_entry = 0;
-	uint32_t retPri_cec_node = 0;
-
-	auto response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	struct pldm_get_alert_status_resp *resp =
-	    reinterpret_cast<struct pldm_get_alert_status_resp *>(
-		response->payload);
-	resp->completion_code = completionCode;
-	resp->rack_entry = htole32(rack_entry);
-	resp->pri_cec_node = htole32(pri_cec_node);
-
-	auto rc = decode_get_alert_status_resp(
-	    response, responseMsg.size() - hdrSize, &retCompletionCode,
-	    &retRack_entry, &retPri_cec_node);
-	EXPECT_EQ(rc, PLDM_SUCCESS);
-	EXPECT_EQ(retCompletionCode, completionCode);
-	EXPECT_EQ(retRack_entry, rack_entry);
-	EXPECT_EQ(retPri_cec_node, pri_cec_node);
-}
-
-TEST(GetAlertStatus, testBadDecodeResponse)
-{
-	auto rc = decode_get_alert_status_resp(NULL, 0, NULL, NULL, NULL);
-	EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-
-	uint8_t completionCode = PLDM_SUCCESS;
-	uint32_t rack_entry = 0xFF000030;
-	uint32_t pri_cec_node = 0x00008030;
-	std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_RESP_BYTES>
-	    responseMsg{};
-
-	uint8_t retCompletionCode = 0;
-	uint32_t retRack_entry = 0;
-	uint32_t retPri_cec_node = 0;
-
-	auto response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-	struct pldm_get_alert_status_resp *resp =
-	    reinterpret_cast<struct pldm_get_alert_status_resp *>(
-		response->payload);
-	resp->completion_code = completionCode;
-	resp->rack_entry = htole32(rack_entry);
-	resp->pri_cec_node = htole32(pri_cec_node);
-
-	rc = decode_get_alert_status_resp(
-	    response, responseMsg.size() - hdrSize + 1, &retCompletionCode,
-	    &retRack_entry, &retPri_cec_node);
-	EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
-
-TEST(GetAlertStatus, testGoodEncodeResponse)
-{
-	uint8_t completionCode = 0;
-	uint32_t rack_entry = 0xFF000030;
-	uint32_t pri_cec_node = 0x00008030;
-
-	std::vector<uint8_t> responseMsg(hdrSize +
-					 PLDM_GET_ALERT_STATUS_RESP_BYTES);
-	auto response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	auto rc = encode_get_alert_status_resp(0, PLDM_SUCCESS, rack_entry,
-					       pri_cec_node, response,
-					       responseMsg.size() - hdrSize);
-
-	EXPECT_EQ(rc, PLDM_SUCCESS);
-	struct pldm_get_alert_status_resp *resp =
-	    reinterpret_cast<struct pldm_get_alert_status_resp *>(
-		response->payload);
-
-	EXPECT_EQ(completionCode, resp->completion_code);
-	EXPECT_EQ(rack_entry, le32toh(resp->rack_entry));
-	EXPECT_EQ(pri_cec_node, le32toh(resp->pri_cec_node));
-}
-
-TEST(GetAlertStatus, testBadEncodeResponse)
-{
-	uint32_t rack_entry = 0xFF000030;
-	uint32_t pri_cec_node = 0x00008030;
-
-	std::vector<uint8_t> responseMsg(hdrSize +
-					 PLDM_GET_ALERT_STATUS_RESP_BYTES);
-	auto response = reinterpret_cast<pldm_msg *>(responseMsg.data());
-
-	auto rc = encode_get_alert_status_resp(
-	    0, PLDM_SUCCESS, rack_entry, pri_cec_node, response,
-	    responseMsg.size() - hdrSize + 1);
-
-	EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
-}
-
-TEST(GetAlertStatus, testGoodDecodeRequest)
-{
-	std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES>
-	    requestMsg{};
-
-	uint8_t versionId = 0x0;
-	uint8_t retVersionId;
-
-	auto req = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	req->payload[0] = versionId;
-
-	auto rc = decode_get_alert_status_req(req, requestMsg.size() - hdrSize,
-					      &retVersionId);
-
-	EXPECT_EQ(rc, PLDM_SUCCESS);
-	EXPECT_EQ(retVersionId, versionId);
-}
-
-TEST(GetAlertStatus, testBadDecodeRequest)
-{
-	std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES>
-	    requestMsg{};
-
-	uint8_t versionId = 0x0;
-	uint8_t retVersionId;
-
-	auto req = reinterpret_cast<pldm_msg *>(requestMsg.data());
-
-	req->payload[0] = versionId;
-
-	auto rc = decode_get_alert_status_req(
-	    req, requestMsg.size() - hdrSize + 1, &retVersionId);
-
-	EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
-}
diff --git a/libpldm/tests/meson.build b/libpldm/tests/meson.build
deleted file mode 100644
index 12dab0a..0000000
--- a/libpldm/tests/meson.build
+++ /dev/null
@@ -1,30 +0,0 @@
-tests = [
-  'libpldm_base_test',
-  'libpldm_platform_test',
-  'libpldm_bios_test',
-  'libpldm_bios_table_test',
-  'libpldm_fru_test',
-  'libpldm_utils_test',
-  'libpldm_pdr_test',
-  'libpldm_firmware_update_test'
-]
-
-if get_option('oem-ibm').enabled()
-  tests += [
-    '../oem/ibm/libpldm/tests/libpldm_fileio_test',
-    '../oem/ibm/libpldm/tests/libpldm_host_test',
-  ]
-endif
-
-foreach t : tests
-  test(t, executable(t.underscorify(), t + '.cpp',
-                     implicit_include_directories: false,
-                     link_args: dynamic_linker,
-                     build_rpath: get_option('oe-sdk').enabled() ? rpath : '',
-                     dependencies: [
-                         libpldm_dep,
-                         gtest,
-                         gmock]),
-       workdir: meson.current_source_dir())
-endforeach
-
diff --git a/libpldmresponder/base.cpp b/libpldmresponder/base.cpp
index 4c5b757..42bc458 100644
--- a/libpldmresponder/base.cpp
+++ b/libpldmresponder/base.cpp
@@ -5,7 +5,7 @@
 #include "libpldm/bios.h"
 #include "libpldm/fru.h"
 #include "libpldm/platform.h"
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "base.hpp"
 #include "common/utils.hpp"
diff --git a/meson.build b/meson.build
index ca005f4..55fc434 100644
--- a/meson.build
+++ b/meson.build
@@ -133,7 +133,7 @@
     endif
 endif
 
-subdir('libpldm')
+libpldm_dep = dependency('libpldm', fallback:['libpldm','libpldm_dep'])
 
 if get_option('libpldm-only').disabled()
 
diff --git a/oem/ibm/libpldmresponder/file_io.hpp b/oem/ibm/libpldmresponder/file_io.hpp
index b1fe17c..4c74463 100644
--- a/oem/ibm/libpldmresponder/file_io.hpp
+++ b/oem/ibm/libpldmresponder/file_io.hpp
@@ -3,8 +3,8 @@
 #include "config.h"
 
 #include "libpldm/base.h"
-#include "oem/ibm/libpldm/file_io.h"
-#include "oem/ibm/libpldm/host.h"
+#include "libpldm/file_io.h"
+#include "libpldm/host.h"
 
 #include "common/utils.hpp"
 #include "oem/ibm/requester/dbus_to_file_handler.hpp"
diff --git a/oem/ibm/libpldmresponder/file_io_by_type.cpp b/oem/ibm/libpldmresponder/file_io_by_type.cpp
index 493a20a..c465c0d 100644
--- a/oem/ibm/libpldmresponder/file_io_by_type.cpp
+++ b/oem/ibm/libpldmresponder/file_io_by_type.cpp
@@ -3,7 +3,7 @@
 #include "file_io_by_type.hpp"
 
 #include "libpldm/base.h"
-#include "oem/ibm/libpldm/file_io.h"
+#include "libpldm/file_io.h"
 
 #include "common/utils.hpp"
 #include "file_io_type_cert.hpp"
diff --git a/oem/ibm/libpldmresponder/file_io_type_cert.cpp b/oem/ibm/libpldmresponder/file_io_type_cert.cpp
index 83d082e..5f0d220 100644
--- a/oem/ibm/libpldmresponder/file_io_type_cert.cpp
+++ b/oem/ibm/libpldmresponder/file_io_type_cert.cpp
@@ -1,7 +1,7 @@
 #include "file_io_type_cert.hpp"
 
 #include "libpldm/base.h"
-#include "oem/ibm/libpldm/file_io.h"
+#include "libpldm/file_io.h"
 
 #include "common/utils.hpp"
 
diff --git a/oem/ibm/libpldmresponder/file_io_type_dump.cpp b/oem/ibm/libpldmresponder/file_io_type_dump.cpp
index 1ff1f54..94821b4 100644
--- a/oem/ibm/libpldmresponder/file_io_type_dump.cpp
+++ b/oem/ibm/libpldmresponder/file_io_type_dump.cpp
@@ -1,7 +1,7 @@
 #include "file_io_type_dump.hpp"
 
 #include "libpldm/base.h"
-#include "oem/ibm/libpldm/file_io.h"
+#include "libpldm/file_io.h"
 
 #include "common/utils.hpp"
 #include "utils.hpp"
diff --git a/oem/ibm/libpldmresponder/file_io_type_pel.cpp b/oem/ibm/libpldmresponder/file_io_type_pel.cpp
index 6a40ebb..022b75e 100644
--- a/oem/ibm/libpldmresponder/file_io_type_pel.cpp
+++ b/oem/ibm/libpldmresponder/file_io_type_pel.cpp
@@ -3,7 +3,7 @@
 #include "file_io_type_pel.hpp"
 
 #include "libpldm/base.h"
-#include "oem/ibm/libpldm/file_io.h"
+#include "libpldm/file_io.h"
 
 #include "common/utils.hpp"
 #include "xyz/openbmc_project/Common/error.hpp"
diff --git a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
index 0881869..abe9e69 100644
--- a/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
+++ b/oem/ibm/libpldmresponder/oem_ibm_handler.cpp
@@ -1,7 +1,7 @@
 #include "oem_ibm_handler.hpp"
 
 #include "libpldm/entity.h"
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "file_io_type_lid.hpp"
 #include "libpldmresponder/file_io.hpp"
diff --git a/oem/ibm/libpldmresponder/oem_ibm_handler.hpp b/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
index 6c1983c..b5f4032 100644
--- a/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
+++ b/oem/ibm/libpldmresponder/oem_ibm_handler.hpp
@@ -1,7 +1,7 @@
 #pragma once
 #include "libpldm/entity.h"
 #include "libpldm/platform.h"
-#include "oem/ibm/libpldm/state_set_oem_ibm.h"
+#include "libpldm/state_set_oem_ibm.h"
 
 #include "inband_code_update.hpp"
 #include "libpldmresponder/oem_handler.hpp"
diff --git a/oem/ibm/libpldmresponder/platform_oem_ibm.cpp b/oem/ibm/libpldmresponder/platform_oem_ibm.cpp
index 35dc058..3f090a9 100644
--- a/oem/ibm/libpldmresponder/platform_oem_ibm.cpp
+++ b/oem/ibm/libpldmresponder/platform_oem_ibm.cpp
@@ -1,7 +1,7 @@
 #include "platform_oem_ibm.hpp"
 
 #include "libpldm/platform_oem_ibm.h"
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "common/utils.hpp"
 #include "libpldmresponder/pdr.hpp"
diff --git a/oem/ibm/requester/dbus_to_file_handler.cpp b/oem/ibm/requester/dbus_to_file_handler.cpp
index 67ea9fb..3f031bc 100644
--- a/oem/ibm/requester/dbus_to_file_handler.cpp
+++ b/oem/ibm/requester/dbus_to_file_handler.cpp
@@ -1,7 +1,7 @@
 #include "dbus_to_file_handler.hpp"
 
-#include "libpldm/requester/pldm.h"
-#include "oem/ibm/libpldm/file_io.h"
+#include "libpldm/file_io.h"
+#include "libpldm/pldm.h"
 
 #include "common/utils.hpp"
 
diff --git a/pldmtool/oem/ibm/oem_ibm_state_set.hpp b/pldmtool/oem/ibm/oem_ibm_state_set.hpp
index d69e2fc..7799c61 100644
--- a/pldmtool/oem/ibm/oem_ibm_state_set.hpp
+++ b/pldmtool/oem/ibm/oem_ibm_state_set.hpp
@@ -1,4 +1,4 @@
-#include "oem/ibm/libpldm/state_set_oem_ibm.h"
+#include "libpldm/state_set_oem_ibm.h"
 
 #include <libpldm/entity.h>
 #include <libpldm/entity_oem_ibm.h>
diff --git a/pldmtool/oem/ibm/pldm_oem_ibm.cpp b/pldmtool/oem/ibm/pldm_oem_ibm.cpp
index 11b0b5d..86081f4 100644
--- a/pldmtool/oem/ibm/pldm_oem_ibm.cpp
+++ b/pldmtool/oem/ibm/pldm_oem_ibm.cpp
@@ -1,8 +1,8 @@
 #include "pldm_oem_ibm.hpp"
 
-#include "oem/ibm/libpldm/file_io.h"
-#include "oem/ibm/libpldm/host.h"
-#include "pldm_types.h"
+#include "libpldm/file_io.h"
+#include "libpldm/host.h"
+#include "libpldm/pldm_types.h"
 
 #include "../../pldm_cmd_helper.hpp"
 
diff --git a/pldmtool/pldm_cmd_helper.cpp b/pldmtool/pldm_cmd_helper.cpp
index b8a4b6d..039e984 100644
--- a/pldmtool/pldm_cmd_helper.cpp
+++ b/pldmtool/pldm_cmd_helper.cpp
@@ -1,6 +1,6 @@
 #include "pldm_cmd_helper.hpp"
 
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "xyz/openbmc_project/Common/error.hpp"
 
diff --git a/pldmtool/pldm_fru_cmd.cpp b/pldmtool/pldm_fru_cmd.cpp
index 6b3b399..6882916 100644
--- a/pldmtool/pldm_fru_cmd.cpp
+++ b/pldmtool/pldm_fru_cmd.cpp
@@ -3,7 +3,7 @@
 #include "pldm_cmd_helper.hpp"
 
 #ifdef OEM_IBM
-#include "oem/ibm/libpldm/fru.h"
+#include "libpldm/fru_oem_ibm.h"
 #endif
 
 #include <endian.h>
diff --git a/requester/handler.hpp b/requester/handler.hpp
index 2d0343a..8776359 100644
--- a/requester/handler.hpp
+++ b/requester/handler.hpp
@@ -3,7 +3,7 @@
 #include "config.h"
 
 #include "libpldm/base.h"
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "common/types.hpp"
 #include "pldmd/dbus_impl_requester.hpp"
diff --git a/requester/mctp_endpoint_discovery.cpp b/requester/mctp_endpoint_discovery.cpp
index d13c979..afdceaa 100644
--- a/requester/mctp_endpoint_discovery.cpp
+++ b/requester/mctp_endpoint_discovery.cpp
@@ -1,6 +1,6 @@
 #include "mctp_endpoint_discovery.hpp"
 
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "common/types.hpp"
 #include "common/utils.hpp"
@@ -103,4 +103,4 @@
     }
 }
 
-} // namespace pldm
\ No newline at end of file
+} // namespace pldm
diff --git a/requester/request.hpp b/requester/request.hpp
index 8df3d03..c8256ed 100644
--- a/requester/request.hpp
+++ b/requester/request.hpp
@@ -1,7 +1,7 @@
 #pragma once
 
 #include "libpldm/base.h"
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "common/flight_recorder.hpp"
 #include "common/types.hpp"
diff --git a/softoff/softoff.cpp b/softoff/softoff.cpp
index 1b6f16e..edfd29a 100644
--- a/softoff/softoff.cpp
+++ b/softoff/softoff.cpp
@@ -4,7 +4,7 @@
 
 #include "libpldm/entity.h"
 #include "libpldm/platform.h"
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 #include "libpldm/state_set.h"
 
 #include "common/utils.hpp"
diff --git a/softoff/softoff.hpp b/softoff/softoff.hpp
index e9a8f442..b756a0a 100644
--- a/softoff/softoff.hpp
+++ b/softoff/softoff.hpp
@@ -1,6 +1,6 @@
 #pragma once
 
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include "common/types.hpp"
 
diff --git a/libpldm/.clang-format b/subprojects/libpldm/.clang-format
similarity index 100%
rename from libpldm/.clang-format
rename to subprojects/libpldm/.clang-format
diff --git a/subprojects/libpldm/LICENSE b/subprojects/libpldm/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/subprojects/libpldm/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/libpldm/base.h b/subprojects/libpldm/include/libpldm/base.h
similarity index 100%
rename from libpldm/base.h
rename to subprojects/libpldm/include/libpldm/base.h
diff --git a/libpldm/bios.h b/subprojects/libpldm/include/libpldm/bios.h
similarity index 100%
rename from libpldm/bios.h
rename to subprojects/libpldm/include/libpldm/bios.h
diff --git a/libpldm/bios_table.h b/subprojects/libpldm/include/libpldm/bios_table.h
similarity index 100%
rename from libpldm/bios_table.h
rename to subprojects/libpldm/include/libpldm/bios_table.h
diff --git a/libpldm/entity.h b/subprojects/libpldm/include/libpldm/entity.h
similarity index 100%
rename from libpldm/entity.h
rename to subprojects/libpldm/include/libpldm/entity.h
diff --git a/libpldm/firmware_update.h b/subprojects/libpldm/include/libpldm/firmware_update.h
similarity index 100%
rename from libpldm/firmware_update.h
rename to subprojects/libpldm/include/libpldm/firmware_update.h
diff --git a/libpldm/fru.h b/subprojects/libpldm/include/libpldm/fru.h
similarity index 100%
rename from libpldm/fru.h
rename to subprojects/libpldm/include/libpldm/fru.h
diff --git a/subprojects/libpldm/include/libpldm/meson.build b/subprojects/libpldm/include/libpldm/meson.build
new file mode 100644
index 0000000..0d25754
--- /dev/null
+++ b/subprojects/libpldm/include/libpldm/meson.build
@@ -0,0 +1,35 @@
+libpldm_include_dir += include_directories('.')
+
+libpldm_headers += files(
+  'base.h',
+  'pldm_types.h',
+  'platform.h',
+  'bios.h',
+  'bios_table.h',
+  'entity.h',
+  'states.h',
+  'state_set.h',
+  'fru.h',
+  'utils.h',
+  'pdr.h',
+  'firmware_update.h'
+  )
+
+if get_option('oem-ibm').enabled()
+  libpldm_include_dir += include_directories('oem/ibm')
+  libpldm_headers += files(
+    'oem/ibm/libpldm/entity_oem_ibm.h',
+    'oem/ibm/libpldm/file_io.h',
+    'oem/ibm/libpldm/host.h',
+    'oem/ibm/libpldm/fru_oem_ibm.h',
+    'oem/ibm/libpldm/platform_oem_ibm.h',
+    'oem/ibm/libpldm/state_set_oem_ibm.h'
+  )
+endif
+
+if get_option('requester-api').enabled()
+   libpldm_headers += files(
+    'requester/pldm.h'
+    )
+endif
+
diff --git a/libpldm/oem/ibm/libpldm/entity_oem_ibm.h b/subprojects/libpldm/include/libpldm/oem/ibm/libpldm/entity_oem_ibm.h
similarity index 100%
rename from libpldm/oem/ibm/libpldm/entity_oem_ibm.h
rename to subprojects/libpldm/include/libpldm/oem/ibm/libpldm/entity_oem_ibm.h
diff --git a/libpldm/oem/ibm/libpldm/file_io.h b/subprojects/libpldm/include/libpldm/oem/ibm/libpldm/file_io.h
similarity index 100%
rename from libpldm/oem/ibm/libpldm/file_io.h
rename to subprojects/libpldm/include/libpldm/oem/ibm/libpldm/file_io.h
diff --git a/libpldm/oem/ibm/libpldm/fru.h b/subprojects/libpldm/include/libpldm/oem/ibm/libpldm/fru_oem_ibm.h
similarity index 100%
rename from libpldm/oem/ibm/libpldm/fru.h
rename to subprojects/libpldm/include/libpldm/oem/ibm/libpldm/fru_oem_ibm.h
diff --git a/libpldm/oem/ibm/libpldm/host.h b/subprojects/libpldm/include/libpldm/oem/ibm/libpldm/host.h
similarity index 100%
rename from libpldm/oem/ibm/libpldm/host.h
rename to subprojects/libpldm/include/libpldm/oem/ibm/libpldm/host.h
diff --git a/libpldm/oem/ibm/libpldm/platform_oem_ibm.h b/subprojects/libpldm/include/libpldm/oem/ibm/libpldm/platform_oem_ibm.h
similarity index 100%
rename from libpldm/oem/ibm/libpldm/platform_oem_ibm.h
rename to subprojects/libpldm/include/libpldm/oem/ibm/libpldm/platform_oem_ibm.h
diff --git a/libpldm/oem/ibm/libpldm/state_set_oem_ibm.h b/subprojects/libpldm/include/libpldm/oem/ibm/libpldm/state_set_oem_ibm.h
similarity index 100%
rename from libpldm/oem/ibm/libpldm/state_set_oem_ibm.h
rename to subprojects/libpldm/include/libpldm/oem/ibm/libpldm/state_set_oem_ibm.h
diff --git a/libpldm/pdr.h b/subprojects/libpldm/include/libpldm/pdr.h
similarity index 100%
rename from libpldm/pdr.h
rename to subprojects/libpldm/include/libpldm/pdr.h
diff --git a/libpldm/platform.h b/subprojects/libpldm/include/libpldm/platform.h
similarity index 100%
rename from libpldm/platform.h
rename to subprojects/libpldm/include/libpldm/platform.h
diff --git a/libpldm/pldm.h b/subprojects/libpldm/include/libpldm/pldm.h
similarity index 100%
rename from libpldm/pldm.h
rename to subprojects/libpldm/include/libpldm/pldm.h
diff --git a/libpldm/pldm_types.h b/subprojects/libpldm/include/libpldm/pldm_types.h
similarity index 100%
rename from libpldm/pldm_types.h
rename to subprojects/libpldm/include/libpldm/pldm_types.h
diff --git a/libpldm/requester/pldm.h b/subprojects/libpldm/include/libpldm/requester/pldm.h
similarity index 100%
rename from libpldm/requester/pldm.h
rename to subprojects/libpldm/include/libpldm/requester/pldm.h
diff --git a/libpldm/state_set.h b/subprojects/libpldm/include/libpldm/state_set.h
similarity index 100%
rename from libpldm/state_set.h
rename to subprojects/libpldm/include/libpldm/state_set.h
diff --git a/libpldm/states.h b/subprojects/libpldm/include/libpldm/states.h
similarity index 100%
rename from libpldm/states.h
rename to subprojects/libpldm/include/libpldm/states.h
diff --git a/libpldm/utils.h b/subprojects/libpldm/include/libpldm/utils.h
similarity index 100%
rename from libpldm/utils.h
rename to subprojects/libpldm/include/libpldm/utils.h
diff --git a/libpldm/libpldm.pc.in b/subprojects/libpldm/libpldm.pc.in
similarity index 100%
rename from libpldm/libpldm.pc.in
rename to subprojects/libpldm/libpldm.pc.in
diff --git a/subprojects/libpldm/meson.build b/subprojects/libpldm/meson.build
new file mode 100644
index 0000000..fe06a35
--- /dev/null
+++ b/subprojects/libpldm/meson.build
@@ -0,0 +1,50 @@
+project('libpldm', ['c','cpp'],
+    default_options: [
+      'buildtype=debugoptimized',
+      'warning_level=3',
+      'werror=true',
+      'cpp_std=c++20',
+      'c_std=c17',
+      'tests=' + (meson.is_subproject() ? 'disabled' : 'enabled'),
+    ],
+    version: '0.1.0',
+    meson_version: '>=0.63.0',
+)
+
+add_project_arguments('-D_DEFAULT_SOURCE',language:['c'])
+
+libpldm_sources = files()
+subdir('src')
+
+libpldm_include_dir = ['include']
+libpldm_headers = files()
+
+subdir('include/libpldm')
+
+libpldm = library(
+  'pldm',
+   libpldm_sources,
+   implicit_include_directories: false,
+   include_directories: libpldm_include_dir,
+   version: meson.project_version(),
+   install: true
+   )
+
+install_headers(
+  libpldm_headers,
+  subdir:'libpldm'
+  )
+
+libpldm_dep = declare_dependency(
+  include_directories: libpldm_include_dir,
+  link_with: libpldm)
+
+import('pkgconfig').generate(
+  name: 'libpldm',
+  description: 'PLDM protocol encode/decode C lib',
+  version: meson.project_version(),
+  libraries: libpldm)
+
+if get_option('tests').enabled()
+  subdir('tests')
+endif
diff --git a/subprojects/libpldm/meson_options.txt b/subprojects/libpldm/meson_options.txt
new file mode 100644
index 0000000..0197fa9
--- /dev/null
+++ b/subprojects/libpldm/meson_options.txt
@@ -0,0 +1,3 @@
+option('tests', type: 'feature', description: 'Build tests', value: 'enabled')
+option('oem-ibm', type: 'feature', description: 'Enable IBM OEM PLDM', yield: true)
+option('requester-api', type: 'feature', description: 'Enable libpldm requester API', value: 'enabled')
diff --git a/libpldm/base.c b/subprojects/libpldm/src/base.c
similarity index 100%
rename from libpldm/base.c
rename to subprojects/libpldm/src/base.c
diff --git a/libpldm/bios.c b/subprojects/libpldm/src/bios.c
similarity index 100%
rename from libpldm/bios.c
rename to subprojects/libpldm/src/bios.c
diff --git a/libpldm/bios_table.c b/subprojects/libpldm/src/bios_table.c
similarity index 100%
rename from libpldm/bios_table.c
rename to subprojects/libpldm/src/bios_table.c
diff --git a/libpldm/firmware_update.c b/subprojects/libpldm/src/firmware_update.c
similarity index 100%
rename from libpldm/firmware_update.c
rename to subprojects/libpldm/src/firmware_update.c
diff --git a/libpldm/fru.c b/subprojects/libpldm/src/fru.c
similarity index 100%
rename from libpldm/fru.c
rename to subprojects/libpldm/src/fru.c
diff --git a/subprojects/libpldm/src/meson.build b/subprojects/libpldm/src/meson.build
new file mode 100644
index 0000000..fc44e8a
--- /dev/null
+++ b/subprojects/libpldm/src/meson.build
@@ -0,0 +1,19 @@
+
+libpldm_sources += files(
+  'base.c',
+  'bios.c',
+  'platform.c',
+  'bios_table.c',
+  'firmware_update.c',
+  'fru.c',
+  'pdr.c',
+  'utils.c'
+  )
+
+if get_option('oem-ibm').enabled()
+   subdir('oem/ibm')
+endif
+
+if get_option('requester-api').enabled()
+   subdir('requester')
+endif
diff --git a/libpldm/oem/ibm/libpldm/file_io.c b/subprojects/libpldm/src/oem/ibm/file_io.c
similarity index 99%
rename from libpldm/oem/ibm/libpldm/file_io.c
rename to subprojects/libpldm/src/oem/ibm/file_io.c
index fae3a9c..b3464cb 100644
--- a/libpldm/oem/ibm/libpldm/file_io.c
+++ b/subprojects/libpldm/src/oem/ibm/file_io.c
@@ -1,4 +1,4 @@
-#include "file_io.h"
+#include "libpldm/file_io.h"
 #include <endian.h>
 #include <string.h>
 
diff --git a/libpldm/oem/ibm/libpldm/host.c b/subprojects/libpldm/src/oem/ibm/host.c
similarity index 98%
rename from libpldm/oem/ibm/libpldm/host.c
rename to subprojects/libpldm/src/oem/ibm/host.c
index caaaf9e..d557a41 100644
--- a/libpldm/oem/ibm/libpldm/host.c
+++ b/subprojects/libpldm/src/oem/ibm/host.c
@@ -1,7 +1,7 @@
 #include <endian.h>
 #include <string.h>
 
-#include "host.h"
+#include "libpldm/host.h"
 
 int encode_get_alert_status_req(uint8_t instance_id, uint8_t version_id,
 				struct pldm_msg *msg, size_t payload_length)
diff --git a/subprojects/libpldm/src/oem/ibm/meson.build b/subprojects/libpldm/src/oem/ibm/meson.build
new file mode 100644
index 0000000..04bb24f
--- /dev/null
+++ b/subprojects/libpldm/src/oem/ibm/meson.build
@@ -0,0 +1,5 @@
+libpldm_sources += files(
+  'file_io.c',
+  'host.c',
+  'platform.c'
+  )
diff --git a/libpldm/oem/ibm/libpldm/platform_oem_ibm.c b/subprojects/libpldm/src/oem/ibm/platform.c
similarity index 94%
rename from libpldm/oem/ibm/libpldm/platform_oem_ibm.c
rename to subprojects/libpldm/src/oem/ibm/platform.c
index db7090a..15e9463 100644
--- a/libpldm/oem/ibm/libpldm/platform_oem_ibm.c
+++ b/subprojects/libpldm/src/oem/ibm/platform.c
@@ -1,5 +1,5 @@
-#include "platform_oem_ibm.h"
-#include "platform.h"
+#include "libpldm/platform.h"
+#include "libpldm/platform_oem_ibm.h"
 #include <string.h>
 
 int encode_bios_attribute_update_event_req(uint8_t instance_id,
@@ -47,4 +47,4 @@
 	       num_handles * sizeof(uint16_t));
 
 	return PLDM_SUCCESS;
-}
\ No newline at end of file
+}
diff --git a/libpldm/pdr.c b/subprojects/libpldm/src/pdr.c
similarity index 100%
rename from libpldm/pdr.c
rename to subprojects/libpldm/src/pdr.c
diff --git a/libpldm/platform.c b/subprojects/libpldm/src/platform.c
similarity index 100%
rename from libpldm/platform.c
rename to subprojects/libpldm/src/platform.c
diff --git a/subprojects/libpldm/src/requester/meson.build b/subprojects/libpldm/src/requester/meson.build
new file mode 100644
index 0000000..6798d02
--- /dev/null
+++ b/subprojects/libpldm/src/requester/meson.build
@@ -0,0 +1,3 @@
+libpldm_sources += files(
+  'pldm.c'
+  )
diff --git a/libpldm/requester/pldm.c b/subprojects/libpldm/src/requester/pldm.c
similarity index 100%
rename from libpldm/requester/pldm.c
rename to subprojects/libpldm/src/requester/pldm.c
diff --git a/libpldm/utils.c b/subprojects/libpldm/src/utils.c
similarity index 100%
rename from libpldm/utils.c
rename to subprojects/libpldm/src/utils.c
diff --git a/subprojects/libpldm/subprojects/googletest.wrap b/subprojects/libpldm/subprojects/googletest.wrap
new file mode 100644
index 0000000..56da9ef
--- /dev/null
+++ b/subprojects/libpldm/subprojects/googletest.wrap
@@ -0,0 +1,3 @@
+[wrap-git]
+url = https://github.com/google/googletest
+revision = HEAD
diff --git a/libpldm/tests/.clang-format b/subprojects/libpldm/tests/.clang-format
similarity index 100%
rename from libpldm/tests/.clang-format
rename to subprojects/libpldm/tests/.clang-format
diff --git a/libpldm/tests/libpldm_base_test.cpp b/subprojects/libpldm/tests/libpldm_base_test.cpp
similarity index 100%
rename from libpldm/tests/libpldm_base_test.cpp
rename to subprojects/libpldm/tests/libpldm_base_test.cpp
diff --git a/libpldm/tests/libpldm_bios_table_test.cpp b/subprojects/libpldm/tests/libpldm_bios_table_test.cpp
similarity index 100%
rename from libpldm/tests/libpldm_bios_table_test.cpp
rename to subprojects/libpldm/tests/libpldm_bios_table_test.cpp
diff --git a/libpldm/tests/libpldm_bios_test.cpp b/subprojects/libpldm/tests/libpldm_bios_test.cpp
similarity index 100%
rename from libpldm/tests/libpldm_bios_test.cpp
rename to subprojects/libpldm/tests/libpldm_bios_test.cpp
diff --git a/libpldm/tests/libpldm_firmware_update_test.cpp b/subprojects/libpldm/tests/libpldm_firmware_update_test.cpp
similarity index 100%
rename from libpldm/tests/libpldm_firmware_update_test.cpp
rename to subprojects/libpldm/tests/libpldm_firmware_update_test.cpp
diff --git a/libpldm/tests/libpldm_fru_test.cpp b/subprojects/libpldm/tests/libpldm_fru_test.cpp
similarity index 100%
rename from libpldm/tests/libpldm_fru_test.cpp
rename to subprojects/libpldm/tests/libpldm_fru_test.cpp
diff --git a/libpldm/tests/libpldm_pdr_test.cpp b/subprojects/libpldm/tests/libpldm_pdr_test.cpp
similarity index 100%
rename from libpldm/tests/libpldm_pdr_test.cpp
rename to subprojects/libpldm/tests/libpldm_pdr_test.cpp
diff --git a/libpldm/tests/libpldm_platform_test.cpp b/subprojects/libpldm/tests/libpldm_platform_test.cpp
similarity index 100%
rename from libpldm/tests/libpldm_platform_test.cpp
rename to subprojects/libpldm/tests/libpldm_platform_test.cpp
diff --git a/libpldm/tests/libpldm_utils_test.cpp b/subprojects/libpldm/tests/libpldm_utils_test.cpp
similarity index 100%
rename from libpldm/tests/libpldm_utils_test.cpp
rename to subprojects/libpldm/tests/libpldm_utils_test.cpp
diff --git a/subprojects/libpldm/tests/meson.build b/subprojects/libpldm/tests/meson.build
new file mode 100644
index 0000000..1955487
--- /dev/null
+++ b/subprojects/libpldm/tests/meson.build
@@ -0,0 +1,43 @@
+gtest_dep = dependency('gtest', main: true, disabler: true, required: false)
+gmock_dep = dependency('gmock', disabler: true, required: false)
+if not gtest_dep.found() or not gmock_dep.found()
+    gtest_proj = import('cmake').subproject('googletest', required: true)
+    gtest_dep = declare_dependency(
+            dependencies: [
+                dependency('threads'),
+                gtest_proj.dependency('gtest'),
+                gtest_proj.dependency('gtest_main'),
+            ]
+        )
+        gmock_dep = gtest_proj.dependency('gmock')
+endif
+
+
+tests = [
+  'libpldm_base_test',
+  'libpldm_platform_test',
+  'libpldm_bios_test',
+  'libpldm_bios_table_test',
+  'libpldm_fru_test',
+  'libpldm_utils_test',
+  'libpldm_pdr_test',
+  'libpldm_firmware_update_test'
+]
+
+if get_option('oem-ibm').enabled()
+  tests += [
+    'oem/ibm/libpldm_fileio_test',
+    'oem/ibm/libpldm_host_test',
+  ]
+endif
+
+foreach t : tests
+  test(t, executable(t.underscorify(), t + '.cpp',
+                     implicit_include_directories: false,
+                     dependencies: [
+                         libpldm_dep,
+                         gtest_dep,
+                         gmock_dep]),
+       workdir: meson.current_source_dir())
+endforeach
+
diff --git a/subprojects/libpldm/tests/oem/ibm/libpldm_fileio_test.cpp b/subprojects/libpldm/tests/oem/ibm/libpldm_fileio_test.cpp
new file mode 100644
index 0000000..f6c94e7
--- /dev/null
+++ b/subprojects/libpldm/tests/oem/ibm/libpldm_fileio_test.cpp
@@ -0,0 +1,2124 @@
+#include <string.h>
+
+#include <array>
+
+#include "libpldm/base.h"
+#include "libpldm/file_io.h"
+
+#include <gtest/gtest.h>
+
+constexpr auto hdrSize = sizeof(pldm_msg_hdr);
+
+TEST(ReadWriteFileMemory, testGoodDecodeRequest)
+{
+    std::array<uint8_t, PLDM_RW_FILE_MEM_REQ_BYTES + hdrSize> requestMsg{};
+
+    // Random value for fileHandle, offset, length, address
+    uint32_t fileHandle = 0x12345678;
+    uint32_t offset = 0x87654321;
+    uint32_t length = 0x13245768;
+    uint64_t address = 0x124356879ACBDE0F;
+    uint32_t fileHandleLe = htole32(fileHandle);
+    uint32_t offsetLe = htole32(offset);
+    uint32_t lengthLe = htole32(length);
+    uint64_t addressLe = htole64(address);
+
+    memcpy(requestMsg.data() + hdrSize, &fileHandleLe, sizeof(fileHandleLe));
+    memcpy(requestMsg.data() + sizeof(fileHandleLe) + hdrSize, &offsetLe,
+           sizeof(offsetLe));
+    memcpy(requestMsg.data() + sizeof(fileHandleLe) + sizeof(offsetLe) +
+               hdrSize,
+           &lengthLe, sizeof(lengthLe));
+    memcpy(requestMsg.data() + sizeof(fileHandleLe) + sizeof(offsetLe) +
+               sizeof(lengthLe) + hdrSize,
+           &addressLe, sizeof(addressLe));
+
+    uint32_t retFileHandle = 0;
+    uint32_t retOffset = 0;
+    uint32_t retLength = 0;
+    uint64_t retAddress = 0;
+
+    auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // Invoke decode the read file memory request
+    auto rc = decode_rw_file_memory_req(request, requestMsg.size() - hdrSize,
+                                        &retFileHandle, &retOffset, &retLength,
+                                        &retAddress);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(fileHandle, retFileHandle);
+    ASSERT_EQ(offset, retOffset);
+    ASSERT_EQ(length, retLength);
+    ASSERT_EQ(address, retAddress);
+}
+
+TEST(ReadWriteFileMemory, testBadDecodeRequest)
+{
+    uint32_t fileHandle = 0;
+    uint32_t offset = 0;
+    uint32_t length = 0;
+    uint64_t address = 0;
+
+    // Request payload message is missing
+    auto rc = decode_rw_file_memory_req(NULL, 0, &fileHandle, &offset, &length,
+                                        &address);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t, PLDM_RW_FILE_MEM_REQ_BYTES> requestMsg{};
+
+    auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // Address is NULL
+    rc = decode_rw_file_memory_req(request, requestMsg.size() - hdrSize,
+                                   &fileHandle, &offset, &length, NULL);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Payload length is invalid
+    rc = decode_rw_file_memory_req(request, 0, &fileHandle, &offset, &length,
+                                   &address);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ReadWriteFileMemory, testGoodEncodeResponse)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_RESP_BYTES>
+        responseMsg{};
+    uint32_t length = 0xFF00EE11;
+    uint32_t lengthLe = htole32(length);
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // ReadFileIntoMemory
+    auto rc = encode_rw_file_memory_resp(0, PLDM_READ_FILE_INTO_MEMORY,
+                                         PLDM_SUCCESS, length, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_INTO_MEMORY);
+    ASSERT_EQ(response->payload[0], PLDM_SUCCESS);
+    ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
+                        &lengthLe, sizeof(lengthLe)));
+
+    // WriteFileFromMemory
+    rc = encode_rw_file_memory_resp(0, PLDM_WRITE_FILE_FROM_MEMORY,
+                                    PLDM_SUCCESS, length, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_WRITE_FILE_FROM_MEMORY);
+    ASSERT_EQ(response->payload[0], PLDM_SUCCESS);
+    ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
+                        &lengthLe, sizeof(lengthLe)));
+}
+
+TEST(ReadWriteFileMemory, testBadEncodeResponse)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_RESP_BYTES>
+        responseMsg{};
+    uint32_t length = 0;
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // ReadFileIntoMemory
+    auto rc = encode_rw_file_memory_resp(0, PLDM_READ_FILE_INTO_MEMORY,
+                                         PLDM_ERROR, length, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_INTO_MEMORY);
+    ASSERT_EQ(response->payload[0], PLDM_ERROR);
+
+    // WriteFileFromMemory
+    rc = encode_rw_file_memory_resp(0, PLDM_WRITE_FILE_FROM_MEMORY, PLDM_ERROR,
+                                    length, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_WRITE_FILE_FROM_MEMORY);
+    ASSERT_EQ(response->payload[0], PLDM_ERROR);
+}
+
+TEST(ReadWriteFileIntoMemory, testGoodDecodeResponse)
+{
+    std::array<uint8_t, PLDM_RW_FILE_MEM_RESP_BYTES + hdrSize> responseMsg{};
+    // Random value for length
+    uint32_t length = 0xFF00EE12;
+    uint32_t lengthLe = htole32(length);
+    uint8_t completionCode = 0;
+
+    memcpy(responseMsg.data() + hdrSize, &completionCode,
+           sizeof(completionCode));
+    memcpy(responseMsg.data() + sizeof(completionCode) + hdrSize, &lengthLe,
+           sizeof(lengthLe));
+
+    uint8_t retCompletionCode = 0;
+    uint32_t retLength = 0;
+
+    auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // Invoke decode the read file memory response
+    auto rc = decode_rw_file_memory_resp(response, responseMsg.size() - hdrSize,
+                                         &retCompletionCode, &retLength);
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(completionCode, retCompletionCode);
+    ASSERT_EQ(length, retLength);
+}
+
+TEST(ReadWriteFileIntoMemory, testBadDecodeResponse)
+{
+    uint32_t length = 0;
+    uint8_t completionCode = 0;
+
+    // Request payload message is missing
+    auto rc = decode_rw_file_memory_resp(NULL, 0, &completionCode, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t, PLDM_RW_FILE_MEM_RESP_BYTES> responseMsg{};
+
+    auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // Payload length is invalid
+    rc = decode_rw_file_memory_resp(response, 0, &completionCode, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ReadWriteFileIntoMemory, testGoodEncodeRequest)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_MEM_REQ_BYTES>
+        requestMsg{};
+
+    uint32_t fileHandle = 0x12345678;
+    uint32_t offset = 0x87654321;
+    uint32_t length = 0x13245768;
+    uint64_t address = 0x124356879ACBDE0F;
+    uint32_t fileHandleLe = htole32(fileHandle);
+    uint32_t offsetLe = htole32(offset);
+    uint32_t lengthLe = htole32(length);
+    uint64_t addressLe = htole64(address);
+
+    pldm_msg* request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    auto rc =
+        encode_rw_file_memory_req(0, PLDM_READ_FILE_INTO_MEMORY, fileHandle,
+                                  offset, length, address, request);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
+    ASSERT_EQ(request->hdr.instance_id, 0);
+    ASSERT_EQ(request->hdr.type, PLDM_OEM);
+    ASSERT_EQ(request->hdr.command, PLDM_READ_FILE_INTO_MEMORY);
+
+    ASSERT_EQ(0, memcmp(request->payload, &fileHandleLe, sizeof(fileHandleLe)));
+
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileHandleLe), &offsetLe,
+                        sizeof(offsetLe)));
+    ASSERT_EQ(0,
+              memcmp(request->payload + sizeof(fileHandleLe) + sizeof(offsetLe),
+                     &lengthLe, sizeof(lengthLe)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileHandleLe) +
+                            sizeof(offsetLe) + sizeof(lengthLe),
+                        &addressLe, sizeof(addressLe)));
+}
+
+TEST(ReadWriteFileIntoMemory, testBadEncodeRequest)
+{
+    uint32_t fileHandle = 0;
+    uint32_t offset = 0;
+    uint32_t length = 0;
+    uint64_t address = 0;
+
+    auto rc =
+        encode_rw_file_memory_req(0, PLDM_READ_FILE_INTO_MEMORY, fileHandle,
+                                  offset, length, address, NULL);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(GetFileTable, GoodDecodeRequest)
+{
+    std::array<uint8_t, PLDM_GET_FILE_TABLE_REQ_BYTES + hdrSize> requestMsg{};
+
+    // Random value for DataTransferHandle, TransferOperationFlag, TableType
+    uint32_t transferHandle = 0x12345678;
+    uint32_t transferHandleLe = htole32(transferHandle);
+    uint8_t transferOpFlag = 1;
+    uint8_t tableType = 1;
+
+    memcpy(requestMsg.data() + hdrSize, &transferHandleLe,
+           sizeof(transferHandleLe));
+    memcpy(requestMsg.data() + sizeof(transferHandle) + hdrSize,
+           &transferOpFlag, sizeof(transferOpFlag));
+    memcpy(requestMsg.data() + sizeof(transferHandle) + sizeof(transferOpFlag) +
+               hdrSize,
+           &tableType, sizeof(tableType));
+
+    uint32_t retTransferHandle = 0;
+    uint8_t retTransferOpFlag = 0;
+    uint8_t retTableType = 0;
+
+    auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // Invoke decode get file table request
+    auto rc = decode_get_file_table_req(request, requestMsg.size() - hdrSize,
+                                        &retTransferHandle, &retTransferOpFlag,
+                                        &retTableType);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(transferHandle, retTransferHandle);
+    ASSERT_EQ(transferOpFlag, retTransferOpFlag);
+    ASSERT_EQ(tableType, retTableType);
+}
+
+TEST(GetFileTable, BadDecodeRequest)
+{
+    uint32_t transferHandle = 0;
+    uint8_t transferOpFlag = 0;
+    uint8_t tableType = 0;
+
+    // Request payload message is missing
+    auto rc = decode_get_file_table_req(nullptr, 0, &transferHandle,
+                                        &transferOpFlag, &tableType);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t, PLDM_GET_FILE_TABLE_REQ_BYTES> requestMsg{};
+
+    auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // TableType is NULL
+    rc = decode_get_file_table_req(request, requestMsg.size() - hdrSize,
+                                   &transferHandle, &transferOpFlag, nullptr);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Payload length is invalid
+    rc = decode_get_file_table_req(request, 0, &transferHandle, &transferOpFlag,
+                                   &tableType);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(GetFileTable, GoodEncodeResponse)
+{
+    // Random value for NextDataTransferHandle and TransferFlag
+    uint8_t completionCode = 0;
+    uint32_t nextTransferHandle = 0x87654321;
+    uint32_t nextTransferHandleLe = htole32(nextTransferHandle);
+    uint8_t transferFlag = 5;
+    // Mock file table contents of size 5
+    std::array<uint8_t, 5> fileTable = {1, 2, 3, 4, 5};
+    constexpr size_t responseSize = sizeof(completionCode) +
+                                    sizeof(nextTransferHandle) +
+                                    sizeof(transferFlag) + fileTable.size();
+
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + responseSize> responseMsg{};
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // GetFileTable
+    auto rc = encode_get_file_table_resp(0, PLDM_SUCCESS, nextTransferHandle,
+                                         transferFlag, fileTable.data(),
+                                         fileTable.size(), response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_GET_FILE_TABLE);
+    ASSERT_EQ(response->payload[0], PLDM_SUCCESS);
+    ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]),
+                        &nextTransferHandleLe, sizeof(nextTransferHandle)));
+    ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
+                            sizeof(nextTransferHandle),
+                        &transferFlag, sizeof(transferFlag)));
+    ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
+                            sizeof(nextTransferHandle),
+                        &transferFlag, sizeof(transferFlag)));
+    ASSERT_EQ(0, memcmp(response->payload + sizeof(response->payload[0]) +
+                            sizeof(nextTransferHandle) + sizeof(transferFlag),
+                        fileTable.data(), fileTable.size()));
+}
+
+TEST(GetFileTable, BadEncodeResponse)
+{
+    uint8_t completionCode = 0;
+    uint32_t nextTransferHandle = 0;
+    uint8_t transferFlag = 0;
+    constexpr size_t responseSize = sizeof(completionCode) +
+                                    sizeof(nextTransferHandle) +
+                                    sizeof(transferFlag);
+
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + responseSize> responseMsg{};
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // GetFileTable
+    auto rc = encode_get_file_table_resp(0, PLDM_ERROR, nextTransferHandle,
+                                         transferFlag, nullptr, 0, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_GET_FILE_TABLE);
+    ASSERT_EQ(response->payload[0], PLDM_ERROR);
+}
+
+TEST(GetFileTable, GoodEncodeRequest)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_GET_FILE_TABLE_REQ_BYTES>
+        requestMsg{};
+    uint32_t transferHandle = 0x0;
+    uint8_t transferOpFlag = 0x01;
+    uint8_t tableType = PLDM_FILE_ATTRIBUTE_TABLE;
+
+    auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    auto rc = encode_get_file_table_req(0, transferHandle, transferOpFlag,
+                                        tableType, request);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+
+    struct pldm_get_file_table_req* req =
+        reinterpret_cast<struct pldm_get_file_table_req*>(request->payload);
+    EXPECT_EQ(transferHandle, le32toh(req->transfer_handle));
+    EXPECT_EQ(transferOpFlag, req->operation_flag);
+    EXPECT_EQ(tableType, req->table_type);
+}
+
+TEST(GetFileTable, BadEncodeRequest)
+{
+    uint32_t transferHandle = 0x0;
+    uint8_t transferOpFlag = 0x01;
+    uint8_t tableType = PLDM_FILE_ATTRIBUTE_TABLE;
+
+    auto rc = encode_get_file_table_req(0, transferHandle, transferOpFlag,
+                                        tableType, nullptr);
+
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(GetFileTable, GoodDecodeResponse)
+{
+    uint32_t nextTransferHandle = 32;
+    uint8_t completionCode = PLDM_SUCCESS;
+    uint8_t transferFlag = PLDM_START_AND_END;
+    std::vector<uint8_t> fileTableData = {1, 2, 3, 4, 5, 6, 7, 8, 9};
+
+    std::vector<uint8_t> responseMsg(
+        hdrSize + PLDM_GET_FILE_TABLE_MIN_RESP_BYTES + fileTableData.size());
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    size_t payload_length = responseMsg.size() - hdrSize;
+
+    auto resp = reinterpret_cast<struct pldm_get_file_table_resp*>(
+        responsePtr->payload);
+
+    resp->completion_code = completionCode;
+    resp->next_transfer_handle = htole32(nextTransferHandle);
+    resp->transfer_flag = transferFlag;
+    memcpy(resp->table_data, fileTableData.data(), fileTableData.size());
+
+    uint8_t retCompletionCode;
+    uint32_t retNextTransferHandle;
+    uint8_t retTransferFlag;
+    std::vector<uint8_t> retFileTableData(9, 0);
+    size_t retFileTableDataLength = 0;
+
+    auto rc = decode_get_file_table_resp(
+        responsePtr, payload_length, &retCompletionCode, &retNextTransferHandle,
+        &retTransferFlag, retFileTableData.data(), &retFileTableDataLength);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(completionCode, retCompletionCode);
+    ASSERT_EQ(nextTransferHandle, retNextTransferHandle);
+    ASSERT_EQ(transferFlag, retTransferFlag);
+    ASSERT_EQ(0, memcmp(fileTableData.data(), resp->table_data,
+                        retFileTableDataLength));
+    ASSERT_EQ(fileTableData.size(), retFileTableDataLength);
+}
+
+TEST(GetFileTable, BadDecodeResponse)
+{
+    uint32_t nextTransferHandle = 32;
+    uint8_t completionCode = PLDM_SUCCESS;
+    uint8_t transferFlag = PLDM_START_AND_END;
+    std::vector<uint8_t> fileTableData(9, 0);
+    size_t file_table_data_length = 0;
+
+    std::vector<uint8_t> responseMsg(
+        hdrSize + PLDM_GET_FILE_TABLE_MIN_RESP_BYTES + fileTableData.size());
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    auto rc = decode_get_file_table_resp(
+        nullptr, 0, &completionCode, &nextTransferHandle, &transferFlag,
+        fileTableData.data(), &file_table_data_length);
+
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    rc = decode_get_file_table_resp(
+        responsePtr, 0, &completionCode, &nextTransferHandle, &transferFlag,
+        fileTableData.data(), &file_table_data_length);
+
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ReadFile, testGoodDecodeRequest)
+{
+    std::array<uint8_t, PLDM_READ_FILE_REQ_BYTES + sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
+    auto request = reinterpret_cast<pldm_read_file_req*>(requestPtr->payload);
+
+    // Random value for fileHandle, offset and length
+    uint32_t fileHandle = 0x12345678;
+    uint32_t offset = 0x87654321;
+    uint32_t length = 0x13245768;
+
+    request->file_handle = htole32(fileHandle);
+    request->offset = htole32(offset);
+    request->length = htole32(length);
+
+    uint32_t retFileHandle = 0;
+    uint32_t retOffset = 0;
+    uint32_t retLength = 0;
+
+    // Invoke decode the read file request
+    auto rc = decode_read_file_req(requestPtr, payload_length, &retFileHandle,
+                                   &retOffset, &retLength);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(fileHandle, retFileHandle);
+    ASSERT_EQ(offset, retOffset);
+    ASSERT_EQ(length, retLength);
+}
+
+TEST(WriteFile, testGoodDecodeRequest)
+{
+    // Random value for fileHandle, offset, length and file data
+    uint32_t fileHandle = 0x12345678;
+    uint32_t offset = 0x87654321;
+    uint32_t length = 0x467;
+
+    std::vector<uint8_t> requestMsg(PLDM_WRITE_FILE_REQ_BYTES +
+                                    sizeof(pldm_msg_hdr) + length);
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
+    auto request = reinterpret_cast<pldm_write_file_req*>(requestPtr->payload);
+
+    size_t fileDataOffset =
+        sizeof(fileHandle) + sizeof(offset) + sizeof(length);
+
+    request->file_handle = htole32(fileHandle);
+    request->offset = htole32(offset);
+    request->length = htole32(length);
+
+    uint32_t retFileHandle = 0;
+    uint32_t retOffset = 0;
+    uint32_t retLength = 0;
+    size_t retFileDataOffset = 0;
+
+    // Invoke decode the write file request
+    auto rc = decode_write_file_req(requestPtr, payload_length, &retFileHandle,
+                                    &retOffset, &retLength, &retFileDataOffset);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(fileHandle, retFileHandle);
+    ASSERT_EQ(offset, retOffset);
+    ASSERT_EQ(length, retLength);
+    ASSERT_EQ(fileDataOffset, retFileDataOffset);
+}
+
+TEST(ReadFile, testGoodDecodeResponse)
+{
+    // Random value for length
+    uint32_t length = 0x10;
+    uint8_t completionCode = PLDM_SUCCESS;
+
+    std::vector<uint8_t> responseMsg(PLDM_READ_FILE_RESP_BYTES +
+                                     sizeof(pldm_msg_hdr) + length);
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
+    auto response =
+        reinterpret_cast<pldm_read_file_resp*>(responsePtr->payload);
+
+    response->completion_code = completionCode;
+    response->length = htole32(length);
+
+    size_t fileDataOffset = sizeof(completionCode) + sizeof(length);
+
+    uint32_t retLength = 0;
+    uint8_t retCompletionCode = 0;
+    size_t retFileDataOffset = 0;
+
+    // Invoke decode the read file response
+    auto rc =
+        decode_read_file_resp(responsePtr, payload_length, &retCompletionCode,
+                              &retLength, &retFileDataOffset);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(completionCode, retCompletionCode);
+    ASSERT_EQ(length, retLength);
+    ASSERT_EQ(fileDataOffset, retFileDataOffset);
+}
+
+TEST(WriteFile, testGoodDecodeResponse)
+{
+    std::array<uint8_t, PLDM_WRITE_FILE_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsg{};
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
+    auto response =
+        reinterpret_cast<pldm_write_file_resp*>(responsePtr->payload);
+
+    uint8_t completionCode = PLDM_SUCCESS;
+    uint32_t length = 0x4678;
+
+    response->completion_code = completionCode;
+    response->length = htole32(length);
+
+    uint32_t retLength = 0;
+    uint8_t retCompletionCode = 0;
+
+    // Invoke decode the write file response
+    auto rc = decode_write_file_resp(responsePtr, payload_length,
+                                     &retCompletionCode, &retLength);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(completionCode, retCompletionCode);
+    ASSERT_EQ(length, retLength);
+}
+
+TEST(ReadWriteFile, testBadDecodeResponse)
+{
+    uint32_t length = 0;
+    uint8_t completionCode = 0;
+    size_t fileDataOffset = 0;
+
+    // Bad decode response for read file
+    std::vector<uint8_t> responseMsg(PLDM_READ_FILE_RESP_BYTES +
+                                     sizeof(pldm_msg_hdr) + length);
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // Request payload message is missing
+    auto rc = decode_read_file_resp(NULL, 0, &completionCode, &length,
+                                    &fileDataOffset);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Payload length is invalid
+    rc = decode_read_file_resp(responsePtr, 0, &completionCode, &length,
+                               &fileDataOffset);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    // Bad decode response for write file
+    std::array<uint8_t, PLDM_WRITE_FILE_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsgWr{};
+    auto responseWr = reinterpret_cast<pldm_msg*>(responseMsgWr.data());
+
+    // Request payload message is missing
+    rc = decode_write_file_resp(NULL, 0, &completionCode, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Payload length is invalid
+    rc = decode_write_file_resp(responseWr, 0, &completionCode, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ReadWriteFile, testBadDecodeRequest)
+{
+    uint32_t fileHandle = 0;
+    uint32_t offset = 0;
+    uint32_t length = 0;
+
+    // Bad decode request for read file
+    std::array<uint8_t, PLDM_READ_FILE_REQ_BYTES + sizeof(pldm_msg_hdr)>
+        requestMsg{};
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // Request payload message is missing
+    auto rc = decode_read_file_req(NULL, 0, &fileHandle, &offset, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Payload length is invalid
+    rc = decode_read_file_req(requestPtr, 0, &fileHandle, &offset, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    // Bad decode request for write file
+    size_t fileDataOffset = 0;
+    std::array<uint8_t, PLDM_WRITE_FILE_REQ_BYTES> requestMsgWr{};
+    auto requestWr = reinterpret_cast<pldm_msg*>(requestMsgWr.data());
+
+    // Request payload message is missing
+    rc = decode_write_file_req(NULL, 0, &fileHandle, &offset, &length,
+                               &fileDataOffset);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Payload length is invalid
+    rc = decode_write_file_req(requestWr, 0, &fileHandle, &offset, &length,
+                               &fileDataOffset);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ReadFile, testGoodEncodeResponse)
+{
+    // Good encode response for read file
+    uint32_t length = 0x4;
+
+    std::vector<uint8_t> responseMsg(PLDM_READ_FILE_RESP_BYTES +
+                                     sizeof(pldm_msg_hdr) + length);
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    auto response =
+        reinterpret_cast<pldm_read_file_resp*>(responsePtr->payload);
+
+    // ReadFile
+    auto rc = encode_read_file_resp(0, PLDM_SUCCESS, length, responsePtr);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(responsePtr->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(responsePtr->hdr.instance_id, 0);
+    ASSERT_EQ(responsePtr->hdr.type, PLDM_OEM);
+    ASSERT_EQ(responsePtr->hdr.command, PLDM_READ_FILE);
+    ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
+    ASSERT_EQ(le32toh(response->length), length);
+}
+
+TEST(WriteFile, testGoodEncodeResponse)
+{
+    uint32_t length = 0x467;
+
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_WRITE_FILE_RESP_BYTES>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    auto response =
+        reinterpret_cast<pldm_write_file_resp*>(responsePtr->payload);
+
+    // WriteFile
+    auto rc = encode_write_file_resp(0, PLDM_SUCCESS, length, responsePtr);
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(responsePtr->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(responsePtr->hdr.instance_id, 0);
+    ASSERT_EQ(responsePtr->hdr.type, PLDM_OEM);
+    ASSERT_EQ(responsePtr->hdr.command, PLDM_WRITE_FILE);
+    ASSERT_EQ(response->completion_code, PLDM_SUCCESS);
+    ASSERT_EQ(le32toh(response->length), length);
+}
+
+TEST(ReadFile, testGoodEncodeRequest)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
+        requestMsg{};
+
+    uint32_t fileHandle = 0x12345678;
+    uint32_t offset = 0x87654321;
+    uint32_t length = 0x13245768;
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    auto request = reinterpret_cast<pldm_read_file_req*>(requestPtr->payload);
+
+    // ReadFile
+    auto rc = encode_read_file_req(0, fileHandle, offset, length, requestPtr);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(requestPtr->hdr.request, PLDM_REQUEST);
+    ASSERT_EQ(requestPtr->hdr.instance_id, 0);
+    ASSERT_EQ(requestPtr->hdr.type, PLDM_OEM);
+    ASSERT_EQ(requestPtr->hdr.command, PLDM_READ_FILE);
+    ASSERT_EQ(le32toh(request->file_handle), fileHandle);
+    ASSERT_EQ(le32toh(request->offset), offset);
+    ASSERT_EQ(le32toh(request->length), length);
+}
+
+TEST(WriteFile, testGoodEncodeRequest)
+{
+    uint32_t fileHandle = 0x12345678;
+    uint32_t offset = 0x87654321;
+    uint32_t length = 0x456;
+
+    std::vector<uint8_t> requestMsg(PLDM_WRITE_FILE_REQ_BYTES +
+                                    sizeof(pldm_msg_hdr) + length);
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    auto request = reinterpret_cast<pldm_write_file_req*>(requestPtr->payload);
+
+    // WriteFile
+    auto rc = encode_write_file_req(0, fileHandle, offset, length, requestPtr);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(requestPtr->hdr.request, PLDM_REQUEST);
+    ASSERT_EQ(requestPtr->hdr.instance_id, 0);
+    ASSERT_EQ(requestPtr->hdr.type, PLDM_OEM);
+    ASSERT_EQ(requestPtr->hdr.command, PLDM_WRITE_FILE);
+    ASSERT_EQ(le32toh(request->file_handle), fileHandle);
+    ASSERT_EQ(le32toh(request->offset), offset);
+    ASSERT_EQ(le32toh(request->length), length);
+}
+
+TEST(ReadWriteFile, testBadEncodeRequest)
+{
+    // Bad encode request for read file
+    uint32_t fileHandle = 0;
+    uint32_t offset = 0;
+    uint32_t length = 0;
+
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_REQ_BYTES>
+        requestMsg{};
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // ReadFile check invalid file length
+    auto rc = encode_read_file_req(0, fileHandle, offset, length, requestPtr);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+
+    // Bad encode request for write file
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_WRITE_FILE_REQ_BYTES>
+        requestMsgWr{};
+    auto requestWr = reinterpret_cast<pldm_msg*>(requestMsgWr.data());
+
+    // WriteFile check for invalid file length
+    rc = encode_write_file_req(0, fileHandle, offset, length, requestWr);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ReadWriteFile, testBadEncodeResponse)
+{
+    // Bad encode response for read file
+    uint32_t length = 0;
+
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_READ_FILE_RESP_BYTES>
+        responseMsg{};
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // ReadFile
+    auto rc = encode_read_file_resp(0, PLDM_ERROR, length, responsePtr);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(responsePtr->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(responsePtr->hdr.instance_id, 0);
+    ASSERT_EQ(responsePtr->hdr.type, PLDM_OEM);
+    ASSERT_EQ(responsePtr->hdr.command, PLDM_READ_FILE);
+    ASSERT_EQ(responsePtr->payload[0], PLDM_ERROR);
+
+    // Bad encode response for write file
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_WRITE_FILE_RESP_BYTES>
+        responseMsgWr{};
+    auto responseWr = reinterpret_cast<pldm_msg*>(responseMsgWr.data());
+
+    // WriteFile
+    rc = encode_write_file_resp(0, PLDM_ERROR, length, responseWr);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(responseWr->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(responseWr->hdr.instance_id, 0);
+    ASSERT_EQ(responseWr->hdr.type, PLDM_OEM);
+    ASSERT_EQ(responseWr->hdr.command, PLDM_WRITE_FILE);
+    ASSERT_EQ(responseWr->payload[0], PLDM_ERROR);
+}
+
+TEST(ReadWriteFileByTypeMemory, testGoodDecodeRequest)
+{
+    std::array<uint8_t,
+               PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES + sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
+    auto request = reinterpret_cast<pldm_read_write_file_by_type_memory_req*>(
+        requestPtr->payload);
+
+    // Random value for fileHandle, offset and length
+    uint16_t fileType = 0;
+    uint32_t fileHandle = 0x12345678;
+    uint32_t offset = 0x87654321;
+    uint32_t length = 0x13245768;
+    uint64_t address = 0x124356879ACBD456;
+
+    request->file_type = htole16(fileType);
+    request->file_handle = htole32(fileHandle);
+    request->offset = htole32(offset);
+    request->length = htole32(length);
+    request->address = htole64(address);
+
+    uint16_t retFileType = 0x1;
+    uint32_t retFileHandle = 0;
+    uint32_t retOffset = 0;
+    uint32_t retLength = 0;
+    uint64_t retAddress = 0;
+
+    // Invoke decode the read file request
+    auto rc = decode_rw_file_by_type_memory_req(
+        requestPtr, payload_length, &retFileType, &retFileHandle, &retOffset,
+        &retLength, &retAddress);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(fileType, retFileType);
+    ASSERT_EQ(fileHandle, retFileHandle);
+    ASSERT_EQ(offset, retOffset);
+    ASSERT_EQ(length, retLength);
+    ASSERT_EQ(address, retAddress);
+}
+
+TEST(ReadWriteFileByTypeMemory, testGoodDecodeResponse)
+{
+    std::array<uint8_t,
+               PLDM_RW_FILE_BY_TYPE_MEM_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
+    auto response = reinterpret_cast<pldm_read_write_file_by_type_memory_resp*>(
+        responsePtr->payload);
+
+    // Random value for completion code and length
+    uint8_t completionCode = 0x0;
+    uint32_t length = 0x13245768;
+
+    response->completion_code = completionCode;
+    response->length = htole32(length);
+
+    uint8_t retCompletionCode = 0x1;
+    uint32_t retLength = 0;
+
+    // Invoke decode the read/write file response
+    auto rc = decode_rw_file_by_type_memory_resp(
+        responsePtr, payload_length, &retCompletionCode, &retLength);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(completionCode, retCompletionCode);
+    ASSERT_EQ(length, retLength);
+}
+
+TEST(ReadWriteFileByTypeMemory, testBadDecodeRequest)
+{
+    uint16_t fileType = 0;
+    uint32_t fileHandle = 0;
+    uint32_t offset = 0;
+    uint32_t length = 0;
+    uint64_t address = 0;
+
+    // Request payload message is missing
+    auto rc = decode_rw_file_by_type_memory_req(NULL, 0, &fileType, &fileHandle,
+                                                &offset, &length, &address);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t,
+               PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES + sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // Address is NULL
+    rc = decode_rw_file_by_type_memory_req(
+        requestPtr, requestMsg.size() - hdrSize, &fileType, &fileHandle,
+        &offset, &length, NULL);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Payload length is invalid
+    rc = decode_rw_file_by_type_memory_req(
+        requestPtr, 0, &fileType, &fileHandle, &offset, &length, &address);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ReadWriteFileByTypeMemory, testBadDecodeResponse)
+{
+    uint32_t length = 0;
+    uint8_t completionCode = 0;
+
+    // Request payload message is missing
+    auto rc =
+        decode_rw_file_by_type_memory_resp(NULL, 0, &completionCode, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t,
+               PLDM_RW_FILE_BY_TYPE_MEM_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // Length is NULL
+    rc = decode_rw_file_by_type_memory_resp(
+        responsePtr, responseMsg.size() - hdrSize, &completionCode, NULL);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Payload length is invalid
+    rc = decode_rw_file_by_type_memory_resp(responsePtr, 0, &completionCode,
+                                            &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ReadWriteFileByTypeMemory, testGoodEncodeRequest)
+{
+    std::array<uint8_t,
+               sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_MEM_REQ_BYTES>
+        requestMsg{};
+
+    uint16_t fileType = 0;
+    uint32_t fileHandle = 0x12345678;
+    uint32_t offset = 0x87654321;
+    uint32_t length = 0x13245768;
+    uint64_t address = 0x124356879ACBDE0F;
+    uint16_t fileTypeLe = htole16(fileType);
+    uint32_t fileHandleLe = htole32(fileHandle);
+    uint32_t offsetLe = htole32(offset);
+    uint32_t lengthLe = htole32(length);
+    uint64_t addressLe = htole64(address);
+
+    pldm_msg* request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    auto rc = encode_rw_file_by_type_memory_req(
+        0, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, fileType, fileHandle, offset,
+        length, address, request);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
+    ASSERT_EQ(request->hdr.instance_id, 0);
+    ASSERT_EQ(request->hdr.type, PLDM_OEM);
+    ASSERT_EQ(request->hdr.command, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY);
+
+    ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe), &fileHandleLe,
+                        sizeof(fileHandleLe)));
+
+    ASSERT_EQ(
+        0, memcmp(request->payload + sizeof(fileTypeLe) + sizeof(fileHandleLe),
+                  &offsetLe, sizeof(offsetLe)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
+                            sizeof(fileHandleLe) + sizeof(offsetLe),
+                        &lengthLe, sizeof(lengthLe)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
+                            sizeof(fileHandleLe) + sizeof(offsetLe) +
+                            sizeof(lengthLe),
+                        &addressLe, sizeof(addressLe)));
+}
+
+TEST(ReadWriteFileByTypeMemory, testGoodEncodeResponse)
+{
+    std::array<uint8_t,
+               sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_MEM_RESP_BYTES>
+        responseMsg{};
+
+    uint32_t length = 0x13245768;
+    uint32_t lengthLe = htole32(length);
+    uint8_t completionCode = 0x0;
+
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    auto rc = encode_rw_file_by_type_memory_resp(
+        0, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, completionCode, length,
+        response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY);
+
+    ASSERT_EQ(
+        0, memcmp(response->payload, &completionCode, sizeof(completionCode)));
+    ASSERT_EQ(0, memcmp(response->payload + sizeof(completionCode), &lengthLe,
+                        sizeof(lengthLe)));
+}
+
+TEST(ReadWriteFileByTypeMemory, testBadEncodeResponse)
+{
+    std::array<uint8_t,
+               sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_MEM_RESP_BYTES>
+        responseMsg{};
+    uint32_t length = 0;
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // completion code is PLDM_ERROR
+    auto rc = encode_rw_file_by_type_memory_resp(
+        0, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, PLDM_ERROR, length, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY);
+    ASSERT_EQ(response->payload[0], PLDM_ERROR);
+
+    // response is NULL pointer
+    rc = encode_rw_file_by_type_memory_resp(
+        0, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, PLDM_SUCCESS, length, NULL);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(ReadWriteFileByTypeMemory, testBadEncodeRequest)
+{
+    uint8_t fileType = 0;
+    uint32_t fileHandle = 0;
+    uint32_t offset = 0;
+    uint32_t length = 0;
+    uint64_t address = 0;
+
+    // request is NULL pointer
+    auto rc = encode_rw_file_by_type_memory_req(
+        0, PLDM_READ_FILE_BY_TYPE_INTO_MEMORY, fileType, fileHandle, offset,
+        length, address, NULL);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(NewFile, testGoodDecodeRequest)
+{
+    std::array<uint8_t, PLDM_NEW_FILE_REQ_BYTES + sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
+    auto request = reinterpret_cast<pldm_new_file_req*>(requestPtr->payload);
+
+    // Random value for fileHandle and length
+    uint16_t fileType = 0xFF;
+    uint32_t fileHandle = 0x12345678;
+    uint64_t length = 0x13245768;
+
+    request->file_type = htole16(fileType);
+    request->file_handle = htole32(fileHandle);
+    request->length = htole64(length);
+
+    uint16_t retFileType = 0xFF;
+    uint32_t retFileHandle = 0;
+    uint64_t retLength = 0;
+
+    // Invoke decode the read file request
+    auto rc = decode_new_file_req(requestPtr, payload_length, &retFileType,
+                                  &retFileHandle, &retLength);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(fileType, retFileType);
+    ASSERT_EQ(fileHandle, retFileHandle);
+    ASSERT_EQ(length, retLength);
+}
+
+TEST(NewFile, testGoodDecodeResponse)
+{
+    std::array<uint8_t, PLDM_NEW_FILE_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
+    auto response = reinterpret_cast<pldm_new_file_resp*>(responsePtr->payload);
+
+    // Random value for completion code
+    uint8_t completionCode = 0x0;
+
+    response->completion_code = completionCode;
+
+    uint8_t retCompletionCode = PLDM_SUCCESS;
+
+    // Invoke decode the read/write file response
+    auto rc =
+        decode_new_file_resp(responsePtr, payload_length, &retCompletionCode);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(completionCode, retCompletionCode);
+}
+
+TEST(NewFile, testBadDecodeRequest)
+{
+    uint16_t fileType = 0;
+    uint32_t fileHandle = 0;
+    uint64_t length = 0;
+
+    // Request payload message is missing
+    auto rc = decode_new_file_req(NULL, 0, &fileType, &fileHandle, &length);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t, PLDM_NEW_FILE_REQ_BYTES + sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // Payload length is invalid
+    rc = decode_new_file_req(requestPtr, 0, &fileType, &fileHandle, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(NewFile, testBadDecodeResponse)
+{
+    uint8_t completionCode = 0;
+
+    // Request payload message is missing
+    auto rc = decode_new_file_resp(NULL, 0, &completionCode);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t, PLDM_NEW_FILE_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // Payload length is invalid
+    rc = decode_new_file_resp(responsePtr, 0, &completionCode);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(NewFile, testGoodEncodeRequest)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_NEW_FILE_REQ_BYTES>
+        requestMsg{};
+
+    uint16_t fileType = 0xFF;
+    uint32_t fileHandle = 0x12345678;
+    uint32_t length = 0x13245768;
+    uint16_t fileTypeLe = htole16(fileType);
+    uint32_t fileHandleLe = htole32(fileHandle);
+    uint32_t lengthLe = htole32(length);
+
+    pldm_msg* request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    auto rc = encode_new_file_req(0, fileType, fileHandle, length, request);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
+    ASSERT_EQ(request->hdr.instance_id, 0);
+    ASSERT_EQ(request->hdr.type, PLDM_OEM);
+    ASSERT_EQ(request->hdr.command, PLDM_NEW_FILE_AVAILABLE);
+    ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe), &fileHandleLe,
+                        sizeof(fileHandleLe)));
+    ASSERT_EQ(
+        0, memcmp(request->payload + sizeof(fileTypeLe) + sizeof(fileHandleLe),
+                  &lengthLe, sizeof(lengthLe)));
+}
+
+TEST(NewFile, testGoodEncodeResponse)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_NEW_FILE_RESP_BYTES>
+        responseMsg{};
+
+    uint8_t completionCode = 0x0;
+
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    auto rc = encode_new_file_resp(0, completionCode, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_NEW_FILE_AVAILABLE);
+    ASSERT_EQ(
+        0, memcmp(response->payload, &completionCode, sizeof(completionCode)));
+}
+
+TEST(NewFile, testBadEncodeResponse)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_NEW_FILE_RESP_BYTES>
+        responseMsg{};
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // completion code is PLDM_ERROR
+    auto rc = encode_new_file_resp(0, PLDM_ERROR, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_NEW_FILE_AVAILABLE);
+    ASSERT_EQ(response->payload[0], PLDM_ERROR);
+
+    // response is NULL pointer
+    rc = encode_new_file_resp(0, PLDM_SUCCESS, NULL);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(NewFile, testBadEncodeRequest)
+{
+    uint8_t fileType = 0xFF;
+    uint32_t fileHandle = 0;
+    uint32_t length = 0;
+
+    // request is NULL pointer
+    auto rc = encode_new_file_req(0, fileType, fileHandle, length, NULL);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(ReadWriteFileByType, testGoodDecodeRequest)
+{
+    std::array<uint8_t, PLDM_RW_FILE_BY_TYPE_REQ_BYTES + sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
+    auto request = reinterpret_cast<pldm_read_write_file_by_type_req*>(
+        requestPtr->payload);
+
+    // Random value for fileHandle, offset and length
+    uint16_t fileType = 0;
+    uint32_t fileHandle = 0x12345678;
+    uint32_t offset = 0x87654321;
+    uint32_t length = 0x13245768;
+
+    request->file_handle = htole32(fileHandle);
+    request->offset = htole32(offset);
+    request->length = htole32(length);
+
+    uint16_t retFileType = 0x1;
+    uint32_t retFileHandle = 0;
+    uint32_t retOffset = 0;
+    uint32_t retLength = 0;
+
+    // Invoke decode the read file request
+    auto rc =
+        decode_rw_file_by_type_req(requestPtr, payload_length, &retFileType,
+                                   &retFileHandle, &retOffset, &retLength);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(fileType, retFileType);
+    ASSERT_EQ(fileHandle, retFileHandle);
+    ASSERT_EQ(offset, retOffset);
+    ASSERT_EQ(length, retLength);
+}
+
+TEST(ReadWriteFileByType, testGoodDecodeResponse)
+{
+    std::array<uint8_t, PLDM_RW_FILE_BY_TYPE_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
+    auto response = reinterpret_cast<pldm_read_write_file_by_type_resp*>(
+        responsePtr->payload);
+
+    // Random value for completion code and length
+    uint8_t completionCode = 0x0;
+    uint32_t length = 0x13245768;
+
+    response->completion_code = completionCode;
+    response->length = htole32(length);
+
+    uint8_t retCompletionCode = 0x1;
+    uint32_t retLength = 0;
+
+    // Invoke decode the read/write file response
+    auto rc = decode_rw_file_by_type_resp(responsePtr, payload_length,
+                                          &retCompletionCode, &retLength);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(completionCode, retCompletionCode);
+    ASSERT_EQ(length, retLength);
+}
+
+TEST(ReadWriteFileByType, testBadDecodeRequest)
+{
+    uint16_t fileType = 0;
+    uint32_t fileHandle = 0;
+    uint32_t offset = 0;
+    uint32_t length = 0;
+
+    // Request payload message is missing
+    auto rc = decode_rw_file_by_type_req(NULL, 0, &fileType, &fileHandle,
+                                         &offset, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t, PLDM_RW_FILE_BY_TYPE_REQ_BYTES + sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // Payload length is invalid
+    rc = decode_rw_file_by_type_req(requestPtr, 0, &fileType, &fileHandle,
+                                    &offset, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ReadWriteFileByType, testBadDecodeResponse)
+{
+    uint32_t length = 0;
+    uint8_t completionCode = 0;
+
+    // Request payload message is missing
+    auto rc = decode_rw_file_by_type_resp(NULL, 0, &completionCode, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t, PLDM_RW_FILE_BY_TYPE_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // Length is NULL
+    rc = decode_rw_file_by_type_resp(responsePtr, responseMsg.size() - hdrSize,
+                                     &completionCode, NULL);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    // Payload length is invalid
+    rc = decode_rw_file_by_type_resp(responsePtr, 0, &completionCode, &length);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(ReadWriteFileByType, testGoodEncodeRequest)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_REQ_BYTES>
+        requestMsg{};
+
+    uint16_t fileType = 0;
+    uint32_t fileHandle = 0x12345678;
+    uint32_t offset = 0x87654321;
+    uint32_t length = 0x13245768;
+    uint16_t fileTypeLe = htole16(fileType);
+    uint32_t fileHandleLe = htole32(fileHandle);
+    uint32_t offsetLe = htole32(offset);
+    uint32_t lengthLe = htole32(length);
+
+    pldm_msg* request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    auto rc = encode_rw_file_by_type_req(0, PLDM_READ_FILE_BY_TYPE, fileType,
+                                         fileHandle, offset, length, request);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
+    ASSERT_EQ(request->hdr.instance_id, 0);
+    ASSERT_EQ(request->hdr.type, PLDM_OEM);
+    ASSERT_EQ(request->hdr.command, PLDM_READ_FILE_BY_TYPE);
+
+    ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe), &fileHandleLe,
+                        sizeof(fileHandleLe)));
+
+    ASSERT_EQ(
+        0, memcmp(request->payload + sizeof(fileTypeLe) + sizeof(fileHandleLe),
+                  &offsetLe, sizeof(offsetLe)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
+                            sizeof(fileHandleLe) + sizeof(offsetLe),
+                        &lengthLe, sizeof(lengthLe)));
+}
+
+TEST(ReadWriteFileByType, testGoodEncodeResponse)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_RESP_BYTES>
+        responseMsg{};
+
+    uint32_t length = 0x13245768;
+    uint32_t lengthLe = htole32(length);
+    uint8_t completionCode = 0x0;
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    auto rc = encode_rw_file_by_type_resp(0, PLDM_READ_FILE_BY_TYPE,
+                                          completionCode, length, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_BY_TYPE);
+
+    ASSERT_EQ(
+        0, memcmp(response->payload, &completionCode, sizeof(completionCode)));
+    ASSERT_EQ(0, memcmp(response->payload + sizeof(completionCode), &lengthLe,
+                        sizeof(lengthLe)));
+}
+
+TEST(ReadWriteFileByType, testBadEncodeResponse)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_RW_FILE_BY_TYPE_RESP_BYTES>
+        responseMsg{};
+    uint32_t length = 0;
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // completion code is PLDM_ERROR
+    auto rc = encode_rw_file_by_type_resp(0, PLDM_READ_FILE_BY_TYPE, PLDM_ERROR,
+                                          length, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_READ_FILE_BY_TYPE);
+    ASSERT_EQ(response->payload[0], PLDM_ERROR);
+
+    // response is NULL pointer
+    rc = encode_rw_file_by_type_resp(0, PLDM_READ_FILE_BY_TYPE, PLDM_SUCCESS,
+                                     length, NULL);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(ReadWriteFileByType, testBadEncodeRequest)
+{
+    uint8_t fileType = 0;
+    uint32_t fileHandle = 0;
+    uint32_t offset = 0;
+    uint32_t length = 0;
+
+    // request is NULL pointer
+    auto rc = encode_rw_file_by_type_req(0, PLDM_READ_FILE_BY_TYPE, fileType,
+                                         fileHandle, offset, length, NULL);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(FileAck, testGoodDecodeRequest)
+{
+    std::array<uint8_t, PLDM_FILE_ACK_REQ_BYTES + sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
+    auto request = reinterpret_cast<pldm_file_ack_req*>(requestPtr->payload);
+
+    // Random value for fileHandle
+    uint16_t fileType = 0xFFFF;
+    uint32_t fileHandle = 0x12345678;
+    uint8_t fileStatus = 0xFF;
+
+    request->file_type = htole16(fileType);
+    request->file_handle = htole32(fileHandle);
+    request->file_status = fileStatus;
+
+    uint16_t retFileType = 0xFF;
+    uint32_t retFileHandle = 0;
+    uint8_t retFileStatus = 0;
+
+    // Invoke decode the read file request
+    auto rc = decode_file_ack_req(requestPtr, payload_length, &retFileType,
+                                  &retFileHandle, &retFileStatus);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(fileType, retFileType);
+    ASSERT_EQ(fileHandle, retFileHandle);
+    ASSERT_EQ(fileStatus, retFileStatus);
+}
+
+TEST(FileAck, testGoodDecodeResponse)
+{
+    std::array<uint8_t, PLDM_FILE_ACK_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
+    auto response = reinterpret_cast<pldm_file_ack_resp*>(responsePtr->payload);
+
+    // Random value for completion code
+    uint8_t completionCode = 0x0;
+
+    response->completion_code = completionCode;
+
+    uint8_t retCompletionCode = PLDM_SUCCESS;
+
+    // Invoke decode the read/write file response
+    auto rc =
+        decode_file_ack_resp(responsePtr, payload_length, &retCompletionCode);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(completionCode, retCompletionCode);
+}
+
+TEST(FileAck, testBadDecodeRequest)
+{
+    uint16_t fileType = 0;
+    uint32_t fileHandle = 0;
+    uint8_t fileStatus = 0;
+
+    // Request payload message is missing
+    auto rc = decode_file_ack_req(NULL, 0, &fileType, &fileHandle, &fileStatus);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t, PLDM_FILE_ACK_REQ_BYTES + sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // Payload length is invalid
+    rc =
+        decode_file_ack_req(requestPtr, 0, &fileType, &fileHandle, &fileStatus);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(FileAck, testBadDecodeResponse)
+{
+    uint8_t completionCode = 0;
+
+    // Request payload message is missing
+    auto rc = decode_file_ack_resp(NULL, 0, &completionCode);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t, PLDM_FILE_ACK_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // Payload length is invalid
+    rc = decode_file_ack_resp(responsePtr, 0, &completionCode);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(FileAck, testGoodEncodeRequest)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_FILE_ACK_REQ_BYTES>
+        requestMsg{};
+
+    uint16_t fileType = 0xFFFF;
+    uint32_t fileHandle = 0x12345678;
+    uint8_t fileStatus = 0xFF;
+    uint16_t fileTypeLe = htole16(fileType);
+    uint32_t fileHandleLe = htole32(fileHandle);
+
+    pldm_msg* request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    auto rc = encode_file_ack_req(0, fileType, fileHandle, fileStatus, request);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
+    ASSERT_EQ(request->hdr.instance_id, 0);
+    ASSERT_EQ(request->hdr.type, PLDM_OEM);
+    ASSERT_EQ(request->hdr.command, PLDM_FILE_ACK);
+    ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe), &fileHandleLe,
+                        sizeof(fileHandleLe)));
+}
+
+TEST(FileAck, testGoodEncodeResponse)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_FILE_ACK_RESP_BYTES>
+        responseMsg{};
+
+    uint8_t completionCode = 0x0;
+
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    auto rc = encode_file_ack_resp(0, completionCode, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_FILE_ACK);
+    ASSERT_EQ(
+        0, memcmp(response->payload, &completionCode, sizeof(completionCode)));
+}
+
+TEST(FileAck, testBadEncodeResponse)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) + PLDM_FILE_ACK_RESP_BYTES>
+        responseMsg{};
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // completion code is PLDM_ERROR
+    auto rc = encode_file_ack_resp(0, PLDM_ERROR, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_FILE_ACK);
+    ASSERT_EQ(response->payload[0], PLDM_ERROR);
+
+    // response is NULL pointer
+    rc = encode_file_ack_resp(0, PLDM_SUCCESS, NULL);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(FileAck, testBadEncodeRequest)
+{
+    uint8_t fileType = 0xFF;
+    uint32_t fileHandle = 0;
+    uint8_t fileStatus = 0;
+
+    // request is NULL pointer
+    auto rc = encode_file_ack_req(0, fileType, fileHandle, fileStatus, nullptr);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(FileAckWithMetadata, testGoodEncodeResponse)
+{
+    std::array<uint8_t,
+               sizeof(pldm_msg_hdr) + PLDM_FILE_ACK_WITH_META_DATA_RESP_BYTES>
+        responseMsg{};
+
+    uint8_t completionCode = 0x0;
+
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    auto rc = encode_file_ack_with_meta_data_resp(0, completionCode, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_FILE_ACK_WITH_META_DATA);
+    ASSERT_EQ(
+        0, memcmp(response->payload, &completionCode, sizeof(completionCode)));
+}
+
+TEST(FileAckWithMetadata, testBadEncodeResponse)
+{
+    std::array<uint8_t,
+               sizeof(pldm_msg_hdr) + PLDM_FILE_ACK_WITH_META_DATA_RESP_BYTES>
+        responseMsg{};
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // completion code is PLDM_ERROR
+    auto rc = encode_file_ack_with_meta_data_resp(0, PLDM_ERROR, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_FILE_ACK_WITH_META_DATA);
+    ASSERT_EQ(response->payload[0], PLDM_ERROR);
+
+    // response is NULL pointer
+    rc = encode_file_ack_with_meta_data_resp(0, PLDM_SUCCESS, NULL);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(FileAckWithMetadata, testGoodDecodeResponse)
+{
+    std::array<uint8_t,
+               PLDM_FILE_ACK_WITH_META_DATA_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
+    auto response = reinterpret_cast<pldm_file_ack_with_meta_data_resp*>(
+        responsePtr->payload);
+
+    // Random value for completion code
+    uint8_t completionCode = 0x0;
+
+    response->completion_code = completionCode;
+
+    uint8_t retCompletionCode = PLDM_SUCCESS;
+
+    // Invoke decode the read/write file response
+    auto rc = decode_file_ack_with_meta_data_resp(responsePtr, payload_length,
+                                                  &retCompletionCode);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(completionCode, retCompletionCode);
+}
+
+TEST(FileAckWithMetadata, testBadDecodeResponse)
+{
+    uint8_t completionCode = 0;
+
+    // Request payload message is missing
+    auto rc = decode_file_ack_with_meta_data_resp(NULL, 0, &completionCode);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t,
+               PLDM_FILE_ACK_WITH_META_DATA_RESP_BYTES + sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // Payload length is invalid
+    rc = decode_file_ack_with_meta_data_resp(responsePtr, 0, &completionCode);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(FileAckWithMetadata, testGoodEncodeRequest)
+{
+    std::array<uint8_t,
+               sizeof(pldm_msg_hdr) + PLDM_FILE_ACK_WITH_META_DATA_REQ_BYTES>
+        requestMsg{};
+
+    uint16_t fileType = 0xFFFF;
+    uint32_t fileHandle = 0x12345678;
+    uint8_t fileStatus = 0xFF;
+    uint32_t fileMetaData1 = 0xFFFFFFFF;
+    uint32_t fileMetaData2 = 0xFFFFFFFF;
+    uint32_t fileMetaData3 = 0xFFFFFFFF;
+    uint32_t fileMetaData4 = 0xFFFFFFFF;
+
+    uint16_t fileTypeLe = htole16(fileType);
+    uint32_t fileHandleLe = htole32(fileHandle);
+    uint32_t fileMetaData1Le = htole32(fileMetaData1);
+    uint32_t fileMetaData2Le = htole32(fileMetaData2);
+    uint32_t fileMetaData3Le = htole32(fileMetaData3);
+    uint32_t fileMetaData4Le = htole32(fileMetaData4);
+
+    pldm_msg* request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    auto rc = encode_file_ack_with_meta_data_req(
+        0, fileType, fileHandle, fileStatus, fileMetaData1, fileMetaData2,
+        fileMetaData3, fileMetaData4, request);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
+    ASSERT_EQ(request->hdr.instance_id, 0);
+    ASSERT_EQ(request->hdr.type, PLDM_OEM);
+    ASSERT_EQ(request->hdr.command, PLDM_FILE_ACK_WITH_META_DATA);
+    ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe), &fileHandleLe,
+                        sizeof(fileHandleLe)));
+    ASSERT_EQ(
+        0, memcmp(request->payload + sizeof(fileTypeLe) + sizeof(fileHandleLe),
+                  &fileStatus, sizeof(fileStatus)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
+                            sizeof(fileHandleLe) + sizeof(fileStatus),
+                        &fileMetaData1Le, sizeof(fileMetaData1Le)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
+                            sizeof(fileHandleLe) + sizeof(fileStatus) +
+                            sizeof(fileMetaData1Le),
+                        &fileMetaData2Le, sizeof(fileMetaData2Le)));
+
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
+                            sizeof(fileHandleLe) + sizeof(fileStatus) +
+                            sizeof(fileMetaData1Le) + sizeof(fileMetaData2Le),
+                        &fileMetaData3Le, sizeof(fileMetaData3Le)));
+
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
+                            sizeof(fileHandleLe) + sizeof(fileStatus) +
+                            sizeof(fileMetaData1Le) + sizeof(fileMetaData2Le) +
+                            sizeof(fileMetaData3Le),
+                        &fileMetaData4Le, sizeof(fileMetaData4Le)));
+}
+
+TEST(FileAckWithMetadata, testBadEncodeRequest)
+{
+    uint8_t fileType = 0xFF;
+    uint32_t fileHandle = 0;
+    uint8_t fileStatus = 0;
+    uint32_t fileMetaData1 = 0;
+    uint32_t fileMetaData2 = 0;
+    uint32_t fileMetaData3 = 0;
+    uint32_t fileMetaData4 = 0;
+
+    // request is NULL pointer
+    auto rc = encode_file_ack_with_meta_data_req(
+        0, fileType, fileHandle, fileStatus, fileMetaData1, fileMetaData2,
+        fileMetaData3, fileMetaData4, nullptr);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(FileAckWithMetadata, testGoodDecodeRequest)
+{
+    std::array<uint8_t,
+               sizeof(pldm_msg_hdr) + PLDM_FILE_ACK_WITH_META_DATA_REQ_BYTES>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
+    auto request = reinterpret_cast<pldm_file_ack_with_meta_data_req*>(
+        requestPtr->payload);
+
+    uint16_t fileType = 0xFFFF;
+    uint32_t fileHandle = 0x12345678;
+    uint8_t fileStatus = 0xFF;
+    uint32_t fileMetaData1 = 0x12345678;
+    uint32_t fileMetaData2 = 0x87654321;
+    uint32_t fileMetaData3 = 0x22121117;
+    uint32_t fileMetaData4 = 0x12334345;
+
+    request->file_type = htole16(fileType);
+    request->file_handle = htole32(fileHandle);
+    request->file_status = fileStatus;
+    request->file_meta_data_1 = htole32(fileMetaData1);
+    request->file_meta_data_2 = htole32(fileMetaData2);
+    request->file_meta_data_3 = htole32(fileMetaData3);
+    request->file_meta_data_4 = htole32(fileMetaData4);
+
+    uint16_t retFileType = 0xFFFF;
+    uint32_t retFileHandle = 0;
+    uint8_t retFileStatus = 0;
+    uint32_t retFileMetaData1 = 0;
+    uint32_t retFileMetaData2 = 0;
+    uint32_t retFileMetaData3 = 0;
+    uint32_t retFileMetaData4 = 0;
+
+    auto rc = decode_file_ack_with_meta_data_req(
+        requestPtr, payload_length, &retFileType, &retFileHandle,
+        &retFileStatus, &retFileMetaData1, &retFileMetaData2, &retFileMetaData3,
+        &retFileMetaData4);
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(fileType, retFileType);
+    ASSERT_EQ(fileHandle, retFileHandle);
+    ASSERT_EQ(fileStatus, retFileStatus);
+    ASSERT_EQ(fileMetaData1, retFileMetaData1);
+    ASSERT_EQ(fileMetaData2, retFileMetaData2);
+    ASSERT_EQ(fileMetaData3, retFileMetaData3);
+    ASSERT_EQ(fileMetaData4, retFileMetaData4);
+}
+
+TEST(FileAckWithMetadata, testBadDecodeRequest)
+{
+    uint16_t fileType = 0;
+    uint32_t fileHandle = 0;
+    uint8_t fileStatus = 0;
+    uint32_t fileMetaData1 = 0;
+    uint32_t fileMetaData2 = 0;
+    uint32_t fileMetaData3 = 0;
+    uint32_t fileMetaData4 = 0;
+
+    // Request payload message is missing
+    auto rc = decode_file_ack_with_meta_data_req(
+        NULL, 0, &fileType, &fileHandle, &fileStatus, &fileMetaData1,
+        &fileMetaData2, &fileMetaData3, &fileMetaData4);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t,
+               PLDM_FILE_ACK_WITH_META_DATA_REQ_BYTES + sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // Payload length is invalid
+    rc = decode_file_ack_with_meta_data_req(
+        requestPtr, 0, &fileType, &fileHandle, &fileStatus, &fileMetaData1,
+        &fileMetaData2, &fileMetaData3, &fileMetaData4);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(NewFileAvailableWithMetaData, testGoodEncodeResponse)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) +
+                            PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_RESP_BYTES>
+        responseMsg{};
+
+    uint8_t completionCode = 0x0;
+
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    auto rc = encode_new_file_with_metadata_resp(0, completionCode, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA);
+    ASSERT_EQ(
+        0, memcmp(response->payload, &completionCode, sizeof(completionCode)));
+}
+
+TEST(NewFileAvailableWithMetaData, testBadEncodeResponse)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) +
+                            PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_RESP_BYTES>
+        responseMsg{};
+    pldm_msg* response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // completion code is PLDM_ERROR
+    auto rc = encode_new_file_with_metadata_resp(0, PLDM_ERROR, response);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(response->hdr.request, PLDM_RESPONSE);
+    ASSERT_EQ(response->hdr.instance_id, 0);
+    ASSERT_EQ(response->hdr.type, PLDM_OEM);
+    ASSERT_EQ(response->hdr.command, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA);
+    ASSERT_EQ(response->payload[0], PLDM_ERROR);
+
+    // response is NULL pointer
+    rc = encode_new_file_resp(0, PLDM_SUCCESS, NULL);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(NewFileAvailableWithMetaData, testGoodDecodeResponse)
+{
+    std::array<uint8_t, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_RESP_BYTES +
+                            sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    size_t payload_length = responseMsg.size() - sizeof(pldm_msg_hdr);
+    auto response = reinterpret_cast<pldm_file_ack_with_meta_data_resp*>(
+        responsePtr->payload);
+
+    // Random value for completion code
+    uint8_t completionCode = 0x0;
+
+    response->completion_code = completionCode;
+
+    uint8_t retCompletionCode = PLDM_SUCCESS;
+
+    // Invoke decode the read/write file response
+    auto rc = decode_new_file_with_metadata_resp(responsePtr, payload_length,
+                                                 &retCompletionCode);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(completionCode, retCompletionCode);
+}
+
+TEST(NewFileAvailableWithMetaData, testBadDecodeResponse)
+{
+    uint8_t completionCode = 0;
+
+    // Request payload message is missing
+    auto rc = decode_new_file_with_metadata_resp(NULL, 0, &completionCode);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_RESP_BYTES +
+                            sizeof(pldm_msg_hdr)>
+        responseMsg{};
+
+    auto responsePtr = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    // Payload length is invalid
+    rc = decode_new_file_with_metadata_resp(responsePtr, 0, &completionCode);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(NewFileAvailableWithMetaData, testGoodEncodeRequest)
+{
+    std::array<uint8_t, sizeof(pldm_msg_hdr) +
+                            PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_REQ_BYTES>
+        requestMsg{};
+
+    uint16_t fileType = 0xFFFF;
+    uint32_t fileHandle = 0x12345678;
+    uint32_t length = 0x13245768;
+    uint64_t fileMetaData1 = 0xFFFFFFFF;
+    uint32_t fileMetaData2 = 0xFFFFFFFF;
+    uint32_t fileMetaData3 = 0xFFFFFFFF;
+    uint32_t fileMetaData4 = 0xFFFFFFFF;
+
+    uint16_t fileTypeLe = htole16(fileType);
+    uint32_t fileHandleLe = htole32(fileHandle);
+    uint64_t lengthLe = htole64(length);
+    uint32_t fileMetaData1Le = htole32(fileMetaData1);
+    uint32_t fileMetaData2Le = htole32(fileMetaData2);
+    uint32_t fileMetaData3Le = htole32(fileMetaData3);
+    uint32_t fileMetaData4Le = htole32(fileMetaData4);
+
+    pldm_msg* request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    auto rc = encode_new_file_with_metadata_req(
+        0, fileType, fileHandle, length, fileMetaData1, fileMetaData2,
+        fileMetaData3, fileMetaData4, request);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(request->hdr.request, PLDM_REQUEST);
+    ASSERT_EQ(request->hdr.instance_id, 0);
+    ASSERT_EQ(request->hdr.type, PLDM_OEM);
+    ASSERT_EQ(request->hdr.command, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA);
+    ASSERT_EQ(0, memcmp(request->payload, &fileTypeLe, sizeof(fileTypeLe)));
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe), &fileHandleLe,
+                        sizeof(fileHandleLe)));
+    ASSERT_EQ(
+        0, memcmp(request->payload + sizeof(fileTypeLe) + sizeof(fileHandleLe),
+                  &lengthLe, sizeof(lengthLe)));
+
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
+                            sizeof(fileHandleLe) + sizeof(lengthLe),
+                        &fileMetaData1Le, sizeof(fileMetaData1Le)));
+
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
+                            sizeof(fileHandleLe) + sizeof(lengthLe) +
+                            sizeof(fileMetaData1Le),
+                        &fileMetaData2Le, sizeof(fileMetaData2Le)));
+
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
+                            sizeof(fileHandleLe) + sizeof(lengthLe) +
+                            sizeof(fileMetaData1Le) + sizeof(fileMetaData2Le),
+                        &fileMetaData3Le, sizeof(fileMetaData3Le)));
+
+    ASSERT_EQ(0, memcmp(request->payload + sizeof(fileTypeLe) +
+                            sizeof(fileHandleLe) + sizeof(lengthLe) +
+                            sizeof(fileMetaData1Le) + sizeof(fileMetaData2Le) +
+                            sizeof(fileMetaData3Le),
+                        &fileMetaData4Le, sizeof(fileMetaData4Le)));
+}
+
+TEST(NewFileAvailableWithMetaData, testBadEncodeRequest)
+{
+    uint8_t fileType = 0xFF;
+    uint32_t fileHandle = 0;
+    uint32_t length = 0;
+    uint32_t fileMetaData1 = 0;
+    uint32_t fileMetaData2 = 0;
+    uint32_t fileMetaData3 = 0;
+    uint32_t fileMetaData4 = 0;
+
+    // request is NULL pointer
+    auto rc = encode_new_file_with_metadata_req(
+        0, fileType, fileHandle, length, fileMetaData1, fileMetaData2,
+        fileMetaData3, fileMetaData4, NULL);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(NewFileAvailableWithMetaData, testGoodDecodeRequest)
+{
+    std::array<uint8_t, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_REQ_BYTES +
+                            sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    size_t payload_length = requestMsg.size() - sizeof(pldm_msg_hdr);
+    auto request =
+        reinterpret_cast<pldm_new_file_with_metadata_req*>(requestPtr->payload);
+
+    // Random value for fileHandle and length
+    uint16_t fileType = 0xFFFF;
+    uint32_t fileHandle = 0x12345678;
+    uint64_t length = 0x13245768;
+    uint32_t fileMetaData1 = 0x12345678;
+    uint32_t fileMetaData2 = 0x87654321;
+    uint32_t fileMetaData3 = 0x22121117;
+    uint32_t fileMetaData4 = 0x12334345;
+
+    request->file_type = htole16(fileType);
+    request->file_handle = htole32(fileHandle);
+    request->length = htole64(length);
+    request->file_meta_data_1 = htole32(fileMetaData1);
+    request->file_meta_data_2 = htole32(fileMetaData2);
+    request->file_meta_data_3 = htole32(fileMetaData3);
+    request->file_meta_data_4 = htole32(fileMetaData4);
+
+    uint16_t retFileType = 0xFFFF;
+    uint32_t retFileHandle = 0;
+    uint64_t retLength = 0;
+    uint32_t retFileMetaData1 = 0;
+    uint32_t retFileMetaData2 = 0;
+    uint32_t retFileMetaData3 = 0;
+    uint32_t retFileMetaData4 = 0;
+
+    // Invoke decode the read file request
+    auto rc = decode_new_file_with_metadata_req(
+        requestPtr, payload_length, &retFileType, &retFileHandle, &retLength,
+        &retFileMetaData1, &retFileMetaData2, &retFileMetaData3,
+        &retFileMetaData4);
+
+    ASSERT_EQ(rc, PLDM_SUCCESS);
+    ASSERT_EQ(fileType, retFileType);
+    ASSERT_EQ(fileHandle, retFileHandle);
+    ASSERT_EQ(length, retLength);
+    ASSERT_EQ(fileMetaData1, retFileMetaData1);
+    ASSERT_EQ(fileMetaData2, retFileMetaData2);
+    ASSERT_EQ(fileMetaData3, retFileMetaData3);
+    ASSERT_EQ(fileMetaData4, retFileMetaData4);
+}
+
+TEST(NewFileAvailableWithMetaData, testBadDecodeRequest)
+{
+    uint16_t fileType = 0;
+    uint32_t fileHandle = 0;
+    uint64_t length = 0;
+    uint32_t fileMetaData1 = 0;
+    uint32_t fileMetaData2 = 0;
+    uint32_t fileMetaData3 = 0;
+    uint32_t fileMetaData4 = 0;
+
+    // Request payload message is missing
+    auto rc = decode_new_file_with_metadata_req(
+        NULL, 0, &fileType, &fileHandle, &length, &fileMetaData1,
+        &fileMetaData2, &fileMetaData3, &fileMetaData4);
+
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    std::array<uint8_t, PLDM_NEW_FILE_AVAILABLE_WITH_META_DATA_REQ_BYTES +
+                            sizeof(pldm_msg_hdr)>
+        requestMsg{};
+
+    auto requestPtr = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    // Payload length is invalid
+    rc = decode_new_file_with_metadata_req(
+        requestPtr, 0, &fileType, &fileHandle, &length, &fileMetaData1,
+        &fileMetaData2, &fileMetaData3, &fileMetaData4);
+    ASSERT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
diff --git a/subprojects/libpldm/tests/oem/ibm/libpldm_host_test.cpp b/subprojects/libpldm/tests/oem/ibm/libpldm_host_test.cpp
new file mode 100644
index 0000000..26ae5aa
--- /dev/null
+++ b/subprojects/libpldm/tests/oem/ibm/libpldm_host_test.cpp
@@ -0,0 +1,162 @@
+#include <string.h>
+
+#include <array>
+
+#include "oem/ibm/libpldm/host.h"
+
+#include <gtest/gtest.h>
+
+constexpr auto hdrSize = sizeof(pldm_msg_hdr);
+
+TEST(GetAlertStatus, testGoodEncodeRequest)
+{
+    std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES> requestMsg{};
+
+    uint8_t versionId = 0x0;
+
+    auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    auto rc = encode_get_alert_status_req(0, versionId, request,
+                                          PLDM_GET_ALERT_STATUS_REQ_BYTES);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(versionId, request->payload[0]);
+}
+
+TEST(GetAlertStatus, testBadEncodeRequest)
+{
+    std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES> requestMsg{};
+
+    auto request = reinterpret_cast<pldm_msg*>(requestMsg.data());
+    auto rc = encode_get_alert_status_req(0, 0x0, request,
+                                          PLDM_GET_ALERT_STATUS_REQ_BYTES + 1);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(GetAlertStatus, testGoodDecodeResponse)
+{
+    uint8_t completionCode = PLDM_SUCCESS;
+    uint32_t rack_entry = 0xFF000030;
+    uint32_t pri_cec_node = 0x00008030;
+    std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_RESP_BYTES>
+        responseMsg{};
+
+    uint8_t retCompletionCode = 0;
+    uint32_t retRack_entry = 0;
+    uint32_t retPri_cec_node = 0;
+
+    auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    struct pldm_get_alert_status_resp* resp =
+        reinterpret_cast<struct pldm_get_alert_status_resp*>(response->payload);
+    resp->completion_code = completionCode;
+    resp->rack_entry = htole32(rack_entry);
+    resp->pri_cec_node = htole32(pri_cec_node);
+
+    auto rc = decode_get_alert_status_resp(
+        response, responseMsg.size() - hdrSize, &retCompletionCode,
+        &retRack_entry, &retPri_cec_node);
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(retCompletionCode, completionCode);
+    EXPECT_EQ(retRack_entry, rack_entry);
+    EXPECT_EQ(retPri_cec_node, pri_cec_node);
+}
+
+TEST(GetAlertStatus, testBadDecodeResponse)
+{
+    auto rc = decode_get_alert_status_resp(NULL, 0, NULL, NULL, NULL);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+
+    uint8_t completionCode = PLDM_SUCCESS;
+    uint32_t rack_entry = 0xFF000030;
+    uint32_t pri_cec_node = 0x00008030;
+    std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_RESP_BYTES>
+        responseMsg{};
+
+    uint8_t retCompletionCode = 0;
+    uint32_t retRack_entry = 0;
+    uint32_t retPri_cec_node = 0;
+
+    auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+    struct pldm_get_alert_status_resp* resp =
+        reinterpret_cast<struct pldm_get_alert_status_resp*>(response->payload);
+    resp->completion_code = completionCode;
+    resp->rack_entry = htole32(rack_entry);
+    resp->pri_cec_node = htole32(pri_cec_node);
+
+    rc = decode_get_alert_status_resp(
+        response, responseMsg.size() - hdrSize + 1, &retCompletionCode,
+        &retRack_entry, &retPri_cec_node);
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
+
+TEST(GetAlertStatus, testGoodEncodeResponse)
+{
+    uint8_t completionCode = 0;
+    uint32_t rack_entry = 0xFF000030;
+    uint32_t pri_cec_node = 0x00008030;
+
+    std::vector<uint8_t> responseMsg(hdrSize +
+                                     PLDM_GET_ALERT_STATUS_RESP_BYTES);
+    auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    auto rc =
+        encode_get_alert_status_resp(0, PLDM_SUCCESS, rack_entry, pri_cec_node,
+                                     response, responseMsg.size() - hdrSize);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    struct pldm_get_alert_status_resp* resp =
+        reinterpret_cast<struct pldm_get_alert_status_resp*>(response->payload);
+
+    EXPECT_EQ(completionCode, resp->completion_code);
+    EXPECT_EQ(rack_entry, le32toh(resp->rack_entry));
+    EXPECT_EQ(pri_cec_node, le32toh(resp->pri_cec_node));
+}
+
+TEST(GetAlertStatus, testBadEncodeResponse)
+{
+    uint32_t rack_entry = 0xFF000030;
+    uint32_t pri_cec_node = 0x00008030;
+
+    std::vector<uint8_t> responseMsg(hdrSize +
+                                     PLDM_GET_ALERT_STATUS_RESP_BYTES);
+    auto response = reinterpret_cast<pldm_msg*>(responseMsg.data());
+
+    auto rc = encode_get_alert_status_resp(0, PLDM_SUCCESS, rack_entry,
+                                           pri_cec_node, response,
+                                           responseMsg.size() - hdrSize + 1);
+
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_DATA);
+}
+
+TEST(GetAlertStatus, testGoodDecodeRequest)
+{
+    std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES> requestMsg{};
+
+    uint8_t versionId = 0x0;
+    uint8_t retVersionId;
+
+    auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    req->payload[0] = versionId;
+
+    auto rc = decode_get_alert_status_req(req, requestMsg.size() - hdrSize,
+                                          &retVersionId);
+
+    EXPECT_EQ(rc, PLDM_SUCCESS);
+    EXPECT_EQ(retVersionId, versionId);
+}
+
+TEST(GetAlertStatus, testBadDecodeRequest)
+{
+    std::array<uint8_t, hdrSize + PLDM_GET_ALERT_STATUS_REQ_BYTES> requestMsg{};
+
+    uint8_t versionId = 0x0;
+    uint8_t retVersionId;
+
+    auto req = reinterpret_cast<pldm_msg*>(requestMsg.data());
+
+    req->payload[0] = versionId;
+
+    auto rc = decode_get_alert_status_req(req, requestMsg.size() - hdrSize + 1,
+                                          &retVersionId);
+
+    EXPECT_EQ(rc, PLDM_ERROR_INVALID_LENGTH);
+}
diff --git a/utilities/requester/set_state_effecter.cpp b/utilities/requester/set_state_effecter.cpp
index 4df2c64..5384fa1 100644
--- a/utilities/requester/set_state_effecter.cpp
+++ b/utilities/requester/set_state_effecter.cpp
@@ -1,5 +1,5 @@
 #include "libpldm/platform.h"
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include <CLI/CLI.hpp>
 
diff --git a/utilities/requester/set_state_effecter_async.cpp b/utilities/requester/set_state_effecter_async.cpp
index 303aefe..f0b13b5 100644
--- a/utilities/requester/set_state_effecter_async.cpp
+++ b/utilities/requester/set_state_effecter_async.cpp
@@ -1,6 +1,6 @@
 #include "libpldm/base.h"
 #include "libpldm/platform.h"
-#include "libpldm/requester/pldm.h"
+#include "libpldm/pldm.h"
 
 #include <CLI/CLI.hpp>
 #include <sdeventplus/event.hpp>
