micropython/tests/extmod/asyncio_wait_for.py

130 lines
3.2 KiB
Python

# Test asyncio.wait_for
try:
import asyncio
except ImportError:
print("SKIP")
raise SystemExit
async def task(id, t):
print("task start", id)
await asyncio.sleep(t)
print("task end", id)
return id * 2
async def task_catch():
print("task_catch start")
try:
await asyncio.sleep(0.2)
except asyncio.CancelledError:
print("ignore cancel")
print("task_catch done")
async def task_raise():
print("task start")
raise ValueError
async def task_cancel_other(t, other):
print("task_cancel_other start")
await asyncio.sleep(t)
print("task_cancel_other cancel")
other.cancel()
async def task_wait_for_cancel(id, t, t_wait):
print("task_wait_for_cancel start")
try:
await asyncio.wait_for(task(id, t), t_wait)
except asyncio.CancelledError as er:
print("task_wait_for_cancel cancelled")
raise er
async def task_wait_for_cancel_ignore(t_wait):
print("task_wait_for_cancel_ignore start")
try:
await asyncio.wait_for(task_catch(), t_wait)
except asyncio.CancelledError as er:
print("task_wait_for_cancel_ignore cancelled")
raise er
async def main():
sep = "-" * 10
# When task finished before the timeout
print(await asyncio.wait_for(task(1, 0.01), 10))
print(sep)
# When timeout passes and task is cancelled
try:
print(await asyncio.wait_for(task(2, 10), 0.01))
except asyncio.TimeoutError:
print("timeout")
print(sep)
# When timeout passes and task is cancelled, but task ignores the cancellation request
try:
print(await asyncio.wait_for(task_catch(), 0.1))
except asyncio.TimeoutError:
print("TimeoutError")
print(sep)
# When task raises an exception
try:
print(await asyncio.wait_for(task_raise(), 1))
except ValueError:
print("ValueError")
print(sep)
# Timeout of None means wait forever
print(await asyncio.wait_for(task(3, 0.1), None))
print(sep)
# When task is cancelled by another task
t = asyncio.create_task(task(4, 10))
asyncio.create_task(task_cancel_other(0.01, t))
try:
print(await asyncio.wait_for(t, 1))
except asyncio.CancelledError as er:
print(repr(er))
print(sep)
# When wait_for gets cancelled
t = asyncio.create_task(task_wait_for_cancel(4, 1, 2))
await asyncio.sleep(0.01)
t.cancel()
await asyncio.sleep(0.01)
print(sep)
# When wait_for gets cancelled and awaited task ignores the cancellation request
t = asyncio.create_task(task_wait_for_cancel_ignore(2))
await asyncio.sleep(0.01)
t.cancel()
await asyncio.sleep(0.01)
print(sep)
# When wait_for gets cancelled and the task it's waiting on finishes around the
# same time as the cancellation of the wait_for
for num_sleep in range(1, 5):
t = asyncio.create_task(task_wait_for_cancel(4 + num_sleep, 0, 2))
for _ in range(num_sleep):
await asyncio.sleep(0)
assert not t.done()
print("cancel wait_for")
t.cancel()
try:
await t
except asyncio.CancelledError as er:
print(repr(er))
print(sep)
print("finish")
asyncio.run(main())