finish fixing/testing manager.py
This commit is contained in:
parent
e55787c693
commit
40dadfeb71
|
@ -38,6 +38,13 @@ class ReceivedHintsTooEarly(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class UnexpectedKCM(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class UnknownMessageType(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
def make_side():
|
def make_side():
|
||||||
return bytes_to_hexstr(os.urandom(6))
|
return bytes_to_hexstr(os.urandom(6))
|
||||||
|
|
||||||
|
@ -94,7 +101,7 @@ class Manager(object):
|
||||||
_next_subchannel_id = None # initialized in choose_role
|
_next_subchannel_id = None # initialized in choose_role
|
||||||
|
|
||||||
m = MethodicalMachine()
|
m = MethodicalMachine()
|
||||||
set_trace = getattr(m, "_setTrace", lambda self, f: None)
|
set_trace = getattr(m, "_setTrace", lambda self, f: None) # pragma: no cover
|
||||||
|
|
||||||
def __attrs_post_init__(self):
|
def __attrs_post_init__(self):
|
||||||
self._got_versions_d = Deferred()
|
self._got_versions_d = Deferred()
|
||||||
|
@ -214,8 +221,9 @@ class Manager(object):
|
||||||
self._inbound.handle_data(r.scid, r.data)
|
self._inbound.handle_data(r.scid, r.data)
|
||||||
else: # isinstance(r, Close)
|
else: # isinstance(r, Close)
|
||||||
self._inbound.handle_close(r.scid)
|
self._inbound.handle_close(r.scid)
|
||||||
|
return
|
||||||
if isinstance(r, KCM):
|
if isinstance(r, KCM):
|
||||||
log.err("got unexpected KCM")
|
log.err(UnexpectedKCM())
|
||||||
elif isinstance(r, Ping):
|
elif isinstance(r, Ping):
|
||||||
self.handle_ping(r.ping_id)
|
self.handle_ping(r.ping_id)
|
||||||
elif isinstance(r, Pong):
|
elif isinstance(r, Pong):
|
||||||
|
@ -223,7 +231,7 @@ class Manager(object):
|
||||||
elif isinstance(r, Ack):
|
elif isinstance(r, Ack):
|
||||||
self._outbound.handle_ack(r.resp_seqnum) # retire queued messages
|
self._outbound.handle_ack(r.resp_seqnum) # retire queued messages
|
||||||
else:
|
else:
|
||||||
log.err("received unknown message type {}".format(r))
|
log.err(UnknownMessageType("{}".format(r)))
|
||||||
|
|
||||||
# pings, pongs, and acks are not queued
|
# pings, pongs, and acks are not queued
|
||||||
def send_ping(self, ping_id):
|
def send_ping(self, ping_id):
|
||||||
|
|
|
@ -11,9 +11,11 @@ from ..._dilation import roles
|
||||||
from ..._dilation.encode import to_be4
|
from ..._dilation.encode import to_be4
|
||||||
from ..._dilation.manager import (Dilator, Manager, make_side,
|
from ..._dilation.manager import (Dilator, Manager, make_side,
|
||||||
OldPeerCannotDilateError,
|
OldPeerCannotDilateError,
|
||||||
UnknownDilationMessageType)
|
UnknownDilationMessageType,
|
||||||
|
UnexpectedKCM,
|
||||||
|
UnknownMessageType)
|
||||||
from ..._dilation.subchannel import _WormholeAddress
|
from ..._dilation.subchannel import _WormholeAddress
|
||||||
from ..._dilation.connection import Open, Data, Close, Ack
|
from ..._dilation.connection import Open, Data, Close, Ack, KCM, Ping, Pong
|
||||||
from .common import clear_mock_calls
|
from .common import clear_mock_calls
|
||||||
|
|
||||||
|
|
||||||
|
@ -570,10 +572,74 @@ class TestManager(unittest.TestCase):
|
||||||
self.assertEqual(c4.mock_calls, [mock.call.start()])
|
self.assertEqual(c4.mock_calls, [mock.call.start()])
|
||||||
clear_mock_calls(c3, connector4, c4)
|
clear_mock_calls(c3, connector4, c4)
|
||||||
|
|
||||||
def test_stop(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def test_mirror(self):
|
def test_mirror(self):
|
||||||
# receive a PLEASE with the same side as us: shouldn't happen
|
# receive a PLEASE with the same side as us: shouldn't happen
|
||||||
pass
|
m, h = make_manager(leader=True)
|
||||||
|
|
||||||
|
m.start()
|
||||||
|
clear_mock_calls(h.send)
|
||||||
|
e = self.assertRaises(ValueError, m.rx_PLEASE, {"side": LEADER})
|
||||||
|
self.assertEqual(str(e), "their side shouldn't be equal: reflection?")
|
||||||
|
|
||||||
|
def test_ping_pong(self):
|
||||||
|
m, h = make_manager(leader=False)
|
||||||
|
|
||||||
|
m.got_record(KCM())
|
||||||
|
self.flushLoggedErrors(UnexpectedKCM)
|
||||||
|
|
||||||
|
m.got_record(Ping(1))
|
||||||
|
self.assertEqual(h.outbound.mock_calls,
|
||||||
|
[mock.call.send_if_connected(Pong(1))])
|
||||||
|
clear_mock_calls(h.outbound)
|
||||||
|
|
||||||
|
m.got_record(Pong(2))
|
||||||
|
# currently ignored, will eventually update a timer
|
||||||
|
|
||||||
|
m.got_record("not recognized")
|
||||||
|
e = self.flushLoggedErrors(UnknownMessageType)
|
||||||
|
self.assertEqual(len(e), 1)
|
||||||
|
self.assertEqual(str(e[0].value), "not recognized")
|
||||||
|
|
||||||
|
m.send_ping(3)
|
||||||
|
self.assertEqual(h.outbound.mock_calls,
|
||||||
|
[mock.call.send_if_connected(Pong(3))])
|
||||||
|
clear_mock_calls(h.outbound)
|
||||||
|
|
||||||
|
def test_subchannel(self):
|
||||||
|
m, h = make_manager(leader=True)
|
||||||
|
sc = object()
|
||||||
|
|
||||||
|
m.subchannel_pauseProducing(sc)
|
||||||
|
self.assertEqual(h.inbound.mock_calls, [
|
||||||
|
mock.call.subchannel_pauseProducing(sc)])
|
||||||
|
clear_mock_calls(h.inbound)
|
||||||
|
|
||||||
|
m.subchannel_resumeProducing(sc)
|
||||||
|
self.assertEqual(h.inbound.mock_calls, [
|
||||||
|
mock.call.subchannel_resumeProducing(sc)])
|
||||||
|
clear_mock_calls(h.inbound)
|
||||||
|
|
||||||
|
m.subchannel_stopProducing(sc)
|
||||||
|
self.assertEqual(h.inbound.mock_calls, [
|
||||||
|
mock.call.subchannel_stopProducing(sc)])
|
||||||
|
clear_mock_calls(h.inbound)
|
||||||
|
|
||||||
|
p = object()
|
||||||
|
streaming = object()
|
||||||
|
|
||||||
|
m.subchannel_registerProducer(sc, p, streaming)
|
||||||
|
self.assertEqual(h.outbound.mock_calls, [
|
||||||
|
mock.call.subchannel_registerProducer(sc, p, streaming)])
|
||||||
|
clear_mock_calls(h.outbound)
|
||||||
|
|
||||||
|
m.subchannel_unregisterProducer(sc)
|
||||||
|
self.assertEqual(h.outbound.mock_calls, [
|
||||||
|
mock.call.subchannel_unregisterProducer(sc)])
|
||||||
|
clear_mock_calls(h.outbound)
|
||||||
|
|
||||||
|
m.subchannel_closed("scid", sc)
|
||||||
|
self.assertEqual(h.inbound.mock_calls, [
|
||||||
|
mock.call.subchannel_closed("scid", sc)])
|
||||||
|
self.assertEqual(h.outbound.mock_calls, [
|
||||||
|
mock.call.subchannel_closed("scid", sc)])
|
||||||
|
clear_mock_calls(h.inbound, h.outbound)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user