1 //===-- PythonTestSuite.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 "gtest/gtest.h" 10 11 #include "Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h" 12 #include "Plugins/ScriptInterpreter/Python/lldb-python.h" 13 14 #include "PythonTestSuite.h" 15 #include <optional> 16 17 void PythonTestSuite::SetUp() { 18 // Although we don't care about concurrency for the purposes of running 19 // this test suite, Python requires the GIL to be locked even for 20 // deallocating memory, which can happen when you call Py_DECREF or 21 // Py_INCREF. So acquire the GIL for the entire duration of this 22 // test suite. 23 Py_InitializeEx(0); 24 m_gil_state = PyGILState_Ensure(); 25 PyRun_SimpleString("import sys"); 26 } 27 28 void PythonTestSuite::TearDown() { 29 PyGILState_Release(m_gil_state); 30 31 // We could call Py_FinalizeEx here, but initializing and finalizing Python is 32 // pretty slow, so just keep Python initialized across tests. 33 } 34 35 // The following functions are the Pythonic implementations of the required 36 // callbacks. Because they're defined in libLLDB which we cannot link for the 37 // unit test, we have a 'default' implementation here. 38 39 extern "C" PyObject *PyInit__lldb(void) { return nullptr; } 40 41 llvm::Expected<bool> 42 lldb_private::python::SWIGBridge::LLDBSwigPythonBreakpointCallbackFunction( 43 const char *python_function_name, const char *session_dictionary_name, 44 const lldb::StackFrameSP &sb_frame, 45 const lldb::BreakpointLocationSP &sb_bp_loc, 46 const StructuredDataImpl &args_impl) { 47 return false; 48 } 49 50 bool lldb_private::python::SWIGBridge::LLDBSwigPythonWatchpointCallbackFunction( 51 const char *python_function_name, const char *session_dictionary_name, 52 const lldb::StackFrameSP &sb_frame, const lldb::WatchpointSP &sb_wp) { 53 return false; 54 } 55 56 bool lldb_private::python::SWIGBridge::LLDBSwigPythonFormatterCallbackFunction( 57 const char *python_function_name, const char *session_dictionary_name, 58 lldb::TypeImplSP type_impl_sp) { 59 return false; 60 } 61 62 bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallTypeScript( 63 const char *python_function_name, const void *session_dictionary, 64 const lldb::ValueObjectSP &valobj_sp, void **pyfunct_wrapper, 65 const lldb::TypeSummaryOptionsSP &options_sp, std::string &retval) { 66 return false; 67 } 68 69 python::PythonObject 70 lldb_private::python::SWIGBridge::LLDBSwigPythonCreateSyntheticProvider( 71 const char *python_class_name, const char *session_dictionary_name, 72 const lldb::ValueObjectSP &valobj_sp) { 73 return python::PythonObject(); 74 } 75 76 python::PythonObject 77 lldb_private::python::SWIGBridge::LLDBSwigPythonCreateCommandObject( 78 const char *python_class_name, const char *session_dictionary_name, 79 lldb::DebuggerSP debugger_sp) { 80 return python::PythonObject(); 81 } 82 83 python::PythonObject lldb_private::python::SWIGBridge:: 84 LLDBSwigPythonCreateScriptedBreakpointResolver( 85 const char *python_class_name, const char *session_dictionary_name, 86 const StructuredDataImpl &args, const lldb::BreakpointSP &bkpt_sp) { 87 return python::PythonObject(); 88 } 89 90 unsigned int 91 lldb_private::python::SWIGBridge::LLDBSwigPythonCallBreakpointResolver( 92 void *implementor, const char *method_name, 93 lldb_private::SymbolContext *sym_ctx) { 94 return 0; 95 } 96 97 size_t lldb_private::python::SWIGBridge::LLDBSwigPython_CalculateNumChildren( 98 PyObject *implementor, uint32_t max) { 99 return 0; 100 } 101 102 PyObject *lldb_private::python::SWIGBridge::LLDBSwigPython_GetChildAtIndex( 103 PyObject *implementor, uint32_t idx) { 104 return nullptr; 105 } 106 107 int lldb_private::python::SWIGBridge::LLDBSwigPython_GetIndexOfChildWithName( 108 PyObject *implementor, const char *child_name) { 109 return 0; 110 } 111 112 void * 113 lldb_private::python::LLDBSWIGPython_CastPyObjectToSBData(PyObject *data) { 114 return nullptr; 115 } 116 117 void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBBreakpoint( 118 PyObject *data) { 119 return nullptr; 120 } 121 122 void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBAttachInfo( 123 PyObject *data) { 124 return nullptr; 125 } 126 127 void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBLaunchInfo( 128 PyObject *data) { 129 return nullptr; 130 } 131 132 void * 133 lldb_private::python::LLDBSWIGPython_CastPyObjectToSBError(PyObject *data) { 134 return nullptr; 135 } 136 137 void * 138 lldb_private::python::LLDBSWIGPython_CastPyObjectToSBEvent(PyObject *data) { 139 return nullptr; 140 } 141 142 void * 143 lldb_private::python::LLDBSWIGPython_CastPyObjectToSBStream(PyObject *data) { 144 return nullptr; 145 } 146 147 void * 148 lldb_private::python::LLDBSWIGPython_CastPyObjectToSBValue(PyObject *data) { 149 return nullptr; 150 } 151 152 void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo( 153 PyObject *data) { 154 return nullptr; 155 } 156 157 void *lldb_private::python::LLDBSWIGPython_CastPyObjectToSBExecutionContext( 158 PyObject *data) { 159 return nullptr; 160 } 161 162 lldb::ValueObjectSP 163 lldb_private::python::SWIGBridge::LLDBSWIGPython_GetValueObjectSPFromSBValue( 164 void *data) { 165 return nullptr; 166 } 167 168 bool lldb_private::python::SWIGBridge:: 169 LLDBSwigPython_UpdateSynthProviderInstance(PyObject *implementor) { 170 return false; 171 } 172 173 bool lldb_private::python::SWIGBridge:: 174 LLDBSwigPython_MightHaveChildrenSynthProviderInstance( 175 PyObject *implementor) { 176 return false; 177 } 178 179 PyObject * 180 lldb_private::python::SWIGBridge::LLDBSwigPython_GetValueSynthProviderInstance( 181 PyObject *implementor) { 182 return nullptr; 183 } 184 185 bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallCommand( 186 const char *python_function_name, const char *session_dictionary_name, 187 lldb::DebuggerSP debugger, const char *args, 188 lldb_private::CommandReturnObject &cmd_retobj, 189 lldb::ExecutionContextRefSP exe_ctx_ref_sp) { 190 return false; 191 } 192 193 bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallCommandObject( 194 PyObject *implementor, lldb::DebuggerSP debugger, const char *args, 195 lldb_private::CommandReturnObject &cmd_retobj, 196 lldb::ExecutionContextRefSP exe_ctx_ref_sp) { 197 return false; 198 } 199 200 bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallParsedCommandObject( 201 PyObject *implementor, lldb::DebuggerSP debugger, 202 StructuredDataImpl &args_impl, 203 lldb_private::CommandReturnObject &cmd_retobj, 204 lldb::ExecutionContextRefSP exe_ctx_ref_sp) { 205 return false; 206 } 207 208 std::optional<std::string> 209 LLDBSwigPythonGetRepeatCommandForScriptedCommand(PyObject *implementor, 210 std::string &command) { 211 return std::nullopt; 212 } 213 214 StructuredData::DictionarySP 215 LLDBSwigPythonHandleArgumentCompletionForScriptedCommand( 216 PyObject *implementor, std::vector<llvm::StringRef> &args, size_t args_pos, 217 size_t pos_in_arg) { 218 return {}; 219 } 220 221 StructuredData::DictionarySP 222 LLDBSwigPythonHandleOptionArgumentCompletionForScriptedCommand( 223 PyObject *implementor, llvm::StringRef &long_options, size_t char_in_arg) { 224 return {}; 225 } 226 227 bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallModuleInit( 228 const char *python_module_name, const char *session_dictionary_name, 229 lldb::DebuggerSP debugger) { 230 return false; 231 } 232 233 python::PythonObject 234 lldb_private::python::SWIGBridge::LLDBSWIGPythonCreateOSPlugin( 235 const char *python_class_name, const char *session_dictionary_name, 236 const lldb::ProcessSP &process_sp) { 237 return python::PythonObject(); 238 } 239 240 python::PythonObject 241 lldb_private::python::SWIGBridge::LLDBSWIGPython_CreateFrameRecognizer( 242 const char *python_class_name, const char *session_dictionary_name) { 243 return python::PythonObject(); 244 } 245 246 PyObject * 247 lldb_private::python::SWIGBridge::LLDBSwigPython_GetRecognizedArguments( 248 PyObject *implementor, const lldb::StackFrameSP &frame_sp) { 249 return nullptr; 250 } 251 252 bool lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordProcess( 253 const char *python_function_name, const char *session_dictionary_name, 254 const lldb::ProcessSP &process, std::string &output) { 255 return false; 256 } 257 258 std::optional<std::string> 259 lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordThread( 260 const char *python_function_name, const char *session_dictionary_name, 261 lldb::ThreadSP thread) { 262 return std::nullopt; 263 } 264 265 bool lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordTarget( 266 const char *python_function_name, const char *session_dictionary_name, 267 const lldb::TargetSP &target, std::string &output) { 268 return false; 269 } 270 271 std::optional<std::string> 272 lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordFrame( 273 const char *python_function_name, const char *session_dictionary_name, 274 lldb::StackFrameSP frame) { 275 return std::nullopt; 276 } 277 278 bool lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordValue( 279 const char *python_function_name, const char *session_dictionary_name, 280 const lldb::ValueObjectSP &value, std::string &output) { 281 return false; 282 } 283 284 void *lldb_private::python::SWIGBridge::LLDBSWIGPython_GetDynamicSetting( 285 void *module, const char *setting, const lldb::TargetSP &target_sp) { 286 return nullptr; 287 } 288 289 python::PythonObject 290 lldb_private::python::SWIGBridge::ToSWIGWrapper(Status &&status) { 291 return python::PythonObject(); 292 } 293 294 python::PythonObject 295 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ProcessAttachInfoSP) { 296 return python::PythonObject(); 297 } 298 299 python::PythonObject 300 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ProcessLaunchInfoSP) { 301 return python::PythonObject(); 302 } 303 304 python::PythonObject 305 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::DataExtractorSP) { 306 return python::PythonObject(); 307 } 308 309 python::PythonObject 310 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ExecutionContextRefSP) { 311 return python::PythonObject(); 312 } 313 314 python::PythonObject 315 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ThreadPlanSP) { 316 return python::PythonObject(); 317 } 318 319 python::PythonObject 320 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ProcessSP) { 321 return python::PythonObject(); 322 } 323 324 python::PythonObject lldb_private::python::SWIGBridge::ToSWIGWrapper( 325 const lldb_private::StructuredDataImpl &) { 326 return python::PythonObject(); 327 } 328 329 python::PythonObject 330 lldb_private::python::SWIGBridge::ToSWIGWrapper(Event *event) { 331 return python::PythonObject(); 332 } 333 334 python::PythonObject 335 lldb_private::python::SWIGBridge::ToSWIGWrapper(const Stream *stream) { 336 return python::PythonObject(); 337 } 338 339 python::PythonObject lldb_private::python::SWIGBridge::ToSWIGWrapper( 340 std::shared_ptr<lldb::SBStream> stream_sb) { 341 return python::PythonObject(); 342 } 343