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 lldb::ValueObjectSP 158 lldb_private::python::SWIGBridge::LLDBSWIGPython_GetValueObjectSPFromSBValue( 159 void *data) { 160 return nullptr; 161 } 162 163 bool lldb_private::python::SWIGBridge:: 164 LLDBSwigPython_UpdateSynthProviderInstance(PyObject *implementor) { 165 return false; 166 } 167 168 bool lldb_private::python::SWIGBridge:: 169 LLDBSwigPython_MightHaveChildrenSynthProviderInstance( 170 PyObject *implementor) { 171 return false; 172 } 173 174 PyObject * 175 lldb_private::python::SWIGBridge::LLDBSwigPython_GetValueSynthProviderInstance( 176 PyObject *implementor) { 177 return nullptr; 178 } 179 180 bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallCommand( 181 const char *python_function_name, const char *session_dictionary_name, 182 lldb::DebuggerSP debugger, const char *args, 183 lldb_private::CommandReturnObject &cmd_retobj, 184 lldb::ExecutionContextRefSP exe_ctx_ref_sp) { 185 return false; 186 } 187 188 bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallCommandObject( 189 PyObject *implementor, lldb::DebuggerSP debugger, const char *args, 190 lldb_private::CommandReturnObject &cmd_retobj, 191 lldb::ExecutionContextRefSP exe_ctx_ref_sp) { 192 return false; 193 } 194 195 bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallParsedCommandObject( 196 PyObject *implementor, lldb::DebuggerSP debugger, 197 StructuredDataImpl &args_impl, 198 lldb_private::CommandReturnObject &cmd_retobj, 199 lldb::ExecutionContextRefSP exe_ctx_ref_sp) { 200 return false; 201 } 202 203 bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallModuleInit( 204 const char *python_module_name, const char *session_dictionary_name, 205 lldb::DebuggerSP debugger) { 206 return false; 207 } 208 209 python::PythonObject 210 lldb_private::python::SWIGBridge::LLDBSWIGPythonCreateOSPlugin( 211 const char *python_class_name, const char *session_dictionary_name, 212 const lldb::ProcessSP &process_sp) { 213 return python::PythonObject(); 214 } 215 216 python::PythonObject 217 lldb_private::python::SWIGBridge::LLDBSWIGPython_CreateFrameRecognizer( 218 const char *python_class_name, const char *session_dictionary_name) { 219 return python::PythonObject(); 220 } 221 222 PyObject * 223 lldb_private::python::SWIGBridge::LLDBSwigPython_GetRecognizedArguments( 224 PyObject *implementor, const lldb::StackFrameSP &frame_sp) { 225 return nullptr; 226 } 227 228 bool lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordProcess( 229 const char *python_function_name, const char *session_dictionary_name, 230 const lldb::ProcessSP &process, std::string &output) { 231 return false; 232 } 233 234 std::optional<std::string> 235 lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordThread( 236 const char *python_function_name, const char *session_dictionary_name, 237 lldb::ThreadSP thread) { 238 return std::nullopt; 239 } 240 241 bool lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordTarget( 242 const char *python_function_name, const char *session_dictionary_name, 243 const lldb::TargetSP &target, std::string &output) { 244 return false; 245 } 246 247 std::optional<std::string> 248 lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordFrame( 249 const char *python_function_name, const char *session_dictionary_name, 250 lldb::StackFrameSP frame) { 251 return std::nullopt; 252 } 253 254 bool lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordValue( 255 const char *python_function_name, const char *session_dictionary_name, 256 const lldb::ValueObjectSP &value, std::string &output) { 257 return false; 258 } 259 260 void *lldb_private::python::SWIGBridge::LLDBSWIGPython_GetDynamicSetting( 261 void *module, const char *setting, const lldb::TargetSP &target_sp) { 262 return nullptr; 263 } 264 265 python::PythonObject 266 lldb_private::python::SWIGBridge::LLDBSwigPythonCreateScriptedStopHook( 267 lldb::TargetSP target_sp, const char *python_class_name, 268 const char *session_dictionary_name, const StructuredDataImpl &args_impl, 269 Status &error) { 270 return python::PythonObject(); 271 } 272 273 bool lldb_private::python::SWIGBridge::LLDBSwigPythonStopHookCallHandleStop( 274 void *implementor, lldb::ExecutionContextRefSP exc_ctx_sp, 275 lldb::StreamSP stream) { 276 return false; 277 } 278 279 python::PythonObject 280 lldb_private::python::SWIGBridge::ToSWIGWrapper(const Status &status) { 281 return python::PythonObject(); 282 } 283 284 python::PythonObject 285 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ProcessAttachInfoSP) { 286 return python::PythonObject(); 287 } 288 289 python::PythonObject 290 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ProcessLaunchInfoSP) { 291 return python::PythonObject(); 292 } 293 294 python::PythonObject 295 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::DataExtractorSP) { 296 return python::PythonObject(); 297 } 298 299 python::PythonObject 300 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ExecutionContextRefSP) { 301 return python::PythonObject(); 302 } 303 304 python::PythonObject 305 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ThreadPlanSP) { 306 return python::PythonObject(); 307 } 308 309 python::PythonObject 310 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ProcessSP) { 311 return python::PythonObject(); 312 } 313 314 python::PythonObject lldb_private::python::SWIGBridge::ToSWIGWrapper( 315 const lldb_private::StructuredDataImpl &) { 316 return python::PythonObject(); 317 } 318 319 python::PythonObject 320 lldb_private::python::SWIGBridge::ToSWIGWrapper(Event *event) { 321 return python::PythonObject(); 322 } 323 324 python::PythonObject 325 lldb_private::python::SWIGBridge::ToSWIGWrapper(const Stream *stream) { 326 return python::PythonObject(); 327 } 328 329 python::PythonObject lldb_private::python::SWIGBridge::ToSWIGWrapper( 330 std::shared_ptr<lldb::SBStream> stream_sb) { 331 return python::PythonObject(); 332 } 333