| import argparse |
| import subprocess |
| from typing import Iterable, List, Tuple |
| |
| _TEAM_AUTHORS = frozenset([ |
| 'Brendan Higgins', 'David Gow', 'Heidi Fahim', 'Felix Guo', |
| 'Avinash Kondareddy', 'Daniel Latypov' |
| ]) |
| |
| # Manual list of files to exclude in `_test_names`. |
| _NOT_TESTS=frozenset(['lib/kunit/test.c']) |
| |
| def _outside_contributors_and_patches() -> Tuple[int, int]: |
| cmd = ['git', 'log', '--format=%an', '--', 'include/kunit', 'lib/kunit', 'tools/testing/kunit'] |
| contributors = set() |
| patches = 0 |
| with subprocess.Popen(cmd, stdout=subprocess.PIPE, text=True) as p: |
| for author in p.stdout: |
| if author.strip() not in _TEAM_AUTHORS: |
| contributors.add(author) |
| patches += 1 |
| return len(contributors), patches |
| |
| def _is_test_file(filename: str) -> bool: |
| if filename.startswith('Documentation/') or filename in _NOT_TESTS: |
| return False |
| return 'test' in filename or filename.endswith('_kunit.c') |
| |
| def _test_names() -> List[str]: |
| cmd = ['git', 'grep', '-l', '-e', '#include <kunit/test.h'] |
| with subprocess.Popen(cmd, stdout=subprocess.PIPE, text=True) as p: |
| return list(filter(_is_test_file, (line.strip() for line in p.stdout))) |
| |
| def _test_authors(test_names: List[str]) -> List[str]: |
| cmd = ['git', '--no-pager', 'shortlog', '--no-merges', '-n', '-s', '--'] + test_names |
| return subprocess.check_output(cmd, text=True).strip().split('\n') |
| |
| def _num_test_cases() -> int: |
| cmd = ['git', 'grep', 'KUNIT_CASE'] |
| count = 0 |
| with subprocess.Popen(cmd, stdout=subprocess.PIPE, text=True) as p: |
| for line in p.stdout: |
| line = line.strip() |
| if line.startswith('Documentation/') or line.startswith('include/kunit/test.h'): |
| continue |
| count += 1 |
| return count |
| |
| |
| parser = argparse.ArgumentParser(description='Optional app description') |
| parser.add_argument('-v', '--verbose', action='store_true') |
| |
| args = parser.parse_args() |
| |
| num_test_cases = _num_test_cases() |
| test_names = _test_names() |
| contributors, patches = _outside_contributors_and_patches() |
| |
| print(f'Number of test cases: {num_test_cases}') |
| print(f'Number of patches: {patches}') |
| print(f'Unique contributors: {contributors}') |
| print(f'Number of total tests: {len(test_names)}') |
| |
| test_authors = _test_authors(test_names) # this step takes ~15s as of Aug 2022 |
| print(f'Number of test authors: {len(test_authors)}') |
| |
| if args.verbose: |
| print(f'All tests: ' + '\n'.join(test_names)) |
| print(f'Test authors: ' + '\n'.join(test_authors)) |