Add python-eventlet 0.16.1
[packages/trusty/python-eventlet.git] / eventlet / tests / test__refcount.py
1 """This test checks that socket instances (not GreenSockets but underlying sockets)
2 are not leaked by the hub.
3 """
4 import gc
5 from pprint import pformat
6 import unittest
7 import weakref
8
9 from eventlet.support import clear_sys_exc_info
10 from eventlet.green import socket
11 from eventlet.green.thread import start_new_thread
12 from eventlet.green.time import sleep
13
14 SOCKET_TIMEOUT = 0.1
15
16
17 def init_server():
18     s = socket.socket()
19     s.settimeout(SOCKET_TIMEOUT)
20     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
21     s.bind(('localhost', 0))
22     s.listen(5)
23     return s, s.getsockname()[1]
24
25
26 def handle_request(s, raise_on_timeout):
27     try:
28         conn, address = s.accept()
29     except socket.timeout:
30         if raise_on_timeout:
31             raise
32         else:
33             return
34     # print('handle_request - accepted')
35     res = conn.recv(100)
36     assert res == b'hello', repr(res)
37     # print('handle_request - recvd %r' % res)
38     res = conn.send(b'bye')
39     # print('handle_request - sent %r' % res)
40     # print('handle_request - conn refcount: %s' % sys.getrefcount(conn))
41     # conn.close()
42
43
44 def make_request(port):
45     # print('make_request')
46     s = socket.socket()
47     s.connect(('localhost', port))
48     # print('make_request - connected')
49     res = s.send(b'hello')
50     # print('make_request - sent %s' % res)
51     res = s.recv(100)
52     assert res == b'bye', repr(res)
53     # print('make_request - recvd %r' % res)
54     # s.close()
55
56
57 def run_interaction(run_client):
58     s, port = init_server()
59     start_new_thread(handle_request, (s, run_client))
60     if run_client:
61         start_new_thread(make_request, (port,))
62     sleep(0.1 + SOCKET_TIMEOUT)
63     # print(sys.getrefcount(s.fd))
64     # s.close()
65     return weakref.ref(s.fd)
66
67
68 def run_and_check(run_client):
69     w = run_interaction(run_client=run_client)
70     clear_sys_exc_info()
71     gc.collect()
72     if w():
73         print(pformat(gc.get_referrers(w())))
74         for x in gc.get_referrers(w()):
75             print(pformat(x))
76             for y in gc.get_referrers(x):
77                 print('- {0}'.format(pformat(y)))
78         raise AssertionError('server should be dead by now')
79
80
81 def test_clean_exit():
82     run_and_check(True)
83     run_and_check(True)
84
85
86 def test_timeout_exit():
87     run_and_check(False)
88     run_and_check(False)
89
90
91 if __name__ == '__main__':
92     unittest.main()