From b0fd0079f48bde7f12578823ef88c91f52757cff Mon Sep 17 00:00:00 2001 From: Alessandro Gatti Date: Tue, 19 Aug 2025 14:06:42 +0200 Subject: [PATCH] tests/micropython: Make tests behave in low memory condition. 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 --- .../micropython/viper_ptr16_store_boundary.py | 39 ++++++++------- .../viper_ptr16_store_boundary.py.exp | 26 ++++++---- .../micropython/viper_ptr32_store_boundary.py | 48 ++++++++++--------- .../viper_ptr32_store_boundary.py.exp | 26 ++++++---- .../micropython/viper_ptr8_store_boundary.py | 34 ++++++++----- .../viper_ptr8_store_boundary.py.exp | 26 ++++++---- 6 files changed, 119 insertions(+), 80 deletions(-) diff --git a/tests/micropython/viper_ptr16_store_boundary.py b/tests/micropython/viper_ptr16_store_boundary.py index 3501a05685..7c774d4d1c 100644 --- a/tests/micropython/viper_ptr16_store_boundary.py +++ b/tests/micropython/viper_ptr16_store_boundary.py @@ -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))) diff --git a/tests/micropython/viper_ptr16_store_boundary.py.exp b/tests/micropython/viper_ptr16_store_boundary.py.exp index 1c084da2d9..007a50b3ed 100644 --- a/tests/micropython/viper_ptr16_store_boundary.py.exp +++ b/tests/micropython/viper_ptr16_store_boundary.py.exp @@ -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 diff --git a/tests/micropython/viper_ptr32_store_boundary.py b/tests/micropython/viper_ptr32_store_boundary.py index 8c207278ec..96ca74ad3c 100644 --- a/tests/micropython/viper_ptr32_store_boundary.py +++ b/tests/micropython/viper_ptr32_store_boundary.py @@ -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))) diff --git a/tests/micropython/viper_ptr32_store_boundary.py.exp b/tests/micropython/viper_ptr32_store_boundary.py.exp index 67b114d335..7a9a516247 100644 --- a/tests/micropython/viper_ptr32_store_boundary.py.exp +++ b/tests/micropython/viper_ptr32_store_boundary.py.exp @@ -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 diff --git a/tests/micropython/viper_ptr8_store_boundary.py b/tests/micropython/viper_ptr8_store_boundary.py index d3cba17e16..68b76fd598 100644 --- a/tests/micropython/viper_ptr8_store_boundary.py +++ b/tests/micropython/viper_ptr8_store_boundary.py @@ -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))) diff --git a/tests/micropython/viper_ptr8_store_boundary.py.exp b/tests/micropython/viper_ptr8_store_boundary.py.exp index 6b0f7ce13e..621295d81a 100644 --- a/tests/micropython/viper_ptr8_store_boundary.py.exp +++ b/tests/micropython/viper_ptr8_store_boundary.py.exp @@ -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