mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 11:13:53 +01:00 
			
		
		
		
	MdePkg/Test: Add DevicePathLib host test module
This commit adds host-based unit tests for device path lib. Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <gaoliming@bysoft.com.cn> Cc: Zhiguang Liu <zhiguang.liu@intel.com> Signed-off-by: Mateusz Albecki <mateusz.albecki@intel.com> Reviewed-by: Michael D Kinney <Michael.d.kinney@intel.com>
This commit is contained in:
		
							parent
							
								
									96ed60dfd7
								
							
						
					
					
						commit
						0355e559c6
					
				| @ -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 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
							
								
								
									
										638
									
								
								MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										638
									
								
								MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c
									
									
									
									
									
										Normal file
									
								
							| @ -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 (); | ||||
| } | ||||
| @ -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 | ||||
| @ -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 | ||||
| @ -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; | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user