blob: 0fe3b37d4b6c908664bd0b22e19b7510bbd9429e [file] [log] [blame]
Siddharth Shukla8e64d902017-03-12 19:50:18 +01001#!/usr/bin/env python
Jan Tattermusch7897ae92017-06-07 22:57:36 +02002# Copyright 2015 gRPC authors.
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +02003#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02004# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +02007#
Jan Tattermusch7897ae92017-06-07 22:57:36 +02008# http://www.apache.org/licenses/LICENSE-2.0
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +02009#
Jan Tattermusch7897ae92017-06-07 22:57:36 +020010# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020015
16"""Run test matrix."""
17
Siddharth Shuklad194f592017-03-11 19:12:43 +010018from __future__ import print_function
19
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020020import argparse
Jan Tattermuscha1906d52016-09-19 18:37:17 +020021import multiprocessing
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020022import os
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020023import sys
Jan Tattermusch5c79a312016-12-20 11:02:50 +010024
25import python_utils.jobset as jobset
26import python_utils.report_utils as report_utils
27from python_utils.filter_pull_request_tests import filter_tests
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020028
29_ROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '../..'))
30os.chdir(_ROOT)
31
Jan Tattermusch060eb872016-09-20 16:06:13 +020032# Set the timeout high to allow enough time for sanitizers and pre-building
33# clang docker.
Ken Payson97e69202016-10-17 09:11:49 -070034_RUNTESTS_TIMEOUT = 4*60*60
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020035
Jan Tattermuscha1906d52016-09-19 18:37:17 +020036# Number of jobs assigned to each run_tests.py instance
Matt Kwongfef98962016-10-27 10:45:47 -070037_DEFAULT_INNER_JOBS = 2
Jan Tattermuscha1906d52016-09-19 18:37:17 +020038
Jan Tattermusch5a59c432017-03-07 19:57:13 +010039# report suffix is important for reports to get picked up by internal CI
40_REPORT_SUFFIX = 'sponge_log.xml'
41
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020042
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020043def _report_filename(name):
44 """Generates report file name"""
45 return 'report_%s_%s' % (name, _REPORT_SUFFIX)
46
47
48def _report_filename_internal_ci(name):
49 """Generates report file name that leads to better presentation by internal CI"""
50 return '%s/%s' % (name, _REPORT_SUFFIX)
51
52
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080053def _docker_jobspec(name, runtests_args=[], runtests_envs={},
54 inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020055 """Run a single instance of run_tests.py in a docker container"""
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020056 test_job = jobset.JobSpec(
57 cmdline=['python', 'tools/run_tests/run_tests.py',
58 '--use_docker',
59 '-t',
Matt Kwongfef98962016-10-27 10:45:47 -070060 '-j', str(inner_jobs),
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020061 '-x', _report_filename(name),
Jan Tattermuschcfcc0752016-10-09 17:02:34 +020062 '--report_suite_name', '%s' % name] + runtests_args,
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080063 environ=runtests_envs,
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020064 shortname='run_tests_%s' % name,
65 timeout_seconds=_RUNTESTS_TIMEOUT)
66 return test_job
67
68
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080069def _workspace_jobspec(name, runtests_args=[], workspace_name=None,
70 runtests_envs={}, inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020071 """Run a single instance of run_tests.py in a separate workspace"""
Jan Tattermuscha1906d52016-09-19 18:37:17 +020072 if not workspace_name:
73 workspace_name = 'workspace_%s' % name
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020074 env = {'WORKSPACE_NAME': workspace_name}
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080075 env.update(runtests_envs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020076 test_job = jobset.JobSpec(
Jan Tattermuschff61b8c2017-03-01 15:57:33 +010077 cmdline=['bash',
78 'tools/run_tests/helper_scripts/run_tests_in_workspace.sh',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020079 '-t',
Matt Kwongfef98962016-10-27 10:45:47 -070080 '-j', str(inner_jobs),
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020081 '-x', '../%s' % _report_filename(name),
Jan Tattermuschcfcc0752016-10-09 17:02:34 +020082 '--report_suite_name', '%s' % name] + runtests_args,
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020083 environ=env,
84 shortname='run_tests_%s' % name,
85 timeout_seconds=_RUNTESTS_TIMEOUT)
86 return test_job
87
88
murgatroid991191b722017-02-08 11:56:52 -080089def _generate_jobs(languages, configs, platforms, iomgr_platform = 'native',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020090 arch=None, compiler=None,
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080091 labels=[], extra_args=[], extra_envs={},
Matt Kwongfef98962016-10-27 10:45:47 -070092 inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020093 result = []
94 for language in languages:
95 for platform in platforms:
96 for config in configs:
murgatroid991191b722017-02-08 11:56:52 -080097 name = '%s_%s_%s_%s' % (language, platform, config, iomgr_platform)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020098 runtests_args = ['-l', language,
murgatroid99d0cda5c2017-03-07 18:04:52 -080099 '-c', config,
100 '--iomgr_platform', iomgr_platform]
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200101 if arch or compiler:
102 name += '_%s_%s' % (arch, compiler)
103 runtests_args += ['--arch', arch,
104 '--compiler', compiler]
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800105 for extra_env in extra_envs:
Yuchen Zeng87b59102016-11-08 10:50:12 -0800106 name += '_%s_%s' % (extra_env, extra_envs[extra_env])
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200107
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200108 runtests_args += extra_args
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200109 if platform == 'linux':
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800110 job = _docker_jobspec(name=name, runtests_args=runtests_args,
111 runtests_envs=extra_envs, inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200112 else:
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800113 job = _workspace_jobspec(name=name, runtests_args=runtests_args,
114 runtests_envs=extra_envs, inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200115
murgatroid99d0cda5c2017-03-07 18:04:52 -0800116 job.labels = [platform, config, language, iomgr_platform] + labels
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200117 result.append(job)
118 return result
119
120
Matt Kwongfef98962016-10-27 10:45:47 -0700121def _create_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200122 test_jobs = []
123 # supported on linux only
124 test_jobs += _generate_jobs(languages=['sanity', 'php7'],
125 configs=['dbg', 'opt'],
126 platforms=['linux'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200127 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700128 extra_args=extra_args,
129 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700130
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200131 # supported on all platforms.
132 test_jobs += _generate_jobs(languages=['c', 'csharp', 'node', 'python'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200133 configs=['dbg', 'opt'],
134 platforms=['linux', 'macos', 'windows'],
135 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700136 extra_args=extra_args,
137 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700138
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200139 # supported on linux and mac.
140 test_jobs += _generate_jobs(languages=['c++', 'ruby', 'php'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200141 configs=['dbg', 'opt'],
142 platforms=['linux', 'macos'],
143 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700144 extra_args=extra_args,
145 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700146
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200147 # supported on mac only.
148 test_jobs += _generate_jobs(languages=['objc'],
149 configs=['dbg', 'opt'],
150 platforms=['macos'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200151 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700152 extra_args=extra_args,
153 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700154
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200155 # sanitizers
156 test_jobs += _generate_jobs(languages=['c'],
Matt Kwongd42f55b2017-05-04 15:29:32 -0700157 configs=['msan', 'asan', 'tsan', 'ubsan'],
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200158 platforms=['linux'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200159 labels=['sanitizers'],
Matt Kwongfef98962016-10-27 10:45:47 -0700160 extra_args=extra_args,
161 inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200162 test_jobs += _generate_jobs(languages=['c++'],
163 configs=['asan', 'tsan'],
164 platforms=['linux'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200165 labels=['sanitizers'],
Matt Kwongfef98962016-10-27 10:45:47 -0700166 extra_args=extra_args,
167 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700168
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200169 return test_jobs
170
murgatroid991687cab2016-10-11 11:42:01 -0700171
Matt Kwongfef98962016-10-27 10:45:47 -0700172def _create_portability_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200173 test_jobs = []
174 # portability C x86
175 test_jobs += _generate_jobs(languages=['c'],
176 configs=['dbg'],
177 platforms=['linux'],
178 arch='x86',
179 compiler='default',
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200180 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700181 extra_args=extra_args,
182 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700183
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200184 # portability C and C++ on x64
Ken Payson02909062017-05-04 12:33:58 -0700185 for compiler in ['gcc4.8', 'gcc5.3', 'gcc_musl',
Matt Kwonge3beac92016-11-01 12:53:04 -0700186 'clang3.5', 'clang3.6', 'clang3.7']:
Vijay Paiadd2e4d2017-05-10 10:25:13 -0700187 test_jobs += _generate_jobs(languages=['c', 'c++'],
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200188 configs=['dbg'],
189 platforms=['linux'],
190 arch='x64',
191 compiler=compiler,
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200192 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700193 extra_args=extra_args,
194 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700195
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200196 # portability C on Windows
197 for arch in ['x86', 'x64']:
198 for compiler in ['vs2013', 'vs2015']:
199 test_jobs += _generate_jobs(languages=['c'],
200 configs=['dbg'],
201 platforms=['windows'],
202 arch=arch,
203 compiler=compiler,
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200204 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700205 extra_args=extra_args,
206 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700207
Yuchen Zeng15618622017-03-19 22:31:14 -0700208 # C and C++ with the c-ares DNS resolver on Linux
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800209 test_jobs += _generate_jobs(languages=['c', 'c++'],
Yuchen Zeng87b59102016-11-08 10:50:12 -0800210 configs=['dbg'], platforms=['linux'],
211 labels=['portability'],
212 extra_args=extra_args,
Yuchen Zeng15618622017-03-19 22:31:14 -0700213 extra_envs={'GRPC_DNS_RESOLVER': 'ares'})
Yuchen Zeng87b59102016-11-08 10:50:12 -0800214
Yuchen Zeng15618622017-03-19 22:31:14 -0700215 # TODO(zyc): Turn on this test after adding c-ares support on windows.
216 # C with the c-ares DNS resolver on Windonws
217 # test_jobs += _generate_jobs(languages=['c'],
218 # configs=['dbg'], platforms=['windows'],
219 # labels=['portability'],
220 # extra_args=extra_args,
221 # extra_envs={'GRPC_DNS_RESOLVER': 'ares'})
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800222
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100223 # cmake build for C and C++
224 # TODO(jtattermusch): some of the tests are failing, so we force --build_only
225 # to make sure it's buildable at least.
226 test_jobs += _generate_jobs(languages=['c', 'c++'],
227 configs=['dbg'],
228 platforms=['linux', 'windows'],
229 arch='default',
230 compiler='cmake',
231 labels=['portability'],
232 extra_args=extra_args + ['--build_only'],
233 inner_jobs=inner_jobs)
234
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200235 test_jobs += _generate_jobs(languages=['python'],
236 configs=['dbg'],
237 platforms=['linux'],
238 arch='default',
Ken Payson02909062017-05-04 12:33:58 -0700239 compiler='python_alpine',
240 labels=['portability'],
241 extra_args=extra_args,
242 inner_jobs=inner_jobs)
243
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200244 test_jobs += _generate_jobs(languages=['csharp'],
245 configs=['dbg'],
246 platforms=['linux'],
247 arch='default',
248 compiler='coreclr',
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200249 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700250 extra_args=extra_args,
251 inner_jobs=inner_jobs)
murgatroid99804c9e92016-12-05 12:19:57 -0800252
murgatroid991191b722017-02-08 11:56:52 -0800253 test_jobs += _generate_jobs(languages=['c'],
254 configs=['dbg'],
255 platforms=['linux'],
256 iomgr_platform='uv',
257 labels=['portability'],
258 extra_args=extra_args,
259 inner_jobs=inner_jobs)
260
murgatroid99804c9e92016-12-05 12:19:57 -0800261 test_jobs += _generate_jobs(languages=['node'],
262 configs=['dbg'],
263 platforms=['linux'],
264 arch='default',
murgatroid99f25f5052017-04-13 17:22:32 -0700265 compiler='electron1.6',
murgatroid991191b722017-02-08 11:56:52 -0800266 labels=['portability'],
267 extra_args=extra_args,
268 inner_jobs=inner_jobs)
269
270 test_jobs += _generate_jobs(languages=['node'],
271 configs=['dbg'],
272 platforms=['linux'],
273 arch='default',
274 compiler='node4',
275 labels=['portability'],
276 extra_args=extra_args,
277 inner_jobs=inner_jobs)
278
279 test_jobs += _generate_jobs(languages=['node'],
280 configs=['dbg'],
281 platforms=['linux'],
282 arch='default',
283 compiler='node6',
284 labels=['portability'],
285 extra_args=extra_args,
286 inner_jobs=inner_jobs)
287
murgatroid991687cab2016-10-11 11:42:01 -0700288 return test_jobs
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200289
290
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200291def _allowed_labels():
292 """Returns a list of existing job labels."""
293 all_labels = set()
294 for job in _create_test_jobs() + _create_portability_test_jobs():
295 for label in job.labels:
296 all_labels.add(label)
297 return sorted(all_labels)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200298
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200299
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100300def _runs_per_test_type(arg_str):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100301 """Auxiliary function to parse the "runs_per_test" flag."""
302 try:
303 n = int(arg_str)
304 if n <= 0: raise ValueError
305 return n
306 except:
307 msg = '\'{}\' is not a positive integer'.format(arg_str)
308 raise argparse.ArgumentTypeError(msg)
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100309
310
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700311if __name__ == "__main__":
312 argp = argparse.ArgumentParser(description='Run a matrix of run_tests.py tests.')
313 argp.add_argument('-j', '--jobs',
314 default=multiprocessing.cpu_count()/_DEFAULT_INNER_JOBS,
315 type=int,
316 help='Number of concurrent run_tests.py instances.')
317 argp.add_argument('-f', '--filter',
318 choices=_allowed_labels(),
319 nargs='+',
320 default=[],
321 help='Filter targets to run by label with AND semantics.')
Jan Tattermusch6a851292016-12-20 10:20:42 +0100322 argp.add_argument('--exclude',
323 choices=_allowed_labels(),
324 nargs='+',
325 default=[],
326 help='Exclude targets with any of given labels.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700327 argp.add_argument('--build_only',
328 default=False,
329 action='store_const',
330 const=True,
331 help='Pass --build_only flag to run_tests.py instances.')
332 argp.add_argument('--force_default_poller', default=False, action='store_const', const=True,
333 help='Pass --force_default_poller to run_tests.py instances.')
334 argp.add_argument('--dry_run',
335 default=False,
336 action='store_const',
337 const=True,
338 help='Only print what would be run.')
339 argp.add_argument('--filter_pr_tests',
340 default=False,
341 action='store_const',
342 const=True,
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100343 help='Filters out tests irrelevant to pull request changes.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700344 argp.add_argument('--base_branch',
345 default='origin/master',
346 type=str,
347 help='Branch that pull request is requesting to merge into')
348 argp.add_argument('--inner_jobs',
349 default=_DEFAULT_INNER_JOBS,
350 type=int,
351 help='Number of jobs in each run_tests.py instance')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100352 argp.add_argument('-n', '--runs_per_test', default=1, type=_runs_per_test_type,
353 help='How many times to run each tests. >1 runs implies ' +
354 'omitting passing test from the output & reports.')
Craig Tillerceea9692017-04-21 07:49:57 -0700355 argp.add_argument('--max_time', default=-1, type=int,
356 help='Maximum amount of time to run tests for' +
357 '(other tests will be skipped)')
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200358 argp.add_argument('--internal_ci',
359 default=False,
360 action='store_const',
361 const=True,
362 help='Put reports into subdirectories to improve presentation of '
363 'results by Internal CI.')
Matt Kwong52ff9862017-04-17 13:56:51 -0700364 argp.add_argument('--bq_result_table',
365 default='',
366 type=str,
367 nargs='?',
368 help='Upload test results to a specified BQ table.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700369 args = argp.parse_args()
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200370
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200371 if args.internal_ci:
372 _report_filename = _report_filename_internal_ci # override the function
373
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700374 extra_args = []
375 if args.build_only:
376 extra_args.append('--build_only')
377 if args.force_default_poller:
378 extra_args.append('--force_default_poller')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100379 if args.runs_per_test > 1:
380 extra_args.append('-n')
381 extra_args.append('%s' % args.runs_per_test)
382 extra_args.append('--quiet_success')
Craig Tillerceea9692017-04-21 07:49:57 -0700383 if args.max_time > 0:
384 extra_args.extend(('--max_time', '%d' % args.max_time))
Matt Kwong52ff9862017-04-17 13:56:51 -0700385 if args.bq_result_table:
386 extra_args.append('--bq_result_table')
387 extra_args.append('%s' % args.bq_result_table)
388 extra_args.append('--measure_cpu_costs')
Matt Kwongfef98962016-10-27 10:45:47 -0700389
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700390 all_jobs = _create_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs) + \
391 _create_portability_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200392
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700393 jobs = []
394 for job in all_jobs:
395 if not args.filter or all(filter in job.labels for filter in args.filter):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100396 if not any(exclude_label in job.labels for exclude_label in args.exclude):
397 jobs.append(job)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200398
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700399 if not jobs:
400 jobset.message('FAILED', 'No test suites match given criteria.',
401 do_newline=True)
402 sys.exit(1)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200403
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700404 print('IMPORTANT: The changes you are testing need to be locally committed')
405 print('because only the committed changes in the current branch will be')
406 print('copied to the docker environment or into subworkspaces.')
murgatroid991687cab2016-10-11 11:42:01 -0700407
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700408 skipped_jobs = []
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200409
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700410 if args.filter_pr_tests:
411 print('Looking for irrelevant tests to skip...')
412 relevant_jobs = filter_tests(jobs, args.base_branch)
413 if len(relevant_jobs) == len(jobs):
414 print('No tests will be skipped.')
415 else:
416 print('These tests will be skipped:')
Matt Kwongaa6c94c2016-11-09 15:53:23 -0800417 skipped_jobs = list(set(jobs) - set(relevant_jobs))
418 # Sort by shortnames to make printing of skipped tests consistent
419 skipped_jobs.sort(key=lambda job: job.shortname)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700420 for job in list(skipped_jobs):
421 print(' %s' % job.shortname)
422 jobs = relevant_jobs
423
424 print('Will run these tests:')
425 for job in jobs:
426 if args.dry_run:
427 print(' %s: "%s"' % (job.shortname, ' '.join(job.cmdline)))
428 else:
429 print(' %s' % job.shortname)
Matt Kwong5c691c62016-10-20 17:11:18 -0700430 print
431
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200432 if args.dry_run:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700433 print('--dry_run was used, exiting')
434 sys.exit(1)
435
436 jobset.message('START', 'Running test matrix.', do_newline=True)
437 num_failures, resultset = jobset.run(jobs,
438 newline_on_success=True,
439 travis=True,
440 maxjobs=args.jobs)
441 # Merge skipped tests into results to show skipped tests on report.xml
442 if skipped_jobs:
Nathaniel Manista21e7dfc2017-03-12 18:24:09 +0000443 ignored_num_skipped_failures, skipped_results = jobset.run(
444 skipped_jobs, skip_jobs=True)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700445 resultset.update(skipped_results)
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200446 report_utils.render_junit_xml_report(resultset, _report_filename('aggregate_tests'),
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700447 suite_name='aggregate_tests')
448
449 if num_failures == 0:
450 jobset.message('SUCCESS', 'All run_tests.py instance finished successfully.',
451 do_newline=True)
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200452 else:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700453 jobset.message('FAILED', 'Some run_tests.py instance have failed.',
454 do_newline=True)
455 sys.exit(1)