Do a unit test without debug symbols

This commit is contained in:
Jeremy Rifkin 2025-01-28 00:48:38 -06:00
parent b498dead92
commit f16c36e0b6
No known key found for this signature in database
GPG Key ID: 19AA8270105E8EB4
11 changed files with 119 additions and 88 deletions

View File

@ -70,6 +70,19 @@ include(cmake/Autoconfig.cmake)
# =================================================== Library Setup ==================================================== # =================================================== Library Setup ====================================================
if(NOT CPPTRACE_BUILD_NO_SYMBOLS)
set(
debug
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-g>
$<$<CXX_COMPILER_ID:MSVC>:/DEBUG>
)
else()
add_compile_options($<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-g0>)
set(
debug
)
endif()
# Target that we can modify (can't modify ALIAS targets) # Target that we can modify (can't modify ALIAS targets)
# Target name should not be the same as ${PROJECT_NAME}, causes add_subdirectory issues # Target name should not be the same as ${PROJECT_NAME}, causes add_subdirectory issues
set(target_name "cpptrace-lib") set(target_name "cpptrace-lib")

View File

@ -7,12 +7,6 @@ set(
${warning_options} $<$<CXX_COMPILER_ID:GNU>:-Wno-infinite-recursion> ${warning_options} $<$<CXX_COMPILER_ID:GNU>:-Wno-infinite-recursion>
) )
set(
debug
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-g>
$<$<CXX_COMPILER_ID:MSVC>:/DEBUG>
)
include(FetchContent) include(FetchContent)
set(BENCHMARK_ENABLE_TESTING OFF) set(BENCHMARK_ENABLE_TESTING OFF)
FetchContent_Declare( FetchContent_Declare(

View File

@ -34,6 +34,7 @@ def build(runner: MatrixRunner):
"-DCPPTRACE_STD_FORMAT=Off", "-DCPPTRACE_STD_FORMAT=Off",
"-DCPPTRACE_BUILD_TESTING=On", "-DCPPTRACE_BUILD_TESTING=On",
f"-DCPPTRACE_SANITIZER_BUILD={matrix['sanitizers']}", 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['split_dwarf']}",
f"-DCPPTRACE_BUILD_TESTING_DWARF_VERSION={matrix['dwarf_version']}", f"-DCPPTRACE_BUILD_TESTING_DWARF_VERSION={matrix['dwarf_version']}",
f"-DCPPTRACE_USE_EXTERNAL_LIBDWARF=On", f"-DCPPTRACE_USE_EXTERNAL_LIBDWARF=On",
@ -61,6 +62,7 @@ def build(runner: MatrixRunner):
"-DCPPTRACE_STD_FORMAT=Off", "-DCPPTRACE_STD_FORMAT=Off",
"-DCPPTRACE_BUILD_TESTING=On", "-DCPPTRACE_BUILD_TESTING=On",
f"-DCPPTRACE_SANITIZER_BUILD={matrix['sanitizers']}", 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['split_dwarf']}",
# f"-DCPPTRACE_BUILD_TESTING_SPLIT_DWARF={matrix['dwarf_version']}", # f"-DCPPTRACE_BUILD_TESTING_SPLIT_DWARF={matrix['dwarf_version']}",
f"-DCPPTRACE_USE_EXTERNAL_LIBDWARF=On", f"-DCPPTRACE_USE_EXTERNAL_LIBDWARF=On",
@ -122,6 +124,7 @@ def run_linux_matrix():
"has_dl_find_object": ["OFF", "ON"], "has_dl_find_object": ["OFF", "ON"],
"split_dwarf": ["OFF", "ON"], "split_dwarf": ["OFF", "ON"],
"dwarf_version": ["4", "5"], "dwarf_version": ["4", "5"],
"symbols": ["On", "Off"],
}, },
exclude = [ exclude = [
{ {
@ -144,6 +147,7 @@ def run_macos_matrix():
"build_type": ["Debug", "RelWithDebInfo"], "build_type": ["Debug", "RelWithDebInfo"],
"shared": ["OFF", "ON"], "shared": ["OFF", "ON"],
"dSYM": [True, False], "dSYM": [True, False],
"symbols": ["On", "Off"],
}, },
exclude = [ exclude = [
{ {

View File

@ -152,12 +152,14 @@ option(CPPTRACE_ADDR2LINE_SEARCH_SYSTEM_PATH "" OFF)
if(PROJECT_IS_TOP_LEVEL) if(PROJECT_IS_TOP_LEVEL)
option(CPPTRACE_BUILD_TESTING "" OFF) option(CPPTRACE_BUILD_TESTING "" OFF)
option(CPPTRACE_BUILD_BENCHMARK "" OFF) option(CPPTRACE_BUILD_BENCHMARK "" OFF)
option(CPPTRACE_BUILD_NO_SYMBOLS "" OFF)
option(CPPTRACE_BUILD_TESTING_SPLIT_DWARF "" OFF) option(CPPTRACE_BUILD_TESTING_SPLIT_DWARF "" OFF)
set(CPPTRACE_BUILD_TESTING_DWARF_VERSION "0" CACHE STRING "") set(CPPTRACE_BUILD_TESTING_DWARF_VERSION "0" CACHE STRING "")
option(CPPTRACE_BUILD_TEST_RDYNAMIC "" OFF) option(CPPTRACE_BUILD_TEST_RDYNAMIC "" OFF)
mark_as_advanced( mark_as_advanced(
CPPTRACE_BUILD_TESTING CPPTRACE_BUILD_TESTING
CPPTRACE_BUILD_BENCHMARKING CPPTRACE_BUILD_BENCHMARK
CPPTRACE_BUILD_NO_SYMBOLS
CPPTRACE_BUILD_TESTING_SPLIT_DWARF CPPTRACE_BUILD_TESTING_SPLIT_DWARF
CPPTRACE_BUILD_TESTING_DWARF_VERSION CPPTRACE_BUILD_TESTING_DWARF_VERSION
CPPTRACE_BUILD_TEST_RDYNAMIC CPPTRACE_BUILD_TEST_RDYNAMIC

View File

@ -7,12 +7,6 @@ set(
${warning_options} $<$<CXX_COMPILER_ID:GNU>:-Wno-infinite-recursion> ${warning_options} $<$<CXX_COMPILER_ID:GNU>:-Wno-infinite-recursion>
) )
set(
debug
$<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-g>
$<$<CXX_COMPILER_ID:MSVC>:/DEBUG>
)
macro(add_test_dependencies exec_name) macro(add_test_dependencies exec_name)
target_compile_features(${exec_name} PRIVATE cxx_std_11) target_compile_features(${exec_name} PRIVATE cxx_std_11)
target_link_libraries(${exec_name} PRIVATE ${target_name}) 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}) target_compile_options(${exec_name} PRIVATE -gdwarf-${CPPTRACE_BUILD_TESTING_DWARF_VERSION})
endif() endif()
# Clang has been fast to adopt dwarf 5, other tools (e.g. addr2line from binutils) have not # 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(NOT CPPTRACE_BUILD_NO_SYMBOLS)
if(HAS_DWARF4) check_cxx_compiler_flag("-gdwarf-4" HAS_DWARF4)
target_compile_options(${exec_name} PRIVATE "$<$<CONFIG:Debug>:-gdwarf-4>") if(HAS_DWARF4)
target_compile_options(${exec_name} PRIVATE "$<$<CONFIG:Debug>:-gdwarf-4>")
endif()
endif() endif()
# TODO: add debug info for mingw clang? # TODO: add debug info for mingw clang?
if(CPPTRACE_BUILD_TEST_RDYNAMIC) if(CPPTRACE_BUILD_TEST_RDYNAMIC)
@ -105,6 +101,9 @@ if(NOT CPPTRACE_SKIP_UNIT)
if(CPPTRACE_SANITIZER_BUILD) if(CPPTRACE_SANITIZER_BUILD)
target_compile_definitions(unittest PRIVATE CPPTRACE_SANITIZER_BUILD) target_compile_definitions(unittest PRIVATE CPPTRACE_SANITIZER_BUILD)
endif() endif()
if(CPPTRACE_BUILD_NO_SYMBOLS)
target_compile_definitions(unittest PRIVATE CPPTRACE_BUILD_NO_SYMBOLS)
endif()
target_include_directories(unittest PRIVATE ../src) target_include_directories(unittest PRIVATE ../src)
add_test(NAME unittest COMMAND unittest) add_test(NAME unittest COMMAND unittest)
endif() endif()

View File

@ -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

View File

@ -10,6 +10,8 @@
#include <cpptrace/cpptrace.hpp> #include <cpptrace/cpptrace.hpp>
#include <cpptrace/from_current.hpp> #include <cpptrace/from_current.hpp>
#include "common.hpp"
using namespace std::literals; using namespace std::literals;
@ -52,8 +54,7 @@ TEST(FromCurrent, Basic) {
trace.frames.begin(), trace.frames.begin(),
trace.frames.end(), trace.frames.end(),
[](const cpptrace::stacktrace_frame& frame) { [](const cpptrace::stacktrace_frame& frame) {
return frame.filename.find("from_current.cpp") != std::string::npos return frame.symbol.find("stacktrace_from_current_3") != std::string::npos;
&& frame.symbol.find("lambda") == std::string::npos; // due to msvc
} }
); );
ASSERT_NE(it, trace.frames.end()); ASSERT_NE(it, trace.frames.end());
@ -61,29 +62,29 @@ TEST(FromCurrent, Basic) {
int j = 0; int j = 0;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(j, line_numbers.size()); ASSERT_LT(j, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current.cpp")); EXPECT_FILE(trace.frames[i].filename, "from_current.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_3")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_3"));
i++; i++;
j++; j++;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(j, line_numbers.size()); ASSERT_LT(j, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current.cpp")); EXPECT_FILE(trace.frames[i].filename, "from_current.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_2")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_2"));
i++; i++;
j++; j++;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(j, line_numbers.size()); ASSERT_LT(j, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current.cpp")); EXPECT_FILE(trace.frames[i].filename, "from_current.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_1")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_1"));
i++; i++;
j++; j++;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(j, line_numbers.size()); ASSERT_LT(j, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current.cpp")); EXPECT_FILE(trace.frames[i].filename, "from_current.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("FromCurrent_Basic_Test::TestBody")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("FromCurrent_Basic_Test::TestBody"));
} }
} }
@ -104,8 +105,7 @@ TEST(FromCurrent, CorrectHandler) {
trace.frames.begin(), trace.frames.begin(),
trace.frames.end(), trace.frames.end(),
[](const cpptrace::stacktrace_frame& frame) { [](const cpptrace::stacktrace_frame& frame) {
return frame.filename.find("from_current.cpp") != std::string::npos return frame.symbol.find("stacktrace_from_current_3") != std::string::npos;
&& frame.symbol.find("lambda") == std::string::npos;
} }
); );
EXPECT_NE(it, trace.frames.end()); EXPECT_NE(it, trace.frames.end());
@ -134,8 +134,7 @@ TEST(FromCurrent, RawTrace) {
trace.frames.begin(), trace.frames.begin(),
trace.frames.end(), trace.frames.end(),
[](const cpptrace::stacktrace_frame& frame) { [](const cpptrace::stacktrace_frame& frame) {
return frame.filename.find("from_current.cpp") != std::string::npos return frame.symbol.find("stacktrace_from_current_3") != std::string::npos;
&& frame.symbol.find("lambda") == std::string::npos;
} }
); );
EXPECT_NE(it, trace.frames.end()); EXPECT_NE(it, trace.frames.end());

View File

@ -1,3 +1,4 @@
#include "common.hpp"
#include <algorithm> #include <algorithm>
#include <string_view> #include <string_view>
#include <string> #include <string>
@ -10,6 +11,8 @@
#include <cpptrace/cpptrace.hpp> #include <cpptrace/cpptrace.hpp>
#include <cpptrace/from_current.hpp> #include <cpptrace/from_current.hpp>
#include "common.hpp"
using namespace std::literals; using namespace std::literals;
@ -52,8 +55,7 @@ TEST(FromCurrentZ, Basic) {
trace.frames.begin(), trace.frames.begin(),
trace.frames.end(), trace.frames.end(),
[](const cpptrace::stacktrace_frame& frame) { [](const cpptrace::stacktrace_frame& frame) {
return frame.filename.find("from_current_z.cpp") != std::string::npos return frame.symbol.find("stacktrace_from_current_z_3") != std::string::npos;
&& frame.symbol.find("lambda") == std::string::npos; // due to msvc
} }
); );
ASSERT_NE(it, trace.frames.end()); ASSERT_NE(it, trace.frames.end());
@ -61,29 +63,29 @@ TEST(FromCurrentZ, Basic) {
int j = 0; int j = 0;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(j, line_numbers.size()); ASSERT_LT(j, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current_z.cpp")); EXPECT_FILE(trace.frames[i].filename, "from_current_z.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_z_3")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_z_3"));
i++; i++;
j++; j++;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(j, line_numbers.size()); ASSERT_LT(j, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current_z.cpp")); EXPECT_FILE(trace.frames[i].filename, "from_current_z.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_z_2")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_z_2"));
i++; i++;
j++; j++;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(j, line_numbers.size()); ASSERT_LT(j, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current_z.cpp")); EXPECT_FILE(trace.frames[i].filename, "from_current_z.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_z_1")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_from_current_z_1"));
i++; i++;
j++; j++;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(j, line_numbers.size()); ASSERT_LT(j, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("from_current_z.cpp")); EXPECT_FILE(trace.frames[i].filename, "from_current_z.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[j]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[j]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("FromCurrentZ_Basic_Test::TestBody")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("FromCurrentZ_Basic_Test::TestBody"));
} }
} }
@ -104,8 +106,7 @@ TEST(FromCurrentZ, CorrectHandler) {
trace.frames.begin(), trace.frames.begin(),
trace.frames.end(), trace.frames.end(),
[](const cpptrace::stacktrace_frame& frame) { [](const cpptrace::stacktrace_frame& frame) {
return frame.filename.find("from_current_z.cpp") != std::string::npos return frame.symbol.find("stacktrace_from_current_z_3") != std::string::npos;
&& frame.symbol.find("lambda") == std::string::npos;
} }
); );
EXPECT_NE(it, trace.frames.end()); EXPECT_NE(it, trace.frames.end());
@ -133,8 +134,7 @@ TEST(FromCurrentZ, RawTrace) {
trace.frames.begin(), trace.frames.begin(),
trace.frames.end(), trace.frames.end(),
[](const cpptrace::stacktrace_frame& frame) { [](const cpptrace::stacktrace_frame& frame) {
return frame.filename.find("from_current_z.cpp") != std::string::npos return frame.symbol.find("stacktrace_from_current_z_3") != std::string::npos;
&& frame.symbol.find("lambda") == std::string::npos;
} }
); );
EXPECT_NE(it, trace.frames.end()); EXPECT_NE(it, trace.frames.end());

View File

@ -5,8 +5,11 @@
#include <gtest/gtest-matchers.h> #include <gtest/gtest-matchers.h>
#include <gmock/gmock.h> #include <gmock/gmock.h>
#include <gmock/gmock-matchers.h> #include <gmock/gmock-matchers.h>
#include <cpptrace/cpptrace.hpp> #include <cpptrace/cpptrace.hpp>
#include "common.hpp"
using namespace std::literals; using namespace std::literals;
@ -39,7 +42,7 @@ CPPTRACE_FORCE_NO_INLINE void object_basic_resolution() {
auto line = __LINE__ + 1; auto line = __LINE__ + 1;
auto trace = cpptrace::generate_object_trace().resolve(); auto trace = cpptrace::generate_object_trace().resolve();
ASSERT_GE(trace.frames.size(), 1); 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_EQ(trace.frames[0].line.value(), line);
EXPECT_THAT(trace.frames[0].symbol, testing::HasSubstr("object_basic_resolution")); 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<int>& line_numbers) {
return 2; return 2;
} }
int i = 0; int i = 0;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("object_trace.cpp")); EXPECT_FILE(trace.frames[i].filename, "object_trace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("object_resolve_3")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("object_resolve_3"));
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("object_trace.cpp")); EXPECT_FILE(trace.frames[i].filename, "object_trace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("object_resolve_2")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("object_resolve_2"));
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("object_trace.cpp")); EXPECT_FILE(trace.frames[i].filename, "object_trace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("object_resolve_1")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("object_resolve_1"));
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("object_trace.cpp")); EXPECT_FILE(trace.frames[i].filename, "object_trace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("ObjectTrace_Resolution_Test::TestBody")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("ObjectTrace_Resolution_Test::TestBody"));
return 2; return 2;
} }

View File

@ -4,8 +4,11 @@
#include <gtest/gtest-matchers.h> #include <gtest/gtest-matchers.h>
#include <gmock/gmock.h> #include <gmock/gmock.h>
#include <gmock/gmock-matchers.h> #include <gmock/gmock-matchers.h>
#include <cpptrace/cpptrace.hpp> #include <cpptrace/cpptrace.hpp>
#include "common.hpp"
using namespace std::literals; using namespace std::literals;
#ifdef _MSC_VER #ifdef _MSC_VER
@ -29,8 +32,8 @@ CPPTRACE_FORCE_NO_INLINE void stacktrace_basic() {
auto line = __LINE__ + 1; auto line = __LINE__ + 1;
auto trace = cpptrace::generate_trace(); auto trace = cpptrace::generate_trace();
ASSERT_GE(trace.frames.size(), 1); ASSERT_GE(trace.frames.size(), 1);
EXPECT_THAT(trace.frames[0].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[0].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[0].line.value(), line); EXPECT_LINE(trace.frames[0].line.value(), line);
EXPECT_THAT(trace.frames[0].symbol, testing::HasSubstr("stacktrace_basic")); EXPECT_THAT(trace.frames[0].symbol, testing::HasSubstr("stacktrace_basic"));
} }
@ -51,20 +54,20 @@ CPPTRACE_FORCE_NO_INLINE int stacktrace_multi_3(std::vector<int>& line_numbers)
return 2; return 2;
} }
int i = 0; int i = 0;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_multi_3")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_multi_3"));
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_multi_2")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_multi_2"));
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_multi_1")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_multi_1"));
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("Stacktrace_MultipleFrames_Test::TestBody")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("Stacktrace_MultipleFrames_Test::TestBody"));
return 2; return 2;
} }
@ -114,25 +117,25 @@ TEST(Stacktrace, RawTraceResolution) {
auto trace = raw.resolve(); auto trace = raw.resolve();
ASSERT_GE(trace.frames.size(), 4); ASSERT_GE(trace.frames.size(), 4);
int i = 0; int i = 0;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_raw_resolve_3")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_raw_resolve_3"));
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_raw_resolve_2")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_raw_resolve_2"));
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_raw_resolve_1")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_raw_resolve_1"));
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("Stacktrace_RawTraceResolution_Test::TestBody")); 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<int>& line_numbers) { CPPTRACE_FORCE_NO_INLINE int stacktrace_inline_resolution_3(std::vector<int>& line_numbers) {
static volatile int lto_guard; lto_guard = lto_guard + 1; static volatile int lto_guard; lto_guard = lto_guard + 1;
line_numbers.insert(line_numbers.begin(), __LINE__ + 1); line_numbers.insert(line_numbers.begin(), __LINE__ + 1);
@ -142,29 +145,29 @@ CPPTRACE_FORCE_NO_INLINE int stacktrace_inline_resolution_3(std::vector<int>& li
return 2; return 2;
} }
int i = 0; int i = 0;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_inline_resolution_3")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_inline_resolution_3"));
EXPECT_FALSE(trace.frames[i].is_inline); EXPECT_FALSE(trace.frames[i].is_inline);
EXPECT_NE(trace.frames[i].raw_address, 0); EXPECT_NE(trace.frames[i].raw_address, 0);
EXPECT_NE(trace.frames[i].object_address, 0); EXPECT_NE(trace.frames[i].object_address, 0);
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_inline_resolution_2")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_inline_resolution_2"));
EXPECT_TRUE(trace.frames[i].is_inline); EXPECT_TRUE(trace.frames[i].is_inline);
EXPECT_EQ(trace.frames[i].raw_address, 0); EXPECT_EQ(trace.frames[i].raw_address, 0);
EXPECT_EQ(trace.frames[i].object_address, 0); EXPECT_EQ(trace.frames[i].object_address, 0);
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_inline_resolution_1")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_inline_resolution_1"));
EXPECT_FALSE(trace.frames[i].is_inline); EXPECT_FALSE(trace.frames[i].is_inline);
EXPECT_NE(trace.frames[i].raw_address, 0); EXPECT_NE(trace.frames[i].raw_address, 0);
EXPECT_NE(trace.frames[i].object_address, 0); EXPECT_NE(trace.frames[i].object_address, 0);
i++; i++;
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("stacktrace.cpp")); EXPECT_FILE(trace.frames[i].filename, "stacktrace.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("Stacktrace_InlineResolution_Test::TestBody")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("Stacktrace_InlineResolution_Test::TestBody"));
EXPECT_FALSE(trace.frames[i].is_inline); EXPECT_FALSE(trace.frames[i].is_inline);
EXPECT_NE(trace.frames[i].raw_address, 0); EXPECT_NE(trace.frames[i].raw_address, 0);

View File

@ -8,6 +8,8 @@
#include <cpptrace/cpptrace.hpp> #include <cpptrace/cpptrace.hpp>
#include "common.hpp"
using namespace std::literals; using namespace std::literals;
@ -48,26 +50,26 @@ TEST(TracedException, Basic) {
size_t i = 0; size_t i = 0;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(i, line_numbers.size()); ASSERT_LT(i, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("traced_exception.cpp")); EXPECT_FILE(trace.frames[i].filename, "traced_exception.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_traced_object_3")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_traced_object_3"));
i++; i++;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(i, line_numbers.size()); ASSERT_LT(i, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("traced_exception.cpp")); EXPECT_FILE(trace.frames[i].filename, "traced_exception.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_traced_object_2")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_traced_object_2"));
i++; i++;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(i, line_numbers.size()); ASSERT_LT(i, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("traced_exception.cpp")); EXPECT_FILE(trace.frames[i].filename, "traced_exception.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_traced_object_1")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("stacktrace_traced_object_1"));
i++; i++;
ASSERT_LT(i, trace.frames.size()); ASSERT_LT(i, trace.frames.size());
ASSERT_LT(i, line_numbers.size()); ASSERT_LT(i, line_numbers.size());
EXPECT_THAT(trace.frames[i].filename, testing::EndsWith("traced_exception.cpp")); EXPECT_FILE(trace.frames[i].filename, "traced_exception.cpp");
EXPECT_EQ(trace.frames[i].line.value(), line_numbers[i]); EXPECT_LINE(trace.frames[i].line.value(), line_numbers[i]);
EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("TracedException_Basic_Test::TestBody")); EXPECT_THAT(trace.frames[i].symbol, testing::HasSubstr("TracedException_Basic_Test::TestBody"));
} }
} }