1import lldb 2from lldbsuite.test.lldbtest import * 3from lldbsuite.test.decorators import * 4from lldbsuite.test.gdbclientutils import * 5from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase 6 7 8class TestPlatformAttach(GDBRemoteTestBase): 9 @skipIfRemote 10 @skipIfWindows 11 def test_attach(self): 12 """Test attaching by name""" 13 14 class MyPlatformResponder(MockGDBServerResponder): 15 def __init__(self, port): 16 MockGDBServerResponder.__init__(self) 17 self.port = port 18 19 def qLaunchGDBServer(self, _): 20 return "pid:1337;port:{};".format(self.port) 21 22 def qfProcessInfo(self, packet): 23 return "pid:95117;name:666f6f;" 24 25 class MyGDBResponder(MockGDBServerResponder): 26 def __init__(self): 27 MockGDBServerResponder.__init__(self) 28 29 def vAttach(self, _): 30 return "OK" 31 32 self.server.responder = MyGDBResponder() 33 port = self.server._socket._server_socket.getsockname()[1] 34 35 platform_socket = TCPServerSocket() 36 platform_server = MockGDBServer(platform_socket) 37 platform_server.responder = MyPlatformResponder(port) 38 platform_server.start() 39 40 error = lldb.SBError() 41 platform = lldb.SBPlatform("remote-linux") 42 self.dbg.SetSelectedPlatform(platform) 43 44 error = platform.ConnectRemote( 45 lldb.SBPlatformConnectOptions(platform_server.get_connect_url()) 46 ) 47 self.assertSuccess(error) 48 self.assertTrue(platform.IsConnected()) 49 50 attach_info = lldb.SBAttachInfo() 51 attach_info.SetExecutable("foo") 52 53 target = lldb.SBTarget() 54 process = platform.Attach(attach_info, self.dbg, target, error) 55 self.assertSuccess(error) 56 self.assertEqual(process.GetProcessID(), 95117) 57 58 platform.DisconnectRemote() 59