summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/extmod/vfs_userfs.py68
-rw-r--r--tests/extmod/vfs_userfs.py.exp12
-rwxr-xr-xtests/run-tests1
3 files changed, 81 insertions, 0 deletions
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
diff --git a/tests/run-tests b/tests/run-tests
index 25fb33a3f..cfd7c4037 100755
--- a/tests/run-tests
+++ b/tests/run-tests
@@ -364,6 +364,7 @@ def run_tests(pyb, tests, args, base_path="."):
skip_tests.add('micropython/schedule.py') # native code doesn't check pending events
skip_tests.add('stress/gc_trace.py') # requires yield
skip_tests.add('stress/recursive_gen.py') # requires yield
+ skip_tests.add('extmod/vfs_userfs.py') # because native doesn't properly handle globals across different modules
for test_file in tests:
test_file = test_file.replace('\\', '/')