Todd Fiala | 31bde32 | 2014-07-26 20:39:17 +0000 | [diff] [blame] | 1 | import gdbremote_testcase |
Tamas Berghammer | 04f51d1 | 2015-03-11 13:51:07 +0000 | [diff] [blame] | 2 | import lldbgdbserverutils |
Todd Fiala | 31bde32 | 2014-07-26 20:39:17 +0000 | [diff] [blame] | 3 | import re |
| 4 | import select |
| 5 | import socket |
| 6 | import time |
| 7 | from lldbtest import * |
| 8 | |
| 9 | class TestStubReverseConnect(gdbremote_testcase.GdbRemoteTestCaseBase): |
Vince Harron | 65f9916 | 2015-05-21 18:54:12 +0000 | [diff] [blame] | 10 | |
| 11 | mydir = TestBase.compute_mydir(__file__) |
| 12 | |
Todd Fiala | 31bde32 | 2014-07-26 20:39:17 +0000 | [diff] [blame] | 13 | _DEFAULT_TIMEOUT = 20 |
| 14 | |
| 15 | def setUp(self): |
| 16 | # Set up the test. |
| 17 | gdbremote_testcase.GdbRemoteTestCaseBase.setUp(self) |
| 18 | |
| 19 | # Create a listener on a local port. |
| 20 | self.listener_socket = self.create_listener_socket() |
| 21 | self.assertIsNotNone(self.listener_socket) |
| 22 | self.listener_port = self.listener_socket.getsockname()[1] |
| 23 | |
| 24 | def create_listener_socket(self, timeout_seconds=_DEFAULT_TIMEOUT): |
| 25 | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| 26 | self.assertIsNotNone(sock) |
| 27 | |
| 28 | sock.settimeout(timeout_seconds) |
| 29 | sock.bind(("127.0.0.1",0)) |
| 30 | sock.listen(1) |
| 31 | |
| 32 | def tear_down_listener(): |
| 33 | try: |
| 34 | sock.shutdown(socket.SHUT_RDWR) |
| 35 | except: |
| 36 | # ignore |
| 37 | None |
| 38 | |
| 39 | self.addTearDownHook(tear_down_listener) |
| 40 | return sock |
| 41 | |
| 42 | def reverse_connect_works(self): |
| 43 | # Indicate stub startup should do a reverse connect. |
Tamas Berghammer | 04f51d1 | 2015-03-11 13:51:07 +0000 | [diff] [blame] | 44 | appended_stub_args = ["--reverse-connect"] |
Todd Fiala | 31bde32 | 2014-07-26 20:39:17 +0000 | [diff] [blame] | 45 | if self.debug_monitor_extra_args: |
| 46 | self.debug_monitor_extra_args += appended_stub_args |
| 47 | else: |
| 48 | self.debug_monitor_extra_args = appended_stub_args |
| 49 | |
| 50 | self.stub_hostname = "127.0.0.1" |
| 51 | self.port = self.listener_port |
| 52 | |
Tamas Berghammer | 27c8d36 | 2015-03-13 14:32:25 +0000 | [diff] [blame] | 53 | triple = self.dbg.GetSelectedPlatform().GetTriple() |
| 54 | if re.match(".*-.*-.*-android", triple): |
Chaoren Lin | 9c70ea4 | 2015-05-07 22:32:40 +0000 | [diff] [blame] | 55 | self.forward_adb_port(self.port, self.port, "reverse", self.stub_device) |
Tamas Berghammer | 27c8d36 | 2015-03-13 14:32:25 +0000 | [diff] [blame] | 56 | |
Todd Fiala | 31bde32 | 2014-07-26 20:39:17 +0000 | [diff] [blame] | 57 | # Start the stub. |
| 58 | server = self.launch_debug_monitor(logfile=sys.stdout) |
| 59 | self.assertIsNotNone(server) |
Tamas Berghammer | 04f51d1 | 2015-03-11 13:51:07 +0000 | [diff] [blame] | 60 | self.assertTrue(lldbgdbserverutils.process_is_running(server.pid, True)) |
Todd Fiala | 31bde32 | 2014-07-26 20:39:17 +0000 | [diff] [blame] | 61 | |
| 62 | # Listen for the stub's connection to us. |
| 63 | (stub_socket, address) = self.listener_socket.accept() |
| 64 | self.assertIsNotNone(stub_socket) |
| 65 | self.assertIsNotNone(address) |
| 66 | print "connected to stub {} on {}".format(address, stub_socket.getsockname()) |
| 67 | |
| 68 | # Verify we can do the handshake. If that works, we'll call it good. |
| 69 | self.do_handshake(stub_socket, timeout_seconds=self._DEFAULT_TIMEOUT) |
| 70 | |
| 71 | # Clean up. |
| 72 | stub_socket.shutdown(socket.SHUT_RDWR) |
| 73 | |
| 74 | @debugserver_test |
| 75 | def test_reverse_connect_works_debugserver(self): |
| 76 | self.init_debugserver_test(use_named_pipe=False) |
| 77 | self.set_inferior_startup_launch() |
| 78 | self.reverse_connect_works() |
| 79 | |
| 80 | @llgs_test |
Vince Harron | 0f2b1ab | 2015-04-15 10:39:17 +0000 | [diff] [blame] | 81 | @skipIfRemote # reverse connect is not a supported use case for now |
Todd Fiala | 31bde32 | 2014-07-26 20:39:17 +0000 | [diff] [blame] | 82 | def test_reverse_connect_works_llgs(self): |
| 83 | self.init_llgs_test(use_named_pipe=False) |
| 84 | self.set_inferior_startup_launch() |
| 85 | self.reverse_connect_works() |