2 Implement UnitTestResultReportLib doing plain txt out to console
4 Copyright (c) Microsoft Corporation.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include <Library/UnitTestResultReportLib.h>
10 #include <Library/BaseLib.h>
11 #include <Library/DebugLib.h>
15 IN CONST CHAR8
*Format
,
21 IN CONST CHAR8
*Output
24 struct _UNIT_TEST_STATUS_STRING
{
25 UNIT_TEST_STATUS Status
;
29 struct _UNIT_TEST_FAILURE_TYPE_STRING
{
34 struct _UNIT_TEST_STATUS_STRING mStatusStrings
[] = {
35 { UNIT_TEST_PASSED
, "PASSED"},
36 { UNIT_TEST_ERROR_PREREQUISITE_NOT_MET
, "NOT RUN - PREREQUISITE FAILED"},
37 { UNIT_TEST_ERROR_TEST_FAILED
, "FAILED"},
38 { UNIT_TEST_RUNNING
, "RUNNING"},
39 { UNIT_TEST_PENDING
, "PENDING"},
43 struct _UNIT_TEST_FAILURE_TYPE_STRING mFailureTypeStrings
[] = {
44 { FAILURETYPE_NOFAILURE
, "NO FAILURE"},
45 { FAILURETYPE_OTHER
, "OTHER FAILURE"},
46 { FAILURETYPE_ASSERTTRUE
, "ASSERT_TRUE FAILURE"},
47 { FAILURETYPE_ASSERTFALSE
, "ASSERT_FALSE FAILURE"},
48 { FAILURETYPE_ASSERTEQUAL
, "ASSERT_EQUAL FAILURE"},
49 { FAILURETYPE_ASSERTNOTEQUAL
, "ASSERT_NOTEQUAL FAILURE"},
50 { FAILURETYPE_ASSERTNOTEFIERROR
, "ASSERT_NOTEFIERROR FAILURE"},
51 { FAILURETYPE_ASSERTSTATUSEQUAL
, "ASSERT_STATUSEQUAL FAILURE"},
52 { FAILURETYPE_ASSERTNOTNULL
, "ASSERT_NOTNULL FAILURE"},
53 { 0, "*UNKNOWN* Failure"}
57 // TEST REPORTING FUNCTIONS
62 GetStringForUnitTestStatus (
63 IN UNIT_TEST_STATUS Status
68 for (Index
= 0; Index
< ARRAY_SIZE (mStatusStrings
) - 1; Index
++) {
69 if (mStatusStrings
[Index
].Status
== Status
) {
71 // Return string from matching entry
73 return mStatusStrings
[Index
].String
;
77 // Return last entry if no match found.
79 return mStatusStrings
[Index
].String
;
84 GetStringForFailureType (
85 IN FAILURE_TYPE Failure
90 for (Index
= 0; Index
< ARRAY_SIZE (mFailureTypeStrings
) - 1; Index
++) {
91 if (mFailureTypeStrings
[Index
].Type
== Failure
) {
93 // Return string from matching entry
95 return mFailureTypeStrings
[Index
].String
;
99 // Return last entry if no match found.
101 DEBUG((DEBUG_INFO
, "%a Failure Type does not have string defined 0x%X\n", __FUNCTION__
, (UINT32
)Failure
));
102 return mFailureTypeStrings
[Index
].String
;
106 Method to print the Unit Test run results
112 OutputUnitTestFrameworkReport (
113 IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle
116 UNIT_TEST_FRAMEWORK
*Framework
;
120 UNIT_TEST_SUITE_LIST_ENTRY
*Suite
;
121 UNIT_TEST_LIST_ENTRY
*Test
;
131 Framework
= (UNIT_TEST_FRAMEWORK
*)FrameworkHandle
;
132 if (Framework
== NULL
) {
133 return EFI_INVALID_PARAMETER
;
136 ReportPrint ("---------------------------------------------------------\n");
137 ReportPrint ("------------- UNIT TEST FRAMEWORK RESULTS ---------------\n");
138 ReportPrint ("---------------------------------------------------------\n");
140 //print the version and time
143 // Iterate all suites
145 for (Suite
= (UNIT_TEST_SUITE_LIST_ENTRY
*)GetFirstNode(&Framework
->TestSuiteList
);
146 (LIST_ENTRY
*)Suite
!= &Framework
->TestSuiteList
;
147 Suite
= (UNIT_TEST_SUITE_LIST_ENTRY
*)GetNextNode(&Framework
->TestSuiteList
, (LIST_ENTRY
*)Suite
)) {
154 ReportPrint ("/////////////////////////////////////////////////////////\n");
155 ReportPrint (" SUITE: %a\n", Suite
->UTS
.Title
);
156 ReportPrint (" PACKAGE: %a\n", Suite
->UTS
.Name
);
157 ReportPrint ("/////////////////////////////////////////////////////////\n");
160 // Iterate all tests within the suite
162 for (Test
= (UNIT_TEST_LIST_ENTRY
*)GetFirstNode(&(Suite
->UTS
.TestCaseList
));
163 (LIST_ENTRY
*)Test
!= &(Suite
->UTS
.TestCaseList
);
164 Test
= (UNIT_TEST_LIST_ENTRY
*)GetNextNode(&(Suite
->UTS
.TestCaseList
), (LIST_ENTRY
*)Test
)) {
166 ReportPrint ("*********************************************************\n");
167 ReportPrint (" CLASS NAME: %a\n", Test
->UT
.Name
);
168 ReportPrint (" TEST: %a\n", Test
->UT
.Description
);
169 ReportPrint (" STATUS: %a\n", GetStringForUnitTestStatus (Test
->UT
.Result
));
170 ReportPrint (" FAILURE: %a\n", GetStringForFailureType (Test
->UT
.FailureType
));
171 ReportPrint (" FAILURE MESSAGE:\n%a\n", Test
->UT
.FailureMessage
);
173 if (Test
->UT
.Log
!= NULL
) {
174 ReportPrint (" LOG:\n");
175 ReportOutput (Test
->UT
.Log
);
178 switch (Test
->UT
.Result
) {
179 case UNIT_TEST_PASSED
:
182 case UNIT_TEST_ERROR_TEST_FAILED
:
185 case UNIT_TEST_PENDING
: // Fall through...
186 case UNIT_TEST_RUNNING
: // Fall through...
187 case UNIT_TEST_ERROR_PREREQUISITE_NOT_MET
:
193 ReportPrint ("**********************************************************\n");
194 } //End Test iteration
196 ReportPrint ("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
197 ReportPrint ("Suite Stats\n");
198 ReportPrint (" Passed: %d (%d%%)\n", SPassed
, (SPassed
* 100)/(SPassed
+SFailed
+SNotRun
));
199 ReportPrint (" Failed: %d (%d%%)\n", SFailed
, (SFailed
* 100) / (SPassed
+ SFailed
+ SNotRun
));
200 ReportPrint (" Not Run: %d (%d%%)\n", SNotRun
, (SNotRun
* 100) / (SPassed
+ SFailed
+ SNotRun
));
201 ReportPrint ("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n" );
203 Passed
+= SPassed
; //add to global counters
204 Failed
+= SFailed
; //add to global counters
205 NotRun
+= SNotRun
; //add to global counters
206 }//End Suite iteration
208 ReportPrint ("=========================================================\n");
209 ReportPrint ("Total Stats\n");
210 ReportPrint (" Passed: %d (%d%%)\n", Passed
, (Passed
* 100) / (Passed
+ Failed
+ NotRun
));
211 ReportPrint (" Failed: %d (%d%%)\n", Failed
, (Failed
* 100) / (Passed
+ Failed
+ NotRun
));
212 ReportPrint (" Not Run: %d (%d%%)\n", NotRun
, (NotRun
* 100) / (Passed
+ Failed
+ NotRun
));
213 ReportPrint ("=========================================================\n" );