xref: /llvm-project/lldb/test/API/commands/platform/launchgdbserver/TestPlatformLaunchGDBServer.py (revision 2e89312419c5f7875c947fcf79ea0446cf65a287)
1dfbe3a79SDavid Spickett""" Check that errors while handling qLaunchGDBServer are reported to the user.
2dfbe3a79SDavid Spickett    Though this isn't a platform command in itself, the best way to test it is
3dfbe3a79SDavid Spickett    from Python because we can juggle multiple processes more easily.
4dfbe3a79SDavid Spickett"""
5dfbe3a79SDavid Spickett
6dfbe3a79SDavid Spickettimport os
7dfbe3a79SDavid Spickettimport socket
8dfbe3a79SDavid Spickettimport shutil
9dfbe3a79SDavid Spickettimport lldbgdbserverutils
10dfbe3a79SDavid Spickettfrom lldbsuite.test.decorators import *
11dfbe3a79SDavid Spickettfrom lldbsuite.test.lldbtest import *
12dfbe3a79SDavid Spickettfrom lldbsuite.test import lldbutil
13dfbe3a79SDavid Spickett
14dfbe3a79SDavid Spickett
15dfbe3a79SDavid Spickettclass TestPlatformProcessLaunchGDBServer(TestBase):
16dfbe3a79SDavid Spickett    NO_DEBUG_INFO_TESTCASE = True
17dfbe3a79SDavid Spickett
18dfbe3a79SDavid Spickett    @skipIfRemote
19*2e893124SDmitry Vasilyev    # Windows cannot delete the executable while it is running.
20*2e893124SDmitry Vasilyev    # On Darwin we may be using debugserver.
21dfbe3a79SDavid Spickett    @skipUnlessPlatform(["linux"])
22dfbe3a79SDavid Spickett    @add_test_categories(["lldb-server"])
23dfbe3a79SDavid Spickett    def test_platform_process_launch_gdb_server(self):
24dfbe3a79SDavid Spickett        self.build()
25dfbe3a79SDavid Spickett
26dfbe3a79SDavid Spickett        hostname = socket.getaddrinfo("localhost", 0, proto=socket.IPPROTO_TCP)[0][4][0]
27dfbe3a79SDavid Spickett        listen_url = "[%s]:0" % hostname
28dfbe3a79SDavid Spickett
29dfbe3a79SDavid Spickett        port_file = self.getBuildArtifact("port")
30dfbe3a79SDavid Spickett        commandline_args = [
31dfbe3a79SDavid Spickett            "platform",
32dfbe3a79SDavid Spickett            "--listen",
33dfbe3a79SDavid Spickett            listen_url,
34dfbe3a79SDavid Spickett            "--socket-file",
35dfbe3a79SDavid Spickett            port_file,
36dfbe3a79SDavid Spickett            "--",
37dfbe3a79SDavid Spickett            self.getBuildArtifact("a.out"),
38dfbe3a79SDavid Spickett            "foo",
39dfbe3a79SDavid Spickett        ]
40dfbe3a79SDavid Spickett
41dfbe3a79SDavid Spickett        # Run lldb-server from a new location.
42dfbe3a79SDavid Spickett        new_lldb_server = self.getBuildArtifact("lldb-server")
43dfbe3a79SDavid Spickett        shutil.copy(lldbgdbserverutils.get_lldb_server_exe(), new_lldb_server)
44dfbe3a79SDavid Spickett
45dfbe3a79SDavid Spickett        self.spawnSubprocess(new_lldb_server, commandline_args)
46dfbe3a79SDavid Spickett        socket_id = lldbutil.wait_for_file_on_target(self, port_file)
47dfbe3a79SDavid Spickett
48dfbe3a79SDavid Spickett        new_platform = lldb.SBPlatform("remote-" + self.getPlatform())
49dfbe3a79SDavid Spickett        self.dbg.SetSelectedPlatform(new_platform)
50dfbe3a79SDavid Spickett
51dfbe3a79SDavid Spickett        connect_url = "connect://[%s]:%s" % (hostname, socket_id)
52dfbe3a79SDavid Spickett        self.runCmd("platform connect %s" % connect_url)
53dfbe3a79SDavid Spickett
54*2e893124SDmitry Vasilyev        # First connect to lldb-server which spawn a process to handle the connection.
55*2e893124SDmitry Vasilyev        # Then remove our new lldb-server so that when it tries to invoke itself as a
56*2e893124SDmitry Vasilyev        # gdbserver, it fails.
57*2e893124SDmitry Vasilyev        os.remove(new_lldb_server)
58*2e893124SDmitry Vasilyev
59dfbe3a79SDavid Spickett        self.runCmd("target create {}".format(self.getBuildArtifact("a.out")))
60dfbe3a79SDavid Spickett        self.expect("run", substrs=["unable to launch a GDB server on"], error=True)
61