UnitTestResultReportLib.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /** @file
  2. Implement UnitTestResultReportLib doing plain txt out to console
  3. Copyright (c) Microsoft Corporation.<BR>
  4. SPDX-License-Identifier: BSD-2-Clause-Patent
  5. **/
  6. #include <Uefi.h>
  7. #include <Library/UnitTestResultReportLib.h>
  8. #include <Library/BaseLib.h>
  9. #include <Library/DebugLib.h>
  10. VOID
  11. EFIAPI
  12. ReportPrint (
  13. IN CONST CHAR8 *Format,
  14. ...
  15. );
  16. VOID
  17. ReportOutput (
  18. IN CONST CHAR8 *Output
  19. );
  20. struct _UNIT_TEST_STATUS_STRING {
  21. UNIT_TEST_STATUS Status;
  22. CHAR8 *String;
  23. };
  24. struct _UNIT_TEST_FAILURE_TYPE_STRING {
  25. FAILURE_TYPE Type;
  26. CHAR8 *String;
  27. };
  28. struct _UNIT_TEST_STATUS_STRING mStatusStrings[] = {
  29. { UNIT_TEST_PASSED, "PASSED" },
  30. { UNIT_TEST_ERROR_PREREQUISITE_NOT_MET, "NOT RUN - PREREQUISITE FAILED" },
  31. { UNIT_TEST_ERROR_TEST_FAILED, "FAILED" },
  32. { UNIT_TEST_RUNNING, "RUNNING" },
  33. { UNIT_TEST_PENDING, "PENDING" },
  34. { 0, "**UNKNOWN**" }
  35. };
  36. struct _UNIT_TEST_FAILURE_TYPE_STRING mFailureTypeStrings[] = {
  37. { FAILURETYPE_NOFAILURE, "NO FAILURE" },
  38. { FAILURETYPE_OTHER, "OTHER FAILURE" },
  39. { FAILURETYPE_ASSERTTRUE, "ASSERT_TRUE FAILURE" },
  40. { FAILURETYPE_ASSERTFALSE, "ASSERT_FALSE FAILURE" },
  41. { FAILURETYPE_ASSERTEQUAL, "ASSERT_EQUAL FAILURE" },
  42. { FAILURETYPE_ASSERTNOTEQUAL, "ASSERT_NOTEQUAL FAILURE" },
  43. { FAILURETYPE_ASSERTNOTEFIERROR, "ASSERT_NOTEFIERROR FAILURE" },
  44. { FAILURETYPE_ASSERTSTATUSEQUAL, "ASSERT_STATUSEQUAL FAILURE" },
  45. { FAILURETYPE_ASSERTNOTNULL, "ASSERT_NOTNULL FAILURE" },
  46. { FAILURETYPE_EXPECTASSERT, "EXPECT_ASSERT FAILURE" },
  47. { 0, "*UNKNOWN* Failure" }
  48. };
  49. //
  50. // TEST REPORTING FUNCTIONS
  51. //
  52. STATIC
  53. CONST CHAR8 *
  54. GetStringForUnitTestStatus (
  55. IN UNIT_TEST_STATUS Status
  56. )
  57. {
  58. UINTN Index;
  59. for (Index = 0; Index < ARRAY_SIZE (mStatusStrings) - 1; Index++) {
  60. if (mStatusStrings[Index].Status == Status) {
  61. //
  62. // Return string from matching entry
  63. //
  64. return mStatusStrings[Index].String;
  65. }
  66. }
  67. //
  68. // Return last entry if no match found.
  69. //
  70. return mStatusStrings[Index].String;
  71. }
  72. STATIC
  73. CONST CHAR8 *
  74. GetStringForFailureType (
  75. IN FAILURE_TYPE Failure
  76. )
  77. {
  78. UINTN Index;
  79. for (Index = 0; Index < ARRAY_SIZE (mFailureTypeStrings) - 1; Index++) {
  80. if (mFailureTypeStrings[Index].Type == Failure) {
  81. //
  82. // Return string from matching entry
  83. //
  84. return mFailureTypeStrings[Index].String;
  85. }
  86. }
  87. //
  88. // Return last entry if no match found.
  89. //
  90. DEBUG ((DEBUG_INFO, "%a Failure Type does not have string defined 0x%X\n", __FUNCTION__, (UINT32)Failure));
  91. return mFailureTypeStrings[Index].String;
  92. }
  93. /*
  94. Method to print the Unit Test run results
  95. @retval Success
  96. */
  97. EFI_STATUS
  98. EFIAPI
  99. OutputUnitTestFrameworkReport (
  100. IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle
  101. )
  102. {
  103. UNIT_TEST_FRAMEWORK *Framework;
  104. INTN Passed;
  105. INTN Failed;
  106. INTN NotRun;
  107. UNIT_TEST_SUITE_LIST_ENTRY *Suite;
  108. UNIT_TEST_LIST_ENTRY *Test;
  109. INTN SPassed;
  110. INTN SFailed;
  111. INTN SNotRun;
  112. Passed = 0;
  113. Failed = 0;
  114. NotRun = 0;
  115. Suite = NULL;
  116. Framework = (UNIT_TEST_FRAMEWORK *)FrameworkHandle;
  117. if (Framework == NULL) {
  118. return EFI_INVALID_PARAMETER;
  119. }
  120. ReportPrint ("---------------------------------------------------------\n");
  121. ReportPrint ("------------- UNIT TEST FRAMEWORK RESULTS ---------------\n");
  122. ReportPrint ("---------------------------------------------------------\n");
  123. // print the version and time
  124. //
  125. // Iterate all suites
  126. //
  127. for (Suite = (UNIT_TEST_SUITE_LIST_ENTRY *)GetFirstNode (&Framework->TestSuiteList);
  128. (LIST_ENTRY *)Suite != &Framework->TestSuiteList;
  129. Suite = (UNIT_TEST_SUITE_LIST_ENTRY *)GetNextNode (&Framework->TestSuiteList, (LIST_ENTRY *)Suite))
  130. {
  131. Test = NULL;
  132. SPassed = 0;
  133. SFailed = 0;
  134. SNotRun = 0;
  135. ReportPrint ("/////////////////////////////////////////////////////////\n");
  136. ReportPrint (" SUITE: %a\n", Suite->UTS.Title);
  137. ReportPrint (" PACKAGE: %a\n", Suite->UTS.Name);
  138. ReportPrint ("/////////////////////////////////////////////////////////\n");
  139. //
  140. // Iterate all tests within the suite
  141. //
  142. for (Test = (UNIT_TEST_LIST_ENTRY *)GetFirstNode (&(Suite->UTS.TestCaseList));
  143. (LIST_ENTRY *)Test != &(Suite->UTS.TestCaseList);
  144. Test = (UNIT_TEST_LIST_ENTRY *)GetNextNode (&(Suite->UTS.TestCaseList), (LIST_ENTRY *)Test))
  145. {
  146. ReportPrint ("*********************************************************\n");
  147. ReportPrint (" CLASS NAME: %a\n", Test->UT.Name);
  148. ReportPrint (" TEST: %a\n", Test->UT.Description);
  149. ReportPrint (" STATUS: %a\n", GetStringForUnitTestStatus (Test->UT.Result));
  150. ReportPrint (" FAILURE: %a\n", GetStringForFailureType (Test->UT.FailureType));
  151. ReportPrint (" FAILURE MESSAGE:\n%a\n", Test->UT.FailureMessage);
  152. if (Test->UT.Log != NULL) {
  153. ReportPrint (" LOG:\n");
  154. ReportOutput (Test->UT.Log);
  155. }
  156. switch (Test->UT.Result) {
  157. case UNIT_TEST_PASSED:
  158. SPassed++;
  159. break;
  160. case UNIT_TEST_ERROR_TEST_FAILED:
  161. SFailed++;
  162. break;
  163. case UNIT_TEST_PENDING: // Fall through...
  164. case UNIT_TEST_RUNNING: // Fall through...
  165. case UNIT_TEST_ERROR_PREREQUISITE_NOT_MET:
  166. SNotRun++;
  167. break;
  168. default:
  169. break;
  170. }
  171. ReportPrint ("**********************************************************\n");
  172. } // End Test iteration
  173. ReportPrint ("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
  174. ReportPrint ("Suite Stats\n");
  175. ReportPrint (" Passed: %d (%d%%)\n", SPassed, (SPassed * 100)/(SPassed+SFailed+SNotRun));
  176. ReportPrint (" Failed: %d (%d%%)\n", SFailed, (SFailed * 100) / (SPassed + SFailed + SNotRun));
  177. ReportPrint (" Not Run: %d (%d%%)\n", SNotRun, (SNotRun * 100) / (SPassed + SFailed + SNotRun));
  178. ReportPrint ("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
  179. Passed += SPassed; // add to global counters
  180. Failed += SFailed; // add to global counters
  181. NotRun += SNotRun; // add to global counters
  182. }// End Suite iteration
  183. ReportPrint ("=========================================================\n");
  184. ReportPrint ("Total Stats\n");
  185. ReportPrint (" Passed: %d (%d%%)\n", Passed, (Passed * 100) / (Passed + Failed + NotRun));
  186. ReportPrint (" Failed: %d (%d%%)\n", Failed, (Failed * 100) / (Passed + Failed + NotRun));
  187. ReportPrint (" Not Run: %d (%d%%)\n", NotRun, (NotRun * 100) / (Passed + Failed + NotRun));
  188. ReportPrint ("=========================================================\n");
  189. return EFI_SUCCESS;
  190. }