1dfbe3a79SDavid Spickett""" Check that errors while handling qLaunchGDBServer are reported to the user. 2dfbe3a79SDavid Spickett Though this isn't a platform command in itself, the best way to test it is 3dfbe3a79SDavid Spickett from Python because we can juggle multiple processes more easily. 4dfbe3a79SDavid Spickett""" 5dfbe3a79SDavid Spickett 6dfbe3a79SDavid Spickettimport os 7dfbe3a79SDavid Spickettimport socket 8dfbe3a79SDavid Spickettimport shutil 9dfbe3a79SDavid Spickettimport lldbgdbserverutils 10dfbe3a79SDavid Spickettfrom lldbsuite.test.decorators import * 11dfbe3a79SDavid Spickettfrom lldbsuite.test.lldbtest import * 12dfbe3a79SDavid Spickettfrom lldbsuite.test import lldbutil 13dfbe3a79SDavid Spickett 14dfbe3a79SDavid Spickett 15dfbe3a79SDavid Spickettclass TestPlatformProcessLaunchGDBServer(TestBase): 16dfbe3a79SDavid Spickett NO_DEBUG_INFO_TESTCASE = True 17dfbe3a79SDavid Spickett 18dfbe3a79SDavid Spickett @skipIfRemote 19*2e893124SDmitry Vasilyev # Windows cannot delete the executable while it is running. 20*2e893124SDmitry Vasilyev # On Darwin we may be using debugserver. 21dfbe3a79SDavid Spickett @skipUnlessPlatform(["linux"]) 22dfbe3a79SDavid Spickett @add_test_categories(["lldb-server"]) 23dfbe3a79SDavid Spickett def test_platform_process_launch_gdb_server(self): 24dfbe3a79SDavid Spickett self.build() 25dfbe3a79SDavid Spickett 26dfbe3a79SDavid Spickett hostname = socket.getaddrinfo("localhost", 0, proto=socket.IPPROTO_TCP)[0][4][0] 27dfbe3a79SDavid Spickett listen_url = "[%s]:0" % hostname 28dfbe3a79SDavid Spickett 29dfbe3a79SDavid Spickett port_file = self.getBuildArtifact("port") 30dfbe3a79SDavid Spickett commandline_args = [ 31dfbe3a79SDavid Spickett "platform", 32dfbe3a79SDavid Spickett "--listen", 33dfbe3a79SDavid Spickett listen_url, 34dfbe3a79SDavid Spickett "--socket-file", 35dfbe3a79SDavid Spickett port_file, 36dfbe3a79SDavid Spickett "--", 37dfbe3a79SDavid Spickett self.getBuildArtifact("a.out"), 38dfbe3a79SDavid Spickett "foo", 39dfbe3a79SDavid Spickett ] 40dfbe3a79SDavid Spickett 41dfbe3a79SDavid Spickett # Run lldb-server from a new location. 42dfbe3a79SDavid Spickett new_lldb_server = self.getBuildArtifact("lldb-server") 43dfbe3a79SDavid Spickett shutil.copy(lldbgdbserverutils.get_lldb_server_exe(), new_lldb_server) 44dfbe3a79SDavid Spickett 45dfbe3a79SDavid Spickett self.spawnSubprocess(new_lldb_server, commandline_args) 46dfbe3a79SDavid Spickett socket_id = lldbutil.wait_for_file_on_target(self, port_file) 47dfbe3a79SDavid Spickett 48dfbe3a79SDavid Spickett new_platform = lldb.SBPlatform("remote-" + self.getPlatform()) 49dfbe3a79SDavid Spickett self.dbg.SetSelectedPlatform(new_platform) 50dfbe3a79SDavid Spickett 51dfbe3a79SDavid Spickett connect_url = "connect://[%s]:%s" % (hostname, socket_id) 52dfbe3a79SDavid Spickett self.runCmd("platform connect %s" % connect_url) 53dfbe3a79SDavid Spickett 54*2e893124SDmitry Vasilyev # First connect to lldb-server which spawn a process to handle the connection. 55*2e893124SDmitry Vasilyev # Then remove our new lldb-server so that when it tries to invoke itself as a 56*2e893124SDmitry Vasilyev # gdbserver, it fails. 57*2e893124SDmitry Vasilyev os.remove(new_lldb_server) 58*2e893124SDmitry Vasilyev 59dfbe3a79SDavid Spickett self.runCmd("target create {}".format(self.getBuildArtifact("a.out"))) 60dfbe3a79SDavid Spickett self.expect("run", substrs=["unable to launch a GDB server on"], error=True) 61