Skip to content

Commit c4935f3

Browse files
committed
tests/extmod: Add uasyncio tests.
All .exp files are included because they require CPython 3.8 which may not always be available.
1 parent 63b9944 commit c4935f3

35 files changed

+1161
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Test that tasks return their value correctly to the caller
2+
3+
try:
4+
import uasyncio as asyncio
5+
except ImportError:
6+
try:
7+
import asyncio
8+
except ImportError:
9+
print("SKIP")
10+
raise SystemExit
11+
12+
13+
async def foo():
14+
return 42
15+
16+
17+
async def main():
18+
# Call function directly via an await
19+
print(await foo())
20+
21+
# Create a task and await on it
22+
task = asyncio.create_task(foo())
23+
print(await task)
24+
25+
26+
asyncio.run(main())
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
42
2+
42

tests/extmod/uasyncio_basic.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
try:
2+
import uasyncio as asyncio
3+
except ImportError:
4+
try:
5+
import asyncio
6+
except ImportError:
7+
print("SKIP")
8+
raise SystemExit
9+
10+
11+
try:
12+
import utime
13+
14+
ticks = utime.ticks_ms
15+
ticks_diff = utime.ticks_diff
16+
except:
17+
import time
18+
19+
ticks = lambda: int(time.time() * 1000)
20+
ticks_diff = lambda t1, t0: t1 - t0
21+
22+
23+
async def delay_print(t, s):
24+
await asyncio.sleep(t)
25+
print(s)
26+
27+
28+
async def main():
29+
print("start")
30+
31+
await asyncio.sleep(0.001)
32+
print("after sleep")
33+
34+
t0 = ticks()
35+
await delay_print(0.02, "short")
36+
t1 = ticks()
37+
await delay_print(0.04, "long")
38+
t2 = ticks()
39+
40+
print("took {} {}".format(round(ticks_diff(t1, t0), -1), round(ticks_diff(t2, t1), -1)))
41+
42+
43+
asyncio.run(main())

tests/extmod/uasyncio_basic.py.exp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
start
2+
after sleep
3+
short
4+
long
5+
took 20 40

tests/extmod/uasyncio_basic2.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
try:
2+
import uasyncio as asyncio
3+
except ImportError:
4+
try:
5+
import asyncio
6+
except ImportError:
7+
print("SKIP")
8+
raise SystemExit
9+
10+
11+
async def forever():
12+
print("forever start")
13+
await asyncio.sleep(10)
14+
15+
16+
async def main():
17+
print("main start")
18+
asyncio.create_task(forever())
19+
await asyncio.sleep(0.001)
20+
print("main done")
21+
return 42
22+
23+
24+
print(asyncio.run(main()))
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
main start
2+
forever start
3+
main done
4+
42
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Test fairness of cancelling a task
2+
# That tasks which continuously cancel each other don't take over the scheduler
3+
4+
try:
5+
import uasyncio as asyncio
6+
except ImportError:
7+
try:
8+
import asyncio
9+
except ImportError:
10+
print("SKIP")
11+
raise SystemExit
12+
13+
14+
async def task(id, other):
15+
for i in range(3):
16+
try:
17+
print("start", id)
18+
await asyncio.sleep(0)
19+
print("done", id)
20+
except asyncio.CancelledError as er:
21+
print("cancelled", id)
22+
if other is not None:
23+
print(id, "cancels", other)
24+
tasks[other].cancel()
25+
26+
27+
async def main():
28+
global tasks
29+
tasks = [
30+
asyncio.create_task(task(0, 1)),
31+
asyncio.create_task(task(1, 0)),
32+
asyncio.create_task(task(2, None)),
33+
]
34+
await tasks[2]
35+
36+
37+
asyncio.run(main())
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
start 0
2+
start 1
3+
start 2
4+
done 0
5+
0 cancels 1
6+
start 0
7+
cancelled 1
8+
1 cancels 0
9+
start 1
10+
done 2
11+
start 2
12+
cancelled 0
13+
0 cancels 1
14+
start 0
15+
cancelled 1
16+
1 cancels 0
17+
start 1
18+
done 2
19+
start 2
20+
cancelled 0
21+
0 cancels 1
22+
cancelled 1
23+
1 cancels 0
24+
done 2
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Test fairness of cancelling a task
2+
# That tasks which keeps being cancelled by multiple other tasks gets a chance to run
3+
4+
try:
5+
import uasyncio as asyncio
6+
except ImportError:
7+
try:
8+
import asyncio
9+
except ImportError:
10+
print("SKIP")
11+
raise SystemExit
12+
13+
14+
async def task_a():
15+
try:
16+
while True:
17+
print("sleep a")
18+
await asyncio.sleep(0)
19+
except asyncio.CancelledError:
20+
print("cancelled a")
21+
22+
23+
async def task_b(id, other):
24+
while other.cancel():
25+
print("sleep b", id)
26+
await asyncio.sleep(0)
27+
print("done b", id)
28+
29+
30+
async def main():
31+
t = asyncio.create_task(task_a())
32+
for i in range(3):
33+
asyncio.create_task(task_b(i, t))
34+
await t
35+
36+
37+
asyncio.run(main())
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
sleep a
2+
sleep b 0
3+
sleep b 1
4+
sleep b 2
5+
cancelled a
6+
done b 0
7+
done b 1
8+
done b 2

0 commit comments

Comments
 (0)