summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-01-28 23:36:51 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2015-01-28 23:36:51 (GMT)
commitfa73779b0a54211e99bd1e76511f30352c7055e9 (patch)
tree0abf1f81f382ddd5771db6b49d798e2a27d1eeaa
parentf07801bb17f8089dc8b8a4d2beafba7c497af900 (diff)
downloadcpython-fa73779b0a54211e99bd1e76511f30352c7055e9.zip
cpython-fa73779b0a54211e99bd1e76511f30352c7055e9.tar.gz
cpython-fa73779b0a54211e99bd1e76511f30352c7055e9.tar.bz2
asyncio: Fix _SelectorSocketTransport constructor
Only start reading when connection_made() has been called: protocol.data_received() must not be called before protocol.connection_made().
-rw-r--r--Lib/asyncio/selector_events.py4
-rw-r--r--Lib/test/test_asyncio/test_selector_events.py16
2 files changed, 14 insertions, 6 deletions
diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py
index 42d88f5..f499629 100644
--- a/Lib/asyncio/selector_events.py
+++ b/Lib/asyncio/selector_events.py
@@ -578,8 +578,10 @@ class _SelectorSocketTransport(_SelectorTransport):
self._eof = False
self._paused = False
- self._loop.add_reader(self._sock_fd, self._read_ready)
self._loop.call_soon(self._protocol.connection_made, self)
+ # only start reading when connection_made() has been called
+ self._loop.call_soon(self._loop.add_reader,
+ self._sock_fd, self._read_ready)
if waiter is not None:
# only wake up the waiter when connection_made() has been called
self._loop.call_soon(waiter._set_result_unless_cancelled, None)
diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py
index ad86ada..5152616 100644
--- a/Lib/test/test_asyncio/test_selector_events.py
+++ b/Lib/test/test_asyncio/test_selector_events.py
@@ -59,6 +59,7 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
def test_make_socket_transport(self):
m = mock.Mock()
self.loop.add_reader = mock.Mock()
+ self.loop.add_reader._is_coroutine = False
transport = self.loop._make_socket_transport(m, asyncio.Protocol())
self.assertIsInstance(transport, _SelectorSocketTransport)
close_transport(transport)
@@ -67,6 +68,7 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
def test_make_ssl_transport(self):
m = mock.Mock()
self.loop.add_reader = mock.Mock()
+ self.loop.add_reader._is_coroutine = False
self.loop.add_writer = mock.Mock()
self.loop.remove_reader = mock.Mock()
self.loop.remove_writer = mock.Mock()
@@ -770,20 +772,24 @@ class SelectorSocketTransportTests(test_utils.TestCase):
return transport
def test_ctor(self):
- tr = self.socket_transport()
+ waiter = asyncio.Future(loop=self.loop)
+ tr = self.socket_transport(waiter=waiter)
+ self.loop.run_until_complete(waiter)
+
self.loop.assert_reader(7, tr._read_ready)
test_utils.run_briefly(self.loop)
self.protocol.connection_made.assert_called_with(tr)
def test_ctor_with_waiter(self):
- fut = asyncio.Future(loop=self.loop)
+ waiter = asyncio.Future(loop=self.loop)
+ self.socket_transport(waiter=waiter)
+ self.loop.run_until_complete(waiter)
- self.socket_transport(waiter=fut)
- test_utils.run_briefly(self.loop)
- self.assertIsNone(fut.result())
+ self.assertIsNone(waiter.result())
def test_pause_resume_reading(self):
tr = self.socket_transport()
+ test_utils.run_briefly(self.loop)
self.assertFalse(tr._paused)
self.loop.assert_reader(7, tr._read_ready)
tr.pause_reading()