tests/extmod/vfs_blockdev_invalid.py: Handle low memory conditions.

This commit modifies the "extmod/vfs_blockdev_invalid" test to better
behave on boards with low available memory.

Before these changes the test would fail on ESP8266 (at least), due to
low memory, but in a way that could not be easily solved as the error
occurred in the middle of the test.

The test has been rewritten to delay its output until the very end, so
if a low memory condition occurs and needs to stop execution then no
real output will show up before the skip marker.

Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit is contained in:
Alessandro Gatti
2025-12-10 05:59:16 +01:00
committed by Damien George
parent 750a366f20
commit dbf59db5a1
2 changed files with 41 additions and 42 deletions

View File

@@ -46,12 +46,16 @@ class RAMBlockDevice:
try:
bdev = RAMBlockDevice(50)
except MemoryError:
print("SKIP")
print("SKIP-TOO-LARGE")
raise SystemExit
def test(vfs_class):
print(vfs_class)
ERROR_EIO = (OSError, "[Errno 5] EIO")
ERROR_EINVAL = (OSError, "[Errno 22] EINVAL")
ERROR_TYPE = (TypeError, "can't convert str to int")
def test(vfs_class, test_data):
bdev.read_res = 0 # reset function results
bdev.write_res = 0
@@ -61,17 +65,15 @@ def test(vfs_class):
with fs.open("test", "w") as f:
f.write("a" * 64)
for res in (0, -5, 5, 33, "invalid"):
# -5 is a legitimate negative failure (EIO), positive integer
# is not
for res, error_open, error_read in test_data:
# This variant will fail on open
bdev.read_res = res
try:
with fs.open("test", "r") as f:
print("opened")
assert error_open is None
except Exception as e:
print(type(e), e)
assert error_open is not None
assert (type(e), str(e)) == error_open
# This variant should succeed on open, may fail on read
# unless the filesystem cached the contents already
@@ -79,11 +81,35 @@ def test(vfs_class):
try:
with fs.open("test", "r") as f:
bdev.read_res = res
print("read 1", f.read(1))
print("read rest", f.read())
assert f.read(1) == "a"
assert f.read() == "a" * 63
assert error_read is None
except Exception as e:
print(type(e), e)
assert error_read is not None
assert (type(e), str(e)) == error_read
test(vfs.VfsLfs2)
test(vfs.VfsFat)
try:
test(
vfs.VfsLfs2,
(
(0, None, None),
(-5, ERROR_EIO, None),
(5, ERROR_EINVAL, None),
(33, ERROR_EINVAL, None),
("invalid", ERROR_TYPE, None),
),
)
test(
vfs.VfsFat,
(
(0, None, None),
(-5, ERROR_EIO, ERROR_EIO),
(5, ERROR_EIO, ERROR_EIO),
(33, ERROR_EIO, ERROR_EIO),
("invalid", ERROR_TYPE, ERROR_TYPE),
),
)
print("OK")
except MemoryError:
print("SKIP-TOO-LARGE")

View File

@@ -1,28 +1 @@
<class 'VfsLfs2'>
opened
read 1 a
read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
<class 'OSError'> [Errno 5] EIO
read 1 a
read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
<class 'OSError'> [Errno 22] EINVAL
read 1 a
read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
<class 'OSError'> [Errno 22] EINVAL
read 1 a
read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
<class 'TypeError'> can't convert str to int
read 1 a
read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
<class 'VfsFat'>
opened
read 1 a
read rest aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
<class 'OSError'> [Errno 5] EIO
<class 'OSError'> [Errno 5] EIO
<class 'OSError'> [Errno 5] EIO
<class 'OSError'> [Errno 5] EIO
<class 'OSError'> [Errno 5] EIO
<class 'OSError'> [Errno 5] EIO
<class 'TypeError'> can't convert str to int
<class 'TypeError'> can't convert str to int
OK