summaryrefslogtreecommitdiff
path: root/tests/micropython/extreme_exc.py
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-04-05 01:06:40 +1000
committerDamien George <damien.p.george@gmail.com>2018-04-05 01:06:40 +1000
commit5995a199a327b81553189d53035c586d7b0249dc (patch)
treecb12d9e7061717afa9b0bd61338c18efd412a8d5 /tests/micropython/extreme_exc.py
parent1bfc774a086127cce539d50c1c1baedd5f609d41 (diff)
tests/micropython: Add set of tests for extreme cases of raising exc's.
Diffstat (limited to 'tests/micropython/extreme_exc.py')
-rw-r--r--tests/micropython/extreme_exc.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/tests/micropython/extreme_exc.py b/tests/micropython/extreme_exc.py
new file mode 100644
index 000000000..c180f7cc1
--- /dev/null
+++ b/tests/micropython/extreme_exc.py
@@ -0,0 +1,75 @@
+# test some extreme cases of allocating exceptions and tracebacks
+
+import micropython
+
+# some ports need to allocate heap for the emergency exception
+try:
+ micropython.alloc_emergency_exception_buf(256)
+except AttributeError:
+ pass
+
+def main():
+ # create an exception with many args while heap is locked
+ # should revert to empty tuple for args
+ micropython.heap_lock()
+ e = Exception(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
+ micropython.heap_unlock()
+ print(repr(e))
+
+ # create an exception with a long formatted error message while heap is locked
+ # should use emergency exception buffer and truncate the message
+ def f():
+ pass
+ micropython.heap_lock()
+ try:
+ f(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=1)
+ except Exception as er:
+ e = er
+ micropython.heap_unlock()
+ print(repr(e)[:50])
+
+ # create an exception with a long formatted error message while heap is low
+ # should use the heap and truncate the message
+ lst = []
+ while 1:
+ try:
+ lst = [lst]
+ except MemoryError:
+ break
+ try:
+ f(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=1)
+ except Exception as er:
+ e = er
+ lst = None
+ print(repr(e))
+
+ # raise a deep exception with the heap locked
+ # should use emergency exception and be unable to resize traceback array
+ def g():
+ g()
+ micropython.heap_lock()
+ try:
+ g()
+ except Exception as er:
+ e = er
+ micropython.heap_unlock()
+ print(repr(e))
+
+ # create an exception on the heap with some traceback on the heap, but then
+ # raise it with the heap locked so it can't allocate any more traceback
+ exc = Exception('my exception')
+ try:
+ raise exc
+ except:
+ pass
+ def h(e):
+ raise e
+ micropython.heap_lock()
+ try:
+ h(exc)
+ except Exception as er:
+ e = er
+ micropython.heap_unlock()
+ print(repr(e))
+
+main()