DxePrmContextBufferLibUnitTest.c 26 KB

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