summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-08-25 21:20:52 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2014-08-25 21:20:52 (GMT)
commitb261475a48d905f160bc1f499e90b995b0d0b6c0 (patch)
tree1151160908141088d3fa02db4028006f67603d07 /Lib/test
parentd71dcbb043578c0abe770a2f37fac36e1a402821 (diff)
downloadcpython-b261475a48d905f160bc1f499e90b995b0d0b6c0.zip
cpython-b261475a48d905f160bc1f499e90b995b0d0b6c0.tar.gz
cpython-b261475a48d905f160bc1f499e90b995b0d0b6c0.tar.bz2
asyncio: sync with Tulip
* PipeServer.close() now cancels the "accept pipe" future which cancels the overlapped operation. * Fix _SelectorTransport.__repr__() if the transport was closed * Fix debug log in BaseEventLoop.create_connection(): get the socket object from the transport because SSL transport closes the old socket and creates a new SSL socket object. Remove also the _SelectorSslTransport._rawsock attribute: it contained the closed socket (not very useful) and it was not used. * Issue #22063: socket operations (sock_recv, sock_sendall, sock_connect, sock_accept) of the proactor event loop don't raise an exception in debug mode if the socket are in blocking mode. Overlapped operations also work on blocking sockets. * Fix unit tests in debug mode: mock a non-blocking socket for socket operations which now raise an exception if the socket is blocking. * _fatal_error() method of _UnixReadPipeTransport and _UnixWritePipeTransport now log all exceptions in debug mode * Don't log expected errors in unit tests * Tulip issue 200: _WaitHandleFuture._unregister_wait() now catchs and logs exceptions. * Tulip issue 200: Log errors in debug mode instead of simply ignoring them.
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_asyncio/test_base_events.py3
-rw-r--r--Lib/test/test_asyncio/test_events.py36
-rw-r--r--Lib/test/test_asyncio/test_selector_events.py24
-rw-r--r--Lib/test/test_asyncio/test_subprocess.py8
4 files changed, 42 insertions, 29 deletions
diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py
index 7bf07ed..ca12101 100644
--- a/Lib/test/test_asyncio/test_base_events.py
+++ b/Lib/test/test_asyncio/test_base_events.py
@@ -792,6 +792,9 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase):
class _SelectorTransportMock:
_sock = None
+ def get_extra_info(self, key):
+ return mock.Mock()
+
def close(self):
self._sock.close()
diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py
index 0cff00a..0cfc028 100644
--- a/Lib/test/test_asyncio/test_events.py
+++ b/Lib/test/test_asyncio/test_events.py
@@ -27,6 +27,7 @@ from test import support # find_unused_port, IPV6_ENABLED, TEST_HOME_DIR
import asyncio
+from asyncio import proactor_events
from asyncio import selector_events
from asyncio import test_utils
@@ -383,22 +384,23 @@ class EventLoopTestsMixin:
self.assertEqual(read, data)
def _basetest_sock_client_ops(self, httpd, sock):
- # in debug mode, socket operations must fail
- # if the socket is not in blocking mode
- self.loop.set_debug(True)
- sock.setblocking(True)
- with self.assertRaises(ValueError):
- self.loop.run_until_complete(
- self.loop.sock_connect(sock, httpd.address))
- with self.assertRaises(ValueError):
- self.loop.run_until_complete(
- self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n'))
- with self.assertRaises(ValueError):
- self.loop.run_until_complete(
- self.loop.sock_recv(sock, 1024))
- with self.assertRaises(ValueError):
- self.loop.run_until_complete(
- self.loop.sock_accept(sock))
+ if not isinstance(self.loop, proactor_events.BaseProactorEventLoop):
+ # in debug mode, socket operations must fail
+ # if the socket is not in blocking mode
+ self.loop.set_debug(True)
+ sock.setblocking(True)
+ with self.assertRaises(ValueError):
+ self.loop.run_until_complete(
+ self.loop.sock_connect(sock, httpd.address))
+ with self.assertRaises(ValueError):
+ self.loop.run_until_complete(
+ self.loop.sock_sendall(sock, b'GET / HTTP/1.0\r\n\r\n'))
+ with self.assertRaises(ValueError):
+ self.loop.run_until_complete(
+ self.loop.sock_recv(sock, 1024))
+ with self.assertRaises(ValueError):
+ self.loop.run_until_complete(
+ self.loop.sock_accept(sock))
# test in non-blocking mode
sock.setblocking(False)
@@ -1229,6 +1231,7 @@ class EventLoopTestsMixin:
"Don't support pipes for Windows")
def test_write_pipe_disconnect_on_close(self):
rsock, wsock = test_utils.socketpair()
+ rsock.setblocking(False)
pipeobj = io.open(wsock.detach(), 'wb', 1024)
proto = MyWritePipeProto(loop=self.loop)
@@ -1366,6 +1369,7 @@ class EventLoopTestsMixin:
for sock_type in (socket.SOCK_STREAM, socket.SOCK_DGRAM):
sock = socket.socket(family, sock_type)
with sock:
+ sock.setblocking(False)
connect = self.loop.sock_connect(sock, address)
with self.assertRaises(ValueError) as cm:
self.loop.run_until_complete(connect)
diff --git a/Lib/test/test_asyncio/test_selector_events.py b/Lib/test/test_asyncio/test_selector_events.py
index bd6c2f2..df6e991 100644
--- a/Lib/test/test_asyncio/test_selector_events.py
+++ b/Lib/test/test_asyncio/test_selector_events.py
@@ -58,8 +58,9 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
self.loop.remove_reader = mock.Mock()
self.loop.remove_writer = mock.Mock()
waiter = asyncio.Future(loop=self.loop)
- transport = self.loop._make_ssl_transport(
- m, asyncio.Protocol(), m, waiter)
+ with test_utils.disable_logger():
+ transport = self.loop._make_ssl_transport(
+ m, asyncio.Protocol(), m, waiter)
self.assertIsInstance(transport, _SelectorSslTransport)
@mock.patch('asyncio.selector_events.ssl', None)
@@ -127,7 +128,8 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
def test_write_to_self_tryagain(self):
self.loop._csock.send.side_effect = BlockingIOError
- self.assertIsNone(self.loop._write_to_self())
+ with test_utils.disable_logger():
+ self.assertIsNone(self.loop._write_to_self())
def test_write_to_self_exception(self):
# _write_to_self() swallows OSError
@@ -135,7 +137,7 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
self.assertRaises(RuntimeError, self.loop._write_to_self)
def test_sock_recv(self):
- sock = mock.Mock()
+ sock = test_utils.mock_nonblocking_socket()
self.loop._sock_recv = mock.Mock()
f = self.loop.sock_recv(sock, 1024)
@@ -183,7 +185,7 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
self.assertIs(err, f.exception())
def test_sock_sendall(self):
- sock = mock.Mock()
+ sock = test_utils.mock_nonblocking_socket()
self.loop._sock_sendall = mock.Mock()
f = self.loop.sock_sendall(sock, b'data')
@@ -193,7 +195,7 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
self.loop._sock_sendall.call_args[0])
def test_sock_sendall_nodata(self):
- sock = mock.Mock()
+ sock = test_utils.mock_nonblocking_socket()
self.loop._sock_sendall = mock.Mock()
f = self.loop.sock_sendall(sock, b'')
@@ -295,7 +297,7 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
self.loop.add_writer.call_args[0])
def test_sock_connect(self):
- sock = mock.Mock()
+ sock = test_utils.mock_nonblocking_socket()
self.loop._sock_connect = mock.Mock()
f = self.loop.sock_connect(sock, ('127.0.0.1', 8080))
@@ -361,7 +363,7 @@ class BaseSelectorEventLoopTests(test_utils.TestCase):
self.assertIsInstance(f.exception(), OSError)
def test_sock_accept(self):
- sock = mock.Mock()
+ sock = test_utils.mock_nonblocking_socket()
self.loop._sock_accept = mock.Mock()
f = self.loop.sock_accept(sock)
@@ -782,7 +784,8 @@ class SelectorSocketTransportTests(test_utils.TestCase):
transport = _SelectorSocketTransport(
self.loop, self.sock, self.protocol)
transport._force_close = mock.Mock()
- transport._read_ready()
+ with test_utils.disable_logger():
+ transport._read_ready()
transport._force_close.assert_called_with(err)
@mock.patch('logging.exception')
@@ -1219,7 +1222,8 @@ class SelectorSslTransportTests(test_utils.TestCase):
err = self.sslsock.recv.side_effect = ConnectionResetError()
transport = self._make_one()
transport._force_close = mock.Mock()
- transport._read_ready()
+ with test_utils.disable_logger():
+ transport._read_ready()
transport._force_close.assert_called_with(err)
def test_read_ready_recv_retry(self):
diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py
index b5b1012..0e9e1ce 100644
--- a/Lib/test/test_asyncio/test_subprocess.py
+++ b/Lib/test/test_asyncio/test_subprocess.py
@@ -148,15 +148,17 @@ class SubprocessMixin:
coro = write_stdin(proc, large_data)
# drain() must raise BrokenPipeError or ConnectionResetError
- self.assertRaises((BrokenPipeError, ConnectionResetError),
- self.loop.run_until_complete, coro)
+ with test_utils.disable_logger():
+ self.assertRaises((BrokenPipeError, ConnectionResetError),
+ self.loop.run_until_complete, coro)
self.loop.run_until_complete(proc.wait())
def test_communicate_ignore_broken_pipe(self):
proc, large_data = self.prepare_broken_pipe_test()
# communicate() must ignore BrokenPipeError when feeding stdin
- self.loop.run_until_complete(proc.communicate(large_data))
+ with test_utils.disable_logger():
+ self.loop.run_until_complete(proc.communicate(large_data))
self.loop.run_until_complete(proc.wait())