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
8class TestPlatformKill(GDBRemoteTestBase):
9
10    @skipIfRemote
11    @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr52451")
12    def test_kill_different_platform(self):
13        """Test connecting to a remote linux platform"""
14
15        self.build(dictionary={"CXX_SOURCES":"sleep.cpp"})
16        host_process = self.spawnSubprocess(self.getBuildArtifact())
17
18        # Create a fake remote process with the same PID as host_process
19        class MyResponder(MockGDBServerResponder):
20            def __init__(self):
21                MockGDBServerResponder.__init__(self)
22                self.got_kill = False
23
24            def qC(self):
25                return "QC%x"%host_process.pid
26
27            def k(self):
28                self.got_kill = True
29                return "X09"
30
31        self.server.responder = MyResponder()
32
33        error = lldb.SBError()
34        target = self.dbg.CreateTarget("", "x86_64-pc-linux", "remote-linux",
35                False, error)
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