blob: 92a5454f15266980b8e5be91b6f4294b09616199 [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
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020058def _report_filename(name):
59 """Generates report file name"""
60 return 'report_%s_%s' % (name, _REPORT_SUFFIX)
61
62
63def _report_filename_internal_ci(name):
64 """Generates report file name that leads to better presentation by internal CI"""
65 return '%s/%s' % (name, _REPORT_SUFFIX)
66
67
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080068def _docker_jobspec(name, runtests_args=[], runtests_envs={},
69 inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020070 """Run a single instance of run_tests.py in a docker container"""
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020071 test_job = jobset.JobSpec(
72 cmdline=['python', 'tools/run_tests/run_tests.py',
73 '--use_docker',
74 '-t',
Matt Kwongfef98962016-10-27 10:45:47 -070075 '-j', str(inner_jobs),
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020076 '-x', _report_filename(name),
Jan Tattermuschcfcc0752016-10-09 17:02:34 +020077 '--report_suite_name', '%s' % name] + runtests_args,
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080078 environ=runtests_envs,
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020079 shortname='run_tests_%s' % name,
80 timeout_seconds=_RUNTESTS_TIMEOUT)
81 return test_job
82
83
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080084def _workspace_jobspec(name, runtests_args=[], workspace_name=None,
85 runtests_envs={}, inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020086 """Run a single instance of run_tests.py in a separate workspace"""
Jan Tattermuscha1906d52016-09-19 18:37:17 +020087 if not workspace_name:
88 workspace_name = 'workspace_%s' % name
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020089 env = {'WORKSPACE_NAME': workspace_name}
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080090 env.update(runtests_envs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020091 test_job = jobset.JobSpec(
Jan Tattermuschff61b8c2017-03-01 15:57:33 +010092 cmdline=['bash',
93 'tools/run_tests/helper_scripts/run_tests_in_workspace.sh',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020094 '-t',
Matt Kwongfef98962016-10-27 10:45:47 -070095 '-j', str(inner_jobs),
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020096 '-x', '../%s' % _report_filename(name),
Jan Tattermuschcfcc0752016-10-09 17:02:34 +020097 '--report_suite_name', '%s' % name] + runtests_args,
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020098 environ=env,
99 shortname='run_tests_%s' % name,
100 timeout_seconds=_RUNTESTS_TIMEOUT)
101 return test_job
102
103
murgatroid991191b722017-02-08 11:56:52 -0800104def _generate_jobs(languages, configs, platforms, iomgr_platform = 'native',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200105 arch=None, compiler=None,
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800106 labels=[], extra_args=[], extra_envs={},
Matt Kwongfef98962016-10-27 10:45:47 -0700107 inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200108 result = []
109 for language in languages:
110 for platform in platforms:
111 for config in configs:
murgatroid991191b722017-02-08 11:56:52 -0800112 name = '%s_%s_%s_%s' % (language, platform, config, iomgr_platform)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200113 runtests_args = ['-l', language,
murgatroid99d0cda5c2017-03-07 18:04:52 -0800114 '-c', config,
115 '--iomgr_platform', iomgr_platform]
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200116 if arch or compiler:
117 name += '_%s_%s' % (arch, compiler)
118 runtests_args += ['--arch', arch,
119 '--compiler', compiler]
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800120 for extra_env in extra_envs:
Yuchen Zeng87b59102016-11-08 10:50:12 -0800121 name += '_%s_%s' % (extra_env, extra_envs[extra_env])
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200122
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200123 runtests_args += extra_args
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200124 if platform == 'linux':
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800125 job = _docker_jobspec(name=name, runtests_args=runtests_args,
126 runtests_envs=extra_envs, inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200127 else:
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800128 job = _workspace_jobspec(name=name, runtests_args=runtests_args,
129 runtests_envs=extra_envs, inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200130
murgatroid99d0cda5c2017-03-07 18:04:52 -0800131 job.labels = [platform, config, language, iomgr_platform] + labels
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200132 result.append(job)
133 return result
134
135
Matt Kwongfef98962016-10-27 10:45:47 -0700136def _create_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200137 test_jobs = []
138 # supported on linux only
139 test_jobs += _generate_jobs(languages=['sanity', 'php7'],
140 configs=['dbg', 'opt'],
141 platforms=['linux'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200142 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700143 extra_args=extra_args,
144 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700145
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200146 # supported on all platforms.
147 test_jobs += _generate_jobs(languages=['c', 'csharp', 'node', 'python'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200148 configs=['dbg', 'opt'],
149 platforms=['linux', 'macos', 'windows'],
150 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700151 extra_args=extra_args,
152 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700153
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200154 # supported on linux and mac.
155 test_jobs += _generate_jobs(languages=['c++', 'ruby', 'php'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200156 configs=['dbg', 'opt'],
157 platforms=['linux', 'macos'],
158 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700159 extra_args=extra_args,
160 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700161
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200162 # supported on mac only.
163 test_jobs += _generate_jobs(languages=['objc'],
164 configs=['dbg', 'opt'],
165 platforms=['macos'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200166 labels=['basictests'],
Matt Kwongfef98962016-10-27 10:45:47 -0700167 extra_args=extra_args,
168 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700169
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200170 # sanitizers
171 test_jobs += _generate_jobs(languages=['c'],
172 configs=['msan', 'asan', 'tsan'],
173 platforms=['linux'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200174 labels=['sanitizers'],
Matt Kwongfef98962016-10-27 10:45:47 -0700175 extra_args=extra_args,
176 inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200177 test_jobs += _generate_jobs(languages=['c++'],
178 configs=['asan', 'tsan'],
179 platforms=['linux'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200180 labels=['sanitizers'],
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 return test_jobs
185
murgatroid991687cab2016-10-11 11:42:01 -0700186
Matt Kwongfef98962016-10-27 10:45:47 -0700187def _create_portability_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200188 test_jobs = []
189 # portability C x86
190 test_jobs += _generate_jobs(languages=['c'],
191 configs=['dbg'],
192 platforms=['linux'],
193 arch='x86',
194 compiler='default',
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200195 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700196 extra_args=extra_args,
197 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700198
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200199 # portability C and C++ on x64
Ken Payson975b5102017-03-30 17:38:40 -0700200 for compiler in ['gcc4.4', 'gcc4.6', 'gcc5.3', 'gcc_musl',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200201 'clang3.5', 'clang3.6', 'clang3.7']:
Matt Kwonge3beac92016-11-01 12:53:04 -0700202 test_jobs += _generate_jobs(languages=['c'],
203 configs=['dbg'],
204 platforms=['linux'],
205 arch='x64',
206 compiler=compiler,
207 labels=['portability'],
208 extra_args=extra_args,
209 inner_jobs=inner_jobs)
Jan Tattermusch8613e472016-11-22 11:15:53 +0100210
Ken Payson02909062017-05-04 12:33:58 -0700211 for compiler in ['gcc4.8', 'gcc5.3', 'gcc_musl',
Matt Kwonge3beac92016-11-01 12:53:04 -0700212 'clang3.5', 'clang3.6', 'clang3.7']:
213 test_jobs += _generate_jobs(languages=['c++'],
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200214 configs=['dbg'],
215 platforms=['linux'],
216 arch='x64',
217 compiler=compiler,
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200218 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700219 extra_args=extra_args,
220 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700221
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200222 # portability C on Windows
223 for arch in ['x86', 'x64']:
224 for compiler in ['vs2013', 'vs2015']:
225 test_jobs += _generate_jobs(languages=['c'],
226 configs=['dbg'],
227 platforms=['windows'],
228 arch=arch,
229 compiler=compiler,
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200230 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700231 extra_args=extra_args,
232 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700233
Yuchen Zeng15618622017-03-19 22:31:14 -0700234 # C and C++ with the c-ares DNS resolver on Linux
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800235 test_jobs += _generate_jobs(languages=['c', 'c++'],
Yuchen Zeng87b59102016-11-08 10:50:12 -0800236 configs=['dbg'], platforms=['linux'],
237 labels=['portability'],
238 extra_args=extra_args,
Yuchen Zeng15618622017-03-19 22:31:14 -0700239 extra_envs={'GRPC_DNS_RESOLVER': 'ares'})
Yuchen Zeng87b59102016-11-08 10:50:12 -0800240
Yuchen Zeng15618622017-03-19 22:31:14 -0700241 # TODO(zyc): Turn on this test after adding c-ares support on windows.
242 # C with the c-ares DNS resolver on Windonws
243 # test_jobs += _generate_jobs(languages=['c'],
244 # configs=['dbg'], platforms=['windows'],
245 # labels=['portability'],
246 # extra_args=extra_args,
247 # extra_envs={'GRPC_DNS_RESOLVER': 'ares'})
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800248
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100249 # cmake build for C and C++
250 # TODO(jtattermusch): some of the tests are failing, so we force --build_only
251 # to make sure it's buildable at least.
252 test_jobs += _generate_jobs(languages=['c', 'c++'],
253 configs=['dbg'],
254 platforms=['linux', 'windows'],
255 arch='default',
256 compiler='cmake',
257 labels=['portability'],
258 extra_args=extra_args + ['--build_only'],
259 inner_jobs=inner_jobs)
260
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200261 test_jobs += _generate_jobs(languages=['python'],
262 configs=['dbg'],
263 platforms=['linux'],
264 arch='default',
265 compiler='python3.4',
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200266 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700267 extra_args=extra_args,
268 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700269
Ken Payson02909062017-05-04 12:33:58 -0700270 test_jobs += _generate_jobs(languages=['python'],
271 configs=['dbg'],
272 platforms=['linux'],
273 arch='default',
274 compiler='python_alpine',
275 labels=['portability'],
276 extra_args=extra_args,
277 inner_jobs=inner_jobs)
278
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200279 test_jobs += _generate_jobs(languages=['csharp'],
280 configs=['dbg'],
281 platforms=['linux'],
282 arch='default',
283 compiler='coreclr',
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200284 labels=['portability'],
Matt Kwongfef98962016-10-27 10:45:47 -0700285 extra_args=extra_args,
286 inner_jobs=inner_jobs)
murgatroid99804c9e92016-12-05 12:19:57 -0800287
murgatroid991191b722017-02-08 11:56:52 -0800288 test_jobs += _generate_jobs(languages=['c'],
289 configs=['dbg'],
290 platforms=['linux'],
291 iomgr_platform='uv',
292 labels=['portability'],
293 extra_args=extra_args,
294 inner_jobs=inner_jobs)
295
murgatroid99804c9e92016-12-05 12:19:57 -0800296 test_jobs += _generate_jobs(languages=['node'],
297 configs=['dbg'],
298 platforms=['linux'],
299 arch='default',
murgatroid99f25f5052017-04-13 17:22:32 -0700300 compiler='electron1.6',
murgatroid991191b722017-02-08 11:56:52 -0800301 labels=['portability'],
302 extra_args=extra_args,
303 inner_jobs=inner_jobs)
304
305 test_jobs += _generate_jobs(languages=['node'],
306 configs=['dbg'],
307 platforms=['linux'],
308 arch='default',
309 compiler='node4',
310 labels=['portability'],
311 extra_args=extra_args,
312 inner_jobs=inner_jobs)
313
314 test_jobs += _generate_jobs(languages=['node'],
315 configs=['dbg'],
316 platforms=['linux'],
317 arch='default',
318 compiler='node6',
319 labels=['portability'],
320 extra_args=extra_args,
321 inner_jobs=inner_jobs)
322
murgatroid991687cab2016-10-11 11:42:01 -0700323 return test_jobs
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200324
325
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200326def _allowed_labels():
327 """Returns a list of existing job labels."""
328 all_labels = set()
329 for job in _create_test_jobs() + _create_portability_test_jobs():
330 for label in job.labels:
331 all_labels.add(label)
332 return sorted(all_labels)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200333
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200334
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100335def _runs_per_test_type(arg_str):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100336 """Auxiliary function to parse the "runs_per_test" flag."""
337 try:
338 n = int(arg_str)
339 if n <= 0: raise ValueError
340 return n
341 except:
342 msg = '\'{}\' is not a positive integer'.format(arg_str)
343 raise argparse.ArgumentTypeError(msg)
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100344
345
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700346if __name__ == "__main__":
347 argp = argparse.ArgumentParser(description='Run a matrix of run_tests.py tests.')
348 argp.add_argument('-j', '--jobs',
349 default=multiprocessing.cpu_count()/_DEFAULT_INNER_JOBS,
350 type=int,
351 help='Number of concurrent run_tests.py instances.')
352 argp.add_argument('-f', '--filter',
353 choices=_allowed_labels(),
354 nargs='+',
355 default=[],
356 help='Filter targets to run by label with AND semantics.')
Jan Tattermusch6a851292016-12-20 10:20:42 +0100357 argp.add_argument('--exclude',
358 choices=_allowed_labels(),
359 nargs='+',
360 default=[],
361 help='Exclude targets with any of given labels.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700362 argp.add_argument('--build_only',
363 default=False,
364 action='store_const',
365 const=True,
366 help='Pass --build_only flag to run_tests.py instances.')
367 argp.add_argument('--force_default_poller', default=False, action='store_const', const=True,
368 help='Pass --force_default_poller to run_tests.py instances.')
369 argp.add_argument('--dry_run',
370 default=False,
371 action='store_const',
372 const=True,
373 help='Only print what would be run.')
374 argp.add_argument('--filter_pr_tests',
375 default=False,
376 action='store_const',
377 const=True,
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100378 help='Filters out tests irrelevant to pull request changes.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700379 argp.add_argument('--base_branch',
380 default='origin/master',
381 type=str,
382 help='Branch that pull request is requesting to merge into')
383 argp.add_argument('--inner_jobs',
384 default=_DEFAULT_INNER_JOBS,
385 type=int,
386 help='Number of jobs in each run_tests.py instance')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100387 argp.add_argument('-n', '--runs_per_test', default=1, type=_runs_per_test_type,
388 help='How many times to run each tests. >1 runs implies ' +
389 'omitting passing test from the output & reports.')
Craig Tillerceea9692017-04-21 07:49:57 -0700390 argp.add_argument('--max_time', default=-1, type=int,
391 help='Maximum amount of time to run tests for' +
392 '(other tests will be skipped)')
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200393 argp.add_argument('--internal_ci',
394 default=False,
395 action='store_const',
396 const=True,
397 help='Put reports into subdirectories to improve presentation of '
398 'results by Internal CI.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700399 args = argp.parse_args()
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200400
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200401 if args.internal_ci:
402 _report_filename = _report_filename_internal_ci # override the function
403
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700404 extra_args = []
405 if args.build_only:
406 extra_args.append('--build_only')
407 if args.force_default_poller:
408 extra_args.append('--force_default_poller')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100409 if args.runs_per_test > 1:
410 extra_args.append('-n')
411 extra_args.append('%s' % args.runs_per_test)
412 extra_args.append('--quiet_success')
Craig Tillerceea9692017-04-21 07:49:57 -0700413 if args.max_time > 0:
414 extra_args.extend(('--max_time', '%d' % args.max_time))
Matt Kwongfef98962016-10-27 10:45:47 -0700415
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700416 all_jobs = _create_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs) + \
417 _create_portability_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200418
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700419 jobs = []
420 for job in all_jobs:
421 if not args.filter or all(filter in job.labels for filter in args.filter):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100422 if not any(exclude_label in job.labels for exclude_label in args.exclude):
423 jobs.append(job)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200424
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700425 if not jobs:
426 jobset.message('FAILED', 'No test suites match given criteria.',
427 do_newline=True)
428 sys.exit(1)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200429
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700430 print('IMPORTANT: The changes you are testing need to be locally committed')
431 print('because only the committed changes in the current branch will be')
432 print('copied to the docker environment or into subworkspaces.')
murgatroid991687cab2016-10-11 11:42:01 -0700433
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700434 skipped_jobs = []
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200435
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700436 if args.filter_pr_tests:
437 print('Looking for irrelevant tests to skip...')
438 relevant_jobs = filter_tests(jobs, args.base_branch)
439 if len(relevant_jobs) == len(jobs):
440 print('No tests will be skipped.')
441 else:
442 print('These tests will be skipped:')
Matt Kwongaa6c94c2016-11-09 15:53:23 -0800443 skipped_jobs = list(set(jobs) - set(relevant_jobs))
444 # Sort by shortnames to make printing of skipped tests consistent
445 skipped_jobs.sort(key=lambda job: job.shortname)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700446 for job in list(skipped_jobs):
447 print(' %s' % job.shortname)
448 jobs = relevant_jobs
449
450 print('Will run these tests:')
451 for job in jobs:
452 if args.dry_run:
453 print(' %s: "%s"' % (job.shortname, ' '.join(job.cmdline)))
454 else:
455 print(' %s' % job.shortname)
Matt Kwong5c691c62016-10-20 17:11:18 -0700456 print
457
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200458 if args.dry_run:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700459 print('--dry_run was used, exiting')
460 sys.exit(1)
461
462 jobset.message('START', 'Running test matrix.', do_newline=True)
463 num_failures, resultset = jobset.run(jobs,
464 newline_on_success=True,
465 travis=True,
466 maxjobs=args.jobs)
467 # Merge skipped tests into results to show skipped tests on report.xml
468 if skipped_jobs:
Nathaniel Manista21e7dfc2017-03-12 18:24:09 +0000469 ignored_num_skipped_failures, skipped_results = jobset.run(
470 skipped_jobs, skip_jobs=True)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700471 resultset.update(skipped_results)
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200472 report_utils.render_junit_xml_report(resultset, _report_filename('aggregate_tests'),
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700473 suite_name='aggregate_tests')
474
475 if num_failures == 0:
476 jobset.message('SUCCESS', 'All run_tests.py instance finished successfully.',
477 do_newline=True)
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200478 else:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700479 jobset.message('FAILED', 'Some run_tests.py instance have failed.',
480 do_newline=True)
481 sys.exit(1)