From 2d144d7e147beddbba85cd04bd2093b544e5cf0a Mon Sep 17 00:00:00 2001 From: Michael D Kinney Date: Mon, 5 Feb 2024 14:59:42 -0800 Subject: UnitTestFrameworkPkg/UnitTestDebugAssertLib: Add GoogleTest support REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4683 Add an C++ implementation of UnitTestDebugAssert() API for host-based environments. GoogleTest based environments throw a C++ exception of type std::runtime_error when an ASSERT() is triggered with a description that contains the filename, line number, and the expression that triggered the ASSERT(). Cc: Michael Kubacki Cc: Sean Brogan Signed-off-by: Michael D Kinney Reviewed-by: Michael Kubacki --- .../UnitTestDebugAssertLibHost.cpp | 63 ++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.cpp (limited to 'UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.cpp') diff --git a/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.cpp b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.cpp new file mode 100644 index 0000000000..a4405cc205 --- /dev/null +++ b/UnitTestFrameworkPkg/Library/UnitTestDebugAssertLib/UnitTestDebugAssertLibHost.cpp @@ -0,0 +1,63 @@ +/** @file + Unit Test Debug Assert Library for host-based environments + + Copyright (c) 2020, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#ifdef NULL + #undef NULL +#endif + +extern "C" { + #include + #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 { + if (GetActiveFrameworkHandle () != NULL) { + AsciiStrCpyS (Message, sizeof (Message), "Detected unexpected ASSERT("); + AsciiStrCatS (Message, sizeof (Message), Description); + AsciiStrCatS (Message, sizeof (Message), ")"); + UnitTestAssertTrue (FALSE, "", LineNumber, FileName, Message); + } else { + snprintf (Message, sizeof (Message), "Detected unexpected ASSERT: %s(%d): %s\n", FileName, (INT32)(UINT32)LineNumber, Description); + throw std::runtime_error (Message); + } + } + } +} -- cgit v1.2.3