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 ====================================================
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 name should not be the same as ${PROJECT_NAME}, causes add_subdirectory issues
set(target_name "cpptrace-lib")

View File

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

View File

@ -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 = [
{

View File

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

View File

@ -7,12 +7,6 @@ set(
${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)
target_compile_features(${exec_name} PRIVATE cxx_std_11)
target_link_libraries(${exec_name} PRIVATE ${target_name})
@ -25,10 +19,12 @@ 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
if(NOT CPPTRACE_BUILD_NO_SYMBOLS)
check_cxx_compiler_flag("-gdwarf-4" HAS_DWARF4)
if(HAS_DWARF4)
target_compile_options(${exec_name} PRIVATE "$<$<CONFIG:Debug>:-gdwarf-4>")
endif()
endif()
# TODO: add debug info for mingw clang?
if(CPPTRACE_BUILD_TEST_RDYNAMIC)
set_property(TARGET ${exec_name} PROPERTY ENABLE_EXPORTS ON)
@ -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()

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/from_current.hpp>
#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());

View File

@ -1,3 +1,4 @@
#include "common.hpp"
#include <algorithm>
#include <string_view>
#include <string>
@ -10,6 +11,8 @@
#include <cpptrace/cpptrace.hpp>
#include <cpptrace/from_current.hpp>
#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());

View File

@ -5,8 +5,11 @@
#include <gtest/gtest-matchers.h>
#include <gmock/gmock.h>
#include <gmock/gmock-matchers.h>
#include <cpptrace/cpptrace.hpp>
#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<int>& 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;
}

View File

@ -4,8 +4,11 @@
#include <gtest/gtest-matchers.h>
#include <gmock/gmock.h>
#include <gmock/gmock-matchers.h>
#include <cpptrace/cpptrace.hpp>
#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<int>& 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<int>& 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<int>& 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);

View File

@ -8,6 +8,8 @@
#include <cpptrace/cpptrace.hpp>
#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"));
}
}