xref: /llvm-project/llvm/unittests/Support/SignalsTest.cpp (revision 7c06786479311fbf19f54c7980c6e96936fa05a8)
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.h"
19 
20 using namespace llvm;
21 using namespace llvm::sys;
22 using testing::MatchesRegex;
23 using testing::Not;
24 
25 #define TAG_BEGIN "\\{\\{\\{"
26 #define TAG_END "\\}\\}\\}"
27 // %p in the Symbolizer Markup Format spec
28 #define P_REGEX "(0+|0x[0-9a-fA-F]+)"
29 // %i in the Symbolizer Markup Format spec
30 #define I_REGEX "(0x[0-9a-fA-F]+|0[0-7]+|[0-9]+)"
31 
32 #if defined(HAVE_BACKTRACE) && ENABLE_BACKTRACES &&                            \
33     (defined(__linux__) || defined(__FreeBSD__) ||                             \
34      defined(__FreeBSD_kernel__) || defined(__NetBSD__))
35 TEST(SignalsTest, PrintsSymbolizerMarkup) {
36   auto Exit =
37       make_scope_exit([]() { unsetenv("LLVM_ENABLE_SYMBOLIZER_MARKUP"); });
38   setenv("LLVM_ENABLE_SYMBOLIZER_MARKUP", "1", 1);
39   std::string Res;
40   raw_string_ostream RawStream(Res);
41   PrintStackTrace(RawStream);
42   EXPECT_THAT(Res, MatchesRegex(TAG_BEGIN "reset" TAG_END ".*"));
43   // Module line for main binary
44   EXPECT_THAT(Res,
45               MatchesRegex(".*" TAG_BEGIN
46                            "module:0:[^:]*SupportTests:elf:[0-9a-f]+" TAG_END
47                            ".*"));
48   // Text segment for main binary
49   EXPECT_THAT(Res, MatchesRegex(".*" TAG_BEGIN "mmap:" P_REGEX ":" I_REGEX
50                                 ":load:0:rx:" P_REGEX TAG_END ".*"));
51   // Backtrace line
52   EXPECT_THAT(Res, MatchesRegex(".*" TAG_BEGIN "bt:0:" P_REGEX ".*"));
53 }
54 
55 TEST(SignalsTest, SymbolizerMarkupDisabled) {
56   auto Exit = make_scope_exit([]() { unsetenv("LLVM_DISABLE_SYMBOLIZATION"); });
57   setenv("LLVM_DISABLE_SYMBOLIZATION", "1", 1);
58   std::string Res;
59   raw_string_ostream RawStream(Res);
60   PrintStackTrace(RawStream);
61   EXPECT_THAT(Res, Not(MatchesRegex(TAG_BEGIN "reset" TAG_END ".*")));
62 }
63 
64 #endif // defined(HAVE_BACKTRACE) && ...
65