mirror of
https://github.com/systemd/systemd.git
synced 2024-11-23 02:03:37 +08:00
59e33acc8e
In automated QA environments there may be tests that are known to fail, and being able to skip them is useful to remove known failures from the test log. Signed-off-by: Ross Burton <ross.burton@arm.com>
90 lines
2.7 KiB
Python
Executable File
90 lines
2.7 KiB
Python
Executable File
#!/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')
|
|
p.add_argument('-s', '--skip', action='append', default=[],
|
|
help='skip the named test')
|
|
|
|
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 sorted(tests):
|
|
name = os.path.basename(test)
|
|
|
|
if name in opts.skip:
|
|
print(f'{YELLOW}SKIP: {name} (by user) {RESET_ALL}')
|
|
total.skip += 1
|
|
continue
|
|
|
|
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)
|