From edeb8f6904883b89350f7dea31ff4bceb97f94bf Mon Sep 17 00:00:00 2001 From: Julian Brost Date: Fri, 23 Oct 2020 15:04:28 +0200 Subject: [PATCH] Add a test case for the stack trace formatter --- test/CMakeLists.txt | 2 ++ test/base-stacktrace.cpp | 44 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 test/base-stacktrace.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index e550e2a86..2ca656dac 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -16,6 +16,7 @@ set(base_test_SOURCES base-object-packer.cpp base-serialize.cpp base-shellescape.cpp + base-stacktrace.cpp base-stream.cpp base-string.cpp base-timer.cpp @@ -88,6 +89,7 @@ add_boost_test(base base_serialize/object base_shellescape/escape_basic base_shellescape/escape_quoted + base_stacktrace/stacktrace base_stream/readline_stdio base_string/construct base_string/equal diff --git a/test/base-stacktrace.cpp b/test/base-stacktrace.cpp new file mode 100644 index 000000000..0a8a04adf --- /dev/null +++ b/test/base-stacktrace.cpp @@ -0,0 +1,44 @@ +/* Icinga 2 | (c) 2020 Icinga GmbH | GPLv2+ */ + +#include "base/stacktrace.hpp" +#include + +using namespace icinga; + + +#pragma GCC push_options +#pragma GCC optimize ("O0") +#pragma clang optimize off + +BOOST_AUTO_TEST_SUITE(base_stacktrace) + +[[gnu::noinline]] +void stack_test_func_b() +{ + boost::stacktrace::stacktrace stack; + std::ostringstream obuf; + obuf << StackTraceFormatter(stack); + std::string result = obuf.str(); + BOOST_CHECK_MESSAGE(!result.empty(), "stack trace must not be empty"); + size_t pos_a = result.find("stack_test_func_a"); + size_t pos_b = result.find("stack_test_func_b"); + BOOST_CHECK_MESSAGE(pos_a != std::string::npos, "'stack_test_func_a' not found\n\n" << result); + BOOST_CHECK_MESSAGE(pos_b != std::string::npos, "'stack_test_func_b' not found\n\n" << result); + BOOST_CHECK_MESSAGE(pos_a > pos_b, "'stack_test_func_a' must appear after 'stack_test_func_b'\n\n" << result); +} + +[[gnu::noinline]] +void stack_test_func_a() +{ + stack_test_func_b(); +} + +BOOST_AUTO_TEST_CASE(stacktrace) +{ + stack_test_func_a(); +} + +BOOST_AUTO_TEST_SUITE_END() + +#pragma GCC pop_options +#pragma clang optimize on