]> git.proxmox.com Git - mirror_edk2.git/blob - PrmPkg/Library/DxePrmContextBufferLib/UnitTest/DxePrmContextBufferLibUnitTest.c
PrmPkg/Library/DxePrmContextBufferLib: Add host-based unit tests
[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 //*----------------------------------------------------------------------------------*
150 //* Test Contexts *
151 //*----------------------------------------------------------------------------------*
152
153 //* Searches by module GUID *
154 // +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+
155 // + InstallationStructure | Handle | GuidSearchType | Guid | ExpectedModuleGuid | ExpectedStatus |
156 // +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+
157 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers00 = { &mTestPrmModuleContextBuffers1, NULL, ByModuleGuid, &mModuleTestGuid1, &mModuleTestGuid1, EFI_SUCCESS };
158 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers01 = { &mTestPrmModuleContextBuffers2, NULL, ByModuleGuid, &mModuleTestGuid2, &mModuleTestGuid2, EFI_SUCCESS };
159 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers02 = { &mTestPrmModuleContextBuffers3, NULL, ByModuleGuid, &mModuleTestGuid3, &mModuleTestGuid3, EFI_SUCCESS };
160 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers03 = { &mTestPrmModuleContextBuffers3, NULL, ByModuleGuid, &mNegativeTestGuid, &gZeroGuid, EFI_NOT_FOUND };
161 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers04 = { &mTestPrmModuleContextBuffers1, NULL, ByModuleGuid, &gZeroGuid, &gZeroGuid, EFI_NOT_FOUND };
162
163 //* Searches by handler GUID *
164 // +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+
165 // + InstallationStructure | Handle | GuidSearchType | Guid | ExpectedModuleGuid | ExpectedStatus |
166 // +--------------------------------+--------+----------------+--------------------+--------------------+--------------------+
167 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers05 = { &mTestPrmModuleContextBuffers1, NULL, ByHandlerGuid, &mHandlerTestGuid1, &mModuleTestGuid1, EFI_SUCCESS };
168 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers06 = { &mTestPrmModuleContextBuffers1, NULL, ByHandlerGuid, &gZeroGuid, &gZeroGuid, EFI_NOT_FOUND };
169 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers07 = { &mTestPrmModuleContextBuffers2, NULL, ByHandlerGuid, &mHandlerTestGuid1, &mModuleTestGuid2, EFI_SUCCESS };
170 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers08 = { &mTestPrmModuleContextBuffers2, NULL, ByHandlerGuid, &mNegativeTestGuid, &gZeroGuid, EFI_NOT_FOUND };
171 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers09 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &mHandlerTestGuid1, &gZeroGuid, EFI_NOT_FOUND };
172 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers10 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &mHandlerTestGuid2, &mModuleTestGuid3, EFI_SUCCESS };
173 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers11 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &mHandlerTestGuid3, &mModuleTestGuid3, EFI_SUCCESS };
174 PRM_CONTEXT_BUFFERS_TEST_CONTEXT mContextBuffers12 = { &mTestPrmModuleContextBuffers3, NULL, ByHandlerGuid, &gZeroGuid, &gZeroGuid, EFI_NOT_FOUND };
175
176 PRM_CONTEXT_BUFFERS_TEST_CONTEXT *mContextBuffersArray[] = {
177 &mContextBuffers00,
178 &mContextBuffers01,
179 &mContextBuffers02,
180 &mContextBuffers03,
181 &mContextBuffers04,
182 &mContextBuffers05,
183 &mContextBuffers06,
184 &mContextBuffers07,
185 &mContextBuffers08,
186 &mContextBuffers09,
187 &mContextBuffers10,
188 &mContextBuffers11,
189 &mContextBuffers12
190 };
191
192 // +----------------------+----------------------------------+------------------------------------------+--------------------+
193 // + HandlerGuid | ContextBuffers | ExpectedContextBuffer | ExpectedStatus |
194 // +----------------------+----------------------------------+------------------------------------------+--------------------+
195 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer00 = { &mHandlerTestGuid1, &mTestPrmModuleContextBuffers1, &mTestPrmContextBuffer1, EFI_SUCCESS };
196 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer01 = { &mHandlerTestGuid1, &mTestPrmModuleContextBuffers2, &mTestPrmContextBuffer1, EFI_SUCCESS };
197 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer02 = { &mHandlerTestGuid2, &mTestPrmModuleContextBuffers3, &mTestPrmContextBuffer2[0], EFI_SUCCESS };
198 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer03 = { &mHandlerTestGuid3, &mTestPrmModuleContextBuffers3, &mTestPrmContextBuffer2[1], EFI_SUCCESS };
199 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer04 = { &mNegativeTestGuid, &mTestPrmModuleContextBuffers1, NULL, EFI_NOT_FOUND };
200 PRM_CONTEXT_BUFFER_TEST_CONTEXT mContextBuffer05 = { &gZeroGuid, &mTestPrmModuleContextBuffers3, NULL, EFI_NOT_FOUND };
201
202 PRM_CONTEXT_BUFFER_TEST_CONTEXT *mContextBufferArray[] = {
203 &mContextBuffer00,
204 &mContextBuffer01,
205 &mContextBuffer02,
206 &mContextBuffer03,
207 &mContextBuffer04,
208 &mContextBuffer05
209 };
210
211 ///=== HELPER FUNCTIONS ===========================================================================
212
213 // None
214
215 ///=== TEST CASES =================================================================================
216
217 ///===== BASIC SUITE ==================================================
218
219 /**
220 Verifies that passing NULL arguments to all library functions fails with EFI_INVALID_PARAMETER.
221
222 @param[in] Context [Optional] An optional context parameter.
223 Not used in this unit test.
224
225 @retval UNIT_TEST_PASSED Unit test case prerequisites are met.
226 @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..
227
228 **/
229 UNIT_TEST_STATUS
230 EFIAPI
231 NullPointerArgumentsShouldFailGracefully (
232 IN UNIT_TEST_CONTEXT Context
233 )
234 {
235 EFI_GUID Guid;
236 PRM_CONTEXT_BUFFER *ContextBufferPtr;
237 PRM_MODULE_CONTEXT_BUFFERS ModuleContextBuffers;
238 PRM_MODULE_CONTEXT_BUFFERS *ModuleContextBuffersPtr;
239
240 UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (NULL, NULL, NULL), EFI_INVALID_PARAMETER);
241 UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (NULL, &ModuleContextBuffers, &ContextBufferPtr), EFI_INVALID_PARAMETER);
242 UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (&Guid, NULL, &ContextBufferPtr), EFI_INVALID_PARAMETER);
243 UT_ASSERT_EQUAL (FindContextBufferInModuleBuffers (&Guid, &ModuleContextBuffers, NULL), EFI_INVALID_PARAMETER);
244
245 UT_ASSERT_EQUAL (GetModuleContextBuffers (ByModuleGuid, NULL, NULL), EFI_INVALID_PARAMETER);
246 UT_ASSERT_EQUAL (GetModuleContextBuffers (ByModuleGuid, NULL, &ModuleContextBuffersPtr), EFI_INVALID_PARAMETER);
247 UT_ASSERT_EQUAL (GetModuleContextBuffers (ByModuleGuid, &Guid, NULL), EFI_INVALID_PARAMETER);
248
249 UT_ASSERT_EQUAL (GetContextBuffer (NULL, NULL, NULL), EFI_INVALID_PARAMETER);
250 UT_ASSERT_EQUAL (GetContextBuffer (NULL, &ModuleContextBuffers, &ContextBufferPtr), EFI_INVALID_PARAMETER);
251 UT_ASSERT_EQUAL (GetContextBuffer (&Guid, NULL, &ContextBufferPtr), EFI_NOT_FOUND);
252 UT_ASSERT_EQUAL (GetContextBuffer (&Guid, &ModuleContextBuffers, NULL), EFI_INVALID_PARAMETER);
253
254 return UNIT_TEST_PASSED;
255 }
256
257 ///===== FUNCTIONAL CORRECTNESS SUITE ==================================================
258
259 /**
260 Functional Correctness pre-requisite function.
261
262 Installs a gPrmConfigProtocolGuid protocol instance as specified by the provided
263 context in preparation for unit test execution
264
265 @param[in] Context [Optional] An optional parameter that enables:
266 A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with
267 context information for this unit test.
268
269 @retval UNIT_TEST_PASSED Unit test case prerequisites
270 are met.
271 @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped.
272
273 **/
274 STATIC
275 UNIT_TEST_STATUS
276 EFIAPI
277 InitializeFunctionalCorrectness (
278 IN UNIT_TEST_CONTEXT Context
279 )
280 {
281 EFI_STATUS Status;
282 PRM_CONFIG_PROTOCOL *PrmConfigProtocol;
283 PRM_MODULE_CONTEXT_BUFFERS *ModuleContextBuffers;
284 PRM_CONTEXT_BUFFERS_TEST_CONTEXT *TestContext;
285
286 UT_ASSERT_NOT_NULL (Context);
287 TestContext = (PRM_CONTEXT_BUFFERS_TEST_CONTEXT *) Context;
288 ModuleContextBuffers = TestContext->InstallationStructure;
289
290 PrmConfigProtocol = AllocateZeroPool (sizeof (*PrmConfigProtocol));
291 if (PrmConfigProtocol == NULL) {
292 return UNIT_TEST_ERROR_PREREQUISITE_NOT_MET;
293 }
294
295 CopyGuid (&PrmConfigProtocol->ModuleContextBuffers.ModuleGuid, &ModuleContextBuffers->ModuleGuid);
296 PrmConfigProtocol->ModuleContextBuffers.BufferCount = ModuleContextBuffers->BufferCount;
297 PrmConfigProtocol->ModuleContextBuffers.Buffer = ModuleContextBuffers->Buffer;
298
299 Status = gBS->InstallProtocolInterface (
300 &TestContext->Handle,
301 &gPrmConfigProtocolGuid,
302 EFI_NATIVE_INTERFACE,
303 (VOID *) PrmConfigProtocol
304 );
305 UT_ASSERT_NOT_EFI_ERROR (Status);
306
307 return UNIT_TEST_PASSED;
308 }
309
310 /**
311 Functional Correctness cleanup function.
312
313 Uninstalls the gPrmConfigProtocolGuid protocol instance as specified by the
314 provided context. This is used to clean up the mocked protocol database after
315 unit test execution.
316
317 @param[in] Context [Optional] An optional parameter that enables:
318 A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with
319 context information for this unit test.
320
321 @retval UNIT_TEST_PASSED Test case cleanup succeeded.
322 @retval UNIT_TEST_ERROR_CLEANUP_FAILED Test case cleanup failed.
323
324 **/
325 STATIC
326 UNIT_TEST_STATUS
327 EFIAPI
328 DeInitializeFunctionalCorrectness (
329 IN UNIT_TEST_CONTEXT Context
330 )
331 {
332 EFI_STATUS Status;
333 PRM_CONFIG_PROTOCOL *PrmConfigProtocol;
334 PRM_CONTEXT_BUFFERS_TEST_CONTEXT *TestContext;
335
336 UT_ASSERT_NOT_NULL (Context);
337 TestContext = (PRM_CONTEXT_BUFFERS_TEST_CONTEXT *) Context;
338
339 Status = gBS->HandleProtocol (
340 TestContext->Handle,
341 &gPrmConfigProtocolGuid,
342 (VOID **) &PrmConfigProtocol
343 );
344 UT_ASSERT_NOT_EFI_ERROR (Status);
345
346 if (!EFI_ERROR (Status)) {
347 Status = gBS->UninstallProtocolInterface (
348 TestContext->Handle,
349 &gPrmConfigProtocolGuid,
350 PrmConfigProtocol
351 );
352 UT_ASSERT_NOT_EFI_ERROR (Status);
353 if (!EFI_ERROR (Status)) {
354 FreePool (PrmConfigProtocol);
355 }
356 }
357
358 return UNIT_TEST_PASSED;
359 }
360
361 /**
362 Verifies that the correct PRM_MODULE_CONTEXT_BUFFERS structure instance is found
363 for a given PRM module or PRM handler GUID.
364
365 @param[in] Context [Optional] An optional context parameter.
366 A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with
367 context information for this unit test.
368
369 @retval UNIT_TEST_PASSED Unit test case prerequisites are met.
370 @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..
371
372 **/
373 UNIT_TEST_STATUS
374 EFIAPI
375 VerifyGetModuleContextBuffers (
376 IN UNIT_TEST_CONTEXT Context
377 )
378 {
379 EFI_STATUS Status;
380 PRM_MODULE_CONTEXT_BUFFERS *ContextBuffers;
381 PRM_CONTEXT_BUFFERS_TEST_CONTEXT *TestContext;
382
383 ContextBuffers = NULL;
384 TestContext = (PRM_CONTEXT_BUFFERS_TEST_CONTEXT *) Context;
385
386 Status = GetModuleContextBuffers (TestContext->GuidSearchType, TestContext->Guid, &ContextBuffers);
387 UT_ASSERT_STATUS_EQUAL (Status, TestContext->ExpectedStatus);
388
389 if (!EFI_ERROR (TestContext->ExpectedStatus)) {
390 UT_ASSERT_TRUE (CompareGuid (TestContext->ExpectedModuleGuid, &ContextBuffers->ModuleGuid));
391 UT_LOG_INFO (
392 "%a: Searching by %a GUID ({%g}) returned ContextBuffers at 0x%x\n",
393 __FUNCTION__,
394 ((TestContext->GuidSearchType == ByModuleGuid) ? "module" : "handler"),
395 TestContext->Guid,
396 (UINTN) ContextBuffers
397 );
398 }
399
400 return UNIT_TEST_PASSED;
401 }
402
403 /**
404 Verifies that the expected PRM_CONTEXT_BUFFER instance is found for the given HandlerGuid
405 in the provided PRM_MODULE_CONTEXT_BUFFERS structure.
406
407 @param[in] Context [Optional] An optional context parameter.
408 A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with
409 context information for this unit test.
410
411 @retval UNIT_TEST_PASSED Unit test case prerequisites are met.
412 @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..
413
414 **/
415 UNIT_TEST_STATUS
416 EFIAPI
417 VerifyFindContextBufferInModuleBuffers (
418 IN UNIT_TEST_CONTEXT Context
419 )
420 {
421 EFI_STATUS Status;
422 PRM_CONTEXT_BUFFER *FoundContextBuffer;
423 PRM_MODULE_CONTEXT_BUFFERS *ContextBuffers;
424 PRM_CONTEXT_BUFFER_TEST_CONTEXT *TestContext;
425
426 ContextBuffers = NULL;
427 FoundContextBuffer = NULL;
428 TestContext = (PRM_CONTEXT_BUFFER_TEST_CONTEXT *) Context;
429
430 Status = FindContextBufferInModuleBuffers (TestContext->HandlerGuid, TestContext->ContextBuffers, &FoundContextBuffer);
431 UT_ASSERT_STATUS_EQUAL (Status, TestContext->ExpectedStatus);
432
433 if (!EFI_ERROR (TestContext->ExpectedStatus)) {
434 UT_ASSERT_NOT_NULL (FoundContextBuffer);
435 UT_ASSERT_TRUE (FoundContextBuffer == TestContext->ExpectedContextBuffer);
436 }
437
438 return UNIT_TEST_PASSED;
439 }
440
441 /**
442 Verifies that the expected PRM_CONTEXT_BUFFER instance is found for the given HandlerGuid.
443
444 This function checks both the case when a PRM_MODULE_CONTEXT_BUFFERS structure pointer is provided and
445 not provided.
446
447 NOTES:
448 - In the future, this function should mock the internal calls to other library functions but the direct
449 calls are left in place for now.
450 - The PrmModuleContextBuffers being NULL is not actually tested at the moment. In the future, that case
451 should also be added.
452
453 @param[in] Context [Optional] An optional context parameter.
454 A pointer to a PRM_CONTEXT_BUFFERS_TEST_CONTEXT structure with
455 context information for this unit test.
456
457 @retval UNIT_TEST_PASSED Unit test case prerequisites are met.
458 @retval UNIT_TEST_ERROR_PREREQUISITE_NOT_MET Test case should be skipped..
459
460 **/
461 UNIT_TEST_STATUS
462 EFIAPI
463 VerifyGetContextBuffer (
464 IN UNIT_TEST_CONTEXT Context
465 )
466 {
467 EFI_STATUS Status;
468 PRM_CONTEXT_BUFFER *FoundContextBuffer;
469 PRM_MODULE_CONTEXT_BUFFERS *ContextBuffers;
470 PRM_CONTEXT_BUFFER_TEST_CONTEXT *TestContext;
471
472 ContextBuffers = NULL;
473 FoundContextBuffer = NULL;
474 TestContext = (PRM_CONTEXT_BUFFER_TEST_CONTEXT *) Context;
475
476 Status = GetContextBuffer (TestContext->HandlerGuid, TestContext->ContextBuffers, &FoundContextBuffer);
477 UT_ASSERT_STATUS_EQUAL (Status, TestContext->ExpectedStatus);
478
479 if (!EFI_ERROR (TestContext->ExpectedStatus)) {
480 UT_ASSERT_NOT_NULL (FoundContextBuffer);
481 UT_ASSERT_TRUE (FoundContextBuffer == TestContext->ExpectedContextBuffer);
482 }
483
484 return UNIT_TEST_PASSED;
485 }
486
487 ///=== TEST ENGINE ================================================================================
488
489 /**
490 Entry point for the PRM Context Buffer Library unit tests.
491
492 @param[in] ImageHandle The firmware allocated handle for the EFI image.
493 @param[in] SystemTable A pointer to the EFI System Table.
494
495 @retval EFI_SUCCESS The entry point executed successfully.
496 @retval other Some error occurred when executing this entry point.
497
498 **/
499 int main ()
500 {
501 EFI_STATUS Status;
502 UINTN Index;
503 UNIT_TEST_FRAMEWORK_HANDLE Framework;
504 UNIT_TEST_SUITE_HANDLE BasicTests;
505 UNIT_TEST_SUITE_HANDLE FunctionalCorrectnessTests;
506 CHAR8 TestCaseClassNameString[256];
507 CHAR8 TestCaseDescriptionString[256];
508
509 Framework = NULL;
510
511 DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_NAME, UNIT_TEST_VERSION));
512
513 //
514 // Start setting up the test framework for running the tests.
515 //
516 Status = InitUnitTestFramework (&Framework, UNIT_TEST_NAME, gEfiCallerBaseName, UNIT_TEST_VERSION);
517 if (EFI_ERROR (Status)) {
518 DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", Status));
519 goto EXIT;
520 }
521
522 //
523 // Add all test suites and tests.
524 //
525 Status = CreateUnitTestSuite (&BasicTests, Framework, "Basic Context Buffer Tests", "PrmContextBufferLib.Basic", NULL, NULL);
526 if (EFI_ERROR (Status)) {
527 DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for PrmContextBufferLib.Basic\n"));
528 Status = EFI_OUT_OF_RESOURCES;
529 goto EXIT;
530 }
531
532 AddTestCase (
533 BasicTests,
534 "",
535 "PrmContextBufferLib.Basic.NullPointerGracefulFailure",
536 NullPointerArgumentsShouldFailGracefully,
537 NULL,
538 NULL,
539 NULL
540 );
541
542 Status = CreateUnitTestSuite (&FunctionalCorrectnessTests, Framework, "Functional Correctness Tests", "PrmContextBufferLib.Functional", NULL, NULL);
543 if (EFI_ERROR (Status)) {
544 DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for PrmContextBufferLib.Functional\n"));
545 Status = EFI_OUT_OF_RESOURCES;
546 goto EXIT;
547 }
548
549 //
550 // Add Functional Correctness unit tests
551 //
552 for (Index = 0; Index < ARRAY_SIZE (mContextBuffersArray); Index++) {
553 ZeroMem (&TestCaseClassNameString[0], ARRAY_SIZE (TestCaseClassNameString));
554 ZeroMem (&TestCaseDescriptionString[0], ARRAY_SIZE (TestCaseDescriptionString));
555
556 AsciiSPrint (
557 &TestCaseClassNameString[0],
558 ARRAY_SIZE (TestCaseClassNameString),
559 "PrmContextBufferLib.Functional.VerifyGetModuleContextBuffers%d",
560 Index + 1
561 );
562 AsciiSPrint (
563 &TestCaseDescriptionString[0],
564 ARRAY_SIZE (TestCaseDescriptionString),
565 "Verify Get PRM Module Context Buffers Structure by %a GUID %d\n",
566 ((mContextBuffersArray[Index]->GuidSearchType == ByModuleGuid) ? "module" : "handler"),
567 Index + 1
568 );
569
570 AddTestCase (
571 FunctionalCorrectnessTests,
572 &TestCaseDescriptionString[0],
573 &TestCaseClassNameString[0],
574 VerifyGetModuleContextBuffers,
575 InitializeFunctionalCorrectness,
576 DeInitializeFunctionalCorrectness,
577 mContextBuffersArray[Index]
578 );
579 }
580
581 for (Index = 0; Index < ARRAY_SIZE (mContextBufferArray); Index++) {
582 ZeroMem (&TestCaseClassNameString[0], ARRAY_SIZE (TestCaseClassNameString));
583 ZeroMem (&TestCaseDescriptionString[0], ARRAY_SIZE (TestCaseDescriptionString));
584
585 AsciiSPrint (
586 &TestCaseClassNameString[0],
587 ARRAY_SIZE (TestCaseClassNameString),
588 "PrmContextBufferLib.Functional.VerifyFindContextBufferInModuleBuffers%d",
589 Index + 1
590 );
591 AsciiSPrint (
592 &TestCaseDescriptionString[0],
593 ARRAY_SIZE (TestCaseDescriptionString),
594 "Verify Find PRM Context Buffer by Handler GUID %d\n",
595 Index + 1
596 );
597
598 AddTestCase (
599 FunctionalCorrectnessTests,
600 &TestCaseDescriptionString[0],
601 &TestCaseClassNameString[0],
602 VerifyFindContextBufferInModuleBuffers,
603 NULL,
604 NULL,
605 mContextBufferArray[Index]
606 );
607 }
608
609 for (Index = 0; Index < ARRAY_SIZE (mContextBufferArray); Index++) {
610 ZeroMem (&TestCaseClassNameString[0], ARRAY_SIZE (TestCaseClassNameString));
611 ZeroMem (&TestCaseDescriptionString[0], ARRAY_SIZE (TestCaseDescriptionString));
612
613 AsciiSPrint (
614 &TestCaseClassNameString[0],
615 ARRAY_SIZE (TestCaseClassNameString),
616 "PrmContextBufferLib.Functional.VerifyGetContextBuffer%d",
617 Index + 1
618 );
619 AsciiSPrint (
620 &TestCaseDescriptionString[0],
621 ARRAY_SIZE (TestCaseDescriptionString),
622 "Verify Get PRM Context Buffer by Handler GUID %d\n",
623 Index + 1
624 );
625
626 AddTestCase (
627 FunctionalCorrectnessTests,
628 &TestCaseDescriptionString[0],
629 &TestCaseClassNameString[0],
630 VerifyGetContextBuffer,
631 NULL,
632 NULL,
633 mContextBufferArray[Index]
634 );
635 }
636
637 //
638 // Execute the tests.
639 //
640 Status = RunAllTestSuites (Framework);
641
642 EXIT:
643 if (Framework)
644 {
645 FreeUnitTestFramework (Framework);
646 }
647
648 return Status;
649 }