brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · aca8a24 Raw
145 lines · python
1import lldb2import binascii3import os4import time5from lldbsuite.test.lldbtest import *6from lldbsuite.test.decorators import *7from lldbsuite.test.gdbclientutils import *8from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase9 10 11def hexlify(string):12    return binascii.hexlify(string.encode()).decode()13 14 15class TestPlatformClient(GDBRemoteTestBase):16    def test_process_list_with_all_users(self):17        """Test connecting to a remote linux platform"""18 19        class MyResponder(MockGDBServerResponder):20            def __init__(self):21                MockGDBServerResponder.__init__(self)22                self.currentQsProc = 023                self.all_users = False24 25            def qfProcessInfo(self, packet):26                if "all_users:1" in packet:27                    self.all_users = True28                    name = hexlify("/a/test_process")29                    args = "-".join(30                        map(31                            hexlify,32                            ["/system/bin/sh", "-c", "/data/local/tmp/lldb-server"],33                        )34                    )35                    return (36                        "pid:10;ppid:1;uid:2;gid:3;euid:4;egid:5;name:"37                        + name38                        + ";args:"39                        + args40                        + ";"41                    )42                else:43                    self.all_users = False44                    return "E04"45 46            def qsProcessInfo(self):47                if self.all_users:48                    if self.currentQsProc == 0:49                        self.currentQsProc = 150                        name = hexlify("/b/another_test_process")51                        # This intentionally has a badly encoded argument52                        args = "X".join(map(hexlify, ["/system/bin/ls", "--help"]))53                        return (54                            "pid:11;ppid:2;uid:3;gid:4;euid:5;egid:6;name:"55                            + name56                            + ";args:"57                            + args58                            + ";"59                        )60                    elif self.currentQsProc == 1:61                        self.currentQsProc = 062                        return "E04"63                else:64                    return "E04"65 66        self.server.responder = MyResponder()67 68        try:69            self.runCmd("platform select remote-linux")70            self.runCmd("platform connect " + self.server.get_connect_url())71            self.assertTrue(self.dbg.GetSelectedPlatform().IsConnected())72            self.expect(73                "platform process list -x",74                substrs=[75                    "2 matching processes were found",76                    "test_process",77                    "another_test_process",78                ],79            )80            self.expect(81                "platform process list -xv",82                substrs=[83                    "PID    PARENT USER       GROUP      EFF USER   EFF GROUP  TRIPLE                         ARGUMENTS",84                    "10     1      2          3          4          5                                         /system/bin/sh -c /data/local/tmp/lldb-server",85                    "11     2      3          4          5          6",86                ],87            )88            self.expect(89                "platform process list -xv", substrs=["/system/bin/ls"], matching=False90            )91            self.expect(92                "platform process list",93                error=True,94                substrs=[95                    'error: no processes were found on the "remote-linux" platform'96                ],97            )98        finally:99            self.dbg.GetSelectedPlatform().DisconnectRemote()100 101    class TimeoutResponder(MockGDBServerResponder):102        """A mock server, which takes a very long time to compute the working103        directory."""104 105        def __init__(self):106            MockGDBServerResponder.__init__(self)107 108        def qGetWorkingDir(self):109            time.sleep(10)110            return hexlify("/foo/bar")111 112    def test_no_timeout(self):113        """Test that we honor the timeout setting. With a large enough timeout,114        we should get the CWD successfully."""115 116        self.server.responder = TestPlatformClient.TimeoutResponder()117        self.runCmd("settings set plugin.process.gdb-remote.packet-timeout 30")118        plat = lldb.SBPlatform("remote-linux")119        try:120            self.assertSuccess(121                plat.ConnectRemote(122                    lldb.SBPlatformConnectOptions(self.server.get_connect_url())123                )124            )125            self.assertEqual(plat.GetWorkingDirectory(), "/foo/bar")126        finally:127            plat.DisconnectRemote()128 129    def test_timeout(self):130        """Test that we honor the timeout setting. With a small timeout, CWD131        retrieval should fail."""132 133        self.server.responder = TestPlatformClient.TimeoutResponder()134        self.runCmd("settings set plugin.process.gdb-remote.packet-timeout 3")135        plat = lldb.SBPlatform("remote-linux")136        try:137            self.assertSuccess(138                plat.ConnectRemote(139                    lldb.SBPlatformConnectOptions(self.server.get_connect_url())140                )141            )142            self.assertIsNone(plat.GetWorkingDirectory())143        finally:144            plat.DisconnectRemote()145