summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2018-04-02 19:19:43 -0400
committerDan Halbert <halbert@halwitz.org>2018-04-02 19:19:43 -0400
commit435e894fa0ec5e9ce82b7bdef308413c6731e06a (patch)
treeaf8d62363157a6ba969684538e012871a88224c6 /tests
parentd005b123267ab4ac2f0471c730b762cc3e94232c (diff)
parent98c7d70fe406d66d80c3c9cc888602f96cf444c4 (diff)
Merge branch 'master' into 3.0_hid
Diffstat (limited to 'tests')
-rw-r--r--tests/basics/array_micropython.py6
-rw-r--r--tests/basics/array_mul.py28
-rw-r--r--tests/basics/builtin_pow3.py5
-rw-r--r--tests/basics/class_super.py7
-rw-r--r--tests/basics/core_class_superproperty.py (renamed from tests/cpydiff/core_class_superproperty.py)5
-rw-r--r--tests/basics/fun_calldblstar.py7
-rw-r--r--tests/basics/gen_stack_overflow.py7
-rw-r--r--tests/basics/string_find.py1
-rw-r--r--tests/basics/string_rfind.py1
-rw-r--r--tests/basics/struct_micropython.py6
-rw-r--r--tests/basics/types3.py20
-rw-r--r--tests/extmod/vfs_fat_fileio1.py6
-rw-r--r--tests/extmod/vfs_fat_fileio1.py.exp2
-rw-r--r--tests/extmod/vfs_fat_ramdisk.py2
-rw-r--r--tests/extmod/vfs_fat_ramdisk.py.exp1
-rwxr-xr-xtests/run-tests69
16 files changed, 143 insertions, 30 deletions
diff --git a/tests/basics/array_micropython.py b/tests/basics/array_micropython.py
index e26ad7ae9..b92c5a9b9 100644
--- a/tests/basics/array_micropython.py
+++ b/tests/basics/array_micropython.py
@@ -5,6 +5,12 @@ except ImportError:
print("SKIP")
raise SystemExit
+try:
+ array.array('O')
+except ValueError:
+ print("SKIP")
+ raise SystemExit
+
# arrays of objects
a = array.array('O')
a.append(1)
diff --git a/tests/basics/array_mul.py b/tests/basics/array_mul.py
new file mode 100644
index 000000000..bb5f3aa6b
--- /dev/null
+++ b/tests/basics/array_mul.py
@@ -0,0 +1,28 @@
+try:
+ import array
+except ImportError:
+ print("SKIP")
+ raise SystemExit
+
+a1 = array.array('I', [1])
+a2 = array.array('I', [2]) * 2
+a3 = (a1 + a2)
+print(a3)
+
+a3 *= 5
+print(a3)
+
+a3 *= 0
+print(a3)
+
+a4 = a2 * 0
+print(a4)
+
+a4 *= 0
+print(a4)
+
+a4 = a4 * 2
+print(a4)
+
+a4 *= 2
+print(a4)
diff --git a/tests/basics/builtin_pow3.py b/tests/basics/builtin_pow3.py
index 69b57e548..293a5acc9 100644
--- a/tests/basics/builtin_pow3.py
+++ b/tests/basics/builtin_pow3.py
@@ -22,3 +22,8 @@ try:
print(pow(4, 5, "z"))
except TypeError:
print("TypeError expected")
+
+try:
+ print(pow(4, 5, 0))
+except ValueError:
+ print("ValueError expected")
diff --git a/tests/basics/class_super.py b/tests/basics/class_super.py
index 1338ef452..5a18017ac 100644
--- a/tests/basics/class_super.py
+++ b/tests/basics/class_super.py
@@ -34,3 +34,10 @@ class B(A):
print(super().bar) # accessing attribute after super()
return super().foo().count(2) # calling a subsequent method
print(B().foo())
+
+try:
+ super(1, 1).x
+except TypeError:
+ print(True)
+else:
+ print(False)
diff --git a/tests/cpydiff/core_class_superproperty.py b/tests/basics/core_class_superproperty.py
index 1ec210550..69db10046 100644
--- a/tests/cpydiff/core_class_superproperty.py
+++ b/tests/basics/core_class_superproperty.py
@@ -1,8 +1,5 @@
"""
-categories: Core,Classes
-description: Calling super() getter property in subclass will return a property object, not the value
-cause: Unknown
-workaround: Unknown
+test that calling super() getter property in subclass will return the value
"""
class A:
@property
diff --git a/tests/basics/fun_calldblstar.py b/tests/basics/fun_calldblstar.py
index aae9828cf..15038b2f5 100644
--- a/tests/basics/fun_calldblstar.py
+++ b/tests/basics/fun_calldblstar.py
@@ -15,3 +15,10 @@ class A:
a = A()
a.f(1, **{'b':2})
a.f(1, **{'b':val for val in range(1)})
+
+try:
+ f(1, **{len: 1})
+except TypeError:
+ print(True)
+else:
+ print(False)
diff --git a/tests/basics/gen_stack_overflow.py b/tests/basics/gen_stack_overflow.py
new file mode 100644
index 000000000..5cba0e054
--- /dev/null
+++ b/tests/basics/gen_stack_overflow.py
@@ -0,0 +1,7 @@
+def gen():
+ yield from gen()
+
+try:
+ print(list(gen()))
+except RuntimeError:
+ print("RuntimeError")
diff --git a/tests/basics/string_find.py b/tests/basics/string_find.py
index 4a206eb0e..f9fcad3e5 100644
--- a/tests/basics/string_find.py
+++ b/tests/basics/string_find.py
@@ -21,6 +21,7 @@ print("0000".find('-1', 3))
print("0000".find('1', 3))
print("0000".find('1', 4))
print("0000".find('1', 5))
+print("aaaaaaaaaaa".find("bbb", 9, 2))
try:
'abc'.find(1)
diff --git a/tests/basics/string_rfind.py b/tests/basics/string_rfind.py
index 4d0e84018..54269d6f5 100644
--- a/tests/basics/string_rfind.py
+++ b/tests/basics/string_rfind.py
@@ -21,3 +21,4 @@ print("0000".rfind('-1', 3))
print("0000".rfind('1', 3))
print("0000".rfind('1', 4))
print("0000".rfind('1', 5))
+print("aaaaaaaaaaa".rfind("bbb", 9, 2))
diff --git a/tests/basics/struct_micropython.py b/tests/basics/struct_micropython.py
index f203a4666..e72153071 100644
--- a/tests/basics/struct_micropython.py
+++ b/tests/basics/struct_micropython.py
@@ -9,6 +9,12 @@ except:
print("SKIP")
raise SystemExit
+try:
+ struct.pack('O', None)
+except ValueError:
+ print("SKIP")
+ raise SystemExit
+
class A():
pass
diff --git a/tests/basics/types3.py b/tests/basics/types3.py
new file mode 100644
index 000000000..71f790692
--- /dev/null
+++ b/tests/basics/types3.py
@@ -0,0 +1,20 @@
+try:
+ type('abc', None, None)
+except TypeError:
+ print(True)
+else:
+ print(False)
+
+try:
+ type('abc', (), None)
+except TypeError:
+ print(True)
+else:
+ print(False)
+
+try:
+ type('abc', (1,), {})
+except TypeError:
+ print(True)
+else:
+ print(False)
diff --git a/tests/extmod/vfs_fat_fileio1.py b/tests/extmod/vfs_fat_fileio1.py
index d19df120b..8b9ff92eb 100644
--- a/tests/extmod/vfs_fat_fileio1.py
+++ b/tests/extmod/vfs_fat_fileio1.py
@@ -91,10 +91,8 @@ with open("foo_file.txt") as f2:
f2.seek(0, 1) # SEEK_CUR
print(f2.read(1))
- try:
- f2.seek(1, 1) # SEEK_END
- except OSError as e:
- print(e.args[0] == uerrno.EOPNOTSUPP)
+ f2.seek(2, 1) # SEEK_CUR
+ print(f2.read(1))
f2.seek(-2, 2) # SEEK_END
print(f2.read(1))
diff --git a/tests/extmod/vfs_fat_fileio1.py.exp b/tests/extmod/vfs_fat_fileio1.py.exp
index d777585cf..a66f07605 100644
--- a/tests/extmod/vfs_fat_fileio1.py.exp
+++ b/tests/extmod/vfs_fat_fileio1.py.exp
@@ -7,7 +7,7 @@ hello!world!
12
h
e
-True
+o
d
True
[('foo_dir', 16384, 0)]
diff --git a/tests/extmod/vfs_fat_ramdisk.py b/tests/extmod/vfs_fat_ramdisk.py
index 801c69786..896641ab3 100644
--- a/tests/extmod/vfs_fat_ramdisk.py
+++ b/tests/extmod/vfs_fat_ramdisk.py
@@ -54,6 +54,8 @@ print(b"hello!" not in bdev.data)
vfs = uos.VfsFat(bdev)
uos.mount(vfs, "/ramdisk")
+vfs.label = 'label test'
+print("label:", vfs.label)
print("statvfs:", vfs.statvfs("/ramdisk"))
print("getcwd:", vfs.getcwd())
diff --git a/tests/extmod/vfs_fat_ramdisk.py.exp b/tests/extmod/vfs_fat_ramdisk.py.exp
index ccd0f7134..a3c3470a9 100644
--- a/tests/extmod/vfs_fat_ramdisk.py.exp
+++ b/tests/extmod/vfs_fat_ramdisk.py.exp
@@ -1,5 +1,6 @@
True
True
+label: LABEL TEST
statvfs: (512, 512, 16, 16, 16, 0, 0, 0, 0, 255)
getcwd: /
True
diff --git a/tests/run-tests b/tests/run-tests
index f1035c435..bcd2e5dcc 100755
--- a/tests/run-tests
+++ b/tests/run-tests
@@ -6,6 +6,9 @@ import sys
import platform
import argparse
import re
+import threading
+import multiprocessing
+from multiprocessing.pool import ThreadPool
from glob import glob
# Tests require at least CPython 3.3. If your default python3 executable
@@ -197,13 +200,27 @@ def run_micropython(pyb, args, test_file, is_special=False):
def run_feature_check(pyb, args, base_path, test_file):
return run_micropython(pyb, args, base_path + "/feature_check/" + test_file, is_special=True)
+class ThreadSafeCounter:
+ def __init__(self, start=0):
+ self._value = start
+ self._lock = threading.Lock()
-def run_tests(pyb, tests, args, base_path="."):
- test_count = 0
- testcase_count = 0
- passed_count = 0
- failed_tests = []
- skipped_tests = []
+ def add(self, to_add):
+ with self._lock: self._value += to_add
+
+ def append(self, arg):
+ self.add([arg])
+
+ @property
+ def value(self):
+ return self._value
+
+def run_tests(pyb, tests, args, base_path=".", num_threads=1):
+ test_count = ThreadSafeCounter()
+ testcase_count = ThreadSafeCounter()
+ passed_count = ThreadSafeCounter()
+ failed_tests = ThreadSafeCounter([])
+ skipped_tests = ThreadSafeCounter([])
skip_tests = set()
skip_native = False
@@ -328,7 +345,7 @@ def run_tests(pyb, tests, args, base_path="."):
# Remove them from the below when they work
if args.emit == 'native':
skip_tests.update({'basics/%s.py' % t for t in 'gen_yield_from gen_yield_from_close gen_yield_from_ducktype gen_yield_from_exc gen_yield_from_iter gen_yield_from_send gen_yield_from_stopped gen_yield_from_throw gen_yield_from_throw2 gen_yield_from_throw3 generator1 generator2 generator_args generator_close generator_closure generator_exc generator_return generator_send'.split()}) # require yield
- skip_tests.update({'basics/%s.py' % t for t in 'bytes_gen class_store_class globals_del string_join'.split()}) # require yield
+ skip_tests.update({'basics/%s.py' % t for t in 'bytes_gen class_store_class globals_del string_join gen_stack_overflow'.split()}) # require yield
skip_tests.update({'basics/async_%s.py' % t for t in 'def await await2 for for2 with with2'.split()}) # require yield
skip_tests.update({'basics/%s.py' % t for t in 'try_reraise try_reraise2'.split()}) # require raise_varargs
skip_tests.update({'basics/%s.py' % t for t in 'with_break with_continue with_return'.split()}) # require complete with support
@@ -354,7 +371,7 @@ def run_tests(pyb, tests, args, base_path="."):
skip_tests.add('micropython/heapalloc_iter.py') # requires generators
skip_tests.add('micropython/schedule.py') # native code doesn't check pending events
- for test_file in tests:
+ def run_one_test(test_file):
test_file = test_file.replace('\\', '/')
test_basename = os.path.basename(test_file)
test_name = os.path.splitext(test_basename)[0]
@@ -377,7 +394,7 @@ def run_tests(pyb, tests, args, base_path="."):
if skip_it:
print("skip ", test_file)
skipped_tests.append(test_name)
- continue
+ return
# get expected output
test_file_expected = test_file + '.exp'
@@ -405,7 +422,7 @@ def run_tests(pyb, tests, args, base_path="."):
output_expected = output_expected.replace(b'\r\n', b'\n')
if args.write_exp:
- continue
+ return
# run MicroPython
output_mupy = run_micropython(pyb, args, test_file)
@@ -413,16 +430,16 @@ def run_tests(pyb, tests, args, base_path="."):
if output_mupy == b'SKIP\n':
print("skip ", test_file)
skipped_tests.append(test_name)
- continue
+ return
- testcase_count += len(output_expected.splitlines())
+ testcase_count.add(len(output_expected.splitlines()))
filename_expected = test_basename + ".exp"
filename_mupy = test_basename + ".out"
if output_expected == output_mupy:
print("pass ", test_file)
- passed_count += 1
+ passed_count.add(1)
rm_f(filename_expected)
rm_f(filename_mupy)
else:
@@ -437,15 +454,22 @@ def run_tests(pyb, tests, args, base_path="."):
print("FAIL ", test_file)
failed_tests.append(test_name)
- test_count += 1
+ test_count.add(1)
+
+ if num_threads > 1:
+ pool = ThreadPool(num_threads)
+ pool.map(run_one_test, tests)
+ else:
+ for test in tests:
+ run_one_test(test)
- print("{} tests performed ({} individual testcases)".format(test_count, testcase_count))
- print("{} tests passed".format(passed_count))
+ print("{} tests performed ({} individual testcases)".format(test_count.value, testcase_count.value))
+ print("{} tests passed".format(passed_count.value))
- if len(skipped_tests) > 0:
- print("{} tests skipped: {}".format(len(skipped_tests), ' '.join(skipped_tests)))
- if len(failed_tests) > 0:
- print("{} tests failed: {}".format(len(failed_tests), ' '.join(failed_tests)))
+ if len(skipped_tests.value) > 0:
+ print("{} tests skipped: {}".format(len(skipped_tests.value), ' '.join(sorted(skipped_tests.value))))
+ if len(failed_tests.value) > 0:
+ print("{} tests failed: {}".format(len(failed_tests.value), ' '.join(sorted(failed_tests.value))))
return False
# all tests succeeded
@@ -464,11 +488,14 @@ def main():
cmd_parser.add_argument('--heapsize', help='heapsize to use (use default if not specified)')
cmd_parser.add_argument('--via-mpy', action='store_true', help='compile .py files to .mpy first')
cmd_parser.add_argument('--keep-path', action='store_true', help='do not clear MICROPYPATH when running tests')
+ cmd_parser.add_argument('-j', '--jobs', default=1, metavar='N', type=int, help='Number of tests to run simultaneously')
+ cmd_parser.add_argument('--auto-jobs', action='store_const', dest='jobs', const=multiprocessing.cpu_count(), help='Set the -j values to the CPU (thread) count')
cmd_parser.add_argument('files', nargs='*', help='input test files')
args = cmd_parser.parse_args()
EXTERNAL_TARGETS = ('pyboard', 'wipy', 'esp8266', 'minimal')
if args.target in EXTERNAL_TARGETS:
+ args.jobs = 1
import pyboard
pyb = pyboard.Pyboard(args.device, args.baudrate, args.user, args.password)
pyb.enter_raw_repl()
@@ -507,7 +534,7 @@ def main():
# run-tests script itself.
base_path = os.path.dirname(sys.argv[0]) or "."
try:
- res = run_tests(pyb, tests, args, base_path)
+ res = run_tests(pyb, tests, args, base_path, args.jobs)
finally:
if pyb:
pyb.close()