1f3176f5fSMed Ismail Bennani""" 2f3176f5fSMed Ismail BennaniTest python scripted process in lldb 3f3176f5fSMed Ismail Bennani""" 4f3176f5fSMed Ismail Bennani 5f3176f5fSMed Ismail Bennaniimport os 6f3176f5fSMed Ismail Bennani 7f3176f5fSMed Ismail Bennaniimport lldb 8f3176f5fSMed Ismail Bennanifrom lldbsuite.test.decorators import * 9f3176f5fSMed Ismail Bennanifrom lldbsuite.test.lldbtest import * 10f3176f5fSMed Ismail Bennanifrom lldbsuite.test import lldbutil 11f3176f5fSMed Ismail Bennanifrom lldbsuite.test import lldbtest 12f3176f5fSMed Ismail Bennani 13f3176f5fSMed Ismail Bennani 14*312b43daSMed Ismail Bennaniclass ScriptedProcesTestCase(TestBase): 15f3176f5fSMed Ismail Bennani 16f3176f5fSMed Ismail Bennani mydir = TestBase.compute_mydir(__file__) 17f3176f5fSMed Ismail Bennani 18f3176f5fSMed Ismail Bennani def setUp(self): 19f3176f5fSMed Ismail Bennani TestBase.setUp(self) 20f3176f5fSMed Ismail Bennani self.source = "main.c" 21f3176f5fSMed Ismail Bennani 22f3176f5fSMed Ismail Bennani def tearDown(self): 23f3176f5fSMed Ismail Bennani TestBase.tearDown(self) 24f3176f5fSMed Ismail Bennani 25f3176f5fSMed Ismail Bennani def test_python_plugin_package(self): 26f3176f5fSMed Ismail Bennani """Test that the lldb python module has a `plugins.scripted_process` 27f3176f5fSMed Ismail Bennani package.""" 28f3176f5fSMed Ismail Bennani self.expect('script import lldb.plugins', 29f3176f5fSMed Ismail Bennani substrs=["ModuleNotFoundError"], matching=False) 30f3176f5fSMed Ismail Bennani 31f3176f5fSMed Ismail Bennani self.expect('script dir(lldb.plugins)', 32f3176f5fSMed Ismail Bennani substrs=["scripted_process"]) 33f3176f5fSMed Ismail Bennani 34f3176f5fSMed Ismail Bennani self.expect('script import lldb.plugins.scripted_process', 35f3176f5fSMed Ismail Bennani substrs=["ModuleNotFoundError"], matching=False) 36f3176f5fSMed Ismail Bennani 37f3176f5fSMed Ismail Bennani self.expect('script dir(lldb.plugins.scripted_process)', 38f3176f5fSMed Ismail Bennani substrs=["ScriptedProcess"]) 39f3176f5fSMed Ismail Bennani 40f3176f5fSMed Ismail Bennani self.expect('script from lldb.plugins.scripted_process import ScriptedProcess', 41f3176f5fSMed Ismail Bennani substrs=["ImportError"], matching=False) 42f3176f5fSMed Ismail Bennani 43f3176f5fSMed Ismail Bennani self.expect('script dir(ScriptedProcess)', 44f3176f5fSMed Ismail Bennani substrs=["launch"]) 45f3176f5fSMed Ismail Bennani 46*312b43daSMed Ismail Bennani def test_launch_scripted_process_sbapi(self): 47*312b43daSMed Ismail Bennani """Test that we can launch an lldb scripted process using the SBAPI, 48*312b43daSMed Ismail Bennani check its process ID and read string from memory.""" 49*312b43daSMed Ismail Bennani self.build() 50*312b43daSMed Ismail Bennani target = self.dbg.CreateTarget(self.getBuildArtifact("a.out")) 51*312b43daSMed Ismail Bennani self.assertTrue(target, VALID_TARGET) 52*312b43daSMed Ismail Bennani 53*312b43daSMed Ismail Bennani scripted_process_example_relpath = ['..','..','..','..','examples','python','scripted_process','my_scripted_process.py'] 54*312b43daSMed Ismail Bennani os.environ['SKIP_SCRIPTED_PROCESS_LAUNCH'] = '1' 55*312b43daSMed Ismail Bennani self.runCmd("command script import " + os.path.join(self.getSourceDir(), 56*312b43daSMed Ismail Bennani *scripted_process_example_relpath)) 57*312b43daSMed Ismail Bennani 58*312b43daSMed Ismail Bennani launch_info = lldb.SBLaunchInfo(None) 59*312b43daSMed Ismail Bennani launch_info.SetProcessPluginName("ScriptedProcess") 60*312b43daSMed Ismail Bennani launch_info.SetScriptedProcessClassName("my_scripted_process.MyScriptedProcess") 61*312b43daSMed Ismail Bennani 62*312b43daSMed Ismail Bennani error = lldb.SBError() 63*312b43daSMed Ismail Bennani process = target.Launch(launch_info, error) 64*312b43daSMed Ismail Bennani self.assertTrue(process and process.IsValid(), PROCESS_IS_VALID) 65*312b43daSMed Ismail Bennani self.assertEqual(process.GetProcessID(), 42) 66*312b43daSMed Ismail Bennani 67*312b43daSMed Ismail Bennani hello_world = "Hello, world!" 68*312b43daSMed Ismail Bennani memory_read = process.ReadCStringFromMemory(0x50000000000, 69*312b43daSMed Ismail Bennani len(hello_world) + 1, # NULL byte 70*312b43daSMed Ismail Bennani error) 71*312b43daSMed Ismail Bennani 72*312b43daSMed Ismail Bennani self.assertTrue(error.Success(), "Failed to read memory from scripted process.") 73*312b43daSMed Ismail Bennani self.assertEqual(hello_world, memory_read) 74*312b43daSMed Ismail Bennani 75*312b43daSMed Ismail Bennani def test_launch_scripted_process_cli(self): 76*312b43daSMed Ismail Bennani """Test that we can launch an lldb scripted process from the command 77*312b43daSMed Ismail Bennani line, check its process ID and read string from memory.""" 78*312b43daSMed Ismail Bennani self.build() 79*312b43daSMed Ismail Bennani target = self.dbg.CreateTarget(self.getBuildArtifact("a.out")) 80*312b43daSMed Ismail Bennani self.assertTrue(target, VALID_TARGET) 81*312b43daSMed Ismail Bennani 82*312b43daSMed Ismail Bennani scripted_process_example_relpath = ['..','..','..','..','examples','python','scripted_process','my_scripted_process.py'] 83*312b43daSMed Ismail Bennani self.runCmd("command script import " + os.path.join(self.getSourceDir(), 84*312b43daSMed Ismail Bennani *scripted_process_example_relpath)) 85*312b43daSMed Ismail Bennani 86*312b43daSMed Ismail Bennani process = target.GetProcess() 87*312b43daSMed Ismail Bennani self.assertTrue(process, PROCESS_IS_VALID) 88*312b43daSMed Ismail Bennani self.assertEqual(process.GetProcessID(), 42) 89*312b43daSMed Ismail Bennani 90*312b43daSMed Ismail Bennani error = lldb.SBError() 91*312b43daSMed Ismail Bennani hello_world = "Hello, world!" 92*312b43daSMed Ismail Bennani memory_read = process.ReadCStringFromMemory(0x50000000000, 93*312b43daSMed Ismail Bennani len(hello_world) + 1, # NULL byte 94*312b43daSMed Ismail Bennani error) 95*312b43daSMed Ismail Bennani 96*312b43daSMed Ismail Bennani self.assertTrue(error.Success(), "Failed to read memory from scripted process.") 97*312b43daSMed Ismail Bennani self.assertEqual(hello_world, memory_read) 98