Skip to content

Commit 3ece1c9

Browse files
committed
Add regression tests for #491 and #492
Signed-off-by: Anders Kaseorg <[email protected]>
1 parent 7863b11 commit 3ece1c9

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

tests/test_sync.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,3 +1208,72 @@ def test_function(**kwargs: Any) -> None:
12081208

12091209
# SyncToAsync.__call__.loop.run_in_executor has a param named `task_context`.
12101210
await test_function(task_context=1)
1211+
1212+
1213+
def test_nested_task() -> None:
1214+
async def inner() -> asyncio.Task[None]:
1215+
return asyncio.create_task(sync_to_async(print)("inner"))
1216+
1217+
async def main() -> None:
1218+
task = await sync_to_async(async_to_sync(inner))()
1219+
await task
1220+
1221+
async_to_sync(main)()
1222+
1223+
1224+
def test_nested_task_later() -> None:
1225+
def later(fut: asyncio.Future[asyncio.Task[None]]) -> None:
1226+
task = asyncio.create_task(sync_to_async(print)("later"))
1227+
fut.set_result(task)
1228+
1229+
async def inner() -> asyncio.Future[asyncio.Task[None]]:
1230+
loop = asyncio.get_running_loop()
1231+
fut = loop.create_future()
1232+
loop.call_later(0.1, later, fut)
1233+
return fut
1234+
1235+
async def main() -> None:
1236+
fut = await sync_to_async(async_to_sync(inner))()
1237+
task = await fut
1238+
await task
1239+
1240+
async_to_sync(main)()
1241+
1242+
1243+
def test_double_nested_task() -> None:
1244+
async def inner() -> asyncio.Task[None]:
1245+
return asyncio.create_task(sync_to_async(print)("inner"))
1246+
1247+
async def outer() -> asyncio.Task[asyncio.Task[None]]:
1248+
return asyncio.create_task(sync_to_async(async_to_sync(inner))())
1249+
1250+
async def main() -> None:
1251+
outer_task = await sync_to_async(async_to_sync(outer))()
1252+
inner_task = await outer_task
1253+
await inner_task
1254+
1255+
async_to_sync(main)()
1256+
1257+
1258+
def test_two_nested_tasks_with_asyncio_run() -> None:
1259+
barrier = asyncio.Barrier(3)
1260+
event = threading.Event()
1261+
1262+
async def inner() -> None:
1263+
task = asyncio.create_task(sync_to_async(event.wait)())
1264+
await barrier.wait()
1265+
await task
1266+
1267+
async def outer() -> tuple[asyncio.Task[None], asyncio.Task[None]]:
1268+
task0 = asyncio.create_task(inner())
1269+
task1 = asyncio.create_task(inner())
1270+
await barrier.wait()
1271+
event.set()
1272+
return task0, task1
1273+
1274+
async def main() -> None:
1275+
task0, task1 = await sync_to_async(async_to_sync(outer))()
1276+
await task0
1277+
await task1
1278+
1279+
asyncio.run(main())

0 commit comments

Comments
 (0)