1# test VFS functionality without any particular filesystem type 2 3try: 4 import uos 5 6 uos.mount 7except (ImportError, AttributeError): 8 print("SKIP") 9 raise SystemExit 10 11 12class Filesystem: 13 def __init__(self, id, fail=0): 14 self.id = id 15 self.fail = fail 16 17 def mount(self, readonly, mkfs): 18 print(self.id, "mount", readonly, mkfs) 19 20 def umount(self): 21 print(self.id, "umount") 22 23 def ilistdir(self, dir): 24 print(self.id, "ilistdir", dir) 25 return iter([("a%d" % self.id, 0, 0)]) 26 27 def chdir(self, dir): 28 print(self.id, "chdir", dir) 29 if self.fail: 30 raise OSError(self.fail) 31 32 def getcwd(self): 33 print(self.id, "getcwd") 34 return "dir%d" % self.id 35 36 def mkdir(self, path): 37 print(self.id, "mkdir", path) 38 39 def remove(self, path): 40 print(self.id, "remove", path) 41 42 def rename(self, old_path, new_path): 43 print(self.id, "rename", old_path, new_path) 44 45 def rmdir(self, path): 46 print(self.id, "rmdir", path) 47 48 def stat(self, path): 49 print(self.id, "stat", path) 50 return (self.id,) 51 52 def statvfs(self, path): 53 print(self.id, "statvfs", path) 54 return (self.id,) 55 56 def open(self, file, mode): 57 print(self.id, "open", file, mode) 58 59 60# first we umount any existing mount points the target may have 61try: 62 uos.umount("/") 63except OSError: 64 pass 65for path in uos.listdir("/"): 66 uos.umount("/" + path) 67 68# stat root dir 69print(uos.stat("/")) 70 71# statvfs root dir; verify that f_namemax has a sensible size 72print(uos.statvfs("/")[9] >= 32) 73 74# getcwd when in root dir 75print(uos.getcwd()) 76 77# test operations on the root directory with nothing mounted, they should all fail 78for func in ("chdir", "listdir", "mkdir", "remove", "rmdir", "stat"): 79 for arg in ("x", "/x"): 80 try: 81 getattr(uos, func)(arg) 82 except OSError: 83 print(func, arg, "OSError") 84 85# basic mounting and listdir 86uos.mount(Filesystem(1), "/test_mnt") 87print(uos.listdir()) 88 89# ilistdir 90i = uos.ilistdir() 91print(next(i)) 92try: 93 next(i) 94except StopIteration: 95 print("StopIteration") 96try: 97 next(i) 98except StopIteration: 99 print("StopIteration") 100 101# referencing the mount point in different ways 102print(uos.listdir("test_mnt")) 103print(uos.listdir("/test_mnt")) 104 105# mounting another filesystem 106uos.mount(Filesystem(2), "/test_mnt2", readonly=True) 107print(uos.listdir()) 108print(uos.listdir("/test_mnt2")) 109 110# mounting over an existing mount point 111try: 112 uos.mount(Filesystem(3), "/test_mnt2") 113except OSError: 114 print("OSError") 115 116# mkdir of a mount point 117try: 118 uos.mkdir("/test_mnt") 119except OSError: 120 print("OSError") 121 122# rename across a filesystem 123try: 124 uos.rename("/test_mnt/a", "/test_mnt2/b") 125except OSError: 126 print("OSError") 127 128# delegating to mounted filesystem 129uos.chdir("test_mnt") 130print(uos.listdir()) 131print(uos.getcwd()) 132uos.mkdir("test_dir") 133uos.remove("test_file") 134uos.rename("test_file", "test_file2") 135uos.rmdir("test_dir") 136print(uos.stat("test_file")) 137print(uos.statvfs("/test_mnt")) 138open("test_file") 139open("test_file", "wb") 140 141# umount 142uos.umount("/test_mnt") 143uos.umount("/test_mnt2") 144 145# umount a non-existent mount point 146try: 147 uos.umount("/test_mnt") 148except OSError: 149 print("OSError") 150 151# root dir 152uos.mount(Filesystem(3), "/") 153print(uos.stat("/")) 154print(uos.statvfs("/")) 155print(uos.listdir()) 156open("test") 157 158uos.mount(Filesystem(4), "/mnt") 159print(uos.listdir()) 160print(uos.listdir("/mnt")) 161uos.chdir("/mnt") 162print(uos.listdir()) 163 164# chdir to a subdir within root-mounted vfs, and then listdir 165uos.chdir("/subdir") 166print(uos.listdir()) 167uos.chdir("/") 168 169uos.umount("/") 170print(uos.listdir("/")) 171uos.umount("/mnt") 172 173# chdir to a non-existent mount point (current directory should remain unchanged) 174try: 175 uos.chdir("/foo") 176except OSError: 177 print("OSError") 178print(uos.getcwd()) 179 180# chdir to a non-existent subdirectory in a mounted filesystem 181uos.mount(Filesystem(5, 1), "/mnt") 182try: 183 uos.chdir("/mnt/subdir") 184except OSError: 185 print("OSError") 186print(uos.getcwd()) 187