summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Epler <jepler@gmail.com>2025-07-19 06:32:57 -0500
committerDamien George <damien@micropython.org>2025-07-24 10:39:23 +1000
commitd79000df70d2fe50a7912da7f52813ad00584b3c (patch)
treefbda1faa78b4ee5241da6a5d85ff31f494f33278
parent6515cd05f17240c5d42d80638a55ce3b5ba4d1bf (diff)
tests/extmod: Add (failing) test for VfsPosix in readonly mode.
I noticed that operations such as unlink could be performed on a nominally read-only VfsPosix. Signed-off-by: Jeff Epler <jepler@gmail.com>
-rw-r--r--tests/extmod/vfs_posix_readonly.py99
-rw-r--r--tests/extmod/vfs_posix_readonly.py.exp7
2 files changed, 106 insertions, 0 deletions
diff --git a/tests/extmod/vfs_posix_readonly.py b/tests/extmod/vfs_posix_readonly.py
new file mode 100644
index 000000000..e78213810
--- /dev/null
+++ b/tests/extmod/vfs_posix_readonly.py
@@ -0,0 +1,99 @@
+# Test for VfsPosix
+
+try:
+ import gc, os, vfs, errno
+
+ vfs.VfsPosix
+except (ImportError, AttributeError):
+ print("SKIP")
+ raise SystemExit
+
+# We need a directory for testing that doesn't already exist.
+# Skip the test if it does exist.
+temp_dir = "vfs_posix_readonly_test_dir"
+try:
+ os.stat(temp_dir)
+ raise SystemExit("Target directory {} exists".format(temp_dir))
+except OSError:
+ pass
+
+# mkdir (skip test if whole filesystem is readonly)
+try:
+ os.mkdir(temp_dir)
+except OSError as e:
+ if e.errno == errno.EROFS:
+ print("SKIP")
+ raise SystemExit
+
+fs_factory = lambda: vfs.VfsPosix(temp_dir)
+
+# mount
+fs = fs_factory()
+vfs.mount(fs, "/vfs")
+
+with open("/vfs/file", "w") as f:
+ f.write("content")
+
+# test reading works
+with open("/vfs/file") as f:
+ print("file:", f.read())
+
+os.mkdir("/vfs/emptydir")
+
+# umount
+vfs.umount("/vfs")
+
+# mount read-only
+fs = fs_factory()
+vfs.mount(fs, "/vfs", readonly=True)
+
+# test reading works
+with open("/vfs/file") as f:
+ print("file 2:", f.read())
+
+# test writing fails
+try:
+ with open("/vfs/test_write", "w"):
+ pass
+ print("opened")
+except OSError as er:
+ print(repr(er))
+
+# test removing fails
+try:
+ os.unlink("/vfs/file")
+ print("unlinked")
+except OSError as er:
+ print(repr(er))
+
+# test renaming fails
+try:
+ os.rename("/vfs/file2", "/vfs/renamed")
+ print("renamed")
+except OSError as er:
+ print(repr(er))
+
+# test removing directory fails
+try:
+ os.rmdir("/vfs/emptydir")
+ print("rmdir'd")
+except OSError as er:
+ print(repr(er))
+
+# test creating directory fails
+try:
+ os.mkdir("/vfs/emptydir2")
+ print("mkdir'd")
+except OSError as er:
+ print(repr(er))
+
+# umount
+vfs.umount("/vfs")
+
+fs = fs_factory()
+vfs.mount(fs, "/vfs")
+
+os.rmdir("/vfs/emptydir")
+os.unlink("/vfs/file")
+
+os.rmdir(temp_dir)
diff --git a/tests/extmod/vfs_posix_readonly.py.exp b/tests/extmod/vfs_posix_readonly.py.exp
new file mode 100644
index 000000000..40e431677
--- /dev/null
+++ b/tests/extmod/vfs_posix_readonly.py.exp
@@ -0,0 +1,7 @@
+file: content
+file 2: content
+OSError(30,)
+OSError(30,)
+OSError(30,)
+OSError(30,)
+OSError(30,)