summaryrefslogtreecommitdiff
path: root/tests/micropython
diff options
context:
space:
mode:
authorAndrew Leech <andrew.leech@planetinnovation.com.au>2022-09-26 11:02:31 +1000
committerDamien George <damien@micropython.org>2024-09-19 18:00:44 +1000
commit7e14680a83525bf0822ef9cab899a5625496d662 (patch)
treee5176548c07d8973956b48e1f3a462c36ed1e532 /tests/micropython
parent6c73573b34c3fbd3d4da8d56767db03a8e5dd540 (diff)
py/objringio: Add micropython.RingIO() interface for general use.
This commit adds a new `RingIO` type which exposes the internal ring-buffer code for general use in Python programs. It has the stream interface making it similar to `StringIO` and `BytesIO`, except `RingIO` has a fixed buffer size and is automatically safe when reads and writes are in different threads or an IRQ. This new type is enabled at the "extra features" ROM level. Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
Diffstat (limited to 'tests/micropython')
-rw-r--r--tests/micropython/ringio.py48
-rw-r--r--tests/micropython/ringio.py.exp16
-rw-r--r--tests/micropython/ringio_async.py36
-rw-r--r--tests/micropython/ringio_async.py.exp4
4 files changed, 104 insertions, 0 deletions
diff --git a/tests/micropython/ringio.py b/tests/micropython/ringio.py
new file mode 100644
index 000000000..45774bc2e
--- /dev/null
+++ b/tests/micropython/ringio.py
@@ -0,0 +1,48 @@
+# Check that micropython.RingIO works correctly.
+
+import micropython
+
+try:
+ micropython.RingIO
+except AttributeError:
+ print("SKIP")
+ raise SystemExit
+
+rb = micropython.RingIO(16)
+print(rb)
+
+print(rb.any())
+
+rb.write(b"\x00")
+print(rb.any())
+
+rb.write(b"\x00")
+print(rb.any())
+
+print(rb.read(2))
+print(rb.any())
+
+
+rb.write(b"\x00\x01")
+print(rb.read())
+
+print(rb.read(1))
+
+# Try to write more data than can fit at one go.
+print(rb.write(b"\x00\x01" * 10))
+print(rb.write(b"\x00"))
+print(rb.read())
+
+
+ba = bytearray(17)
+rb = micropython.RingIO(ba)
+print(rb)
+print(rb.write(b"\x00\x01" * 10))
+print(rb.write(b"\x00"))
+print(rb.read())
+
+try:
+ # Size must be int.
+ micropython.RingIO(None)
+except TypeError as ex:
+ print(ex)
diff --git a/tests/micropython/ringio.py.exp b/tests/micropython/ringio.py.exp
new file mode 100644
index 000000000..b27ea472c
--- /dev/null
+++ b/tests/micropython/ringio.py.exp
@@ -0,0 +1,16 @@
+<RingIO>
+0
+1
+2
+b'\x00\x00'
+0
+b'\x00\x01'
+b''
+16
+0
+b'\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01'
+<RingIO>
+16
+0
+b'\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01'
+can't convert NoneType to int
diff --git a/tests/micropython/ringio_async.py b/tests/micropython/ringio_async.py
new file mode 100644
index 000000000..2a4befc35
--- /dev/null
+++ b/tests/micropython/ringio_async.py
@@ -0,0 +1,36 @@
+# Check that micropython.RingIO works correctly with asyncio.Stream.
+
+import micropython
+
+try:
+ import asyncio
+
+ asyncio.StreamWriter
+ micropython.RingIO
+except (AttributeError, ImportError):
+ print("SKIP")
+ raise SystemExit
+
+rb = micropython.RingIO(16)
+rba = asyncio.StreamWriter(rb)
+
+data = b"ABC123" * 20
+print("w", len(data))
+
+
+async def data_writer():
+ global data
+ rba.write(data)
+ await rba.drain()
+
+
+async def main():
+ task = asyncio.create_task(data_writer())
+ await asyncio.sleep_ms(10)
+ read = await rba.readexactly(len(data))
+ print(read)
+ print("r", len(read))
+ print(read == data)
+
+
+asyncio.run(main())
diff --git a/tests/micropython/ringio_async.py.exp b/tests/micropython/ringio_async.py.exp
new file mode 100644
index 000000000..dfeb71d89
--- /dev/null
+++ b/tests/micropython/ringio_async.py.exp
@@ -0,0 +1,4 @@
+w 120
+b'ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123ABC123'
+r 120
+True