summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_asyncio
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-01-28 23:35:56 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2015-01-28 23:35:56 (GMT)
commitb507cbaac5921023c17068b616efdbbecbd89920 (patch)
treeaa903ce9662fe5c563b03178b239f461aa20b6dd /Lib/test/test_asyncio
parenta89f5f049294c6d1782d9ec7be2d2b950c9a8619 (diff)
downloadcpython-b507cbaac5921023c17068b616efdbbecbd89920.zip
cpython-b507cbaac5921023c17068b616efdbbecbd89920.tar.gz
cpython-b507cbaac5921023c17068b616efdbbecbd89920.tar.bz2
asyncio: Fix SSLProtocol.eof_received()
Wake-up the waiter if it is not done yet.
Diffstat (limited to 'Lib/test/test_asyncio')
-rw-r--r--Lib/test/test_asyncio/test_sslproto.py40
1 files changed, 29 insertions, 11 deletions
diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py
index b1a61c4..148e30d 100644
--- a/Lib/test/test_asyncio/test_sslproto.py
+++ b/Lib/test/test_asyncio/test_sslproto.py
@@ -12,21 +12,36 @@ from asyncio import sslproto
from asyncio import test_utils
+@unittest.skipIf(ssl is None, 'No ssl module')
class SslProtoHandshakeTests(test_utils.TestCase):
def setUp(self):
self.loop = asyncio.new_event_loop()
self.set_event_loop(self.loop)
- @unittest.skipIf(ssl is None, 'No ssl module')
+ def ssl_protocol(self, waiter=None):
+ sslcontext = test_utils.dummy_ssl_context()
+ app_proto = asyncio.Protocol()
+ return sslproto.SSLProtocol(self.loop, app_proto, sslcontext, waiter)
+
+ def connection_made(self, ssl_proto, do_handshake=None):
+ transport = mock.Mock()
+ sslpipe = mock.Mock()
+ sslpipe.shutdown.return_value = b''
+ if do_handshake:
+ sslpipe.do_handshake.side_effect = do_handshake
+ else:
+ def mock_handshake(callback):
+ return []
+ sslpipe.do_handshake.side_effect = mock_handshake
+ with mock.patch('asyncio.sslproto._SSLPipe', return_value=sslpipe):
+ ssl_proto.connection_made(transport)
+
def test_cancel_handshake(self):
# Python issue #23197: cancelling an handshake must not raise an
# exception or log an error, even if the handshake failed
- sslcontext = test_utils.dummy_ssl_context()
- app_proto = asyncio.Protocol()
waiter = asyncio.Future(loop=self.loop)
- ssl_proto = sslproto.SSLProtocol(self.loop, app_proto, sslcontext,
- waiter)
+ ssl_proto = self.ssl_protocol(waiter)
handshake_fut = asyncio.Future(loop=self.loop)
def do_handshake(callback):
@@ -36,12 +51,7 @@ class SslProtoHandshakeTests(test_utils.TestCase):
return []
waiter.cancel()
- transport = mock.Mock()
- sslpipe = mock.Mock()
- sslpipe.shutdown.return_value = b''
- sslpipe.do_handshake.side_effect = do_handshake
- with mock.patch('asyncio.sslproto._SSLPipe', return_value=sslpipe):
- ssl_proto.connection_made(transport)
+ self.connection_made(ssl_proto, do_handshake)
with test_utils.disable_logger():
self.loop.run_until_complete(handshake_fut)
@@ -49,6 +59,14 @@ class SslProtoHandshakeTests(test_utils.TestCase):
# Close the transport
ssl_proto._app_transport.close()
+ def test_eof_received_waiter(self):
+ waiter = asyncio.Future(loop=self.loop)
+ ssl_proto = self.ssl_protocol(waiter)
+ self.connection_made(ssl_proto)
+ ssl_proto.eof_received()
+ test_utils.run_briefly(self.loop)
+ self.assertIsInstance(waiter.exception(), ConnectionResetError)
+
if __name__ == '__main__':
unittest.main()