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