summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/extmod/marshal_basic.py38
-rw-r--r--tests/extmod/marshal_micropython.py21
-rw-r--r--tests/extmod/marshal_stress.py122
-rw-r--r--tests/ports/unix/extra_coverage.py.exp10
4 files changed, 186 insertions, 5 deletions
diff --git a/tests/extmod/marshal_basic.py b/tests/extmod/marshal_basic.py
new file mode 100644
index 000000000..9e7b70be4
--- /dev/null
+++ b/tests/extmod/marshal_basic.py
@@ -0,0 +1,38 @@
+# Test the marshal module, basic functionality.
+
+try:
+ import marshal
+
+ (lambda: 0).__code__
+except (AttributeError, ImportError):
+ print("SKIP")
+ raise SystemExit
+
+ftype = type(lambda: 0)
+
+# Test basic dumps and loads.
+print(ftype(marshal.loads(marshal.dumps((lambda: a).__code__)), {"a": 4})())
+
+# Test dumps of a result from compile().
+ftype(marshal.loads(marshal.dumps(compile("print(a)", "", "exec"))), {"print": print, "a": 5})()
+
+# Test marshalling a function with arguments.
+print(ftype(marshal.loads(marshal.dumps((lambda x, y: x + y).__code__)), {})(1, 2))
+
+# Test marshalling a function with default arguments.
+print(ftype(marshal.loads(marshal.dumps((lambda x=0: x).__code__)), {})("arg"))
+
+# Test marshalling a function containing constant objects (a tuple).
+print(ftype(marshal.loads(marshal.dumps((lambda: (None, ...)).__code__)), {})())
+
+# Test instantiating multiple code's with different globals dicts.
+code = marshal.loads(marshal.dumps((lambda: a).__code__))
+f1 = ftype(code, {"a": 1})
+f2 = ftype(code, {"a": 2})
+print(f1(), f2())
+
+# Test unmarshallable object.
+try:
+ marshal.dumps(type)
+except ValueError:
+ print("ValueError")
diff --git a/tests/extmod/marshal_micropython.py b/tests/extmod/marshal_micropython.py
new file mode 100644
index 000000000..213b3bf31
--- /dev/null
+++ b/tests/extmod/marshal_micropython.py
@@ -0,0 +1,21 @@
+# Test the marshal module, MicroPython-specific functionality.
+
+try:
+ import marshal
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+import unittest
+
+
+class Test(unittest.TestCase):
+ def test_function_with_children(self):
+ # Can't marshal a function with children (in this case the module has a child function f).
+ code = compile("def f(): pass", "", "exec")
+ with self.assertRaises(ValueError):
+ marshal.dumps(code)
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/tests/extmod/marshal_stress.py b/tests/extmod/marshal_stress.py
new file mode 100644
index 000000000..b52475c03
--- /dev/null
+++ b/tests/extmod/marshal_stress.py
@@ -0,0 +1,122 @@
+# Test the marshal module, stressing edge cases.
+
+try:
+ import marshal
+
+ (lambda: 0).__code__
+except (AttributeError, ImportError):
+ print("SKIP")
+ raise SystemExit
+
+ftype = type(lambda: 0)
+
+# Test a large function.
+
+
+def large_function(arg0, arg1, arg2, arg3):
+ # Arguments.
+ print(arg0, arg1, arg2, arg3)
+
+ # Positive medium-sized integer (still a small-int though).
+ print(1234)
+
+ # Negative small-ish integer.
+ print(-20)
+
+ # More than 64 constant objects.
+ x = (0,)
+ x = (1,)
+ x = (2,)
+ x = (3,)
+ x = (4,)
+ x = (5,)
+ x = (6,)
+ x = (7,)
+ x = (8,)
+ x = (9,)
+ x = (10,)
+ x = (11,)
+ x = (12,)
+ x = (13,)
+ x = (14,)
+ x = (15,)
+ x = (16,)
+ x = (17,)
+ x = (18,)
+ x = (19,)
+ x = (20,)
+ x = (21,)
+ x = (22,)
+ x = (23,)
+ x = (24,)
+ x = (25,)
+ x = (26,)
+ x = (27,)
+ x = (28,)
+ x = (29,)
+ x = (30,)
+ x = (31,)
+ x = (32,)
+ x = (33,)
+ x = (34,)
+ x = (35,)
+ x = (36,)
+ x = (37,)
+ x = (38,)
+ x = (39,)
+ x = (40,)
+ x = (41,)
+ x = (42,)
+ x = (43,)
+ x = (44,)
+ x = (45,)
+ x = (46,)
+ x = (47,)
+ x = (48,)
+ x = (49,)
+ x = (50,)
+ x = (51,)
+ x = (52,)
+ x = (53,)
+ x = (54,)
+ x = (55,)
+ x = (56,)
+ x = (57,)
+ x = (58,)
+ x = (59,)
+ x = (60,)
+ x = (61,)
+ x = (62,)
+ x = (63,)
+ x = (64,)
+
+ # Small jump.
+ x = 0
+ while x < 2:
+ print("loop", x)
+ x += 1
+
+ # Large jump.
+ x = 0
+ while x < 2:
+ try:
+ try:
+ try:
+ print
+ except Exception as e:
+ print
+ finally:
+ print
+ except Exception as e:
+ print
+ finally:
+ print
+ except Exception as e:
+ print
+ finally:
+ print("loop", x)
+ x += 1
+
+
+code = marshal.dumps(large_function.__code__)
+ftype(marshal.loads(code), {"print": print})(0, 1, 2, 3)
diff --git a/tests/ports/unix/extra_coverage.py.exp b/tests/ports/unix/extra_coverage.py.exp
index 176db8e9f..5ff947e88 100644
--- a/tests/ports/unix/extra_coverage.py.exp
+++ b/tests/ports/unix/extra_coverage.py.exp
@@ -56,13 +56,13 @@ cmath collections cppexample cryptolib
deflate errno example_package
ffi framebuf gc hashlib
heapq io json machine
-math os platform random
-re select socket struct
-sys termios time tls
-uctypes vfs websocket
+marshal math os platform
+random re select socket
+struct sys termios time
+tls uctypes vfs websocket
me
-micropython machine math
+micropython machine marshal math
argv atexit byteorder exc_info
executable exit getsizeof implementation