summaryrefslogtreecommitdiffstatshomepage
path: root/tests/extmod/vfs_lfs.py
blob: 8e56400df3c2b39a410f803c1a0f2ebc62ebab83 (plain) (blame)
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 uos

    uos.VfsLfs1
    uos.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
    vfs = vfs_class(bdev)

    # statvfs
    print(vfs.statvfs("/"))

    # open, write close
    f = vfs.open("test", "w")
    f.write("littlefs")
    f.close()

    # statvfs after creating a file
    print(vfs.statvfs("/"))

    # ilistdir
    print(list(vfs.ilistdir()))
    print(list(vfs.ilistdir("/")))
    print(list(vfs.ilistdir(b"/")))

    # mkdir, rmdir
    vfs.mkdir("testdir")
    print(list(vfs.ilistdir()))
    print(sorted(list(vfs.ilistdir("testdir"))))
    vfs.rmdir("testdir")
    print(list(vfs.ilistdir()))
    vfs.mkdir("testdir")

    # stat a file
    print_stat(vfs.stat("test"))

    # stat a dir (size seems to vary on LFS2 so don't print that)
    print_stat(vfs.stat("testdir"), False)

    # read
    with vfs.open("test", "r") as f:
        print(f.read())

    # create large file
    with vfs.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(vfs.statvfs("/"))

    # rename
    vfs.rename("testbig", "testbig2")
    print(sorted(list(vfs.ilistdir())))
    vfs.chdir("testdir")
    vfs.rename("/testbig2", "testbig2")
    print(sorted(list(vfs.ilistdir())))
    vfs.rename("testbig2", "/testbig2")
    vfs.chdir("/")
    print(sorted(list(vfs.ilistdir())))

    # remove
    vfs.remove("testbig2")
    print(sorted(list(vfs.ilistdir())))

    # getcwd, chdir
    vfs.mkdir("/testdir2")
    vfs.mkdir("/testdir/subdir")
    print(vfs.getcwd())
    vfs.chdir("/testdir")
    print(vfs.getcwd())

    # create file in directory to make sure paths are relative
    vfs.open("test2", "w").close()
    print_stat(vfs.stat("test2"))
    print_stat(vfs.stat("/testdir/test2"))
    vfs.remove("test2")

    # chdir back to root and remove testdir
    vfs.chdir("/")
    print(vfs.getcwd())
    vfs.chdir("testdir")
    print(vfs.getcwd())
    vfs.chdir("..")
    print(vfs.getcwd())
    vfs.chdir("testdir/subdir")
    print(vfs.getcwd())
    vfs.chdir("../..")
    print(vfs.getcwd())
    vfs.chdir("/./testdir2")
    print(vfs.getcwd())
    vfs.chdir("../testdir")
    print(vfs.getcwd())
    vfs.chdir("../..")
    print(vfs.getcwd())
    vfs.chdir(".//testdir")
    print(vfs.getcwd())
    vfs.chdir("subdir/./")
    print(vfs.getcwd())
    vfs.chdir("/")
    print(vfs.getcwd())
    vfs.rmdir("testdir/subdir")
    vfs.rmdir("testdir")
    vfs.rmdir("testdir2")


bdev = RAMBlockDevice(30)
test(bdev, uos.VfsLfs1)
test(bdev, uos.VfsLfs2)