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)
|