1 //===-- StackFrameRecognizerTest.cpp --------------------------------------===//
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 #include "lldb/Target/StackFrameRecognizer.h"
10 #include "Plugins/Platform/Linux/PlatformLinux.h"
11 #include "lldb/Core/Debugger.h"
12 #include "lldb/Host/FileSystem.h"
13 #include "lldb/Host/HostInfo.h"
14 #include "lldb/Utility/Reproducer.h"
15 #include "lldb/lldb-enumerations.h"
16 #include "lldb/lldb-forward.h"
17 #include "lldb/lldb-private-enumerations.h"
18 #include "lldb/lldb-private.h"
19 #include "llvm/Support/FormatVariadic.h"
20 #include "gtest/gtest.h"
21 
22 using namespace lldb_private;
23 using namespace lldb_private::repro;
24 using namespace lldb;
25 
26 namespace {
27 class StackFrameRecognizerTest : public ::testing::Test {
28 public:
SetUp()29   void SetUp() override {
30     llvm::cantFail(Reproducer::Initialize(ReproducerMode::Off, llvm::None));
31     FileSystem::Initialize();
32     HostInfo::Initialize();
33 
34     // Pretend Linux is the host platform.
35     platform_linux::PlatformLinux::Initialize();
36     ArchSpec arch("powerpc64-pc-linux");
37     Platform::SetHostPlatform(
38         platform_linux::PlatformLinux::CreateInstance(true, &arch));
39   }
40 
TearDown()41   void TearDown() override {
42     platform_linux::PlatformLinux::Terminate();
43     HostInfo::Terminate();
44     FileSystem::Terminate();
45     Reproducer::Terminate();
46   }
47 };
48 
49 class DummyStackFrameRecognizer : public StackFrameRecognizer {
50 public:
GetName()51   std::string GetName() override { return "Dummy StackFrame Recognizer"; }
52 };
53 
RegisterDummyStackFrameRecognizer(StackFrameRecognizerManager & manager)54 void RegisterDummyStackFrameRecognizer(StackFrameRecognizerManager &manager) {
55   RegularExpressionSP module_regex_sp = nullptr;
56   RegularExpressionSP symbol_regex_sp(new RegularExpression("boom"));
57 
58   StackFrameRecognizerSP dummy_recognizer_sp(new DummyStackFrameRecognizer());
59 
60   manager.AddRecognizer(dummy_recognizer_sp, module_regex_sp, symbol_regex_sp,
61                         false);
62 }
63 
64 } // namespace
65 
TEST_F(StackFrameRecognizerTest,NullModuleRegex)66 TEST_F(StackFrameRecognizerTest, NullModuleRegex) {
67   DebuggerSP debugger_sp = Debugger::CreateInstance();
68   ASSERT_TRUE(debugger_sp);
69 
70   StackFrameRecognizerManager manager;
71 
72   RegisterDummyStackFrameRecognizer(manager);
73 
74   bool any_printed = false;
75   manager.ForEach([&any_printed](uint32_t recognizer_id, std::string name,
76                                  std::string function,
77                                  llvm::ArrayRef<ConstString> symbols,
78                                  bool regexp) { any_printed = true; });
79 
80   EXPECT_TRUE(any_printed);
81 }
82