
- integer division - repr instead of ` Added __hash__ to speedy Proxy funtions - 3.x requires __hash__ if __eq__ is defined. Found problem with comparing two proxy objects.
86 lines
2.2 KiB
Python
86 lines
2.2 KiB
Python
"""This test checks that socket instances (not GreenSockets but underlying sockets)
|
|
are not leaked by the hub.
|
|
"""
|
|
import sys
|
|
import unittest
|
|
from pprint import pformat
|
|
from eventlet.common import clear_sys_exc_info
|
|
from eventlet.green import socket
|
|
from eventlet.green.thread import start_new_thread
|
|
from eventlet.green.time import sleep
|
|
import weakref
|
|
import gc
|
|
|
|
SOCKET_TIMEOUT = 0.1
|
|
|
|
def init_server():
|
|
s = socket.socket()
|
|
s.settimeout(SOCKET_TIMEOUT)
|
|
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
s.bind(('localhost', 0))
|
|
s.listen(5)
|
|
return s, s.getsockname()[1]
|
|
|
|
def handle_request(s, raise_on_timeout):
|
|
try:
|
|
conn, address = s.accept()
|
|
except socket.timeout:
|
|
if raise_on_timeout:
|
|
raise
|
|
else:
|
|
return
|
|
#print 'handle_request - accepted'
|
|
res = conn.recv(100)
|
|
assert res == 'hello', repr(res)
|
|
#print 'handle_request - recvd %r' % res
|
|
res = conn.send('bye')
|
|
#print 'handle_request - sent %r' % res
|
|
#print 'handle_request - conn refcount: %s' % sys.getrefcount(conn)
|
|
#conn.close()
|
|
|
|
def make_request(port):
|
|
#print 'make_request'
|
|
s = socket.socket()
|
|
s.connect(('localhost', port))
|
|
#print 'make_request - connected'
|
|
res = s.send('hello')
|
|
#print 'make_request - sent %s' % res
|
|
res = s.recv(100)
|
|
assert res == 'bye', repr(res)
|
|
#print 'make_request - recvd %r' % res
|
|
#s.close()
|
|
|
|
def run_interaction(run_client):
|
|
s, port = init_server()
|
|
start_new_thread(handle_request, (s, run_client))
|
|
if run_client:
|
|
start_new_thread(make_request, (port,))
|
|
sleep(0.1+SOCKET_TIMEOUT)
|
|
#print sys.getrefcount(s.fd)
|
|
#s.close()
|
|
return weakref.ref(s.fd)
|
|
|
|
def run_and_check(run_client):
|
|
w = run_interaction(run_client=run_client)
|
|
clear_sys_exc_info()
|
|
if w():
|
|
print pformat(gc.get_referrers(w()))
|
|
for x in gc.get_referrers(w()):
|
|
print pformat(x)
|
|
for y in gc.get_referrers(x):
|
|
print '-', pformat(y)
|
|
raise AssertionError('server should be dead by now')
|
|
|
|
|
|
def test_clean_exit():
|
|
run_and_check(True)
|
|
run_and_check(True)
|
|
|
|
def test_timeout_exit():
|
|
run_and_check(False)
|
|
run_and_check(False)
|
|
|
|
if __name__=='__main__':
|
|
unittest.main()
|
|
|