切断後にサーバーに再接続するコードをテストしようとしています。これはテストの外では完全に正常に機能しますが、テストの実行時にソケットが切断されたことを確認できません。
Gevent Stream Serverを使用して、実際のリスニングサーバーをモックしています。
import gevent.server
from gevent import queue
class TestServer(gevent.server.StreamServer):
def __init__(self, *args, **kwargs):
super(TestServer, self).__init__(*args, **kwargs)
self.sockets = {}
def handle(self, socket, address):
self.sockets[address] = (socket, queue.Queue())
socket.sendall('testing the connection\r\n')
gevent.spawn(self.recv, address)
def recv(self, address):
socket = self.sockets[address][0]
queue = self.sockets[address][1]
print 'Connection accepted %s:%d' % address
try:
for data in socket.recv(1024):
queue.put(data)
except:
pass
def murder(self):
self.stop()
for sock in self.sockets.iteritems():
print sock
sock[1][0].shutdown(socket.SHUT_RDWR)
sock[1][0].close()
self.sockets = {}
def run_server():
test_server = TestServer(('127.0.0.1', 10666))
test_server.start()
return test_server
そして私のテストは次のようになります:
def test_can_reconnect(self):
test_server = run_server()
client_config = {'host': '127.0.0.1', 'port': 10666}
client = Connection('test client', client_config, get_config())
client.connect()
assert client.socket_connected
test_server.murder()
#time.sleep(4) #tried sleeping. no dice.
assert not client.socket_connected
assert client.server_disconnect
test_server = run_server()
client.reconnect()
assert client.socket_connected
で失敗しassert not client.socket_connected
ます。
recv中に「データではない」を検出します。Noneの場合、他のコードが再接続するかどうかを決定できるようにいくつかの変数を設定します(user_disconnectの場合は再接続しないでくださいなど)。この動作は機能し、過去には常に機能してきました。これまでテストを試みたことがありません。ソケット接続やローカル関数スコープなどに何か奇妙なことがありますか?サーバーを停止した後も接続が存在しているようです。
私がテストしようとしているコードは開いています:https ://github.com/kyleterry/tenyks.git
テストを実行すると、修正しようとしているテストが失敗することがわかります。