Skip to content

Commit

Permalink
tests/extmod: Add tests for verifying FAT and littlefs mtime values.
Browse files Browse the repository at this point in the history
Verifies mtime timestamps on files match the value returned by time.time().

Also update vfs_fat_ramdisk.py so it doesn't check FAT timestamp of the
root, because that may change across runs/ports.

Signed-off-by: Damien George <damien@micropython.org>
  • Loading branch information
dpgeorge committed Sep 1, 2020
1 parent a909c21 commit 0e6ef40
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 3 deletions.
74 changes: 74 additions & 0 deletions tests/extmod/vfs_fat_mtime.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Test for VfsFat using a RAM device, mtime feature

try:
import utime, uos

utime.time
utime.sleep
uos.VfsFat
except (ImportError, AttributeError):
print("SKIP")
raise SystemExit


class RAMBlockDevice:
ERASE_BLOCK_SIZE = 512

def __init__(self, blocks):
self.data = bytearray(blocks * self.ERASE_BLOCK_SIZE)

def readblocks(self, block, buf):
addr = block * self.ERASE_BLOCK_SIZE
for i in range(len(buf)):
buf[i] = self.data[addr + i]

def writeblocks(self, block, buf):
addr = block * self.ERASE_BLOCK_SIZE
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


def test(bdev, vfs_class):
print("test", vfs_class)

# Initial format of block device.
vfs_class.mkfs(bdev)

# construction
vfs = vfs_class(bdev)

# Create an empty file, should have a timestamp.
current_time = int(utime.time())
vfs.open("test1", "wt").close()

# Wait 2 seconds so mtime will increase (FAT has 2 second resolution).
utime.sleep(2)

# Create another empty file, should have a timestamp.
vfs.open("test2", "wt").close()

# Stat the files and check mtime is non-zero.
stat1 = vfs.stat("test1")
stat2 = vfs.stat("test2")
print(stat1[8] != 0, stat2[8] != 0)

# Check that test1 has mtime which matches time.time() at point of creation.
# TODO this currently fails on the unix port because FAT stores timestamps
# in localtime and stat() is UTC based.
# print(current_time - 1 <= stat1[8] <= current_time + 1)

# Check that test1 is older than test2.
print(stat1[8] < stat2[8])

# Unmount.
vfs.umount()


bdev = RAMBlockDevice(50)
test(bdev, uos.VfsFat)
3 changes: 3 additions & 0 deletions tests/extmod/vfs_fat_mtime.py.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
test <class 'VfsFat'>
True True
True
2 changes: 1 addition & 1 deletion tests/extmod/vfs_fat_ramdisk.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def ioctl(self, op, arg):
f.write("hello!")
print(list(vfs.ilistdir()))

print("stat root:", vfs.stat("/"))
print("stat root:", vfs.stat("/")[:-3]) # timestamps differ across runs
print("stat file:", vfs.stat("foo_file.txt")[:-3]) # timestamps differ across runs

print(b"FOO_FILETXT" in bdev.data)
Expand Down
2 changes: 1 addition & 1 deletion tests/extmod/vfs_fat_ramdisk.py.exp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ statvfs: (512, 512, 16, 16, 16, 0, 0, 0, 0, 255)
getcwd: /
True
[('foo_file.txt', 32768, 0, 6)]
stat root: (16384, 0, 0, 0, 0, 0, 0, 0, 0, 0)
stat root: (16384, 0, 0, 0, 0, 0, 0)
stat file: (32768, 0, 0, 0, 0, 0, 6)
True
True
Expand Down
9 changes: 8 additions & 1 deletion tests/extmod/vfs_lfs_mtime.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
try:
import utime, uos

utime.time
utime.sleep
uos.VfsLfs2
except (ImportError, AttributeError):
Expand Down Expand Up @@ -46,6 +47,7 @@ def test(bdev, vfs_class):
vfs = vfs_class(bdev, mtime=True)

# Create an empty file, should have a timestamp.
current_time = int(utime.time())
vfs.open("test1", "wt").close()

# Wait 1 second so mtime will increase by at least 1.
Expand All @@ -54,10 +56,15 @@ def test(bdev, vfs_class):
# Create another empty file, should have a timestamp.
vfs.open("test2", "wt").close()

# Stat the files and check that test1 is older than test2.
# Stat the files and check mtime is non-zero.
stat1 = vfs.stat("test1")
stat2 = vfs.stat("test2")
print(stat1[8] != 0, stat2[8] != 0)

# Check that test1 has mtime which matches time.time() at point of creation.
print(current_time <= stat1[8] <= current_time + 1)

# Check that test1 is older than test2.
print(stat1[8] < stat2[8])

# Wait 1 second so mtime will increase by at least 1.
Expand Down
1 change: 1 addition & 0 deletions tests/extmod/vfs_lfs_mtime.py.exp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ True True
True
True
True
True
mtime=False
True
True
Expand Down

0 comments on commit 0e6ef40

Please sign in to comment.