summaryrefslogtreecommitdiff
path: root/tests/micropython
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2018-07-30 12:33:44 -0700
committerGitHub <noreply@github.com>2018-07-30 12:33:44 -0700
commita6d94b68453b8535398ff0b61cd6c4a0c7f77f8b (patch)
tree8defd6392975b8145dc11f0cce9c39a4e440b32a /tests/micropython
parent433a29bb70d51abb84c77a911ced43c6ff14706e (diff)
parentb1006170f1dcfa3a9499ef31c19c8f20736b136a (diff)
Merge pull request #1068 from dhalbert/micropython-25ae98f-merge
Micropython 25ae98f merge
Diffstat (limited to 'tests/micropython')
-rw-r--r--tests/micropython/extreme_exc.py85
-rw-r--r--tests/micropython/extreme_exc.py.exp5
-rw-r--r--tests/micropython/heap_lock.py11
-rw-r--r--tests/micropython/heap_lock.py.exp1
-rw-r--r--tests/micropython/heapalloc.py9
-rw-r--r--tests/micropython/heapalloc_exc_raise.py4
-rw-r--r--tests/micropython/heapalloc_iter.py7
-rw-r--r--tests/micropython/heapalloc_super.py9
-rw-r--r--tests/micropython/heapalloc_traceback.py4
-rw-r--r--tests/micropython/heapalloc_traceback.py.exp2
-rw-r--r--tests/micropython/viper_error.py.exp4
11 files changed, 131 insertions, 10 deletions
diff --git a/tests/micropython/extreme_exc.py b/tests/micropython/extreme_exc.py
new file mode 100644
index 000000000..b9db96406
--- /dev/null
+++ b/tests/micropython/extreme_exc.py
@@ -0,0 +1,85 @@
+# test some extreme cases of allocating exceptions and tracebacks
+
+import micropython
+
+# Check for stackless build, which can't call functions without
+# allocating a frame on the heap.
+try:
+ def stackless(): pass
+ micropython.heap_lock(); stackless(); micropython.heap_unlock()
+except RuntimeError:
+ print("SKIP")
+ raise SystemExit
+
+# 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)[:10])
+
+ # 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[0] = None
+ lst = None
+ print(repr(e)[:10])
+
+ # 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)[:13])
+
+ # 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()
diff --git a/tests/micropython/extreme_exc.py.exp b/tests/micropython/extreme_exc.py.exp
new file mode 100644
index 000000000..956257e4c
--- /dev/null
+++ b/tests/micropython/extreme_exc.py.exp
@@ -0,0 +1,5 @@
+Exception()
+TypeError(
+TypeError(
+RuntimeError(
+Exception('my exception',)
diff --git a/tests/micropython/heap_lock.py b/tests/micropython/heap_lock.py
index 0f0a70eff..ca3f5806a 100644
--- a/tests/micropython/heap_lock.py
+++ b/tests/micropython/heap_lock.py
@@ -2,13 +2,24 @@
import micropython
+l = []
+l2 = list(range(100))
+
micropython.heap_lock()
+# general allocation on the heap
try:
print([])
except MemoryError:
print('MemoryError')
+# expansion of a heap block
+try:
+ l.extend(l2)
+except MemoryError:
+ print('MemoryError')
+
micropython.heap_unlock()
+# check that allocation works after an unlock
print([])
diff --git a/tests/micropython/heap_lock.py.exp b/tests/micropython/heap_lock.py.exp
index 67b208cfc..819c32663 100644
--- a/tests/micropython/heap_lock.py.exp
+++ b/tests/micropython/heap_lock.py.exp
@@ -1,2 +1,3 @@
MemoryError
+MemoryError
[]
diff --git a/tests/micropython/heapalloc.py b/tests/micropython/heapalloc.py
index 62f26df6a..f74bb92c8 100644
--- a/tests/micropython/heapalloc.py
+++ b/tests/micropython/heapalloc.py
@@ -2,6 +2,15 @@
import micropython
+# Check for stackless build, which can't call functions without
+# allocating a frame on heap.
+try:
+ def stackless(): pass
+ micropython.heap_lock(); stackless(); micropython.heap_unlock()
+except RuntimeError:
+ print("SKIP")
+ raise SystemExit
+
def f1(a):
print(a)
diff --git a/tests/micropython/heapalloc_exc_raise.py b/tests/micropython/heapalloc_exc_raise.py
index d60e14ce5..fb63a84bf 100644
--- a/tests/micropython/heapalloc_exc_raise.py
+++ b/tests/micropython/heapalloc_exc_raise.py
@@ -5,6 +5,7 @@ import micropython
e = ValueError("error")
def func():
+ micropython.heap_lock()
try:
# This works as is because traceback is not allocated
# if not possible (heap is locked, no memory). If heap
@@ -16,8 +17,7 @@ def func():
raise e
except Exception as e2:
print(e2)
+ micropython.heap_unlock()
-micropython.heap_lock()
func()
print("ok")
-micropython.heap_unlock()
diff --git a/tests/micropython/heapalloc_iter.py b/tests/micropython/heapalloc_iter.py
index 79461f999..163e17211 100644
--- a/tests/micropython/heapalloc_iter.py
+++ b/tests/micropython/heapalloc_iter.py
@@ -1,7 +1,8 @@
# test that iterating doesn't use the heap
try:
+ frozenset
import array
-except ImportError:
+except (NameError, ImportError):
print("SKIP")
raise SystemExit
@@ -11,8 +12,10 @@ except (ImportError, AttributeError):
heap_lock = heap_unlock = lambda:0
def do_iter(l):
+ heap_lock()
for i in l:
print(i)
+ heap_unlock()
def gen_func():
yield 1
@@ -55,7 +58,6 @@ print(sum(t))
heap_unlock()
# test iterating over collections with the heap locked
-heap_lock()
do_iter(b'123')
do_iter(ba)
do_iter(ar)
@@ -66,4 +68,3 @@ do_iter(s)
do_iter(fs)
do_iter(g1)
do_iter(g2)
-heap_unlock()
diff --git a/tests/micropython/heapalloc_super.py b/tests/micropython/heapalloc_super.py
index 1cf5293d2..a8c23393e 100644
--- a/tests/micropython/heapalloc_super.py
+++ b/tests/micropython/heapalloc_super.py
@@ -1,6 +1,15 @@
# test super() operations which don't require allocation
import micropython
+# Check for stackless build, which can't call functions without
+# allocating a frame on heap.
+try:
+ def stackless(): pass
+ micropython.heap_lock(); stackless(); micropython.heap_unlock()
+except RuntimeError:
+ print("SKIP")
+ raise SystemExit
+
class A:
def foo(self):
print('A foo')
diff --git a/tests/micropython/heapalloc_traceback.py b/tests/micropython/heapalloc_traceback.py
index f4212b6ce..813dea4b2 100644
--- a/tests/micropython/heapalloc_traceback.py
+++ b/tests/micropython/heapalloc_traceback.py
@@ -16,17 +16,17 @@ except:
pass
def test():
+ micropython.heap_lock()
global global_exc
global_exc.__traceback__ = None
try:
raise global_exc
except StopIteration:
print('StopIteration')
+ micropython.heap_unlock()
# call test() with heap allocation disabled
-micropython.heap_lock()
test()
-micropython.heap_unlock()
# print the exception that was raised
buf = uio.StringIO()
diff --git a/tests/micropython/heapalloc_traceback.py.exp b/tests/micropython/heapalloc_traceback.py.exp
index 291bbd697..facd0af13 100644
--- a/tests/micropython/heapalloc_traceback.py.exp
+++ b/tests/micropython/heapalloc_traceback.py.exp
@@ -1,5 +1,5 @@
StopIteration
Traceback (most recent call last):
- File , line 22, in test
+ File , line 23, in test
StopIteration:
diff --git a/tests/micropython/viper_error.py.exp b/tests/micropython/viper_error.py.exp
index 96be5a590..3a8cb0299 100644
--- a/tests/micropython/viper_error.py.exp
+++ b/tests/micropython/viper_error.py.exp
@@ -18,8 +18,8 @@ ViperTypeError('must raise an object',)
ViperTypeError('unary op __pos__ not implemented',)
ViperTypeError('unary op __neg__ not implemented',)
ViperTypeError('unary op __invert__ not implemented',)
-ViperTypeError('binary op __contains__ not implemented',)
+ViperTypeError('binary op not implemented',)
+NotImplementedError('native yield',)
NotImplementedError('native yield',)
-NotImplementedError('native yield from',)
NotImplementedError('conversion to object',)
NotImplementedError('casting',)