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 bool lldb_private::python::SWIGBridge::LLDBSwigPythonCallModuleInit( 215 const char *python_module_name, const char *session_dictionary_name, 216 lldb::DebuggerSP debugger) { 217 return false; 218 } 219 220 python::PythonObject 221 lldb_private::python::SWIGBridge::LLDBSWIGPythonCreateOSPlugin( 222 const char *python_class_name, const char *session_dictionary_name, 223 const lldb::ProcessSP &process_sp) { 224 return python::PythonObject(); 225 } 226 227 python::PythonObject 228 lldb_private::python::SWIGBridge::LLDBSWIGPython_CreateFrameRecognizer( 229 const char *python_class_name, const char *session_dictionary_name) { 230 return python::PythonObject(); 231 } 232 233 PyObject * 234 lldb_private::python::SWIGBridge::LLDBSwigPython_GetRecognizedArguments( 235 PyObject *implementor, const lldb::StackFrameSP &frame_sp) { 236 return nullptr; 237 } 238 239 bool lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordProcess( 240 const char *python_function_name, const char *session_dictionary_name, 241 const lldb::ProcessSP &process, std::string &output) { 242 return false; 243 } 244 245 std::optional<std::string> 246 lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordThread( 247 const char *python_function_name, const char *session_dictionary_name, 248 lldb::ThreadSP thread) { 249 return std::nullopt; 250 } 251 252 bool lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordTarget( 253 const char *python_function_name, const char *session_dictionary_name, 254 const lldb::TargetSP &target, std::string &output) { 255 return false; 256 } 257 258 std::optional<std::string> 259 lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordFrame( 260 const char *python_function_name, const char *session_dictionary_name, 261 lldb::StackFrameSP frame) { 262 return std::nullopt; 263 } 264 265 bool lldb_private::python::SWIGBridge::LLDBSWIGPythonRunScriptKeywordValue( 266 const char *python_function_name, const char *session_dictionary_name, 267 const lldb::ValueObjectSP &value, std::string &output) { 268 return false; 269 } 270 271 void *lldb_private::python::SWIGBridge::LLDBSWIGPython_GetDynamicSetting( 272 void *module, const char *setting, const lldb::TargetSP &target_sp) { 273 return nullptr; 274 } 275 276 python::PythonObject 277 lldb_private::python::SWIGBridge::ToSWIGWrapper(Status status) { 278 return python::PythonObject(); 279 } 280 281 python::PythonObject 282 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ProcessAttachInfoSP) { 283 return python::PythonObject(); 284 } 285 286 python::PythonObject 287 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ProcessLaunchInfoSP) { 288 return python::PythonObject(); 289 } 290 291 python::PythonObject 292 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::DataExtractorSP) { 293 return python::PythonObject(); 294 } 295 296 python::PythonObject 297 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ExecutionContextRefSP) { 298 return python::PythonObject(); 299 } 300 301 python::PythonObject 302 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ThreadPlanSP) { 303 return python::PythonObject(); 304 } 305 306 python::PythonObject 307 lldb_private::python::SWIGBridge::ToSWIGWrapper(lldb::ProcessSP) { 308 return python::PythonObject(); 309 } 310 311 python::PythonObject lldb_private::python::SWIGBridge::ToSWIGWrapper( 312 const lldb_private::StructuredDataImpl &) { 313 return python::PythonObject(); 314 } 315 316 python::PythonObject 317 lldb_private::python::SWIGBridge::ToSWIGWrapper(Event *event) { 318 return python::PythonObject(); 319 } 320 321 python::PythonObject 322 lldb_private::python::SWIGBridge::ToSWIGWrapper(const Stream *stream) { 323 return python::PythonObject(); 324 } 325 326 python::PythonObject lldb_private::python::SWIGBridge::ToSWIGWrapper( 327 std::shared_ptr<lldb::SBStream> stream_sb) { 328 return python::PythonObject(); 329 } 330