test server-reconnection: it worked already
Cool, it actually worked without changes. Closes #42
This commit is contained in:
parent
3d89d78ea5
commit
781d791e03
|
@ -77,6 +77,7 @@ class RendezvousConnector(object):
|
||||||
ep = self._make_endpoint(p.hostname, p.port or 80)
|
ep = self._make_endpoint(p.hostname, p.port or 80)
|
||||||
# TODO: change/wrap ClientService to fail if the first attempt fails
|
# TODO: change/wrap ClientService to fail if the first attempt fails
|
||||||
self._connector = internet.ClientService(ep, f)
|
self._connector = internet.ClientService(ep, f)
|
||||||
|
self._debug_record_inbound_f = None
|
||||||
|
|
||||||
def set_trace(self, f):
|
def set_trace(self, f):
|
||||||
self._trace = f
|
self._trace = f
|
||||||
|
@ -120,6 +121,8 @@ class RendezvousConnector(object):
|
||||||
self._tx("close", mailbox=mailbox, mood=mood)
|
self._tx("close", mailbox=mailbox, mood=mood)
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
|
# ClientService.stopService is defined to "Stop attempting to
|
||||||
|
# reconnect and close any existing connections"
|
||||||
d = defer.maybeDeferred(self._connector.stopService)
|
d = defer.maybeDeferred(self._connector.stopService)
|
||||||
d.addErrback(log.err) # TODO: deliver error upstairs?
|
d.addErrback(log.err) # TODO: deliver error upstairs?
|
||||||
d.addBoth(self._stopped)
|
d.addBoth(self._stopped)
|
||||||
|
@ -157,6 +160,8 @@ class RendezvousConnector(object):
|
||||||
))
|
))
|
||||||
|
|
||||||
self._timing.add("ws_receive", _side=self._side, message=msg)
|
self._timing.add("ws_receive", _side=self._side, message=msg)
|
||||||
|
if self._debug_record_inbound_f:
|
||||||
|
self._debug_record_inbound_f(msg)
|
||||||
mtype = msg["type"]
|
mtype = msg["type"]
|
||||||
meth = getattr(self, "_response_handle_"+mtype, None)
|
meth = getattr(self, "_response_handle_"+mtype, None)
|
||||||
if not meth:
|
if not meth:
|
||||||
|
|
|
@ -493,3 +493,50 @@ class Errors(ServerBase, unittest.TestCase):
|
||||||
yield w.when_code()
|
yield w.when_code()
|
||||||
self.assertRaises(OnlyOneCodeError, w.set_code, "123-nope")
|
self.assertRaises(OnlyOneCodeError, w.set_code, "123-nope")
|
||||||
yield self.assertFailure(w.close(), LonelyError)
|
yield self.assertFailure(w.close(), LonelyError)
|
||||||
|
|
||||||
|
class Reconnection(ServerBase, unittest.TestCase):
|
||||||
|
@inlineCallbacks
|
||||||
|
def test_basic(self):
|
||||||
|
w1 = wormhole.create(APPID, self.relayurl, reactor)
|
||||||
|
w1_in = []
|
||||||
|
w1._boss._RC._debug_record_inbound_f = w1_in.append
|
||||||
|
#w1.debug_set_trace("W1")
|
||||||
|
w1.allocate_code()
|
||||||
|
code = yield w1.when_code()
|
||||||
|
w1.send(b"data1") # will be queued until wormhole is established
|
||||||
|
|
||||||
|
# now wait until we've deposited all our messages on the server
|
||||||
|
def seen_our_pake():
|
||||||
|
for m in w1_in:
|
||||||
|
if m["type"] == "message" and m["phase"] == "pake":
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
yield poll_until(seen_our_pake)
|
||||||
|
|
||||||
|
w1_in[:] = []
|
||||||
|
# drop the connection
|
||||||
|
w1._boss._RC._ws.transport.loseConnection()
|
||||||
|
# wait for it to reconnect and redeliver all the messages. The server
|
||||||
|
# sends mtype=message messages in random order, but we've only sent
|
||||||
|
# one of them, so it's safe to wait for just the PAKE phase.
|
||||||
|
yield poll_until(seen_our_pake)
|
||||||
|
|
||||||
|
# now let the second side proceed. this simulates the most common
|
||||||
|
# case: the server is bounced while the sender is waiting, before the
|
||||||
|
# receiver has started
|
||||||
|
|
||||||
|
w2 = wormhole.create(APPID, self.relayurl, reactor)
|
||||||
|
#w2.debug_set_trace(" W2")
|
||||||
|
w2.set_code(code)
|
||||||
|
|
||||||
|
dataY = yield w2.when_received()
|
||||||
|
self.assertEqual(dataY, b"data1")
|
||||||
|
|
||||||
|
w2.send(b"data2")
|
||||||
|
dataX = yield w1.when_received()
|
||||||
|
self.assertEqual(dataX, b"data2")
|
||||||
|
|
||||||
|
c1 = yield w1.close()
|
||||||
|
self.assertEqual(c1, "happy")
|
||||||
|
c2 = yield w2.close()
|
||||||
|
self.assertEqual(c2, "happy")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user