summaryrefslogtreecommitdiff
path: root/tests/run-tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run-tests.py')
-rwxr-xr-xtests/run-tests.py104
1 files changed, 94 insertions, 10 deletions
diff --git a/tests/run-tests.py b/tests/run-tests.py
index 60c2c3fe1..35e28aac9 100755
--- a/tests/run-tests.py
+++ b/tests/run-tests.py
@@ -48,6 +48,37 @@ DIFF = os.getenv("MICROPY_DIFF", "diff -u")
# Set PYTHONIOENCODING so that CPython will use utf-8 on systems which set another encoding in the locale
os.environ["PYTHONIOENCODING"] = "utf-8"
+# Code to allow a target MicroPython to import an .mpy from RAM
+injected_import_hook_code = """\
+import usys, uos, uio
+class __File(uio.IOBase):
+ def __init__(self):
+ self.off = 0
+ def ioctl(self, request, arg):
+ return 0
+ def readinto(self, buf):
+ buf[:] = memoryview(__buf)[self.off:self.off + len(buf)]
+ self.off += len(buf)
+ return len(buf)
+class __FS:
+ def mount(self, readonly, mkfs):
+ pass
+ def umount(self):
+ pass
+ def chdir(self, path):
+ pass
+ def stat(self, path):
+ if path == '__injected_test.mpy':
+ return tuple(0 for _ in range(10))
+ else:
+ raise OSError(-2) # ENOENT
+ def open(self, path, mode):
+ return __File()
+uos.mount(__FS(), '/__vfstest')
+uos.chdir('/__vfstest')
+__import__('__injected_test')
+"""
+
def rm_f(fname):
if os.path.exists(fname):
@@ -74,6 +105,59 @@ def convert_regex_escapes(line):
return bytes("".join(cs), "utf8")
+def prepare_script_for_target(args, *, script_filename=None, script_text=None, force_plain=False):
+ if force_plain or (not args.via_mpy and args.emit == "bytecode"):
+ if script_filename is not None:
+ with open(script_filename, "rb") as f:
+ script_text = f.read()
+ elif args.via_mpy:
+ tempname = tempfile.mktemp(dir="")
+ mpy_filename = tempname + ".mpy"
+
+ if script_filename is None:
+ script_filename = tempname + ".py"
+ cleanup_script_filename = True
+ with open(script_filename, "wb") as f:
+ f.write(script_text)
+ else:
+ cleanup_script_filename = False
+
+ subprocess.check_output(
+ [MPYCROSS]
+ + args.mpy_cross_flags.split()
+ + ["-o", mpy_filename, "-X", "emit=" + args.emit, script_filename]
+ )
+
+ with open(mpy_filename, "rb") as f:
+ script_text = b"__buf=" + bytes(repr(f.read()), "ascii") + b"\n"
+
+ rm_f(mpy_filename)
+ if cleanup_script_filename:
+ rm_f(script_filename)
+
+ script_text += bytes(injected_import_hook_code, "ascii")
+ else:
+ print("error: using emit={} must go via .mpy".format(args.emit))
+ sys.exit(1)
+
+ return script_text
+
+
+def run_script_on_remote_target(pyb, args, test_file, is_special):
+ script = prepare_script_for_target(args, script_filename=test_file, force_plain=is_special)
+ try:
+ had_crash = False
+ pyb.enter_raw_repl()
+ output_mupy = pyb.exec_(script)
+ except pyboard.PyboardError as e:
+ had_crash = True
+ if not is_special and e.args[0] == "exception":
+ output_mupy = e.args[1] + e.args[2] + b"CRASH"
+ else:
+ output_mupy = bytes(e.args[0], "ascii") + b"\nCRASH"
+ return had_crash, output_mupy
+
+
def run_micropython(pyb, args, test_file, is_special=False):
special_tests = (
"micropython/meminfo.py",
@@ -196,16 +280,8 @@ def run_micropython(pyb, args, test_file, is_special=False):
rm_f(mpy_filename)
else:
- # run on pyboard
- pyb.enter_raw_repl()
- try:
- output_mupy = pyb.execfile(test_file)
- except pyboard.PyboardError as e:
- had_crash = True
- if not is_special and e.args[0] == "exception":
- output_mupy = e.args[1] + e.args[2] + b"CRASH"
- else:
- output_mupy = bytes(e.args[0], "ascii") + b"\nCRASH"
+ # run via pyboard interface
+ had_crash, output_mupy = run_script_on_remote_target(pyb, args, test_file, is_special)
# canonical form for all ports/platforms is to use \n for end-of-line
output_mupy = output_mupy.replace(b"\r\n", b"\n")
@@ -818,6 +894,14 @@ the last matching regex is used:
sys.path.append(base_path("../tools"))
import pyboard
+ if not args.mpy_cross_flags:
+ if args.target == "esp8266":
+ args.mpy_cross_flags = "-march=xtensa"
+ elif args.target == "esp32":
+ args.mpy_cross_flags = "-march=xtensawin"
+ else:
+ args.mpy_cross_flags = "-march=armv7m"
+
pyb = pyboard.Pyboard(args.device, args.baudrate, args.user, args.password)
pyb.enter_raw_repl()
else: