Reviewed-by: Bret Barkelew - Bret From: Michael D Kinney via groups.io Sent: Tuesday, July 14, 2020 9:26 AM To: liming.gao; devel@edk2.groups.io; Kinney, Michael D Cc: Sean Brogan; Bret Barkelew; Yao, Jiewen Subject: [EXTERNAL] Re: [edk2-devel] [Patch v3 12/16] UnitTestFrameworkPkg/UnitTestLib: Add checks for ASSERT() Liming, I will fix that one issue in the INF comment block when I push the commits. Thanks, Mike > -----Original Message----- > From: Gao, Liming > Sent: Monday, July 13, 2020 11:57 PM > To: devel@edk2.groups.io; Kinney, Michael D > > Cc: Sean Brogan ; Bret > Barkelew ; Yao, Jiewen > > Subject: RE: [edk2-devel] [Patch v3 12/16] > UnitTestFrameworkPkg/UnitTestLib: Add checks for > ASSERT() > > Mike: > > -----Original Message----- > From: devel@edk2.groups.io On > Behalf Of Michael D Kinney > Sent: 2020年7月11日 10:09 > To: devel@edk2.groups.io > Cc: Sean Brogan ; Bret > Barkelew ; Yao, Jiewen > > Subject: [edk2-devel] [Patch v3 12/16] > UnitTestFrameworkPkg/UnitTestLib: Add checks for > ASSERT() > > REF: REF: > https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbugzilla.tianocore.org%2Fshow_bug.cgi%3Fid%3D2801&data=02%7C01%7Cbret.barkelew%40microsoft.com%7C3b85c7dd72af42d6295508d82812a84a%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C637303407889843281&sdata=5fA35uRcosAAp0%2B1RVFoCLsGzAaqvc92dmxSVrwDJsY%3D&reserved=0 > > Add UnitTestDebugAssertLib that provides the > UnitTestDebugAssert() service and the > gUnitTestExpectAssertFailureJumpBuffer global variable. > This NULL library is linked against all host and target > unit test builds. This guarantees that the > UnitTestDebugAssert() service is available to link > against all libraries and modules that use the DebugLib > class. > > EDKII_UNIT_TEST_FRAMEWORK_ENABLED must always be defined > when building unit tests so the behavior of the DebugLib > ASSERT() macros can be adjusted to allow the unit test > framework to catch an ASSERT() if it is triggered by a > function under test. > > Cc: Sean Brogan > Cc: Bret Barkelew > Cc: Jiewen Yao > Signed-off-by: Michael D Kinney > > --- > .../UnitTestDebugAssertLib.c | 49 > +++++ > .../UnitTestDebugAssertLib.inf | 31 +++ > .../UnitTestDebugAssertLib.uni | 11 + > .../Library/UnitTestLib/Assert.c | 203 > ++++++++++++------ > .../Library/UnitTestLib/AssertCmocka.c | 68 > ++++++ > .../Library/UnitTestLib/RunTests.c | 23 +- > .../UnitTestResultReportLib.c | 3 +- > .../PrivateInclude/UnitTestFrameworkTypes.h | 1 + > .../Test/UnitTestFrameworkPkgHostTest.dsc | 2 +- > UnitTestFrameworkPkg/UnitTestFrameworkPkg.dsc | 1 + > .../UnitTestFrameworkPkgTarget.dsc.inc | 6 +- > 11 files changed, 328 insertions(+), 70 deletions(-) > create mode 100644 > UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Unit > TestDebugAssertLib.c > create mode 100644 > UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Unit > TestDebugAssertLib.inf > create mode 100644 > UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Unit > TestDebugAssertLib.uni > > diff --git > a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Un > itTestDebugAssertLib.c > b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Un > itTestDebugAssertLib.c > new file mode 100644 > index 0000000000..0a4001e182 > --- /dev/null > +++ > b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Un > itTestDebugA > +++ ssertLib.c > @@ -0,0 +1,49 @@ > +/** @file > + Unit Test Debug Assert Library > + > + Copyright (c) 2020, Intel Corporation. All rights > reserved.
> + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#include > +#include > +#include > + > +/// > +/// Point to jump buffer used with SetJump()/LongJump() > to test if a > +function /// under test generates an expected ASSERT() > condition. > +/// > +BASE_LIBRARY_JUMP_BUFFER > *gUnitTestExpectAssertFailureJumpBuffer = > +NULL; > + > +/** > + Unit test library replacement for DebugAssert() in > DebugLib. > + > + If FileName is NULL, then a string of > "(NULL) Filename" is printed. > + If Description is NULL, then a string > of "(NULL) Description" is printed. > + > + @param FileName The pointer to the name of the > source file that generated the assert condition. > + @param LineNumber The line number in the source > file that generated the assert condition > + @param Description The pointer to the description > of the assert condition. > + > +**/ > +VOID > +EFIAPI > +UnitTestDebugAssert ( > + IN CONST CHAR8 *FileName, > + IN UINTN LineNumber, > + IN CONST CHAR8 *Description > + ) > +{ > + CHAR8 Message[256]; > + > + if (gUnitTestExpectAssertFailureJumpBuffer != NULL) { > + UT_LOG_INFO ("Detected expected ASSERT: %a(%d): > %a\n", FileName, LineNumber, Description); > + LongJump (gUnitTestExpectAssertFailureJumpBuffer, > 1); > + } else { > + AsciiStrCpyS (Message, sizeof(Message), "Detected > unexpected ASSERT("); > + AsciiStrCatS (Message, sizeof(Message), > Description); > + AsciiStrCatS (Message, sizeof(Message), ")"); > + UnitTestAssertTrue (FALSE, "", LineNumber, > FileName, Message); > + } > +} > diff --git > a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Un > itTestDebugAssertLib.inf > b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Un > itTestDebugAssertLib.inf > new file mode 100644 > index 0000000000..e6ccab0dd9 > --- /dev/null > +++ > b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Un > itTestDebugA > +++ ssertLib.inf > @@ -0,0 +1,31 @@ > +## @file > +# Unit Test Debug Assert Library > +# > +# Copyright (c) 2020, Intel Corporation. All rights > reserved.
# > +SPDX-License-Identifier: BSD-2-Clause-Patent # ## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = > UnitTestDebugAssertLib > + MODULE_UNI_FILE = > UnitTestDebugAssertLib.uni > + FILE_GUID = 9D53AD0D-5416-451F- > A5BF-E5420051A99B > + MODULE_TYPE = BASE > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = NULL > + > +# > +# VALID_ARCHITECTURES = ARM AARCH64 > +# > > Seemly, this comment is incorrect. Valid arch should > include IA32 and X64. Right? > > Thanks > Liming > > + > +[Sources] > + UnitTestDebugAssertLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec > + > +[LibraryClasses] > + BaseLib > + UnitTestLib > diff --git > a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Un > itTestDebugAssertLib.uni > b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Un > itTestDebugAssertLib.uni > new file mode 100644 > index 0000000000..9b794aa205 > --- /dev/null > +++ > b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Un > itTestDebugA > +++ ssertLib.uni > @@ -0,0 +1,11 @@ > +// /** @file > +// Unit Test Debug Assert Library > +// > +// Copyright (c) 2020, Intel Corporation. All rights > reserved.
// > +SPDX-License-Identifier: BSD-2-Clause-Patent // // **/ > + > +#string STR_MODULE_ABSTRACT #language en-US > "Unit Test Debug Assert Library" > + > +#string STR_MODULE_DESCRIPTION #language en-US > "Unit Test Debug Assert Library" > diff --git > a/UnitTestFrameworkPkg/Library/UnitTestLib/Assert.c > b/UnitTestFrameworkPkg/Library/UnitTestLib/Assert.c > index 8a131fab2b..3669d63701 100644 > --- a/UnitTestFrameworkPkg/Library/UnitTestLib/Assert.c > +++ b/UnitTestFrameworkPkg/Library/UnitTestLib/Assert.c > @@ -13,6 +13,8 @@ > #include > #include > > +extern BASE_LIBRARY_JUMP_BUFFER gUnitTestJumpBuffer; > + > STATIC > EFI_STATUS > AddUnitTestFailure ( > @@ -71,7 +73,7 @@ UnitTestLogFailure ( > FailureType > ); > > - return; > + LongJump (&gUnitTestJumpBuffer, 1); > } > > /** > @@ -103,6 +105,12 @@ UnitTestAssertTrue ( > ) > { > if (!Expression) { > + UT_LOG_ERROR ( > + "[ASSERT FAIL] %a:%d: Expression (%a) is not > TRUE!\n", > + FileName, > + LineNumber, > + Description > + ); > UnitTestLogFailure ( > FAILURETYPE_ASSERTTRUE, > "%a:%d: Expression (%a) is not TRUE!\n", @@ - > 110,12 +118,6 @@ UnitTestAssertTrue ( > LineNumber, > Description > ); > - UT_LOG_ERROR ( > - "[ASSERT FAIL] %a:%d: Expression (%a) is not > TRUE!\n", > - FileName, > - LineNumber, > - Description > - ); > } > return Expression; > } > @@ -149,6 +151,12 @@ UnitTestAssertFalse ( > ) > { > if (Expression) { > + UT_LOG_ERROR ( > + "[ASSERT FAIL] %a:%d: Expression (%a) is not > FALSE!\n", > + FileName, > + LineNumber, > + Description > + ); > UnitTestLogFailure ( > FAILURETYPE_ASSERTFALSE, > "%a:%d: Expression(%a) is not FALSE!\n", @@ - > 156,12 +164,6 @@ UnitTestAssertFalse ( > LineNumber, > Description > ); > - UT_LOG_ERROR ( > - "[ASSERT FAIL] %a:%d: Expression (%a) is not > FALSE!\n", > - FileName, > - LineNumber, > - Description > - ); > } > return !Expression; > } > @@ -195,6 +197,13 @@ UnitTestAssertNotEfiError ( > ) > { > if (EFI_ERROR (Status)) { > + UT_LOG_ERROR ( > + "[ASSERT FAIL] %a:%d: Status '%a' is EFI_ERROR > (%r)!\n", > + FileName, > + LineNumber, > + Description, > + Status > + ); > UnitTestLogFailure ( > FAILURETYPE_ASSERTNOTEFIERROR, > "%a:%d: Status '%a' is EFI_ERROR (%r)!\n", @@ - > 203,13 +212,6 @@ UnitTestAssertNotEfiError ( > Description, > Status > ); > - UT_LOG_ERROR ( > - "[ASSERT FAIL] %a:%d: Status '%a' is EFI_ERROR > (%r)!\n", > - FileName, > - LineNumber, > - Description, > - Status > - ); > } > return !EFI_ERROR( Status ); > } > @@ -248,16 +250,6 @@ UnitTestAssertEqual ( > ) > { > if (ValueA != ValueB) { > - UnitTestLogFailure ( > - FAILURETYPE_ASSERTEQUAL, > - "%a:%d: Value %a != %a (%d != %d)!\n", > - FileName, > - LineNumber, > - DescriptionA, > - DescriptionB, > - ValueA, > - ValueB > - ); > UT_LOG_ERROR ( > "[ASSERT FAIL] %a:%d: Value %a != %a (%d != > %d)!\n", > FileName, > @@ -267,6 +259,16 @@ UnitTestAssertEqual ( > ValueA, > ValueB > ); > + UnitTestLogFailure ( > + FAILURETYPE_ASSERTEQUAL, > + "%a:%d: Value %a != %a (%d != %d)!\n", > + FileName, > + LineNumber, > + DescriptionA, > + DescriptionB, > + ValueA, > + ValueB > + ); > } > return (ValueA == ValueB); > } > @@ -310,15 +312,6 @@ UnitTestAssertMemEqual ( > ) > { > if (CompareMem(BufferA, BufferB, Length) != 0) { > - UnitTestLogFailure ( > - FAILURETYPE_ASSERTEQUAL, > - "%a:%d: Memory at %a != %a for length %d > bytes!\n", > - FileName, > - LineNumber, > - DescriptionA, > - DescriptionB, > - Length > - ); > UT_LOG_ERROR ( > "[ASSERT FAIL] %a:%d: Value %a != %a for length > %d bytes!\n", > FileName, > @@ -327,6 +320,15 @@ UnitTestAssertMemEqual ( > DescriptionB, > Length > ); > + UnitTestLogFailure ( > + FAILURETYPE_ASSERTEQUAL, > + "%a:%d: Memory at %a != %a for length %d > bytes!\n", > + FileName, > + LineNumber, > + DescriptionA, > + DescriptionB, > + Length > + ); > return FALSE; > } > return TRUE; > @@ -366,6 +368,15 @@ UnitTestAssertNotEqual ( > ) > { > if (ValueA == ValueB) { > + UT_LOG_ERROR ( > + "[ASSERT FAIL] %a:%d: Value %a == %a (%d == > %d)!\n", > + FileName, > + LineNumber, > + DescriptionA, > + DescriptionB, > + ValueA, > + ValueB > + ); > UnitTestLogFailure ( > FAILURETYPE_ASSERTNOTEQUAL, > "%a:%d: Value %a == %a (%d == %d)!\n", @@ -376,15 > +387,6 @@ UnitTestAssertNotEqual ( > ValueA, > ValueB > ); > - UT_LOG_ERROR ( > - "[ASSERT FAIL] %a:%d: Value %a == %a (%d == > %d)!\n", > - FileName, > - LineNumber, > - DescriptionA, > - DescriptionB, > - ValueA, > - ValueB > - ); > } > return (ValueA != ValueB); > } > @@ -421,6 +423,14 @@ UnitTestAssertStatusEqual ( > ) > { > if (Status != Expected) { > + UT_LOG_ERROR ( > + "[ASSERT FAIL] %a:%d: Status '%a' is %r, should > be %r!\n", > + FileName, > + LineNumber, > + Description, > + Status, > + Expected > + ); > UnitTestLogFailure ( > FAILURETYPE_ASSERTSTATUSEQUAL, > "%a:%d: Status '%a' is %r, should be %r!\n", @@ - > 430,14 +440,6 @@ UnitTestAssertStatusEqual ( > Status, > Expected > ); > - UT_LOG_ERROR ( > - "[ASSERT FAIL] %a:%d: Status '%a' is %r, should > be %r!\n", > - FileName, > - LineNumber, > - Description, > - Status, > - Expected > - ); > } > return (Status == Expected); > } > @@ -473,6 +475,12 @@ UnitTestAssertNotNull ( > ) > { > if (Pointer == NULL) { > + UT_LOG_ERROR ( > + "[ASSERT FAIL] %a:%d: Pointer (%a) is NULL!\n", > + FileName, > + LineNumber, > + PointerName > + ); > UnitTestLogFailure ( > FAILURETYPE_ASSERTNOTNULL, > "%a:%d: Pointer (%a) is NULL!\n", @@ -480,12 > +488,83 @@ UnitTestAssertNotNull ( > LineNumber, > PointerName > ); > - UT_LOG_ERROR ( > - "[ASSERT FAIL] %a:%d: Pointer (%a) is NULL!\n", > - FileName, > - LineNumber, > - PointerName > - ); > } > return (Pointer != NULL); > } > + > +/** > + If UnitTestStatus is UNIT_TEST_PASSED, then log an > info message and > +return > + TRUE because an ASSERT() was expected when > FunctionCall was executed > +and an > + ASSERT() was triggered. If UnitTestStatus is > UNIT_TEST_SKIPPED, then > +log a > + warning message and return TRUE because ASSERT() > macros are disabled. > +If > + UnitTestStatus is UNIT_TEST_ERROR_TEST_FAILED, then > log an error > +message and > + return FALSE because an ASSERT() was expected when > FunctionCall was > +executed, > + but no ASSERT() conditions were triggered. The log > messages contain > + FunctionName, LineNumber, and FileName strings to > provide the > +location of the > + UT_EXPECT_ASSERT_FAILURE() macro. > + > + @param[in] UnitTestStatus The status from > UT_EXPECT_ASSERT_FAILURE() that > + is either pass, skipped, > or failed. > + @param[in] FunctionName Null-terminated ASCII > string of the function > + executing the > UT_EXPECT_ASSERT_FAILURE() macro. > + @param[in] LineNumber The source file line > number of the the function > + executing the > UT_EXPECT_ASSERT_FAILURE() macro. > + @param[in] FileName Null-terminated ASCII > string of the filename > + executing the > UT_EXPECT_ASSERT_FAILURE() macro. > + @param[in] FunctionCall Null-terminated ASCII > string of the function call > + executed by the > UT_EXPECT_ASSERT_FAILURE() macro. > + @param[out] ResultStatus Used to return the > UnitTestStatus value to the > + caller of > UT_EXPECT_ASSERT_FAILURE(). This is > + optional parameter that > may be NULL. > + > + @retval TRUE UnitTestStatus is UNIT_TEST_PASSED. > + @retval TRUE UnitTestStatus is UNIT_TEST_SKIPPED. > + @retval FALSE UnitTestStatus is > UNIT_TEST_ERROR_TEST_FAILED. > +**/ > +BOOLEAN > +EFIAPI > +UnitTestExpectAssertFailure ( > + IN UNIT_TEST_STATUS UnitTestStatus, > + IN CONST CHAR8 *FunctionName, > + IN UINTN LineNumber, > + IN CONST CHAR8 *FileName, > + IN CONST CHAR8 *FunctionCall, > + OUT UNIT_TEST_STATUS *ResultStatus OPTIONAL > + ) > +{ > + if (ResultStatus != NULL) { > + *ResultStatus = UnitTestStatus; > + } > + if (UnitTestStatus == UNIT_TEST_PASSED) { > + UT_LOG_INFO ( > + "[ASSERT PASS] %a:%d: > UT_EXPECT_ASSERT_FAILURE(%a) detected expected > assert\n", > + FileName, > + LineNumber, > + FunctionCall > + ); > + } > + if (UnitTestStatus == UNIT_TEST_SKIPPED) { > + UT_LOG_WARNING ( > + "[ASSERT WARN] %a:%d: > UT_EXPECT_ASSERT_FAILURE(%a) disabled\n", > + FileName, > + LineNumber, > + FunctionCall > + ); > + } > + if (UnitTestStatus == UNIT_TEST_ERROR_TEST_FAILED) { > + UT_LOG_ERROR ( > + "[ASSERT FAIL] %a:%d: Function call (%a) did not > ASSERT()!\n", > + FileName, > + LineNumber, > + FunctionCall > + ); > + UnitTestLogFailure ( > + FAILURETYPE_EXPECTASSERT, > + "%a:%d: Function call (%a) did not ASSERT()!\n", > + FileName, > + LineNumber, > + FunctionCall > + ); > + } > + return (UnitTestStatus != > UNIT_TEST_ERROR_TEST_FAILED); } > diff --git > a/UnitTestFrameworkPkg/Library/UnitTestLib/AssertCmocka. > c > b/UnitTestFrameworkPkg/Library/UnitTestLib/AssertCmocka. > c > index e48d614976..687c6243ab 100644 > --- > a/UnitTestFrameworkPkg/Library/UnitTestLib/AssertCmocka. > c > +++ > b/UnitTestFrameworkPkg/Library/UnitTestLib/AssertCmocka. > c > @@ -333,3 +333,71 @@ UnitTestAssertNotNull ( > > return (Pointer != NULL); > } > + > +/** > + If UnitTestStatus is UNIT_TEST_PASSED, then log an > info message and > +return > + TRUE because an ASSERT() was expected when > FunctionCall was executed > +and an > + ASSERT() was triggered. If UnitTestStatus is > UNIT_TEST_SKIPPED, then > +log a > + warning message and return TRUE because ASSERT() > macros are disabled. > +If > + UnitTestStatus is UNIT_TEST_ERROR_TEST_FAILED, then > log an error > +message and > + return FALSE because an ASSERT() was expected when > FunctionCall was > +executed, > + but no ASSERT() conditions were triggered. The log > messages contain > + FunctionName, LineNumber, and FileName strings to > provide the > +location of the > + UT_EXPECT_ASSERT_FAILURE() macro. > + > + @param[in] UnitTestStatus The status from > UT_EXPECT_ASSERT_FAILURE() that > + is either pass, skipped, > or failed. > + @param[in] FunctionName Null-terminated ASCII > string of the function > + executing the > UT_EXPECT_ASSERT_FAILURE() macro. > + @param[in] LineNumber The source file line > number of the the function > + executing the > UT_EXPECT_ASSERT_FAILURE() macro. > + @param[in] FileName Null-terminated ASCII > string of the filename > + executing the > UT_EXPECT_ASSERT_FAILURE() macro. > + @param[in] FunctionCall Null-terminated ASCII > string of the function call > + executed by the > UT_EXPECT_ASSERT_FAILURE() macro. > + @param[out] ResultStatus Used to return the > UnitTestStatus value to the > + caller of > UT_EXPECT_ASSERT_FAILURE(). This is > + optional parameter that > may be NULL. > + > + @retval TRUE UnitTestStatus is UNIT_TEST_PASSED. > + @retval TRUE UnitTestStatus is UNIT_TEST_SKIPPED. > + @retval FALSE UnitTestStatus is > UNIT_TEST_ERROR_TEST_FAILED. > +**/ > +BOOLEAN > +EFIAPI > +UnitTestExpectAssertFailure ( > + IN UNIT_TEST_STATUS UnitTestStatus, > + IN CONST CHAR8 *FunctionName, > + IN UINTN LineNumber, > + IN CONST CHAR8 *FileName, > + IN CONST CHAR8 *FunctionCall, > + OUT UNIT_TEST_STATUS *ResultStatus OPTIONAL > + ) > +{ > + CHAR8 TempStr[MAX_STRING_SIZE]; > + > + if (ResultStatus != NULL) { > + *ResultStatus = UnitTestStatus; > + } > + if (UnitTestStatus == UNIT_TEST_PASSED) { > + UT_LOG_INFO ( > + "[ASSERT PASS] %a:%d: > UT_EXPECT_ASSERT_FAILURE(%a) detected expected > assert\n", > + FileName, > + LineNumber, > + FunctionCall > + ); > + } > + if (UnitTestStatus == UNIT_TEST_SKIPPED) { > + UT_LOG_WARNING ( > + "[ASSERT WARN] %a:%d: > UT_EXPECT_ASSERT_FAILURE(%a) disabled\n", > + FileName, > + LineNumber, > + FunctionCall > + ); > + } > + if (UnitTestStatus == UNIT_TEST_ERROR_TEST_FAILED) { > + snprintf (TempStr, sizeof(TempStr), > "UT_EXPECT_ASSERT_FAILURE(%s) did not trigger ASSERT()", > FunctionCall); > + _assert_true (FALSE, TempStr, FileName, > (INT32)LineNumber); > + } > + return (UnitTestStatus != > UNIT_TEST_ERROR_TEST_FAILED); } > diff --git > a/UnitTestFrameworkPkg/Library/UnitTestLib/RunTests.c > b/UnitTestFrameworkPkg/Library/UnitTestLib/RunTests.c > index 793335fd0f..2dc1d159d5 100644 > --- > a/UnitTestFrameworkPkg/Library/UnitTestLib/RunTests.c > +++ > b/UnitTestFrameworkPkg/Library/UnitTestLib/RunTests.c > @@ -14,6 +14,8 @@ > > STATIC UNIT_TEST_FRAMEWORK_HANDLE mFrameworkHandle = > NULL; > > +BASE_LIBRARY_JUMP_BUFFER gUnitTestJumpBuffer; > + > UNIT_TEST_FRAMEWORK_HANDLE > GetActiveFrameworkHandle ( > VOID > @@ -75,7 +77,14 @@ RunTestSuite ( > // Next, if we're still running, make sure that our > test prerequisites are in place. > if (Test->Result == UNIT_TEST_PENDING && Test- > >Prerequisite != NULL) { > DEBUG ((DEBUG_VERBOSE, "PREREQ\n")); > - if (Test->Prerequisite (Test->Context) != > UNIT_TEST_PASSED) { > + if (SetJump (&gUnitTestJumpBuffer) == 0) { > + if (Test->Prerequisite (Test->Context) != > UNIT_TEST_PASSED) { > + DEBUG ((DEBUG_ERROR, "Prerequisite Not > Met\n")); > + Test->Result = > UNIT_TEST_ERROR_PREREQUISITE_NOT_MET; > + ParentFramework->CurrentTest = NULL; > + continue; > + } > + } else { > DEBUG ((DEBUG_ERROR, "Prerequisite Not > Met\n")); > Test->Result = > UNIT_TEST_ERROR_PREREQUISITE_NOT_MET; > ParentFramework->CurrentTest = NULL; @@ -88,14 > +97,20 @@ RunTestSuite ( > // We set the status to UNIT_TEST_RUNNING in case > the test needs to reboot > // or quit. The UNIT_TEST_RUNNING state will allow > the test to resume > // but will prevent the Prerequisite from being > dispatched a second time. > - Test->Result = UNIT_TEST_RUNNING; > - Test->Result = Test->RunTest (Test->Context); > + if (SetJump (&gUnitTestJumpBuffer) == 0) { > + Test->Result = UNIT_TEST_RUNNING; > + Test->Result = Test->RunTest (Test->Context); > + } else { > + Test->Result = UNIT_TEST_ERROR_TEST_FAILED; > + } > > // > // Finally, clean everything up, if need be. > if (Test->CleanUp != NULL) { > DEBUG ((DEBUG_VERBOSE, "CLEANUP\n")); > - Test->CleanUp (Test->Context); > + if (SetJump (&gUnitTestJumpBuffer) == 0) { > + Test->CleanUp (Test->Context); > + } > } > > // > diff --git > a/UnitTestFrameworkPkg/Library/UnitTestResultReportLib/U > nitTestResultReportLib.c > b/UnitTestFrameworkPkg/Library/UnitTestResultReportLib/U > nitTestResultReportLib.c > index eba68e330c..66c9db457d 100644 > --- > a/UnitTestFrameworkPkg/Library/UnitTestResultReportLib/U > nitTestResultReportLib.c > +++ > b/UnitTestFrameworkPkg/Library/UnitTestResultReportLib/U > nitTestResul > +++ tReportLib.c > @@ -49,7 +49,8 @@ struct _UNIT_TEST_FAILURE_TYPE_STRING > mFailureTypeStrings[] = { > { FAILURETYPE_ASSERTNOTEQUAL, "ASSERT_NOTEQUAL > FAILURE"}, > { FAILURETYPE_ASSERTNOTEFIERROR, "ASSERT_NOTEFIERROR > FAILURE"}, > { FAILURETYPE_ASSERTSTATUSEQUAL, "ASSERT_STATUSEQUAL > FAILURE"}, > - { FAILURETYPE_ASSERTNOTNULL , "ASSERT_NOTNULL > FAILURE"}, > + { FAILURETYPE_ASSERTNOTNULL, "ASSERT_NOTNULL > FAILURE"}, > + { FAILURETYPE_EXPECTASSERT, "EXPECT_ASSERT > FAILURE"}, > { 0, "*UNKNOWN* Failure"} > }; > > diff --git > a/UnitTestFrameworkPkg/PrivateInclude/UnitTestFrameworkT > ypes.h > b/UnitTestFrameworkPkg/PrivateInclude/UnitTestFrameworkT > ypes.h > index e58b30093e..b0e2f61bbf 100644 > --- > a/UnitTestFrameworkPkg/PrivateInclude/UnitTestFrameworkT > ypes.h > +++ > b/UnitTestFrameworkPkg/PrivateInclude/UnitTestFrameworkT > ypes.h > @@ -44,6 +44,7 @@ typedef UINT32 FAILURE_TYPE; > #define FAILURETYPE_ASSERTNOTEFIERROR (6) > #define FAILURETYPE_ASSERTSTATUSEQUAL (7) > #define FAILURETYPE_ASSERTNOTNULL (8) > +#define FAILURETYPE_EXPECTASSERT (9) > > /// > /// Unit Test context structure tracked by the unit > test framework. > diff --git > a/UnitTestFrameworkPkg/Test/UnitTestFrameworkPkgHostTest > .dsc > b/UnitTestFrameworkPkg/Test/UnitTestFrameworkPkgHostTest > .dsc > index 701e7299d7..70affddead 100644 > --- > a/UnitTestFrameworkPkg/Test/UnitTestFrameworkPkgHostTest > .dsc > +++ > b/UnitTestFrameworkPkg/Test/UnitTestFrameworkPkgHostTest > .dsc > @@ -25,7 +25,7 @@ [Components] > > UnitTestFrameworkPkg/Test/UnitTest/Sample/SampleUnitTest > /SampleUnitTestHost.inf > > # > - # Build Libraries > + # Build HOST_APPLICATION Libraries > # > UnitTestFrameworkPkg/Library/CmockaLib/CmockaLib.inf > > UnitTestFrameworkPkg/Library/Posix/DebugLibPosix/DebugLi > bPosix.inf > diff --git > a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dsc > b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dsc > index 2d84691bf1..0dfd98f2a8 100644 > --- a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dsc > +++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.dsc > @@ -28,6 +28,7 @@ [Components] > > UnitTestFrameworkPkg/Library/UnitTestResultReportLib/Uni > tTestResultReportLibConOut.inf > > UnitTestFrameworkPkg/Library/UnitTestBootLibUsbClass/Uni > tTestBootLibUsbClass.inf > > UnitTestFrameworkPkg/Library/UnitTestPersistenceLibSimpl > eFileSystem/UnitTestPersistenceLibSimpleFileSystem.inf > + > + > UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/Unit > TestDebugAsser > + tLib.inf > > > UnitTestFrameworkPkg/Test/UnitTest/Sample/SampleUnitTest > /SampleUnitTestDxe.inf > > UnitTestFrameworkPkg/Test/UnitTest/Sample/SampleUnitTest > /SampleUnitTestPei.inf > diff --git > a/UnitTestFrameworkPkg/UnitTestFrameworkPkgTarget.dsc.in > c > b/UnitTestFrameworkPkg/UnitTestFrameworkPkgTarget.dsc.in > c > index 0881278ab0..8adf690098 100644 > --- > a/UnitTestFrameworkPkg/UnitTestFrameworkPkgTarget.dsc.in > c > +++ > b/UnitTestFrameworkPkg/UnitTestFrameworkPkgTarget.dsc.in > c > @@ -29,6 +29,7 @@ [LibraryClasses] > > UnitTestLib|UnitTestFrameworkPkg/Library/UnitTestLib/Uni > tTestLib.inf > > UnitTestPersistenceLib|UnitTestFrameworkPkg/Library/Unit > TestPersistenceLibNull/UnitTestPersistenceLibNull.inf > > UnitTestResultReportLib|UnitTestFrameworkPkg/Library/Uni > tTestResultReportLib/UnitTestResultReportLibDebugLib.inf > + > + > NULL|UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib > /UnitTestDebug > + AssertLib.inf > > [LibraryClasses.ARM, LibraryClasses.AARCH64] > # > @@ -56,5 +57,6 @@ [PcdsFixedAtBuild] > gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x17 > > [BuildOptions] > - MSFT:*_*_*_CC_FLAGS = -D > DISABLE_NEW_DEPRECATED_INTERFACES > - GCC:*_*_*_CC_FLAGS = -D > DISABLE_NEW_DEPRECATED_INTERFACES > + MSFT:*_*_*_CC_FLAGS = -D > DISABLE_NEW_DEPRECATED_INTERFACES -D > EDKII_UNIT_TEST_FRAMEWORK_ENABLED > + GCC:*_*_*_CC_FLAGS = -D > DISABLE_NEW_DEPRECATED_INTERFACES -D > EDKII_UNIT_TEST_FRAMEWORK_ENABLED > + XCODE:*_*_*_CC_FLAGS = -D > DISABLE_NEW_DEPRECATED_INTERFACES -D > + EDKII_UNIT_TEST_FRAMEWORK_ENABLED > -- > 2.21.0.windows.1 > > >