diff --git a/CMakeLists.txt b/CMakeLists.txt index f766186..2ea33e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,6 +70,19 @@ include(cmake/Autoconfig.cmake) # =================================================== Library Setup ==================================================== +if(NOT CPPTRACE_BUILD_NO_SYMBOLS) + set( + debug + $<$>:-g> + $<$:/DEBUG> + ) +else() + add_compile_options($<$>:-g0>) + set( + debug + ) +endif() + # Target that we can modify (can't modify ALIAS targets) # Target name should not be the same as ${PROJECT_NAME}, causes add_subdirectory issues set(target_name "cpptrace-lib") diff --git a/benchmarking/CMakeLists.txt b/benchmarking/CMakeLists.txt index 4b311f8..431d7ee 100644 --- a/benchmarking/CMakeLists.txt +++ b/benchmarking/CMakeLists.txt @@ -7,12 +7,6 @@ set( ${warning_options} $<$:-Wno-infinite-recursion> ) -set( - debug - $<$>:-g> - $<$:/DEBUG> -) - include(FetchContent) set(BENCHMARK_ENABLE_TESTING OFF) FetchContent_Declare( diff --git a/ci/unittest.py b/ci/unittest.py index d4a1511..d689486 100644 --- a/ci/unittest.py +++ b/ci/unittest.py @@ -34,6 +34,7 @@ def build(runner: MatrixRunner): "-DCPPTRACE_STD_FORMAT=Off", "-DCPPTRACE_BUILD_TESTING=On", f"-DCPPTRACE_SANITIZER_BUILD={matrix['sanitizers']}", + f"-DCPPTRACE_BUILD_NO_SYMBOLS={matrix['symbols']}", f"-DCPPTRACE_BUILD_TESTING_SPLIT_DWARF={matrix['split_dwarf']}", f"-DCPPTRACE_BUILD_TESTING_DWARF_VERSION={matrix['dwarf_version']}", f"-DCPPTRACE_USE_EXTERNAL_LIBDWARF=On", @@ -61,6 +62,7 @@ def build(runner: MatrixRunner): "-DCPPTRACE_STD_FORMAT=Off", "-DCPPTRACE_BUILD_TESTING=On", f"-DCPPTRACE_SANITIZER_BUILD={matrix['sanitizers']}", + f"-DCPPTRACE_BUILD_NO_SYMBOLS={matrix['symbols']}", # f"-DCPPTRACE_BUILD_TESTING_SPLIT_DWARF={matrix['split_dwarf']}", # f"-DCPPTRACE_BUILD_TESTING_SPLIT_DWARF={matrix['dwarf_version']}", f"-DCPPTRACE_USE_EXTERNAL_LIBDWARF=On", @@ -122,6 +124,7 @@ def run_linux_matrix(): "has_dl_find_object": ["OFF", "ON"], "split_dwarf": ["OFF", "ON"], "dwarf_version": ["4", "5"], + "symbols": ["On", "Off"], }, exclude = [ { @@ -144,6 +147,7 @@ def run_macos_matrix(): "build_type": ["Debug", "RelWithDebInfo"], "shared": ["OFF", "ON"], "dSYM": [True, False], + "symbols": ["On", "Off"], }, exclude = [ { diff --git a/cmake/OptionVariables.cmake b/cmake/OptionVariables.cmake index c228ea3..48aec5b 100644 --- a/cmake/OptionVariables.cmake +++ b/cmake/OptionVariables.cmake @@ -152,12 +152,14 @@ option(CPPTRACE_ADDR2LINE_SEARCH_SYSTEM_PATH "" OFF) if(PROJECT_IS_TOP_LEVEL) option(CPPTRACE_BUILD_TESTING "" OFF) option(CPPTRACE_BUILD_BENCHMARK "" OFF) + option(CPPTRACE_BUILD_NO_SYMBOLS "" OFF) option(CPPTRACE_BUILD_TESTING_SPLIT_DWARF "" OFF) set(CPPTRACE_BUILD_TESTING_DWARF_VERSION "0" CACHE STRING "") option(CPPTRACE_BUILD_TEST_RDYNAMIC "" OFF) mark_as_advanced( CPPTRACE_BUILD_TESTING - CPPTRACE_BUILD_BENCHMARKING + CPPTRACE_BUILD_BENCHMARK + CPPTRACE_BUILD_NO_SYMBOLS CPPTRACE_BUILD_TESTING_SPLIT_DWARF CPPTRACE_BUILD_TESTING_DWARF_VERSION CPPTRACE_BUILD_TEST_RDYNAMIC diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 35ea151..9a721ed 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -7,12 +7,6 @@ set( ${warning_options} $<$:-Wno-infinite-recursion> ) -set( - debug - $<$>:-g> - $<$:/DEBUG> -) - macro(add_test_dependencies exec_name) target_compile_features(${exec_name} PRIVATE cxx_std_11) target_link_libraries(${exec_name} PRIVATE ${target_name}) @@ -25,9 +19,11 @@ macro(add_test_dependencies exec_name) target_compile_options(${exec_name} PRIVATE -gdwarf-${CPPTRACE_BUILD_TESTING_DWARF_VERSION}) endif() # Clang has been fast to adopt dwarf 5, other tools (e.g. addr2line from binutils) have not - check_cxx_compiler_flag("-gdwarf-4" HAS_DWARF4) - if(HAS_DWARF4) - target_compile_options(${exec_name} PRIVATE "$<$:-gdwarf-4>") + if(NOT CPPTRACE_BUILD_NO_SYMBOLS) + check_cxx_compiler_flag("-gdwarf-4" HAS_DWARF4) + if(HAS_DWARF4) + target_compile_options(${exec_name} PRIVATE "$<$:-gdwarf-4>") + endif() endif() # TODO: add debug info for mingw clang? if(CPPTRACE_BUILD_TEST_RDYNAMIC) @@ -105,6 +101,9 @@ if(NOT CPPTRACE_SKIP_UNIT) if(CPPTRACE_SANITIZER_BUILD) target_compile_definitions(unittest PRIVATE CPPTRACE_SANITIZER_BUILD) endif() + if(CPPTRACE_BUILD_NO_SYMBOLS) + target_compile_definitions(unittest PRIVATE CPPTRACE_BUILD_NO_SYMBOLS) + endif() target_include_directories(unittest PRIVATE ../src) add_test(NAME unittest COMMAND unittest) endif() diff --git a/test/unit/tracing/common.hpp b/test/unit/tracing/common.hpp new file mode 100644 index 0000000..395b33c --- /dev/null +++ b/test/unit/tracing/common.hpp @@ -0,0 +1,12 @@ +#ifndef TRACING_COMMON_HPP +#define TRACING_COMMON_HPP + +#ifndef CPPTRACE_BUILD_NO_SYMBOLS +#define EXPECT_FILE(A, B) EXPECT_THAT((A), testing::EndsWith(B)) +#define EXPECT_LINE(A, B) EXPECT_EQ((A), (B)) +#else +#define EXPECT_FILE(A, B) +#define EXPECT_LINE(A, B) +#endif + +#endif diff --git a/test/unit/tracing/from_current.cpp b/test/unit/tracing/from_current.cpp index ce1e802..da83fd8 100644 --- a/test/unit/tracing/from_current.cpp +++ b/test/unit/tracing/from_current.cpp @@ -10,6 +10,8 @@ #include #include +#include "common.hpp" + using namespace std::literals; @@ -52,8 +54,7 @@ TEST(FromCurrent, Basic) { trace.frames.begin(), trace.frames.end(), [](const cpptrace::stacktrace_frame& frame) { - return frame.filename.find("from_current.cpp") != std::string::npos - && frame.symbol.find("lambda") == std::string::npos; // due to msvc + return frame.symbol.find("stacktrace_from_current_3") != std::string::npos; } ); ASSERT_NE(it, trace.frames.end()); @@ -61,29 +62,29 @@ TEST(FromCurrent, Basic) { int j = 0; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(j, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); + EXPECT_FILE(trace.frames[i].filename, "from_current.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_3")); i++; j++; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(j, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); + EXPECT_FILE(trace.frames[i].filename, "from_current.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_2")); i++; j++; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(j, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); + EXPECT_FILE(trace.frames[i].filename, "from_current.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_1")); i++; j++; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(j, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); + EXPECT_FILE(trace.frames[i].filename, "from_current.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("FromCurrent_Basic_Test::TestBody")); } } @@ -104,8 +105,7 @@ TEST(FromCurrent, CorrectHandler) { trace.frames.begin(), trace.frames.end(), [](const cpptrace::stacktrace_frame& frame) { - return frame.filename.find("from_current.cpp") != std::string::npos - && frame.symbol.find("lambda") == std::string::npos; + return frame.symbol.find("stacktrace_from_current_3") != std::string::npos; } ); EXPECT_NE(it, trace.frames.end()); @@ -134,8 +134,7 @@ TEST(FromCurrent, RawTrace) { trace.frames.begin(), trace.frames.end(), [](const cpptrace::stacktrace_frame& frame) { - return frame.filename.find("from_current.cpp") != std::string::npos - && frame.symbol.find("lambda") == std::string::npos; + return frame.symbol.find("stacktrace_from_current_3") != std::string::npos; } ); EXPECT_NE(it, trace.frames.end()); diff --git a/test/unit/tracing/from_current_z.cpp b/test/unit/tracing/from_current_z.cpp index 30d88da..c3a6ec5 100644 --- a/test/unit/tracing/from_current_z.cpp +++ b/test/unit/tracing/from_current_z.cpp @@ -1,3 +1,4 @@ +#include "common.hpp" #include #include #include @@ -10,6 +11,8 @@ #include #include +#include "common.hpp" + using namespace std::literals; @@ -52,8 +55,7 @@ TEST(FromCurrentZ, Basic) { trace.frames.begin(), trace.frames.end(), [](const cpptrace::stacktrace_frame& frame) { - return frame.filename.find("from_current_z.cpp") != std::string::npos - && frame.symbol.find("lambda") == std::string::npos; // due to msvc + return frame.symbol.find("stacktrace_from_current_z_3") != std::string::npos; } ); ASSERT_NE(it, trace.frames.end()); @@ -61,29 +63,29 @@ TEST(FromCurrentZ, Basic) { int j = 0; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(j, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current_z.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); + EXPECT_FILE(trace.frames[i].filename, "from_current_z.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_z_3")); i++; j++; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(j, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current_z.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); + EXPECT_FILE(trace.frames[i].filename, "from_current_z.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_z_2")); i++; j++; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(j, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current_z.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); + EXPECT_FILE(trace.frames[i].filename, "from_current_z.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_z_1")); i++; j++; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(j, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current_z.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); + EXPECT_FILE(trace.frames[i].filename, "from_current_z.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("FromCurrentZ_Basic_Test::TestBody")); } } @@ -104,8 +106,7 @@ TEST(FromCurrentZ, CorrectHandler) { trace.frames.begin(), trace.frames.end(), [](const cpptrace::stacktrace_frame& frame) { - return frame.filename.find("from_current_z.cpp") != std::string::npos - && frame.symbol.find("lambda") == std::string::npos; + return frame.symbol.find("stacktrace_from_current_z_3") != std::string::npos; } ); EXPECT_NE(it, trace.frames.end()); @@ -133,8 +134,7 @@ TEST(FromCurrentZ, RawTrace) { trace.frames.begin(), trace.frames.end(), [](const cpptrace::stacktrace_frame& frame) { - return frame.filename.find("from_current_z.cpp") != std::string::npos - && frame.symbol.find("lambda") == std::string::npos; + return frame.symbol.find("stacktrace_from_current_z_3") != std::string::npos; } ); EXPECT_NE(it, trace.frames.end()); diff --git a/test/unit/tracing/object_trace.cpp b/test/unit/tracing/object_trace.cpp index 232bec1..bdb69ed 100644 --- a/test/unit/tracing/object_trace.cpp +++ b/test/unit/tracing/object_trace.cpp @@ -5,8 +5,11 @@ #include #include #include + #include +#include "common.hpp" + using namespace std::literals; @@ -39,7 +42,7 @@ CPPTRACE_FORCE_NO_INLINE void object_basic_resolution() { auto line = __LINE__ + 1; auto trace = cpptrace::generate_object_trace().resolve(); ASSERT_GE(trace.frames.size(), 1); - EXPECT_THAT(trace.frames[0].filename, testing::EndsWith("object_trace.cpp")); + EXPECT_FILE(trace.frames[0].filename, "object_trace.cpp"); EXPECT_EQ(trace.frames[0].line.value(), line); EXPECT_THAT(trace.frames[0].symbol, testing::HasSubstr("object_basic_resolution")); } @@ -75,20 +78,20 @@ CPPTRACE_FORCE_NO_INLINE int object_resolve_3(std::vector& line_numbers) { return 2; } int i = 0; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("object_trace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "object_trace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("object_resolve_3")); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("object_trace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "object_trace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("object_resolve_2")); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("object_trace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "object_trace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("object_resolve_1")); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("object_trace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "object_trace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("ObjectTrace_Resolution_Test::TestBody")); return 2; } diff --git a/test/unit/tracing/stacktrace.cpp b/test/unit/tracing/stacktrace.cpp index b96d48a..a06e91f 100644 --- a/test/unit/tracing/stacktrace.cpp +++ b/test/unit/tracing/stacktrace.cpp @@ -4,8 +4,11 @@ #include #include #include + #include +#include "common.hpp" + using namespace std::literals; #ifdef _MSC_VER @@ -29,8 +32,8 @@ CPPTRACE_FORCE_NO_INLINE void stacktrace_basic() { auto line = __LINE__ + 1; auto trace = cpptrace::generate_trace(); ASSERT_GE(trace.frames.size(), 1); - EXPECT_THAT(trace.frames[0].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[0].line.value(), line); + EXPECT_FILE(trace.frames[0].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[0].line.value(), line); EXPECT_THAT(trace.frames[0].symbol, testing::HasSubstr("stacktrace_basic")); } @@ -51,20 +54,20 @@ CPPTRACE_FORCE_NO_INLINE int stacktrace_multi_3(std::vector& line_numbers) return 2; } int i = 0; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_multi_3")); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_multi_2")); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_multi_1")); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("Stacktrace_MultipleFrames_Test::TestBody")); return 2; } @@ -114,25 +117,25 @@ TEST(Stacktrace, RawTraceResolution) { auto trace = raw.resolve(); ASSERT_GE(trace.frames.size(), 4); int i = 0; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_raw_resolve_3")); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_raw_resolve_2")); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_raw_resolve_1")); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("Stacktrace_RawTraceResolution_Test::TestBody")); } -#ifdef CPPTRACE_GET_SYMBOLS_WITH_LIBDWARF +#if defined(CPPTRACE_GET_SYMBOLS_WITH_LIBDWARF) && !defined(CPPTRACE_BUILD_NO_SYMBOLS) CPPTRACE_FORCE_NO_INLINE int stacktrace_inline_resolution_3(std::vector& line_numbers) { static volatile int lto_guard; lto_guard = lto_guard + 1; line_numbers.insert(line_numbers.begin(), __LINE__ + 1); @@ -142,29 +145,29 @@ CPPTRACE_FORCE_NO_INLINE int stacktrace_inline_resolution_3(std::vector& li return 2; } int i = 0; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_inline_resolution_3")); EXPECT_FALSE(trace.frames[i].is_inline); EXPECT_NE(trace.frames[i].raw_address, 0); EXPECT_NE(trace.frames[i].object_address, 0); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_inline_resolution_2")); EXPECT_TRUE(trace.frames[i].is_inline); EXPECT_EQ(trace.frames[i].raw_address, 0); EXPECT_EQ(trace.frames[i].object_address, 0); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_inline_resolution_1")); EXPECT_FALSE(trace.frames[i].is_inline); EXPECT_NE(trace.frames[i].raw_address, 0); EXPECT_NE(trace.frames[i].object_address, 0); i++; - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("Stacktrace_InlineResolution_Test::TestBody")); EXPECT_FALSE(trace.frames[i].is_inline); EXPECT_NE(trace.frames[i].raw_address, 0); diff --git a/test/unit/tracing/traced_exception.cpp b/test/unit/tracing/traced_exception.cpp index 58b2e20..67cb5e4 100644 --- a/test/unit/tracing/traced_exception.cpp +++ b/test/unit/tracing/traced_exception.cpp @@ -8,6 +8,8 @@ #include +#include "common.hpp" + using namespace std::literals; @@ -48,26 +50,26 @@ TEST(TracedException, Basic) { size_t i = 0; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("traced_exception.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "traced_exception.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_traced_object_3")); i++; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("traced_exception.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "traced_exception.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_traced_object_2")); i++; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("traced_exception.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "traced_exception.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_traced_object_1")); i++; ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, line_numbers.size()); - EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("traced_exception.cpp")); - EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); + EXPECT_FILE(trace.frames[i].filename, "traced_exception.cpp"); + EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("TracedException_Basic_Test::TestBody")); } }