1import lldb 2import time 3from lldbsuite.test.lldbtest import * 4from lldbsuite.test.decorators import * 5from lldbsuite.test.gdbclientutils import * 6from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase 7 8 9class TestPlatformKill(GDBRemoteTestBase): 10 @skipIfRemote 11 def test_kill_different_platform(self): 12 """Test connecting to a remote linux platform""" 13 14 self.build(dictionary={"CXX_SOURCES": "sleep.cpp"}) 15 host_process = self.spawnSubprocess(self.getBuildArtifact()) 16 17 # Create a fake remote process with the same PID as host_process 18 class MyResponder(MockGDBServerResponder): 19 def __init__(self): 20 MockGDBServerResponder.__init__(self) 21 self.got_kill = False 22 23 def qC(self): 24 return "QC%x" % host_process.pid 25 26 def k(self): 27 self.got_kill = True 28 return "X09" 29 30 self.server.responder = MyResponder() 31 32 error = lldb.SBError() 33 target = self.dbg.CreateTarget( 34 "", "x86_64-pc-linux", "remote-linux", False, error 35 ) 36 self.assertSuccess(error) 37 process = self.connect(target) 38 self.assertEqual(process.GetProcessID(), host_process.pid) 39 40 host_platform = lldb.SBPlatform("host") 41 self.assertSuccess(host_platform.Kill(host_process.pid)) 42 43 # Host dies, remote process lives. 44 self.assertFalse(self.server.responder.got_kill) 45 self.assertIsNotNone(host_process.wait(timeout=10)) 46 47 # Now kill the remote one as well 48 self.assertSuccess(process.Kill()) 49 self.assertTrue(self.server.responder.got_kill) 50