diff --git a/test/meson.build b/test/meson.build index 9750ff22b9..13896aee50 100644 --- a/test/meson.build +++ b/test/meson.build @@ -229,6 +229,14 @@ endif ############################################################ +if install_tests + install_data('run-unit-tests.py', + install_mode : 'rwxr-xr-x', + install_dir : testsdir) +endif + +############################################################ + # prepare test/sys tree sys_script_py = find_program('sys-script.py') custom_target( diff --git a/test/run-unit-tests.py b/test/run-unit-tests.py new file mode 100755 index 0000000000..4bbc3e2c44 --- /dev/null +++ b/test/run-unit-tests.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python3 + +import dataclasses +import glob +import os +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 = '' + +@dataclasses.dataclass +class Total: + total:int + good:int = 0 + skip:int = 0 + fail:int = 0 + +tests = glob.glob('/usr/lib/systemd/tests/test-*') +total = 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.PIPE) + 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 + else: + print(f'{RED}FAIL: {name}{RESET_ALL}') + total.fail += 1 + + # stdout/stderr might not be valid unicode, let's just dump it to the terminal. + # Also let's reset the style afterwards, in case our output sets something. + sys.stdout.buffer.write(ex.stdout) + print(f'{RESET_ALL}{BRIGHT}') + sys.stdout.buffer.write(ex.stderr) + print(f'{RESET_ALL}') + +print(f'{BRIGHT}OK: {total.good} SKIP: {total.skip} FAIL: {total.fail}{RESET_ALL}') +sys.exit(total.fail > 0)