1try: 2 import uerrno 3 import uos 4except ImportError: 5 print("SKIP") 6 raise SystemExit 7 8try: 9 uos.VfsFat 10except AttributeError: 11 print("SKIP") 12 raise SystemExit 13 14 15class RAMFS: 16 17 SEC_SIZE = 512 18 19 def __init__(self, blocks): 20 self.data = bytearray(blocks * self.SEC_SIZE) 21 22 def readblocks(self, n, buf): 23 # print("readblocks(%s, %x(%d))" % (n, id(buf), len(buf))) 24 for i in range(len(buf)): 25 buf[i] = self.data[n * self.SEC_SIZE + i] 26 27 def writeblocks(self, n, buf): 28 # print("writeblocks(%s, %x)" % (n, id(buf))) 29 for i in range(len(buf)): 30 self.data[n * self.SEC_SIZE + i] = buf[i] 31 32 def ioctl(self, op, arg): 33 # print("ioctl(%d, %r)" % (op, arg)) 34 if op == 4: # MP_BLOCKDEV_IOCTL_BLOCK_COUNT 35 return len(self.data) // self.SEC_SIZE 36 if op == 5: # MP_BLOCKDEV_IOCTL_BLOCK_SIZE 37 return self.SEC_SIZE 38 39 40try: 41 bdev = RAMFS(50) 42except MemoryError: 43 print("SKIP") 44 raise SystemExit 45 46uos.VfsFat.mkfs(bdev) 47vfs = uos.VfsFat(bdev) 48uos.mount(vfs, "/ramdisk") 49uos.chdir("/ramdisk") 50 51try: 52 vfs.mkdir("foo_dir") 53except OSError as e: 54 print(e.args[0] == uerrno.EEXIST) 55 56try: 57 vfs.remove("foo_dir") 58except OSError as e: 59 print(e.args[0] == uerrno.EISDIR) 60 61try: 62 vfs.remove("no_file.txt") 63except OSError as e: 64 print(e.args[0] == uerrno.ENOENT) 65 66try: 67 vfs.rename("foo_dir", "/null/file") 68except OSError as e: 69 print(e.args[0] == uerrno.ENOENT) 70 71# file in dir 72with open("foo_dir/file-in-dir.txt", "w+t") as f: 73 f.write("data in file") 74 75with open("foo_dir/file-in-dir.txt", "r+b") as f: 76 print(f.read()) 77 78with open("foo_dir/sub_file.txt", "w") as f: 79 f.write("subdir file") 80 81# directory not empty 82try: 83 vfs.rmdir("foo_dir") 84except OSError as e: 85 print(e.args[0] == uerrno.EACCES) 86 87# trim full path 88vfs.rename("foo_dir/file-in-dir.txt", "foo_dir/file.txt") 89print(list(vfs.ilistdir("foo_dir"))) 90 91vfs.rename("foo_dir/file.txt", "moved-to-root.txt") 92print(list(vfs.ilistdir())) 93 94# check that renaming to existing file will overwrite it 95with open("temp", "w") as f: 96 f.write("new text") 97vfs.rename("temp", "moved-to-root.txt") 98print(list(vfs.ilistdir())) 99with open("moved-to-root.txt") as f: 100 print(f.read()) 101 102# valid removes 103vfs.remove("foo_dir/sub_file.txt") 104vfs.rmdir("foo_dir") 105print(list(vfs.ilistdir())) 106 107# disk full 108try: 109 bsize = vfs.statvfs("/ramdisk")[0] 110 free = vfs.statvfs("/ramdisk")[2] + 1 111 f = open("large_file.txt", "wb") 112 f.write(bytearray(bsize * free)) 113except OSError as e: 114 print("ENOSPC:", e.args[0] == 28) # uerrno.ENOSPC 115