]> granicus.if.org Git - python/commitdiff
asyncio: Fix _SelectorSocketTransport constructor
authorVictor Stinner <victor.stinner@gmail.com>
Wed, 28 Jan 2015 23:36:51 +0000 (00:36 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Wed, 28 Jan 2015 23:36:51 +0000 (00:36 +0100)
Only start reading when connection_made() has been called:
protocol.data_received() must not be called before protocol.connection_made().

Lib/asyncio/selector_events.py
Lib/test/test_asyncio/test_selector_events.py

index 42d88f5de7949c33c6c5f26ac5ed6a3bc846bd5f..f49962936211ff58d00eaa5d01fd34e455fad4af 100644 (file)
@@ -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)
index ad86ada3425a1d2ea24a0a56a8ac60bb1ae81937..51526163953806e26e7705bcc525c27b44760c8a 100644 (file)
@@ -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()