/** @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);

  Appended = AppendDevicePathInstance ((EFI_DEVICE_PATH_PROTOCOL *)&mSimpleDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&mInvalidSimpleDevicePath);
  UT_ASSERT_EQUAL ((uintptr_t)Appended, (uintptr_t)NULL);

  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 ();
}
