|  | //===-- llvm/unittest/Support/SignalsTest.cpp - Signals unit tests --------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | /// | 
|  | /// \file | 
|  | /// This file contains unit tests for Signals.cpp and Signals.inc. | 
|  | /// | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "llvm/Support/Signals.h" | 
|  | #include "llvm/ADT/ScopeExit.h" | 
|  | #include "llvm/Config/config.h" | 
|  | #include "gmock/gmock.h" | 
|  | #include "gtest/gtest.h" | 
|  |  | 
|  | using namespace llvm; | 
|  | using namespace llvm::sys; | 
|  | using testing::MatchesRegex; | 
|  | using testing::Not; | 
|  |  | 
|  | #define TAG_BEGIN "\\{\\{\\{" | 
|  | #define TAG_END "\\}\\}\\}" | 
|  | // %p in the Symbolizer Markup Format spec | 
|  | #define P_REGEX "(0+|0x[0-9a-fA-F]+)" | 
|  | // %i in the Symbolizer Markup Format spec | 
|  | #define I_REGEX "(0x[0-9a-fA-F]+|0[0-7]+|[0-9]+)" | 
|  |  | 
|  | #if defined(HAVE_BACKTRACE) && ENABLE_BACKTRACES &&                            \ | 
|  | (defined(__linux__) || defined(__FreeBSD__) ||                             \ | 
|  | defined(__FreeBSD_kernel__) || defined(__NetBSD__)) | 
|  | TEST(SignalsTest, PrintsSymbolizerMarkup) { | 
|  | auto Exit = | 
|  | make_scope_exit([]() { unsetenv("LLVM_ENABLE_SYMBOLIZER_MARKUP"); }); | 
|  | setenv("LLVM_ENABLE_SYMBOLIZER_MARKUP", "1", 1); | 
|  | std::string Res; | 
|  | raw_string_ostream RawStream(Res); | 
|  | PrintStackTrace(RawStream); | 
|  | EXPECT_THAT(Res, MatchesRegex(TAG_BEGIN "reset" TAG_END ".*")); | 
|  | // Module line for main binary | 
|  | EXPECT_THAT(Res, | 
|  | MatchesRegex(".*" TAG_BEGIN | 
|  | "module:0:[^:]*SupportTests:elf:[0-9a-f]+" TAG_END | 
|  | ".*")); | 
|  | // Text segment for main binary | 
|  | EXPECT_THAT(Res, MatchesRegex(".*" TAG_BEGIN "mmap:" P_REGEX ":" I_REGEX | 
|  | ":load:0:rx:" P_REGEX TAG_END ".*")); | 
|  | // Backtrace line | 
|  | EXPECT_THAT(Res, MatchesRegex(".*" TAG_BEGIN "bt:0:" P_REGEX ".*")); | 
|  | } | 
|  |  | 
|  | TEST(SignalsTest, SymbolizerMarkupDisabled) { | 
|  | auto Exit = make_scope_exit([]() { unsetenv("LLVM_DISABLE_SYMBOLIZATION"); }); | 
|  | setenv("LLVM_DISABLE_SYMBOLIZATION", "1", 1); | 
|  | std::string Res; | 
|  | raw_string_ostream RawStream(Res); | 
|  | PrintStackTrace(RawStream); | 
|  | EXPECT_THAT(Res, Not(MatchesRegex(TAG_BEGIN "reset" TAG_END ".*"))); | 
|  | } | 
|  |  | 
|  | #endif // defined(HAVE_BACKTRACE) && ... |