blob: 7d26b284dadb519a1847e75364c8ee67a0ac8614 [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]
Jan Tattermusch0b0d9d42017-06-13 09:55:59 +0200105 if '--build_only' in extra_args:
106 name += '_buildonly'
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800107 for extra_env in extra_envs:
Yuchen Zeng87b59102016-11-08 10:50:12 -0800108 name += '_%s_%s' % (extra_env, extra_envs[extra_env])
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200109
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200110 runtests_args += extra_args
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200111 if platform == 'linux':
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800112 job = _docker_jobspec(name=name, runtests_args=runtests_args,
113 runtests_envs=extra_envs, inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200114 else:
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800115 job = _workspace_jobspec(name=name, runtests_args=runtests_args,
116 runtests_envs=extra_envs, inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200117
murgatroid99d0cda5c2017-03-07 18:04:52 -0800118 job.labels = [platform, config, language, iomgr_platform] + labels
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200119 result.append(job)
120 return result
121
122
Matt Kwongfef98962016-10-27 10:45:47 -0700123def _create_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200124 test_jobs = []
125 # supported on linux only
126 test_jobs += _generate_jobs(languages=['sanity', 'php7'],
127 configs=['dbg', 'opt'],
128 platforms=['linux'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200129 labels=['basictests', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700130 extra_args=extra_args,
131 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700132
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200133 # supported on all platforms.
Jan Tattermuscha3899422017-07-13 11:24:02 +0200134 test_jobs += _generate_jobs(languages=['c'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200135 configs=['dbg', 'opt'],
136 platforms=['linux', 'macos', 'windows'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200137 labels=['basictests', 'corelang'],
138 extra_args=extra_args,
139 inner_jobs=inner_jobs)
140
141 test_jobs += _generate_jobs(languages=['csharp', 'node', 'python'],
142 configs=['dbg', 'opt'],
143 platforms=['linux', 'macos', 'windows'],
144 labels=['basictests', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700145 extra_args=extra_args,
146 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700147
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200148 # supported on linux and mac.
Jan Tattermuscha3899422017-07-13 11:24:02 +0200149 test_jobs += _generate_jobs(languages=['c++'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200150 configs=['dbg', 'opt'],
151 platforms=['linux', 'macos'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200152 labels=['basictests', 'corelang'],
153 extra_args=extra_args,
154 inner_jobs=inner_jobs)
155
156 test_jobs += _generate_jobs(languages=['ruby', 'php'],
157 configs=['dbg', 'opt'],
158 platforms=['linux', 'macos'],
159 labels=['basictests', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700160 extra_args=extra_args,
161 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700162
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200163 # supported on mac only.
164 test_jobs += _generate_jobs(languages=['objc'],
165 configs=['dbg', 'opt'],
166 platforms=['macos'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200167 labels=['basictests', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700168 extra_args=extra_args,
169 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700170
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200171 # sanitizers
172 test_jobs += _generate_jobs(languages=['c'],
Matt Kwongd42f55b2017-05-04 15:29:32 -0700173 configs=['msan', 'asan', 'tsan', 'ubsan'],
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200174 platforms=['linux'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200175 labels=['sanitizers', 'corelang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700176 extra_args=extra_args,
177 inner_jobs=inner_jobs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200178 test_jobs += _generate_jobs(languages=['c++'],
179 configs=['asan', 'tsan'],
180 platforms=['linux'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200181 labels=['sanitizers', 'corelang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700182 extra_args=extra_args,
183 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700184
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200185 return test_jobs
186
murgatroid991687cab2016-10-11 11:42:01 -0700187
Matt Kwongfef98962016-10-27 10:45:47 -0700188def _create_portability_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200189 test_jobs = []
190 # portability C x86
191 test_jobs += _generate_jobs(languages=['c'],
192 configs=['dbg'],
193 platforms=['linux'],
194 arch='x86',
195 compiler='default',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200196 labels=['portability', 'corelang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700197 extra_args=extra_args,
198 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700199
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200200 # portability C and C++ on x64
Ken Payson02909062017-05-04 12:33:58 -0700201 for compiler in ['gcc4.8', 'gcc5.3', 'gcc_musl',
Matt Kwonge3beac92016-11-01 12:53:04 -0700202 'clang3.5', 'clang3.6', 'clang3.7']:
Vijay Paiadd2e4d2017-05-10 10:25:13 -0700203 test_jobs += _generate_jobs(languages=['c', 'c++'],
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200204 configs=['dbg'],
205 platforms=['linux'],
206 arch='x64',
207 compiler=compiler,
Jan Tattermuscha3899422017-07-13 11:24:02 +0200208 labels=['portability', 'corelang'],
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']:
Jan Tattermuschadd32252017-06-26 17:13:14 +0200214 test_jobs += _generate_jobs(languages=['c'],
215 configs=['dbg'],
216 platforms=['windows'],
217 arch=arch,
218 compiler='default',
219 labels=['portability', 'corelang'],
220 extra_args=extra_args,
221 inner_jobs=inner_jobs)
222
223 # portability C++ on Windows
224 # TODO(jtattermusch): some of the tests are failing, so we force --build_only
225 test_jobs += _generate_jobs(languages=['c++'],
226 configs=['dbg'],
227 platforms=['windows'],
228 arch='default',
229 compiler='default',
230 labels=['portability', 'corelang'],
231 extra_args=extra_args + ['--build_only'],
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'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200237 labels=['portability', 'corelang'],
Yuchen Zeng87b59102016-11-08 10:50:12 -0800238 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'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200245 # labels=['portability', 'corelang'],
Yuchen Zeng15618622017-03-19 22:31:14 -0700246 # extra_args=extra_args,
247 # extra_envs={'GRPC_DNS_RESOLVER': 'ares'})
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800248
Jan Tattermuschadd32252017-06-26 17:13:14 +0200249 # C and C++ build with cmake on Linux
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100250 # 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'],
Jan Tattermuschadd32252017-06-26 17:13:14 +0200254 platforms=['linux'],
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100255 arch='default',
256 compiler='cmake',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200257 labels=['portability', 'corelang'],
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100258 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',
Ken Payson02909062017-05-04 12:33:58 -0700265 compiler='python_alpine',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200266 labels=['portability', 'multilang'],
Ken Payson02909062017-05-04 12:33:58 -0700267 extra_args=extra_args,
268 inner_jobs=inner_jobs)
269
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200270 test_jobs += _generate_jobs(languages=['csharp'],
271 configs=['dbg'],
272 platforms=['linux'],
273 arch='default',
274 compiler='coreclr',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200275 labels=['portability', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700276 extra_args=extra_args,
277 inner_jobs=inner_jobs)
murgatroid99804c9e92016-12-05 12:19:57 -0800278
murgatroid991191b722017-02-08 11:56:52 -0800279 test_jobs += _generate_jobs(languages=['c'],
280 configs=['dbg'],
281 platforms=['linux'],
282 iomgr_platform='uv',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200283 labels=['portability', 'corelang'],
murgatroid991191b722017-02-08 11:56:52 -0800284 extra_args=extra_args,
285 inner_jobs=inner_jobs)
286
murgatroid99804c9e92016-12-05 12:19:57 -0800287 test_jobs += _generate_jobs(languages=['node'],
288 configs=['dbg'],
289 platforms=['linux'],
290 arch='default',
murgatroid99f25f5052017-04-13 17:22:32 -0700291 compiler='electron1.6',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200292 labels=['portability', 'multilang'],
murgatroid991191b722017-02-08 11:56:52 -0800293 extra_args=extra_args,
294 inner_jobs=inner_jobs)
295
296 test_jobs += _generate_jobs(languages=['node'],
297 configs=['dbg'],
298 platforms=['linux'],
299 arch='default',
300 compiler='node4',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200301 labels=['portability', 'multilang'],
murgatroid991191b722017-02-08 11:56:52 -0800302 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='node6',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200310 labels=['portability', 'multilang'],
murgatroid991191b722017-02-08 11:56:52 -0800311 extra_args=extra_args,
312 inner_jobs=inner_jobs)
313
murgatroid994bea5b92017-05-30 17:37:02 -0700314 test_jobs += _generate_jobs(languages=['node'],
315 configs=['dbg'],
316 platforms=['linux'],
317 arch='default',
318 compiler='node7',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200319 labels=['portability', 'multilang'],
murgatroid994bea5b92017-05-30 17:37:02 -0700320 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 Kwong52ff9862017-04-17 13:56:51 -0700399 argp.add_argument('--bq_result_table',
400 default='',
401 type=str,
402 nargs='?',
403 help='Upload test results to a specified BQ table.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700404 args = argp.parse_args()
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200405
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200406 if args.internal_ci:
407 _report_filename = _report_filename_internal_ci # override the function
408
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700409 extra_args = []
410 if args.build_only:
411 extra_args.append('--build_only')
412 if args.force_default_poller:
413 extra_args.append('--force_default_poller')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100414 if args.runs_per_test > 1:
415 extra_args.append('-n')
416 extra_args.append('%s' % args.runs_per_test)
417 extra_args.append('--quiet_success')
Craig Tillerceea9692017-04-21 07:49:57 -0700418 if args.max_time > 0:
419 extra_args.extend(('--max_time', '%d' % args.max_time))
Matt Kwong52ff9862017-04-17 13:56:51 -0700420 if args.bq_result_table:
421 extra_args.append('--bq_result_table')
422 extra_args.append('%s' % args.bq_result_table)
423 extra_args.append('--measure_cpu_costs')
Matt Kwongc5fd8902017-08-10 13:39:21 -0700424 extra_args.append('--disable_auto_set_flakes')
Matt Kwongfef98962016-10-27 10:45:47 -0700425
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700426 all_jobs = _create_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs) + \
427 _create_portability_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200428
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700429 jobs = []
430 for job in all_jobs:
431 if not args.filter or all(filter in job.labels for filter in args.filter):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100432 if not any(exclude_label in job.labels for exclude_label in args.exclude):
433 jobs.append(job)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200434
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700435 if not jobs:
436 jobset.message('FAILED', 'No test suites match given criteria.',
437 do_newline=True)
438 sys.exit(1)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200439
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700440 print('IMPORTANT: The changes you are testing need to be locally committed')
441 print('because only the committed changes in the current branch will be')
442 print('copied to the docker environment or into subworkspaces.')
murgatroid991687cab2016-10-11 11:42:01 -0700443
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700444 skipped_jobs = []
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200445
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700446 if args.filter_pr_tests:
447 print('Looking for irrelevant tests to skip...')
448 relevant_jobs = filter_tests(jobs, args.base_branch)
449 if len(relevant_jobs) == len(jobs):
450 print('No tests will be skipped.')
451 else:
452 print('These tests will be skipped:')
Matt Kwongaa6c94c2016-11-09 15:53:23 -0800453 skipped_jobs = list(set(jobs) - set(relevant_jobs))
454 # Sort by shortnames to make printing of skipped tests consistent
455 skipped_jobs.sort(key=lambda job: job.shortname)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700456 for job in list(skipped_jobs):
457 print(' %s' % job.shortname)
458 jobs = relevant_jobs
459
460 print('Will run these tests:')
461 for job in jobs:
462 if args.dry_run:
463 print(' %s: "%s"' % (job.shortname, ' '.join(job.cmdline)))
464 else:
465 print(' %s' % job.shortname)
Matt Kwong5c691c62016-10-20 17:11:18 -0700466 print
467
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200468 if args.dry_run:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700469 print('--dry_run was used, exiting')
470 sys.exit(1)
471
472 jobset.message('START', 'Running test matrix.', do_newline=True)
473 num_failures, resultset = jobset.run(jobs,
474 newline_on_success=True,
475 travis=True,
476 maxjobs=args.jobs)
477 # Merge skipped tests into results to show skipped tests on report.xml
478 if skipped_jobs:
Nathaniel Manista21e7dfc2017-03-12 18:24:09 +0000479 ignored_num_skipped_failures, skipped_results = jobset.run(
480 skipped_jobs, skip_jobs=True)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700481 resultset.update(skipped_results)
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200482 report_utils.render_junit_xml_report(resultset, _report_filename('aggregate_tests'),
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700483 suite_name='aggregate_tests')
484
485 if num_failures == 0:
486 jobset.message('SUCCESS', 'All run_tests.py instance finished successfully.',
487 do_newline=True)
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200488 else:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700489 jobset.message('FAILED', 'Some run_tests.py instance have failed.',
490 do_newline=True)
491 sys.exit(1)