199451b44SJordan Rupprecht"""
299451b44SJordan RupprechtTest that the Python operating system plugin works correctly
399451b44SJordan Rupprecht"""
499451b44SJordan Rupprecht
599451b44SJordan Rupprecht
699451b44SJordan Rupprecht
799451b44SJordan Rupprechtimport os
899451b44SJordan Rupprechtimport lldb
999451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
1099451b44SJordan Rupprechtimport lldbsuite.test.lldbutil as lldbutil
1199451b44SJordan Rupprecht
1299451b44SJordan Rupprecht
1399451b44SJordan Rupprechtclass PluginPythonOSPlugin(TestBase):
1499451b44SJordan Rupprecht    NO_DEBUG_INFO_TESTCASE = True
1599451b44SJordan Rupprecht
1699451b44SJordan Rupprecht    def test_python_os_plugin(self):
1799451b44SJordan Rupprecht        """Test that the Python operating system plugin works correctly"""
1899451b44SJordan Rupprecht        self.build()
1999451b44SJordan Rupprecht        self.run_python_os_funcionality()
2099451b44SJordan Rupprecht
2199451b44SJordan Rupprecht    def run_python_os_step(self):
2299451b44SJordan Rupprecht        """Test that the Python operating system plugin works correctly when single stepping a virtual thread"""
2399451b44SJordan Rupprecht        self.build()
2499451b44SJordan Rupprecht        self.run_python_os_step()
2599451b44SJordan Rupprecht
2699451b44SJordan Rupprecht    def verify_os_thread_registers(self, thread):
2799451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
2899451b44SJordan Rupprecht        registers = frame.GetRegisters().GetValueAtIndex(0)
2999451b44SJordan Rupprecht        reg_value = thread.GetThreadID() + 1
3099451b44SJordan Rupprecht        for reg in registers:
31*0ed758b2SDave Lee            self.assertEqual(
32*0ed758b2SDave Lee                reg.GetValueAsUnsigned(), reg_value,
3399451b44SJordan Rupprecht                "Verify the registers contains the correct value")
3499451b44SJordan Rupprecht            reg_value = reg_value + 1
3599451b44SJordan Rupprecht
3699451b44SJordan Rupprecht    def run_python_os_funcionality(self):
3799451b44SJordan Rupprecht        """Test that the Python operating system plugin works correctly"""
3899451b44SJordan Rupprecht
3999451b44SJordan Rupprecht        # Set debugger into synchronous mode
4099451b44SJordan Rupprecht        self.dbg.SetAsync(False)
4199451b44SJordan Rupprecht
4299451b44SJordan Rupprecht        # Create a target by the debugger.
4399451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
4499451b44SJordan Rupprecht        python_os_plugin_path = os.path.join(self.getSourceDir(),
4599451b44SJordan Rupprecht                                             "operating_system.py")
4699451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
4799451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
4899451b44SJordan Rupprecht
4999451b44SJordan Rupprecht        # Set breakpoints inside and outside methods that take pointers to the
5099451b44SJordan Rupprecht        # containing struct.
5199451b44SJordan Rupprecht        lldbutil.run_break_set_by_source_regexp(self, "// Set breakpoint here")
5299451b44SJordan Rupprecht
5399451b44SJordan Rupprecht        # Register our shared libraries for remote targets so they get
5499451b44SJordan Rupprecht        # automatically uploaded
5599451b44SJordan Rupprecht        arguments = None
5699451b44SJordan Rupprecht        environment = None
5799451b44SJordan Rupprecht
5899451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
5999451b44SJordan Rupprecht        process = target.LaunchSimple(
6099451b44SJordan Rupprecht            arguments, environment, self.get_process_working_directory())
6199451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
6299451b44SJordan Rupprecht
6399451b44SJordan Rupprecht        # Make sure there are no OS plug-in created thread when we first stop
6499451b44SJordan Rupprecht        # at our breakpoint in main
6599451b44SJordan Rupprecht        thread = process.GetThreadByID(0x111111111)
6699451b44SJordan Rupprecht        self.assertFalse(
6799451b44SJordan Rupprecht            thread.IsValid(),
6899451b44SJordan Rupprecht            "Make sure there is no thread 0x111111111 before we load the python OS plug-in")
6999451b44SJordan Rupprecht        thread = process.GetThreadByID(0x222222222)
7099451b44SJordan Rupprecht        self.assertFalse(
7199451b44SJordan Rupprecht            thread.IsValid(),
7299451b44SJordan Rupprecht            "Make sure there is no thread 0x222222222 before we load the python OS plug-in")
7399451b44SJordan Rupprecht        thread = process.GetThreadByID(0x333333333)
7499451b44SJordan Rupprecht        self.assertFalse(
7599451b44SJordan Rupprecht            thread.IsValid(),
7699451b44SJordan Rupprecht            "Make sure there is no thread 0x333333333 before we load the python OS plug-in")
7799451b44SJordan Rupprecht
7899451b44SJordan Rupprecht        # Now load the python OS plug-in which should update the thread list and we should have
7999451b44SJordan Rupprecht        # OS plug-in created threads with the IDs: 0x111111111, 0x222222222,
8099451b44SJordan Rupprecht        # 0x333333333
8199451b44SJordan Rupprecht        command = "settings set target.process.python-os-plugin-path '%s'" % python_os_plugin_path
8299451b44SJordan Rupprecht        self.dbg.HandleCommand(command)
8399451b44SJordan Rupprecht
8499451b44SJordan Rupprecht        # Verify our OS plug-in threads showed up
8599451b44SJordan Rupprecht        thread = process.GetThreadByID(0x111111111)
8699451b44SJordan Rupprecht        self.assertTrue(
8799451b44SJordan Rupprecht            thread.IsValid(),
8899451b44SJordan Rupprecht            "Make sure there is a thread 0x111111111 after we load the python OS plug-in")
8999451b44SJordan Rupprecht        self.verify_os_thread_registers(thread)
9099451b44SJordan Rupprecht        thread = process.GetThreadByID(0x222222222)
9199451b44SJordan Rupprecht        self.assertTrue(
9299451b44SJordan Rupprecht            thread.IsValid(),
9399451b44SJordan Rupprecht            "Make sure there is a thread 0x222222222 after we load the python OS plug-in")
9499451b44SJordan Rupprecht        self.verify_os_thread_registers(thread)
9599451b44SJordan Rupprecht        thread = process.GetThreadByID(0x333333333)
9699451b44SJordan Rupprecht        self.assertTrue(
9799451b44SJordan Rupprecht            thread.IsValid(),
9899451b44SJordan Rupprecht            "Make sure there is a thread 0x333333333 after we load the python OS plug-in")
9999451b44SJordan Rupprecht        self.verify_os_thread_registers(thread)
10099451b44SJordan Rupprecht
10199451b44SJordan Rupprecht        # Now clear the OS plug-in path to make the OS plug-in created threads
102e9264b74SKazuaki Ishizaki        # disappear
10399451b44SJordan Rupprecht        self.dbg.HandleCommand(
10499451b44SJordan Rupprecht            "settings clear target.process.python-os-plugin-path")
10599451b44SJordan Rupprecht
10699451b44SJordan Rupprecht        # Verify the threads are gone after unloading the python OS plug-in
10799451b44SJordan Rupprecht        thread = process.GetThreadByID(0x111111111)
10899451b44SJordan Rupprecht        self.assertFalse(
10999451b44SJordan Rupprecht            thread.IsValid(),
11099451b44SJordan Rupprecht            "Make sure there is no thread 0x111111111 after we unload the python OS plug-in")
11199451b44SJordan Rupprecht        thread = process.GetThreadByID(0x222222222)
11299451b44SJordan Rupprecht        self.assertFalse(
11399451b44SJordan Rupprecht            thread.IsValid(),
11499451b44SJordan Rupprecht            "Make sure there is no thread 0x222222222 after we unload the python OS plug-in")
11599451b44SJordan Rupprecht        thread = process.GetThreadByID(0x333333333)
11699451b44SJordan Rupprecht        self.assertFalse(
11799451b44SJordan Rupprecht            thread.IsValid(),
11899451b44SJordan Rupprecht            "Make sure there is no thread 0x333333333 after we unload the python OS plug-in")
11999451b44SJordan Rupprecht
12099451b44SJordan Rupprecht    def run_python_os_step(self):
12199451b44SJordan Rupprecht        """Test that the Python operating system plugin works correctly and allows single stepping of a virtual thread that is backed by a real thread"""
12299451b44SJordan Rupprecht
12399451b44SJordan Rupprecht        # Set debugger into synchronous mode
12499451b44SJordan Rupprecht        self.dbg.SetAsync(False)
12599451b44SJordan Rupprecht
12699451b44SJordan Rupprecht        # Create a target by the debugger.
12799451b44SJordan Rupprecht        exe = self.getBuildArtifact("a.out")
12899451b44SJordan Rupprecht        python_os_plugin_path = os.path.join(self.getSourceDir(),
12999451b44SJordan Rupprecht                                             "operating_system2.py")
13099451b44SJordan Rupprecht        target = self.dbg.CreateTarget(exe)
13199451b44SJordan Rupprecht        self.assertTrue(target, VALID_TARGET)
13299451b44SJordan Rupprecht
13399451b44SJordan Rupprecht        # Set breakpoints inside and outside methods that take pointers to the
13499451b44SJordan Rupprecht        # containing struct.
13599451b44SJordan Rupprecht        lldbutil.run_break_set_by_source_regexp(self, "// Set breakpoint here")
13699451b44SJordan Rupprecht
13799451b44SJordan Rupprecht        # Register our shared libraries for remote targets so they get
13899451b44SJordan Rupprecht        # automatically uploaded
13999451b44SJordan Rupprecht        arguments = None
14099451b44SJordan Rupprecht        environment = None
14199451b44SJordan Rupprecht
14299451b44SJordan Rupprecht        # Now launch the process, and do not stop at entry point.
14399451b44SJordan Rupprecht        process = target.LaunchSimple(
14499451b44SJordan Rupprecht            arguments, environment, self.get_process_working_directory())
14599451b44SJordan Rupprecht        self.assertTrue(process, PROCESS_IS_VALID)
14699451b44SJordan Rupprecht
14799451b44SJordan Rupprecht        # Make sure there are no OS plug-in created thread when we first stop
14899451b44SJordan Rupprecht        # at our breakpoint in main
14999451b44SJordan Rupprecht        thread = process.GetThreadByID(0x111111111)
15099451b44SJordan Rupprecht        self.assertFalse(
15199451b44SJordan Rupprecht            thread.IsValid(),
15299451b44SJordan Rupprecht            "Make sure there is no thread 0x111111111 before we load the python OS plug-in")
15399451b44SJordan Rupprecht
15499451b44SJordan Rupprecht        # Now load the python OS plug-in which should update the thread list and we should have
15599451b44SJordan Rupprecht        # OS plug-in created threads with the IDs: 0x111111111, 0x222222222,
15699451b44SJordan Rupprecht        # 0x333333333
15799451b44SJordan Rupprecht        command = "settings set target.process.python-os-plugin-path '%s'" % python_os_plugin_path
15899451b44SJordan Rupprecht        self.dbg.HandleCommand(command)
15999451b44SJordan Rupprecht
16099451b44SJordan Rupprecht        # Verify our OS plug-in threads showed up
16199451b44SJordan Rupprecht        thread = process.GetThreadByID(0x111111111)
16299451b44SJordan Rupprecht        self.assertTrue(
16399451b44SJordan Rupprecht            thread.IsValid(),
16499451b44SJordan Rupprecht            "Make sure there is a thread 0x111111111 after we load the python OS plug-in")
16599451b44SJordan Rupprecht
16699451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
16799451b44SJordan Rupprecht        self.assertTrue(
16899451b44SJordan Rupprecht            frame.IsValid(),
16999451b44SJordan Rupprecht            "Make sure we get a frame from thread 0x111111111")
17099451b44SJordan Rupprecht        line_entry = frame.GetLineEntry()
17199451b44SJordan Rupprecht
172*0ed758b2SDave Lee        self.assertEqual(
173*0ed758b2SDave Lee            line_entry.GetFileSpec().GetFilename(), 'main.c',
17499451b44SJordan Rupprecht            "Make sure we stopped on line 5 in main.c")
175*0ed758b2SDave Lee        self.assertEqual(
176*0ed758b2SDave Lee            line_entry.GetLine(), 5,
17799451b44SJordan Rupprecht            "Make sure we stopped on line 5 in main.c")
17899451b44SJordan Rupprecht
17999451b44SJordan Rupprecht        # Now single step thread 0x111111111 and make sure it does what we need
18099451b44SJordan Rupprecht        # it to
18199451b44SJordan Rupprecht        thread.StepOver()
18299451b44SJordan Rupprecht
18399451b44SJordan Rupprecht        frame = thread.GetFrameAtIndex(0)
18499451b44SJordan Rupprecht        self.assertTrue(
18599451b44SJordan Rupprecht            frame.IsValid(),
18699451b44SJordan Rupprecht            "Make sure we get a frame from thread 0x111111111")
18799451b44SJordan Rupprecht        line_entry = frame.GetLineEntry()
18899451b44SJordan Rupprecht
189*0ed758b2SDave Lee        self.assertEqual(
190*0ed758b2SDave Lee            line_entry.GetFileSpec().GetFilename(), 'main.c',
19199451b44SJordan Rupprecht            "Make sure we stepped from line 5 to line 6 in main.c")
192b3a0c4d7SRaphael Isemann        self.assertEquals(line_entry.GetLine(), 6,
19399451b44SJordan Rupprecht                        "Make sure we stepped from line 5 to line 6 in main.c")
194