mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-03 03:44:23 +02: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",
|
"Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLib.c",
|
||||||
"Library/BaseFdtLib",
|
"Library/BaseFdtLib",
|
||||||
"Library/MipiSysTLib/mipi_syst.h",
|
"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
|
## options defined ci/Plugin/CompilerPlugin
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
[LibraryClasses]
|
[LibraryClasses]
|
||||||
SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
|
SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
|
||||||
|
DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLibBase.inf
|
||||||
|
|
||||||
[Components]
|
[Components]
|
||||||
#
|
#
|
||||||
@ -29,6 +30,7 @@
|
|||||||
MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost.inf
|
MdePkg/Test/UnitTest/Library/BaseSafeIntLib/TestBaseSafeIntLibHost.inf
|
||||||
MdePkg/Test/UnitTest/Library/BaseLib/BaseLibUnitTestsHost.inf
|
MdePkg/Test/UnitTest/Library/BaseLib/BaseLibUnitTestsHost.inf
|
||||||
MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/GoogleTestBaseSafeIntLib.inf
|
MdePkg/Test/GoogleTest/Library/BaseSafeIntLib/GoogleTestBaseSafeIntLib.inf
|
||||||
|
MdePkg/Test/UnitTest/Library/DevicePathLib/TestDevicePathLibHost.inf
|
||||||
|
|
||||||
#
|
#
|
||||||
# Build HOST_APPLICATION Libraries
|
# 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