diff --git a/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt b/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt index 750966a051f059..632b84f7f20785 100644 --- a/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt +++ b/compiler-rt/lib/sanitizer_common/tests/CMakeLists.txt @@ -54,6 +54,7 @@ endforeach() set(SANITIZER_TEST_CFLAGS_COMMON ${COMPILER_RT_UNITTEST_CFLAGS} ${COMPILER_RT_GTEST_CFLAGS} + ${COMPILER_RT_GMOCK_CFLAGS} -I${COMPILER_RT_SOURCE_DIR}/include -I${COMPILER_RT_SOURCE_DIR}/lib -I${COMPILER_RT_SOURCE_DIR}/lib/sanitizer_common @@ -151,7 +152,7 @@ macro(add_sanitizer_tests_for_arch arch) generate_compiler_rt_tests(SANITIZER_TEST_OBJECTS SanitizerUnitTests "Sanitizer-${arch}-Test" ${arch} RUNTIME "${SANITIZER_COMMON_LIB}" - SOURCES ${SANITIZER_UNITTESTS} ${COMPILER_RT_GTEST_SOURCE} + SOURCES ${SANITIZER_UNITTESTS} ${COMPILER_RT_GTEST_SOURCE} ${COMPILER_RT_GMOCK_SOURCE} COMPILE_DEPS ${SANITIZER_TEST_HEADERS} DEPS gtest CFLAGS ${SANITIZER_TEST_CFLAGS_COMMON} ${extra_flags} @@ -208,6 +209,7 @@ if(ANDROID) add_executable(SanitizerTest ${SANITIZER_UNITTESTS} ${COMPILER_RT_GTEST_SOURCE} + ${COMPILER_RT_GMOCK_SOURCE} $ $ $) diff --git a/compiler-rt/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cpp b/compiler-rt/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cpp index cdf8a80657a8d1..1f216ffcab94e4 100644 --- a/compiler-rt/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cpp +++ b/compiler-rt/lib/sanitizer_common/tests/sanitizer_stacktrace_test.cpp @@ -14,8 +14,16 @@ #include +#include +#include + +#include "gmock/gmock.h" #include "gtest/gtest.h" #include "sanitizer_common/sanitizer_common.h" +#include "sanitizer_internal_defs.h" + +using testing::ContainsRegex; +using testing::MatchesRegex; namespace __sanitizer { @@ -185,32 +193,9 @@ TEST_F(StackPrintTest, SKIP_ON_SPARC(ContainsFullTrace)) { char buf[3000]; uptr len = trace.PrintTo(buf, sizeof(buf)); - - // This is the no-truncation case. - ASSERT_LT(len, sizeof(buf)); - - // Printed contents should always end with an empty line, unless truncated. - EXPECT_EQ(buf[len - 2], '\n'); - EXPECT_EQ(buf[len - 1], '\n'); - EXPECT_EQ(buf[len], '\0'); - - // Buffer contents are delimited by newlines, by default. - char *saveptr; - char *line = strtok_r(buf, "\n", &saveptr); - - // Checks buffer contents line-by-line. - for (u32 i = 0; i < trace.size; ++i) { - char traceline[100]; - - // Should be synced with the stack trace format, set above. - snprintf(traceline, sizeof(traceline) - 1, "#%u 0x%lx", i, - trace.trace[i] - 1); - - EXPECT_STREQ(line, traceline); - line = strtok_r(NULL, "\n", &saveptr); - } - - EXPECT_EQ(line, nullptr); + EXPECT_THAT(std::string(buf), + MatchesRegex("(#[0-9]+ 0x[0-9a-f]+\n){" + + std::to_string(trace.size) + "}\n")); } TEST_F(StackPrintTest, SKIP_ON_SPARC(TruncatesContents)) {