summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_asyncio
diff options
context:
space:
mode:
authorNikolay Kim <fafhrd91@gmail.com>2017-06-10 04:04:39 (GMT)
committerYury Selivanov <yury@magic.io>2017-06-10 04:04:39 (GMT)
commita608d2d5a7f1aabe9bcbfc220135c5e126189390 (patch)
tree8e360568addd6c6338effe49f2c9dea4464f5993 /Lib/test/test_asyncio
parent34792d25ab7329241ea24595286d65d54c266274 (diff)
downloadcpython-a608d2d5a7f1aabe9bcbfc220135c5e126189390.zip
cpython-a608d2d5a7f1aabe9bcbfc220135c5e126189390.tar.gz
cpython-a608d2d5a7f1aabe9bcbfc220135c5e126189390.tar.bz2
bpo-29406: asyncio SSL contexts leak sockets after calling close with certain servers (#409)
* asyncio SSL contexts leak sockets after calling close with certain servers * cleanup _shutdown_timeout_handle on _fatal_error
Diffstat (limited to 'Lib/test/test_asyncio')
-rw-r--r--Lib/test/test_asyncio/test_sslproto.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/Lib/test/test_asyncio/test_sslproto.py b/Lib/test/test_asyncio/test_sslproto.py
index bcd236e..6bcaa9e 100644
--- a/Lib/test/test_asyncio/test_sslproto.py
+++ b/Lib/test/test_asyncio/test_sslproto.py
@@ -96,6 +96,40 @@ class SslProtoHandshakeTests(test_utils.TestCase):
test_utils.run_briefly(self.loop)
self.assertIsInstance(waiter.exception(), ConnectionAbortedError)
+ def test_close_abort(self):
+ # From issue #bpo-29406
+ # abort connection if server does not complete shutdown procedure
+ ssl_proto = self.ssl_protocol()
+ transport = self.connection_made(ssl_proto)
+ ssl_proto._on_handshake_complete(None)
+ ssl_proto._start_shutdown()
+ self.assertIsNotNone(ssl_proto._shutdown_timeout_handle)
+
+ exc_handler = mock.Mock()
+ self.loop.set_exception_handler(exc_handler)
+ ssl_proto._shutdown_timeout_handle._run()
+
+ exc_handler.assert_called_with(
+ self.loop, {'message': 'Can not complete shitdown operation',
+ 'exception': mock.ANY,
+ 'transport': transport,
+ 'protocol': ssl_proto}
+ )
+ self.assertIsNone(ssl_proto._shutdown_timeout_handle)
+
+ def test_close(self):
+ # From issue #bpo-29406
+ # abort connection if server does not complete shutdown procedure
+ ssl_proto = self.ssl_protocol()
+ transport = self.connection_made(ssl_proto)
+ ssl_proto._on_handshake_complete(None)
+ ssl_proto._start_shutdown()
+ self.assertIsNotNone(ssl_proto._shutdown_timeout_handle)
+
+ ssl_proto._finalize()
+ self.assertIsNone(ssl_proto._transport)
+ self.assertIsNone(ssl_proto._shutdown_timeout_handle)
+
def test_close_during_handshake(self):
# bpo-29743 Closing transport during handshake process leaks socket
waiter = asyncio.Future(loop=self.loop)