From ac577d7d0bd27a69921ced14c09172235ceebab5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 28 Nov 2017 21:33:20 +0100 Subject: bpo-32154: Remove asyncio.windows_utils.socketpair (#4609) --- Doc/library/asyncio-eventloop.rst | 5 +-- Doc/library/asyncio-protocol.rst | 5 +-- Doc/library/asyncio-stream.rst | 5 +-- Doc/whatsnew/3.7.rst | 6 +++ Lib/asyncio/test_utils.py | 6 --- Lib/asyncio/windows_utils.py | 50 +--------------------- Lib/test/test_asyncio/test_events.py | 12 +++--- Lib/test/test_asyncio/test_windows_utils.py | 50 ---------------------- .../2017-11-28-15-27-10.bpo-32154.kDox7L.rst | 5 +++ 9 files changed, 21 insertions(+), 123 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-11-28-15-27-10.bpo-32154.kDox7L.rst diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 1919b10..760640f 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -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() diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index cd84ae7..af46200 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -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() diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index 491afdd..78091d6 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -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): diff --git a/Doc/whatsnew/3.7.rst b/Doc/whatsnew/3.7.rst index 4973080..e4600fe 100644 --- a/Doc/whatsnew/3.7.rst +++ b/Doc/whatsnew/3.7.rst @@ -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 diff --git a/Lib/asyncio/test_utils.py b/Lib/asyncio/test_utils.py index f797b2f..32d3b0b 100644 --- a/Lib/asyncio/test_utils.py +++ b/Lib/asyncio/test_utils.py @@ -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 diff --git a/Lib/asyncio/windows_utils.py b/Lib/asyncio/windows_utils.py index d65ea17..3b41097 100644 --- a/Lib/asyncio/windows_utils.py +++ b/Lib/asyncio/windows_utils.py @@ -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 diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index c252a4c..a6941aa 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -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() diff --git a/Lib/test/test_asyncio/test_windows_utils.py b/Lib/test/test_asyncio/test_windows_utils.py index 4fddaa2..952f95e 100644 --- a/Lib/test/test_asyncio/test_windows_utils.py +++ b/Lib/test/test_asyncio/test_windows_utils.py @@ -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 index 0000000..67c6306 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-11-28-15-27-10.bpo-32154.kDox7L.rst @@ -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. -- cgit v0.12