From f01ec022da2fdde22a083a4fbcdc2f2e01efac41 Mon Sep 17 00:00:00 2001 From: Peter Hinch Date: Thu, 28 Jun 2018 06:36:01 +0100 Subject: [PATCH] uasyncio iotest7 added, iotest6 uses ioq_len arg. --- uasyncio_iostream/tests/iotest6.py | 7 ++- uasyncio_iostream/tests/iotest7.py | 72 ++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 uasyncio_iostream/tests/iotest7.py diff --git a/uasyncio_iostream/tests/iotest6.py b/uasyncio_iostream/tests/iotest6.py index 5044b1f..7f3f4dd 100644 --- a/uasyncio_iostream/tests/iotest6.py +++ b/uasyncio_iostream/tests/iotest6.py @@ -5,7 +5,7 @@ # recourse to electronic testgear. # The MyIO class supports .readline() which updates a call counter and clears the -# .ready_read flag. This is set by a timer (emulating the arrival of data from +# .ready_rd flag. This is set by a timer (emulating the arrival of data from # some hardware device). # The .dummy method emulates a relatively slow user coro which yields with a zero # delay; the test runs 10 instances of this. Each instance updates a common call @@ -69,11 +69,14 @@ async def receiver(myior): await sreader.readline() def test(fast_io=False): - loop = asyncio.get_event_loop(fast_io=fast_io) + loop = asyncio.get_event_loop(ioq_len = 6 if fast_io else 0) myior = MyIO() loop.create_task(receiver(myior)) for _ in range(10): loop.create_task(myior.dummy()) loop.run_until_complete(myior.killer()) +print('Test case of I/O competing with zero delay tasks.') +print('fast_io False: approx I/O count 25, dummy count 510.') +print('fast_io True: approx I/O count 510, dummy count 510.') print('Run test() to check normal I/O, test(True) for fast I/O') diff --git a/uasyncio_iostream/tests/iotest7.py b/uasyncio_iostream/tests/iotest7.py new file mode 100644 index 0000000..03490d9 --- /dev/null +++ b/uasyncio_iostream/tests/iotest7.py @@ -0,0 +1,72 @@ +# iotest7.py Test fast_io PR +# https://github.com/micropython/micropython-lib/pull/287 + +# Test the case where runq is empty + +# The MyIO class supports .readline() which updates a call counter and clears the +# .ready_rd flag. This is set by a timer (emulating the arrival of data from +# some hardware device). + + +import io +import pyb +import utime +import uasyncio as asyncio +import micropython +micropython.alloc_emergency_exception_buf(100) + +MP_STREAM_POLL_RD = const(1) +MP_STREAM_POLL_WR = const(4) +MP_STREAM_POLL = const(3) +MP_STREAM_ERROR = const(-1) + +class MyIO(io.IOBase): + def __init__(self, read=False, write=False): + self.read_count = 0 + self.dummy_count = 0 + self.ready_rd = False + pyb.Timer(4, freq = 100, callback = self.do_input) + + # Read callback: emulate asynchronous input from hardware. + def do_input(self, t): + self.ready_rd = True # Data is ready to read + + def ioctl(self, req, arg): + ret = MP_STREAM_ERROR + if req == MP_STREAM_POLL: + ret = 0 + if arg & MP_STREAM_POLL_RD: + if self.ready_rd: + ret |= MP_STREAM_POLL_RD + return ret + + def readline(self): + self.read_count += 1 + self.ready_rd = False + return b'a\n' + + async def dummy(self): + while True: + await asyncio.sleep_ms(50) + self.dummy_count += 1 + + async def killer(self): + print('Test runs for 5s') + await asyncio.sleep(5) + print('I/O count {} Dummy count {}'.format(self.read_count, self.dummy_count)) + +async def receiver(myior): + sreader = asyncio.StreamReader(myior) + while True: + await sreader.readline() + +def test(fast_io=False): + loop = asyncio.get_event_loop(ioq_len = 6 if fast_io else 0) + myior = MyIO() + loop.create_task(receiver(myior)) + loop.create_task(myior.dummy()) + loop.run_until_complete(myior.killer()) + +print('Test case of empty runq: the fast_io option has no effect.') +print('I/O and dummy run at expected rates (around 500 and 99 counts respectively.') +print('Run test() to check normal I/O, test(True) for fast I/O')