xref: /llvm-project/lldb/test/API/functionalities/gdb_remote_client/TestPlatformClient.py (revision 2238dcc39358353cac21df75c3c3286ab20b8f53)
199451b44SJordan Rupprechtimport lldb
299451b44SJordan Rupprechtimport binascii
399451b44SJordan Rupprechtimport os
4bf3ac994SPavel Labathimport time
599451b44SJordan Rupprechtfrom lldbsuite.test.lldbtest import *
699451b44SJordan Rupprechtfrom lldbsuite.test.decorators import *
733c0f93fSPavel Labathfrom lldbsuite.test.gdbclientutils import *
833c0f93fSPavel Labathfrom lldbsuite.test.lldbgdbclient import GDBRemoteTestBase
999451b44SJordan Rupprecht
10*2238dcc3SJonas Devlieghere
1199451b44SJordan Rupprechtdef hexlify(string):
1299451b44SJordan Rupprecht    return binascii.hexlify(string.encode()).decode()
1399451b44SJordan Rupprecht
1499451b44SJordan Rupprecht
15*2238dcc3SJonas Devlieghereclass TestPlatformClient(GDBRemoteTestBase):
1699451b44SJordan Rupprecht    def test_process_list_with_all_users(self):
1799451b44SJordan Rupprecht        """Test connecting to a remote linux platform"""
1899451b44SJordan Rupprecht
1999451b44SJordan Rupprecht        class MyResponder(MockGDBServerResponder):
2099451b44SJordan Rupprecht            def __init__(self):
2199451b44SJordan Rupprecht                MockGDBServerResponder.__init__(self)
2299451b44SJordan Rupprecht                self.currentQsProc = 0
2399451b44SJordan Rupprecht                self.all_users = False
2499451b44SJordan Rupprecht
2599451b44SJordan Rupprecht            def qfProcessInfo(self, packet):
2699451b44SJordan Rupprecht                if "all_users:1" in packet:
2799451b44SJordan Rupprecht                    self.all_users = True
2899451b44SJordan Rupprecht                    name = hexlify("/a/test_process")
29*2238dcc3SJonas Devlieghere                    args = "-".join(
30*2238dcc3SJonas Devlieghere                        map(
31*2238dcc3SJonas Devlieghere                            hexlify,
32*2238dcc3SJonas Devlieghere                            ["/system/bin/sh", "-c", "/data/local/tmp/lldb-server"],
33*2238dcc3SJonas Devlieghere                        )
34*2238dcc3SJonas Devlieghere                    )
35*2238dcc3SJonas Devlieghere                    return (
36*2238dcc3SJonas Devlieghere                        "pid:10;ppid:1;uid:2;gid:3;euid:4;egid:5;name:"
37*2238dcc3SJonas Devlieghere                        + name
38*2238dcc3SJonas Devlieghere                        + ";args:"
39*2238dcc3SJonas Devlieghere                        + args
40*2238dcc3SJonas Devlieghere                        + ";"
41*2238dcc3SJonas Devlieghere                    )
4299451b44SJordan Rupprecht                else:
4399451b44SJordan Rupprecht                    self.all_users = False
4499451b44SJordan Rupprecht                    return "E04"
4599451b44SJordan Rupprecht
4699451b44SJordan Rupprecht            def qsProcessInfo(self):
4799451b44SJordan Rupprecht                if self.all_users:
4899451b44SJordan Rupprecht                    if self.currentQsProc == 0:
4999451b44SJordan Rupprecht                        self.currentQsProc = 1
5099451b44SJordan Rupprecht                        name = hexlify("/b/another_test_process")
5199451b44SJordan Rupprecht                        # This intentionally has a badly encoded argument
52*2238dcc3SJonas Devlieghere                        args = "X".join(map(hexlify, ["/system/bin/ls", "--help"]))
53*2238dcc3SJonas Devlieghere                        return (
54*2238dcc3SJonas Devlieghere                            "pid:11;ppid:2;uid:3;gid:4;euid:5;egid:6;name:"
55*2238dcc3SJonas Devlieghere                            + name
56*2238dcc3SJonas Devlieghere                            + ";args:"
57*2238dcc3SJonas Devlieghere                            + args
58*2238dcc3SJonas Devlieghere                            + ";"
59*2238dcc3SJonas Devlieghere                        )
6099451b44SJordan Rupprecht                    elif self.currentQsProc == 1:
6199451b44SJordan Rupprecht                        self.currentQsProc = 0
6299451b44SJordan Rupprecht                        return "E04"
6399451b44SJordan Rupprecht                else:
6499451b44SJordan Rupprecht                    return "E04"
6599451b44SJordan Rupprecht
6699451b44SJordan Rupprecht        self.server.responder = MyResponder()
6799451b44SJordan Rupprecht
6899451b44SJordan Rupprecht        try:
6999451b44SJordan Rupprecht            self.runCmd("platform select remote-linux")
708fa2394bSMichał Górny            self.runCmd("platform connect " + self.server.get_connect_url())
7199451b44SJordan Rupprecht            self.assertTrue(self.dbg.GetSelectedPlatform().IsConnected())
72*2238dcc3SJonas Devlieghere            self.expect(
73*2238dcc3SJonas Devlieghere                "platform process list -x",
74*2238dcc3SJonas Devlieghere                substrs=[
75*2238dcc3SJonas Devlieghere                    "2 matching processes were found",
76*2238dcc3SJonas Devlieghere                    "test_process",
77*2238dcc3SJonas Devlieghere                    "another_test_process",
78*2238dcc3SJonas Devlieghere                ],
79*2238dcc3SJonas Devlieghere            )
80*2238dcc3SJonas Devlieghere            self.expect(
81*2238dcc3SJonas Devlieghere                "platform process list -xv",
8299451b44SJordan Rupprecht                substrs=[
8399451b44SJordan Rupprecht                    "PID    PARENT USER       GROUP      EFF USER   EFF GROUP  TRIPLE                         ARGUMENTS",
8499451b44SJordan Rupprecht                    "10     1      2          3          4          5                                         /system/bin/sh -c /data/local/tmp/lldb-server",
85*2238dcc3SJonas Devlieghere                    "11     2      3          4          5          6",
86*2238dcc3SJonas Devlieghere                ],
87*2238dcc3SJonas Devlieghere            )
88*2238dcc3SJonas Devlieghere            self.expect(
89*2238dcc3SJonas Devlieghere                "platform process list -xv", substrs=["/system/bin/ls"], matching=False
90*2238dcc3SJonas Devlieghere            )
91*2238dcc3SJonas Devlieghere            self.expect(
92*2238dcc3SJonas Devlieghere                "platform process list",
9399451b44SJordan Rupprecht                error=True,
94*2238dcc3SJonas Devlieghere                substrs=[
95*2238dcc3SJonas Devlieghere                    'error: no processes were found on the "remote-linux" platform'
96*2238dcc3SJonas Devlieghere                ],
97*2238dcc3SJonas Devlieghere            )
9899451b44SJordan Rupprecht        finally:
9999451b44SJordan Rupprecht            self.dbg.GetSelectedPlatform().DisconnectRemote()
100bf3ac994SPavel Labath
101bf3ac994SPavel Labath    class TimeoutResponder(MockGDBServerResponder):
102bf3ac994SPavel Labath        """A mock server, which takes a very long time to compute the working
103bf3ac994SPavel Labath        directory."""
104*2238dcc3SJonas Devlieghere
105bf3ac994SPavel Labath        def __init__(self):
106bf3ac994SPavel Labath            MockGDBServerResponder.__init__(self)
107bf3ac994SPavel Labath
108bf3ac994SPavel Labath        def qGetWorkingDir(self):
109bf3ac994SPavel Labath            time.sleep(10)
110bf3ac994SPavel Labath            return hexlify("/foo/bar")
111bf3ac994SPavel Labath
112bf3ac994SPavel Labath    def test_no_timeout(self):
113bf3ac994SPavel Labath        """Test that we honor the timeout setting. With a large enough timeout,
114bf3ac994SPavel Labath        we should get the CWD successfully."""
115bf3ac994SPavel Labath
116bf3ac994SPavel Labath        self.server.responder = TestPlatformClient.TimeoutResponder()
117bf3ac994SPavel Labath        self.runCmd("settings set plugin.process.gdb-remote.packet-timeout 30")
118bf3ac994SPavel Labath        plat = lldb.SBPlatform("remote-linux")
119bf3ac994SPavel Labath        try:
120*2238dcc3SJonas Devlieghere            self.assertSuccess(
121*2238dcc3SJonas Devlieghere                plat.ConnectRemote(
122*2238dcc3SJonas Devlieghere                    lldb.SBPlatformConnectOptions(self.server.get_connect_url())
123*2238dcc3SJonas Devlieghere                )
124*2238dcc3SJonas Devlieghere            )
125bf3ac994SPavel Labath            self.assertEqual(plat.GetWorkingDirectory(), "/foo/bar")
126bf3ac994SPavel Labath        finally:
127bf3ac994SPavel Labath            plat.DisconnectRemote()
128bf3ac994SPavel Labath
129bf3ac994SPavel Labath    def test_timeout(self):
130bf3ac994SPavel Labath        """Test that we honor the timeout setting. With a small timeout, CWD
131bf3ac994SPavel Labath        retrieval should fail."""
132bf3ac994SPavel Labath
133bf3ac994SPavel Labath        self.server.responder = TestPlatformClient.TimeoutResponder()
134bf3ac994SPavel Labath        self.runCmd("settings set plugin.process.gdb-remote.packet-timeout 3")
135bf3ac994SPavel Labath        plat = lldb.SBPlatform("remote-linux")
136bf3ac994SPavel Labath        try:
137*2238dcc3SJonas Devlieghere            self.assertSuccess(
138*2238dcc3SJonas Devlieghere                plat.ConnectRemote(
139*2238dcc3SJonas Devlieghere                    lldb.SBPlatformConnectOptions(self.server.get_connect_url())
140*2238dcc3SJonas Devlieghere                )
141*2238dcc3SJonas Devlieghere            )
142bf3ac994SPavel Labath            self.assertIsNone(plat.GetWorkingDirectory())
143bf3ac994SPavel Labath        finally:
144bf3ac994SPavel Labath            plat.DisconnectRemote()
145