[Python-checkins] cpython: asyncio: Replace connection_refused() with error_received().

guido.van.rossum python-checkins at python.org
Sat Nov 16 01:51:54 CET 2013


http://hg.python.org/cpython/rev/2248b9fbab39
changeset:   87143:2248b9fbab39
user:        Guido van Rossum <guido at dropbox.com>
date:        Fri Nov 15 16:51:48 2013 -0800
summary:
  asyncio: Replace connection_refused() with error_received().

files:
  Lib/asyncio/protocols.py                      |  12 ++-
  Lib/asyncio/selector_events.py                |  17 +---
  Lib/test/test_asyncio/test_base_events.py     |   2 +-
  Lib/test/test_asyncio/test_events.py          |   4 +-
  Lib/test/test_asyncio/test_selector_events.py |  33 ++++++---
  5 files changed, 39 insertions(+), 29 deletions(-)


diff --git a/Lib/asyncio/protocols.py b/Lib/asyncio/protocols.py
--- a/Lib/asyncio/protocols.py
+++ b/Lib/asyncio/protocols.py
@@ -100,15 +100,18 @@
     def datagram_received(self, data, addr):
         """Called when some datagram is received."""
 
-    def connection_refused(self, exc):
-        """Connection is refused."""
+    def error_received(self, exc):
+        """Called when a send or receive operation raises an OSError.
+
+        (Other than BlockingIOError or InterruptedError.)
+        """
 
 
 class SubprocessProtocol(BaseProtocol):
     """ABC representing a protocol for subprocess calls."""
 
     def pipe_data_received(self, fd, data):
-        """Called when subprocess write a data into stdout/stderr pipes.
+        """Called when the subprocess writes data into stdout/stderr pipe.
 
         fd is int file dascriptor.
         data is bytes object.
@@ -122,5 +125,4 @@
         """
 
     def process_exited(self):
-        """Called when subprocess has exited.
-        """
+        """Called when subprocess has exited."""
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
@@ -771,6 +771,8 @@
             data, addr = self._sock.recvfrom(self.max_size)
         except (BlockingIOError, InterruptedError):
             pass
+        except OSError as exc:
+            self._protocol.error_received(exc)
         except Exception as exc:
             self._fatal_error(exc)
         else:
@@ -800,9 +802,8 @@
                 return
             except (BlockingIOError, InterruptedError):
                 self._loop.add_writer(self._sock_fd, self._sendto_ready)
-            except ConnectionRefusedError as exc:
-                if self._address:
-                    self._fatal_error(exc)
+            except OSError as exc:
+                self._protocol.error_received(exc)
                 return
             except Exception as exc:
                 self._fatal_error(exc)
@@ -822,9 +823,8 @@
             except (BlockingIOError, InterruptedError):
                 self._buffer.appendleft((data, addr))  # Try again later.
                 break
-            except ConnectionRefusedError as exc:
-                if self._address:
-                    self._fatal_error(exc)
+            except OSError as exc:
+                self._protocol.error_received(exc)
                 return
             except Exception as exc:
                 self._fatal_error(exc)
@@ -835,8 +835,3 @@
             self._loop.remove_writer(self._sock_fd)
             if self._closing:
                 self._call_connection_lost(None)
-
-    def _force_close(self, exc):
-        if self._address and isinstance(exc, ConnectionRefusedError):
-            self._protocol.connection_refused(exc)
-        super()._force_close(exc)
diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py
--- a/Lib/test/test_asyncio/test_base_events.py
+++ b/Lib/test/test_asyncio/test_base_events.py
@@ -284,7 +284,7 @@
         assert self.state == 'INITIALIZED', self.state
         self.nbytes += len(data)
 
-    def connection_refused(self, exc):
+    def error_received(self, exc):
         assert self.state == 'INITIALIZED', self.state
 
     def connection_lost(self, exc):
diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
--- a/Lib/test/test_asyncio/test_events.py
+++ b/Lib/test/test_asyncio/test_events.py
@@ -78,7 +78,7 @@
         assert self.state == 'INITIALIZED', self.state
         self.nbytes += len(data)
 
-    def connection_refused(self, exc):
+    def error_received(self, exc):
         assert self.state == 'INITIALIZED', self.state
 
     def connection_lost(self, exc):
@@ -1557,7 +1557,7 @@
         dp = protocols.DatagramProtocol()
         self.assertIsNone(dp.connection_made(f))
         self.assertIsNone(dp.connection_lost(f))
-        self.assertIsNone(dp.connection_refused(f))
+        self.assertIsNone(dp.error_received(f))
         self.assertIsNone(dp.datagram_received(f, f))
 
         sp = protocols.SubprocessProtocol()
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
@@ -1329,11 +1329,22 @@
         transport = _SelectorDatagramTransport(
             self.loop, self.sock, self.protocol)
 
+        err = self.sock.recvfrom.side_effect = RuntimeError()
+        transport._fatal_error = unittest.mock.Mock()
+        transport._read_ready()
+
+        transport._fatal_error.assert_called_with(err)
+
+    def test_read_ready_oserr(self):
+        transport = _SelectorDatagramTransport(
+            self.loop, self.sock, self.protocol)
+
         err = self.sock.recvfrom.side_effect = OSError()
         transport._fatal_error = unittest.mock.Mock()
         transport._read_ready()
 
-        transport._fatal_error.assert_called_with(err)
+        self.assertFalse(transport._fatal_error.called)
+        self.protocol.error_received.assert_called_with(err)
 
     def test_sendto(self):
         data = b'data'
@@ -1380,7 +1391,7 @@
     @unittest.mock.patch('asyncio.selector_events.logger')
     def test_sendto_exception(self, m_log):
         data = b'data'
-        err = self.sock.sendto.side_effect = OSError()
+        err = self.sock.sendto.side_effect = RuntimeError()
 
         transport = _SelectorDatagramTransport(
             self.loop, self.sock, self.protocol)
@@ -1399,7 +1410,7 @@
         transport.sendto(data)
         m_log.warning.assert_called_with('socket.send() raised exception.')
 
-    def test_sendto_connection_refused(self):
+    def test_sendto_error_received(self):
         data = b'data'
 
         self.sock.sendto.side_effect = ConnectionRefusedError
@@ -1412,7 +1423,7 @@
         self.assertEqual(transport._conn_lost, 0)
         self.assertFalse(transport._fatal_error.called)
 
-    def test_sendto_connection_refused_connected(self):
+    def test_sendto_error_received_connected(self):
         data = b'data'
 
         self.sock.send.side_effect = ConnectionRefusedError
@@ -1422,7 +1433,8 @@
         transport._fatal_error = unittest.mock.Mock()
         transport.sendto(data)
 
-        self.assertTrue(transport._fatal_error.called)
+        self.assertFalse(transport._fatal_error.called)
+        self.assertTrue(self.protocol.error_received.called)
 
     def test_sendto_str(self):
         transport = _SelectorDatagramTransport(
@@ -1495,7 +1507,7 @@
             list(transport._buffer))
 
     def test_sendto_ready_exception(self):
-        err = self.sock.sendto.side_effect = OSError()
+        err = self.sock.sendto.side_effect = RuntimeError()
 
         transport = _SelectorDatagramTransport(
             self.loop, self.sock, self.protocol)
@@ -1505,7 +1517,7 @@
 
         transport._fatal_error.assert_called_with(err)
 
-    def test_sendto_ready_connection_refused(self):
+    def test_sendto_ready_error_received(self):
         self.sock.sendto.side_effect = ConnectionRefusedError
 
         transport = _SelectorDatagramTransport(
@@ -1516,7 +1528,7 @@
 
         self.assertFalse(transport._fatal_error.called)
 
-    def test_sendto_ready_connection_refused_connection(self):
+    def test_sendto_ready_error_received_connection(self):
         self.sock.send.side_effect = ConnectionRefusedError
 
         transport = _SelectorDatagramTransport(
@@ -1525,7 +1537,8 @@
         transport._buffer.append((b'data', ()))
         transport._sendto_ready()
 
-        self.assertTrue(transport._fatal_error.called)
+        self.assertFalse(transport._fatal_error.called)
+        self.assertTrue(self.protocol.error_received.called)
 
     @unittest.mock.patch('asyncio.log.logger.exception')
     def test_fatal_error_connected(self, m_exc):
@@ -1533,7 +1546,7 @@
             self.loop, self.sock, self.protocol, ('0.0.0.0', 1))
         err = ConnectionRefusedError()
         transport._fatal_error(err)
-        self.protocol.connection_refused.assert_called_with(err)
+        self.assertFalse(self.protocol.error_received.called)
         m_exc.assert_called_with('Fatal error for %s', transport)
 
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list