1# Test for VfsLittle using a RAM device, testing error handling
2
3try:
4    import uos
5
6    uos.VfsLfs1
7    uos.VfsLfs2
8except (ImportError, AttributeError):
9    print("SKIP")
10    raise SystemExit
11
12
13class RAMBlockDevice:
14    ERASE_BLOCK_SIZE = 1024
15
16    def __init__(self, blocks):
17        self.data = bytearray(blocks * self.ERASE_BLOCK_SIZE)
18
19    def readblocks(self, block, buf, off):
20        addr = block * self.ERASE_BLOCK_SIZE + off
21        for i in range(len(buf)):
22            buf[i] = self.data[addr + i]
23
24    def writeblocks(self, block, buf, off):
25        addr = block * self.ERASE_BLOCK_SIZE + off
26        for i in range(len(buf)):
27            self.data[addr + i] = buf[i]
28
29    def ioctl(self, op, arg):
30        if op == 4:  # block count
31            return len(self.data) // self.ERASE_BLOCK_SIZE
32        if op == 5:  # block size
33            return self.ERASE_BLOCK_SIZE
34        if op == 6:  # erase block
35            return 0
36
37
38def test(bdev, vfs_class):
39    print("test", vfs_class)
40
41    # mkfs with too-small block device
42    try:
43        vfs_class.mkfs(RAMBlockDevice(1))
44    except OSError:
45        print("mkfs OSError")
46
47    # mount with invalid filesystem
48    try:
49        vfs_class(bdev)
50    except OSError:
51        print("mount OSError")
52
53    # set up for following tests
54    vfs_class.mkfs(bdev)
55    vfs = vfs_class(bdev)
56    with vfs.open("testfile", "w") as f:
57        f.write("test")
58    vfs.mkdir("testdir")
59
60    # ilistdir
61    try:
62        vfs.ilistdir("noexist")
63    except OSError:
64        print("ilistdir OSError")
65
66    # remove
67    try:
68        vfs.remove("noexist")
69    except OSError:
70        print("remove OSError")
71
72    # rmdir
73    try:
74        vfs.rmdir("noexist")
75    except OSError:
76        print("rmdir OSError")
77
78    # rename
79    try:
80        vfs.rename("noexist", "somethingelse")
81    except OSError:
82        print("rename OSError")
83
84    # mkdir
85    try:
86        vfs.mkdir("testdir")
87    except OSError:
88        print("mkdir OSError")
89
90    # chdir to nonexistent
91    try:
92        vfs.chdir("noexist")
93    except OSError:
94        print("chdir OSError")
95    print(vfs.getcwd())  # check still at root
96
97    # chdir to file
98    try:
99        vfs.chdir("testfile")
100    except OSError:
101        print("chdir OSError")
102    print(vfs.getcwd())  # check still at root
103
104    # stat
105    try:
106        vfs.stat("noexist")
107    except OSError:
108        print("stat OSError")
109
110    # error during seek
111    with vfs.open("testfile", "r") as f:
112        f.seek(1 << 30)  # SEEK_SET
113        try:
114            f.seek(1 << 30, 1)  # SEEK_CUR
115        except OSError:
116            print("seek OSError")
117
118
119bdev = RAMBlockDevice(30)
120test(bdev, uos.VfsLfs1)
121test(bdev, uos.VfsLfs2)
122