blob: a8e1774059d33b10807975a38615252fafb47cd8 [file] [log] [blame]
Siddharth Shukla8e64d902017-03-12 19:50:18 +01001#!/usr/bin/env python
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +02002# Copyright 2015, Google Inc.
3# All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions are
7# met:
8#
9# * Redistributions of source code must retain the above copyright
10# notice, this list of conditions and the following disclaimer.
11# * Redistributions in binary form must reproduce the above
12# copyright notice, this list of conditions and the following disclaimer
13# in the documentation and/or other materials provided with the
14# distribution.
15# * Neither the name of Google Inc. nor the names of its
16# contributors may be used to endorse or promote products derived from
17# this software without specific prior written permission.
18#
19# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31"""Run test matrix."""
32
Siddharth Shuklad194f592017-03-11 19:12:43 +010033from __future__ import print_function
34
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020035import argparse
Jan Tattermuscha1906d52016-09-19 18:37:17 +020036import multiprocessing
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020037import os
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020038import sys
Jan Tattermusch5c79a312016-12-20 11:02:50 +010039
40import python_utils.jobset as jobset
41import python_utils.report_utils as report_utils
42from python_utils.filter_pull_request_tests import filter_tests
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020043
44_ROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '../..'))
45os.chdir(_ROOT)
46
Jan Tattermusch060eb872016-09-20 16:06:13 +020047# Set the timeout high to allow enough time for sanitizers and pre-building
48# clang docker.
Ken Payson97e69202016-10-17 09:11:49 -070049_RUNTESTS_TIMEOUT = 4*60*60
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020050
Jan Tattermuscha1906d52016-09-19 18:37:17 +020051# Number of jobs assigned to each run_tests.py instance
Matt Kwongfef98962016-10-27 10:45:47 -070052_DEFAULT_INNER_JOBS = 2
Jan Tattermuscha1906d52016-09-19 18:37:17 +020053
Jan Tattermusch5a59c432017-03-07 19:57:13 +010054# report suffix is important for reports to get picked up by internal CI
55_REPORT_SUFFIX = 'sponge_log.xml'
56
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020057
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080058def _docker_jobspec(name, runtests_args=[], runtests_envs={},
59 inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020060 """Run a single instance of run_tests.py in a docker container"""
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020061 test_job = jobset.JobSpec(
62 cmdline=['python', 'tools/run_tests/run_tests.py',
63 '--use_docker',
64 '-t',
Matt Kwongfef98962016-10-27 10:45:47 -070065 '-j', str(inner_jobs),
Jan Tattermusch5a59c432017-03-07 19:57:13 +010066 '-x', 'report_%s_%s' % (name, _REPORT_SUFFIX),
Jan Tattermuschcfcc0752016-10-09 17:02:34 +020067 '--report_suite_name', '%s' % name] + runtests_args,
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080068 environ=runtests_envs,
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020069 shortname='run_tests_%s' % name,
70 timeout_seconds=_RUNTESTS_TIMEOUT)
71 return test_job
72
73
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080074def _workspace_jobspec(name, runtests_args=[], workspace_name=None,
75 runtests_envs={}, inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020076 """Run a single instance of run_tests.py in a separate workspace"""
Jan Tattermuscha1906d52016-09-19 18:37:17 +020077 if not workspace_name:
78 workspace_name = 'workspace_%s' % name
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020079 env = {'WORKSPACE_NAME': workspace_name}
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080080 env.update(runtests_envs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020081 test_job = jobset.JobSpec(
Jan Tattermuschff61b8c2017-03-01 15:57:33 +010082 cmdline=['bash',
83 'tools/run_tests/helper_scripts/run_tests_in_workspace.sh',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020084 '-t',
Matt Kwongfef98962016-10-27 10:45:47 -070085 '-j', str(inner_jobs),
Jan Tattermusch5a59c432017-03-07 19:57:13 +010086 '-x', '../report_%s_%s' % (name, _REPORT_SUFFIX),
Jan Tattermuschcfcc0752016-10-09 17:02:34 +020087 '--report_suite_name', '%s' % name] + runtests_args,
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020088 environ=env,
89 shortname='run_tests_%s' % name,
90 timeout_seconds=_RUNTESTS_TIMEOUT)
91 return test_job
92
93
murgatroid991191b722017-02-08 11:56:52 -080094def _generate_jobs(languages, configs, platforms, iomgr_platform = 'native',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020095 arch=None, compiler=None,
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080096 labels=[], extra_args=[], extra_envs={},
Matt Kwongfef98962016-10-27 10:45:47 -070097 inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020098 result = []
99 for language in languages:
100 for platform in platforms:
101 for config in configs:
murgatroid991191b722017-02-08 11:56:52 -0800102 name = '%s_%s_%s_%s' % (language, platform, config, iomgr_platform)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200103 runtests_args = ['-l', language,
murgatroid99d0cda5c2017-03-07 18:04:52 -0800104 '-c', config,
105 '--iomgr_platform', iomgr_platform]
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200106 if arch or compiler:
107 name += '_%s_%s' % (arch, compiler)
108 runtests_args += ['--arch', arch,
109 '--compiler', compiler]
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800110 for extra_env in extra_envs:
Yuchen Zeng87b59102016-11-08 10:50:12 -0800111 name += '_%s_%s' % (extra_env, extra_envs[extra_env])
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200112
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200113 runtests_args += extra_args
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200114 if platform == 'linux':
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800115 job = _docker_jobspec(name=name, runtests_args=runtests_args,
116 runtests_envs=extra_envs, inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200117 else:
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800118 job = _workspace_jobspec(name=name, runtests_args=runtests_args,
119 runtests_envs=extra_envs, inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200120
murgatroid99d0cda5c2017-03-07 18:04:52 -0800121 job.labels = [platform, config, language, iomgr_platform] + labels
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200122 result.append(job)
123 return result
124
125
Matt Kwongfef98962016-10-27 10:45:47 -0700126def _create_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200127 test_jobs = []
128 # supported on linux only
129 test_jobs += _generate_jobs(languages=['sanity', 'php7'],
130 configs=['dbg', 'opt'],
131 platforms=['linux'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200132 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700133 extra_args=extra_args,
134 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700135
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200136 # supported on all platforms.
137 test_jobs += _generate_jobs(languages=['c', 'csharp', 'node', 'python'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200138 configs=['dbg', 'opt'],
139 platforms=['linux', 'macos', 'windows'],
140 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700141 extra_args=extra_args,
142 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700143
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200144 # supported on linux and mac.
145 test_jobs += _generate_jobs(languages=['c++', 'ruby', 'php'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200146 configs=['dbg', 'opt'],
147 platforms=['linux', 'macos'],
148 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700149 extra_args=extra_args,
150 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700151
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200152 # supported on mac only.
153 test_jobs += _generate_jobs(languages=['objc'],
154 configs=['dbg', 'opt'],
155 platforms=['macos'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200156 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700157 extra_args=extra_args,
158 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700159
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200160 # sanitizers
161 test_jobs += _generate_jobs(languages=['c'],
162 configs=['msan', 'asan', 'tsan'],
163 platforms=['linux'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200164 labels=['sanitizers'],
Matt Kwongfef98962016-10-27 10:45:47 -0700165 extra_args=extra_args,
166 inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200167 test_jobs += _generate_jobs(languages=['c++'],
168 configs=['asan', 'tsan'],
169 platforms=['linux'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200170 labels=['sanitizers'],
Matt Kwongfef98962016-10-27 10:45:47 -0700171 extra_args=extra_args,
172 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700173
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200174 return test_jobs
175
murgatroid991687cab2016-10-11 11:42:01 -0700176
Matt Kwongfef98962016-10-27 10:45:47 -0700177def _create_portability_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200178 test_jobs = []
179 # portability C x86
180 test_jobs += _generate_jobs(languages=['c'],
181 configs=['dbg'],
182 platforms=['linux'],
183 arch='x86',
184 compiler='default',
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200185 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700186 extra_args=extra_args,
187 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700188
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200189 # portability C and C++ on x64
Ken Payson975b5102017-03-30 17:38:40 -0700190 for compiler in ['gcc4.4', 'gcc4.6', 'gcc5.3', 'gcc_musl',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200191 'clang3.5', 'clang3.6', 'clang3.7']:
Matt Kwonge3beac92016-11-01 12:53:04 -0700192 test_jobs += _generate_jobs(languages=['c'],
193 configs=['dbg'],
194 platforms=['linux'],
195 arch='x64',
196 compiler=compiler,
197 labels=['portability'],
198 extra_args=extra_args,
199 inner_jobs=inner_jobs)
Jan Tattermusch8613e472016-11-22 11:15:53 +0100200
Ken Payson8ab2df12017-04-13 19:09:00 -0700201 for compiler in ['gcc4.8', 'gcc5.3',
Matt Kwonge3beac92016-11-01 12:53:04 -0700202 'clang3.5', 'clang3.6', 'clang3.7']:
203 test_jobs += _generate_jobs(languages=['c++'],
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200204 configs=['dbg'],
205 platforms=['linux'],
206 arch='x64',
207 compiler=compiler,
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200208 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700209 extra_args=extra_args,
210 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700211
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200212 # portability C on Windows
213 for arch in ['x86', 'x64']:
214 for compiler in ['vs2013', 'vs2015']:
215 test_jobs += _generate_jobs(languages=['c'],
216 configs=['dbg'],
217 platforms=['windows'],
218 arch=arch,
219 compiler=compiler,
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200220 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700221 extra_args=extra_args,
222 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700223
Yuchen Zeng15618622017-03-19 22:31:14 -0700224 # C and C++ with the c-ares DNS resolver on Linux
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800225 test_jobs += _generate_jobs(languages=['c', 'c++'],
Yuchen Zeng87b59102016-11-08 10:50:12 -0800226 configs=['dbg'], platforms=['linux'],
227 labels=['portability'],
228 extra_args=extra_args,
Yuchen Zeng15618622017-03-19 22:31:14 -0700229 extra_envs={'GRPC_DNS_RESOLVER': 'ares'})
Yuchen Zeng87b59102016-11-08 10:50:12 -0800230
Yuchen Zeng15618622017-03-19 22:31:14 -0700231 # TODO(zyc): Turn on this test after adding c-ares support on windows.
232 # C with the c-ares DNS resolver on Windonws
233 # test_jobs += _generate_jobs(languages=['c'],
234 # configs=['dbg'], platforms=['windows'],
235 # labels=['portability'],
236 # extra_args=extra_args,
237 # extra_envs={'GRPC_DNS_RESOLVER': 'ares'})
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800238
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100239 # cmake build for C and C++
240 # TODO(jtattermusch): some of the tests are failing, so we force --build_only
241 # to make sure it's buildable at least.
242 test_jobs += _generate_jobs(languages=['c', 'c++'],
243 configs=['dbg'],
244 platforms=['linux', 'windows'],
245 arch='default',
246 compiler='cmake',
247 labels=['portability'],
248 extra_args=extra_args + ['--build_only'],
249 inner_jobs=inner_jobs)
250
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200251 test_jobs += _generate_jobs(languages=['python'],
252 configs=['dbg'],
253 platforms=['linux'],
254 arch='default',
255 compiler='python3.4',
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200256 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700257 extra_args=extra_args,
258 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700259
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200260 test_jobs += _generate_jobs(languages=['csharp'],
261 configs=['dbg'],
262 platforms=['linux'],
263 arch='default',
264 compiler='coreclr',
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200265 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700266 extra_args=extra_args,
267 inner_jobs=inner_jobs)
murgatroid99804c9e92016-12-05 12:19:57 -0800268
murgatroid991191b722017-02-08 11:56:52 -0800269 test_jobs += _generate_jobs(languages=['c'],
270 configs=['dbg'],
271 platforms=['linux'],
272 iomgr_platform='uv',
273 labels=['portability'],
274 extra_args=extra_args,
275 inner_jobs=inner_jobs)
276
murgatroid99804c9e92016-12-05 12:19:57 -0800277 test_jobs += _generate_jobs(languages=['node'],
278 configs=['dbg'],
279 platforms=['linux'],
280 arch='default',
murgatroid99f25f5052017-04-13 17:22:32 -0700281 compiler='electron1.6',
murgatroid991191b722017-02-08 11:56:52 -0800282 labels=['portability'],
283 extra_args=extra_args,
284 inner_jobs=inner_jobs)
285
286 test_jobs += _generate_jobs(languages=['node'],
287 configs=['dbg'],
288 platforms=['linux'],
289 arch='default',
290 compiler='node4',
291 labels=['portability'],
292 extra_args=extra_args,
293 inner_jobs=inner_jobs)
294
295 test_jobs += _generate_jobs(languages=['node'],
296 configs=['dbg'],
297 platforms=['linux'],
298 arch='default',
299 compiler='node6',
300 labels=['portability'],
301 extra_args=extra_args,
302 inner_jobs=inner_jobs)
303
murgatroid991687cab2016-10-11 11:42:01 -0700304 return test_jobs
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200305
306
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200307def _allowed_labels():
308 """Returns a list of existing job labels."""
309 all_labels = set()
310 for job in _create_test_jobs() + _create_portability_test_jobs():
311 for label in job.labels:
312 all_labels.add(label)
313 return sorted(all_labels)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200314
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200315
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100316def _runs_per_test_type(arg_str):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100317 """Auxiliary function to parse the "runs_per_test" flag."""
318 try:
319 n = int(arg_str)
320 if n <= 0: raise ValueError
321 return n
322 except:
323 msg = '\'{}\' is not a positive integer'.format(arg_str)
324 raise argparse.ArgumentTypeError(msg)
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100325
326
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700327if __name__ == "__main__":
328 argp = argparse.ArgumentParser(description='Run a matrix of run_tests.py tests.')
329 argp.add_argument('-j', '--jobs',
330 default=multiprocessing.cpu_count()/_DEFAULT_INNER_JOBS,
331 type=int,
332 help='Number of concurrent run_tests.py instances.')
333 argp.add_argument('-f', '--filter',
334 choices=_allowed_labels(),
335 nargs='+',
336 default=[],
337 help='Filter targets to run by label with AND semantics.')
Jan Tattermusch6a851292016-12-20 10:20:42 +0100338 argp.add_argument('--exclude',
339 choices=_allowed_labels(),
340 nargs='+',
341 default=[],
342 help='Exclude targets with any of given labels.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700343 argp.add_argument('--build_only',
344 default=False,
345 action='store_const',
346 const=True,
347 help='Pass --build_only flag to run_tests.py instances.')
348 argp.add_argument('--force_default_poller', default=False, action='store_const', const=True,
349 help='Pass --force_default_poller to run_tests.py instances.')
350 argp.add_argument('--dry_run',
351 default=False,
352 action='store_const',
353 const=True,
354 help='Only print what would be run.')
355 argp.add_argument('--filter_pr_tests',
356 default=False,
357 action='store_const',
358 const=True,
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100359 help='Filters out tests irrelevant to pull request changes.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700360 argp.add_argument('--base_branch',
361 default='origin/master',
362 type=str,
363 help='Branch that pull request is requesting to merge into')
364 argp.add_argument('--inner_jobs',
365 default=_DEFAULT_INNER_JOBS,
366 type=int,
367 help='Number of jobs in each run_tests.py instance')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100368 argp.add_argument('-n', '--runs_per_test', default=1, type=_runs_per_test_type,
369 help='How many times to run each tests. >1 runs implies ' +
370 'omitting passing test from the output & reports.')
Craig Tillere3229fe2017-04-21 07:49:57 -0700371 argp.add_argument('--max_time', default=-1, type=int,
372 help='Maximum amount of time to run tests for' +
373 '(other tests will be skipped)')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700374 args = argp.parse_args()
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200375
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700376 extra_args = []
377 if args.build_only:
378 extra_args.append('--build_only')
379 if args.force_default_poller:
380 extra_args.append('--force_default_poller')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100381 if args.runs_per_test > 1:
382 extra_args.append('-n')
383 extra_args.append('%s' % args.runs_per_test)
384 extra_args.append('--quiet_success')
Craig Tillere3229fe2017-04-21 07:49:57 -0700385 if args.max_time > 0:
386 extra_args.extend(('--max_time', '%d' % args.max_time))
Matt Kwongfef98962016-10-27 10:45:47 -0700387
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700388 all_jobs = _create_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs) + \
389 _create_portability_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200390
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700391 jobs = []
392 for job in all_jobs:
393 if not args.filter or all(filter in job.labels for filter in args.filter):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100394 if not any(exclude_label in job.labels for exclude_label in args.exclude):
395 jobs.append(job)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200396
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700397 if not jobs:
398 jobset.message('FAILED', 'No test suites match given criteria.',
399 do_newline=True)
400 sys.exit(1)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200401
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700402 print('IMPORTANT: The changes you are testing need to be locally committed')
403 print('because only the committed changes in the current branch will be')
404 print('copied to the docker environment or into subworkspaces.')
murgatroid991687cab2016-10-11 11:42:01 -0700405
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700406 skipped_jobs = []
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200407
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700408 if args.filter_pr_tests:
409 print('Looking for irrelevant tests to skip...')
410 relevant_jobs = filter_tests(jobs, args.base_branch)
411 if len(relevant_jobs) == len(jobs):
412 print('No tests will be skipped.')
413 else:
414 print('These tests will be skipped:')
Matt Kwongaa6c94c2016-11-09 15:53:23 -0800415 skipped_jobs = list(set(jobs) - set(relevant_jobs))
416 # Sort by shortnames to make printing of skipped tests consistent
417 skipped_jobs.sort(key=lambda job: job.shortname)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700418 for job in list(skipped_jobs):
419 print(' %s' % job.shortname)
420 jobs = relevant_jobs
421
422 print('Will run these tests:')
423 for job in jobs:
424 if args.dry_run:
425 print(' %s: "%s"' % (job.shortname, ' '.join(job.cmdline)))
426 else:
427 print(' %s' % job.shortname)
Matt Kwong5c691c62016-10-20 17:11:18 -0700428 print
429
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200430 if args.dry_run:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700431 print('--dry_run was used, exiting')
432 sys.exit(1)
433
434 jobset.message('START', 'Running test matrix.', do_newline=True)
435 num_failures, resultset = jobset.run(jobs,
436 newline_on_success=True,
437 travis=True,
438 maxjobs=args.jobs)
439 # Merge skipped tests into results to show skipped tests on report.xml
440 if skipped_jobs:
Nathaniel Manista21e7dfc2017-03-12 18:24:09 +0000441 ignored_num_skipped_failures, skipped_results = jobset.run(
442 skipped_jobs, skip_jobs=True)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700443 resultset.update(skipped_results)
Jan Tattermusch5a59c432017-03-07 19:57:13 +0100444 report_utils.render_junit_xml_report(resultset, 'report_%s' % _REPORT_SUFFIX,
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700445 suite_name='aggregate_tests')
446
447 if num_failures == 0:
448 jobset.message('SUCCESS', 'All run_tests.py instance finished successfully.',
449 do_newline=True)
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200450 else:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700451 jobset.message('FAILED', 'Some run_tests.py instance have failed.',
452 do_newline=True)
453 sys.exit(1)