subchannel: deliver queued connectionMade before any data
The previous implementation would call the control/receiving Protocol completely backwards: dataReceived first, then connectionLost, then finally connectionMade. Which didn't work at all, of course.
This commit is contained in:
parent
4d57465444
commit
b233763082
|
@ -165,11 +165,13 @@ class SubChannel(object):
|
|||
closing.upon(local_close, enter=closing, outputs=[error_closed_close])
|
||||
# the CLOSED state won't ever see messages, since we'll be deleted
|
||||
|
||||
# our endpoints use this
|
||||
# our endpoints use these
|
||||
|
||||
def _set_protocol(self, protocol):
|
||||
assert not self._protocol
|
||||
self._protocol = protocol
|
||||
|
||||
def _deliver_queued_data(self):
|
||||
if self._pending_dataReceived:
|
||||
for data in self._pending_dataReceived:
|
||||
self._protocol.dataReceived(data)
|
||||
|
@ -244,6 +246,7 @@ class ControlEndpoint(object):
|
|||
self._subchannel_zero._set_protocol(p)
|
||||
# this sets p.transport and calls p.connectionMade()
|
||||
p.makeConnection(self._subchannel_zero)
|
||||
self._subchannel_zero._deliver_queued_data()
|
||||
returnValue(p)
|
||||
|
||||
|
||||
|
@ -304,6 +307,7 @@ class SubchannelListenerEndpoint(object):
|
|||
p = self._factory.buildProtocol(peer_addr)
|
||||
t._set_protocol(p)
|
||||
p.makeConnection(t)
|
||||
t._deliver_queued_data()
|
||||
|
||||
def _main_channel_ready(self):
|
||||
self._wait_for_main_channel.fire(None)
|
||||
|
|
|
@ -38,7 +38,8 @@ class Control(unittest.TestCase):
|
|||
|
||||
self.assertIdentical(self.successResultOf(d), p)
|
||||
self.assertEqual(f.buildProtocol.mock_calls, [mock.call(peeraddr)])
|
||||
self.assertEqual(sc0.mock_calls, [mock.call._set_protocol(p)])
|
||||
self.assertEqual(sc0.mock_calls, [mock.call._set_protocol(p),
|
||||
mock.call._deliver_queued_data()])
|
||||
self.assertEqual(p.mock_calls, [mock.call.makeConnection(sc0)])
|
||||
|
||||
d = ep.connect(f)
|
||||
|
@ -87,7 +88,8 @@ class Control(unittest.TestCase):
|
|||
eq.flush_sync()
|
||||
self.assertIdentical(self.successResultOf(d), p)
|
||||
self.assertEqual(f.buildProtocol.mock_calls, [mock.call(peeraddr)])
|
||||
self.assertEqual(sc0.mock_calls, [mock.call._set_protocol(p)])
|
||||
self.assertEqual(sc0.mock_calls, [mock.call._set_protocol(p),
|
||||
mock.call._deliver_queued_data()])
|
||||
self.assertEqual(p.mock_calls, [mock.call.makeConnection(sc0)])
|
||||
|
||||
d = ep.connect(f)
|
||||
|
@ -254,7 +256,8 @@ class Listener(unittest.TestCase):
|
|||
peeraddr1 = _SubchannelAddress(1)
|
||||
ep._got_open(t1, peeraddr1)
|
||||
|
||||
self.assertEqual(t1.mock_calls, [mock.call._set_protocol(p1)])
|
||||
self.assertEqual(t1.mock_calls, [mock.call._set_protocol(p1),
|
||||
mock.call._deliver_queued_data()])
|
||||
self.assertEqual(p1.mock_calls, [mock.call.makeConnection(t1)])
|
||||
self.assertEqual(f.buildProtocol.mock_calls, [mock.call(peeraddr1)])
|
||||
|
||||
|
@ -262,7 +265,8 @@ class Listener(unittest.TestCase):
|
|||
peeraddr2 = _SubchannelAddress(2)
|
||||
ep._got_open(t2, peeraddr2)
|
||||
|
||||
self.assertEqual(t2.mock_calls, [mock.call._set_protocol(p2)])
|
||||
self.assertEqual(t2.mock_calls, [mock.call._set_protocol(p2),
|
||||
mock.call._deliver_queued_data()])
|
||||
self.assertEqual(p2.mock_calls, [mock.call.makeConnection(t2)])
|
||||
self.assertEqual(f.buildProtocol.mock_calls, [mock.call(peeraddr1),
|
||||
mock.call(peeraddr2)])
|
||||
|
@ -320,7 +324,9 @@ class Listener(unittest.TestCase):
|
|||
self.assertEqual(lp.getHost(), hostaddr)
|
||||
lp.startListening()
|
||||
|
||||
self.assertEqual(t1.mock_calls, [mock.call._set_protocol(p1)])
|
||||
# TODO: assert makeConnection is called *before* _deliver_queued_data
|
||||
self.assertEqual(t1.mock_calls, [mock.call._set_protocol(p1),
|
||||
mock.call._deliver_queued_data()])
|
||||
self.assertEqual(p1.mock_calls, [mock.call.makeConnection(t1)])
|
||||
self.assertEqual(f.buildProtocol.mock_calls, [mock.call(peeraddr1)])
|
||||
|
||||
|
@ -328,7 +334,8 @@ class Listener(unittest.TestCase):
|
|||
peeraddr2 = _SubchannelAddress(2)
|
||||
ep._got_open(t2, peeraddr2)
|
||||
|
||||
self.assertEqual(t2.mock_calls, [mock.call._set_protocol(p2)])
|
||||
self.assertEqual(t2.mock_calls, [mock.call._set_protocol(p2),
|
||||
mock.call._deliver_queued_data()])
|
||||
self.assertEqual(p2.mock_calls, [mock.call.makeConnection(t2)])
|
||||
self.assertEqual(f.buildProtocol.mock_calls, [mock.call(peeraddr1),
|
||||
mock.call(peeraddr2)])
|
||||
|
|
|
@ -112,6 +112,7 @@ class SubChannelAPI(unittest.TestCase):
|
|||
sc.remote_data(b"data")
|
||||
self.assertEqual(p.mock_calls, [])
|
||||
sc._set_protocol(p)
|
||||
sc._deliver_queued_data()
|
||||
self.assertEqual(p.mock_calls, [mock.call.dataReceived(b"data")])
|
||||
p.mock_calls[:] = []
|
||||
sc.remote_data(b"more")
|
||||
|
@ -122,6 +123,7 @@ class SubChannelAPI(unittest.TestCase):
|
|||
sc.remote_close()
|
||||
self.assertEqual(p.mock_calls, [])
|
||||
sc._set_protocol(p)
|
||||
sc._deliver_queued_data()
|
||||
self.assert_connectionDone(p.mock_calls)
|
||||
|
||||
def test_producer(self):
|
||||
|
|
Loading…
Reference in New Issue
Block a user