blob: 34850c74868bf16dced4f045258fddf0979a6729 [file] [log] [blame]
Todd Fiala31bde322014-07-26 20:39:17 +00001import gdbremote_testcase
Tamas Berghammer04f51d12015-03-11 13:51:07 +00002import lldbgdbserverutils
Todd Fiala31bde322014-07-26 20:39:17 +00003import re
4import select
5import socket
6import time
7from lldbtest import *
8
9class TestStubReverseConnect(gdbremote_testcase.GdbRemoteTestCaseBase):
Vince Harron65f99162015-05-21 18:54:12 +000010
11 mydir = TestBase.compute_mydir(__file__)
12
Todd Fiala31bde322014-07-26 20:39:17 +000013 _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 Berghammer04f51d12015-03-11 13:51:07 +000044 appended_stub_args = ["--reverse-connect"]
Todd Fiala31bde322014-07-26 20:39:17 +000045 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 Berghammer27c8d362015-03-13 14:32:25 +000053 triple = self.dbg.GetSelectedPlatform().GetTriple()
54 if re.match(".*-.*-.*-android", triple):
Chaoren Lin9c70ea42015-05-07 22:32:40 +000055 self.forward_adb_port(self.port, self.port, "reverse", self.stub_device)
Tamas Berghammer27c8d362015-03-13 14:32:25 +000056
Todd Fiala31bde322014-07-26 20:39:17 +000057 # Start the stub.
58 server = self.launch_debug_monitor(logfile=sys.stdout)
59 self.assertIsNotNone(server)
Tamas Berghammer04f51d12015-03-11 13:51:07 +000060 self.assertTrue(lldbgdbserverutils.process_is_running(server.pid, True))
Todd Fiala31bde322014-07-26 20:39:17 +000061
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 Harron0f2b1ab2015-04-15 10:39:17 +000081 @skipIfRemote # reverse connect is not a supported use case for now
Todd Fiala31bde322014-07-26 20:39:17 +000082 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()