summaryrefslogtreecommitdiff
path: root/tests/test_sslproto.py
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-01-14 16:51:38 +0100
committerVictor Stinner <victor.stinner@gmail.com>2015-01-14 16:51:38 +0100
commit715607db3f5c67e8d3ca7a5e0e03e2316e232c9b (patch)
tree030a113c980d7d376d233d699a23cfe5380b4bc2 /tests/test_sslproto.py
parente1eb834ee239ec54998a0b5174e1f0ea33bc4ece (diff)
downloadtrollius-715607db3f5c67e8d3ca7a5e0e03e2316e232c9b.tar.gz
Python issue #23197: On SSL handshake failure, check if the waiter is cancelled
before setting its exception. Add unit tests for this case.
Diffstat (limited to 'tests/test_sslproto.py')
-rw-r--r--tests/test_sslproto.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/tests/test_sslproto.py b/tests/test_sslproto.py
new file mode 100644
index 0000000..053fefe
--- /dev/null
+++ b/tests/test_sslproto.py
@@ -0,0 +1,45 @@
+"""Tests for asyncio/sslproto.py."""
+
+import unittest
+from unittest import mock
+
+import asyncio
+from asyncio import sslproto
+from asyncio import test_utils
+
+
+class SslProtoHandshakeTests(test_utils.TestCase):
+
+ def setUp(self):
+ self.loop = asyncio.new_event_loop()
+ self.set_event_loop(self.loop)
+
+ 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)
+ handshake_fut = asyncio.Future(loop=self.loop)
+
+ def do_handshake(callback):
+ exc = Exception()
+ callback(exc)
+ handshake_fut.set_result(None)
+ return []
+
+ waiter.cancel()
+ transport = mock.Mock()
+ sslpipe = mock.Mock()
+ sslpipe.do_handshake.side_effect = do_handshake
+ with mock.patch('asyncio.sslproto._SSLPipe', return_value=sslpipe):
+ ssl_proto.connection_made(transport)
+
+ with test_utils.disable_logger():
+ self.loop.run_until_complete(handshake_fut)
+
+
+if __name__ == '__main__':
+ unittest.main()