1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
# Test for VfsLittle using a RAM device
try:
import os, vfs
vfs.VfsLfs1
vfs.VfsLfs2
except (ImportError, AttributeError):
print("SKIP")
raise SystemExit
class RAMBlockDevice:
ERASE_BLOCK_SIZE = 1024
def __init__(self, blocks):
self.data = bytearray(blocks * self.ERASE_BLOCK_SIZE)
def readblocks(self, block, buf, off):
addr = block * self.ERASE_BLOCK_SIZE + off
for i in range(len(buf)):
buf[i] = self.data[addr + i]
def writeblocks(self, block, buf, off):
addr = block * self.ERASE_BLOCK_SIZE + off
for i in range(len(buf)):
self.data[addr + i] = buf[i]
def ioctl(self, op, arg):
if op == 4: # block count
return len(self.data) // self.ERASE_BLOCK_SIZE
if op == 5: # block size
return self.ERASE_BLOCK_SIZE
if op == 6: # erase block
return 0
def print_stat(st, print_size=True):
# don't print times (just check that they have the correct type)
print(st[:6], st[6] if print_size else -1, type(st[7]), type(st[8]), type(st[9]))
def test(bdev, vfs_class):
print("test", vfs_class)
# mkfs
vfs_class.mkfs(bdev)
# construction
fs = vfs_class(bdev)
# statvfs
print(fs.statvfs("/"))
# open, write close
f = fs.open("test", "w")
f.write("littlefs")
f.close()
# statvfs after creating a file
print(fs.statvfs("/"))
# ilistdir
print(list(fs.ilistdir()))
print(list(fs.ilistdir("/")))
print(list(fs.ilistdir(b"/")))
# mkdir, rmdir
fs.mkdir("testdir")
print(list(fs.ilistdir()))
print(sorted(list(fs.ilistdir("testdir"))))
fs.rmdir("testdir")
print(list(fs.ilistdir()))
fs.mkdir("testdir")
# stat a file
print_stat(fs.stat("test"))
# stat a dir (size seems to vary on LFS2 so don't print that)
print_stat(fs.stat("testdir"), False)
# read
with fs.open("test", "r") as f:
print(f.read())
# create large file
with fs.open("testbig", "w") as f:
data = "large012" * 32 * 16
print("data length:", len(data))
for i in range(4):
print("write", i)
f.write(data)
# stat after creating large file
print(fs.statvfs("/"))
# rename
fs.rename("testbig", "testbig2")
print(sorted(list(fs.ilistdir())))
fs.chdir("testdir")
fs.rename("/testbig2", "testbig2")
print(sorted(list(fs.ilistdir())))
fs.rename("testbig2", "/testbig2")
fs.chdir("/")
print(sorted(list(fs.ilistdir())))
# remove
fs.remove("testbig2")
print(sorted(list(fs.ilistdir())))
# getcwd, chdir
fs.mkdir("/testdir2")
fs.mkdir("/testdir/subdir")
print(fs.getcwd())
fs.chdir("/testdir")
print(fs.getcwd())
# create file in directory to make sure paths are relative
fs.open("test2", "w").close()
print_stat(fs.stat("test2"))
print_stat(fs.stat("/testdir/test2"))
fs.remove("test2")
# chdir back to root and remove testdir
fs.chdir("/")
print(fs.getcwd())
fs.chdir("testdir")
print(fs.getcwd())
fs.chdir("..")
print(fs.getcwd())
fs.chdir("testdir/subdir")
print(fs.getcwd())
fs.chdir("../..")
print(fs.getcwd())
fs.chdir("/./testdir2")
print(fs.getcwd())
fs.chdir("../testdir")
print(fs.getcwd())
fs.chdir("../..")
print(fs.getcwd())
fs.chdir(".//testdir")
print(fs.getcwd())
fs.chdir("subdir/./")
print(fs.getcwd())
fs.chdir("/")
print(fs.getcwd())
fs.rmdir("testdir/subdir")
fs.rmdir("testdir")
fs.rmdir("testdir2")
bdev = RAMBlockDevice(30)
test(bdev, vfs.VfsLfs1)
test(bdev, vfs.VfsLfs2)
|