1# test making a FAT filesystem on a very large block device
2
3try:
4    import uos
5except ImportError:
6    print("SKIP")
7    raise SystemExit
8
9try:
10    uos.VfsFat
11except AttributeError:
12    print("SKIP")
13    raise SystemExit
14
15
16class RAMBDevSparse:
17
18    SEC_SIZE = 512
19
20    def __init__(self, blocks):
21        self.blocks = blocks
22        self.data = {}
23
24    def readblocks(self, n, buf):
25        # print("readblocks(%s, %x(%d))" % (n, id(buf), len(buf)))
26        assert len(buf) == self.SEC_SIZE
27        if n not in self.data:
28            self.data[n] = bytearray(self.SEC_SIZE)
29        buf[:] = self.data[n]
30
31    def writeblocks(self, n, buf):
32        # print("writeblocks(%s, %x)" % (n, id(buf)))
33        mv = memoryview(buf)
34        for off in range(0, len(buf), self.SEC_SIZE):
35            s = n + off // self.SEC_SIZE
36            if s not in self.data:
37                self.data[s] = bytearray(self.SEC_SIZE)
38            self.data[s][:] = mv[off : off + self.SEC_SIZE]
39
40    def ioctl(self, op, arg):
41        # print("ioctl(%d, %r)" % (op, arg))
42        if op == 4:  # MP_BLOCKDEV_IOCTL_BLOCK_COUNT
43            return self.blocks
44        if op == 5:  # MP_BLOCKDEV_IOCTL_BLOCK_SIZE
45            return self.SEC_SIZE
46
47
48try:
49    bdev = RAMBDevSparse(4 * 1024 * 1024 * 1024 // RAMBDevSparse.SEC_SIZE)
50    uos.VfsFat.mkfs(bdev)
51except MemoryError:
52    print("SKIP")
53    raise SystemExit
54
55vfs = uos.VfsFat(bdev)
56uos.mount(vfs, "/ramdisk")
57
58print("statvfs:", vfs.statvfs("/ramdisk"))
59
60f = open("/ramdisk/test.txt", "w")
61f.write("test file")
62f.close()
63
64print("statvfs:", vfs.statvfs("/ramdisk"))
65
66f = open("/ramdisk/test.txt")
67print(f.read())
68f.close()
69
70uos.umount(vfs)
71