summaryrefslogtreecommitdiff
path: root/tests/micropython
diff options
context:
space:
mode:
authorJim Mussared <jim.mussared@gmail.com>2020-01-29 14:27:33 +1100
committerDamien George <damien.p.george@gmail.com>2020-04-05 15:02:06 +1000
commit85858e72dfdc3e941c2e620e94de05ad663138b1 (patch)
treed801c11e07380213b7e2abbb3066e2a90636369c /tests/micropython
parent92c83bd16b55daf81157100243ded6d7d0e56538 (diff)
py/objexcept: Allow compression of exception message text.
The decompression of error-strings is only done if the string is accessed via printing or via er.args. Tests are added for this feature to ensure the decompression works.
Diffstat (limited to 'tests/micropython')
-rw-r--r--tests/micropython/heapalloc_exc_compressed.py48
-rw-r--r--tests/micropython/heapalloc_exc_compressed.py.exp6
-rw-r--r--tests/micropython/heapalloc_exc_compressed_emg_exc.py41
-rw-r--r--tests/micropython/heapalloc_exc_compressed_emg_exc.py.exp4
4 files changed, 99 insertions, 0 deletions
diff --git a/tests/micropython/heapalloc_exc_compressed.py b/tests/micropython/heapalloc_exc_compressed.py
new file mode 100644
index 000000000..79e423ca0
--- /dev/null
+++ b/tests/micropython/heapalloc_exc_compressed.py
@@ -0,0 +1,48 @@
+import micropython
+
+# Tests both code paths for built-in exception raising.
+# mp_obj_new_exception_msg_varg (exception requires decompression at raise-time to format)
+# mp_obj_new_exception_msg (decompression can be deferred)
+
+# NameError uses mp_obj_new_exception_msg_varg for NameError("name '%q' isn't defined")
+# set.pop uses mp_obj_new_exception_msg for KeyError("pop from an empty set")
+
+# Tests that deferred decompression works both via print(e) and accessing the message directly via e.args.
+
+a = set()
+
+# First test the regular case (can use heap for allocating the decompression buffer).
+try:
+ name()
+except NameError as e:
+ print(type(e).__name__, e)
+
+try:
+ a.pop()
+except KeyError as e:
+ print(type(e).__name__, e)
+
+try:
+ name()
+except NameError as e:
+ print(e.args[0])
+
+try:
+ a.pop()
+except KeyError as e:
+ print(e.args[0])
+
+# Then test that it still works when the heap is locked (i.e. in ISR context).
+micropython.heap_lock()
+
+try:
+ name()
+except NameError as e:
+ print(type(e).__name__)
+
+try:
+ a.pop()
+except KeyError as e:
+ print(type(e).__name__)
+
+micropython.heap_unlock()
diff --git a/tests/micropython/heapalloc_exc_compressed.py.exp b/tests/micropython/heapalloc_exc_compressed.py.exp
new file mode 100644
index 000000000..32d1642f8
--- /dev/null
+++ b/tests/micropython/heapalloc_exc_compressed.py.exp
@@ -0,0 +1,6 @@
+NameError name 'name' isn't defined
+KeyError pop from an empty set
+name 'name' isn't defined
+pop from an empty set
+NameError
+KeyError
diff --git a/tests/micropython/heapalloc_exc_compressed_emg_exc.py b/tests/micropython/heapalloc_exc_compressed_emg_exc.py
new file mode 100644
index 000000000..86ade0786
--- /dev/null
+++ b/tests/micropython/heapalloc_exc_compressed_emg_exc.py
@@ -0,0 +1,41 @@
+import micropython
+
+# Does the full test from heapalloc_exc_compressed.py but while the heap is
+# locked (this can only work when the emergency exception buf is enabled).
+
+# Some ports need to allocate heap for the emgergency exception buffer.
+try:
+ micropython.alloc_emergency_exception_buf(256)
+except AttributeError:
+ pass
+
+a = set()
+
+
+def test():
+ micropython.heap_lock()
+
+ try:
+ name()
+ except NameError as e:
+ print(type(e).__name__, e)
+
+ try:
+ a.pop()
+ except KeyError as e:
+ print(type(e).__name__, e)
+
+ try:
+ name()
+ except NameError as e:
+ print(e.args[0])
+
+ try:
+ a.pop()
+ except KeyError as e:
+ print(e.args[0])
+
+ micropython.heap_unlock()
+
+
+test()
diff --git a/tests/micropython/heapalloc_exc_compressed_emg_exc.py.exp b/tests/micropython/heapalloc_exc_compressed_emg_exc.py.exp
new file mode 100644
index 000000000..7c368712a
--- /dev/null
+++ b/tests/micropython/heapalloc_exc_compressed_emg_exc.py.exp
@@ -0,0 +1,4 @@
+NameError name 'name' isn't defined
+KeyError pop from an empty set
+name 'name' isn't defined
+pop from an empty set