Skip to content

Commit cb20d99

Browse files
Alex Marchdpgeorge
authored andcommitted
tests/extmod/vfs_fat: Improve VFS test coverage.
Covered case: - Stat cases - Invalid read/write/flush/close - Invalid mkdir/rmdir/remove/getcwd - File seek/tell, modes a/x/+, t/b - Writing to a full disk - Full path rename, slash trim - Rename cases - Bytestring listdir - File object printing
1 parent b6c22c4 commit cb20d99

4 files changed

Lines changed: 209 additions & 51 deletions

File tree

tests/extmod/vfs_fat_fileio.py

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
import sys
2+
import uos
3+
import uerrno
4+
try:
5+
uos.VfsFat
6+
except AttributeError:
7+
print("SKIP")
8+
sys.exit()
9+
10+
11+
class RAMFS:
12+
13+
SEC_SIZE = 512
14+
15+
def __init__(self, blocks):
16+
self.data = bytearray(blocks * self.SEC_SIZE)
17+
18+
def readblocks(self, n, buf):
19+
#print("readblocks(%s, %x(%d))" % (n, id(buf), len(buf)))
20+
for i in range(len(buf)):
21+
buf[i] = self.data[n * self.SEC_SIZE + i]
22+
23+
def writeblocks(self, n, buf):
24+
#print("writeblocks(%s, %x)" % (n, id(buf)))
25+
for i in range(len(buf)):
26+
self.data[n * self.SEC_SIZE + i] = buf[i]
27+
28+
def ioctl(self, op, arg):
29+
#print("ioctl(%d, %r)" % (op, arg))
30+
if op == 4: # BP_IOCTL_SEC_COUNT
31+
return len(self.data) // self.SEC_SIZE
32+
if op == 5: # BP_IOCTL_SEC_SIZE
33+
return self.SEC_SIZE
34+
35+
36+
try:
37+
bdev = RAMFS(48)
38+
except MemoryError:
39+
print("SKIP")
40+
sys.exit()
41+
42+
uos.VfsFat.mkfs(bdev)
43+
vfs = uos.VfsFat(bdev, "/ramdisk")
44+
45+
# file IO
46+
f = vfs.open("foo_file.txt", "w")
47+
print(str(f)[:17], str(f)[-1:])
48+
f.write("hello!")
49+
f.flush()
50+
f.close()
51+
try:
52+
f.write("world!")
53+
except OSError as e:
54+
print(e.args[0] == uerrno.EINVAL)
55+
56+
try:
57+
f.read()
58+
except OSError as e:
59+
print(e.args[0] == uerrno.EINVAL)
60+
61+
try:
62+
f.flush()
63+
except OSError as e:
64+
print(e.args[0] == uerrno.EINVAL)
65+
66+
try:
67+
f.close()
68+
except OSError as e:
69+
print(e.args[0] == uerrno.EINVAL)
70+
71+
try:
72+
vfs.open("foo_file.txt", "x")
73+
except OSError as e:
74+
print(e.args[0] == uerrno.EEXIST)
75+
76+
with vfs.open("foo_file.txt", "a") as f:
77+
f.write("world!")
78+
79+
with vfs.open("foo_file.txt") as f2:
80+
print(f2.read())
81+
print(f2.tell())
82+
83+
f2.seek(0, 0) # SEEK_SET
84+
print(f2.read(1))
85+
86+
f2.seek(0, 1) # SEEK_CUR
87+
print(f2.read(1))
88+
try:
89+
f2.seek(1, 1) # SEEK_END
90+
except OSError as e:
91+
print(e.args[0] == uerrno.EOPNOTSUPP)
92+
93+
f2.seek(-2, 2) # SEEK_END
94+
print(f2.read(1))
95+
96+
# dirs
97+
vfs.mkdir("foo_dir")
98+
99+
try:
100+
vfs.rmdir("foo_file.txt")
101+
except OSError as e:
102+
print(e.args[0] == 20) # uerrno.ENOTDIR
103+
104+
try:
105+
vfs.mkdir("foo_dir")
106+
except OSError as e:
107+
print(e.args[0] == uerrno.EEXIST)
108+
109+
try:
110+
vfs.remove("foo_dir")
111+
except OSError as e:
112+
print(e.args[0] == uerrno.EISDIR)
113+
114+
try:
115+
vfs.remove("no_file.txt")
116+
except OSError as e:
117+
print(e.args[0] == uerrno.ENOENT)
118+
119+
try:
120+
vfs.rename("foo_dir", "/null")
121+
except OSError as e:
122+
print(e.args[0] == uerrno.ENODEV)
123+
124+
# file in dir
125+
with vfs.open("foo_dir/file-in-dir.txt", "w+t") as f:
126+
f.write("data in file")
127+
128+
with vfs.open("foo_dir/file-in-dir.txt", "r+b") as f:
129+
print(f.read())
130+
131+
with vfs.open("foo_dir/sub_file.txt", "w") as f:
132+
f.write("subdir file")
133+
134+
# directory not empty
135+
try:
136+
vfs.rmdir("foo_dir")
137+
except OSError as e:
138+
print(e.args[0] == uerrno.EACCES)
139+
140+
# trim full path
141+
vfs.rename("foo_dir/file-in-dir.txt", "/ramdisk/foo_dir/file.txt")
142+
print(vfs.listdir("foo_dir"))
143+
144+
vfs.rename("foo_dir/file.txt", "moved-to-root.txt")
145+
print(vfs.listdir())
146+
147+
# valid removes
148+
vfs.remove("foo_dir/sub_file.txt")
149+
vfs.remove("foo_file.txt")
150+
vfs.rmdir("foo_dir")
151+
print(vfs.listdir())
152+
153+
# disk full
154+
try:
155+
bsize = vfs.statvfs("/ramdisk")[0]
156+
free = vfs.statvfs("/ramdisk")[2] + 1
157+
f = vfs.open("large_file.txt", "wb")
158+
f.write(bytearray(bsize * free))
159+
except OSError as e:
160+
print("ENOSPC:", e.args[0] == 28) # uerrno.ENOSPC

tests/extmod/vfs_fat_fileio.py.exp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<io.TextIOWrapper >
2+
True
3+
True
4+
True
5+
True
6+
True
7+
hello!world!
8+
12
9+
h
10+
e
11+
True
12+
d
13+
True
14+
True
15+
True
16+
True
17+
True
18+
b'data in file'
19+
True
20+
['sub_file.txt', 'file.txt']
21+
['foo_file.txt', 'foo_dir', 'moved-to-root.txt']
22+
['moved-to-root.txt']
23+
ENOSPC: True

tests/extmod/vfs_fat_ramdisk.py

Lines changed: 21 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -45,55 +45,38 @@ def ioctl(self, op, arg):
4545
print(b"hello!" not in bdev.data)
4646

4747
vfs = uos.VfsFat(bdev, "/ramdisk")
48-
print("statvfs:", vfs.statvfs("/ramdisk"))
49-
50-
print("getcwd:", vfs.getcwd())
51-
52-
f = vfs.open("foo_file.txt", "w")
53-
f.write("hello!")
54-
f.close()
55-
56-
f2 = vfs.open("foo_file.txt")
57-
print(f2.read())
58-
f2.close()
59-
60-
print(b"FOO_FILETXT" in bdev.data)
61-
print(b"hello!" in bdev.data)
62-
63-
print(vfs.listdir())
6448

6549
try:
66-
vfs.rmdir("foo_file.txt")
50+
vfs.statvfs("/null")
6751
except OSError as e:
68-
print(e.args[0] == 20) # uerrno.ENOTDIR
69-
70-
vfs.remove('foo_file.txt')
71-
print(vfs.listdir())
52+
print(e.args[0] == uerrno.ENODEV)
7253

73-
vfs.mkdir("foo_dir")
74-
print(vfs.listdir())
54+
print("statvfs:", vfs.statvfs("/ramdisk"))
55+
print("getcwd:", vfs.getcwd())
7556

7657
try:
77-
vfs.remove("foo_dir")
58+
vfs.stat("no_file.txt")
7859
except OSError as e:
79-
print(e.args[0] == uerrno.EISDIR)
60+
print(e.args[0] == uerrno.ENOENT)
8061

81-
f = vfs.open("foo_dir/file-in-dir.txt", "w")
82-
f.write("data in file")
83-
f.close()
62+
with vfs.open("foo_file.txt", "w") as f:
63+
f.write("hello!")
64+
print(vfs.listdir())
8465

85-
print(vfs.listdir("foo_dir"))
66+
print("stat root:", vfs.stat("/"))
67+
print("stat disk:", vfs.stat("/ramdisk/"))
68+
print("stat file:", vfs.stat("foo_file.txt"))
8669

87-
vfs.rename("foo_dir/file-in-dir.txt", "moved-to-root.txt")
88-
print(vfs.listdir())
70+
print(b"FOO_FILETXT" in bdev.data)
71+
print(b"hello!" in bdev.data)
8972

73+
vfs.mkdir("foo_dir")
9074
vfs.chdir("foo_dir")
9175
print("getcwd:", vfs.getcwd())
9276
print(vfs.listdir())
9377

9478
with vfs.open("sub_file.txt", "w") as f:
95-
f.write("test2")
96-
print(vfs.listdir())
79+
f.write("subdir file")
9780

9881
try:
9982
vfs.chdir("sub_file.txt")
@@ -103,20 +86,16 @@ def ioctl(self, op, arg):
10386
vfs.chdir("..")
10487
print("getcwd:", vfs.getcwd())
10588

89+
vfs.umount()
10690
try:
107-
vfs.rmdir("foo_dir")
91+
vfs.listdir()
10892
except OSError as e:
109-
print(e.args[0] == uerrno.EACCES)
110-
111-
vfs.remove("foo_dir/sub_file.txt")
112-
vfs.rmdir("foo_dir")
113-
print(vfs.listdir())
93+
print(e.args[0] == uerrno.ENODEV)
11494

115-
vfs.umount()
11695
try:
117-
vfs.listdir()
96+
vfs.getcwd()
11897
except OSError as e:
11998
print(e.args[0] == uerrno.ENODEV)
12099

121100
vfs = uos.VfsFat(bdev, "/ramdisk")
122-
print(vfs.listdir())
101+
print(vfs.listdir(b""))
Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,19 @@
11
True
22
True
3+
True
34
statvfs: (512, 512, 14, 14, 14, 0, 0, 0, 0, 255)
45
getcwd: /ramdisk
5-
hello!
6-
True
76
True
87
['foo_file.txt']
8+
stat root: (16384, 0, 0, 0, 0, 0, 0, 0, 0, 0)
9+
stat disk: (16384, 0, 0, 0, 0, 0, 0, 0, 0, 0)
10+
stat file: (32768, 0, 0, 0, 0, 0, 6, -631238400, -631238400, -631238400)
911
True
10-
[]
11-
['foo_dir']
1212
True
13-
['file-in-dir.txt']
14-
['foo_dir', 'moved-to-root.txt']
1513
getcwd: /ramdisk/foo_dir
1614
[]
17-
['sub_file.txt']
1815
True
1916
getcwd: /ramdisk
2017
True
21-
['moved-to-root.txt']
2218
True
23-
['moved-to-root.txt']
19+
[b'foo_file.txt', b'foo_dir']

0 commit comments

Comments
 (0)