xref: /llvm-project/lldb/test/API/commands/platform/connect/TestPlatformConnect.py (revision 03588a27261f7ebea15af49268d2ec901fe1979e)
1import socket
2import gdbremote_testcase
3import lldbgdbserverutils
4from lldbsuite.test.decorators import *
5from lldbsuite.test.lldbtest import *
6from lldbsuite.test import lldbutil
7
8
9class TestPlatformProcessConnect(TestBase):
10    NO_DEBUG_INFO_TESTCASE = True
11
12    @skipIfRemote
13    @expectedFailureAll(hostoslist=["windows"], triple=".*-android")
14    @skipIfDarwin  # lldb-server not found correctly
15    @expectedFailureAll(oslist=["windows"])  # process modules not loaded
16    # lldb-server platform times out waiting for the gdbserver port number to be
17    # written to the pipe, yet it seems the gdbserver already has written it.
18    @expectedFailureAll(
19        archs=["aarch64"],
20        oslist=["freebsd"],
21        bugnumber="https://github.com/llvm/llvm-project/issues/84327",
22    )
23    @add_test_categories(["lldb-server"])
24    def test_platform_process_connect(self):
25        self.build()
26
27        hostname = socket.getaddrinfo("localhost", 0, proto=socket.IPPROTO_TCP)[0][4][0]
28        listen_url = "[%s]:0" % hostname
29
30        port_file = self.getBuildArtifact("port")
31        commandline_args = [
32            "platform",
33            "--listen",
34            listen_url,
35            "--socket-file",
36            port_file,
37            "--",
38            self.getBuildArtifact("a.out"),
39            "foo",
40        ]
41        self.spawnSubprocess(lldbgdbserverutils.get_lldb_server_exe(), commandline_args)
42
43        socket_id = lldbutil.wait_for_file_on_target(self, port_file)
44
45        new_platform = lldb.SBPlatform("remote-" + self.getPlatform())
46        self.dbg.SetSelectedPlatform(new_platform)
47
48        connect_url = "connect://[%s]:%s" % (hostname, socket_id)
49        self.runCmd("platform connect %s" % connect_url)
50
51        lldbutil.run_break_set_by_symbol(self, "main")
52        process = self.process()
53
54        process.Continue()
55
56        frame = self.frame()
57        self.assertEqual(frame.GetFunction().GetName(), "main")
58        self.assertEqual(frame.FindVariable("argc").GetValueAsSigned(), 2)
59        process.Continue()
60