Todd Fiala | 31bde32 | 2014-07-26 20:39:17 +0000 | [diff] [blame^] | 1 | # Add the directory above ours to the python library path since we |
| 2 | # will import from there. |
| 3 | import os.path |
| 4 | import sys |
| 5 | sys.path.append(os.path.join(os.path.dirname(__file__), "..")) |
| 6 | |
| 7 | import gdbremote_testcase |
| 8 | import re |
| 9 | import select |
| 10 | import socket |
| 11 | import time |
| 12 | from lldbtest import * |
| 13 | |
| 14 | class TestStubReverseConnect(gdbremote_testcase.GdbRemoteTestCaseBase): |
| 15 | _DEFAULT_TIMEOUT = 20 |
| 16 | |
| 17 | def setUp(self): |
| 18 | # Set up the test. |
| 19 | gdbremote_testcase.GdbRemoteTestCaseBase.setUp(self) |
| 20 | |
| 21 | # Create a listener on a local port. |
| 22 | self.listener_socket = self.create_listener_socket() |
| 23 | self.assertIsNotNone(self.listener_socket) |
| 24 | self.listener_port = self.listener_socket.getsockname()[1] |
| 25 | |
| 26 | def create_listener_socket(self, timeout_seconds=_DEFAULT_TIMEOUT): |
| 27 | sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
| 28 | self.assertIsNotNone(sock) |
| 29 | |
| 30 | sock.settimeout(timeout_seconds) |
| 31 | sock.bind(("127.0.0.1",0)) |
| 32 | sock.listen(1) |
| 33 | |
| 34 | def tear_down_listener(): |
| 35 | try: |
| 36 | sock.shutdown(socket.SHUT_RDWR) |
| 37 | except: |
| 38 | # ignore |
| 39 | None |
| 40 | |
| 41 | self.addTearDownHook(tear_down_listener) |
| 42 | return sock |
| 43 | |
| 44 | def reverse_connect_works(self): |
| 45 | # Indicate stub startup should do a reverse connect. |
| 46 | appended_stub_args = " --reverse-connect" |
| 47 | if self.debug_monitor_extra_args: |
| 48 | self.debug_monitor_extra_args += appended_stub_args |
| 49 | else: |
| 50 | self.debug_monitor_extra_args = appended_stub_args |
| 51 | |
| 52 | self.stub_hostname = "127.0.0.1" |
| 53 | self.port = self.listener_port |
| 54 | |
| 55 | # Start the stub. |
| 56 | server = self.launch_debug_monitor(logfile=sys.stdout) |
| 57 | self.assertIsNotNone(server) |
| 58 | self.assertTrue(server.isalive()) |
| 59 | |
| 60 | # Listen for the stub's connection to us. |
| 61 | (stub_socket, address) = self.listener_socket.accept() |
| 62 | self.assertIsNotNone(stub_socket) |
| 63 | self.assertIsNotNone(address) |
| 64 | print "connected to stub {} on {}".format(address, stub_socket.getsockname()) |
| 65 | |
| 66 | # Verify we can do the handshake. If that works, we'll call it good. |
| 67 | self.do_handshake(stub_socket, timeout_seconds=self._DEFAULT_TIMEOUT) |
| 68 | |
| 69 | # Clean up. |
| 70 | stub_socket.shutdown(socket.SHUT_RDWR) |
| 71 | |
| 72 | @debugserver_test |
| 73 | def test_reverse_connect_works_debugserver(self): |
| 74 | self.init_debugserver_test(use_named_pipe=False) |
| 75 | self.set_inferior_startup_launch() |
| 76 | self.reverse_connect_works() |
| 77 | |
| 78 | @llgs_test |
| 79 | def test_reverse_connect_works_llgs(self): |
| 80 | self.init_llgs_test(use_named_pipe=False) |
| 81 | self.set_inferior_startup_launch() |
| 82 | self.reverse_connect_works() |
| 83 | |
| 84 | |
| 85 | if __name__ == '__main__': |
| 86 | unittest2.main() |