1# Test for behaviour of combined standard and extended block device
2
3try:
4    import uos
5
6    uos.VfsFat
7    uos.VfsLfs2
8except (ImportError, AttributeError):
9    print("SKIP")
10    raise SystemExit
11
12
13class RAMBlockDevice:
14    ERASE_BLOCK_SIZE = 512
15
16    def __init__(self, blocks):
17        self.data = bytearray(blocks * self.ERASE_BLOCK_SIZE)
18
19    def readblocks(self, block, buf, off=0):
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=None):
25        if off is None:
26            # erase, then write
27            off = 0
28        addr = block * self.ERASE_BLOCK_SIZE + off
29        for i in range(len(buf)):
30            self.data[addr + i] = buf[i]
31
32    def ioctl(self, op, arg):
33        if op == 4:  # block count
34            return len(self.data) // self.ERASE_BLOCK_SIZE
35        if op == 5:  # block size
36            return self.ERASE_BLOCK_SIZE
37        if op == 6:  # erase block
38            return 0
39
40
41def test(bdev, vfs_class):
42    print("test", vfs_class)
43
44    # mkfs
45    vfs_class.mkfs(bdev)
46
47    # construction
48    vfs = vfs_class(bdev)
49
50    # statvfs
51    print(vfs.statvfs("/"))
52
53    # open, write close
54    f = vfs.open("test", "w")
55    for i in range(10):
56        f.write("some data")
57    f.close()
58
59    # ilistdir
60    print(list(vfs.ilistdir()))
61
62    # read
63    with vfs.open("test", "r") as f:
64        print(f.read())
65
66
67try:
68    bdev = RAMBlockDevice(50)
69except MemoryError:
70    print("SKIP")
71    raise SystemExit
72
73test(bdev, uos.VfsFat)
74test(bdev, uos.VfsLfs2)
75