commit b5273658f6470a643b70b7ef96654248788eef2f
Author: Jeremy <[email protected]>
Date:   Wed May 29 23:53:11 2013 -0400

    Made attachstream and mapaddress tests more robust
    
    Modified the attachstream and mapaddress integ tests so that they don't
    fail as easily in the face of minor network failures unrelated to stem
    (like temporary issues building a circuit, or an exit node having a
    different IP from the one Tor reports).
    
    This is to address...
    
    https://trac.torproject.org/8692
---
 test/integ/control/controller.py |   68 ++++++++++++++++++++++++++------------
 1 file changed, 47 insertions(+), 21 deletions(-)

diff --git a/test/integ/control/controller.py b/test/integ/control/controller.py
index 50c0cc7..2c4016f 100644
--- a/test/integ/control/controller.py
+++ b/test/integ/control/controller.py
@@ -794,16 +794,31 @@ class TestController(unittest.TestCase):
     with runner.get_tor_controller() as controller:
       controller.map_address({'1.2.1.2': 'ifconfig.me'})
 
-      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-      s.connect(('127.0.0.1', 
int(controller.get_conf('SocksListenAddress').rsplit(':', 1)[1])))
-      test.network.negotiate_socks(s, '1.2.1.2', 80)
-      s.sendall(test.network.ip_request)  # make the http request for the ip 
address
-      response = s.recv(1000)
+      s = None
+      response = None
 
+      for _ in range(10):  # Try up to 10 times, to rule out failures due to 
temporary network issues
+        try:
+          s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+          s.settimeout(30)
+          s.connect(('127.0.0.1', 
int(controller.get_conf('SocksListenAddress').rsplit(':', 1)[1])))
+          test.network.negotiate_socks(s, '1.2.1.2', 80)
+          s.sendall(test.network.ip_request)  # make the http request for the 
ip address
+          response = s.recv(1000)
+          if response:
+            break
+        except (stem.ProtocolError, socket.timeout):
+          continue
+        finally:
+          if s:
+            s.close()
+
+      self.assertTrue(response)
+ 
       # everything after the blank line is the 'data' in a HTTP response.
       # The response data for our request for request should be an IP address 
+ '\n'
       ip_addr = response[response.find("\r\n\r\n"):].strip()
-
+ 
       self.assertTrue(stem.util.connection.is_valid_ipv4_address(ip_addr))
 
   def test_get_microdescriptor(self):
@@ -968,6 +983,9 @@ class TestController(unittest.TestCase):
     elif test.runner.require_version(self, 
Requirement.EXTENDCIRCUIT_PATH_OPTIONAL):
       return
 
+    host = "38.229.72.14"   # www.torproject.org
+    port = 80
+
     circuit_id = None
 
     def handle_streamcreated(stream):
@@ -975,22 +993,30 @@ class TestController(unittest.TestCase):
         controller.attach_stream(stream.id, circuit_id)
 
     with test.runner.get_runner().get_tor_controller() as controller:
-      controller.set_conf("__LeaveStreamsUnattached", "1")
-      controller.add_event_listener(handle_streamcreated, 
stem.control.EventType.STREAM)
+      for i in range(10):  # Try 10 times to build a circuit we can connect 
through
+        controller.add_event_listener(handle_streamcreated, 
stem.control.EventType.STREAM)
+        controller.set_conf("__LeaveStreamsUnattached", "1")
 
-      try:
-        circuit_id = controller.new_circuit(await_build = True)
-        socksport = controller.get_socks_listeners()[0][1]
-
-        ip = test.network.external_ip('127.0.0.1', socksport)
-        exit_circuit = controller.get_circuit(circuit_id)
-        self.assertTrue(exit_circuit)
-        exit_ip = 
controller.get_network_status(exit_circuit.path[2][0]).address
-
-        self.assertEquals(exit_ip, ip)
-      finally:
-        controller.remove_event_listener(handle_streamcreated)
-        controller.reset_conf("__LeaveStreamsUnattached")
+        try:
+          circuit_id = controller.new_circuit(await_build = True)
+          socks_listener = controller.get_socks_listeners()[0]
+          with test.network.Socks(socks_listener) as s:
+            s.settimeout(30)
+            s.connect((host, port))
+            streams = controller.get_streams()
+            break
+        except (stem.CircuitExtensionFailed, socket.timeout):
+          continue
+        finally:
+          controller.remove_event_listener(handle_streamcreated)
+          controller.reset_conf("__LeaveStreamsUnattached")
+
+    our_stream = [stream for stream in streams if stream.target_address == 
host][0]
+
+    self.assertTrue(our_stream.circ_id)
+    self.assertTrue(circuit_id)
+
+    self.assertEquals(our_stream.circ_id, circuit_id)
 
   def test_get_circuits(self):
     """



_______________________________________________
tor-commits mailing list
[email protected]
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits

Reply via email to