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