1 //===-- llvm/unittest/Support/SignalsTest.cpp - Signals unit tests --------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// 9 /// \file 10 /// This file contains unit tests for Signals.cpp and Signals.inc. 11 /// 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/Support/Signals.h" 15 #include "llvm/ADT/ScopeExit.h" 16 #include "llvm/Config/config.h" 17 #include "gmock/gmock.h" 18 #include "gtest/gtest-matchers.h" 19 #include "gtest/gtest.h" 20 21 using namespace llvm; 22 using namespace llvm::sys; 23 using testing::MatchesRegex; 24 using testing::Not; 25 26 #define TAG_BEGIN "\\{\\{\\{" 27 #define TAG_END "\\}\\}\\}" 28 // %p in the Symbolizer Markup Format spec 29 #define P_REGEX "(0+|0x[0-9a-fA-F]+)" 30 // %i in the Symbolizer Markup Format spec 31 #define I_REGEX "(0x[0-9a-fA-F]+|0[0-7]+|[0-9]+)" 32 33 #if defined(HAVE_BACKTRACE) && ENABLE_BACKTRACES && HAVE_LINK_H && \ 34 (defined(__linux__) || defined(__FreeBSD__) || \ 35 defined(__FreeBSD_kernel__) || defined(__NetBSD__)) 36 TEST(SignalsTest, PrintsSymbolizerMarkup) { 37 auto Exit = 38 make_scope_exit([]() { unsetenv("LLVM_ENABLE_SYMBOLIZER_MARKUP"); }); 39 setenv("LLVM_ENABLE_SYMBOLIZER_MARKUP", "1", 1); 40 std::string Res; 41 raw_string_ostream RawStream(Res); 42 PrintStackTrace(RawStream); 43 EXPECT_THAT(Res, MatchesRegex(TAG_BEGIN "reset" TAG_END ".*")); 44 // Module line for main binary 45 EXPECT_THAT(Res, 46 MatchesRegex(".*" TAG_BEGIN 47 "module:0:[^:]*SupportTests:elf:[0-9a-f]+" TAG_END 48 ".*")); 49 // Text segment for main binary 50 EXPECT_THAT(Res, MatchesRegex(".*" TAG_BEGIN "mmap:" P_REGEX ":" I_REGEX 51 ":load:0:rx:" P_REGEX TAG_END ".*")); 52 // Backtrace line 53 EXPECT_THAT(Res, MatchesRegex(".*" TAG_BEGIN "bt:0:" P_REGEX ".*")); 54 } 55 56 TEST(SignalsTest, SymbolizerMarkupDisabled) { 57 auto Exit = make_scope_exit([]() { unsetenv("LLVM_DISABLE_SYMBOLIZATION"); }); 58 setenv("LLVM_DISABLE_SYMBOLIZATION", "1", 1); 59 std::string Res; 60 raw_string_ostream RawStream(Res); 61 PrintStackTrace(RawStream); 62 EXPECT_THAT(Res, Not(MatchesRegex(TAG_BEGIN "reset" TAG_END ".*"))); 63 } 64 65 #endif // defined(HAVE_BACKTRACE) && ... 66