From 65779c624776e9775102bc10862db5ac66d7fa64 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 | 49 ++++++++++--------- .../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 | 44 ++++++++++------- .../viper_ptr8_store_boundary.py.exp | 26 ++++++---- 6 files changed, 129 insertions(+), 90 deletions(-) diff --git a/tests/micropython/viper_ptr16_store_boundary.py b/tests/micropython/viper_ptr16_store_boundary.py index 3501a05685ec3..2787df957fd77 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,29 +29,35 @@ def next_value() -> uint: return output & MASK -@micropython.viper -def set_index(dest: ptr16, i: int, val: uint): - saved = dest - dest[i] = val - assert int(saved) == int(dest) - - def get_index(src, i): return src[i * SIZE] + (src[(i * SIZE) + 1] << 8) -buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 1024) +try: + + @micropython.viper + def set_index(dest: ptr16, i: int, val: uint): + saved = dest + dest[i] = val + assert int(saved) == int(dest) + + buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 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): + locals()["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 1c084da2d9c0f..007a50b3edafb 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 8c207278ec538..284834a1f880a 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) +try: + + @micropython.viper + def set_index(dest: ptr32, i: int, val: uint): + saved = dest + dest[i] = val + assert int(dest) == int(saved) + + buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 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): + locals()["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 67b114d3358ee..7a9a51624743e 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 d3cba17e16318..aa164954610e0 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,25 +29,35 @@ def next_value() -> uint: return output & MASK -@micropython.viper -def set_index(dest: ptr8, i: int, val: uint): - saved = dest - dest[i] = val - assert int(dest) == int(saved) - - def get_index(src: ptr8, i: int): return src[i] -buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 1024) +try: + + @micropython.viper + def set_index(dest: ptr8, i: int, val: uint): + saved = dest + dest[i] = val + assert int(dest) == int(saved) + + buffer = bytearray(((1 << max(BIT_THRESHOLDS) + 1) // 1024) * 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)), ((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): + locals()["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 6b0f7ce13e8cf..621295d81a896 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