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