mirror of
https://github.com/micropython/micropython.git
synced 2026-01-28 06:40:19 +01:00
tests/micropython: Add new schedule_sleep.py test.
This variant of `schedule.py` explicitly calls a zero sleep. The existing variant is kept to ensure the scheduler is called between bytecodes. Signed-off-by: Jeff Epler <jepler@unpythonic.net>
This commit is contained in:
committed by
Damien George
parent
2782d4598d
commit
f3874842ab
@@ -1,4 +1,6 @@
|
||||
# test micropython.schedule() function
|
||||
# this test should be manually kept in synch with
|
||||
# tests/micrpython/schedule_sleep.py.
|
||||
|
||||
try:
|
||||
import micropython
|
||||
|
||||
72
tests/micropython/schedule_sleep.py
Normal file
72
tests/micropython/schedule_sleep.py
Normal file
@@ -0,0 +1,72 @@
|
||||
# test micropython.schedule() function
|
||||
# this is the same as tests/micropython/schedule.py but the busy loops are
|
||||
# replaced with sleep/sleep_ms which allows the test to succeed when run under
|
||||
# the native emitter.
|
||||
|
||||
try:
|
||||
import micropython
|
||||
import time
|
||||
|
||||
micropython.schedule
|
||||
except (ImportError, AttributeError):
|
||||
print("SKIP")
|
||||
raise SystemExit
|
||||
|
||||
|
||||
# Basic test of scheduling a function.
|
||||
|
||||
|
||||
def callback(arg):
|
||||
global done
|
||||
print(arg)
|
||||
done = True
|
||||
|
||||
|
||||
done = False
|
||||
micropython.schedule(callback, 1)
|
||||
while not done:
|
||||
time.sleep(0)
|
||||
|
||||
# Test that callbacks can be scheduled from within a callback, but
|
||||
# that they don't execute until the outer callback is finished.
|
||||
|
||||
|
||||
def callback_inner(arg):
|
||||
global done
|
||||
print("inner")
|
||||
done += 1
|
||||
|
||||
|
||||
def callback_outer(arg):
|
||||
global done
|
||||
micropython.schedule(callback_inner, 0)
|
||||
# need a loop so that the VM can check for pending events
|
||||
for i in range(2):
|
||||
pass
|
||||
print("outer")
|
||||
done += 1
|
||||
|
||||
|
||||
done = 0
|
||||
micropython.schedule(callback_outer, 0)
|
||||
while done != 2:
|
||||
time.sleep(0)
|
||||
|
||||
# Test that scheduling too many callbacks leads to an exception. To do this we
|
||||
# must schedule from within a callback to guarantee that the scheduler is locked.
|
||||
|
||||
|
||||
def callback(arg):
|
||||
global done
|
||||
try:
|
||||
for i in range(100):
|
||||
micropython.schedule(lambda x: x, None)
|
||||
except RuntimeError:
|
||||
print("RuntimeError")
|
||||
done = True
|
||||
|
||||
|
||||
done = False
|
||||
micropython.schedule(callback, None)
|
||||
while not done:
|
||||
time.sleep_ms(0)
|
||||
4
tests/micropython/schedule_sleep.py.exp
Normal file
4
tests/micropython/schedule_sleep.py.exp
Normal file
@@ -0,0 +1,4 @@
|
||||
1
|
||||
outer
|
||||
inner
|
||||
RuntimeError
|
||||
@@ -164,7 +164,7 @@ emitter_tests_to_skip = {
|
||||
"basics/exception_chain.py",
|
||||
# These require stack-allocated slice optimisation.
|
||||
"micropython/heapalloc_slice.py",
|
||||
# These require running the scheduler.
|
||||
# These require implicitly running the scheduler between bytecodes.
|
||||
"micropython/schedule.py",
|
||||
"extmod/asyncio_event_queue.py",
|
||||
"extmod/asyncio_iterator_event.py",
|
||||
|
||||
Reference in New Issue
Block a user