xref: /llvm-project/lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp (revision 6f8251fb382b2fe979f5c79c44cd2a27971c7b9b)
1 //===-- PythonTestSuite.cpp -------------------------------------*- C++ -*-===//
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 "gtest/gtest.h"
10 
11 #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h"
12 #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h"
13 #include "Plugins/ScriptInterpreter/Python/lldb-python.h"
14 #include "lldb/Host/FileSystem.h"
15 #include "lldb/Host/HostInfo.h"
16 
17 #include "PythonTestSuite.h"
18 
19 using namespace lldb_private;
20 class TestScriptInterpreterPython : public ScriptInterpreterPythonImpl {
21 public:
22   using ScriptInterpreterPythonImpl::Initialize;
23   using ScriptInterpreterPythonImpl::InitializePrivate;
24 };
25 
26 void PythonTestSuite::SetUp() {
27   FileSystem::Initialize();
28   HostInfoBase::Initialize();
29   // ScriptInterpreterPython::Initialize() depends on HostInfo being
30   // initializedso it can compute the python directory etc.
31   TestScriptInterpreterPython::Initialize();
32   TestScriptInterpreterPython::InitializePrivate();
33 
34   // Although we don't care about concurrency for the purposes of running
35   // this test suite, Python requires the GIL to be locked even for
36   // deallocating memory, which can happen when you call Py_DECREF or
37   // Py_INCREF.  So acquire the GIL for the entire duration of this
38   // test suite.
39   m_gil_state = PyGILState_Ensure();
40 }
41 
42 void PythonTestSuite::TearDown() {
43   PyGILState_Release(m_gil_state);
44 
45   TestScriptInterpreterPython::Terminate();
46   HostInfoBase::Terminate();
47   FileSystem::Terminate();
48 }
49 
50 // The following functions are the Pythonic implementations of the required
51 // callbacks. Because they're defined in libLLDB which we cannot link for the
52 // unit test, we have a 'default' implementation here.
53 
54 #if PY_MAJOR_VERSION >= 3
55 extern "C" PyObject *PyInit__lldb(void) { return nullptr; }
56 #define LLDBSwigPyInit PyInit__lldb
57 #else
58 extern "C" void init_lldb(void) {}
59 #define LLDBSwigPyInit init_lldb
60 #endif
61 
62 extern "C" bool LLDBSwigPythonBreakpointCallbackFunction(
63     const char *python_function_name, const char *session_dictionary_name,
64     const lldb::StackFrameSP &sb_frame,
65     const lldb::BreakpointLocationSP &sb_bp_loc) {
66   return false;
67 }
68 
69 extern "C" bool LLDBSwigPythonWatchpointCallbackFunction(
70     const char *python_function_name, const char *session_dictionary_name,
71     const lldb::StackFrameSP &sb_frame, const lldb::WatchpointSP &sb_wp) {
72   return false;
73 }
74 
75 extern "C" bool LLDBSwigPythonCallTypeScript(
76     const char *python_function_name, void *session_dictionary,
77     const lldb::ValueObjectSP &valobj_sp, void **pyfunct_wrapper,
78     const lldb::TypeSummaryOptionsSP &options_sp, std::string &retval) {
79   return false;
80 }
81 
82 extern "C" void *
83 LLDBSwigPythonCreateSyntheticProvider(const char *python_class_name,
84                                       const char *session_dictionary_name,
85                                       const lldb::ValueObjectSP &valobj_sp) {
86   return nullptr;
87 }
88 
89 extern "C" void *
90 LLDBSwigPythonCreateCommandObject(const char *python_class_name,
91                                   const char *session_dictionary_name,
92                                   const lldb::DebuggerSP debugger_sp) {
93   return nullptr;
94 }
95 
96 extern "C" void *LLDBSwigPythonCreateScriptedThreadPlan(
97     const char *python_class_name, const char *session_dictionary_name,
98     const lldb::ThreadPlanSP &thread_plan_sp) {
99   return nullptr;
100 }
101 
102 extern "C" bool LLDBSWIGPythonCallThreadPlan(void *implementor,
103                                              const char *method_name,
104                                              Event *event_sp, bool &got_error) {
105   return false;
106 }
107 
108 extern "C" void *LLDBSwigPythonCreateScriptedBreakpointResolver(
109     const char *python_class_name, const char *session_dictionary_name,
110     lldb_private::StructuredDataImpl *args, lldb::BreakpointSP &bkpt_sp) {
111   return nullptr;
112 }
113 
114 extern "C" unsigned int
115 LLDBSwigPythonCallBreakpointResolver(void *implementor, const char *method_name,
116                                      lldb_private::SymbolContext *sym_ctx) {
117   return 0;
118 }
119 
120 extern "C" size_t LLDBSwigPython_CalculateNumChildren(void *implementor,
121                                                       uint32_t max) {
122   return 0;
123 }
124 
125 extern "C" void *LLDBSwigPython_GetChildAtIndex(void *implementor,
126                                                 uint32_t idx) {
127   return nullptr;
128 }
129 
130 extern "C" int LLDBSwigPython_GetIndexOfChildWithName(void *implementor,
131                                                       const char *child_name) {
132   return 0;
133 }
134 
135 extern "C" void *LLDBSWIGPython_CastPyObjectToSBValue(void *data) {
136   return nullptr;
137 }
138 
139 extern lldb::ValueObjectSP
140 LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data) {
141   return nullptr;
142 }
143 
144 extern "C" bool LLDBSwigPython_UpdateSynthProviderInstance(void *implementor) {
145   return false;
146 }
147 
148 extern "C" bool
149 LLDBSwigPython_MightHaveChildrenSynthProviderInstance(void *implementor) {
150   return false;
151 }
152 
153 extern "C" void *
154 LLDBSwigPython_GetValueSynthProviderInstance(void *implementor) {
155   return nullptr;
156 }
157 
158 extern "C" bool
159 LLDBSwigPythonCallCommand(const char *python_function_name,
160                           const char *session_dictionary_name,
161                           lldb::DebuggerSP &debugger, const char *args,
162                           lldb_private::CommandReturnObject &cmd_retobj,
163                           lldb::ExecutionContextRefSP exe_ctx_ref_sp) {
164   return false;
165 }
166 
167 extern "C" bool
168 LLDBSwigPythonCallCommandObject(void *implementor, lldb::DebuggerSP &debugger,
169                                 const char *args,
170                                 lldb_private::CommandReturnObject &cmd_retobj,
171                                 lldb::ExecutionContextRefSP exe_ctx_ref_sp) {
172   return false;
173 }
174 
175 extern "C" bool
176 LLDBSwigPythonCallModuleInit(const char *python_module_name,
177                              const char *session_dictionary_name,
178                              lldb::DebuggerSP &debugger) {
179   return false;
180 }
181 
182 extern "C" void *
183 LLDBSWIGPythonCreateOSPlugin(const char *python_class_name,
184                              const char *session_dictionary_name,
185                              const lldb::ProcessSP &process_sp) {
186   return nullptr;
187 }
188 
189 extern "C" void *
190 LLDBSWIGPython_CreateFrameRecognizer(const char *python_class_name,
191                                      const char *session_dictionary_name) {
192   return nullptr;
193 }
194 
195 extern "C" void *
196 LLDBSwigPython_GetRecognizedArguments(void *implementor,
197                                       const lldb::StackFrameSP &frame_sp) {
198   return nullptr;
199 }
200 
201 extern "C" bool LLDBSWIGPythonRunScriptKeywordProcess(
202     const char *python_function_name, const char *session_dictionary_name,
203     lldb::ProcessSP &process, std::string &output) {
204   return false;
205 }
206 
207 extern "C" bool LLDBSWIGPythonRunScriptKeywordThread(
208     const char *python_function_name, const char *session_dictionary_name,
209     lldb::ThreadSP &thread, std::string &output) {
210   return false;
211 }
212 
213 extern "C" bool LLDBSWIGPythonRunScriptKeywordTarget(
214     const char *python_function_name, const char *session_dictionary_name,
215     lldb::TargetSP &target, std::string &output) {
216   return false;
217 }
218 
219 extern "C" bool LLDBSWIGPythonRunScriptKeywordFrame(
220     const char *python_function_name, const char *session_dictionary_name,
221     lldb::StackFrameSP &frame, std::string &output) {
222   return false;
223 }
224 
225 extern "C" bool LLDBSWIGPythonRunScriptKeywordValue(
226     const char *python_function_name, const char *session_dictionary_name,
227     lldb::ValueObjectSP &value, std::string &output) {
228   return false;
229 }
230 
231 extern "C" void *
232 LLDBSWIGPython_GetDynamicSetting(void *module, const char *setting,
233                                  const lldb::TargetSP &target_sp) {
234   return nullptr;
235 }
236