summaryrefslogtreecommitdiff
path: root/tests/extmod
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2018-07-11 16:45:30 -0400
committerDan Halbert <halbert@halwitz.org>2018-07-11 16:45:30 -0400
commit7c219600a246d8956d0b23ea3f5d125a820e6b6a (patch)
tree4cf793a66284322d48a8f430815c31cd1c9ffa1d /tests/extmod
parent4962468ffffac9ec4e36b2b1fc3f132516df3127 (diff)
parent25ae98f07cb3c4488cb955403dfe56b8bb8db6f0 (diff)
WIP: after merge; before testing
Diffstat (limited to 'tests/extmod')
-rw-r--r--tests/extmod/framebuf2.py62
-rw-r--r--tests/extmod/framebuf2.py.exp57
-rw-r--r--tests/extmod/framebuf8.py32
-rw-r--r--tests/extmod/framebuf8.py.exp15
-rw-r--r--tests/extmod/framebuf_subclass.py20
-rw-r--r--tests/extmod/framebuf_subclass.py.exp1
-rw-r--r--tests/extmod/time_ms_us.py15
-rw-r--r--tests/extmod/time_ms_us.py.exp1
-rw-r--r--tests/extmod/uctypes_bytearray.py3
-rw-r--r--tests/extmod/uctypes_bytearray.py.exp1
-rw-r--r--tests/extmod/uctypes_byteat.py10
-rw-r--r--tests/extmod/uctypes_byteat.py.exp2
-rw-r--r--tests/extmod/uctypes_error.py37
-rw-r--r--tests/extmod/uctypes_error.py.exp4
-rw-r--r--tests/extmod/uctypes_sizeof.py5
-rw-r--r--tests/extmod/uctypes_sizeof.py.exp1
-rw-r--r--tests/extmod/uctypes_sizeof_float.py8
-rw-r--r--tests/extmod/uctypes_sizeof_float.py.exp2
-rw-r--r--tests/extmod/uhashlib_sha256.py3
-rw-r--r--tests/extmod/ujson_dump.py30
-rw-r--r--tests/extmod/ujson_dump_iobase.py32
-rw-r--r--tests/extmod/uzlib_decompress.py10
-rw-r--r--tests/extmod/vfs_basic.py6
-rw-r--r--tests/extmod/vfs_fat_fileio1.py32
-rw-r--r--tests/extmod/vfs_fat_fileio1.py.exp7
-rw-r--r--tests/extmod/vfs_fat_fileio2.py6
-rw-r--r--tests/extmod/vfs_fat_fileio2.py.exp8
-rw-r--r--tests/extmod/vfs_fat_more.py14
-rw-r--r--tests/extmod/vfs_fat_more.py.exp1
-rw-r--r--tests/extmod/vfs_fat_oldproto.py5
-rw-r--r--tests/extmod/vfs_fat_oldproto.py.exp2
-rw-r--r--tests/extmod/vfs_fat_ramdisk.py5
-rw-r--r--tests/extmod/vfs_fat_ramdisk.py.exp4
-rw-r--r--tests/extmod/vfs_userfs.py68
-rw-r--r--tests/extmod/vfs_userfs.py.exp12
35 files changed, 482 insertions, 39 deletions
diff --git a/tests/extmod/framebuf2.py b/tests/extmod/framebuf2.py
new file mode 100644
index 000000000..a313170eb
--- /dev/null
+++ b/tests/extmod/framebuf2.py
@@ -0,0 +1,62 @@
+try:
+ import framebuf
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+def printbuf():
+ print("--8<--")
+ for y in range(h):
+ for x in range(w):
+ print('%u' % ((buf[(x + y * w) // 4] >> ((x & 3) << 1)) & 3), end='')
+ print()
+ print("-->8--")
+
+w = 8
+h = 5
+buf = bytearray(w * h // 4)
+fbuf = framebuf.FrameBuffer(buf, w, h, framebuf.GS2_HMSB)
+
+# fill
+fbuf.fill(3)
+printbuf()
+fbuf.fill(0)
+printbuf()
+
+# put pixel
+fbuf.pixel(0, 0, 1)
+fbuf.pixel(3, 0, 2)
+fbuf.pixel(0, 4, 3)
+fbuf.pixel(3, 4, 2)
+printbuf()
+
+# get pixel
+print(fbuf.pixel(0, 4), fbuf.pixel(1, 1))
+
+# scroll
+fbuf.fill(0)
+fbuf.pixel(2, 2, 3)
+printbuf()
+fbuf.scroll(0, 1)
+printbuf()
+fbuf.scroll(1, 0)
+printbuf()
+fbuf.scroll(-1, -2)
+printbuf()
+
+w2 = 2
+h2 = 3
+buf2 = bytearray(w2 * h2 // 4)
+fbuf2 = framebuf.FrameBuffer(buf2, w2, h2, framebuf.GS2_HMSB)
+
+# blit
+fbuf2.fill(0)
+fbuf2.pixel(0, 0, 1)
+fbuf2.pixel(0, 2, 2)
+fbuf2.pixel(1, 0, 1)
+fbuf2.pixel(1, 2, 2)
+fbuf.fill(3)
+fbuf.blit(fbuf2, 3, 3, 0)
+fbuf.blit(fbuf2, -1, -1, 0)
+fbuf.blit(fbuf2, 16, 16, 0)
+printbuf()
diff --git a/tests/extmod/framebuf2.py.exp b/tests/extmod/framebuf2.py.exp
new file mode 100644
index 000000000..c53e518a6
--- /dev/null
+++ b/tests/extmod/framebuf2.py.exp
@@ -0,0 +1,57 @@
+--8<--
+33333333
+33333333
+33333333
+33333333
+33333333
+-->8--
+--8<--
+00000000
+00000000
+00000000
+00000000
+00000000
+-->8--
+--8<--
+10020000
+00000000
+00000000
+00000000
+30020000
+-->8--
+3 0
+--8<--
+00000000
+00000000
+00300000
+00000000
+00000000
+-->8--
+--8<--
+00000000
+00000000
+00000000
+00300000
+00000000
+-->8--
+--8<--
+00000000
+00000000
+00000000
+00030000
+00000000
+-->8--
+--8<--
+00000000
+00300000
+00000000
+00030000
+00000000
+-->8--
+--8<--
+33333333
+23333333
+33333333
+33311333
+33333333
+-->8--
diff --git a/tests/extmod/framebuf8.py b/tests/extmod/framebuf8.py
new file mode 100644
index 000000000..b6899aae9
--- /dev/null
+++ b/tests/extmod/framebuf8.py
@@ -0,0 +1,32 @@
+try:
+ import framebuf
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+def printbuf():
+ print("--8<--")
+ for y in range(h):
+ for x in range(w):
+ print('%02x' % buf[(x + y * w)], end='')
+ print()
+ print("-->8--")
+
+w = 8
+h = 5
+buf = bytearray(w * h)
+fbuf = framebuf.FrameBuffer(buf, w, h, framebuf.GS8)
+
+# fill
+fbuf.fill(0x55)
+printbuf()
+
+# put pixel
+fbuf.pixel(0, 0, 0x11)
+fbuf.pixel(w - 1, 0, 0x22)
+fbuf.pixel(0, h - 1, 0x33)
+fbuf.pixel(w - 1, h - 1, 0xff)
+printbuf()
+
+# get pixel
+print(hex(fbuf.pixel(0, h - 1)), hex(fbuf.pixel(1, 1)))
diff --git a/tests/extmod/framebuf8.py.exp b/tests/extmod/framebuf8.py.exp
new file mode 100644
index 000000000..01d8976fe
--- /dev/null
+++ b/tests/extmod/framebuf8.py.exp
@@ -0,0 +1,15 @@
+--8<--
+5555555555555555
+5555555555555555
+5555555555555555
+5555555555555555
+5555555555555555
+-->8--
+--8<--
+1155555555555522
+5555555555555555
+5555555555555555
+5555555555555555
+33555555555555ff
+-->8--
+0x33 0x55
diff --git a/tests/extmod/framebuf_subclass.py b/tests/extmod/framebuf_subclass.py
new file mode 100644
index 000000000..6363c224f
--- /dev/null
+++ b/tests/extmod/framebuf_subclass.py
@@ -0,0 +1,20 @@
+# test subclassing framebuf.FrameBuffer
+
+try:
+ import framebuf
+except ImportError:
+ print('SKIP')
+ raise SystemExit
+
+class FB(framebuf.FrameBuffer):
+ def __init__(self, n):
+ self.n = n
+ super().__init__(bytearray(2 * n * n), n, n, framebuf.RGB565)
+
+ def foo(self):
+ self.hline(0, 2, self.n, 0x0304)
+
+fb = FB(n=3)
+fb.pixel(0, 0, 0x0102)
+fb.foo()
+print(bytes(fb))
diff --git a/tests/extmod/framebuf_subclass.py.exp b/tests/extmod/framebuf_subclass.py.exp
new file mode 100644
index 000000000..23d53ccc6
--- /dev/null
+++ b/tests/extmod/framebuf_subclass.py.exp
@@ -0,0 +1 @@
+b'\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x03\x04\x03\x04\x03'
diff --git a/tests/extmod/time_ms_us.py b/tests/extmod/time_ms_us.py
index 31f07d31b..135cf1e09 100644
--- a/tests/extmod/time_ms_us.py
+++ b/tests/extmod/time_ms_us.py
@@ -7,5 +7,16 @@ except AttributeError:
utime.sleep_ms(1)
utime.sleep_us(1)
-print(utime.ticks_diff(utime.ticks_ms(), utime.ticks_ms()) <= 1)
-print(utime.ticks_diff(utime.ticks_us(), utime.ticks_us()) <= 500)
+
+t0 = utime.ticks_ms()
+t1 = utime.ticks_ms()
+print(0 <= utime.ticks_diff(t1, t0) <= 1)
+
+t0 = utime.ticks_us()
+t1 = utime.ticks_us()
+print(0 <= utime.ticks_diff(t1, t0) <= 500)
+
+# ticks_cpu may not be implemented, at least make sure it doesn't decrease
+t0 = utime.ticks_cpu()
+t1 = utime.ticks_cpu()
+print(utime.ticks_diff(t1, t0) >= 0)
diff --git a/tests/extmod/time_ms_us.py.exp b/tests/extmod/time_ms_us.py.exp
index dbde42265..b8ca7e7ef 100644
--- a/tests/extmod/time_ms_us.py.exp
+++ b/tests/extmod/time_ms_us.py.exp
@@ -1,2 +1,3 @@
True
True
+True
diff --git a/tests/extmod/uctypes_bytearray.py b/tests/extmod/uctypes_bytearray.py
index 61c7da271..77c93c376 100644
--- a/tests/extmod/uctypes_bytearray.py
+++ b/tests/extmod/uctypes_bytearray.py
@@ -17,3 +17,6 @@ S = uctypes.struct(uctypes.addressof(data), desc, uctypes.LITTLE_ENDIAN)
print(S.arr)
# But not INT8, because value range is different
print(type(S.arr2))
+
+# convert to buffer
+print(bytearray(S))
diff --git a/tests/extmod/uctypes_bytearray.py.exp b/tests/extmod/uctypes_bytearray.py.exp
index 294f8a5fa..7c84edbb6 100644
--- a/tests/extmod/uctypes_bytearray.py.exp
+++ b/tests/extmod/uctypes_bytearray.py.exp
@@ -1,2 +1,3 @@
bytearray(b'01')
<class 'struct'>
+bytearray(b'0123')
diff --git a/tests/extmod/uctypes_byteat.py b/tests/extmod/uctypes_byteat.py
new file mode 100644
index 000000000..ab2535db8
--- /dev/null
+++ b/tests/extmod/uctypes_byteat.py
@@ -0,0 +1,10 @@
+try:
+ import uctypes
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+data = bytearray(b'01234567')
+
+print(uctypes.bytes_at(uctypes.addressof(data), 4))
+print(uctypes.bytearray_at(uctypes.addressof(data), 4))
diff --git a/tests/extmod/uctypes_byteat.py.exp b/tests/extmod/uctypes_byteat.py.exp
new file mode 100644
index 000000000..e1ae4d053
--- /dev/null
+++ b/tests/extmod/uctypes_byteat.py.exp
@@ -0,0 +1,2 @@
+b'0123'
+bytearray(b'0123')
diff --git a/tests/extmod/uctypes_error.py b/tests/extmod/uctypes_error.py
new file mode 100644
index 000000000..95ba0fad4
--- /dev/null
+++ b/tests/extmod/uctypes_error.py
@@ -0,0 +1,37 @@
+# test general errors with uctypes
+
+try:
+ import uctypes
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+data = bytearray(b"01234567")
+
+# del subscr not supported
+S = uctypes.struct(uctypes.addressof(data), {})
+try:
+ del S[0]
+except TypeError:
+ print('TypeError')
+
+# list is an invalid descriptor
+S = uctypes.struct(uctypes.addressof(data), [])
+try:
+ S.x
+except TypeError:
+ print('TypeError')
+
+# can't access attribute with invalid descriptor
+S = uctypes.struct(uctypes.addressof(data), {'x':[]})
+try:
+ S.x
+except TypeError:
+ print('TypeError')
+
+# can't assign to aggregate
+S = uctypes.struct(uctypes.addressof(data), {'x':(uctypes.ARRAY | 0, uctypes.INT8 | 2)})
+try:
+ S.x = 1
+except TypeError:
+ print('TypeError')
diff --git a/tests/extmod/uctypes_error.py.exp b/tests/extmod/uctypes_error.py.exp
new file mode 100644
index 000000000..802c260d2
--- /dev/null
+++ b/tests/extmod/uctypes_error.py.exp
@@ -0,0 +1,4 @@
+TypeError
+TypeError
+TypeError
+TypeError
diff --git a/tests/extmod/uctypes_sizeof.py b/tests/extmod/uctypes_sizeof.py
index 5a6adb437..e42e06c92 100644
--- a/tests/extmod/uctypes_sizeof.py
+++ b/tests/extmod/uctypes_sizeof.py
@@ -40,3 +40,8 @@ assert uctypes.sizeof(S.arr4) == 6
print(uctypes.sizeof(S.sub))
assert uctypes.sizeof(S.sub) == 1
+# invalid descriptor
+try:
+ print(uctypes.sizeof([]))
+except TypeError:
+ print("TypeError")
diff --git a/tests/extmod/uctypes_sizeof.py.exp b/tests/extmod/uctypes_sizeof.py.exp
index fb74def60..b35b11aa0 100644
--- a/tests/extmod/uctypes_sizeof.py.exp
+++ b/tests/extmod/uctypes_sizeof.py.exp
@@ -4,3 +4,4 @@
TypeError
6
1
+TypeError
diff --git a/tests/extmod/uctypes_sizeof_float.py b/tests/extmod/uctypes_sizeof_float.py
new file mode 100644
index 000000000..1ba8871bd
--- /dev/null
+++ b/tests/extmod/uctypes_sizeof_float.py
@@ -0,0 +1,8 @@
+try:
+ import uctypes
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+print(uctypes.sizeof({'f':uctypes.FLOAT32}))
+print(uctypes.sizeof({'f':uctypes.FLOAT64}))
diff --git a/tests/extmod/uctypes_sizeof_float.py.exp b/tests/extmod/uctypes_sizeof_float.py.exp
new file mode 100644
index 000000000..de7818072
--- /dev/null
+++ b/tests/extmod/uctypes_sizeof_float.py.exp
@@ -0,0 +1,2 @@
+4
+8
diff --git a/tests/extmod/uhashlib_sha256.py b/tests/extmod/uhashlib_sha256.py
index 0322c20de..a793ea493 100644
--- a/tests/extmod/uhashlib_sha256.py
+++ b/tests/extmod/uhashlib_sha256.py
@@ -23,6 +23,9 @@ print(h.digest())
print(hashlib.sha256(b"\xff" * 64).digest())
+# 56 bytes is a boundary case in the algorithm
+print(hashlib.sha256(b"\xff" * 56).digest())
+
sha256 = hashlib.sha256(b'hello')
try:
sha256.update(u'world')
diff --git a/tests/extmod/ujson_dump.py b/tests/extmod/ujson_dump.py
new file mode 100644
index 000000000..b1cb4a9cb
--- /dev/null
+++ b/tests/extmod/ujson_dump.py
@@ -0,0 +1,30 @@
+try:
+ from uio import StringIO
+ import ujson as json
+except:
+ try:
+ from io import StringIO
+ import json
+ except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+s = StringIO()
+json.dump(False, s)
+print(s.getvalue())
+
+s = StringIO()
+json.dump({"a": (2, [3, None])}, s)
+print(s.getvalue())
+
+# dump to a small-int not allowed
+try:
+ json.dump(123, 1)
+except (AttributeError, OSError): # CPython and uPy have different errors
+ print('Exception')
+
+# dump to an object not allowed
+try:
+ json.dump(123, {})
+except (AttributeError, OSError): # CPython and uPy have different errors
+ print('Exception')
diff --git a/tests/extmod/ujson_dump_iobase.py b/tests/extmod/ujson_dump_iobase.py
new file mode 100644
index 000000000..d30d1b561
--- /dev/null
+++ b/tests/extmod/ujson_dump_iobase.py
@@ -0,0 +1,32 @@
+# test ujson.dump in combination with uio.IOBase
+
+try:
+ import uio as io
+ import ujson as json
+except ImportError:
+ try:
+ import io, json
+ except ImportError:
+ print('SKIP')
+ raise SystemExit
+
+if not hasattr(io, 'IOBase'):
+ print('SKIP')
+ raise SystemExit
+
+
+# a user stream that only has the write method
+class S(io.IOBase):
+ def __init__(self):
+ self.buf = ''
+ def write(self, buf):
+ if type(buf) == bytearray:
+ # uPy passes a bytearray, CPython passes a str
+ buf = str(buf, 'ascii')
+ self.buf += buf
+
+
+# dump to the user stream
+s = S()
+json.dump([123, {}], s)
+print(s.buf)
diff --git a/tests/extmod/uzlib_decompress.py b/tests/extmod/uzlib_decompress.py
index 63247955c..dd6e4876f 100644
--- a/tests/extmod/uzlib_decompress.py
+++ b/tests/extmod/uzlib_decompress.py
@@ -15,7 +15,9 @@ PATTERNS = [
(bytes(range(64)), b'x\x9cc`dbfaec\xe7\xe0\xe4\xe2\xe6\xe1\xe5\xe3\x17\x10\x14\x12\x16\x11\x15\x13\x97\x90\x94\x92\x96\x91\x95\x93WPTRVQUS\xd7\xd0\xd4\xd2\xd6\xd1\xd5\xd370426153\xb7\xb0\xb4\xb2\xb6\xb1\xb5\xb3\x07\x00\xaa\xe0\x07\xe1'),
(b'hello', b'x\x01\x01\x05\x00\xfa\xffhello\x06,\x02\x15'), # compression level 0
# adaptive/dynamic huffman tree
- (b'13371813150|13764518736|12345678901', b'x\x9c\x05\xc1\x81\x01\x000\x04\x04\xb1\x95\\\x1f\xcfn\x86o\x82d\x06Qq\xc8\x9d\xc5X}<e\xb5g\x83\x0f\x89X\x07\xab')
+ (b'13371813150|13764518736|12345678901', b'x\x9c\x05\xc1\x81\x01\x000\x04\x04\xb1\x95\\\x1f\xcfn\x86o\x82d\x06Qq\xc8\x9d\xc5X}<e\xb5g\x83\x0f\x89X\x07\xab'),
+ # dynamic Huffman tree with "case 17" (repeat code for 3-10 times)
+ (b'>I}\x00\x951D>I}\x00\x951D>I}\x00\x951D>I}\x00\x951D', b'x\x9c\x05\xc11\x01\x00\x00\x00\x010\x95\x14py\x84\x12C_\x9bR\x8cV\x8a\xd1J1Z)F\x1fw`\x089'),
]
for unpacked, packed in PATTERNS:
@@ -41,3 +43,9 @@ try:
zlib.decompress(b'abc')
except Exception:
print("Exception")
+
+# invalid block type
+try:
+ zlib.decompress(b'\x07', -15) # final-block, block-type=3 (invalid)
+except Exception as er:
+ print('Exception')
diff --git a/tests/extmod/vfs_basic.py b/tests/extmod/vfs_basic.py
index 4fc67d34b..fbcc92bad 100644
--- a/tests/extmod/vfs_basic.py
+++ b/tests/extmod/vfs_basic.py
@@ -1,11 +1,7 @@
# test VFS functionality without any particular filesystem type
try:
- try:
- import uos_vfs as uos
- open = uos.vfs_open
- except ImportError:
- import uos
+ import uos
uos.mount
except (ImportError, AttributeError):
print("SKIP")
diff --git a/tests/extmod/vfs_fat_fileio1.py b/tests/extmod/vfs_fat_fileio1.py
index e3afbe872..4635ca84b 100644
--- a/tests/extmod/vfs_fat_fileio1.py
+++ b/tests/extmod/vfs_fat_fileio1.py
@@ -1,10 +1,6 @@
try:
import uerrno
- try:
- import uos_vfs as uos
- open = uos.vfs_open
- except ImportError:
- import uos
+ import uos
except ImportError:
print("SKIP")
raise SystemExit
@@ -115,3 +111,29 @@ except OSError as e:
vfs.remove("foo_file.txt")
print(list(vfs.ilistdir()))
+
+# Here we test that opening a file with the heap locked fails correctly. This
+# is a special case because file objects use a finaliser and allocating with a
+# finaliser is a different path to normal allocation. It would be better to
+# test this in the core tests but there are no core objects that use finaliser.
+import micropython
+micropython.heap_lock()
+try:
+ vfs.open('x', 'r')
+except MemoryError:
+ print('MemoryError')
+micropython.heap_unlock()
+
+# Here we test that the finaliser is actually called during a garbage collection.
+import gc
+N = 4
+for i in range(N):
+ n = 'x%d' % i
+ f = vfs.open(n, 'w')
+ f.write(n)
+ f = None # release f without closing
+ [0, 1, 2, 3] # use up Python stack so f is really gone
+gc.collect() # should finalise all N files by closing them
+for i in range(N):
+ with vfs.open('x%d' % i, 'r') as f:
+ print(f.read())
diff --git a/tests/extmod/vfs_fat_fileio1.py.exp b/tests/extmod/vfs_fat_fileio1.py.exp
index a66f07605..4eb50402c 100644
--- a/tests/extmod/vfs_fat_fileio1.py.exp
+++ b/tests/extmod/vfs_fat_fileio1.py.exp
@@ -10,4 +10,9 @@ e
o
d
True
-[('foo_dir', 16384, 0)]
+[('foo_dir', 16384, 0, 0)]
+MemoryError
+x0
+x1
+x2
+x3
diff --git a/tests/extmod/vfs_fat_fileio2.py b/tests/extmod/vfs_fat_fileio2.py
index dc109266a..ab9623ddf 100644
--- a/tests/extmod/vfs_fat_fileio2.py
+++ b/tests/extmod/vfs_fat_fileio2.py
@@ -1,10 +1,6 @@
try:
import uerrno
- try:
- import uos_vfs as uos
- open = uos.vfs_open
- except ImportError:
- import uos
+ import uos
except ImportError:
print("SKIP")
raise SystemExit
diff --git a/tests/extmod/vfs_fat_fileio2.py.exp b/tests/extmod/vfs_fat_fileio2.py.exp
index 118dee26b..268405364 100644
--- a/tests/extmod/vfs_fat_fileio2.py.exp
+++ b/tests/extmod/vfs_fat_fileio2.py.exp
@@ -3,9 +3,9 @@ True
True
b'data in file'
True
-[('sub_file.txt', 32768, 0), ('file.txt', 32768, 0)]
-[('foo_dir', 16384, 0), ('moved-to-root.txt', 32768, 0)]
-[('foo_dir', 16384, 0), ('moved-to-root.txt', 32768, 0)]
+[('sub_file.txt', 32768, 0, 11), ('file.txt', 32768, 0, 12)]
+[('foo_dir', 16384, 0, 0), ('moved-to-root.txt', 32768, 0, 12)]
+[('foo_dir', 16384, 0, 0), ('moved-to-root.txt', 32768, 0, 8)]
new text
-[('moved-to-root.txt', 32768, 0)]
+[('moved-to-root.txt', 32768, 0, 8)]
ENOSPC: True
diff --git a/tests/extmod/vfs_fat_more.py b/tests/extmod/vfs_fat_more.py
index 1d9b1c3dd..8ddaf49fc 100644
--- a/tests/extmod/vfs_fat_more.py
+++ b/tests/extmod/vfs_fat_more.py
@@ -1,10 +1,6 @@
import uerrno
try:
- try:
- import uos_vfs as uos
- open = uos.vfs_open
- except ImportError:
- import uos
+ import uos
except ImportError:
print("SKIP")
raise SystemExit
@@ -116,3 +112,11 @@ uos.umount('/')
print(uos.getcwd())
print(uos.listdir())
print(uos.listdir('sys'))
+
+# test importing a file from a mounted FS
+import sys
+sys.path.clear()
+sys.path.append('/sys')
+with open('sys/test_module.py', 'w') as f:
+ f.write('print("test_module!")')
+import test_module
diff --git a/tests/extmod/vfs_fat_more.py.exp b/tests/extmod/vfs_fat_more.py.exp
index aaca3cc75..24429ee09 100644
--- a/tests/extmod/vfs_fat_more.py.exp
+++ b/tests/extmod/vfs_fat_more.py.exp
@@ -26,3 +26,4 @@ mkdir OSError True
/
['sys']
[]
+test_module!
diff --git a/tests/extmod/vfs_fat_oldproto.py b/tests/extmod/vfs_fat_oldproto.py
index 8aa59a98e..b671f3db2 100644
--- a/tests/extmod/vfs_fat_oldproto.py
+++ b/tests/extmod/vfs_fat_oldproto.py
@@ -1,9 +1,6 @@
try:
import uerrno
- try:
- import uos_vfs as uos
- except ImportError:
- import uos
+ import uos
except ImportError:
print("SKIP")
raise SystemExit
diff --git a/tests/extmod/vfs_fat_oldproto.py.exp b/tests/extmod/vfs_fat_oldproto.py.exp
index ab8338cbb..b97468316 100644
--- a/tests/extmod/vfs_fat_oldproto.py.exp
+++ b/tests/extmod/vfs_fat_oldproto.py.exp
@@ -1,3 +1,3 @@
-[('file.txt', 32768, 0)]
+[('file.txt', 32768, 0, 6)]
hello!
[]
diff --git a/tests/extmod/vfs_fat_ramdisk.py b/tests/extmod/vfs_fat_ramdisk.py
index 8af83e17b..30a94ec4e 100644
--- a/tests/extmod/vfs_fat_ramdisk.py
+++ b/tests/extmod/vfs_fat_ramdisk.py
@@ -1,9 +1,6 @@
try:
import uerrno
- try:
- import uos_vfs as uos
- except ImportError:
- import uos
+ import uos
except ImportError:
print("SKIP")
raise SystemExit
diff --git a/tests/extmod/vfs_fat_ramdisk.py.exp b/tests/extmod/vfs_fat_ramdisk.py.exp
index a3c3470a9..ecae81589 100644
--- a/tests/extmod/vfs_fat_ramdisk.py.exp
+++ b/tests/extmod/vfs_fat_ramdisk.py.exp
@@ -4,7 +4,7 @@ label: LABEL TEST
statvfs: (512, 512, 16, 16, 16, 0, 0, 0, 0, 255)
getcwd: /
True
-[('foo_file.txt', 32768, 0)]
+[('foo_file.txt', 32768, 0, 6)]
stat root: (16384, 0, 0, 0, 0, 0, 0, 0, 0, 0)
stat file: (32768, 0, 0, 0, 0, 0, 6)
True
@@ -13,5 +13,5 @@ getcwd: /foo_dir
[]
True
getcwd: /
-[(b'foo_file.txt', 32768, 0), (b'foo_dir', 16384, 0)]
+[(b'foo_file.txt', 32768, 0, 6), (b'foo_dir', 16384, 0, 0)]
ENOENT: True
diff --git a/tests/extmod/vfs_userfs.py b/tests/extmod/vfs_userfs.py
new file mode 100644
index 000000000..e913f9748
--- /dev/null
+++ b/tests/extmod/vfs_userfs.py
@@ -0,0 +1,68 @@
+# test VFS functionality with a user-defined filesystem
+# also tests parts of uio.IOBase implementation
+
+import sys, uio
+
+try:
+ uio.IOBase
+ import uos
+ uos.mount
+except (ImportError, AttributeError):
+ print("SKIP")
+ raise SystemExit
+
+
+class UserFile(uio.IOBase):
+ def __init__(self, data):
+ self.data = data
+ self.pos = 0
+ def read(self):
+ return self.data
+ def readinto(self, buf):
+ n = 0
+ while n < len(buf) and self.pos < len(self.data):
+ buf[n] = self.data[self.pos]
+ n += 1
+ self.pos += 1
+ return n
+ def ioctl(self, req, arg):
+ print('ioctl', req, arg)
+ return 0
+
+
+class UserFS:
+ def __init__(self, files):
+ self.files = files
+ def mount(self, readonly, mksfs):
+ pass
+ def umount(self):
+ pass
+ def stat(self, path):
+ print('stat', path)
+ if path in self.files:
+ return (32768, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+ raise OSError
+ def open(self, path, mode):
+ print('open', path, mode)
+ return UserFile(self.files[path])
+
+
+# create and mount a user filesystem
+user_files = {
+ '/data.txt': b"some data in a text file\n",
+ '/usermod1.py': b"print('in usermod1')\nimport usermod2",
+ '/usermod2.py': b"print('in usermod2')",
+}
+uos.mount(UserFS(user_files), '/userfs')
+
+# open and read a file
+f = open('/userfs/data.txt')
+print(f.read())
+
+# import files from the user filesystem
+sys.path.append('/userfs')
+import usermod1
+
+# unmount and undo path addition
+uos.umount('/userfs')
+sys.path.pop()
diff --git a/tests/extmod/vfs_userfs.py.exp b/tests/extmod/vfs_userfs.py.exp
new file mode 100644
index 000000000..6a4d925b9
--- /dev/null
+++ b/tests/extmod/vfs_userfs.py.exp
@@ -0,0 +1,12 @@
+open /data.txt r
+b'some data in a text file\n'
+stat /usermod1
+stat /usermod1.py
+open /usermod1.py r
+ioctl 4 0
+in usermod1
+stat /usermod2
+stat /usermod2.py
+open /usermod2.py r
+ioctl 4 0
+in usermod2