audk/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathStringConvers...

371 lines
10 KiB
C

/** @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;
}