diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2023-10-21 19:18:34 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-21 19:18:34 (GMT) |
commit | 6c23635f2b7067ef091a550954e09f8b7c329e3f (patch) | |
tree | b420a114d1b1ff9ca39f85b69ac68311d580ffe5 /Lib/test/test_asyncio/utils.py | |
parent | fd60549c0ac6c81f05594a5141d24b4433ae39be (diff) | |
download | cpython-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.py | 15 |
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 |