| #!/usr/bin/env python3 |
| |
| import argparse |
| 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 |
| |
| def argument_parser(): |
| p = argparse.ArgumentParser() |
| p.add_argument('-u', '--unsafe', action='store_true', |
| help='run "unsafe" tests too') |
| return p |
| |
| opts = argument_parser().parse_args() |
| |
| tests = glob.glob('/usr/lib/systemd/tests/test-*') |
| if opts.unsafe: |
| tests += glob.glob('/usr/lib/systemd/tests/unsafe/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) |