summaryrefslogtreecommitdiffstatshomepage
path: root/tests/extmod/vfs_lfs.py
blob: 3ad57fd9c38f11f1cf6053710923c2d34c92448f (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 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)