]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Variable/RuntimeDxe/RuntimeDxeUnitTest/VariableLockRequestToLockUnitTest.c
MdeModulePkg: Apply uncrustify changes
[mirror_edk2.git] / MdeModulePkg / Universal / Variable / RuntimeDxe / RuntimeDxeUnitTest / VariableLockRequestToLockUnitTest.c
CommitLineData
dcaa9393
MK
1/** @file\r
2 This is a host-based unit test for the VariableLockRequestToLock shim.\r
3\r
4 Copyright (c) Microsoft Corporation.\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
7**/\r
8\r
9#include <stdio.h>\r
10#include <string.h>\r
11#include <stdarg.h>\r
12#include <stddef.h>\r
13#include <setjmp.h>\r
14#include <cmocka.h>\r
15\r
16#include <Uefi.h>\r
17#include <Library/DebugLib.h>\r
18#include <Library/BaseMemoryLib.h>\r
19#include <Library/MemoryAllocationLib.h>\r
20#include <Library/UnitTestLib.h>\r
21#include <Library/VariablePolicyLib.h>\r
22#include <Library/VariablePolicyHelperLib.h>\r
23\r
24#include <Protocol/VariableLock.h>\r
25\r
1436aea4
MK
26#define UNIT_TEST_NAME "VarPol/VarLock Shim Unit Test"\r
27#define UNIT_TEST_VERSION "1.0"\r
dcaa9393 28\r
1436aea4 29/// === CODE UNDER TEST ===========================================================================\r
dcaa9393
MK
30\r
31EFI_STATUS\r
32EFIAPI\r
33VariableLockRequestToLock (\r
34 IN CONST EDKII_VARIABLE_LOCK_PROTOCOL *This,\r
35 IN CHAR16 *VariableName,\r
36 IN EFI_GUID *VendorGuid\r
37 );\r
38\r
1436aea4 39/// === TEST DATA ==================================================================================\r
dcaa9393
MK
40\r
41//\r
42// Test GUID 1 {F955BA2D-4A2C-480C-BFD1-3CC522610592}\r
43//\r
44EFI_GUID mTestGuid1 = {\r
1436aea4 45 0xf955ba2d, 0x4a2c, 0x480c, { 0xbf, 0xd1, 0x3c, 0xc5, 0x22, 0x61, 0x5, 0x92 }\r
dcaa9393
MK
46};\r
47\r
48//\r
49// Test GUID 2 {2DEA799E-5E73-43B9-870E-C945CE82AF3A}\r
50//\r
51EFI_GUID mTestGuid2 = {\r
1436aea4 52 0x2dea799e, 0x5e73, 0x43b9, { 0x87, 0xe, 0xc9, 0x45, 0xce, 0x82, 0xaf, 0x3a }\r
dcaa9393
MK
53};\r
54\r
55//\r
56// Test GUID 3 {698A2BFD-A616-482D-B88C-7100BD6682A9}\r
57//\r
58EFI_GUID mTestGuid3 = {\r
1436aea4 59 0x698a2bfd, 0xa616, 0x482d, { 0xb8, 0x8c, 0x71, 0x0, 0xbd, 0x66, 0x82, 0xa9 }\r
dcaa9393
MK
60};\r
61\r
1436aea4
MK
62#define TEST_VAR_1_NAME L"TestVar1"\r
63#define TEST_VAR_2_NAME L"TestVar2"\r
64#define TEST_VAR_3_NAME L"TestVar3"\r
dcaa9393
MK
65\r
66#define TEST_POLICY_ATTRIBUTES_NULL 0\r
67#define TEST_POLICY_MIN_SIZE_NULL 0\r
68#define TEST_POLICY_MAX_SIZE_NULL MAX_UINT32\r
69\r
1436aea4
MK
70#define TEST_POLICY_MIN_SIZE_10 10\r
71#define TEST_POLICY_MAX_SIZE_200 200\r
dcaa9393 72\r
1436aea4 73/// === HELPER FUNCTIONS ===========================================================================\r
dcaa9393
MK
74\r
75/**\r
76 Mocked version of GetVariable, for testing.\r
77\r
78 @param VariableName\r
79 @param VendorGuid\r
80 @param Attributes\r
81 @param DataSize\r
82 @param Data\r
83**/\r
84EFI_STATUS\r
85EFIAPI\r
86StubGetVariableNull (\r
87 IN CHAR16 *VariableName,\r
88 IN EFI_GUID *VendorGuid,\r
e3917e22 89 OUT UINT32 *Attributes OPTIONAL,\r
dcaa9393
MK
90 IN OUT UINTN *DataSize,\r
91 OUT VOID *Data OPTIONAL\r
92 )\r
93{\r
94 UINT32 MockedAttr;\r
95 UINTN MockedDataSize;\r
96 VOID *MockedData;\r
97 EFI_STATUS MockedReturn;\r
98\r
99 check_expected_ptr (VariableName);\r
100 check_expected_ptr (VendorGuid);\r
101 check_expected_ptr (DataSize);\r
102\r
1436aea4
MK
103 MockedAttr = (UINT32)mock ();\r
104 MockedDataSize = (UINTN)mock ();\r
105 MockedData = (VOID *)(UINTN)mock ();\r
106 MockedReturn = (EFI_STATUS)mock ();\r
dcaa9393
MK
107\r
108 if (Attributes != NULL) {\r
109 *Attributes = MockedAttr;\r
110 }\r
1436aea4
MK
111\r
112 if ((Data != NULL) && !EFI_ERROR (MockedReturn)) {\r
dcaa9393
MK
113 CopyMem (Data, MockedData, MockedDataSize);\r
114 }\r
115\r
116 *DataSize = MockedDataSize;\r
117\r
118 return MockedReturn;\r
119}\r
120\r
121//\r
122// Anything you think might be helpful that isn't a test itself.\r
123//\r
124\r
125/**\r
126 This is a common setup function that will ensure the library is always\r
127 initialized with the stubbed GetVariable.\r
128\r
129 Not used by all test cases, but by most.\r
130\r
131 @param[in] Context Unit test case context\r
132**/\r
133STATIC\r
134UNIT_TEST_STATUS\r
135EFIAPI\r
136LibInitMocked (\r
137 IN UNIT_TEST_CONTEXT Context\r
138 )\r
139{\r
140 return EFI_ERROR (InitVariablePolicyLib (StubGetVariableNull)) ? UNIT_TEST_ERROR_PREREQUISITE_NOT_MET : UNIT_TEST_PASSED;\r
141}\r
142\r
143/**\r
144 Common cleanup function to make sure that the library is always de-initialized\r
145 prior to the next test case.\r
146\r
147 @param[in] Context Unit test case context\r
148**/\r
149STATIC\r
150VOID\r
151EFIAPI\r
152LibCleanup (\r
153 IN UNIT_TEST_CONTEXT Context\r
154 )\r
155{\r
1436aea4 156 DeinitVariablePolicyLib ();\r
dcaa9393
MK
157}\r
158\r
1436aea4 159/// === TEST CASES =================================================================================\r
dcaa9393 160\r
1436aea4 161/// ===== SHIM SUITE ===========================================================\r
dcaa9393
MK
162\r
163/**\r
164 Test Case that locks a single variable using the Variable Lock Protocol.\r
165 The call is expected to succeed.\r
166\r
167 @param[in] Context Unit test case context\r
168**/\r
169UNIT_TEST_STATUS\r
170EFIAPI\r
171LockingWithoutAnyPoliciesShouldSucceed (\r
172 IN UNIT_TEST_CONTEXT Context\r
173 )\r
174{\r
175 EFI_STATUS Status;\r
176\r
177 Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);\r
178 UT_ASSERT_NOT_EFI_ERROR (Status);\r
179\r
180 return UNIT_TEST_PASSED;\r
181}\r
182\r
183/**\r
184 Test Case that locks the same variable twice using the Variable Lock Protocol.\r
185 Both calls are expected to succeed.\r
186\r
187 @param[in] Context Unit test case context\r
188 **/\r
189UNIT_TEST_STATUS\r
190EFIAPI\r
191LockingTwiceShouldSucceed (\r
192 IN UNIT_TEST_CONTEXT Context\r
193 )\r
194{\r
195 EFI_STATUS Status;\r
196\r
197 Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);\r
198 UT_ASSERT_NOT_EFI_ERROR (Status);\r
199\r
200 Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);\r
201 UT_ASSERT_NOT_EFI_ERROR (Status);\r
202\r
203 return UNIT_TEST_PASSED;\r
204}\r
205\r
206/**\r
207 Test Case that locks a variable using the Variable Policy Protocol then locks\r
208 the same variable using the Variable Lock Protocol.\r
209 Both calls are expected to succeed.\r
210\r
211 @param[in] Context Unit test case context\r
212 **/\r
213UNIT_TEST_STATUS\r
214EFIAPI\r
215LockingALockedVariableShouldSucceed (\r
216 IN UNIT_TEST_CONTEXT Context\r
217 )\r
218{\r
219 EFI_STATUS Status;\r
220 VARIABLE_POLICY_ENTRY *NewEntry;\r
221\r
222 //\r
223 // Create a variable policy that locks the variable.\r
224 //\r
225 Status = CreateBasicVariablePolicy (\r
226 &mTestGuid1,\r
227 TEST_VAR_1_NAME,\r
228 TEST_POLICY_MIN_SIZE_NULL,\r
229 TEST_POLICY_MAX_SIZE_200,\r
230 TEST_POLICY_ATTRIBUTES_NULL,\r
231 TEST_POLICY_ATTRIBUTES_NULL,\r
232 VARIABLE_POLICY_TYPE_LOCK_NOW,\r
233 &NewEntry\r
234 );\r
235 UT_ASSERT_NOT_EFI_ERROR (Status);\r
236\r
237 //\r
238 // Register the new policy.\r
239 //\r
240 Status = RegisterVariablePolicy (NewEntry);\r
241\r
242 Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);\r
243 UT_ASSERT_NOT_EFI_ERROR (Status);\r
244\r
245 FreePool (NewEntry);\r
246\r
247 return UNIT_TEST_PASSED;\r
248}\r
249\r
250/**\r
251 Test Case that locks a variable using the Variable Policy Protocol with a\r
252 policy other than LOCK_NOW then attempts to lock the same variable using the\r
253 Variable Lock Protocol. The call to Variable Policy is expected to succeed\r
254 and the call to Variable Lock is expected to fail.\r
255\r
256 @param[in] Context Unit test case context\r
257 **/\r
258UNIT_TEST_STATUS\r
259EFIAPI\r
260LockingAnUnlockedVariableShouldFail (\r
1436aea4 261 IN UNIT_TEST_CONTEXT Context\r
dcaa9393
MK
262 )\r
263{\r
1436aea4
MK
264 EFI_STATUS Status;\r
265 VARIABLE_POLICY_ENTRY *NewEntry;\r
dcaa9393
MK
266\r
267 // Create a variable policy that locks the variable.\r
1436aea4
MK
268 Status = CreateVarStateVariablePolicy (\r
269 &mTestGuid1,\r
270 TEST_VAR_1_NAME,\r
271 TEST_POLICY_MIN_SIZE_NULL,\r
272 TEST_POLICY_MAX_SIZE_200,\r
273 TEST_POLICY_ATTRIBUTES_NULL,\r
274 TEST_POLICY_ATTRIBUTES_NULL,\r
275 &mTestGuid2,\r
276 1,\r
277 TEST_VAR_2_NAME,\r
278 &NewEntry\r
279 );\r
dcaa9393
MK
280 UT_ASSERT_NOT_EFI_ERROR (Status);\r
281\r
282 // Register the new policy.\r
283 Status = RegisterVariablePolicy (NewEntry);\r
284\r
1436aea4
MK
285 // Configure the stub to not care about parameters. We're testing errors.\r
286 expect_any_always (StubGetVariableNull, VariableName);\r
287 expect_any_always (StubGetVariableNull, VendorGuid);\r
288 expect_any_always (StubGetVariableNull, DataSize);\r
dcaa9393
MK
289\r
290 // With a policy, make sure that writes still work, since the variable doesn't exist.\r
1436aea4
MK
291 will_return (StubGetVariableNull, TEST_POLICY_ATTRIBUTES_NULL); // Attributes\r
292 will_return (StubGetVariableNull, 0); // Size\r
293 will_return (StubGetVariableNull, (UINTN)NULL); // DataPtr\r
294 will_return (StubGetVariableNull, EFI_NOT_FOUND); // Status\r
dcaa9393
MK
295\r
296 Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);\r
297 UT_ASSERT_TRUE (EFI_ERROR (Status));\r
298\r
299 FreePool (NewEntry);\r
300\r
301 return UNIT_TEST_PASSED;\r
302}\r
303\r
304/**\r
305 Test Case that locks a variable using the Variable Policy Protocol with a\r
306 policy other than LOCK_NOW, but is currently locked. Then attempts to lock\r
307 the same variable using the Variable Lock Protocol. The call to Variable\r
308 Policy is expected to succeed and the call to Variable Lock also expected to\r
309 succeed.\r
310\r
311 @param[in] Context Unit test case context\r
312 **/\r
313UNIT_TEST_STATUS\r
314EFIAPI\r
315LockingALockedVariableWithMatchingDataShouldSucceed (\r
1436aea4 316 IN UNIT_TEST_CONTEXT Context\r
dcaa9393
MK
317 )\r
318{\r
1436aea4
MK
319 EFI_STATUS Status;\r
320 VARIABLE_POLICY_ENTRY *NewEntry;\r
321 UINT8 Data;\r
dcaa9393
MK
322\r
323 // Create a variable policy that locks the variable.\r
1436aea4
MK
324 Status = CreateVarStateVariablePolicy (\r
325 &mTestGuid1,\r
326 TEST_VAR_1_NAME,\r
327 TEST_POLICY_MIN_SIZE_NULL,\r
328 TEST_POLICY_MAX_SIZE_200,\r
329 TEST_POLICY_ATTRIBUTES_NULL,\r
330 TEST_POLICY_ATTRIBUTES_NULL,\r
331 &mTestGuid2,\r
332 1,\r
333 TEST_VAR_2_NAME,\r
334 &NewEntry\r
335 );\r
dcaa9393
MK
336 UT_ASSERT_NOT_EFI_ERROR (Status);\r
337\r
338 // Register the new policy.\r
339 Status = RegisterVariablePolicy (NewEntry);\r
340\r
1436aea4
MK
341 // Configure the stub to not care about parameters. We're testing errors.\r
342 expect_any_always (StubGetVariableNull, VariableName);\r
343 expect_any_always (StubGetVariableNull, VendorGuid);\r
344 expect_any_always (StubGetVariableNull, DataSize);\r
dcaa9393
MK
345\r
346 // With a policy, make sure that writes still work, since the variable doesn't exist.\r
347 Data = 1;\r
1436aea4
MK
348 will_return (StubGetVariableNull, TEST_POLICY_ATTRIBUTES_NULL); // Attributes\r
349 will_return (StubGetVariableNull, sizeof (Data)); // Size\r
350 will_return (StubGetVariableNull, (UINTN)&Data); // DataPtr\r
351 will_return (StubGetVariableNull, EFI_SUCCESS); // Status\r
dcaa9393
MK
352\r
353 Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);\r
354 UT_ASSERT_TRUE (!EFI_ERROR (Status));\r
355\r
356 FreePool (NewEntry);\r
357\r
358 return UNIT_TEST_PASSED;\r
359}\r
360\r
361/**\r
362 Test Case that locks a variable using the Variable Policy Protocol with a\r
363 policy other than LOCK_NOW, but variable data does not match. Then attempts\r
364 to lock the same variable using the Variable Lock Protocol. The call to\r
365 Variable Policy is expected to succeed and the call to Variable Lock is\r
366 expected to fail.\r
367\r
368 @param[in] Context Unit test case context\r
369 **/\r
370UNIT_TEST_STATUS\r
371EFIAPI\r
372LockingALockedVariableWithNonMatchingDataShouldFail (\r
1436aea4 373 IN UNIT_TEST_CONTEXT Context\r
dcaa9393
MK
374 )\r
375{\r
1436aea4
MK
376 EFI_STATUS Status;\r
377 VARIABLE_POLICY_ENTRY *NewEntry;\r
378 UINT8 Data;\r
dcaa9393
MK
379\r
380 // Create a variable policy that locks the variable.\r
1436aea4
MK
381 Status = CreateVarStateVariablePolicy (\r
382 &mTestGuid1,\r
383 TEST_VAR_1_NAME,\r
384 TEST_POLICY_MIN_SIZE_NULL,\r
385 TEST_POLICY_MAX_SIZE_200,\r
386 TEST_POLICY_ATTRIBUTES_NULL,\r
387 TEST_POLICY_ATTRIBUTES_NULL,\r
388 &mTestGuid2,\r
389 1,\r
390 TEST_VAR_2_NAME,\r
391 &NewEntry\r
392 );\r
dcaa9393
MK
393 UT_ASSERT_NOT_EFI_ERROR (Status);\r
394\r
395 // Register the new policy.\r
396 Status = RegisterVariablePolicy (NewEntry);\r
397\r
1436aea4
MK
398 // Configure the stub to not care about parameters. We're testing errors.\r
399 expect_any_always (StubGetVariableNull, VariableName);\r
400 expect_any_always (StubGetVariableNull, VendorGuid);\r
401 expect_any_always (StubGetVariableNull, DataSize);\r
dcaa9393
MK
402\r
403 // With a policy, make sure that writes still work, since the variable doesn't exist.\r
404 Data = 2;\r
1436aea4
MK
405 will_return (StubGetVariableNull, TEST_POLICY_ATTRIBUTES_NULL); // Attributes\r
406 will_return (StubGetVariableNull, sizeof (Data)); // Size\r
407 will_return (StubGetVariableNull, (UINTN)&Data); // DataPtr\r
408 will_return (StubGetVariableNull, EFI_SUCCESS); // Status\r
dcaa9393
MK
409\r
410 Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);\r
411 UT_ASSERT_TRUE (EFI_ERROR (Status));\r
412\r
413 FreePool (NewEntry);\r
414\r
415 return UNIT_TEST_PASSED;\r
416}\r
417\r
418/**\r
419 Test Case that locks a variable using Variable Lock Protocol Policy Protocol\r
420 then and then attempts to lock the same variable using the Variable Policy\r
421 Protocol. The call to Variable Lock is expected to succeed and the call to\r
422 Variable Policy is expected to fail.\r
423\r
424 @param[in] Context Unit test case context\r
425 **/\r
426UNIT_TEST_STATUS\r
427EFIAPI\r
428SettingPolicyForALockedVariableShouldFail (\r
1436aea4 429 IN UNIT_TEST_CONTEXT Context\r
dcaa9393
MK
430 )\r
431{\r
1436aea4
MK
432 EFI_STATUS Status;\r
433 VARIABLE_POLICY_ENTRY *NewEntry;\r
dcaa9393
MK
434\r
435 // Lock the variable.\r
436 Status = VariableLockRequestToLock (NULL, TEST_VAR_1_NAME, &mTestGuid1);\r
437 UT_ASSERT_NOT_EFI_ERROR (Status);\r
438\r
439 // Create a variable policy that locks the variable.\r
1436aea4
MK
440 Status = CreateVarStateVariablePolicy (\r
441 &mTestGuid1,\r
442 TEST_VAR_1_NAME,\r
443 TEST_POLICY_MIN_SIZE_NULL,\r
444 TEST_POLICY_MAX_SIZE_200,\r
445 TEST_POLICY_ATTRIBUTES_NULL,\r
446 TEST_POLICY_ATTRIBUTES_NULL,\r
447 &mTestGuid2,\r
448 1,\r
449 TEST_VAR_2_NAME,\r
450 &NewEntry\r
451 );\r
dcaa9393
MK
452 UT_ASSERT_NOT_EFI_ERROR (Status);\r
453\r
454 // Register the new policy.\r
455 Status = RegisterVariablePolicy (NewEntry);\r
456 UT_ASSERT_TRUE (EFI_ERROR (Status));\r
457\r
458 FreePool (NewEntry);\r
459\r
460 return UNIT_TEST_PASSED;\r
461}\r
462\r
463/**\r
464 Main entry point to this unit test application.\r
465\r
466 Sets up and runs the test suites.\r
467**/\r
468VOID\r
469EFIAPI\r
470UnitTestMain (\r
471 VOID\r
472 )\r
473{\r
474 EFI_STATUS Status;\r
475 UNIT_TEST_FRAMEWORK_HANDLE Framework;\r
476 UNIT_TEST_SUITE_HANDLE ShimTests;\r
477\r
478 Framework = NULL;\r
479\r
480 DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_NAME, UNIT_TEST_VERSION));\r
481\r
482 //\r
483 // Start setting up the test framework for running the tests.\r
484 //\r
485 Status = InitUnitTestFramework (&Framework, UNIT_TEST_NAME, gEfiCallerBaseName, UNIT_TEST_VERSION);\r
486 if (EFI_ERROR (Status)) {\r
487 DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", Status));\r
488 goto EXIT;\r
489 }\r
490\r
491 //\r
492 // Add all test suites and tests.\r
493 //\r
494 Status = CreateUnitTestSuite (\r
1436aea4
MK
495 &ShimTests,\r
496 Framework,\r
497 "Variable Lock Shim Tests",\r
498 "VarPolicy.VarLockShim",\r
499 NULL,\r
500 NULL\r
dcaa9393
MK
501 );\r
502 if (EFI_ERROR (Status)) {\r
503 DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite for ShimTests\n"));\r
504 Status = EFI_OUT_OF_RESOURCES;\r
505 goto EXIT;\r
506 }\r
1436aea4 507\r
dcaa9393
MK
508 AddTestCase (\r
509 ShimTests,\r
1436aea4
MK
510 "Locking a variable with no matching policies should always work",\r
511 "EmptyPolicies",\r
512 LockingWithoutAnyPoliciesShouldSucceed,\r
513 LibInitMocked,\r
514 LibCleanup,\r
515 NULL\r
dcaa9393
MK
516 );\r
517 AddTestCase (\r
518 ShimTests,\r
1436aea4
MK
519 "Locking a variable twice should always work",\r
520 "DoubleLock",\r
521 LockingTwiceShouldSucceed,\r
522 LibInitMocked,\r
523 LibCleanup,\r
524 NULL\r
dcaa9393
MK
525 );\r
526 AddTestCase (\r
527 ShimTests,\r
1436aea4
MK
528 "Locking a variable that's already locked by another policy should work",\r
529 "LockAfterPolicy",\r
530 LockingALockedVariableShouldSucceed,\r
531 LibInitMocked,\r
532 LibCleanup,\r
533 NULL\r
dcaa9393
MK
534 );\r
535 AddTestCase (\r
536 ShimTests,\r
1436aea4
MK
537 "Locking a variable that already has an unlocked policy should fail",\r
538 "LockAfterUnlockedPolicy",\r
539 LockingAnUnlockedVariableShouldFail,\r
540 LibInitMocked,\r
541 LibCleanup,\r
542 NULL\r
dcaa9393
MK
543 );\r
544 AddTestCase (\r
545 ShimTests,\r
1436aea4
MK
546 "Locking a variable that already has an locked policy should succeed",\r
547 "LockAfterLockedPolicyMatchingData",\r
548 LockingALockedVariableWithMatchingDataShouldSucceed,\r
549 LibInitMocked,\r
550 LibCleanup,\r
551 NULL\r
dcaa9393
MK
552 );\r
553 AddTestCase (\r
554 ShimTests,\r
1436aea4
MK
555 "Locking a variable that already has an locked policy with matching data should succeed",\r
556 "LockAfterLockedPolicyNonMatchingData",\r
557 LockingALockedVariableWithNonMatchingDataShouldFail,\r
558 LibInitMocked,\r
559 LibCleanup,\r
560 NULL\r
dcaa9393
MK
561 );\r
562 AddTestCase (\r
563 ShimTests,\r
1436aea4
MK
564 "Adding a policy for a variable that has previously been locked should always fail",\r
565 "SetPolicyAfterLock",\r
566 SettingPolicyForALockedVariableShouldFail,\r
567 LibInitMocked,\r
568 LibCleanup,\r
569 NULL\r
dcaa9393
MK
570 );\r
571\r
572 //\r
573 // Execute the tests.\r
574 //\r
575 Status = RunAllTestSuites (Framework);\r
576\r
577EXIT:\r
578 if (Framework != NULL) {\r
579 FreeUnitTestFramework (Framework);\r
580 }\r
581\r
582 return;\r
583}\r
584\r
585///\r
586/// Avoid ECC error for function name that starts with lower case letter\r
587///\r
1436aea4 588#define Main main\r
dcaa9393
MK
589\r
590/**\r
591 Standard POSIX C entry point for host based unit test execution.\r
592\r
593 @param[in] Argc Number of arguments\r
594 @param[in] Argv Array of pointers to arguments\r
595\r
596 @retval 0 Success\r
597 @retval other Error\r
598**/\r
599INT32\r
600Main (\r
601 IN INT32 Argc,\r
602 IN CHAR8 *Argv[]\r
603 )\r
604{\r
605 UnitTestMain ();\r
606 return 0;\r
607}\r