123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- #!/usr/bin/env python3
- # SPDX-License-Identifier: GPL-2.0
- #
- # This file runs some basic checks to verify kunit works.
- # It is only of interest if you're making changes to KUnit itself.
- #
- # Copyright (C) 2021, Google LLC.
- # Author: Daniel Latypov <[email protected]>
- from concurrent import futures
- import datetime
- import os
- import shutil
- import subprocess
- import sys
- import textwrap
- from typing import Dict, List, Sequence
- ABS_TOOL_PATH = os.path.abspath(os.path.dirname(__file__))
- TIMEOUT = datetime.timedelta(minutes=5).total_seconds()
- commands: Dict[str, Sequence[str]] = {
- 'kunit_tool_test.py': ['./kunit_tool_test.py'],
- 'kunit smoke test': ['./kunit.py', 'run', '--kunitconfig=lib/kunit', '--build_dir=kunit_run_checks'],
- 'pytype': ['/bin/sh', '-c', 'pytype *.py'],
- 'mypy': ['/bin/sh', '-c', 'mypy *.py'],
- }
- # The user might not have mypy or pytype installed, skip them if so.
- # Note: you can install both via `$ pip install mypy pytype`
- necessary_deps : Dict[str, str] = {
- 'pytype': 'pytype',
- 'mypy': 'mypy',
- }
- def main(argv: Sequence[str]) -> None:
- if argv:
- raise RuntimeError('This script takes no arguments')
- future_to_name: Dict[futures.Future, str] = {}
- executor = futures.ThreadPoolExecutor(max_workers=len(commands))
- for name, argv in commands.items():
- if name in necessary_deps and shutil.which(necessary_deps[name]) is None:
- print(f'{name}: SKIPPED, {necessary_deps[name]} not in $PATH')
- continue
- f = executor.submit(run_cmd, argv)
- future_to_name[f] = name
- has_failures = False
- print(f'Waiting on {len(future_to_name)} checks ({", ".join(future_to_name.values())})...')
- for f in futures.as_completed(future_to_name.keys()):
- name = future_to_name[f]
- ex = f.exception()
- if not ex:
- print(f'{name}: PASSED')
- continue
- has_failures = True
- if isinstance(ex, subprocess.TimeoutExpired):
- print(f'{name}: TIMED OUT')
- elif isinstance(ex, subprocess.CalledProcessError):
- print(f'{name}: FAILED')
- else:
- print(f'{name}: unexpected exception: {ex}')
- continue
- output = ex.output
- if output:
- print(textwrap.indent(output.decode(), '> '))
- executor.shutdown()
- if has_failures:
- sys.exit(1)
- def run_cmd(argv: Sequence[str]):
- subprocess.check_output(argv, stderr=subprocess.STDOUT, cwd=ABS_TOOL_PATH, timeout=TIMEOUT)
- if __name__ == '__main__':
- main(sys.argv[1:])
|