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