diff options
| author | Warner Losh <imp@FreeBSD.org> | 2024-11-30 19:36:15 +0000 |
|---|---|---|
| committer | Warner Losh <imp@FreeBSD.org> | 2024-11-30 19:38:23 +0000 |
| commit | 5d8674f2bdd536124b1dd026dfa729a1376b3cac (patch) | |
| tree | ade665e8d0ce42d3068d4b00dae9171f47f3cd06 /MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c | |
| parent | 4a14dfcc1110b35118d5be8054fecf59ffb83032 (diff) | |
Diffstat (limited to 'MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c')
| -rw-r--r-- | MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c | 636 |
1 files changed, 636 insertions, 0 deletions
diff --git a/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c b/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c new file mode 100644 index 000000000000..0a7be44527e6 --- /dev/null +++ b/MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLib.c @@ -0,0 +1,636 @@ +/** @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 (); +} |
