]> git.proxmox.com Git - mirror_edk2.git/blob - PrmPkg/Library/DxePrmContextBufferLib/UnitTest/DxePrmContextBufferLibUnitTest.c
PrmPkg: Apply uncrustify changes
[mirror_edk2.git] / PrmPkg / Library / DxePrmContextBufferLib / UnitTest / DxePrmContextBufferLibUnitTest.c
1 /** @file
2
3 Unit tests for the PRM Context Buffer Library.
4
5 Copyright (c) Microsoft Corporation
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8 **/
9
10 #include <stdio.h>
11 #include <string.h>
12 #include <stdarg.h>
13 #include <stddef.h>
14 #include <setjmp.h>
15 #include <cmocka.h>
16
17 #include <Uefi.h>
18
19 #include <Guid/ZeroGuid.h>
20 #include <Library/BaseLib.h>
21 #include <Library/BaseMemoryLib.h>
22 #include <Library/DebugLib.h>
23 #include <Library/MemoryAllocationLib.h>
24 #include <Library/PrintLib.h>
25 #include <Library/PrmContextBufferLib.h>
26 #include <Library/UefiBootServicesTableLib.h>
27 #include <Library/UnitTestLib.h>
28 #include <Protocol/PrmConfig.h>
29
30 #define UNIT_TEST_NAME "PRM Context Buffer Library Unit Test"
31 #define UNIT_TEST_VERSION "0.1"
32
33 /// === TEST DATA ==================================================================================
34
35 EFI_HANDLE mTestProtocolHandle;
36
37 // *----------------------------------------------------------------------------------*
38 // * Context Structures *
39 // *----------------------------------------------------------------------------------*
40 typedef struct {
41 PRM_MODULE_CONTEXT_BUFFERS *InstallationStructure;
42 EFI_HANDLE Handle;
43 PRM_GUID_SEARCH_TYPE GuidSearchType;
44 EFI_GUID *Guid;
45 EFI_GUID *ExpectedModuleGuid;
46 EFI_STATUS ExpectedStatus;
47 } PRM_CONTEXT_BUFFERS_TEST_CONTEXT;
48
49 typedef struct {
50 EFI_GUID *HandlerGuid;
51 PRM_MODULE_CONTEXT_BUFFERS *ContextBuffers;
52 PRM_CONTEXT_BUFFER *ExpectedContextBuffer;
53 EFI_STATUS ExpectedStatus;
54 } PRM_CONTEXT_BUFFER_TEST_CONTEXT;
55
56 // *----------------------------------------------------------------------------------*
57 // * Test GUIDs *
58 // *----------------------------------------------------------------------------------*
59
60 // {52960b90-2f3a-4917-b91a-ed5f599a8809}
61 #define HANDLER_TEST_GUID_1 {0x52960b90, 0x2f3a, 0x4917, { 0xb9, 0x1a, 0xed, 0x5f, 0x59, 0x9a, 0x88, 0x09 }}
62 EFI_GUID mHandlerTestGuid1 = HANDLER_TEST_GUID_1;
63
64 // {9316a80d-06dc-417b-b21d-6b3c2ae4ed6f}
65 #define HANDLER_TEST_GUID_2 {0x9316a80d, 0x06dc, 0x417b, { 0xb2, 0x1d, 0x6b, 0x3c, 0x2a, 0xe4, 0xed, 0x6f }}
66 EFI_GUID mHandlerTestGuid2 = HANDLER_TEST_GUID_2;
67
68 // {d32ac8ba-6cc6-456f-9ed9-9233fa310434}
69 #define HANDLER_TEST_GUID_3 {0xd32ac8ba, 0x6cc6, 0x456f, { 0x9e, 0xd9, 0x92, 0x33, 0xfa, 0x31, 0x04, 0x34 }}
70 EFI_GUID mHandlerTestGuid3 = HANDLER_TEST_GUID_3;
71
72 // {faadaa95-070b-4a34-a919-18305dc07370}
73 #define MODULE_TEST_GUID_1 {0xfaadaa95, 0x070b, 0x4a34, { 0xa9, 0x19, 0x18, 0x30, 0x5d, 0xc0, 0x73, 0x70 }}
74 EFI_GUID mModuleTestGuid1 = MODULE_TEST_GUID_1;
75
76 // {0ea24584-731c-4863-9100-75780af509a7}
77 #define MODULE_TEST_GUID_2 {0x0ea24584, 0x731c, 0x4863, { 0x91, 0x00, 0x75, 0x78, 0x0a, 0xf5, 0x09, 0xa7 }}
78 EFI_GUID mModuleTestGuid2 = MODULE_TEST_GUID_2;
79
80 // {f456b7a1-82a6-4427-8486-87e3a602df43}
81 #define MODULE_TEST_GUID_3 {0xf456b7a1, 0x82a6, 0x4427, { 0x84, 0x86, 0x87, 0xe3, 0xa6, 0x02, 0xdf, 0x43 }}
82 EFI_GUID mModuleTestGuid3 = MODULE_TEST_GUID_3;
83
84 // {4a941a9c-9dcf-471b-94b5-d9e2d8c64a1b}
85 #define NEGATIVE_TEST_GUID {0x4a941a9c, 0x9dcf, 0x471b, {0x94, 0xb5, 0xd9, 0xe2, 0xd8, 0xc6, 0x4a, 0x1b }}
86 EFI_GUID mNegativeTestGuid = NEGATIVE_TEST_GUID;
87
88 // *----------------------------------------------------------------------------------*
89 // * PRM Static Test Structures *
90 // *----------------------------------------------------------------------------------*
91
92 PRM_DATA_BUFFER mTestStaticDataBuffer1 = {
93 {
94 PRM_DATA_BUFFER_HEADER_SIGNATURE,
95 sizeof (PRM_DATA_BUFFER)
96 }
97 // No data in the buffer (only a header)
98 };
99
100 PRM_CONTEXT_BUFFER mTestPrmContextBuffer1 = {
101 PRM_CONTEXT_BUFFER_SIGNATURE, // Signature
102 PRM_CONTEXT_BUFFER_INTERFACE_VERSION, // Version
103 0, // Reserved
104 HANDLER_TEST_GUID_1, // HandlerGuid
105 &mTestStaticDataBuffer1 // StaticDataBuffer
106 };
107
108 PRM_CONTEXT_BUFFER mTestPrmContextBuffer2[2] = {
109 // Context buffer #1
110 {
111 PRM_CONTEXT_BUFFER_SIGNATURE, // Signature
112 PRM_CONTEXT_BUFFER_INTERFACE_VERSION, // Version
113 0, // Reserved
114 HANDLER_TEST_GUID_2, // HandlerGuid
115 NULL // StaticDataBuffer
116 },
117 // Context buffer #2
118 {
119 PRM_CONTEXT_BUFFER_SIGNATURE, // Signature
120 PRM_CONTEXT_BUFFER_INTERFACE_VERSION, // Version
121 0, // Reserved
122 HANDLER_TEST_GUID_3, // HandlerGuid
123 &mTestStaticDataBuffer1 // StaticDataBuffer (reuse buffer StaticDataBuffer1)
124 }
125 };
126
127 PRM_MODULE_CONTEXT_BUFFERS mTestPrmModuleContextBuffers1 = {
128 MODULE_TEST_GUID_1,
129 1,
130 &mTestPrmContextBuffer1,
131 NULL
132 };
133
134 PRM_MODULE_CONTEXT_BUFFERS mTestPrmModuleContextBuffers2 = {
135 MODULE_TEST_GUID_2,
136 1,
137 &mTestPrmContextBuffer1,
138 NULL
139 };
140
141 PRM_MODULE_CONTEXT_BUFFERS mTestPrmModuleContextBuffers3 = {
142 MODULE_TEST_GUID_3,
143 2,
144 &mTestPrmContextBuffer2[0],
145 NULL
146 };
147
148 // *----------------------------------------------------------------------------------*
149 // * Test Contexts *
150 // *----------------------------------------------------------------------------------*
151
152 // * Searches by module GUID *
153 // +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+
154 // + InstallationStructure | Handle | GuidSearchType | Guid | ExpectedModuleGuid | ExpectedStatus |
155 // +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+
156 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers00 = { &mTestPrmModuleContextBuffers1, NULL, ByModuleGuid, &mModuleTestGuid1, &mModuleTestGuid1, EFI_SUCCESS };
157 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers01 = { &mTestPrmModuleContextBuffers2, NULL, ByModuleGuid, &mModuleTestGuid2, &mModuleTestGuid2, EFI_SUCCESS };
158 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers02 = { &mTestPrmModuleContextBuffers3, NULL, ByModuleGuid, &mModuleTestGuid3, &mModuleTestGuid3, EFI_SUCCESS };
159 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers03 = { &mTestPrmModuleContextBuffers3, NULL, ByModuleGuid, &mNegativeTestGuid, &gZeroGuid, EFI_NOT_FOUND };
160 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers04 = { &mTestPrmModuleContextBuffers1, NULL, ByModuleGuid, &gZeroGuid, &gZeroGuid, EFI_NOT_FOUND };
161
162 // * Searches by handler GUID *
163 // +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+
164 // + InstallationStructure | Handle | GuidSearchType | Guid | ExpectedModuleGuid | ExpectedStatus |
165 // +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+
166 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers05 = { &mTestPrmModuleContextBuffers1, NULL, ByHandlerGuid, &mHandlerTestGuid1, &mModuleTestGuid1, EFI_SUCCESS };
167 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers06 = { &mTestPrmModuleContextBuffers1, NULL, ByHandlerGuid, &gZeroGuid, &gZeroGuid, EFI_NOT_FOUND };
168 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers07 = { &mTestPrmModuleContextBuffers2, NULL, ByHandlerGuid, &mHandlerTestGuid1, &mModuleTestGuid2, EFI_SUCCESS };
169 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers08 = { &mTestPrmModuleContextBuffers2, NULL, ByHandlerGuid, &mNegativeTestGuid, &gZeroGuid, EFI_NOT_FOUND };
170 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers09 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &mHandlerTestGuid1, &gZeroGuid, EFI_NOT_FOUND };
171 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers10 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &mHandlerTestGuid2, &mModuleTestGuid3, EFI_SUCCESS };
172 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers11 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &mHandlerTestGuid3, &mModuleTestGuid3, EFI_SUCCESS };
173 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers12 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &gZeroGuid, &gZeroGuid, EFI_NOT_FOUND };
174
175 PRM_CONTEXT_BUFFERS_TEST_CONTEXT *mContextBuffersArray[] = {
176 &mContextBuffers00,
177 &mContextBuffers01,
178 &mContextBuffers02,
179 &mContextBuffers03,
180 &mContextBuffers04,
181 &mContextBuffers05,
182 &mContextBuffers06,
183 &mContextBuffers07,
184 &mContextBuffers08,
185 &mContextBuffers09,
186 &mContextBuffers10,
187 &mContextBuffers11,
188 &mContextBuffers12
189 };
190
191 // +----------------------+----------------------------------+------------------------------------------+--------------------+
192 // + HandlerGuid | ContextBuffers | ExpectedContextBuffer | ExpectedStatus |
193 // +----------------------+----------------------------------+------------------------------------------+--------------------+
194 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer00 = { &mHandlerTestGuid1, &mTestPrmModuleContextBuffers1, &mTestPrmContextBuffer1, EFI_SUCCESS };
195 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer01 = { &mHandlerTestGuid1, &mTestPrmModuleContextBuffers2, &mTestPrmContextBuffer1, EFI_SUCCESS };
196 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer02 = { &mHandlerTestGuid2, &mTestPrmModuleContextBuffers3, &mTestPrmContextBuffer2[0], EFI_SUCCESS };
197 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer03 = { &mHandlerTestGuid3, &mTestPrmModuleContextBuffers3, &mTestPrmContextBuffer2[1], EFI_SUCCESS };
198 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer04 = { &mNegativeTestGuid, &mTestPrmModuleContextBuffers1, NULL, EFI_NOT_FOUND };
199 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer05 = { &gZeroGuid, &mTestPrmModuleContextBuffers3, NULL, EFI_NOT_FOUND };
200
201 PRM_CONTEXT_BUFFER_TEST_CONTEXT *mContextBufferArray[] = {
202 &mContextBuffer00,
203 &mContextBuffer01,
204 &mContextBuffer02,
205 &mContextBuffer03,
206 &mContextBuffer04,
207 &mContextBuffer05
208 };
209
210 /// === HELPER FUNCTIONS ===========================================================================
211
212 // None
213
214 /// === TEST CASES =================================================================================
215
216 /// ===== BASIC SUITE ==================================================
217
218 /**
219 Verifies that passing NULL arguments to all library functions fails with EFI_INVALID_PARAMETER.
220
221 @param[in] Context [Optional] An optional context parameter.
222 Not used in this unit test.
223
224 @retval UNIT_TEST_PASSED Unit test case prerequisites are met.
225 @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..
226
227 **/
228 UNIT_TEST_STATUS
229 EFIAPI
230 NullPointerArgumentsShouldFailGracefully (
231 IN UNIT_TEST_CONTEXT Context
232 )
233 {
234 EFI_GUID Guid;
235 PRM_CONTEXT_BUFFER *ContextBufferPtr;
236 PRM_MODULE_CONTEXT_BUFFERS ModuleContextBuffers;
237 PRM_MODULE_CONTEXT_BUFFERS *ModuleContextBuffersPtr;
238
239 UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (NULL, NULL, NULL), EFI_INVALID_PARAMETER);
240 UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (NULL, &ModuleContextBuffers, &ContextBufferPtr), EFI_INVALID_PARAMETER);
241 UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (&Guid, NULL, &ContextBufferPtr), EFI_INVALID_PARAMETER);
242 UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (&Guid, &ModuleContextBuffers, NULL), EFI_INVALID_PARAMETER);
243
244 UT_ASSERT_EQUAL (GetModuleContextBuffers (ByModuleGuid, NULL, NULL), EFI_INVALID_PARAMETER);
245 UT_ASSERT_EQUAL (GetModuleContextBuffers (ByModuleGuid, NULL, &ModuleContextBuffersPtr), EFI_INVALID_PARAMETER);
246 UT_ASSERT_EQUAL (GetModuleContextBuffers (ByModuleGuid, &Guid, NULL), EFI_INVALID_PARAMETER);
247
248 UT_ASSERT_EQUAL (GetContextBuffer (NULL, NULL, NULL), EFI_INVALID_PARAMETER);
249 UT_ASSERT_EQUAL (GetContextBuffer (NULL, &ModuleContextBuffers, &ContextBufferPtr), EFI_INVALID_PARAMETER);
250 UT_ASSERT_EQUAL (GetContextBuffer (&Guid, NULL, &ContextBufferPtr), EFI_NOT_FOUND);
251 UT_ASSERT_EQUAL (GetContextBuffer (&Guid, &ModuleContextBuffers, NULL), EFI_INVALID_PARAMETER);
252
253 return UNIT_TEST_PASSED;
254 }
255
256 /// ===== FUNCTIONAL CORRECTNESS SUITE ==================================================
257
258 /**
259 Functional Correctness pre-requisite function.
260
261 Installs a gPrmConfigProtocolGuid protocol instance as specified by the provided
262 context in preparation for unit test execution
263
264 @param[in] Context [Optional] An optional parameter that enables:
265 A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with
266 context information for this unit test.
267
268 @retval UNIT_TEST_PASSED Unit test case prerequisites
269 are met.
270 @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped.
271
272 **/
273 STATIC
274 UNIT_TEST_STATUS
275 EFIAPI
276 InitializeFunctionalCorrectness (
277 IN UNIT_TEST_CONTEXT Context
278 )
279 {
280 EFI_STATUS Status;
281 PRM_CONFIG_PROTOCOL *PrmConfigProtocol;
282 PRM_MODULE_CONTEXT_BUFFERS *ModuleContextBuffers;
283 PRM_CONTEXT_BUFFERS_TEST_CONTEXT *TestContext;
284
285 UT_ASSERT_NOT_NULL (Context);
286 TestContext = (PRM_CONTEXT_BUFFERS_TEST_CONTEXT *)Context;
287 ModuleContextBuffers = TestContext->InstallationStructure;
288
289 PrmConfigProtocol = AllocateZeroPool (sizeof (*PrmConfigProtocol));
290 if (PrmConfigProtocol == NULL) {
291 return UNIT_TEST_ERROR_PREREQUISITE_NOT_MET;
292 }
293
294 CopyGuid (&PrmConfigProtocol->ModuleContextBuffers.ModuleGuid, &ModuleContextBuffers->ModuleGuid);
295 PrmConfigProtocol->ModuleContextBuffers.BufferCount = ModuleContextBuffers->BufferCount;
296 PrmConfigProtocol->ModuleContextBuffers.Buffer = ModuleContextBuffers->Buffer;
297
298 Status = gBS->InstallProtocolInterface (
299 &TestContext->Handle,
300 &gPrmConfigProtocolGuid,
301 EFI_NATIVE_INTERFACE,
302 (VOID *)PrmConfigProtocol
303 );
304 UT_ASSERT_NOT_EFI_ERROR (Status);
305
306 return UNIT_TEST_PASSED;
307 }
308
309 /**
310 Functional Correctness cleanup function.
311
312 Uninstalls the gPrmConfigProtocolGuid protocol instance as specified by the
313 provided context. This is used to clean up the mocked protocol database after
314 unit test execution.
315
316 @param[in] Context [Optional] An optional parameter that enables:
317 A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with
318 context information for this unit test.
319
320 @retval UNIT_TEST_PASSED Test case cleanup succeeded.
321 @retval UNIT_TEST_ERROR_CLEANUP_FAILED Test case cleanup failed.
322
323 **/
324 STATIC
325 UNIT_TEST_STATUS
326 EFIAPI
327 DeInitializeFunctionalCorrectness (
328 IN UNIT_TEST_CONTEXT Context
329 )
330 {
331 EFI_STATUS Status;
332 PRM_CONFIG_PROTOCOL *PrmConfigProtocol;
333 PRM_CONTEXT_BUFFERS_TEST_CONTEXT *TestContext;
334
335 UT_ASSERT_NOT_NULL (Context);
336 TestContext = (PRM_CONTEXT_BUFFERS_TEST_CONTEXT *)Context;
337
338 Status = gBS->HandleProtocol (
339 TestContext->Handle,
340 &gPrmConfigProtocolGuid,
341 (VOID **)&PrmConfigProtocol
342 );
343 UT_ASSERT_NOT_EFI_ERROR (Status);
344
345 if (!EFI_ERROR (Status)) {
346 Status = gBS->UninstallProtocolInterface (
347 TestContext->Handle,
348 &gPrmConfigProtocolGuid,
349 PrmConfigProtocol
350 );
351 UT_ASSERT_NOT_EFI_ERROR (Status);
352 if (!EFI_ERROR (Status)) {
353 FreePool (PrmConfigProtocol);
354 }
355 }
356
357 return UNIT_TEST_PASSED;
358 }
359
360 /**
361 Verifies that the correct PRM_MODULE_CONTEXT_BUFFERS structure instance is found
362 for a given PRM module or PRM handler GUID.
363
364 @param[in] Context [Optional] An optional context parameter.
365 A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with
366 context information for this unit test.
367
368 @retval UNIT_TEST_PASSED Unit test case prerequisites are met.
369 @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..
370
371 **/
372 UNIT_TEST_STATUS
373 EFIAPI
374 VerifyGetModuleContextBuffers (
375 IN UNIT_TEST_CONTEXT Context
376 )
377 {
378 EFI_STATUS Status;
379 PRM_MODULE_CONTEXT_BUFFERS *ContextBuffers;
380 PRM_CONTEXT_BUFFERS_TEST_CONTEXT *TestContext;
381
382 ContextBuffers = NULL;
383 TestContext = (PRM_CONTEXT_BUFFERS_TEST_CONTEXT *)Context;
384
385 Status = GetModuleContextBuffers (TestContext->GuidSearchType, TestContext->Guid, &ContextBuffers);
386 UT_ASSERT_STATUS_EQUAL (Status, TestContext->ExpectedStatus);
387
388 if (!EFI_ERROR (TestContext->ExpectedStatus)) {
389 UT_ASSERT_TRUE (CompareGuid (TestContext->ExpectedModuleGuid, &ContextBuffers->ModuleGuid));
390 UT_LOG_INFO (
391 "%a: Searching by %a GUID ({%g}) returned ContextBuffers at 0x%x\n",
392 __FUNCTION__,
393 ((TestContext->GuidSearchType == ByModuleGuid) ? "module" : "handler"),
394 TestContext->Guid,
395 (UINTN)ContextBuffers
396 );
397 }
398
399 return UNIT_TEST_PASSED;
400 }
401
402 /**
403 Verifies that the expected PRM_CONTEXT_BUFFER instance is found for the given HandlerGuid
404 in the provided PRM_MODULE_CONTEXT_BUFFERS structure.
405
406 @param[in] Context [Optional] An optional context parameter.
407 A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with
408 context information for this unit test.
409
410 @retval UNIT_TEST_PASSED Unit test case prerequisites are met.
411 @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..
412
413 **/
414 UNIT_TEST_STATUS
415 EFIAPI
416 VerifyFindContextBufferInModuleBuffers (
417 IN UNIT_TEST_CONTEXT Context
418 )
419 {
420 EFI_STATUS Status;
421 PRM_CONTEXT_BUFFER *FoundContextBuffer;
422 PRM_MODULE_CONTEXT_BUFFERS *ContextBuffers;
423 PRM_CONTEXT_BUFFER_TEST_CONTEXT *TestContext;
424
425 ContextBuffers = NULL;
426 FoundContextBuffer = NULL;
427 TestContext = (PRM_CONTEXT_BUFFER_TEST_CONTEXT *)Context;
428
429 Status = FindContextBufferInModuleBuffers (TestContext->HandlerGuid, TestContext->ContextBuffers, &FoundContextBuffer);
430 UT_ASSERT_STATUS_EQUAL (Status, TestContext->ExpectedStatus);
431
432 if (!EFI_ERROR (TestContext->ExpectedStatus)) {
433 UT_ASSERT_NOT_NULL (FoundContextBuffer);
434 UT_ASSERT_TRUE (FoundContextBuffer == TestContext->ExpectedContextBuffer);
435 }
436
437 return UNIT_TEST_PASSED;
438 }
439
440 /**
441 Verifies that the expected PRM_CONTEXT_BUFFER instance is found for the given HandlerGuid.
442
443 This function checks both the case when a PRM_MODULE_CONTEXT_BUFFERS structure pointer is provided and
444 not provided.
445
446 NOTES:
447 - In the future, this function should mock the internal calls to other library functions but the direct
448 calls are left in place for now.
449 - The PrmModuleContextBuffers being NULL is not actually tested at the moment. In the future, that case
450 should also be added.
451
452 @param[in] Context [Optional] An optional context parameter.
453 A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with
454 context information for this unit test.
455
456 @retval UNIT_TEST_PASSED Unit test case prerequisites are met.
457 @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..
458
459 **/
460 UNIT_TEST_STATUS
461 EFIAPI
462 VerifyGetContextBuffer (
463 IN UNIT_TEST_CONTEXT Context
464 )
465 {
466 EFI_STATUS Status;
467 PRM_CONTEXT_BUFFER *FoundContextBuffer;
468 PRM_MODULE_CONTEXT_BUFFERS *ContextBuffers;
469 PRM_CONTEXT_BUFFER_TEST_CONTEXT *TestContext;
470
471 ContextBuffers = NULL;
472 FoundContextBuffer = NULL;
473 TestContext = (PRM_CONTEXT_BUFFER_TEST_CONTEXT *)Context;
474
475 Status = GetContextBuffer (TestContext->HandlerGuid, TestContext->ContextBuffers, &FoundContextBuffer);
476 UT_ASSERT_STATUS_EQUAL (Status, TestContext->ExpectedStatus);
477
478 if (!EFI_ERROR (TestContext->ExpectedStatus)) {
479 UT_ASSERT_NOT_NULL (FoundContextBuffer);
480 UT_ASSERT_TRUE (FoundContextBuffer == TestContext->ExpectedContextBuffer);
481 }
482
483 return UNIT_TEST_PASSED;
484 }
485
486 /// === TEST ENGINE ================================================================================
487
488 /**
489 Entry point for the PRM Context Buffer Library unit tests.
490
491 @param[in] ImageHandle The firmware allocated handle for the EFI image.
492 @param[in] SystemTable A pointer to the EFI System Table.
493
494 @retval EFI_SUCCESS The entry point executed successfully.
495 @retval other Some error occurred when executing this entry point.
496
497 **/
498 int
499 main (
500 )
501 {
502 EFI_STATUS Status;
503 UINTN Index;
504 UNIT_TEST_FRAMEWORK_HANDLE Framework;
505 UNIT_TEST_SUITE_HANDLE BasicTests;
506 UNIT_TEST_SUITE_HANDLE FunctionalCorrectnessTests;
507 CHAR8 TestCaseClassNameString[256];
508 CHAR8 TestCaseDescriptionString[256];
509
510 Framework = NULL;
511
512 DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_NAME, UNIT_TEST_VERSION));
513
514 //
515 // Start setting up the test framework for running the tests.
516 //
517 Status = InitUnitTestFramework (&Framework, UNIT_TEST_NAME, gEfiCallerBaseName, UNIT_TEST_VERSION);
518 if (EFI_ERROR (Status)) {
519 DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", Status));
520 goto EXIT;
521 }
522
523 //
524 // Add all test suites and tests.
525 //
526 Status = CreateUnitTestSuite (&BasicTests, Framework, "Basic Context Buffer Tests", "PrmContextBufferLib.Basic", NULL, NULL);
527 if (EFI_ERROR (Status)) {
528 DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for PrmContextBufferLib.Basic\n"));
529 Status = EFI_OUT_OF_RESOURCES;
530 goto EXIT;
531 }
532
533 AddTestCase (
534 BasicTests,
535 "",
536 "PrmContextBufferLib.Basic.NullPointerGracefulFailure",
537 NullPointerArgumentsShouldFailGracefully,
538 NULL,
539 NULL,
540 NULL
541 );
542
543 Status = CreateUnitTestSuite (&FunctionalCorrectnessTests, Framework, "Functional Correctness Tests", "PrmContextBufferLib.Functional", NULL, NULL);
544 if (EFI_ERROR (Status)) {
545 DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for PrmContextBufferLib.Functional\n"));
546 Status = EFI_OUT_OF_RESOURCES;
547 goto EXIT;
548 }
549
550 //
551 // Add Functional Correctness unit tests
552 //
553 for (Index = 0; Index < ARRAY_SIZE (mContextBuffersArray); Index++) {
554 ZeroMem (&TestCaseClassNameString[0], ARRAY_SIZE (TestCaseClassNameString));
555 ZeroMem (&TestCaseDescriptionString[0], ARRAY_SIZE (TestCaseDescriptionString));
556
557 AsciiSPrint (
558 &TestCaseClassNameString[0],
559 ARRAY_SIZE (TestCaseClassNameString),
560 "PrmContextBufferLib.Functional.VerifyGetModuleContextBuffers%d",
561 Index + 1
562 );
563 AsciiSPrint (
564 &TestCaseDescriptionString[0],
565 ARRAY_SIZE (TestCaseDescriptionString),
566 "Verify Get PRM Module Context Buffers Structure by %a GUID %d\n",
567 ((mContextBuffersArray[Index]->GuidSearchType == ByModuleGuid) ? "module" : "handler"),
568 Index + 1
569 );
570
571 AddTestCase (
572 FunctionalCorrectnessTests,
573 &TestCaseDescriptionString[0],
574 &TestCaseClassNameString[0],
575 VerifyGetModuleContextBuffers,
576 InitializeFunctionalCorrectness,
577 DeInitializeFunctionalCorrectness,
578 mContextBuffersArray[Index]
579 );
580 }
581
582 for (Index = 0; Index < ARRAY_SIZE (mContextBufferArray); Index++) {
583 ZeroMem (&TestCaseClassNameString[0], ARRAY_SIZE (TestCaseClassNameString));
584 ZeroMem (&TestCaseDescriptionString[0], ARRAY_SIZE (TestCaseDescriptionString));
585
586 AsciiSPrint (
587 &TestCaseClassNameString[0],
588 ARRAY_SIZE (TestCaseClassNameString),
589 "PrmContextBufferLib.Functional.VerifyFindContextBufferInModuleBuffers%d",
590 Index + 1
591 );
592 AsciiSPrint (
593 &TestCaseDescriptionString[0],
594 ARRAY_SIZE (TestCaseDescriptionString),
595 "Verify Find PRM Context Buffer by Handler GUID %d\n",
596 Index + 1
597 );
598
599 AddTestCase (
600 FunctionalCorrectnessTests,
601 &TestCaseDescriptionString[0],
602 &TestCaseClassNameString[0],
603 VerifyFindContextBufferInModuleBuffers,
604 NULL,
605 NULL,
606 mContextBufferArray[Index]
607 );
608 }
609
610 for (Index = 0; Index < ARRAY_SIZE (mContextBufferArray); Index++) {
611 ZeroMem (&TestCaseClassNameString[0], ARRAY_SIZE (TestCaseClassNameString));
612 ZeroMem (&TestCaseDescriptionString[0], ARRAY_SIZE (TestCaseDescriptionString));
613
614 AsciiSPrint (
615 &TestCaseClassNameString[0],
616 ARRAY_SIZE (TestCaseClassNameString),
617 "PrmContextBufferLib.Functional.VerifyGetContextBuffer%d",
618 Index + 1
619 );
620 AsciiSPrint (
621 &TestCaseDescriptionString[0],
622 ARRAY_SIZE (TestCaseDescriptionString),
623 "Verify Get PRM Context Buffer by Handler GUID %d\n",
624 Index + 1
625 );
626
627 AddTestCase (
628 FunctionalCorrectnessTests,
629 &TestCaseDescriptionString[0],
630 &TestCaseClassNameString[0],
631 VerifyGetContextBuffer,
632 NULL,
633 NULL,
634 mContextBufferArray[Index]
635 );
636 }
637
638 //
639 // Execute the tests.
640 //
641 Status = RunAllTestSuites (Framework);
642
643 EXIT:
644 if (Framework) {
645 FreeUnitTestFramework (Framework);
646 }
647
648 return Status;
649 }