tests/micropython: Make tests behave in low memory condition.
Some checks failed
JavaScript code lint and formatting with Biome / eslint (push) Has been cancelled
Check code formatting / code-formatting (push) Has been cancelled
Check spelling with codespell / codespell (push) Has been cancelled
Build docs / build (push) Has been cancelled
Check examples / embedding (push) Has been cancelled
Package mpremote / build (push) Has been cancelled
.mpy file format and tools / test (push) Has been cancelled
Build ports metadata / build (push) Has been cancelled
alif port / build_alif (alif_ae3_build) (push) Has been cancelled
cc3200 port / build (push) Has been cancelled
esp32 port / build_idf (esp32_build_c2_c6) (push) Has been cancelled
esp32 port / build_idf (esp32_build_cmod_spiram_s2) (push) Has been cancelled
esp32 port / build_idf (esp32_build_s3_c3) (push) Has been cancelled
esp8266 port / build (push) Has been cancelled
mimxrt port / build (push) Has been cancelled
nrf port / build (push) Has been cancelled
powerpc port / build (push) Has been cancelled
qemu port / build_and_test_arm (bigendian) (push) Has been cancelled
qemu port / build_and_test_arm (sabrelite) (push) Has been cancelled
qemu port / build_and_test_arm (thumb) (push) Has been cancelled
qemu port / build_and_test_rv32 (push) Has been cancelled
renesas-ra port / build_renesas_ra_board (push) Has been cancelled
rp2 port / build (push) Has been cancelled
samd port / build (push) Has been cancelled
stm32 port / build_stm32 (stm32_misc_build) (push) Has been cancelled
stm32 port / build_stm32 (stm32_nucleo_build) (push) Has been cancelled
stm32 port / build_stm32 (stm32_pyb_build) (push) Has been cancelled
unix port / minimal (push) Has been cancelled
unix port / reproducible (push) Has been cancelled
unix port / standard (push) Has been cancelled
unix port / standard_v2 (push) Has been cancelled
unix port / coverage (push) Has been cancelled
unix port / coverage_32bit (push) Has been cancelled
unix port / nanbox (push) Has been cancelled
unix port / longlong (push) Has been cancelled
unix port / float (push) Has been cancelled
unix port / gil_enabled (push) Has been cancelled
unix port / stackless_clang (push) Has been cancelled
unix port / float_clang (push) Has been cancelled
unix port / settrace_stackless (push) Has been cancelled
unix port / macos (push) Has been cancelled
unix port / qemu_mips (push) Has been cancelled
unix port / qemu_arm (push) Has been cancelled
unix port / qemu_riscv64 (push) Has been cancelled
unix port / sanitize_address (push) Has been cancelled
unix port / sanitize_undefined (push) Has been cancelled
webassembly port / build (push) Has been cancelled
windows port / build-vs (Debug, x64, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Debug, x64, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Debug, x86, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Debug, x86, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, x64, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, x64, dev, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, x64, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, x64, standard, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, x64, standard, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, x64, standard, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, x86, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, x86, dev, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, x86, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, x86, standard, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, x86, standard, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, x86, standard, 2022, [17, 18)) (push) Has been cancelled
windows port / build-mingw (i686, mingw32, dev) (push) Has been cancelled
windows port / build-mingw (i686, mingw32, standard) (push) Has been cancelled
windows port / build-mingw (x86_64, mingw64, dev) (push) Has been cancelled
windows port / build-mingw (x86_64, mingw64, standard) (push) Has been cancelled
windows port / cross-build-on-linux (push) Has been cancelled
zephyr port / build (push) Has been cancelled
Python code lint and formatting with ruff / ruff (push) Has been cancelled

This commit changes the "viper_ptr*_store_boundary" tests to make them
fail more gracefully in low memory conditions.

The original version of the tests compiled viper code blocks on the fly
when it needed them, making them fail at runtime on some boards that do
not come with enough memory for this test.  This clashes with
"run-tests.py"'s ability to look for a particular signature to mark
tests as skipped due to not enough memory.

Now compiled code blocks are generated at the beginning of the test
inside an appropriate exception handler.  In case of a memory error when
pre-compiling a code block, the running test exits reporting a low
memory condition to the test runner.  This allows to have clean test
runs on all platforms when it comes to viper pointer tests.

Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit is contained in:
Alessandro Gatti
2025-08-19 14:06:42 +02:00
committed by Damien George
parent 1df5ee12e8
commit b0fd0079f4
6 changed files with 119 additions and 80 deletions

View File

@@ -6,15 +6,12 @@ def set{off}(dest: ptr16):
saved = dest
dest[{off}] = {val}
assert int(saved) == int(dest)
set{off}(buffer)
print(hex(get_index(buffer, {off})))
"""
BIT_THRESHOLDS = (5, 8, 11, 12)
SIZE = 2
MASK = (1 << (8 * SIZE)) - 1
next_int = 1
test_buffer = bytearray(SIZE)
@@ -32,6 +29,10 @@ def next_value() -> uint:
return output & MASK
def get_index(src, i):
return src[i * SIZE] + (src[(i * SIZE) + 1] << 8)
@micropython.viper
def set_index(dest: ptr16, i: int, val: uint):
saved = dest
@@ -39,22 +40,24 @@ def set_index(dest: ptr16, i: int, val: uint):
assert int(saved) == int(dest)
def get_index(src, i):
return src[i * SIZE] + (src[(i * SIZE) + 1] << 8)
try:
buffer = bytearray((((1 << max(BIT_THRESHOLDS)) // 1024) + 1) * 1024)
for bit in BIT_THRESHOLDS:
offset = (1 << bit) - (2 * SIZE)
for index in range(0, 3 * SIZE, SIZE):
exec(SET_TEMPLATE.format(off=(offset + index) // SIZE, val=next_value()))
except MemoryError:
print("SKIP-TOO-LARGE")
raise SystemExit
buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 1024)
for bit in BIT_THRESHOLDS:
print("---", bit)
pre, idx, post = (
(((1 << bit) - (2 * SIZE)) // SIZE),
(((1 << bit) - (1 * SIZE)) // SIZE),
((1 << bit) // SIZE),
)
set_index(buffer, pre, next_value())
set_index(buffer, idx, next_value())
set_index(buffer, post, next_value())
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
exec(SET_TEMPLATE.format(off=pre, val=next_value()))
exec(SET_TEMPLATE.format(off=idx, val=next_value()))
exec(SET_TEMPLATE.format(off=post, val=next_value()))
offset = (1 << bit) - (2 * SIZE)
for index in range(0, 3 * SIZE, SIZE):
globals()["set{}".format((offset + index) // SIZE)](buffer)
print(hex(get_index(buffer, (offset + index) // SIZE)))
for index in range(0, 3 * SIZE, SIZE):
set_index(buffer, (offset + index) // SIZE, next_value())
print(hex(get_index(buffer, (offset + index) // SIZE)))

View File

@@ -1,20 +1,28 @@
--- 5
0x1 0x102 0x203
0x1
0x102
0x203
0xc0d
0xd0e
0xe0f
--- 8
0x304
0x405
0x506
--- 8
0x607 0x708 0x809
0x90a
0xa0b
0xb0c
--- 11
0xc0d 0xd0e 0xe0f
0xf10
0x1011
0x1112
--- 11
0x607
0x708
0x809
0x1213
0x1314
0x1415
--- 12
0x1213 0x1314 0x1415
0x90a
0xa0b
0xb0c
0x1516
0x1617
0x1718

View File

@@ -6,8 +6,6 @@ def set{off}(dest: ptr32):
saved = dest
dest[{off}] = {val}
assert int(saved) == int(dest)
set{off}(buffer)
print(hex(get_index(buffer, {off})))
"""
BIT_THRESHOLDS = (5, 8, 11, 12)
@@ -31,13 +29,6 @@ def next_value() -> uint:
return output & MASK
@micropython.viper
def set_index(dest: ptr32, i: int, val: uint):
saved = dest
dest[i] = val
assert int(saved) == int(dest)
def get_index(src, i):
return (
src[i * SIZE]
@@ -47,18 +38,31 @@ def get_index(src, i):
)
buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 1024)
@micropython.viper
def set_index(dest: ptr32, i: int, val: uint):
saved = dest
dest[i] = val
assert int(dest) == int(saved)
try:
buffer = bytearray((((1 << max(BIT_THRESHOLDS)) // 1024) + 1) * 1024)
for bit in BIT_THRESHOLDS:
offset = (1 << bit) - (2 * SIZE)
for index in range(0, 3 * SIZE, SIZE):
exec(SET_TEMPLATE.format(off=(offset + index) // SIZE, val=next_value()))
except MemoryError:
print("SKIP-TOO-LARGE")
raise SystemExit
for bit in BIT_THRESHOLDS:
print("---", bit)
pre, idx, post = (
(((1 << bit) - (2 * SIZE)) // SIZE),
(((1 << bit) - (1 * SIZE)) // SIZE),
((1 << bit) // SIZE),
)
set_index(buffer, pre, next_value())
set_index(buffer, idx, next_value())
set_index(buffer, post, next_value())
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
exec(SET_TEMPLATE.format(off=pre, val=next_value()))
exec(SET_TEMPLATE.format(off=idx, val=next_value()))
exec(SET_TEMPLATE.format(off=post, val=next_value()))
offset = (1 << bit) - (2 * SIZE)
for index in range(0, 3 * SIZE, SIZE):
globals()["set{}".format((offset + index) // SIZE)](buffer)
print(hex(get_index(buffer, (offset + index) // SIZE)))
for index in range(0, 3 * SIZE, SIZE):
set_index(buffer, (offset + index) // SIZE, next_value())
print(hex(get_index(buffer, (offset + index) // SIZE)))

View File

@@ -1,20 +1,28 @@
--- 5
0x1 0x102 0x10203
0x1
0x102
0x10203
0xa0b0c0d
0xb0c0d0e
0xc0d0e0f
--- 8
0x1020304
0x2030405
0x3040506
--- 8
0x4050607 0x5060708 0x6070809
0x708090a
0x8090a0b
0x90a0b0c
--- 11
0xa0b0c0d 0xb0c0d0e 0xc0d0e0f
0xd0e0f10
0xe0f1011
0xf101112
--- 11
0x4050607
0x5060708
0x6070809
0x10111213
0x11121314
0x12131415
--- 12
0x10111213 0x11121314 0x12131415
0x708090a
0x8090a0b
0x90a0b0c
0x13141516
0x14151617
0x15161718

View File

@@ -6,8 +6,6 @@ def set{off}(dest: ptr8):
saved = dest
dest[{off}] = {val}
assert int(saved) == int(dest)
set{off}(buffer)
print(hex(get_index(buffer, {off})))
"""
BIT_THRESHOLDS = (5, 8, 11, 12)
@@ -31,6 +29,10 @@ def next_value() -> uint:
return output & MASK
def get_index(src: ptr8, i: int):
return src[i]
@micropython.viper
def set_index(dest: ptr8, i: int, val: uint):
saved = dest
@@ -38,18 +40,24 @@ def set_index(dest: ptr8, i: int, val: uint):
assert int(dest) == int(saved)
def get_index(src: ptr8, i: int):
return src[i]
try:
buffer = bytearray((((1 << max(BIT_THRESHOLDS)) // 1024) + 1) * 1024)
for bit in BIT_THRESHOLDS:
offset = (1 << bit) - (2 * SIZE)
for index in range(0, 3 * SIZE, SIZE):
exec(SET_TEMPLATE.format(off=(offset + index) // SIZE, val=next_value()))
except MemoryError:
print("SKIP-TOO-LARGE")
raise SystemExit
buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 1024)
for bit in BIT_THRESHOLDS:
print("---", bit)
pre, idx, post = (((1 << bit) - (2 * SIZE)), ((1 << bit) - (1 * SIZE)), (1 << bit))
set_index(buffer, pre, next_value())
set_index(buffer, idx, next_value())
set_index(buffer, post, next_value())
print(hex(get_index(buffer, pre)), hex(get_index(buffer, idx)), hex(get_index(buffer, post)))
exec(SET_TEMPLATE.format(off=pre, val=next_value()))
exec(SET_TEMPLATE.format(off=idx, val=next_value()))
exec(SET_TEMPLATE.format(off=post, val=next_value()))
offset = (1 << bit) - (2 * SIZE)
for index in range(0, 3 * SIZE, SIZE):
globals()["set{}".format((offset + index) // SIZE)](buffer)
print(hex(get_index(buffer, (offset + index) // SIZE)))
for index in range(0, 3 * SIZE, SIZE):
set_index(buffer, (offset + index) // SIZE, next_value())
print(hex(get_index(buffer, (offset + index) // SIZE)))

View File

@@ -1,20 +1,28 @@
--- 5
0x1 0x2 0x3
0x1
0x2
0x3
0xd
0xe
0xf
--- 8
0x4
0x5
0x6
--- 8
0x7 0x8 0x9
0xa
0xb
0xc
--- 11
0xd 0xe 0xf
0x10
0x11
0x12
--- 11
0x7
0x8
0x9
0x13
0x14
0x15
--- 12
0x13 0x14 0x15
0xa
0xb
0xc
0x16
0x17
0x18