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 29 #if defined(HAVE_BACKTRACE) && ENABLE_BACKTRACES && HAVE_LINK_H && \ 30 (defined(__linux__) || defined(__FreeBSD__) || \ 31 defined(__FreeBSD_kernel__) || defined(__NetBSD__)) 32 TEST(SignalsTest, PrintsSymbolizerMarkup) { 33 auto Exit = 34 make_scope_exit([]() { unsetenv("LLVM_ENABLE_SYMBOLIZER_MARKUP"); }); 35 setenv("LLVM_ENABLE_SYMBOLIZER_MARKUP", "1", 1); 36 std::string Res; 37 raw_string_ostream RawStream(Res); 38 PrintStackTrace(RawStream); 39 EXPECT_THAT(Res, MatchesRegex(TAG_BEGIN "reset" TAG_END ".*")); 40 // Module line for main binary 41 EXPECT_THAT(Res, 42 MatchesRegex(".*" TAG_BEGIN 43 "module:0:[^:]*SupportTests:elf:[0-9a-f]+" TAG_END 44 ".*")); 45 // Text segment for main binary 46 EXPECT_THAT( 47 Res, 48 MatchesRegex(".*" TAG_BEGIN 49 "mmap:0x[0-9a-f]+:0x[0-9a-f]+:load:0:rx:0x[0-9a-f]+" TAG_END 50 ".*")); 51 // Backtrace line 52 EXPECT_THAT(Res, MatchesRegex(".*" TAG_BEGIN "bt:0:0x[0-9a-f]+" 53 ".*")); 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