mirror of https://github.com/acidanthera/audk.git
371 lines
10 KiB
C
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;
|
|
}
|