UnitTestFrameworkPkg/Library: Add library instances
https://bugzilla.tianocore.org/show_bug.cgi?id=2505 Add the following library instances that are used to build unit tests for host and target environments. * CmockaLib with cmocka submodule to: https://git.cryptomilk.org/projects/cmocka.git * DebugLibPosix - Instance of DebugLib based on POSIX APIs (e.g. printf). * MemoryAllocationLibPosix - Instance of MemoryAllocationLib based on POSIX APIs (e.g. malloc/free). * UnitTestBootLibNull - Null instance of the UnitTestBootLib * UnitTestBootLibUsbClass - UnitTestBootLib instances that supports setting boot next to a USB device. * UnitTestLib - UnitTestLib instance that is designed to work with PEI, DXE, SMM, and UEFI Shell target environments. * UnitTestLibCmocka - UintTestLib instance that uses cmocka APIs and can only be use in a host environment. * UnitTestPersistenceLibNull - Null instance of the UnitTestPersistenceLib * UnitTestPersistenceLibSimpleFileSystem - UnitTestPersistenceLib instance that can safe the unit test framework state to a media device that supports the UEFI Simple File System Protocol. * UnitTestResultReportLibConOut - UnitTestResultReportLib instance that sends report results to the UEFI standard output console. * UnitTestResultReportLibDebugLib - UnitTestResultReportLib instance that sends report results to a DebugLib using DEBUG() macros. Cc: Sean Brogan <sean.brogan@microsoft.com> Cc: Bret Barkelew <Bret.Barkelew@microsoft.com> Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Bret Barkelew <Bret.Barkelew@microsoft.com>
This commit is contained in:
committed by
mergify[bot]
parent
0f7fb5c5e5
commit
0eb522987f
@@ -0,0 +1,216 @@
|
||||
/** @file
|
||||
Implement UnitTestResultReportLib doing plain txt out to console
|
||||
|
||||
Copyright (c) Microsoft Corporation.<BR>
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
|
||||
#include <Uefi.h>
|
||||
#include <Library/UnitTestResultReportLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
VOID
|
||||
ReportPrint (
|
||||
IN CONST CHAR8 *Format,
|
||||
...
|
||||
);
|
||||
|
||||
VOID
|
||||
ReportOutput (
|
||||
IN CONST CHAR8 *Output
|
||||
);
|
||||
|
||||
struct _UNIT_TEST_STATUS_STRING {
|
||||
UNIT_TEST_STATUS Status;
|
||||
CHAR8 *String;
|
||||
};
|
||||
|
||||
struct _UNIT_TEST_FAILURE_TYPE_STRING {
|
||||
FAILURE_TYPE Type;
|
||||
CHAR8 *String;
|
||||
};
|
||||
|
||||
struct _UNIT_TEST_STATUS_STRING mStatusStrings[] = {
|
||||
{ UNIT_TEST_PASSED, "PASSED"},
|
||||
{ UNIT_TEST_ERROR_PREREQUISITE_NOT_MET, "NOT RUN - PREREQUISITE FAILED"},
|
||||
{ UNIT_TEST_ERROR_TEST_FAILED, "FAILED"},
|
||||
{ UNIT_TEST_RUNNING, "RUNNING"},
|
||||
{ UNIT_TEST_PENDING, "PENDING"},
|
||||
{ 0, "**UNKNOWN**"}
|
||||
};
|
||||
|
||||
struct _UNIT_TEST_FAILURE_TYPE_STRING mFailureTypeStrings[] = {
|
||||
{ FAILURETYPE_NOFAILURE, "NO FAILURE"},
|
||||
{ FAILURETYPE_OTHER, "OTHER FAILURE"},
|
||||
{ FAILURETYPE_ASSERTTRUE, "ASSERT_TRUE FAILURE"},
|
||||
{ FAILURETYPE_ASSERTFALSE, "ASSERT_FALSE FAILURE"},
|
||||
{ FAILURETYPE_ASSERTEQUAL, "ASSERT_EQUAL FAILURE"},
|
||||
{ FAILURETYPE_ASSERTNOTEQUAL, "ASSERT_NOTEQUAL FAILURE"},
|
||||
{ FAILURETYPE_ASSERTNOTEFIERROR, "ASSERT_NOTEFIERROR FAILURE"},
|
||||
{ FAILURETYPE_ASSERTSTATUSEQUAL, "ASSERT_STATUSEQUAL FAILURE"},
|
||||
{ FAILURETYPE_ASSERTNOTNULL , "ASSERT_NOTNULL FAILURE"},
|
||||
{ 0, "*UNKNOWN* Failure"}
|
||||
};
|
||||
|
||||
//
|
||||
// TEST REPORTING FUNCTIONS
|
||||
//
|
||||
|
||||
STATIC
|
||||
CONST CHAR8*
|
||||
GetStringForUnitTestStatus (
|
||||
IN UNIT_TEST_STATUS Status
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
for (Index = 0; Index < ARRAY_SIZE (mStatusStrings); Index++) {
|
||||
if (mStatusStrings[Index].Status == Status) {
|
||||
//
|
||||
// Return string from matching entry
|
||||
//
|
||||
return mStatusStrings[Index].String;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Return last entry if no match found.
|
||||
//
|
||||
return mStatusStrings[Index].String;
|
||||
}
|
||||
|
||||
STATIC
|
||||
CONST CHAR8*
|
||||
GetStringForFailureType (
|
||||
IN FAILURE_TYPE Failure
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
for (Index = 0; Index < ARRAY_SIZE (mFailureTypeStrings); Index++) {
|
||||
if (mFailureTypeStrings[Index].Type == Failure) {
|
||||
//
|
||||
// Return string from matching entry
|
||||
//
|
||||
return mFailureTypeStrings[Index].String;
|
||||
}
|
||||
}
|
||||
//
|
||||
// Return last entry if no match found.
|
||||
//
|
||||
DEBUG((DEBUG_INFO, "%a Failure Type does not have string defined 0x%X\n", __FUNCTION__, (UINT32)Failure));
|
||||
return mFailureTypeStrings[Index].String;
|
||||
}
|
||||
|
||||
/*
|
||||
Method to print the Unit Test run results
|
||||
|
||||
@retval Success
|
||||
*/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
OutputUnitTestFrameworkReport (
|
||||
IN UNIT_TEST_FRAMEWORK_HANDLE FrameworkHandle
|
||||
)
|
||||
{
|
||||
UNIT_TEST_FRAMEWORK *Framework;
|
||||
INTN Passed;
|
||||
INTN Failed;
|
||||
INTN NotRun;
|
||||
UNIT_TEST_SUITE_LIST_ENTRY *Suite;
|
||||
UNIT_TEST_LIST_ENTRY *Test;
|
||||
INTN SPassed;
|
||||
INTN SFailed;
|
||||
INTN SNotRun;
|
||||
|
||||
Passed = 0;
|
||||
Failed = 0;
|
||||
NotRun = 0;
|
||||
Suite = NULL;
|
||||
|
||||
Framework = (UNIT_TEST_FRAMEWORK *)FrameworkHandle;
|
||||
if (Framework == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ReportPrint ("---------------------------------------------------------\n");
|
||||
ReportPrint ("------------- UNIT TEST FRAMEWORK RESULTS ---------------\n");
|
||||
ReportPrint ("---------------------------------------------------------\n");
|
||||
|
||||
//print the version and time
|
||||
|
||||
//
|
||||
// Iterate all suites
|
||||
//
|
||||
for (Suite = (UNIT_TEST_SUITE_LIST_ENTRY*)GetFirstNode(&Framework->TestSuiteList);
|
||||
(LIST_ENTRY*)Suite != &Framework->TestSuiteList;
|
||||
Suite = (UNIT_TEST_SUITE_LIST_ENTRY*)GetNextNode(&Framework->TestSuiteList, (LIST_ENTRY*)Suite)) {
|
||||
|
||||
Test = NULL;
|
||||
SPassed = 0;
|
||||
SFailed = 0;
|
||||
SNotRun = 0;
|
||||
|
||||
ReportPrint ("/////////////////////////////////////////////////////////\n");
|
||||
ReportPrint (" SUITE: %a\n", Suite->UTS.Title);
|
||||
ReportPrint (" PACKAGE: %a\n", Suite->UTS.Name);
|
||||
ReportPrint ("/////////////////////////////////////////////////////////\n");
|
||||
|
||||
//
|
||||
// Iterate all tests within the suite
|
||||
//
|
||||
for (Test = (UNIT_TEST_LIST_ENTRY*)GetFirstNode(&(Suite->UTS.TestCaseList));
|
||||
(LIST_ENTRY*)Test != &(Suite->UTS.TestCaseList);
|
||||
Test = (UNIT_TEST_LIST_ENTRY*)GetNextNode(&(Suite->UTS.TestCaseList), (LIST_ENTRY*)Test)) {
|
||||
|
||||
ReportPrint ("*********************************************************\n");
|
||||
ReportPrint (" CLASS NAME: %a\n", Test->UT.Name);
|
||||
ReportPrint (" TEST: %a\n", Test->UT.Description);
|
||||
ReportPrint (" STATUS: %a\n", GetStringForUnitTestStatus (Test->UT.Result));
|
||||
ReportPrint (" FAILURE: %a\n", GetStringForFailureType (Test->UT.FailureType));
|
||||
ReportPrint (" FAILURE MESSAGE:\n%a\n", Test->UT.FailureMessage);
|
||||
|
||||
if (Test->UT.Log != NULL) {
|
||||
ReportPrint (" LOG:\n");
|
||||
ReportOutput (Test->UT.Log);
|
||||
}
|
||||
|
||||
switch (Test->UT.Result) {
|
||||
case UNIT_TEST_PASSED:
|
||||
SPassed++;
|
||||
break;
|
||||
case UNIT_TEST_ERROR_TEST_FAILED:
|
||||
SFailed++;
|
||||
break;
|
||||
case UNIT_TEST_PENDING: // Fall through...
|
||||
case UNIT_TEST_RUNNING: // Fall through...
|
||||
case UNIT_TEST_ERROR_PREREQUISITE_NOT_MET:
|
||||
SNotRun++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
ReportPrint ("**********************************************************\n");
|
||||
} //End Test iteration
|
||||
|
||||
ReportPrint ("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
|
||||
ReportPrint ("Suite Stats\n");
|
||||
ReportPrint (" Passed: %d (%d%%)\n", SPassed, (SPassed * 100)/(SPassed+SFailed+SNotRun));
|
||||
ReportPrint (" Failed: %d (%d%%)\n", SFailed, (SFailed * 100) / (SPassed + SFailed + SNotRun));
|
||||
ReportPrint (" Not Run: %d (%d%%)\n", SNotRun, (SNotRun * 100) / (SPassed + SFailed + SNotRun));
|
||||
ReportPrint ("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n" );
|
||||
|
||||
Passed += SPassed; //add to global counters
|
||||
Failed += SFailed; //add to global counters
|
||||
NotRun += SNotRun; //add to global counters
|
||||
}//End Suite iteration
|
||||
|
||||
ReportPrint ("=========================================================\n");
|
||||
ReportPrint ("Total Stats\n");
|
||||
ReportPrint (" Passed: %d (%d%%)\n", Passed, (Passed * 100) / (Passed + Failed + NotRun));
|
||||
ReportPrint (" Failed: %d (%d%%)\n", Failed, (Failed * 100) / (Passed + Failed + NotRun));
|
||||
ReportPrint (" Not Run: %d (%d%%)\n", NotRun, (NotRun * 100) / (Passed + Failed + NotRun));
|
||||
ReportPrint ("=========================================================\n" );
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
@@ -0,0 +1,48 @@
|
||||
/** @file
|
||||
Implement UnitTestResultReportLib doing plain txt out to console
|
||||
|
||||
Copyright (c) Microsoft Corporation.<BR>
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
|
||||
#include <Uefi.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/PrintLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
VOID
|
||||
ReportPrint (
|
||||
IN CONST CHAR8 *Format,
|
||||
...
|
||||
)
|
||||
{
|
||||
VA_LIST Marker;
|
||||
CHAR16 String[256];
|
||||
UINTN Length;
|
||||
|
||||
VA_START (Marker, Format);
|
||||
Length = UnicodeVSPrintAsciiFormat (String, sizeof (String), Format, Marker);
|
||||
if (Length == 0) {
|
||||
DEBUG ((DEBUG_ERROR, "%a formatted string is too long\n", __FUNCTION__));
|
||||
} else {
|
||||
gST->ConOut->OutputString (gST->ConOut, String);
|
||||
}
|
||||
VA_END (Marker);
|
||||
}
|
||||
|
||||
VOID
|
||||
ReportOutput (
|
||||
IN CONST CHAR8 *Output
|
||||
)
|
||||
{
|
||||
CHAR8 AsciiString[128];
|
||||
UINTN Length;
|
||||
UINTN Index;
|
||||
|
||||
Length = AsciiStrLen (Output);
|
||||
for (Index = 0; Index < Length; Index += (sizeof (AsciiString) - 1)) {
|
||||
AsciiStrCpyS (AsciiString, sizeof (AsciiString), &Output[Index]);
|
||||
ReportPrint ("%a", AsciiString);
|
||||
}
|
||||
}
|
@@ -0,0 +1,29 @@
|
||||
## @file
|
||||
# Library to support printing out the unit test report to a UEFI console
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation.<BR>
|
||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010017
|
||||
BASE_NAME = UnitTestResultReportLibConOut
|
||||
MODULE_UNI_FILE = UnitTestResultReportLibConOut.uni
|
||||
FILE_GUID = C659641D-BA1F-4B58-946E-B1E1103903F9
|
||||
VERSION_STRING = 1.0
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
LIBRARY_CLASS = UnitTestResultReportLib
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
DebugLib
|
||||
UefiBootServicesTableLib
|
||||
PrintLib
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec
|
||||
|
||||
[Sources]
|
||||
UnitTestResultReportLib.c
|
||||
UnitTestResultReportLibConOut.c
|
@@ -0,0 +1,11 @@
|
||||
// /** @file
|
||||
// Library to support printing out the unit test report to a UEFI console
|
||||
//
|
||||
// Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
|
||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
// **/
|
||||
|
||||
#string STR_MODULE_ABSTRACT #language en-US "Library to support printing out the unit test report to a UEFI console"
|
||||
|
||||
#string STR_MODULE_DESCRIPTION #language en-US "Library to support printing out the unit test report to a UEFI console."
|
@@ -0,0 +1,47 @@
|
||||
/** @file
|
||||
Implement UnitTestResultReportLib doing plain txt out to console
|
||||
|
||||
Copyright (c) Microsoft Corporation.<BR>
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
|
||||
#include <Uefi.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/PrintLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
VOID
|
||||
ReportPrint (
|
||||
IN CONST CHAR8 *Format,
|
||||
...
|
||||
)
|
||||
{
|
||||
VA_LIST Marker;
|
||||
CHAR8 String[256];
|
||||
UINTN Length;
|
||||
|
||||
VA_START (Marker, Format);
|
||||
Length = AsciiVSPrint (String, sizeof (String), Format, Marker);
|
||||
if (Length == 0) {
|
||||
DEBUG ((DEBUG_ERROR, "%a formatted string is too long\n", __FUNCTION__));
|
||||
} else {
|
||||
DEBUG ((DEBUG_INFO, String));
|
||||
}
|
||||
VA_END (Marker);
|
||||
}
|
||||
|
||||
VOID
|
||||
ReportOutput (
|
||||
IN CONST CHAR8 *Output
|
||||
)
|
||||
{
|
||||
CHAR8 AsciiString[128];
|
||||
UINTN Length;
|
||||
UINTN Index;
|
||||
|
||||
Length = AsciiStrLen (Output);
|
||||
for (Index = 0; Index < Length; Index += (sizeof (AsciiString) - 1)) {
|
||||
AsciiStrCpyS (AsciiString, sizeof (AsciiString), &Output[Index]);
|
||||
DEBUG ((DEBUG_INFO, AsciiString));
|
||||
}
|
||||
}
|
@@ -0,0 +1,28 @@
|
||||
## @file
|
||||
# Library to support printing out the unit test report using DEBUG() macros.
|
||||
#
|
||||
# Copyright (c) Microsoft Corporation.<BR>
|
||||
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010017
|
||||
BASE_NAME = UnitTestResultReportLibDebugLib
|
||||
MODULE_UNI_FILE = UnitTestResultReportLibDebugLib.uni
|
||||
FILE_GUID = BED736D4-D197-475F-B7CE-0D828FF2C9A6
|
||||
VERSION_STRING = 1.0
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
LIBRARY_CLASS = UnitTestResultReportLib
|
||||
|
||||
[LibraryClasses]
|
||||
BaseLib
|
||||
DebugLib
|
||||
PrintLib
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec
|
||||
|
||||
[Sources]
|
||||
UnitTestResultReportLib.c
|
||||
UnitTestResultReportLibDebugLib.c
|
@@ -0,0 +1,11 @@
|
||||
// /** @file
|
||||
// Library to support printing out the unit test report using DEBUG() macros.
|
||||
//
|
||||
// Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
|
||||
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
// **/
|
||||
|
||||
#string STR_MODULE_ABSTRACT #language en-US "Library to support printing out the unit test report using DEBUG() macros"
|
||||
|
||||
#string STR_MODULE_DESCRIPTION #language en-US "Library to support printing out the unit test report using DEBUG() macros."
|
Reference in New Issue
Block a user