summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_asyncio/utils.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-10-21 19:18:34 (GMT)
committerGitHub <noreply@github.com>2023-10-21 19:18:34 (GMT)
commit6c23635f2b7067ef091a550954e09f8b7c329e3f (patch)
treeb420a114d1b1ff9ca39f85b69ac68311d580ffe5 /Lib/test/test_asyncio/utils.py
parentfd60549c0ac6c81f05594a5141d24b4433ae39be (diff)
downloadcpython-6c23635f2b7067ef091a550954e09f8b7c329e3f.zip
cpython-6c23635f2b7067ef091a550954e09f8b7c329e3f.tar.gz
cpython-6c23635f2b7067ef091a550954e09f8b7c329e3f.tar.bz2
gh-111085: Fix invalid state handling in TaskGroup and Timeout (#111111)
asyncio.TaskGroup and asyncio.Timeout classes now raise proper RuntimeError if they are improperly used. * When they are used without entering the context manager. * When they are used after finishing. * When the context manager is entered more than once (simultaneously or sequentially). * If there is no current task when entering the context manager. They now remain in a consistent state after an exception is thrown, so subsequent operations can be performed correctly (if they are allowed). Co-authored-by: James Hilton-Balfe <gobot1234yt@gmail.com>
Diffstat (limited to 'Lib/test/test_asyncio/utils.py')
-rw-r--r--Lib/test/test_asyncio/utils.py15
1 files changed, 15 insertions, 0 deletions
diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py
index 83fac4a..18869b3 100644
--- a/Lib/test/test_asyncio/utils.py
+++ b/Lib/test/test_asyncio/utils.py
@@ -612,3 +612,18 @@ def mock_nonblocking_socket(proto=socket.IPPROTO_TCP, type=socket.SOCK_STREAM,
sock.family = family
sock.gettimeout.return_value = 0.0
return sock
+
+
+async def await_without_task(coro):
+ exc = None
+ def func():
+ try:
+ for _ in coro.__await__():
+ pass
+ except BaseException as err:
+ nonlocal exc
+ exc = err
+ asyncio.get_running_loop().call_soon(func)
+ await asyncio.sleep(0)
+ if exc is not None:
+ raise exc