--- /dev/null
+/** @file\r
+\r
+ Unit tests for the PRM Context Buffer Library.\r
+\r
+ Copyright (c) Microsoft Corporation\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdarg.h>\r
+#include <stddef.h>\r
+#include <setjmp.h>\r
+#include <cmocka.h>\r
+\r
+#include <Uefi.h>\r
+\r
+#include <Guid/ZeroGuid.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/PrintLib.h>\r
+#include <Library/PrmContextBufferLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UnitTestLib.h>\r
+#include <Protocol/PrmConfig.h>\r
+\r
+#define UNIT_TEST_NAME "PRM Context Buffer Library Unit Test"\r
+#define UNIT_TEST_VERSION "0.1"\r
+\r
+///=== TEST DATA ==================================================================================\r
+\r
+EFI_HANDLE mTestProtocolHandle;\r
+\r
+//*----------------------------------------------------------------------------------*\r
+//* Context Structures *\r
+//*----------------------------------------------------------------------------------*\r
+typedef struct {\r
+ PRM_MODULE_CONTEXT_BUFFERS *InstallationStructure;\r
+ EFI_HANDLE Handle;\r
+ PRM_GUID_SEARCH_TYPE GuidSearchType;\r
+ EFI_GUID *Guid;\r
+ EFI_GUID *ExpectedModuleGuid;\r
+ EFI_STATUS ExpectedStatus;\r
+} PRM_CONTEXT_BUFFERS_TEST_CONTEXT;\r
+\r
+typedef struct {\r
+ EFI_GUID *HandlerGuid;\r
+ PRM_MODULE_CONTEXT_BUFFERS *ContextBuffers;\r
+ PRM_CONTEXT_BUFFER *ExpectedContextBuffer;\r
+ EFI_STATUS ExpectedStatus;\r
+} PRM_CONTEXT_BUFFER_TEST_CONTEXT;\r
+\r
+//*----------------------------------------------------------------------------------*\r
+//* Test GUIDs *\r
+//*----------------------------------------------------------------------------------*\r
+\r
+// {52960b90-2f3a-4917-b91a-ed5f599a8809}\r
+#define HANDLER_TEST_GUID_1 {0x52960b90, 0x2f3a, 0x4917, { 0xb9, 0x1a, 0xed, 0x5f, 0x59, 0x9a, 0x88, 0x09 }}\r
+EFI_GUID mHandlerTestGuid1 = HANDLER_TEST_GUID_1;\r
+\r
+// {9316a80d-06dc-417b-b21d-6b3c2ae4ed6f}\r
+#define HANDLER_TEST_GUID_2 {0x9316a80d, 0x06dc, 0x417b, { 0xb2, 0x1d, 0x6b, 0x3c, 0x2a, 0xe4, 0xed, 0x6f }}\r
+EFI_GUID mHandlerTestGuid2 = HANDLER_TEST_GUID_2;\r
+\r
+// {d32ac8ba-6cc6-456f-9ed9-9233fa310434}\r
+#define HANDLER_TEST_GUID_3 {0xd32ac8ba, 0x6cc6, 0x456f, { 0x9e, 0xd9, 0x92, 0x33, 0xfa, 0x31, 0x04, 0x34 }}\r
+EFI_GUID mHandlerTestGuid3 = HANDLER_TEST_GUID_3;\r
+\r
+// {faadaa95-070b-4a34-a919-18305dc07370}\r
+#define MODULE_TEST_GUID_1 {0xfaadaa95, 0x070b, 0x4a34, { 0xa9, 0x19, 0x18, 0x30, 0x5d, 0xc0, 0x73, 0x70 }}\r
+EFI_GUID mModuleTestGuid1 = MODULE_TEST_GUID_1;\r
+\r
+// {0ea24584-731c-4863-9100-75780af509a7}\r
+#define MODULE_TEST_GUID_2 {0x0ea24584, 0x731c, 0x4863, { 0x91, 0x00, 0x75, 0x78, 0x0a, 0xf5, 0x09, 0xa7 }}\r
+EFI_GUID mModuleTestGuid2 = MODULE_TEST_GUID_2;\r
+\r
+// {f456b7a1-82a6-4427-8486-87e3a602df43}\r
+#define MODULE_TEST_GUID_3 {0xf456b7a1, 0x82a6, 0x4427, { 0x84, 0x86, 0x87, 0xe3, 0xa6, 0x02, 0xdf, 0x43 }}\r
+EFI_GUID mModuleTestGuid3 = MODULE_TEST_GUID_3;\r
+\r
+// {4a941a9c-9dcf-471b-94b5-d9e2d8c64a1b}\r
+#define NEGATIVE_TEST_GUID {0x4a941a9c, 0x9dcf, 0x471b, {0x94, 0xb5, 0xd9, 0xe2, 0xd8, 0xc6, 0x4a, 0x1b }}\r
+EFI_GUID mNegativeTestGuid = NEGATIVE_TEST_GUID;\r
+\r
+//*----------------------------------------------------------------------------------*\r
+//* PRM Static Test Structures *\r
+//*----------------------------------------------------------------------------------*\r
+\r
+PRM_DATA_BUFFER mTestStaticDataBuffer1 = {\r
+ {\r
+ PRM_DATA_BUFFER_HEADER_SIGNATURE,\r
+ sizeof (PRM_DATA_BUFFER)\r
+ }\r
+ // No data in the buffer (only a header)\r
+};\r
+\r
+PRM_CONTEXT_BUFFER mTestPrmContextBuffer1 = {\r
+ PRM_CONTEXT_BUFFER_SIGNATURE, // Signature\r
+ PRM_CONTEXT_BUFFER_INTERFACE_VERSION, // Version\r
+ 0, // Reserved\r
+ HANDLER_TEST_GUID_1, // HandlerGuid\r
+ &mTestStaticDataBuffer1 // StaticDataBuffer\r
+};\r
+\r
+PRM_CONTEXT_BUFFER mTestPrmContextBuffer2[2] = {\r
+ // Context buffer #1\r
+ {\r
+ PRM_CONTEXT_BUFFER_SIGNATURE, // Signature\r
+ PRM_CONTEXT_BUFFER_INTERFACE_VERSION, // Version\r
+ 0, // Reserved\r
+ HANDLER_TEST_GUID_2, // HandlerGuid\r
+ NULL // StaticDataBuffer\r
+ },\r
+ // Context buffer #2\r
+ {\r
+ PRM_CONTEXT_BUFFER_SIGNATURE, // Signature\r
+ PRM_CONTEXT_BUFFER_INTERFACE_VERSION, // Version\r
+ 0, // Reserved\r
+ HANDLER_TEST_GUID_3, // HandlerGuid\r
+ &mTestStaticDataBuffer1 // StaticDataBuffer (reuse buffer StaticDataBuffer1)\r
+ }\r
+};\r
+\r
+PRM_MODULE_CONTEXT_BUFFERS mTestPrmModuleContextBuffers1 = {\r
+ MODULE_TEST_GUID_1,\r
+ 1,\r
+ &mTestPrmContextBuffer1,\r
+ NULL\r
+};\r
+\r
+PRM_MODULE_CONTEXT_BUFFERS mTestPrmModuleContextBuffers2 = {\r
+ MODULE_TEST_GUID_2,\r
+ 1,\r
+ &mTestPrmContextBuffer1,\r
+ NULL\r
+};\r
+\r
+PRM_MODULE_CONTEXT_BUFFERS mTestPrmModuleContextBuffers3 = {\r
+ MODULE_TEST_GUID_3,\r
+ 2,\r
+ &mTestPrmContextBuffer2[0],\r
+ NULL\r
+};\r
+\r
+\r
+//*----------------------------------------------------------------------------------*\r
+//* Test Contexts *\r
+//*----------------------------------------------------------------------------------*\r
+\r
+//* Searches by module GUID *\r
+// +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+\r
+// + InstallationStructure | Handle | GuidSearchType | Guid | ExpectedModuleGuid | ExpectedStatus |\r
+// +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers00 = { &mTestPrmModuleContextBuffers1, NULL, ByModuleGuid, &mModuleTestGuid1, &mModuleTestGuid1, EFI_SUCCESS };\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers01 = { &mTestPrmModuleContextBuffers2, NULL, ByModuleGuid, &mModuleTestGuid2, &mModuleTestGuid2, EFI_SUCCESS };\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers02 = { &mTestPrmModuleContextBuffers3, NULL, ByModuleGuid, &mModuleTestGuid3, &mModuleTestGuid3, EFI_SUCCESS };\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers03 = { &mTestPrmModuleContextBuffers3, NULL, ByModuleGuid, &mNegativeTestGuid, &gZeroGuid, EFI_NOT_FOUND };\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers04 = { &mTestPrmModuleContextBuffers1, NULL, ByModuleGuid, &gZeroGuid, &gZeroGuid, EFI_NOT_FOUND };\r
+\r
+//* Searches by handler GUID *\r
+// +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+\r
+// + InstallationStructure | Handle | GuidSearchType | Guid | ExpectedModuleGuid | ExpectedStatus |\r
+// +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers05 = { &mTestPrmModuleContextBuffers1, NULL, ByHandlerGuid, &mHandlerTestGuid1, &mModuleTestGuid1, EFI_SUCCESS };\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers06 = { &mTestPrmModuleContextBuffers1, NULL, ByHandlerGuid, &gZeroGuid, &gZeroGuid, EFI_NOT_FOUND };\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers07 = { &mTestPrmModuleContextBuffers2, NULL, ByHandlerGuid, &mHandlerTestGuid1, &mModuleTestGuid2, EFI_SUCCESS };\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers08 = { &mTestPrmModuleContextBuffers2, NULL, ByHandlerGuid, &mNegativeTestGuid, &gZeroGuid, EFI_NOT_FOUND };\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers09 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &mHandlerTestGuid1, &gZeroGuid, EFI_NOT_FOUND };\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers10 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &mHandlerTestGuid2, &mModuleTestGuid3, EFI_SUCCESS };\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers11 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &mHandlerTestGuid3, &mModuleTestGuid3, EFI_SUCCESS };\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers12 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &gZeroGuid, &gZeroGuid, EFI_NOT_FOUND };\r
+\r
+PRM_CONTEXT_BUFFERS_TEST_CONTEXT *mContextBuffersArray[] = {\r
+ &mContextBuffers00,\r
+ &mContextBuffers01,\r
+ &mContextBuffers02,\r
+ &mContextBuffers03,\r
+ &mContextBuffers04,\r
+ &mContextBuffers05,\r
+ &mContextBuffers06,\r
+ &mContextBuffers07,\r
+ &mContextBuffers08,\r
+ &mContextBuffers09,\r
+ &mContextBuffers10,\r
+ &mContextBuffers11,\r
+ &mContextBuffers12\r
+};\r
+\r
+// +----------------------+----------------------------------+------------------------------------------+--------------------+\r
+// + HandlerGuid | ContextBuffers | ExpectedContextBuffer | ExpectedStatus |\r
+// +----------------------+----------------------------------+------------------------------------------+--------------------+\r
+PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer00 = { &mHandlerTestGuid1, &mTestPrmModuleContextBuffers1, &mTestPrmContextBuffer1, EFI_SUCCESS };\r
+PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer01 = { &mHandlerTestGuid1, &mTestPrmModuleContextBuffers2, &mTestPrmContextBuffer1, EFI_SUCCESS };\r
+PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer02 = { &mHandlerTestGuid2, &mTestPrmModuleContextBuffers3, &mTestPrmContextBuffer2[0], EFI_SUCCESS };\r
+PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer03 = { &mHandlerTestGuid3, &mTestPrmModuleContextBuffers3, &mTestPrmContextBuffer2[1], EFI_SUCCESS };\r
+PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer04 = { &mNegativeTestGuid, &mTestPrmModuleContextBuffers1, NULL, EFI_NOT_FOUND };\r
+PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer05 = { &gZeroGuid, &mTestPrmModuleContextBuffers3, NULL, EFI_NOT_FOUND };\r
+\r
+PRM_CONTEXT_BUFFER_TEST_CONTEXT *mContextBufferArray[] = {\r
+ &mContextBuffer00,\r
+ &mContextBuffer01,\r
+ &mContextBuffer02,\r
+ &mContextBuffer03,\r
+ &mContextBuffer04,\r
+ &mContextBuffer05\r
+};\r
+\r
+///=== HELPER FUNCTIONS ===========================================================================\r
+\r
+// None\r
+\r
+///=== TEST CASES =================================================================================\r
+\r
+///===== BASIC SUITE ==================================================\r
+\r
+/**\r
+ Verifies that passing NULL arguments to all library functions fails with EFI_INVALID_PARAMETER.\r
+\r
+ @param[in] Context [Optional] An optional context parameter.\r
+ Not used in this unit test.\r
+\r
+ @retval UNIT_TEST_PASSED Unit test case prerequisites are met.\r
+ @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..\r
+\r
+**/\r
+UNIT_TEST_STATUS\r
+EFIAPI\r
+NullPointerArgumentsShouldFailGracefully (\r
+ IN UNIT_TEST_CONTEXT Context\r
+ )\r
+{\r
+ EFI_GUID Guid;\r
+ PRM_CONTEXT_BUFFER *ContextBufferPtr;\r
+ PRM_MODULE_CONTEXT_BUFFERS ModuleContextBuffers;\r
+ PRM_MODULE_CONTEXT_BUFFERS *ModuleContextBuffersPtr;\r
+\r
+ UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (NULL, NULL, NULL), EFI_INVALID_PARAMETER);\r
+ UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (NULL, &ModuleContextBuffers, &ContextBufferPtr), EFI_INVALID_PARAMETER);\r
+ UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (&Guid, NULL, &ContextBufferPtr), EFI_INVALID_PARAMETER);\r
+ UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (&Guid, &ModuleContextBuffers, NULL), EFI_INVALID_PARAMETER);\r
+\r
+ UT_ASSERT_EQUAL (GetModuleContextBuffers (ByModuleGuid, NULL, NULL), EFI_INVALID_PARAMETER);\r
+ UT_ASSERT_EQUAL (GetModuleContextBuffers (ByModuleGuid, NULL, &ModuleContextBuffersPtr), EFI_INVALID_PARAMETER);\r
+ UT_ASSERT_EQUAL (GetModuleContextBuffers (ByModuleGuid, &Guid, NULL), EFI_INVALID_PARAMETER);\r
+\r
+ UT_ASSERT_EQUAL (GetContextBuffer (NULL, NULL, NULL), EFI_INVALID_PARAMETER);\r
+ UT_ASSERT_EQUAL (GetContextBuffer (NULL, &ModuleContextBuffers, &ContextBufferPtr), EFI_INVALID_PARAMETER);\r
+ UT_ASSERT_EQUAL (GetContextBuffer (&Guid, NULL, &ContextBufferPtr), EFI_NOT_FOUND);\r
+ UT_ASSERT_EQUAL (GetContextBuffer (&Guid, &ModuleContextBuffers, NULL), EFI_INVALID_PARAMETER);\r
+\r
+ return UNIT_TEST_PASSED;\r
+}\r
+\r
+///===== FUNCTIONAL CORRECTNESS SUITE ==================================================\r
+\r
+/**\r
+ Functional Correctness pre-requisite function.\r
+\r
+ Installs a gPrmConfigProtocolGuid protocol instance as specified by the provided\r
+ context in preparation for unit test execution\r
+\r
+ @param[in] Context [Optional] An optional parameter that enables:\r
+ A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with\r
+ context information for this unit test.\r
+\r
+ @retval UNIT_TEST_PASSED Unit test case prerequisites\r
+ are met.\r
+ @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped.\r
+\r
+**/\r
+STATIC\r
+UNIT_TEST_STATUS\r
+EFIAPI\r
+InitializeFunctionalCorrectness (\r
+ IN UNIT_TEST_CONTEXT Context\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ PRM_CONFIG_PROTOCOL *PrmConfigProtocol;\r
+ PRM_MODULE_CONTEXT_BUFFERS *ModuleContextBuffers;\r
+ PRM_CONTEXT_BUFFERS_TEST_CONTEXT *TestContext;\r
+\r
+ UT_ASSERT_NOT_NULL (Context);\r
+ TestContext = (PRM_CONTEXT_BUFFERS_TEST_CONTEXT *) Context;\r
+ ModuleContextBuffers = TestContext->InstallationStructure;\r
+\r
+ PrmConfigProtocol = AllocateZeroPool (sizeof (*PrmConfigProtocol));\r
+ if (PrmConfigProtocol == NULL) {\r
+ return UNIT_TEST_ERROR_PREREQUISITE_NOT_MET;\r
+ }\r
+\r
+ CopyGuid (&PrmConfigProtocol->ModuleContextBuffers.ModuleGuid, &ModuleContextBuffers->ModuleGuid);\r
+ PrmConfigProtocol->ModuleContextBuffers.BufferCount = ModuleContextBuffers->BufferCount;\r
+ PrmConfigProtocol->ModuleContextBuffers.Buffer = ModuleContextBuffers->Buffer;\r
+\r
+ Status = gBS->InstallProtocolInterface (\r
+ &TestContext->Handle,\r
+ &gPrmConfigProtocolGuid,\r
+ EFI_NATIVE_INTERFACE,\r
+ (VOID *) PrmConfigProtocol\r
+ );\r
+ UT_ASSERT_NOT_EFI_ERROR (Status);\r
+\r
+ return UNIT_TEST_PASSED;\r
+}\r
+\r
+/**\r
+ Functional Correctness cleanup function.\r
+\r
+ Uninstalls the gPrmConfigProtocolGuid protocol instance as specified by the\r
+ provided context. This is used to clean up the mocked protocol database after\r
+ unit test execution.\r
+\r
+ @param[in] Context [Optional] An optional parameter that enables:\r
+ A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with\r
+ context information for this unit test.\r
+\r
+ @retval UNIT_TEST_PASSED Test case cleanup succeeded.\r
+ @retval UNIT_TEST_ERROR_CLEANUP_FAILED Test case cleanup failed.\r
+\r
+**/\r
+STATIC\r
+UNIT_TEST_STATUS\r
+EFIAPI\r
+DeInitializeFunctionalCorrectness (\r
+ IN UNIT_TEST_CONTEXT Context\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ PRM_CONFIG_PROTOCOL *PrmConfigProtocol;\r
+ PRM_CONTEXT_BUFFERS_TEST_CONTEXT *TestContext;\r
+\r
+ UT_ASSERT_NOT_NULL (Context);\r
+ TestContext = (PRM_CONTEXT_BUFFERS_TEST_CONTEXT *) Context;\r
+\r
+ Status = gBS->HandleProtocol (\r
+ TestContext->Handle,\r
+ &gPrmConfigProtocolGuid,\r
+ (VOID **) &PrmConfigProtocol\r
+ );\r
+ UT_ASSERT_NOT_EFI_ERROR (Status);\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = gBS->UninstallProtocolInterface (\r
+ TestContext->Handle,\r
+ &gPrmConfigProtocolGuid,\r
+ PrmConfigProtocol\r
+ );\r
+ UT_ASSERT_NOT_EFI_ERROR (Status);\r
+ if (!EFI_ERROR (Status)) {\r
+ FreePool (PrmConfigProtocol);\r
+ }\r
+ }\r
+\r
+ return UNIT_TEST_PASSED;\r
+}\r
+\r
+/**\r
+ Verifies that the correct PRM_MODULE_CONTEXT_BUFFERS structure instance is found\r
+ for a given PRM module or PRM handler GUID.\r
+\r
+ @param[in] Context [Optional] An optional context parameter.\r
+ A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with\r
+ context information for this unit test.\r
+\r
+ @retval UNIT_TEST_PASSED Unit test case prerequisites are met.\r
+ @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..\r
+\r
+**/\r
+UNIT_TEST_STATUS\r
+EFIAPI\r
+VerifyGetModuleContextBuffers (\r
+ IN UNIT_TEST_CONTEXT Context\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ PRM_MODULE_CONTEXT_BUFFERS *ContextBuffers;\r
+ PRM_CONTEXT_BUFFERS_TEST_CONTEXT *TestContext;\r
+\r
+ ContextBuffers = NULL;\r
+ TestContext = (PRM_CONTEXT_BUFFERS_TEST_CONTEXT *) Context;\r
+\r
+ Status = GetModuleContextBuffers (TestContext->GuidSearchType, TestContext->Guid, &ContextBuffers);\r
+ UT_ASSERT_STATUS_EQUAL (Status, TestContext->ExpectedStatus);\r
+\r
+ if (!EFI_ERROR (TestContext->ExpectedStatus)) {\r
+ UT_ASSERT_TRUE (CompareGuid (TestContext->ExpectedModuleGuid, &ContextBuffers->ModuleGuid));\r
+ UT_LOG_INFO (\r
+ "%a: Searching by %a GUID ({%g}) returned ContextBuffers at 0x%x\n",\r
+ __FUNCTION__,\r
+ ((TestContext->GuidSearchType == ByModuleGuid) ? "module" : "handler"),\r
+ TestContext->Guid,\r
+ (UINTN) ContextBuffers\r
+ );\r
+ }\r
+\r
+ return UNIT_TEST_PASSED;\r
+}\r
+\r
+/**\r
+ Verifies that the expected PRM_CONTEXT_BUFFER instance is found for the given HandlerGuid\r
+ in the provided PRM_MODULE_CONTEXT_BUFFERS structure.\r
+\r
+ @param[in] Context [Optional] An optional context parameter.\r
+ A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with\r
+ context information for this unit test.\r
+\r
+ @retval UNIT_TEST_PASSED Unit test case prerequisites are met.\r
+ @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..\r
+\r
+**/\r
+UNIT_TEST_STATUS\r
+EFIAPI\r
+VerifyFindContextBufferInModuleBuffers (\r
+ IN UNIT_TEST_CONTEXT Context\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ PRM_CONTEXT_BUFFER *FoundContextBuffer;\r
+ PRM_MODULE_CONTEXT_BUFFERS *ContextBuffers;\r
+ PRM_CONTEXT_BUFFER_TEST_CONTEXT *TestContext;\r
+\r
+ ContextBuffers = NULL;\r
+ FoundContextBuffer = NULL;\r
+ TestContext = (PRM_CONTEXT_BUFFER_TEST_CONTEXT *) Context;\r
+\r
+ Status = FindContextBufferInModuleBuffers (TestContext->HandlerGuid, TestContext->ContextBuffers, &FoundContextBuffer);\r
+ UT_ASSERT_STATUS_EQUAL (Status, TestContext->ExpectedStatus);\r
+\r
+ if (!EFI_ERROR (TestContext->ExpectedStatus)) {\r
+ UT_ASSERT_NOT_NULL (FoundContextBuffer);\r
+ UT_ASSERT_TRUE (FoundContextBuffer == TestContext->ExpectedContextBuffer);\r
+ }\r
+\r
+ return UNIT_TEST_PASSED;\r
+}\r
+\r
+/**\r
+ Verifies that the expected PRM_CONTEXT_BUFFER instance is found for the given HandlerGuid.\r
+\r
+ This function checks both the case when a PRM_MODULE_CONTEXT_BUFFERS structure pointer is provided and\r
+ not provided.\r
+\r
+ NOTES:\r
+ - In the future, this function should mock the internal calls to other library functions but the direct\r
+ calls are left in place for now.\r
+ - The PrmModuleContextBuffers being NULL is not actually tested at the moment. In the future, that case\r
+ should also be added.\r
+\r
+ @param[in] Context [Optional] An optional context parameter.\r
+ A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with\r
+ context information for this unit test.\r
+\r
+ @retval UNIT_TEST_PASSED Unit test case prerequisites are met.\r
+ @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..\r
+\r
+**/\r
+UNIT_TEST_STATUS\r
+EFIAPI\r
+VerifyGetContextBuffer (\r
+ IN UNIT_TEST_CONTEXT Context\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ PRM_CONTEXT_BUFFER *FoundContextBuffer;\r
+ PRM_MODULE_CONTEXT_BUFFERS *ContextBuffers;\r
+ PRM_CONTEXT_BUFFER_TEST_CONTEXT *TestContext;\r
+\r
+ ContextBuffers = NULL;\r
+ FoundContextBuffer = NULL;\r
+ TestContext = (PRM_CONTEXT_BUFFER_TEST_CONTEXT *) Context;\r
+\r
+ Status = GetContextBuffer (TestContext->HandlerGuid, TestContext->ContextBuffers, &FoundContextBuffer);\r
+ UT_ASSERT_STATUS_EQUAL (Status, TestContext->ExpectedStatus);\r
+\r
+ if (!EFI_ERROR (TestContext->ExpectedStatus)) {\r
+ UT_ASSERT_NOT_NULL (FoundContextBuffer);\r
+ UT_ASSERT_TRUE (FoundContextBuffer == TestContext->ExpectedContextBuffer);\r
+ }\r
+\r
+ return UNIT_TEST_PASSED;\r
+}\r
+\r
+///=== TEST ENGINE ================================================================================\r
+\r
+/**\r
+ Entry point for the PRM Context Buffer Library unit tests.\r
+\r
+ @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
+ @param[in] SystemTable A pointer to the EFI System Table.\r
+\r
+ @retval EFI_SUCCESS The entry point executed successfully.\r
+ @retval other Some error occurred when executing this entry point.\r
+\r
+**/\r
+int main ()\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN Index;\r
+ UNIT_TEST_FRAMEWORK_HANDLE Framework;\r
+ UNIT_TEST_SUITE_HANDLE BasicTests;\r
+ UNIT_TEST_SUITE_HANDLE FunctionalCorrectnessTests;\r
+ CHAR8 TestCaseClassNameString[256];\r
+ CHAR8 TestCaseDescriptionString[256];\r
+\r
+ Framework = NULL;\r
+\r
+ DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_NAME, UNIT_TEST_VERSION));\r
+\r
+ //\r
+ // Start setting up the test framework for running the tests.\r
+ //\r
+ Status = InitUnitTestFramework (&Framework, UNIT_TEST_NAME, gEfiCallerBaseName, UNIT_TEST_VERSION);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", Status));\r
+ goto EXIT;\r
+ }\r
+\r
+ //\r
+ // Add all test suites and tests.\r
+ //\r
+ Status = CreateUnitTestSuite (&BasicTests, Framework, "Basic Context Buffer Tests", "PrmContextBufferLib.Basic", NULL, NULL);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for PrmContextBufferLib.Basic\n"));\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto EXIT;\r
+ }\r
+\r
+ AddTestCase (\r
+ BasicTests,\r
+ "",\r
+ "PrmContextBufferLib.Basic.NullPointerGracefulFailure",\r
+ NullPointerArgumentsShouldFailGracefully,\r
+ NULL,\r
+ NULL,\r
+ NULL\r
+ );\r
+\r
+ Status = CreateUnitTestSuite (&FunctionalCorrectnessTests, Framework, "Functional Correctness Tests", "PrmContextBufferLib.Functional", NULL, NULL);\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for PrmContextBufferLib.Functional\n"));\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto EXIT;\r
+ }\r
+\r
+ //\r
+ // Add Functional Correctness unit tests\r
+ //\r
+ for (Index = 0; Index < ARRAY_SIZE (mContextBuffersArray); Index++) {\r
+ ZeroMem (&TestCaseClassNameString[0], ARRAY_SIZE (TestCaseClassNameString));\r
+ ZeroMem (&TestCaseDescriptionString[0], ARRAY_SIZE (TestCaseDescriptionString));\r
+\r
+ AsciiSPrint (\r
+ &TestCaseClassNameString[0],\r
+ ARRAY_SIZE (TestCaseClassNameString),\r
+ "PrmContextBufferLib.Functional.VerifyGetModuleContextBuffers%d",\r
+ Index + 1\r
+ );\r
+ AsciiSPrint (\r
+ &TestCaseDescriptionString[0],\r
+ ARRAY_SIZE (TestCaseDescriptionString),\r
+ "Verify Get PRM Module Context Buffers Structure by %a GUID %d\n",\r
+ ((mContextBuffersArray[Index]->GuidSearchType == ByModuleGuid) ? "module" : "handler"),\r
+ Index + 1\r
+ );\r
+\r
+ AddTestCase (\r
+ FunctionalCorrectnessTests,\r
+ &TestCaseDescriptionString[0],\r
+ &TestCaseClassNameString[0],\r
+ VerifyGetModuleContextBuffers,\r
+ InitializeFunctionalCorrectness,\r
+ DeInitializeFunctionalCorrectness,\r
+ mContextBuffersArray[Index]\r
+ );\r
+ }\r
+\r
+ for (Index = 0; Index < ARRAY_SIZE (mContextBufferArray); Index++) {\r
+ ZeroMem (&TestCaseClassNameString[0], ARRAY_SIZE (TestCaseClassNameString));\r
+ ZeroMem (&TestCaseDescriptionString[0], ARRAY_SIZE (TestCaseDescriptionString));\r
+\r
+ AsciiSPrint (\r
+ &TestCaseClassNameString[0],\r
+ ARRAY_SIZE (TestCaseClassNameString),\r
+ "PrmContextBufferLib.Functional.VerifyFindContextBufferInModuleBuffers%d",\r
+ Index + 1\r
+ );\r
+ AsciiSPrint (\r
+ &TestCaseDescriptionString[0],\r
+ ARRAY_SIZE (TestCaseDescriptionString),\r
+ "Verify Find PRM Context Buffer by Handler GUID %d\n",\r
+ Index + 1\r
+ );\r
+\r
+ AddTestCase (\r
+ FunctionalCorrectnessTests,\r
+ &TestCaseDescriptionString[0],\r
+ &TestCaseClassNameString[0],\r
+ VerifyFindContextBufferInModuleBuffers,\r
+ NULL,\r
+ NULL,\r
+ mContextBufferArray[Index]\r
+ );\r
+ }\r
+\r
+ for (Index = 0; Index < ARRAY_SIZE (mContextBufferArray); Index++) {\r
+ ZeroMem (&TestCaseClassNameString[0], ARRAY_SIZE (TestCaseClassNameString));\r
+ ZeroMem (&TestCaseDescriptionString[0], ARRAY_SIZE (TestCaseDescriptionString));\r
+\r
+ AsciiSPrint (\r
+ &TestCaseClassNameString[0],\r
+ ARRAY_SIZE (TestCaseClassNameString),\r
+ "PrmContextBufferLib.Functional.VerifyGetContextBuffer%d",\r
+ Index + 1\r
+ );\r
+ AsciiSPrint (\r
+ &TestCaseDescriptionString[0],\r
+ ARRAY_SIZE (TestCaseDescriptionString),\r
+ "Verify Get PRM Context Buffer by Handler GUID %d\n",\r
+ Index + 1\r
+ );\r
+\r
+ AddTestCase (\r
+ FunctionalCorrectnessTests,\r
+ &TestCaseDescriptionString[0],\r
+ &TestCaseClassNameString[0],\r
+ VerifyGetContextBuffer,\r
+ NULL,\r
+ NULL,\r
+ mContextBufferArray[Index]\r
+ );\r
+ }\r
+\r
+ //\r
+ // Execute the tests.\r
+ //\r
+ Status = RunAllTestSuites (Framework);\r
+\r
+EXIT:\r
+ if (Framework)\r
+ {\r
+ FreeUnitTestFramework (Framework);\r
+ }\r
+\r
+ return Status;\r
+}\r