180814287SRaphael Isemann //===-- PythonTestSuite.cpp -----------------------------------------------===// 2c946d462SZachary Turner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6c946d462SZachary Turner // 7c946d462SZachary Turner //===----------------------------------------------------------------------===// 8c946d462SZachary Turner 9b9c1b51eSKate Stone #include "gtest/gtest.h" 10c946d462SZachary Turner 119a14adeaSPavel Labath #include "Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h" 12c946d462SZachary Turner #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h" 136f8251fbSJonas Devlieghere #include "Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h" 149a14adeaSPavel Labath #include "Plugins/ScriptInterpreter/Python/lldb-python.h" 153925204cSMed Ismail Bennani 1646376966SJonas Devlieghere #include "lldb/Host/FileSystem.h" 17b9c1b51eSKate Stone #include "lldb/Host/HostInfo.h" 18c946d462SZachary Turner 19c946d462SZachary Turner #include "PythonTestSuite.h" 20c946d462SZachary Turner 21c946d462SZachary Turner using namespace lldb_private; 226f8251fbSJonas Devlieghere class TestScriptInterpreterPython : public ScriptInterpreterPythonImpl { 23e3959de2SJonas Devlieghere public: 246f8251fbSJonas Devlieghere using ScriptInterpreterPythonImpl::Initialize; 256f8251fbSJonas Devlieghere using ScriptInterpreterPythonImpl::InitializePrivate; 26e3959de2SJonas Devlieghere }; 27c946d462SZachary Turner 28b9c1b51eSKate Stone void PythonTestSuite::SetUp() { 2946376966SJonas Devlieghere FileSystem::Initialize(); 30c946d462SZachary Turner HostInfoBase::Initialize(); 31c946d462SZachary Turner // ScriptInterpreterPython::Initialize() depends on HostInfo being 32c946d462SZachary Turner // initializedso it can compute the python directory etc. 33e3959de2SJonas Devlieghere TestScriptInterpreterPython::Initialize(); 34e3959de2SJonas Devlieghere TestScriptInterpreterPython::InitializePrivate(); 35c946d462SZachary Turner 36c946d462SZachary Turner // Although we don't care about concurrency for the purposes of running 37c946d462SZachary Turner // this test suite, Python requires the GIL to be locked even for 38c946d462SZachary Turner // deallocating memory, which can happen when you call Py_DECREF or 39c946d462SZachary Turner // Py_INCREF. So acquire the GIL for the entire duration of this 40c946d462SZachary Turner // test suite. 41c946d462SZachary Turner m_gil_state = PyGILState_Ensure(); 42c946d462SZachary Turner } 43c946d462SZachary Turner 44b9c1b51eSKate Stone void PythonTestSuite::TearDown() { 45c946d462SZachary Turner PyGILState_Release(m_gil_state); 46c946d462SZachary Turner 47e3959de2SJonas Devlieghere TestScriptInterpreterPython::Terminate(); 480bca15a3SJonas Devlieghere HostInfoBase::Terminate(); 490bca15a3SJonas Devlieghere FileSystem::Terminate(); 50c946d462SZachary Turner } 51282890d7SJonas Devlieghere 52282890d7SJonas Devlieghere // The following functions are the Pythonic implementations of the required 53282890d7SJonas Devlieghere // callbacks. Because they're defined in libLLDB which we cannot link for the 54282890d7SJonas Devlieghere // unit test, we have a 'default' implementation here. 55282890d7SJonas Devlieghere 56282890d7SJonas Devlieghere #if PY_MAJOR_VERSION >= 3 57282890d7SJonas Devlieghere extern "C" PyObject *PyInit__lldb(void) { return nullptr; } 58282890d7SJonas Devlieghere #else 59282890d7SJonas Devlieghere extern "C" void init_lldb(void) {} 60282890d7SJonas Devlieghere #endif 61282890d7SJonas Devlieghere 629a14adeaSPavel Labath llvm::Expected<bool> lldb_private::LLDBSwigPythonBreakpointCallbackFunction( 63282890d7SJonas Devlieghere const char *python_function_name, const char *session_dictionary_name, 64282890d7SJonas Devlieghere const lldb::StackFrameSP &sb_frame, 65738af7a6SJim Ingham const lldb::BreakpointLocationSP &sb_bp_loc, 6682de8df2SPavel Labath const StructuredDataImpl &args_impl) { 67282890d7SJonas Devlieghere return false; 68282890d7SJonas Devlieghere } 69282890d7SJonas Devlieghere 709a14adeaSPavel Labath bool lldb_private::LLDBSwigPythonWatchpointCallbackFunction( 71282890d7SJonas Devlieghere const char *python_function_name, const char *session_dictionary_name, 72282890d7SJonas Devlieghere const lldb::StackFrameSP &sb_frame, const lldb::WatchpointSP &sb_wp) { 73282890d7SJonas Devlieghere return false; 74282890d7SJonas Devlieghere } 75282890d7SJonas Devlieghere 769a14adeaSPavel Labath bool lldb_private::LLDBSwigPythonCallTypeScript( 779a14adeaSPavel Labath const char *python_function_name, const void *session_dictionary, 78282890d7SJonas Devlieghere const lldb::ValueObjectSP &valobj_sp, void **pyfunct_wrapper, 79282890d7SJonas Devlieghere const lldb::TypeSummaryOptionsSP &options_sp, std::string &retval) { 80282890d7SJonas Devlieghere return false; 81282890d7SJonas Devlieghere } 82282890d7SJonas Devlieghere 83*c154f397SPavel Labath python::PythonObject lldb_private::LLDBSwigPythonCreateSyntheticProvider( 849a14adeaSPavel Labath const char *python_class_name, const char *session_dictionary_name, 85282890d7SJonas Devlieghere const lldb::ValueObjectSP &valobj_sp) { 86*c154f397SPavel Labath return python::PythonObject(); 87282890d7SJonas Devlieghere } 88282890d7SJonas Devlieghere 89*c154f397SPavel Labath python::PythonObject lldb_private::LLDBSwigPythonCreateCommandObject( 909a14adeaSPavel Labath const char *python_class_name, const char *session_dictionary_name, 917406d236SPavel Labath lldb::DebuggerSP debugger_sp) { 92*c154f397SPavel Labath return python::PythonObject(); 93282890d7SJonas Devlieghere } 94282890d7SJonas Devlieghere 95*c154f397SPavel Labath python::PythonObject lldb_private::LLDBSwigPythonCreateScriptedThreadPlan( 96282890d7SJonas Devlieghere const char *python_class_name, const char *session_dictionary_name, 9782de8df2SPavel Labath const StructuredDataImpl &args_data, std::string &error_string, 98282890d7SJonas Devlieghere const lldb::ThreadPlanSP &thread_plan_sp) { 99*c154f397SPavel Labath return python::PythonObject(); 100282890d7SJonas Devlieghere } 101282890d7SJonas Devlieghere 1029a14adeaSPavel Labath bool lldb_private::LLDBSWIGPythonCallThreadPlan(void *implementor, 103282890d7SJonas Devlieghere const char *method_name, 1049a14adeaSPavel Labath Event *event_sp, 1059a14adeaSPavel Labath bool &got_error) { 106282890d7SJonas Devlieghere return false; 107282890d7SJonas Devlieghere } 108282890d7SJonas Devlieghere 109*c154f397SPavel Labath python::PythonObject 110*c154f397SPavel Labath lldb_private::LLDBSwigPythonCreateScriptedBreakpointResolver( 111282890d7SJonas Devlieghere const char *python_class_name, const char *session_dictionary_name, 11282de8df2SPavel Labath const StructuredDataImpl &args, const lldb::BreakpointSP &bkpt_sp) { 113*c154f397SPavel Labath return python::PythonObject(); 114282890d7SJonas Devlieghere } 115282890d7SJonas Devlieghere 1169a14adeaSPavel Labath unsigned int lldb_private::LLDBSwigPythonCallBreakpointResolver( 1179a14adeaSPavel Labath void *implementor, const char *method_name, 118282890d7SJonas Devlieghere lldb_private::SymbolContext *sym_ctx) { 119282890d7SJonas Devlieghere return 0; 120282890d7SJonas Devlieghere } 121282890d7SJonas Devlieghere 1229a14adeaSPavel Labath size_t lldb_private::LLDBSwigPython_CalculateNumChildren(PyObject *implementor, 123282890d7SJonas Devlieghere uint32_t max) { 124282890d7SJonas Devlieghere return 0; 125282890d7SJonas Devlieghere } 126282890d7SJonas Devlieghere 1279a14adeaSPavel Labath PyObject *lldb_private::LLDBSwigPython_GetChildAtIndex(PyObject *implementor, 128282890d7SJonas Devlieghere uint32_t idx) { 129282890d7SJonas Devlieghere return nullptr; 130282890d7SJonas Devlieghere } 131282890d7SJonas Devlieghere 1329a14adeaSPavel Labath int lldb_private::LLDBSwigPython_GetIndexOfChildWithName( 1339a14adeaSPavel Labath PyObject *implementor, const char *child_name) { 134282890d7SJonas Devlieghere return 0; 135282890d7SJonas Devlieghere } 136282890d7SJonas Devlieghere 1379a14adeaSPavel Labath void *lldb_private::LLDBSWIGPython_CastPyObjectToSBData(PyObject *data) { 1381f6a57c1SMed Ismail Bennani return nullptr; 1391f6a57c1SMed Ismail Bennani } 1401f6a57c1SMed Ismail Bennani 1419a14adeaSPavel Labath void *lldb_private::LLDBSWIGPython_CastPyObjectToSBError(PyObject *data) { 1421f6a57c1SMed Ismail Bennani return nullptr; 1431f6a57c1SMed Ismail Bennani } 1441f6a57c1SMed Ismail Bennani 1459a14adeaSPavel Labath void *lldb_private::LLDBSWIGPython_CastPyObjectToSBValue(PyObject *data) { 146282890d7SJonas Devlieghere return nullptr; 147282890d7SJonas Devlieghere } 148282890d7SJonas Devlieghere 1499a14adeaSPavel Labath void * 1509a14adeaSPavel Labath lldb_private::LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo(PyObject *data) { 151a758c9f7SMed Ismail Bennani return nullptr; 152a758c9f7SMed Ismail Bennani } 153a758c9f7SMed Ismail Bennani 1549a14adeaSPavel Labath lldb::ValueObjectSP 1559a14adeaSPavel Labath lldb_private::LLDBSWIGPython_GetValueObjectSPFromSBValue(void *data) { 156282890d7SJonas Devlieghere return nullptr; 157282890d7SJonas Devlieghere } 158282890d7SJonas Devlieghere 1599a14adeaSPavel Labath bool lldb_private::LLDBSwigPython_UpdateSynthProviderInstance( 1609a14adeaSPavel Labath PyObject *implementor) { 161282890d7SJonas Devlieghere return false; 162282890d7SJonas Devlieghere } 163282890d7SJonas Devlieghere 1649a14adeaSPavel Labath bool lldb_private::LLDBSwigPython_MightHaveChildrenSynthProviderInstance( 1659a14adeaSPavel Labath PyObject *implementor) { 166282890d7SJonas Devlieghere return false; 167282890d7SJonas Devlieghere } 168282890d7SJonas Devlieghere 1699a14adeaSPavel Labath PyObject *lldb_private::LLDBSwigPython_GetValueSynthProviderInstance( 1709a14adeaSPavel Labath PyObject *implementor) { 171282890d7SJonas Devlieghere return nullptr; 172282890d7SJonas Devlieghere } 173282890d7SJonas Devlieghere 1749a14adeaSPavel Labath bool lldb_private::LLDBSwigPythonCallCommand( 1759a14adeaSPavel Labath const char *python_function_name, const char *session_dictionary_name, 1767406d236SPavel Labath lldb::DebuggerSP debugger, const char *args, 177282890d7SJonas Devlieghere lldb_private::CommandReturnObject &cmd_retobj, 178282890d7SJonas Devlieghere lldb::ExecutionContextRefSP exe_ctx_ref_sp) { 179282890d7SJonas Devlieghere return false; 180282890d7SJonas Devlieghere } 181282890d7SJonas Devlieghere 1829a14adeaSPavel Labath bool lldb_private::LLDBSwigPythonCallCommandObject( 1837406d236SPavel Labath PyObject *implementor, lldb::DebuggerSP debugger, const char *args, 184282890d7SJonas Devlieghere lldb_private::CommandReturnObject &cmd_retobj, 185282890d7SJonas Devlieghere lldb::ExecutionContextRefSP exe_ctx_ref_sp) { 186282890d7SJonas Devlieghere return false; 187282890d7SJonas Devlieghere } 188282890d7SJonas Devlieghere 1899a14adeaSPavel Labath bool lldb_private::LLDBSwigPythonCallModuleInit( 1909a14adeaSPavel Labath const char *python_module_name, const char *session_dictionary_name, 1917406d236SPavel Labath lldb::DebuggerSP debugger) { 192282890d7SJonas Devlieghere return false; 193282890d7SJonas Devlieghere } 194282890d7SJonas Devlieghere 195*c154f397SPavel Labath python::PythonObject 1969a14adeaSPavel Labath lldb_private::LLDBSWIGPythonCreateOSPlugin(const char *python_class_name, 197282890d7SJonas Devlieghere const char *session_dictionary_name, 198282890d7SJonas Devlieghere const lldb::ProcessSP &process_sp) { 199*c154f397SPavel Labath return python::PythonObject(); 200282890d7SJonas Devlieghere } 201282890d7SJonas Devlieghere 202*c154f397SPavel Labath python::PythonObject lldb_private::LLDBSwigPythonCreateScriptedProcess( 2031f6a57c1SMed Ismail Bennani const char *python_class_name, const char *session_dictionary_name, 20482de8df2SPavel Labath const lldb::TargetSP &target_sp, const StructuredDataImpl &args_impl, 2051f6a57c1SMed Ismail Bennani std::string &error_string) { 206*c154f397SPavel Labath return python::PythonObject(); 2071f6a57c1SMed Ismail Bennani } 2081f6a57c1SMed Ismail Bennani 209*c154f397SPavel Labath python::PythonObject lldb_private::LLDBSwigPythonCreateScriptedThread( 21059d8dd79SMed Ismail Bennani const char *python_class_name, const char *session_dictionary_name, 21182de8df2SPavel Labath const lldb::ProcessSP &process_sp, const StructuredDataImpl &args_impl, 212738621d0SMed Ismail Bennani std::string &error_string) { 213*c154f397SPavel Labath return python::PythonObject(); 21459d8dd79SMed Ismail Bennani } 21559d8dd79SMed Ismail Bennani 216*c154f397SPavel Labath python::PythonObject lldb_private::LLDBSWIGPython_CreateFrameRecognizer( 2179a14adeaSPavel Labath const char *python_class_name, const char *session_dictionary_name) { 218*c154f397SPavel Labath return python::PythonObject(); 219282890d7SJonas Devlieghere } 220282890d7SJonas Devlieghere 2219a14adeaSPavel Labath PyObject *lldb_private::LLDBSwigPython_GetRecognizedArguments( 2229a14adeaSPavel Labath PyObject *implementor, const lldb::StackFrameSP &frame_sp) { 223282890d7SJonas Devlieghere return nullptr; 224282890d7SJonas Devlieghere } 225282890d7SJonas Devlieghere 2269a14adeaSPavel Labath bool lldb_private::LLDBSWIGPythonRunScriptKeywordProcess( 227282890d7SJonas Devlieghere const char *python_function_name, const char *session_dictionary_name, 2287f09ab08SPavel Labath const lldb::ProcessSP &process, std::string &output) { 229282890d7SJonas Devlieghere return false; 230282890d7SJonas Devlieghere } 231282890d7SJonas Devlieghere 2327406d236SPavel Labath llvm::Optional<std::string> lldb_private::LLDBSWIGPythonRunScriptKeywordThread( 233282890d7SJonas Devlieghere const char *python_function_name, const char *session_dictionary_name, 2347406d236SPavel Labath lldb::ThreadSP thread) { 2357406d236SPavel Labath return llvm::None; 236282890d7SJonas Devlieghere } 237282890d7SJonas Devlieghere 2389a14adeaSPavel Labath bool lldb_private::LLDBSWIGPythonRunScriptKeywordTarget( 239282890d7SJonas Devlieghere const char *python_function_name, const char *session_dictionary_name, 2407f09ab08SPavel Labath const lldb::TargetSP &target, std::string &output) { 241282890d7SJonas Devlieghere return false; 242282890d7SJonas Devlieghere } 243282890d7SJonas Devlieghere 2447406d236SPavel Labath llvm::Optional<std::string> lldb_private::LLDBSWIGPythonRunScriptKeywordFrame( 245282890d7SJonas Devlieghere const char *python_function_name, const char *session_dictionary_name, 2467406d236SPavel Labath lldb::StackFrameSP frame) { 2477406d236SPavel Labath return llvm::None; 248282890d7SJonas Devlieghere } 249282890d7SJonas Devlieghere 2509a14adeaSPavel Labath bool lldb_private::LLDBSWIGPythonRunScriptKeywordValue( 251282890d7SJonas Devlieghere const char *python_function_name, const char *session_dictionary_name, 2527f09ab08SPavel Labath const lldb::ValueObjectSP &value, std::string &output) { 253282890d7SJonas Devlieghere return false; 254282890d7SJonas Devlieghere } 255282890d7SJonas Devlieghere 2569a14adeaSPavel Labath void *lldb_private::LLDBSWIGPython_GetDynamicSetting( 2579a14adeaSPavel Labath void *module, const char *setting, const lldb::TargetSP &target_sp) { 258282890d7SJonas Devlieghere return nullptr; 259282890d7SJonas Devlieghere } 2601b1d9815SJim Ingham 261*c154f397SPavel Labath python::PythonObject lldb_private::LLDBSwigPythonCreateScriptedStopHook( 2621b1d9815SJim Ingham lldb::TargetSP target_sp, const char *python_class_name, 26382de8df2SPavel Labath const char *session_dictionary_name, const StructuredDataImpl &args_impl, 26482de8df2SPavel Labath Status &error) { 265*c154f397SPavel Labath return python::PythonObject(); 2661b1d9815SJim Ingham } 2671b1d9815SJim Ingham 2689a14adeaSPavel Labath bool lldb_private::LLDBSwigPythonStopHookCallHandleStop( 2699a14adeaSPavel Labath void *implementor, lldb::ExecutionContextRefSP exc_ctx_sp, 2701b1d9815SJim Ingham lldb::StreamSP stream) { 2711b1d9815SJim Ingham return false; 2721b1d9815SJim Ingham } 273