xref: /llvm-project/llvm/unittests/Support/SignalsTest.cpp (revision 22b9404f09dc4411e4f6d05f4a1724897e5e131a)
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