[Python-checkins] cpython (3.4): asyncio: Fix _SelectorSocketTransport constructor

victor.stinner python-checkins at python.org
Thu Jan 29 00:47:05 CET 2015


https://hg.python.org/cpython/rev/1b35bef31bf8
changeset: 94360:1b35bef31bf8
branch: 3.4
user: Victor Stinner <victor.stinner at gmail.com>
date: Thu Jan 29 00:36:51 2015 +0100
summary:
 asyncio: Fix _SelectorSocketTransport constructor
Only start reading when connection_made() has been called:
protocol.data_received() must not be called before protocol.connection_made().
files:
 Lib/asyncio/selector_events.py | 4 +-
 Lib/test/test_asyncio/test_selector_events.py | 16 ++++++---
 2 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py
--- a/Lib/asyncio/selector_events.py
+++ b/Lib/asyncio/selector_events.py
@@ -578,8 +578,10 @@
 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
--- a/Lib/test/test_asyncio/test_selector_events.py
+++ b/Lib/test/test_asyncio/test_selector_events.py
@@ -59,6 +59,7 @@
 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 @@
 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 @@
 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()
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /