Browse Source
Issue #23197, asyncio: On SSL handshake failure, check if the waiter is
Issue #23197, asyncio: On SSL handshake failure, check if the waiter is
cancelled before setting its exception. * Add unit tests for this case. * Cleanup also sslproto.pypull/224/head
4 changed files with 65 additions and 7 deletions
-
2Lib/asyncio/selector_events.py
-
5Lib/asyncio/sslproto.py
-
20Lib/test/test_asyncio/test_selector_events.py
-
45Lib/test/test_asyncio/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() |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue