summaryrefslogtreecommitdiffstats
path: root/test/run-unit-tests.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/run-unit-tests.py')
-rwxr-xr-xtest/run-unit-tests.py81
1 files changed, 81 insertions, 0 deletions
diff --git a/test/run-unit-tests.py b/test/run-unit-tests.py
new file mode 100755
index 0000000..e6f26c2
--- /dev/null
+++ b/test/run-unit-tests.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+import argparse
+import os
+import pathlib
+import subprocess
+import sys
+try:
+ import colorama as c
+ GREEN = c.Fore.GREEN
+ YELLOW = c.Fore.YELLOW
+ RED = c.Fore.RED
+ RESET_ALL = c.Style.RESET_ALL
+ BRIGHT = c.Style.BRIGHT
+except ImportError:
+ GREEN = YELLOW = RED = RESET_ALL = BRIGHT = ''
+
+class total:
+ total = None
+ good = 0
+ skip = 0
+ fail = 0
+
+def argument_parser():
+ p = argparse.ArgumentParser()
+ p.add_argument('-u', '--unsafe', action='store_true',
+ help='run "unsafe" tests too')
+ p.add_argument('-A', '--artifact_directory',
+ help='store output from failed tests in this dir')
+ return p
+
+opts = argument_parser().parse_args()
+
+unittestdir = pathlib.Path(__file__).parent.absolute() / 'unit-tests'
+
+tests = list(unittestdir.glob('test-*'))
+if opts.unsafe:
+ tests += unittestdir.glob('unsafe/test-*')
+
+if not opts.artifact_directory and os.getenv('ARTIFACT_DIRECTORY'):
+ opts.artifact_directory = os.getenv('ARTIFACT_DIRECTORY')
+
+total.total = len(tests)
+for test in tests:
+ name = os.path.basename(test)
+
+ ex = subprocess.run(test, stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+ if ex.returncode == 0:
+ print(f'{GREEN}PASS: {name}{RESET_ALL}')
+ total.good += 1
+ elif ex.returncode == 77:
+ print(f'{YELLOW}SKIP: {name}{RESET_ALL}')
+ total.skip += 1
+ elif ex.returncode == 127:
+ print(f'{YELLOW}SKIP: {name} (no interpreter) {RESET_ALL}')
+ total.skip += 1
+ else:
+ print(f'{RED}FAIL: {name}{RESET_ALL}')
+ total.fail += 1
+
+ output_file = None
+ if opts.artifact_directory:
+ output_dir = pathlib.Path(opts.artifact_directory) / 'unit-tests'
+ output_dir.mkdir(parents=True, exist_ok=True)
+ output_file = output_dir / name
+ output_file.write_bytes(ex.stdout)
+
+ try:
+ print(ex.stdout.decode('utf-8'))
+ except UnicodeDecodeError:
+ print(f'{BRIGHT}Note, some test output shown here is not UTF-8')
+ if output_file:
+ print(f'For actual test output see artifact file {output_file}')
+ print(f'{RESET_ALL}')
+ print(ex.stdout.decode('utf-8', errors='replace'))
+ sys.stdout.flush()
+
+
+print(f'{BRIGHT}OK: {total.good} SKIP: {total.skip} FAIL: {total.fail}{RESET_ALL}')
+sys.exit(total.fail > 0)