fix typos from #28614
[tor.git] / src / test / test_rebind.py
blob65feedd2434184366cb5ba1187736fb1e04b0a15
1 from __future__ import print_function
3 import errno
4 import logging
5 import os
6 import random
7 import socket
8 import subprocess
9 import sys
10 import time
12 LOG_TIMEOUT = 60.0
13 LOG_WAIT = 0.1
15 def fail(msg):
16 logging.error('FAIL')
17 sys.exit(msg)
19 def try_connecting_to_socksport():
20 socks_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
21 e = socks_socket.connect_ex(('127.0.0.1', socks_port))
22 if e:
23 tor_process.terminate()
24 fail('Cannot connect to SOCKSPort: error ' + os.strerror(e))
25 socks_socket.close()
27 def wait_for_log(s):
28 cutoff = time.time() + LOG_TIMEOUT
29 while time.time() < cutoff:
30 l = tor_process.stdout.readline()
31 l = l.decode('utf8')
32 if s in l:
33 logging.info('Tor logged: "{}"'.format(l.strip()))
34 return
35 logging.info('Tor logged: "{}", waiting for "{}"'.format(l.strip(), s))
36 # readline() returns a blank string when there is no output
37 # avoid busy-waiting
38 if len(s) == 0:
39 time.sleep(LOG_WAIT)
40 fail('Could not find "{}" in logs after {} seconds'.format(s, LOG_TIMEOUT))
42 def pick_random_port():
43 port = 0
44 random.seed()
46 for i in range(8):
47 port = random.randint(10000, 60000)
48 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
49 if s.connect_ex(('127.0.0.1', port)) == 0:
50 s.close()
51 else:
52 break
54 if port == 0:
55 fail('Could not find a random free port between 10000 and 60000')
57 return port
59 logging.basicConfig(level=logging.DEBUG,
60 format='%(asctime)s.%(msecs)03d %(message)s',
61 datefmt='%Y-%m-%d %H:%M:%S')
63 if sys.hexversion < 0x02070000:
64 fail("ERROR: unsupported Python version (should be >= 2.7)")
66 if sys.hexversion > 0x03000000 and sys.hexversion < 0x03010000:
67 fail("ERROR: unsupported Python3 version (should be >= 3.1)")
69 control_port = pick_random_port()
70 socks_port = pick_random_port()
72 assert control_port != 0
73 assert socks_port != 0
75 if len(sys.argv) < 3:
76 fail('Usage: %s <path-to-tor> <data-dir>' % sys.argv[0])
78 if not os.path.exists(sys.argv[1]):
79 fail('ERROR: cannot find tor at %s' % sys.argv[1])
80 if not os.path.exists(sys.argv[2]):
81 fail('ERROR: cannot find datadir at %s' % sys.argv[2])
83 tor_path = sys.argv[1]
84 data_dir = sys.argv[2]
86 tor_process = subprocess.Popen([tor_path,
87 '-DataDirectory', data_dir,
88 '-ControlPort', '127.0.0.1:{}'.format(control_port),
89 '-SOCKSPort', '127.0.0.1:{}'.format(socks_port),
90 '-Log', 'debug stdout',
91 '-LogTimeGranularity', '1',
92 '-FetchServerDescriptors', '0'],
93 stdout=subprocess.PIPE,
94 stderr=subprocess.PIPE)
96 if tor_process == None:
97 fail('ERROR: running tor failed')
99 wait_for_log('Opened Control listener on')
101 try_connecting_to_socksport()
103 control_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
104 if control_socket.connect_ex(('127.0.0.1', control_port)):
105 tor_process.terminate()
106 fail('Cannot connect to ControlPort')
108 control_socket.sendall('AUTHENTICATE \r\n'.encode('utf8'))
109 control_socket.sendall('SETCONF SOCKSPort=0.0.0.0:{}\r\n'.format(socks_port).encode('utf8'))
110 wait_for_log('Opened Socks listener')
112 try_connecting_to_socksport()
114 control_socket.sendall('SETCONF SOCKSPort=127.0.0.1:{}\r\n'.format(socks_port).encode('utf8'))
115 wait_for_log('Opened Socks listener')
117 try_connecting_to_socksport()
119 control_socket.sendall('SIGNAL HALT\r\n'.encode('utf8'))
121 wait_for_log('exiting cleanly')
122 logging.info('OK')
124 try:
125 tor_process.terminate()
126 except OSError as e:
127 if e.errno == errno.ESRCH: # errno 3: No such process
128 # assume tor has already exited due to SIGNAL HALT
129 logging.warn("Tor has already exited")
130 else:
131 raise