diff --git a/tools/run_tests/run_tests_matrix.py b/tools/run_tests/run_tests_matrix.py index 06ab02e32fb75480fddf732b2070b26f48cef934..ae7fdd84f9bde22d004aa7ffc45ec3ea4a0390ca 100755 --- a/tools/run_tests/run_tests_matrix.py +++ b/tools/run_tests/run_tests_matrix.py @@ -79,7 +79,7 @@ def _workspace_jobspec(name, runtests_args=[], workspace_name=None): def _generate_jobs(languages, configs, platforms, arch=None, compiler=None, - labels=[]): + labels=[], extra_args=[]): result = [] for language in languages: for platform in platforms: @@ -92,6 +92,7 @@ def _generate_jobs(languages, configs, platforms, runtests_args += ['--arch', arch, '--compiler', compiler] + runtests_args += extra_args if platform == 'linux': job = _docker_jobspec(name=name, runtests_args=runtests_args) else: @@ -102,45 +103,51 @@ def _generate_jobs(languages, configs, platforms, return result -def _create_test_jobs(): +def _create_test_jobs(extra_args=[]): test_jobs = [] # supported on linux only test_jobs += _generate_jobs(languages=['sanity', 'php7'], configs=['dbg', 'opt'], platforms=['linux'], - labels=['basictests']) + labels=['basictests'], + extra_args=extra_args) # supported on all platforms. test_jobs += _generate_jobs(languages=['c', 'csharp', 'node', 'python'], - configs=['dbg', 'opt'], - platforms=['linux', 'macos', 'windows'], - labels=['basictests']) + configs=['dbg', 'opt'], + platforms=['linux', 'macos', 'windows'], + labels=['basictests'], + extra_args=extra_args) # supported on linux and mac. test_jobs += _generate_jobs(languages=['c++', 'ruby', 'php'], - configs=['dbg', 'opt'], - platforms=['linux', 'macos'], - labels=['basictests']) + configs=['dbg', 'opt'], + platforms=['linux', 'macos'], + labels=['basictests'], + extra_args=extra_args) # supported on mac only. test_jobs += _generate_jobs(languages=['objc'], configs=['dbg', 'opt'], platforms=['macos'], - labels=['basictests']) + labels=['basictests'], + extra_args=extra_args) # sanitizers test_jobs += _generate_jobs(languages=['c'], configs=['msan', 'asan', 'tsan'], platforms=['linux'], - labels=['sanitizers']) + labels=['sanitizers'], + extra_args=extra_args) test_jobs += _generate_jobs(languages=['c++'], configs=['asan', 'tsan'], platforms=['linux'], - labels=['sanitizers']) + labels=['sanitizers'], + extra_args=extra_args) return test_jobs -def _create_portability_test_jobs(): +def _create_portability_test_jobs(extra_args=[]): test_jobs = [] # portability C x86 test_jobs += _generate_jobs(languages=['c'], @@ -148,7 +155,8 @@ def _create_portability_test_jobs(): platforms=['linux'], arch='x86', compiler='default', - labels=['portability']) + labels=['portability'], + extra_args=extra_args) # portability C and C++ on x64 for compiler in ['gcc4.4', 'gcc4.6', 'gcc5.3', @@ -158,7 +166,8 @@ def _create_portability_test_jobs(): platforms=['linux'], arch='x64', compiler=compiler, - labels=['portability']) + labels=['portability'], + extra_args=extra_args) # portability C on Windows for arch in ['x86', 'x64']: @@ -168,53 +177,72 @@ def _create_portability_test_jobs(): platforms=['windows'], arch=arch, compiler=compiler, - labels=['portability']) + labels=['portability'], + extra_args=extra_args) test_jobs += _generate_jobs(languages=['python'], configs=['dbg'], platforms=['linux'], arch='default', compiler='python3.4', - labels=['portability']) + labels=['portability'], + extra_args=extra_args) test_jobs += _generate_jobs(languages=['csharp'], configs=['dbg'], platforms=['linux'], arch='default', compiler='coreclr', - labels=['portability']) + labels=['portability'], + extra_args=extra_args) for compiler in ['node5', 'node6', 'node0.12']: test_jobs += _generate_jobs(languages=['node'], - configs=['dbg'], - platforms=['linux'], - arch='default', - compiler=compiler, - labels=['portability']) + configs=['dbg'], + platforms=['linux'], + arch='default', + compiler=compiler, + labels=['portability'], + extra_args=extra_args) return test_jobs -all_jobs = _create_test_jobs() + _create_portability_test_jobs() +def _allowed_labels(): + """Returns a list of existing job labels.""" + all_labels = set() + for job in _create_test_jobs() + _create_portability_test_jobs(): + for label in job.labels: + all_labels.add(label) + return sorted(all_labels) -all_labels = set() -for job in all_jobs: - for label in job.labels: - all_labels.add(label) argp = argparse.ArgumentParser(description='Run a matrix of run_tests.py tests.') -# TODO(jtattermusch): allow running tests with --build_only flag -# TODO(jtattermusch): allow running tests with --force_default_poller flag. argp.add_argument('-j', '--jobs', default=multiprocessing.cpu_count()/_INNER_JOBS, type=int, help='Number of concurrent run_tests.py instances.') argp.add_argument('-f', '--filter', - choices=sorted(all_labels), + choices=_allowed_labels(), nargs='+', default=[], help='Filter targets to run by label with AND semantics.') +argp.add_argument('--build_only', + default=False, + action='store_const', + const=True, + help='Pass --build_only flag to run_tests.py instances.') +argp.add_argument('--force_default_poller', default=False, action='store_const', const=True, + help='Pass --force_default_poller to run_tests.py instances.') args = argp.parse_args() +extra_args = [] +if args.build_only: + extra_args.append('--build_only') +if args.force_default_poller: + extra_args.append('--force_default_poller') + +all_jobs = _create_test_jobs(extra_args=extra_args) + _create_portability_test_jobs(extra_args=extra_args) + jobs = [] for job in all_jobs: if not args.filter or all(filter in job.labels for filter in args.filter):