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