1047c4b03SMed Ismail Bennani //===-- StackFrameRecognizerTest.cpp --------------------------------------===//
2047c4b03SMed Ismail Bennani //
3047c4b03SMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4047c4b03SMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information.
5047c4b03SMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6047c4b03SMed Ismail Bennani //
7047c4b03SMed Ismail Bennani //===----------------------------------------------------------------------===//
8047c4b03SMed Ismail Bennani 
9047c4b03SMed Ismail Bennani #include "lldb/Target/StackFrameRecognizer.h"
10047c4b03SMed Ismail Bennani #include "Plugins/Platform/Linux/PlatformLinux.h"
11047c4b03SMed Ismail Bennani #include "lldb/Core/Debugger.h"
12047c4b03SMed Ismail Bennani #include "lldb/Host/FileSystem.h"
13047c4b03SMed Ismail Bennani #include "lldb/Host/HostInfo.h"
14047c4b03SMed Ismail Bennani #include "lldb/Utility/Reproducer.h"
15047c4b03SMed Ismail Bennani #include "lldb/lldb-enumerations.h"
16047c4b03SMed Ismail Bennani #include "lldb/lldb-forward.h"
17047c4b03SMed Ismail Bennani #include "lldb/lldb-private-enumerations.h"
18047c4b03SMed Ismail Bennani #include "lldb/lldb-private.h"
19047c4b03SMed Ismail Bennani #include "llvm/Support/FormatVariadic.h"
20047c4b03SMed Ismail Bennani #include "gtest/gtest.h"
21047c4b03SMed Ismail Bennani 
22047c4b03SMed Ismail Bennani using namespace lldb_private;
23047c4b03SMed Ismail Bennani using namespace lldb_private::repro;
24047c4b03SMed Ismail Bennani using namespace lldb;
25047c4b03SMed Ismail Bennani 
26047c4b03SMed Ismail Bennani namespace {
27047c4b03SMed Ismail Bennani class StackFrameRecognizerTest : public ::testing::Test {
28047c4b03SMed Ismail Bennani public:
SetUp()29047c4b03SMed Ismail Bennani   void SetUp() override {
30047c4b03SMed Ismail Bennani     llvm::cantFail(Reproducer::Initialize(ReproducerMode::Off, llvm::None));
31047c4b03SMed Ismail Bennani     FileSystem::Initialize();
32047c4b03SMed Ismail Bennani     HostInfo::Initialize();
33047c4b03SMed Ismail Bennani 
34047c4b03SMed Ismail Bennani     // Pretend Linux is the host platform.
35047c4b03SMed Ismail Bennani     platform_linux::PlatformLinux::Initialize();
36047c4b03SMed Ismail Bennani     ArchSpec arch("powerpc64-pc-linux");
37047c4b03SMed Ismail Bennani     Platform::SetHostPlatform(
38047c4b03SMed Ismail Bennani         platform_linux::PlatformLinux::CreateInstance(true, &arch));
39047c4b03SMed Ismail Bennani   }
40047c4b03SMed Ismail Bennani 
TearDown()41047c4b03SMed Ismail Bennani   void TearDown() override {
42047c4b03SMed Ismail Bennani     platform_linux::PlatformLinux::Terminate();
43047c4b03SMed Ismail Bennani     HostInfo::Terminate();
44047c4b03SMed Ismail Bennani     FileSystem::Terminate();
45047c4b03SMed Ismail Bennani     Reproducer::Terminate();
46047c4b03SMed Ismail Bennani   }
47047c4b03SMed Ismail Bennani };
48047c4b03SMed Ismail Bennani 
49047c4b03SMed Ismail Bennani class DummyStackFrameRecognizer : public StackFrameRecognizer {
50047c4b03SMed Ismail Bennani public:
GetName()51047c4b03SMed Ismail Bennani   std::string GetName() override { return "Dummy StackFrame Recognizer"; }
52047c4b03SMed Ismail Bennani };
53047c4b03SMed Ismail Bennani 
RegisterDummyStackFrameRecognizer(StackFrameRecognizerManager & manager)54*1b7c9eaeSRaphael Isemann void RegisterDummyStackFrameRecognizer(StackFrameRecognizerManager &manager) {
55047c4b03SMed Ismail Bennani   RegularExpressionSP module_regex_sp = nullptr;
56047c4b03SMed Ismail Bennani   RegularExpressionSP symbol_regex_sp(new RegularExpression("boom"));
57047c4b03SMed Ismail Bennani 
58047c4b03SMed Ismail Bennani   StackFrameRecognizerSP dummy_recognizer_sp(new DummyStackFrameRecognizer());
59047c4b03SMed Ismail Bennani 
60*1b7c9eaeSRaphael Isemann   manager.AddRecognizer(dummy_recognizer_sp, module_regex_sp, symbol_regex_sp,
61*1b7c9eaeSRaphael Isemann                         false);
62047c4b03SMed Ismail Bennani }
63047c4b03SMed Ismail Bennani 
64047c4b03SMed Ismail Bennani } // namespace
65047c4b03SMed Ismail Bennani 
TEST_F(StackFrameRecognizerTest,NullModuleRegex)66047c4b03SMed Ismail Bennani TEST_F(StackFrameRecognizerTest, NullModuleRegex) {
67047c4b03SMed Ismail Bennani   DebuggerSP debugger_sp = Debugger::CreateInstance();
68047c4b03SMed Ismail Bennani   ASSERT_TRUE(debugger_sp);
69047c4b03SMed Ismail Bennani 
70*1b7c9eaeSRaphael Isemann   StackFrameRecognizerManager manager;
71*1b7c9eaeSRaphael Isemann 
72*1b7c9eaeSRaphael Isemann   RegisterDummyStackFrameRecognizer(manager);
73047c4b03SMed Ismail Bennani 
74047c4b03SMed Ismail Bennani   bool any_printed = false;
75*1b7c9eaeSRaphael Isemann   manager.ForEach([&any_printed](uint32_t recognizer_id, std::string name,
76*1b7c9eaeSRaphael Isemann                                  std::string function,
77*1b7c9eaeSRaphael Isemann                                  llvm::ArrayRef<ConstString> symbols,
78047c4b03SMed Ismail Bennani                                  bool regexp) { any_printed = true; });
79047c4b03SMed Ismail Bennani 
80047c4b03SMed Ismail Bennani   EXPECT_TRUE(any_printed);
81047c4b03SMed Ismail Bennani }
82