This commit adds host-based unit tests for device path lib.

Cc: Michael D Kinney <michael.d.kin...@intel.com>
Cc: Liming Gao <gaolim...@byosoft.com.cn>
Cc: Zhiguang Liu <zhiguang....@intel.com>

Signed-off-by: Mateusz Albecki <mateusz.albe...@intel.com>
---
 MdePkg/MdePkg.ci.yaml                         |   5 +-
 MdePkg/Test/MdePkgHostTest.dsc                |   2 +
 .../Library/DevicePathLib/TestDevicePathLib.c | 638 ++++++++++++++++++
 .../Library/DevicePathLib/TestDevicePathLib.h |  26 +
 .../DevicePathLib/TestDevicePathLibHost.inf   |  33 +
 .../TestDevicePathStringConversions.c         | 370 ++++++++++
 6 files changed, 1073 insertions(+), 1 deletion(-)
 create mode 100644 
MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c
 create mode 100644 
MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.h
 create mode 100644 
MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLibHost.inf
 create mode 100644 
MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathStringConversions.c

diff --git a/MdePkg/MdePkg.ci.yaml b/MdePkg/MdePkg.ci.yaml
index c3faf4913d..45f4fb537b 100644
--- a/MdePkg/MdePkg.ci.yaml
+++ b/MdePkg/MdePkg.ci.yaml
@@ -74,7 +74,10 @@
             "Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLib.c",
             "Library/BaseFdtLib",
             "Library/MipiSysTLib/mipi_syst.h",
-            "Include/Register/Amd/SmramSaveStateMap.h"
+            "Include/Register/Amd/SmramSaveStateMap.h",
+            "Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c",
+            "Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.h",
+            
"Test/UnitTest/Library/DevicePathLib/TestDevicePathStringConversions.c"
         ]
     },
     ## options defined ci/Plugin/CompilerPlugin
diff --git a/MdePkg/Test/MdePkgHostTest.dsc b/MdePkg/Test/MdePkgHostTest.dsc
index 529ea69024..b92b564d43 100644
--- a/MdePkg/Test/MdePkgHostTest.dsc
+++ b/MdePkg/Test/MdePkgHostTest.dsc
@@ -21,6 +21,7 @@
 
 [LibraryClasses]
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
+  DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibBase.inf
 
 [Components]
   #
@@ -29,6 +30,7 @@
   MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost.inf
   MdePkg/Test/UnitTest/Library/BaseLib/BaseLibUnitTestsHost.inf
   MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/GoogleTestBaseSafeIntLib.inf
+  MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLibHost.inf
 
   #
   # Build HOST_APPLICATION Libraries
diff --git a/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c 
b/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c
new file mode 100644
index 0000000000..687497278c
--- /dev/null
+++ b/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c
@@ -0,0 +1,638 @@
+/** @file
+  UEFI OS based application for unit testing the DevicePathLib.
+
+  Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include "TestDevicePathLib.h"
+
+#define UNIT_TEST_NAME     "DevicePathLib Unit Test Application"
+#define UNIT_TEST_VERSION  "0.1"
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH        AcpiPath;
+  PCI_DEVICE_PATH             PciPathRootPort;
+  PCI_DEVICE_PATH             PciPathEndPoint;
+  USB_DEVICE_PATH             UsbPath;
+  EFI_DEVICE_PATH_PROTOCOL    End;
+} TEST_COMPLEX_DEVICE_PATH;
+
+GLOBAL_REMOVE_IF_UNREFERENCED TEST_COMPLEX_DEVICE_PATH  mComplexDevicePath = {
+  { // ACPI device path with root bridge EISA_PNP_ID
+    {
+      ACPI_DEVICE_PATH,
+      ACPI_DP,
+      {
+        (UINT8)(sizeof (ACPI_HID_DEVICE_PATH)),
+        (UINT8)((sizeof (ACPI_HID_DEVICE_PATH)) >> 8)
+      }
+    },
+    EISA_PNP_ID (0x0A03),
+    0
+  },
+  { // PCI device path - root port (0x2:0x0)
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_PCI_DP,
+      {
+        (UINT8)(sizeof (PCI_DEVICE_PATH)),
+        (UINT8)((sizeof (PCI_DEVICE_PATH)) >> 8)
+      }
+    },
+    0x2,
+    0x0
+  },
+  { // PCI device path - endpoint (0x0:0x0)
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_PCI_DP,
+      {
+        (UINT8)(sizeof (PCI_DEVICE_PATH)),
+        (UINT8)((sizeof (PCI_DEVICE_PATH)) >> 8)
+      }
+    },
+    0x0,
+    0x0
+  },
+  { // USB interface
+    {
+      MESSAGING_DEVICE_PATH,
+      MSG_USB_DP,
+      {
+        (UINT8)(sizeof (USB_DEVICE_PATH)),
+        (UINT8)((sizeof (USB_CLASS_DEVICE_PATH)) >> 8)
+      }
+    },
+    0,
+    2
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    {
+      (UINT8)(sizeof (EFI_DEVICE_PATH_PROTOCOL)),
+      (UINT8)((sizeof (EFI_DEVICE_PATH_PROTOCOL)) >> 8)
+    }
+  }
+};
+
+CONST GLOBAL_REMOVE_IF_UNREFERENCED CHAR16  *mComplexDevicePathString = 
L"PciRoot(0x0)/Pci(0x0,0x2)/Pci(0x0,0x0)/USB(0x0,0x2)";
+
+CONST GLOBAL_REMOVE_IF_UNREFERENCED CHAR16  *mPciEndPointPathString = 
L"Pci(0x0, 0x0)";
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH        AcpiPath;
+  EFI_DEVICE_PATH_PROTOCOL    End;
+} TEST_SIMPLE_DEVICE_PATH;
+
+GLOBAL_REMOVE_IF_UNREFERENCED TEST_SIMPLE_DEVICE_PATH  mSimpleDevicePath = {
+  { // ACPI device path with root bridge EISA_PNP_ID
+    {
+      ACPI_DEVICE_PATH,
+      ACPI_DP,
+      {
+        (UINT8)(sizeof (ACPI_HID_DEVICE_PATH)),
+        (UINT8)((sizeof (ACPI_HID_DEVICE_PATH)) >> 8)
+      }
+    },
+    EISA_PNP_ID (0x0A03),
+    0
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    {
+      (UINT8)(sizeof (EFI_DEVICE_PATH_PROTOCOL)),
+      (UINT8)((sizeof (EFI_DEVICE_PATH_PROTOCOL)) >> 8)
+    }
+  }
+};
+
+GLOBAL_REMOVE_IF_UNREFERENCED TEST_SIMPLE_DEVICE_PATH  
mInvalidSimpleDevicePath = {
+  { // ACPI device path with root bridge EISA_PNP_ID
+    {
+      ACPI_DEVICE_PATH,
+      ACPI_DP,
+      {
+        0,
+        0
+      }
+    },
+    EISA_PNP_ID (0x0A03),
+    0
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    {
+      (UINT8)(sizeof (EFI_DEVICE_PATH_PROTOCOL)),
+      (UINT8)((sizeof (EFI_DEVICE_PATH_PROTOCOL)) >> 8)
+    }
+  }
+};
+
+typedef struct {
+  TEST_SIMPLE_DEVICE_PATH     *SimpleDevicePath;
+  TEST_SIMPLE_DEVICE_PATH     *InvalidDevicePath;
+  TEST_COMPLEX_DEVICE_PATH    *ComplexDevicePath;
+} SIMPLE_TEST_SUITE_CONTEXT;
+
+UNIT_TEST_STATUS
+EFIAPI
+TestIsDevicePathValid (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  BOOLEAN                    IsValid;
+  SIMPLE_TEST_SUITE_CONTEXT  *TestContext;
+
+  TestContext = (SIMPLE_TEST_SUITE_CONTEXT *)Context;
+
+  IsValid = IsDevicePathValid ((EFI_DEVICE_PATH_PROTOCOL 
*)TestContext->SimpleDevicePath, sizeof (TEST_SIMPLE_DEVICE_PATH));
+  UT_ASSERT_TRUE (IsValid);
+
+  IsValid = IsDevicePathValid ((EFI_DEVICE_PATH_PROTOCOL 
*)TestContext->ComplexDevicePath, sizeof (TEST_COMPLEX_DEVICE_PATH));
+  UT_ASSERT_TRUE (IsValid);
+
+  IsValid = IsDevicePathValid ((EFI_DEVICE_PATH_PROTOCOL 
*)TestContext->ComplexDevicePath, 0);
+  UT_ASSERT_TRUE (IsValid);
+
+  // Device path can't be NULL
+  IsValid = IsDevicePathValid (NULL, 0);
+  UT_ASSERT_FALSE (IsValid);
+
+  // MaxSize can't be less then the size of the device path
+  IsValid = IsDevicePathValid ((EFI_DEVICE_PATH_PROTOCOL 
*)TestContext->SimpleDevicePath, sizeof (TEST_SIMPLE_DEVICE_PATH) - 1);
+  UT_ASSERT_FALSE (IsValid);
+
+  // If MaxSize != 0 it must be bigger then EFI_DEVICE_PATH_PROTOCOL
+  IsValid = IsDevicePathValid ((EFI_DEVICE_PATH_PROTOCOL 
*)TestContext->SimpleDevicePath, sizeof (EFI_DEVICE_PATH_PROTOCOL) - 1);
+  UT_ASSERT_FALSE (IsValid);
+
+  IsValid = IsDevicePathValid ((EFI_DEVICE_PATH_PROTOCOL 
*)TestContext->InvalidDevicePath, 0);
+  UT_ASSERT_FALSE (IsValid);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestDevicePathType (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  UINT8                      Type;
+  SIMPLE_TEST_SUITE_CONTEXT  *TestContext;
+
+  TestContext = (SIMPLE_TEST_SUITE_CONTEXT *)Context;
+
+  // Test 2 types just in case the implementation is returning constant value
+  // NOTE: passing NULL to this function causes NULL pointer dereference.
+  Type = DevicePathType (&TestContext->ComplexDevicePath->AcpiPath);
+  UT_ASSERT_EQUAL (Type, ACPI_DEVICE_PATH);
+
+  Type = DevicePathType (&TestContext->ComplexDevicePath->PciPathRootPort);
+  UT_ASSERT_EQUAL (Type, HARDWARE_DEVICE_PATH);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestDevicePathSubType (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  UINT8                      SubType;
+  SIMPLE_TEST_SUITE_CONTEXT  *TestContext;
+
+  TestContext = (SIMPLE_TEST_SUITE_CONTEXT *)Context;
+
+  // Test 2 sub types just in case the implementation is returning constant 
value
+  // NOTE: passing NULL to this function causes NULL pointer dereference.
+  SubType = DevicePathSubType (&TestContext->ComplexDevicePath->AcpiPath);
+  UT_ASSERT_EQUAL (SubType, ACPI_DP);
+
+  SubType = DevicePathSubType 
(&TestContext->ComplexDevicePath->PciPathRootPort);
+  UT_ASSERT_EQUAL (SubType, HW_PCI_DP);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestDevicePathNodeLength (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  UINTN                      Length;
+  SIMPLE_TEST_SUITE_CONTEXT  *TestContext;
+
+  TestContext = (SIMPLE_TEST_SUITE_CONTEXT *)Context;
+
+  // Test 2 nodes just in case the implementation is returning constant value
+  // NOTE: passing NULL to this function causes NULL pointer dereference.
+  Length = DevicePathNodeLength (&TestContext->ComplexDevicePath->AcpiPath);
+  UT_ASSERT_EQUAL (Length, sizeof (ACPI_HID_DEVICE_PATH));
+
+  Length = DevicePathNodeLength 
(&TestContext->ComplexDevicePath->PciPathRootPort);
+  UT_ASSERT_EQUAL (Length, sizeof (PCI_DEVICE_PATH));
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestNextDevicePathNode (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  VOID                       *Node;
+  SIMPLE_TEST_SUITE_CONTEXT  *TestContext;
+
+  TestContext = (SIMPLE_TEST_SUITE_CONTEXT *)Context;
+
+  Node = &mComplexDevicePath;
+  Node = NextDevicePathNode (Node);
+  UT_ASSERT_MEM_EQUAL (Node, &TestContext->ComplexDevicePath->PciPathRootPort, 
DevicePathNodeLength (Node));
+
+  Node = NextDevicePathNode (Node);
+  UT_ASSERT_MEM_EQUAL (Node, &TestContext->ComplexDevicePath->PciPathEndPoint, 
DevicePathNodeLength (Node));
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestIsDevicePathEndType (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  BOOLEAN                    IsEndType;
+  SIMPLE_TEST_SUITE_CONTEXT  *TestContext;
+
+  TestContext = (SIMPLE_TEST_SUITE_CONTEXT *)Context;
+
+  IsEndType = IsDevicePathEndType 
(&TestContext->ComplexDevicePath->PciPathRootPort);
+  UT_ASSERT_FALSE (IsEndType);
+
+  IsEndType = IsDevicePathEndType (&TestContext->ComplexDevicePath->End);
+  UT_ASSERT_TRUE (IsEndType);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestIsDevicePathEnd (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  BOOLEAN                    IsEnd;
+  SIMPLE_TEST_SUITE_CONTEXT  *TestContext;
+
+  TestContext = (SIMPLE_TEST_SUITE_CONTEXT *)Context;
+
+  IsEnd = IsDevicePathEnd (&TestContext->ComplexDevicePath->PciPathRootPort);
+  UT_ASSERT_FALSE (IsEnd);
+
+  IsEnd = IsDevicePathEnd (&TestContext->ComplexDevicePath->End);
+  UT_ASSERT_TRUE (IsEnd);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestSetDevicePathNodeLength (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL  DevPath;
+
+  // NOTE: Node == NULL or NodeLength >= 0x10000 NodeLength < sizeof 
(EFI_DEVICE_PATH_PROTOCOL)
+  // are all invalid parameters. However there are only ASSERTS added to catch 
them so there is no
+  // way to test it.
+  SetDevicePathNodeLength (&DevPath, sizeof (EFI_DEVICE_PATH_PROTOCOL));
+  UT_ASSERT_EQUAL (DevicePathNodeLength (&DevPath), sizeof 
(EFI_DEVICE_PATH_PROTOCOL));
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestSetDevicePathEndNode (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL  EndNode;
+
+  SetDevicePathEndNode (&EndNode);
+  UT_ASSERT_EQUAL (EndNode.Type, END_DEVICE_PATH_TYPE);
+  UT_ASSERT_EQUAL (EndNode.SubType, END_ENTIRE_DEVICE_PATH_SUBTYPE);
+  UT_ASSERT_EQUAL (DevicePathNodeLength (&EndNode), END_DEVICE_PATH_LENGTH);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestGetDevicePathSize (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  UINTN                      Size;
+  SIMPLE_TEST_SUITE_CONTEXT  *TestContext;
+
+  TestContext = (SIMPLE_TEST_SUITE_CONTEXT *)Context;
+
+  Size = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL 
*)TestContext->SimpleDevicePath);
+  UT_ASSERT_EQUAL (Size, sizeof (TEST_SIMPLE_DEVICE_PATH));
+
+  Size = GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL 
*)TestContext->ComplexDevicePath);
+  UT_ASSERT_EQUAL (Size, sizeof (TEST_COMPLEX_DEVICE_PATH));
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestDuplicateDevicePath (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL   *Duplicate;
+  SIMPLE_TEST_SUITE_CONTEXT  *TestContext;
+
+  TestContext = (SIMPLE_TEST_SUITE_CONTEXT *)Context;
+
+  Duplicate = DuplicateDevicePath ((EFI_DEVICE_PATH_PROTOCOL 
*)TestContext->ComplexDevicePath);
+  UT_ASSERT_EQUAL (GetDevicePathSize (Duplicate), GetDevicePathSize 
((EFI_DEVICE_PATH_PROTOCOL *)TestContext->ComplexDevicePath));
+  UT_ASSERT_MEM_EQUAL (Duplicate, TestContext->ComplexDevicePath, 
GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *)TestContext->ComplexDevicePath));
+  FreePool (Duplicate);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestAppendDevicePath (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL  *Appended;
+  EFI_DEVICE_PATH_PROTOCOL  *NextNode;
+
+  Appended = AppendDevicePath ((EFI_DEVICE_PATH_PROTOCOL *)&mSimpleDevicePath, 
(EFI_DEVICE_PATH_PROTOCOL *)&mComplexDevicePath);
+  NextNode = NextDevicePathNode (Appended);
+  UT_ASSERT_MEM_EQUAL (NextNode, &mSimpleDevicePath.AcpiPath, sizeof 
(ACPI_HID_DEVICE_PATH));
+  FreePool (Appended);
+
+  // If one of the paths is invalid result device path should be NULL
+  Appended = AppendDevicePath ((EFI_DEVICE_PATH_PROTOCOL *)&mSimpleDevicePath, 
(EFI_DEVICE_PATH_PROTOCOL *)&mInvalidSimpleDevicePath);
+  UT_ASSERT_EQUAL ((uintptr_t)Appended, (uintptr_t)NULL);
+
+  Appended = AppendDevicePath (NULL, NULL);
+  UT_ASSERT_EQUAL (Appended->Type, END_DEVICE_PATH_TYPE);
+  UT_ASSERT_EQUAL (Appended->SubType, END_ENTIRE_DEVICE_PATH_SUBTYPE);
+  UT_ASSERT_EQUAL (DevicePathNodeLength (Appended), END_DEVICE_PATH_LENGTH);
+  FreePool (Appended);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestAppendDevicePathNode (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL  *Appended;
+  EFI_DEVICE_PATH_PROTOCOL  *NextNode;
+  BOOLEAN                   IsValid;
+  ACPI_HID_DEVICE_PATH      AcpiPath =
+  {
+    {
+      ACPI_DEVICE_PATH,
+      ACPI_DP,
+      {
+        (UINT8)(sizeof (ACPI_HID_DEVICE_PATH)),
+        (UINT8)((sizeof (ACPI_HID_DEVICE_PATH)) >> 8)
+      }
+    },
+    EISA_PNP_ID (0x0AAB),
+    0
+  };
+
+  Appended = AppendDevicePathNode ((EFI_DEVICE_PATH_PROTOCOL 
*)&mSimpleDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&AcpiPath);
+  NextNode = NextDevicePathNode (Appended);
+  UT_ASSERT_MEM_EQUAL (NextNode, &AcpiPath, sizeof (ACPI_HID_DEVICE_PATH));
+  FreePool (Appended);
+
+  Appended = AppendDevicePathNode (NULL, (EFI_DEVICE_PATH_PROTOCOL 
*)&AcpiPath);
+  UT_ASSERT_MEM_EQUAL (Appended, &AcpiPath, sizeof (ACPI_HID_DEVICE_PATH));
+  IsValid = IsDevicePathValid (Appended, 0);
+  UT_ASSERT_TRUE (IsValid);
+  FreePool (Appended);
+
+  Appended = AppendDevicePathNode (NULL, NULL);
+  UT_ASSERT_EQUAL (Appended->Type, END_DEVICE_PATH_TYPE);
+  UT_ASSERT_EQUAL (Appended->SubType, END_ENTIRE_DEVICE_PATH_SUBTYPE);
+  UT_ASSERT_EQUAL (DevicePathNodeLength (Appended), END_DEVICE_PATH_LENGTH);
+  FreePool (Appended);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestAppendDevicePathInstance (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL  *Appended;
+  EFI_DEVICE_PATH_PROTOCOL  *NextInstance;
+  EFI_DEVICE_PATH_PROTOCOL  *NextInstanceRet;
+  BOOLEAN                   IsMultiInstance;
+  UINTN                     Size;
+
+  Appended        = AppendDevicePathInstance ((EFI_DEVICE_PATH_PROTOCOL 
*)&mSimpleDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&mComplexDevicePath);
+  IsMultiInstance = IsDevicePathMultiInstance (Appended);
+  UT_ASSERT_TRUE (IsMultiInstance);
+  UT_ASSERT_MEM_EQUAL (Appended, &mSimpleDevicePath, sizeof 
(ACPI_DEVICE_PATH));
+  NextInstance    = Appended;
+  NextInstanceRet = GetNextDevicePathInstance (&NextInstance, &Size);
+  UT_ASSERT_MEM_EQUAL (NextInstance, &mComplexDevicePath, Size);
+  FreePool (Appended);
+  FreePool (NextInstanceRet);
+
+  Appended = AppendDevicePathInstance (NULL, (EFI_DEVICE_PATH_PROTOCOL 
*)&mSimpleDevicePath);
+  UT_ASSERT_MEM_EQUAL (Appended, &mSimpleDevicePath, sizeof 
(TEST_SIMPLE_DEVICE_PATH));
+  FreePool (Appended);
+
+  Appended = AppendDevicePathInstance (NULL, NULL);
+  UT_ASSERT_EQUAL ((uintptr_t)Appended, (uintptr_t)NULL);
+  FreePool (Appended);
+
+  Appended = AppendDevicePathInstance ((EFI_DEVICE_PATH_PROTOCOL 
*)&mSimpleDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&mInvalidSimpleDevicePath);
+  UT_ASSERT_EQUAL ((uintptr_t)Appended, (uintptr_t)NULL);
+  FreePool (Appended);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestDevicePathFromHandle (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  EFI_HANDLE                Handle;
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
+  UINTN                     FakeHandle;
+
+  Handle     = NULL;
+  DevicePath = DevicePathFromHandle (Handle);
+  UT_ASSERT_EQUAL ((uintptr_t)DevicePath, (uintptr_t)NULL);
+
+  Handle     = (EFI_HANDLE)&FakeHandle;
+  DevicePath = DevicePathFromHandle (Handle);
+  UT_ASSERT_EQUAL ((uintptr_t)DevicePath, (uintptr_t)NULL);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestCreateDeviceNode (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL  *DevNode;
+
+  DevNode = CreateDeviceNode (HARDWARE_DEVICE_PATH, HW_PCI_DP, sizeof 
(PCI_DEVICE_PATH));
+  UT_ASSERT_EQUAL (DevNode->Type, HARDWARE_DEVICE_PATH);
+  UT_ASSERT_EQUAL (DevNode->SubType, HW_PCI_DP);
+  UT_ASSERT_EQUAL (DevicePathNodeLength (DevNode), sizeof (PCI_DEVICE_PATH));
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestFileDevicePath (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  EFI_HANDLE            Handle;
+  FILEPATH_DEVICE_PATH  *DevicePath;
+  CONST CHAR16          *TestFilePath = L"FS0:/Boot/EFI/BootMgr.efi";
+
+  Handle     = NULL;
+  DevicePath = (FILEPATH_DEVICE_PATH *)FileDevicePath (Handle, TestFilePath);
+  UT_ASSERT_NOT_NULL (DevicePath);
+  UT_ASSERT_EQUAL (DevicePath->Header.Type, MEDIA_DEVICE_PATH);
+  UT_ASSERT_EQUAL (DevicePath->Header.Type, MEDIA_FILEPATH_DP);
+  UT_ASSERT_MEM_EQUAL (DevicePath->PathName, TestFilePath, StrSize 
(TestFilePath));
+
+  return UNIT_TEST_PASSED;
+}
+
+/**
+
+  Main fuction sets up the unit test environment
+
+**/
+EFI_STATUS
+EFIAPI
+UefiTestMain (
+  VOID
+  )
+{
+  EFI_STATUS                  Status;
+  UNIT_TEST_FRAMEWORK_HANDLE  Framework;
+  UNIT_TEST_SUITE_HANDLE      DevicePathSimpleTestSuite;
+  UNIT_TEST_SUITE_HANDLE      DevicePathAppendTestSuite;
+  UNIT_TEST_SUITE_HANDLE      DevicePathFileTestSuite;
+  SIMPLE_TEST_SUITE_CONTEXT   SimpleTestContext;
+
+  DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_NAME, UNIT_TEST_VERSION));
+
+  Framework                 = NULL;
+  DevicePathSimpleTestSuite = NULL;
+  DevicePathAppendTestSuite = NULL;
+  DevicePathFileTestSuite   = NULL;
+
+  Status = InitUnitTestFramework (&Framework, UNIT_TEST_NAME, 
gEfiCallerBaseName, UNIT_TEST_VERSION);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", 
Status));
+    goto EXIT;
+  }
+
+  Status = CreateUnitTestSuite (&DevicePathSimpleTestSuite, Framework, "Simple 
device path operations test suite", "Common.DevicePath.SimpleOps", NULL, NULL);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "Failed to create simple device path test suite\n"));
+    goto EXIT;
+  }
+
+  SimpleTestContext.SimpleDevicePath  = &mSimpleDevicePath;
+  SimpleTestContext.InvalidDevicePath = &mInvalidSimpleDevicePath;
+  SimpleTestContext.ComplexDevicePath = &mComplexDevicePath;
+
+  AddTestCase (DevicePathSimpleTestSuite, "Test IsDevicePathValid", 
"TestIsDevicePathValid", TestIsDevicePathValid, NULL, NULL, &SimpleTestContext);
+  AddTestCase (DevicePathSimpleTestSuite, "Test DevicePathType", 
"TestDevicePathType", TestDevicePathType, NULL, NULL, &SimpleTestContext);
+  AddTestCase (DevicePathSimpleTestSuite, "Test DevicePathSubType", 
"TestDevicePathSubType", TestDevicePathSubType, NULL, NULL, &SimpleTestContext);
+  AddTestCase (DevicePathSimpleTestSuite, "Test DevicePathNodeLength", 
"TestDevicePathNodeLength", TestDevicePathNodeLength, NULL, NULL, 
&SimpleTestContext);
+  AddTestCase (DevicePathSimpleTestSuite, "Test NextDevicePathNode", 
"TestNextDevicePathNode", TestNextDevicePathNode, NULL, NULL, 
&SimpleTestContext);
+  AddTestCase (DevicePathSimpleTestSuite, "Test IsDevicePathEndType", 
"TestIsDevicePathEndType", TestIsDevicePathEndType, NULL, NULL, 
&SimpleTestContext);
+  AddTestCase (DevicePathSimpleTestSuite, "Test IsDevicePathEnd", 
"TestIsDevicePathEnd", TestIsDevicePathEnd, NULL, NULL, &SimpleTestContext);
+  AddTestCase (DevicePathSimpleTestSuite, "Test SetDevicePathNodeLength", 
"TestSetDevicePathNodeLength", TestSetDevicePathNodeLength, NULL, NULL, 
&SimpleTestContext);
+  AddTestCase (DevicePathSimpleTestSuite, "Test GetDevicePathSize", 
"TestGetDevicePathSize", TestGetDevicePathSize, NULL, NULL, &SimpleTestContext);
+  AddTestCase (DevicePathSimpleTestSuite, "Test CreateDeviceNode", 
"TestCreateDeviceNode", TestCreateDeviceNode, NULL, NULL, &SimpleTestContext);
+  AddTestCase (DevicePathSimpleTestSuite, "Test SetDevicePathEndNode", 
"TestSetDevicePathEndNode", TestSetDevicePathEndNode, NULL, NULL, 
&SimpleTestContext);
+  AddTestCase (DevicePathAppendTestSuite, "Test DuplicateDevicePath", 
"TestDuplicateDevicePath", TestDuplicateDevicePath, NULL, NULL, 
&SimpleTestContext);
+
+  Status = CreateUnitTestSuite (&DevicePathAppendTestSuite, Framework, "Device 
path append operations test suite", "Common.DevicePath.Append", NULL, NULL);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "Failed to create append device path test suite\n"));
+    goto EXIT;
+  }
+
+  AddTestCase (DevicePathAppendTestSuite, "Test AppendDevicePath", 
"TestAppendDevicePath", TestAppendDevicePath, NULL, NULL, NULL);
+  AddTestCase (DevicePathAppendTestSuite, "Test AppendDevicePathNode", 
"TestAppendDevicePathNode", TestAppendDevicePathNode, NULL, NULL, NULL);
+  AddTestCase (DevicePathAppendTestSuite, "Test AppendDevicePathInstance", 
"TestAppendDevicePathInstance", TestAppendDevicePathInstance, NULL, NULL, NULL);
+
+  Status = CreateDevicePathStringConversionsTestSuite (Framework);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "Failed to create conversions test suite\n"));
+    goto EXIT;
+  }
+
+  Status = CreateUnitTestSuite (&DevicePathFileTestSuite, Framework, "Device 
path file operations test suite", "Common.DevicePath.FileDevPath", NULL, NULL);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "Failed to create device path file test suite\n"));
+    goto EXIT;
+  }
+
+  AddTestCase (DevicePathFileTestSuite, "Test DevicePathFromHandle", 
"TestDevicePathFromHandle", TestDevicePathFromHandle, NULL, NULL, NULL);
+  AddTestCase (DevicePathFileTestSuite, "Test FileDevicePath", 
"TestFileDevicePath", TestFileDevicePath, NULL, NULL, NULL);
+
+  Status = RunAllTestSuites (Framework);
+
+EXIT:
+  if (Framework != NULL) {
+    FreeUnitTestFramework (Framework);
+  }
+
+  return Status;
+}
+
+int
+main (
+  int   argc,
+  char  *argv[]
+  )
+{
+  return UefiTestMain ();
+}
diff --git a/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.h 
b/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.h
new file mode 100644
index 0000000000..4a0c3d4c43
--- /dev/null
+++ b/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.h
@@ -0,0 +1,26 @@
+/** @file
+  UEFI OS based application for unit testing the DevicePathLib.
+
+  Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#ifndef __TEST_DEVICE_PATH_LIB_H__
+#define __TEST_DEVICE_PATH_LIB_H__
+
+#include <PiPei.h>
+#include <Uefi.h>
+#include <Library/UefiLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UnitTestLib.h>
+#include <Protocol/DevicePath.h>
+#include <Library/DevicePathLib.h>
+#include <stdint.h>
+
+EFI_STATUS
+CreateDevicePathStringConversionsTestSuite (
+  IN UNIT_TEST_FRAMEWORK_HANDLE  Framework
+  );
+
+#endif
diff --git 
a/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLibHost.inf 
b/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLibHost.inf
new file mode 100644
index 0000000000..9f9c36946a
--- /dev/null
+++ b/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLibHost.inf
@@ -0,0 +1,33 @@
+## @file
+# Host OS based Application that Unit Tests the UefiDevicePathLib
+#
+# Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+  INF_VERSION     = 0x00010005
+  BASE_NAME       = TestDevicePathLibHost
+  MODULE_UNI_FILE = TestDevicePathLib.uni
+  FILE_GUID       = F1505A0E-D71F-4431-99BE-736776842E38
+  MODULE_TYPE     = HOST_APPLICATION
+  VERSION_STRING  = 1.0
+
+#
+# The following information is for reference only and not required by the 
build tools.
+#
+#  VALID_ARCHITECTURES           = IA32 X64
+#
+
+[Sources]
+  TestDevicePathLib.c
+  TestDevicePathStringConversions.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  BaseLib
+  DebugLib
+  DevicePathLib
+  UnitTestLib
diff --git 
a/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathStringConversions.c 
b/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathStringConversions.c
new file mode 100644
index 0000000000..4ea25ec142
--- /dev/null
+++ 
b/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathStringConversions.c
@@ -0,0 +1,370 @@
+/** @file
+  UEFI OS based application for unit testing the DevicePathLib.
+
+  Copyright (c) 2023, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "TestDevicePathLib.h"
+
+typedef struct {
+  EFI_DEVICE_PATH_PROTOCOL    *DevPath;
+  CONST CHAR16                *DevPathString;
+} DEVICE_PATH_CONVERSIONS_TEST_CONTEXT;
+
+GLOBAL_REMOVE_IF_UNREFERENCED PCI_DEVICE_PATH  mPciDevicePathNode =
+{
+  // PCI device path - root port (0x2:0x0)
+  {
+    HARDWARE_DEVICE_PATH,
+    HW_PCI_DP,
+    {
+      (UINT8)(sizeof (PCI_DEVICE_PATH)),
+      (UINT8)((sizeof (PCI_DEVICE_PATH)) >> 8)
+    }
+  },
+  0x2,
+  0x0
+};
+
+GLOBAL_REMOVE_IF_UNREFERENCED ACPI_HID_DEVICE_PATH  
mAcpiPciRootHidDevicePathNode =
+{
+  // ACPI PCI root - PciRoot(0x0)
+  {
+    ACPI_DEVICE_PATH,
+    ACPI_DP,
+    {
+      (UINT8)(sizeof (ACPI_HID_DEVICE_PATH)),
+      (UINT8)((sizeof (ACPI_HID_DEVICE_PATH)) >> 8)
+    }
+  },
+  EISA_PNP_ID (0x0A03),
+  0
+};
+
+GLOBAL_REMOVE_IF_UNREFERENCED ACPI_HID_DEVICE_PATH  
mAcpiNonPciRootHidDevicePathNode =
+{
+  // Random ACPI device - ACPI(PNPB0C0, 1)
+  {
+    ACPI_DEVICE_PATH,
+    ACPI_DP,
+    {
+      (UINT8)(sizeof (ACPI_HID_DEVICE_PATH)),
+      (UINT8)((sizeof (ACPI_HID_DEVICE_PATH)) >> 8)
+    }
+  },
+  EISA_PNP_ID (0xB0C0),
+  1
+};
+
+#define HID_STR_SIZE  8
+#define CID_STR_SIZE  8
+#define UID_STR_SIZE  8
+
+typedef struct {
+  ACPI_EXTENDED_HID_DEVICE_PATH    AcpiEx;
+  CHAR8                            HidStr[HID_STR_SIZE];
+  CHAR8                            CidStr[CID_STR_SIZE];
+  CHAR8                            UidStr[UID_STR_SIZE];
+} ACPI_EXTENDED_HID_DEVICE_PATH_FULL;
+
+GLOBAL_REMOVE_IF_UNREFERENCED ACPI_EXTENDED_HID_DEVICE_PATH_FULL  
mAcpiExtendedDevicePathFull =
+{
+  // ACPI Extended HID PciRoot device node
+  {
+    {
+      ACPI_DEVICE_PATH,
+      ACPI_EXTENDED_DP,
+      {
+        (UINT8)(sizeof (ACPI_EXTENDED_HID_DEVICE_PATH_FULL)),
+        (UINT8)((sizeof (ACPI_EXTENDED_HID_DEVICE_PATH_FULL)) >> 8)
+      }
+    },
+    0,
+    0,
+    0,
+  },
+  { 'P', 'N', 'P', 'B', '0', 'C', '0', '\0' }, // HIDSTR
+  { 'P', 'N', 'P', '0', '0', '0', '1', '\0' }, // CIDSTR
+  { 'U', 'I', 'D', '0', '0', '0', '0', '\0' } // UIDSTR
+};
+
+typedef struct {
+  ACPI_EXTENDED_HID_DEVICE_PATH    AcpiEx;
+  CHAR8                            HidStr[HID_STR_SIZE];
+} ACPI_EXTENDED_HID_DEVICE_PATH_PARTIAL;
+
+GLOBAL_REMOVE_IF_UNREFERENCED ACPI_EXTENDED_HID_DEVICE_PATH_PARTIAL  
mAcpiExtendedDevicePathPartial =
+{
+  {
+    {
+      ACPI_DEVICE_PATH,
+      ACPI_EXTENDED_DP,
+      {
+        (UINT8)(sizeof (ACPI_EXTENDED_HID_DEVICE_PATH_PARTIAL)),
+        (UINT8)((sizeof (ACPI_EXTENDED_HID_DEVICE_PATH_PARTIAL)) >> 8)
+      }
+    },
+    0,
+    2,
+    0,
+  },
+  { 'P', 'N', 'P', 'B', '0', '\0', '\0', '\0' }, // HIDSTR
+};
+
+typedef struct {
+  ACPI_EXTENDED_HID_DEVICE_PATH    AcpiEx;
+  CHAR8                            UidStr[UID_STR_SIZE];
+} ACPI_EXPANDED_DEVICE_PATH;
+
+GLOBAL_REMOVE_IF_UNREFERENCED ACPI_EXPANDED_DEVICE_PATH  
mAcpiExpandedDevicePathUidOnly =
+{
+  {
+    {
+      ACPI_DEVICE_PATH,
+      ACPI_EXTENDED_DP,
+      {
+        (UINT8)(sizeof (ACPI_EXPANDED_DEVICE_PATH)),
+        (UINT8)((sizeof (ACPI_EXPANDED_DEVICE_PATH)) >> 8)
+      }
+    },
+    EISA_PNP_ID (0xAAAA),
+    0,
+    0,
+  },
+  { '\0', 'U', 'I', 'D', '0', '0', '\0', '\0' } // UIDSTR
+};
+
+GLOBAL_REMOVE_IF_UNREFERENCED ACPI_EXPANDED_DEVICE_PATH  
mAcpiExpandedDevicePathUidOnlyWithCid =
+{
+  {
+    {
+      ACPI_DEVICE_PATH,
+      ACPI_EXTENDED_DP,
+      {
+        (UINT8)(sizeof (ACPI_EXPANDED_DEVICE_PATH)),
+        (UINT8)((sizeof (ACPI_EXPANDED_DEVICE_PATH)) >> 8)
+      }
+    },
+    EISA_PNP_ID (0xAAAA),
+    0,
+    EISA_PNP_ID (0xAADD),
+  },
+  { '\0', 'U', 'I', 'D', '0', '0', '\0', '\0' } // UIDSTR
+};
+
+GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_CONVERSIONS_TEST_CONTEXT  
mDevPathNodeToFromTextContext[] = {
+  {
+    (EFI_DEVICE_PATH_PROTOCOL *)&mPciDevicePathNode,
+    L"Pci(0x0,0x2)"
+  },
+  {
+    (EFI_DEVICE_PATH_PROTOCOL *)&mAcpiPciRootHidDevicePathNode,
+    L"PciRoot(0x0)"
+  },
+  {
+    (EFI_DEVICE_PATH_PROTOCOL *)&mAcpiNonPciRootHidDevicePathNode,
+    L"Acpi(PNPB0C0,0x1)"
+  },
+  {
+    (EFI_DEVICE_PATH_PROTOCOL *)&mAcpiExtendedDevicePathFull,
+    L"AcpiEx(@@@0000,@@@0000,0x0,PNPB0C0,UID0000,PNP0001)"
+  },
+  {
+    (EFI_DEVICE_PATH_PROTOCOL *)&mAcpiExtendedDevicePathPartial,
+    L"AcpiEx(@@@0000,@@@0000,0x2,PNPB0,,)"
+  },
+  {
+    (EFI_DEVICE_PATH_PROTOCOL *)&mAcpiExpandedDevicePathUidOnly,
+    L"AcpiExp(PNPAAAA,0,UID00)"
+  },
+  {
+    (EFI_DEVICE_PATH_PROTOCOL *)&mAcpiExpandedDevicePathUidOnlyWithCid,
+    L"AcpiExp(PNPAAAA,PNPAADD,UID00)"
+  }
+};
+
+typedef struct {
+  ACPI_HID_DEVICE_PATH        AcpiPath;
+  PCI_DEVICE_PATH             PciPathRootPort;
+  PCI_DEVICE_PATH             PciPathEndPoint;
+  USB_DEVICE_PATH             UsbPath;
+  EFI_DEVICE_PATH_PROTOCOL    End;
+} TEST_CONVERSIONS_DEVICE_PATH;
+
+GLOBAL_REMOVE_IF_UNREFERENCED TEST_CONVERSIONS_DEVICE_PATH  
mConversionsDevicePath = {
+  { // ACPI device path with root bridge EISA_PNP_ID
+    {
+      ACPI_DEVICE_PATH,
+      ACPI_DP,
+      {
+        (UINT8)(sizeof (ACPI_HID_DEVICE_PATH)),
+        (UINT8)((sizeof (ACPI_HID_DEVICE_PATH)) >> 8)
+      }
+    },
+    EISA_PNP_ID (0x0A03),
+    0
+  },
+  { // PCI device path - root port (0x2:0x0)
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_PCI_DP,
+      {
+        (UINT8)(sizeof (PCI_DEVICE_PATH)),
+        (UINT8)((sizeof (PCI_DEVICE_PATH)) >> 8)
+      }
+    },
+    0x2,
+    0x0
+  },
+  { // PCI device path - endpoint (0x0:0x0)
+    {
+      HARDWARE_DEVICE_PATH,
+      HW_PCI_DP,
+      {
+        (UINT8)(sizeof (PCI_DEVICE_PATH)),
+        (UINT8)((sizeof (PCI_DEVICE_PATH)) >> 8)
+      }
+    },
+    0x0,
+    0x0
+  },
+  { // USB interface
+    {
+      MESSAGING_DEVICE_PATH,
+      MSG_USB_DP,
+      {
+        (UINT8)(sizeof (USB_DEVICE_PATH)),
+        (UINT8)((sizeof (USB_CLASS_DEVICE_PATH)) >> 8)
+      }
+    },
+    0,
+    2
+  },
+  {
+    END_DEVICE_PATH_TYPE,
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,
+    {
+      (UINT8)(sizeof (EFI_DEVICE_PATH_PROTOCOL)),
+      (UINT8)((sizeof (EFI_DEVICE_PATH_PROTOCOL)) >> 8)
+    }
+  }
+};
+
+GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_CONVERSIONS_TEST_CONTEXT  
mDevPathToFromTextContext[] = {
+  {
+    (EFI_DEVICE_PATH_PROTOCOL *)&mConversionsDevicePath,
+    L"PciRoot(0x0)/Pci(0x0,0x2)/Pci(0x0,0x0)/USB(0x0,0x2)"
+  }
+};
+
+UNIT_TEST_STATUS
+EFIAPI
+TestConvertDevicePathToText (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  CHAR16                                *DevPathString;
+  DEVICE_PATH_CONVERSIONS_TEST_CONTEXT  *TestContext;
+
+  TestContext = (DEVICE_PATH_CONVERSIONS_TEST_CONTEXT *)Context;
+
+  DevPathString = ConvertDevicePathToText (TestContext->DevPath, FALSE, FALSE);
+  UT_ASSERT_EQUAL (StrLen (DevPathString), StrLen 
(TestContext->DevPathString));
+  UT_ASSERT_MEM_EQUAL (DevPathString, TestContext->DevPathString, StrLen 
(TestContext->DevPathString));
+  FreePool (DevPathString);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestConvertTextToDevicePath (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL              *ConvertedDevPath;
+  DEVICE_PATH_CONVERSIONS_TEST_CONTEXT  *TestContext;
+
+  TestContext = (DEVICE_PATH_CONVERSIONS_TEST_CONTEXT *)Context;
+
+  ConvertedDevPath = ConvertTextToDevicePath (TestContext->DevPathString);
+  UT_ASSERT_EQUAL (GetDevicePathSize (ConvertedDevPath), GetDevicePathSize 
(TestContext->DevPath));
+  UT_ASSERT_MEM_EQUAL (ConvertedDevPath, TestContext->DevPath, 
GetDevicePathSize (TestContext->DevPath));
+  FreePool (ConvertedDevPath);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestConvertDeviceNodeToText (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  CHAR16                                *DevPathNodeString;
+  DEVICE_PATH_CONVERSIONS_TEST_CONTEXT  *TestContext;
+
+  TestContext = (DEVICE_PATH_CONVERSIONS_TEST_CONTEXT *)Context;
+
+  DevPathNodeString = ConvertDeviceNodeToText (TestContext->DevPath, FALSE, 
FALSE);
+  UT_ASSERT_EQUAL (StrLen (DevPathNodeString), StrLen 
(TestContext->DevPathString));
+  UT_ASSERT_MEM_EQUAL (DevPathNodeString, TestContext->DevPathString, StrLen 
(TestContext->DevPathString));
+  FreePool (DevPathNodeString);
+
+  return UNIT_TEST_PASSED;
+}
+
+UNIT_TEST_STATUS
+EFIAPI
+TestConvertTextToDeviceNode (
+  IN UNIT_TEST_CONTEXT  Context
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL              *DevPath;
+  DEVICE_PATH_CONVERSIONS_TEST_CONTEXT  *TestContext;
+
+  TestContext = (DEVICE_PATH_CONVERSIONS_TEST_CONTEXT *)Context;
+
+  DevPath = ConvertTextToDeviceNode (TestContext->DevPathString);
+  UT_ASSERT_EQUAL (DevicePathNodeLength (DevPath), DevicePathNodeLength 
(TestContext->DevPath));
+  UT_ASSERT_MEM_EQUAL (DevPath, TestContext->DevPath, DevicePathNodeLength 
(TestContext->DevPath));
+  FreePool (DevPath);
+
+  return UNIT_TEST_PASSED;
+}
+
+EFI_STATUS
+CreateDevicePathStringConversionsTestSuite (
+  IN UNIT_TEST_FRAMEWORK_HANDLE  Framework
+  )
+{
+  EFI_STATUS              Status;
+  UNIT_TEST_SUITE_HANDLE  DevicePathTextConversionSuite = NULL;
+  UINTN                   Index;
+
+  Status = CreateUnitTestSuite (&DevicePathTextConversionSuite, Framework, 
"Device path text conversion operations test suite", 
"Common.DevicePath.TextConversions", NULL, NULL);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "Failed to create device path text conversions test 
suite\n"));
+    return Status;
+  }
+
+  for (Index = 0; Index < ARRAY_SIZE (mDevPathNodeToFromTextContext); Index++) 
{
+    AddTestCase (DevicePathTextConversionSuite, "Test 
ConvertDeviceNodeToText", "TestConvertDeviceNodeToText", 
TestConvertDeviceNodeToText, NULL, NULL, &mDevPathNodeToFromTextContext[Index]);
+  }
+
+  for (Index = 0; Index < ARRAY_SIZE (mDevPathNodeToFromTextContext); Index++) 
{
+    AddTestCase (DevicePathTextConversionSuite, "Test 
ConvertTextToDeviceNode", "TestConvertTextToDeviceNode", 
TestConvertTextToDeviceNode, NULL, NULL, &mDevPathNodeToFromTextContext[Index]);
+  }
+
+  for (Index = 0; Index < ARRAY_SIZE (mDevPathToFromTextContext); Index++) {
+    AddTestCase (DevicePathTextConversionSuite, "Test 
ConvertDevicePathToText", "TestConvertDevicePathToText", 
TestConvertDevicePathToText, NULL, NULL, &mDevPathToFromTextContext[Index]);
+  }
+
+  for (Index = 0; Index < ARRAY_SIZE (mDevPathToFromTextContext); Index++) {
+    AddTestCase (DevicePathTextConversionSuite, "Test 
ConvertTextToDevicePath", "TestConvertTextToDevicePath", 
TestConvertTextToDevicePath, NULL, NULL, &mDevPathToFromTextContext[Index]);
+  }
+
+  return EFI_SUCCESS;
+}
-- 
2.39.2

---------------------------------------------------------------------
Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial 
Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | 
Kapital zakladowy 200.000 PLN.
Spolka oswiadcza, ze posiada status duzego przedsiebiorcy w rozumieniu ustawy z 
dnia 8 marca 2013 r. o przeciwdzialaniu nadmiernym opoznieniom w transakcjach 
handlowych.

Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i 
moze zawierac informacje poufne. W razie przypadkowego otrzymania tej 
wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; 
jakiekolwiek przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole 
use of the intended recipient(s). If you are not the intended recipient, please 
contact the sender and delete all copies; any review or distribution by others 
is strictly prohibited.



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#109126): https://edk2.groups.io/g/devel/message/109126
Mute This Topic: https://groups.io/mt/101619981/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-



Reply via email to