]> granicus.if.org Git - python/commitdiff
bpo-32154: Remove asyncio.windows_utils.socketpair (#4609)
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 28 Nov 2017 20:33:20 +0000 (21:33 +0100)
committerGitHub <noreply@github.com>
Tue, 28 Nov 2017 20:33:20 +0000 (21:33 +0100)
Doc/library/asyncio-eventloop.rst
Doc/library/asyncio-protocol.rst
Doc/library/asyncio-stream.rst
Doc/whatsnew/3.7.rst
Lib/asyncio/test_utils.py
Lib/asyncio/windows_utils.py
Lib/test/test_asyncio/test_events.py
Lib/test/test_asyncio/test_windows_utils.py
Misc/NEWS.d/next/Library/2017-11-28-15-27-10.bpo-32154.kDox7L.rst [new file with mode: 0644]

index 1919b10948b4b8d46d99a6efe5e1fa4e312b3398..760640fa5e41caac98fef2d20ee949fb11d590e2 100644 (file)
@@ -967,10 +967,7 @@ Wait until a file descriptor received some data using the
 :meth:`AbstractEventLoop.add_reader` method and then close the event loop::
 
     import asyncio
-    try:
-        from socket import socketpair
-    except ImportError:
-        from asyncio.windows_utils import socketpair
+    from socket import socketpair
 
     # Create a pair of connected file descriptors
     rsock, wsock = socketpair()
index cd84ae76b5d86e0fbd6b7bee880e930cda683c6e..af462009fa8f038e4a26ad28d5cefdf8ad14d3c0 100644 (file)
@@ -690,10 +690,7 @@ Wait until a socket receives data using the
 the event loop ::
 
     import asyncio
-    try:
-        from socket import socketpair
-    except ImportError:
-        from asyncio.windows_utils import socketpair
+    from socket import socketpair
 
     # Create a pair of connected sockets
     rsock, wsock = socketpair()
index 491afdd610ca0864867014f4e5ae435531b6e6c5..78091d62a71631b828602b79920c89ef911172be 100644 (file)
@@ -426,10 +426,7 @@ Coroutine waiting until a socket receives data using the
 :func:`open_connection` function::
 
     import asyncio
-    try:
-        from socket import socketpair
-    except ImportError:
-        from asyncio.windows_utils import socketpair
+    from socket import socketpair
 
     @asyncio.coroutine
     def wait_for_data(loop):
index 4973080eccbf183096e4a5aa2282801407d12f2a..e4600fe5ffd316957737bd6c46a0d5784c6b4c38 100644 (file)
@@ -686,6 +686,12 @@ Changes in Python behavior
 Changes in the Python API
 -------------------------
 
+* The ``asyncio.windows_utils.socketpair()`` function has been
+  removed: use directly :func:`socket.socketpair` which is available on all
+  platforms since Python 3.5 (before, it wasn't available on Windows).
+  ``asyncio.windows_utils.socketpair()`` was just an alias to
+  ``socket.socketpair`` on Python 3.5 and newer.
+
 * :mod:`asyncio`: The module doesn't export :mod:`selectors` and
   :mod:`_overlapped` modules as ``asyncio.selectors`` and
   ``asyncio._overlapped``. Replace ``from asyncio import selectors`` with
index f797b2f0bed4812a68c2907d63b1a7fe6cab7686..32d3b0bf630849b8a003779a18d4cec2a59ca57b 100644 (file)
@@ -35,12 +35,6 @@ from .log import logger
 from test import support
 
 
-if sys.platform == 'win32':  # pragma: no cover
-    from .windows_utils import socketpair
-else:
-    from socket import socketpair  # pragma: no cover
-
-
 def dummy_ssl_context():
     if ssl is None:
         return None
index d65ea1790f078dd3dbb68979c979c95cdb571fae..3b410976f9ddc8eaf80de5aa96275ef2f462eb9c 100644 (file)
@@ -17,7 +17,7 @@ import tempfile
 import warnings
 
 
-__all__ = ['socketpair', 'pipe', 'Popen', 'PIPE', 'PipeHandle']
+__all__ = ['pipe', 'Popen', 'PIPE', 'PipeHandle']
 
 
 # Constants/globals
@@ -29,54 +29,6 @@ STDOUT = subprocess.STDOUT
 _mmap_counter = itertools.count()
 
 
-if hasattr(socket, 'socketpair'):
-    # Since Python 3.5, socket.socketpair() is now also available on Windows
-    socketpair = socket.socketpair
-else:
-    # Replacement for socket.socketpair()
-    def socketpair(family=socket.AF_INET, type=socket.SOCK_STREAM, proto=0):
-        """A socket pair usable as a self-pipe, for Windows.
-
-        Origin: https://gist.github.com/4325783, by Geert Jansen.
-        Public domain.
-        """
-        if family == socket.AF_INET:
-            host = '127.0.0.1'
-        elif family == socket.AF_INET6:
-            host = '::1'
-        else:
-            raise ValueError("Only AF_INET and AF_INET6 socket address "
-                             "families are supported")
-        if type != socket.SOCK_STREAM:
-            raise ValueError("Only SOCK_STREAM socket type is supported")
-        if proto != 0:
-            raise ValueError("Only protocol zero is supported")
-
-        # We create a connected TCP socket. Note the trick with setblocking(0)
-        # that prevents us from having to create a thread.
-        lsock = socket.socket(family, type, proto)
-        try:
-            lsock.bind((host, 0))
-            lsock.listen(1)
-            # On IPv6, ignore flow_info and scope_id
-            addr, port = lsock.getsockname()[:2]
-            csock = socket.socket(family, type, proto)
-            try:
-                csock.setblocking(False)
-                try:
-                    csock.connect((addr, port))
-                except (BlockingIOError, InterruptedError):
-                    pass
-                csock.setblocking(True)
-                ssock, _ = lsock.accept()
-            except:
-                csock.close()
-                raise
-        finally:
-            lsock.close()
-        return (ssock, csock)
-
-
 # Replacement for os.pipe() using handles instead of fds
 
 
index c252a4c01e341dc2ce578f149bee6cf64ec5c252..a6941aa4a60e374b4a9431b6e4796c4e8db38ce0 100644 (file)
@@ -363,7 +363,7 @@ class EventLoopTestsMixin:
         self.assertNotEqual(thread_id, threading.get_ident())
 
     def test_reader_callback(self):
-        r, w = test_utils.socketpair()
+        r, w = socket.socketpair()
         r.setblocking(False)
         bytes_read = bytearray()
 
@@ -391,7 +391,7 @@ class EventLoopTestsMixin:
         self.assertEqual(bytes_read, b'abcdef')
 
     def test_writer_callback(self):
-        r, w = test_utils.socketpair()
+        r, w = socket.socketpair()
         w.setblocking(False)
 
         def writer(data):
@@ -1568,7 +1568,7 @@ class EventLoopTestsMixin:
     @unittest.skipUnless(sys.platform != 'win32',
                          "Don't support pipes for Windows")
     def test_write_pipe_disconnect_on_close(self):
-        rsock, wsock = test_utils.socketpair()
+        rsock, wsock = socket.socketpair()
         rsock.setblocking(False)
         pipeobj = io.open(wsock.detach(), 'wb', 1024)
 
@@ -1706,7 +1706,7 @@ class EventLoopTestsMixin:
         self.assertEqual('CLOSED', write_proto.state)
 
     def test_prompt_cancellation(self):
-        r, w = test_utils.socketpair()
+        r, w = socket.socketpair()
         r.setblocking(False)
         f = self.loop.sock_recv(r, 1)
         ov = getattr(f, 'ov', None)
@@ -1771,7 +1771,7 @@ class EventLoopTestsMixin:
     def test_remove_fds_after_closing(self):
         loop = self.create_event_loop()
         callback = lambda: None
-        r, w = test_utils.socketpair()
+        r, w = socket.socketpair()
         self.addCleanup(r.close)
         self.addCleanup(w.close)
         loop.add_reader(r, callback)
@@ -1783,7 +1783,7 @@ class EventLoopTestsMixin:
     def test_add_fds_after_closing(self):
         loop = self.create_event_loop()
         callback = lambda: None
-        r, w = test_utils.socketpair()
+        r, w = socket.socketpair()
         self.addCleanup(r.close)
         self.addCleanup(w.close)
         loop.close()
index 4fddaa25895391567a0a13901e2f7e2048dacf8d..952f95e5730a028e230b5fbe76fa025f3a770176 100644 (file)
@@ -19,56 +19,6 @@ except ImportError:
     from asyncio import test_support as support
 
 
-class WinsocketpairTests(unittest.TestCase):
-
-    def check_winsocketpair(self, ssock, csock):
-        csock.send(b'xxx')
-        self.assertEqual(b'xxx', ssock.recv(1024))
-        csock.close()
-        ssock.close()
-
-    def test_winsocketpair(self):
-        ssock, csock = windows_utils.socketpair()
-        self.check_winsocketpair(ssock, csock)
-
-    @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 not supported or enabled')
-    def test_winsocketpair_ipv6(self):
-        ssock, csock = windows_utils.socketpair(family=socket.AF_INET6)
-        self.check_winsocketpair(ssock, csock)
-
-    @unittest.skipIf(hasattr(socket, 'socketpair'),
-                     'socket.socketpair is available')
-    @mock.patch('asyncio.windows_utils.socket')
-    def test_winsocketpair_exc(self, m_socket):
-        m_socket.AF_INET = socket.AF_INET
-        m_socket.SOCK_STREAM = socket.SOCK_STREAM
-        m_socket.socket.return_value.getsockname.return_value = ('', 12345)
-        m_socket.socket.return_value.accept.return_value = object(), object()
-        m_socket.socket.return_value.connect.side_effect = OSError()
-
-        self.assertRaises(OSError, windows_utils.socketpair)
-
-    def test_winsocketpair_invalid_args(self):
-        self.assertRaises(ValueError,
-                          windows_utils.socketpair, family=socket.AF_UNSPEC)
-        self.assertRaises(ValueError,
-                          windows_utils.socketpair, type=socket.SOCK_DGRAM)
-        self.assertRaises(ValueError,
-                          windows_utils.socketpair, proto=1)
-
-    @unittest.skipIf(hasattr(socket, 'socketpair'),
-                     'socket.socketpair is available')
-    @mock.patch('asyncio.windows_utils.socket')
-    def test_winsocketpair_close(self, m_socket):
-        m_socket.AF_INET = socket.AF_INET
-        m_socket.SOCK_STREAM = socket.SOCK_STREAM
-        sock = mock.Mock()
-        m_socket.socket.return_value = sock
-        sock.bind.side_effect = OSError
-        self.assertRaises(OSError, windows_utils.socketpair)
-        self.assertTrue(sock.close.called)
-
-
 class PipeTests(unittest.TestCase):
 
     def test_pipe_overlapped(self):
diff --git a/Misc/NEWS.d/next/Library/2017-11-28-15-27-10.bpo-32154.kDox7L.rst b/Misc/NEWS.d/next/Library/2017-11-28-15-27-10.bpo-32154.kDox7L.rst
new file mode 100644 (file)
index 0000000..67c6306
--- /dev/null
@@ -0,0 +1,5 @@
+The ``asyncio.windows_utils.socketpair()`` function has been removed: use
+directly :func:`socket.socketpair` which is available on all platforms since
+Python 3.5 (before, it wasn't available on Windows).
+``asyncio.windows_utils.socketpair()`` was just an alias to
+``socket.socketpair`` on Python 3.5 and newer.