From 9d409d6b474c188feca6213b9601e06f97715b72 Mon Sep 17 00:00:00 2001
|
From: "Miss Islington (bot)"
|
<31488909+miss-islington@users.noreply.github.com>
|
Date: Wed, 16 Dec 2020 09:56:10 -0800
|
Subject: [PATCH] bpo-39101: Fixes BaseException hang in
|
IsolatedAsyncioTestCase. (GH-22654)
|
|
(cherry picked from commit 8374d2ee1589791be8892b00f4bbf8121dde24bd)
|
|
Co-authored-by: Lisa Roach <lisaroach14@gmail.com>
|
---
|
Lib/unittest/async_case.py | 4 +--
|
Lib/unittest/test/test_async_case.py | 27 +++++++++++++++++++
|
.../2020-10-11-21-43-03.bpo-39101.-I49Pm.rst | 1 +
|
3 files changed, 30 insertions(+), 2 deletions(-)
|
create mode 100644 Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst
|
|
diff --git a/Lib/unittest/async_case.py b/Lib/unittest/async_case.py
|
index 1bc1312c8c2ee..520213c372755 100644
|
--- a/Lib/unittest/async_case.py
|
+++ b/Lib/unittest/async_case.py
|
@@ -102,9 +102,9 @@ async def _asyncioLoopRunner(self, fut):
|
ret = await awaitable
|
if not fut.cancelled():
|
fut.set_result(ret)
|
- except asyncio.CancelledError:
|
+ except (SystemExit, KeyboardInterrupt):
|
raise
|
- except Exception as ex:
|
+ except (BaseException, asyncio.CancelledError) as ex:
|
if not fut.cancelled():
|
fut.set_exception(ex)
|
|
diff --git a/Lib/unittest/test/test_async_case.py b/Lib/unittest/test/test_async_case.py
|
index 2db441da202a0..d01864b6936ca 100644
|
--- a/Lib/unittest/test/test_async_case.py
|
+++ b/Lib/unittest/test/test_async_case.py
|
@@ -190,6 +190,33 @@ async def on_async_cleanup(self, val):
|
'async_cleanup 2',
|
'sync_cleanup 1'])
|
|
+ def test_base_exception_from_async_method(self):
|
+ events = []
|
+ class Test(unittest.IsolatedAsyncioTestCase):
|
+ async def test_base(self):
|
+ events.append("test_base")
|
+ raise BaseException()
|
+ events.append("not it")
|
+
|
+ async def test_no_err(self):
|
+ events.append("test_no_err")
|
+
|
+ async def test_cancel(self):
|
+ raise asyncio.CancelledError()
|
+
|
+ test = Test("test_base")
|
+ output = test.run()
|
+ self.assertFalse(output.wasSuccessful())
|
+
|
+ test = Test("test_no_err")
|
+ test.run()
|
+ self.assertEqual(events, ['test_base', 'test_no_err'])
|
+
|
+ test = Test("test_cancel")
|
+ output = test.run()
|
+ self.assertFalse(output.wasSuccessful())
|
+
|
+
|
|
if __name__ == "__main__":
|
unittest.main()
|
diff --git a/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst b/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst
|
new file mode 100644
|
index 0000000000000..a571e8343cde1
|
--- /dev/null
|
+++ b/Misc/NEWS.d/next/Library/2020-10-11-21-43-03.bpo-39101.-I49Pm.rst
|
@@ -0,0 +1 @@
|
+Fixed tests using IsolatedAsyncioTestCase from hanging on BaseExceptions.
|
\ No newline at end of file
|