summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2017-11-28 20:33:20 (GMT)
committerGitHub <noreply@github.com>2017-11-28 20:33:20 (GMT)
commitac577d7d0bd27a69921ced14c09172235ceebab5 (patch)
tree0d8e39b6dbab0cd260764fa8acaf0390a8c509b6
parent4d193bcc2560b824389e4d98d9d8b9b34e33dbaf (diff)
downloadcpython-ac577d7d0bd27a69921ced14c09172235ceebab5.zip
cpython-ac577d7d0bd27a69921ced14c09172235ceebab5.tar.gz
cpython-ac577d7d0bd27a69921ced14c09172235ceebab5.tar.bz2
bpo-32154: Remove asyncio.windows_utils.socketpair (#4609)
-rw-r--r--Doc/library/asyncio-eventloop.rst5
-rw-r--r--Doc/library/asyncio-protocol.rst5
-rw-r--r--Doc/library/asyncio-stream.rst5
-rw-r--r--Doc/whatsnew/3.7.rst6
-rw-r--r--Lib/asyncio/test_utils.py6
-rw-r--r--Lib/asyncio/windows_utils.py50
-rw-r--r--Lib/test/test_asyncio/test_events.py12
-rw-r--r--Lib/test/test_asyncio/test_windows_utils.py50
-rw-r--r--Misc/NEWS.d/next/Library/2017-11-28-15-27-10.bpo-32154.kDox7L.rst5
9 files changed, 21 insertions, 123 deletions
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.