blob: 7c58d8efb14aed5875bb29f606ddfe7bc0ff91b8 [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 Tattermusch29828c52017-09-12 16:42:55 +020032_DEFAULT_RUNTESTS_TIMEOUT = 1*60*60
33
Jan Tattermusch060eb872016-09-20 16:06:13 +020034# Set the timeout high to allow enough time for sanitizers and pre-building
35# clang docker.
Jan Tattermusch29828c52017-09-12 16:42:55 +020036_CPP_RUNTESTS_TIMEOUT = 4*60*60
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020037
Jan Tattermusch67cd21e2017-09-19 16:21:20 +020038# C++ TSAN takes longer than other sanitizers
39_CPP_TSAN_RUNTESTS_TIMEOUT = 8*60*60
40
Jan Tattermuscha1906d52016-09-19 18:37:17 +020041# Number of jobs assigned to each run_tests.py instance
Matt Kwongfef98962016-10-27 10:45:47 -070042_DEFAULT_INNER_JOBS = 2
Jan Tattermuscha1906d52016-09-19 18:37:17 +020043
Jan Tattermusch5a59c432017-03-07 19:57:13 +010044# report suffix is important for reports to get picked up by internal CI
45_REPORT_SUFFIX = 'sponge_log.xml'
46
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020047
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020048def _report_filename(name):
49 """Generates report file name"""
50 return 'report_%s_%s' % (name, _REPORT_SUFFIX)
51
52
53def _report_filename_internal_ci(name):
54 """Generates report file name that leads to better presentation by internal CI"""
55 return '%s/%s' % (name, _REPORT_SUFFIX)
56
57
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080058def _docker_jobspec(name, runtests_args=[], runtests_envs={},
Jan Tattermusch29828c52017-09-12 16:42:55 +020059 inner_jobs=_DEFAULT_INNER_JOBS,
60 timeout_seconds=None):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020061 """Run a single instance of run_tests.py in a docker container"""
Jan Tattermusch29828c52017-09-12 16:42:55 +020062 if not timeout_seconds:
63 timeout_seconds = _DEFAULT_RUNTESTS_TIMEOUT
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020064 test_job = jobset.JobSpec(
65 cmdline=['python', 'tools/run_tests/run_tests.py',
66 '--use_docker',
67 '-t',
Matt Kwongfef98962016-10-27 10:45:47 -070068 '-j', str(inner_jobs),
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020069 '-x', _report_filename(name),
Jan Tattermuschcfcc0752016-10-09 17:02:34 +020070 '--report_suite_name', '%s' % name] + runtests_args,
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080071 environ=runtests_envs,
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020072 shortname='run_tests_%s' % name,
Jan Tattermusch29828c52017-09-12 16:42:55 +020073 timeout_seconds=timeout_seconds)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020074 return test_job
75
76
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080077def _workspace_jobspec(name, runtests_args=[], workspace_name=None,
Jan Tattermusch29828c52017-09-12 16:42:55 +020078 runtests_envs={}, inner_jobs=_DEFAULT_INNER_JOBS,
79 timeout_seconds=None):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020080 """Run a single instance of run_tests.py in a separate workspace"""
Jan Tattermuscha1906d52016-09-19 18:37:17 +020081 if not workspace_name:
82 workspace_name = 'workspace_%s' % name
Jan Tattermusch29828c52017-09-12 16:42:55 +020083 if not timeout_seconds:
84 timeout_seconds = _DEFAULT_RUNTESTS_TIMEOUT
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020085 env = {'WORKSPACE_NAME': workspace_name}
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080086 env.update(runtests_envs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020087 test_job = jobset.JobSpec(
Jan Tattermuschff61b8c2017-03-01 15:57:33 +010088 cmdline=['bash',
89 'tools/run_tests/helper_scripts/run_tests_in_workspace.sh',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020090 '-t',
Matt Kwongfef98962016-10-27 10:45:47 -070091 '-j', str(inner_jobs),
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020092 '-x', '../%s' % _report_filename(name),
Jan Tattermuschcfcc0752016-10-09 17:02:34 +020093 '--report_suite_name', '%s' % name] + runtests_args,
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020094 environ=env,
95 shortname='run_tests_%s' % name,
Jan Tattermusch29828c52017-09-12 16:42:55 +020096 timeout_seconds=timeout_seconds)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020097 return test_job
98
99
murgatroid991191b722017-02-08 11:56:52 -0800100def _generate_jobs(languages, configs, platforms, iomgr_platform = 'native',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200101 arch=None, compiler=None,
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800102 labels=[], extra_args=[], extra_envs={},
Jan Tattermusch29828c52017-09-12 16:42:55 +0200103 inner_jobs=_DEFAULT_INNER_JOBS,
104 timeout_seconds=None):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200105 result = []
106 for language in languages:
107 for platform in platforms:
108 for config in configs:
murgatroid991191b722017-02-08 11:56:52 -0800109 name = '%s_%s_%s_%s' % (language, platform, config, iomgr_platform)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200110 runtests_args = ['-l', language,
murgatroid99d0cda5c2017-03-07 18:04:52 -0800111 '-c', config,
112 '--iomgr_platform', iomgr_platform]
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200113 if arch or compiler:
114 name += '_%s_%s' % (arch, compiler)
115 runtests_args += ['--arch', arch,
116 '--compiler', compiler]
Jan Tattermusch0b0d9d42017-06-13 09:55:59 +0200117 if '--build_only' in extra_args:
118 name += '_buildonly'
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800119 for extra_env in extra_envs:
Yuchen Zeng87b59102016-11-08 10:50:12 -0800120 name += '_%s_%s' % (extra_env, extra_envs[extra_env])
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200121
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200122 runtests_args += extra_args
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200123 if platform == 'linux':
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800124 job = _docker_jobspec(name=name, runtests_args=runtests_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200125 runtests_envs=extra_envs, inner_jobs=inner_jobs,
126 timeout_seconds=timeout_seconds)
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,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200129 runtests_envs=extra_envs, inner_jobs=inner_jobs,
130 timeout_seconds=timeout_seconds)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200131
murgatroid99d0cda5c2017-03-07 18:04:52 -0800132 job.labels = [platform, config, language, iomgr_platform] + labels
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200133 result.append(job)
134 return result
135
136
Matt Kwongfef98962016-10-27 10:45:47 -0700137def _create_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200138 test_jobs = []
139 # supported on linux only
140 test_jobs += _generate_jobs(languages=['sanity', 'php7'],
141 configs=['dbg', 'opt'],
142 platforms=['linux'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200143 labels=['basictests', 'multilang'],
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 all platforms.
Jan Tattermuscha3899422017-07-13 11:24:02 +0200148 test_jobs += _generate_jobs(languages=['c'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200149 configs=['dbg', 'opt'],
150 platforms=['linux', 'macos', 'windows'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200151 labels=['basictests', 'corelang'],
152 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200153 inner_jobs=inner_jobs,
154 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
murgatroid9938007752017-10-18 11:24:17 -0700155
156 test_jobs += _generate_jobs(languages=['csharp', 'python'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200157 configs=['dbg', 'opt'],
158 platforms=['linux', 'macos', 'windows'],
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 linux and mac.
Jan Tattermuscha3899422017-07-13 11:24:02 +0200164 test_jobs += _generate_jobs(languages=['c++'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200165 configs=['dbg', 'opt'],
166 platforms=['linux', 'macos'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200167 labels=['basictests', 'corelang'],
168 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200169 inner_jobs=inner_jobs,
170 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
murgatroid9938007752017-10-18 11:24:17 -0700171
Matt Kwonge2e7cf42017-09-15 11:17:04 -0700172 test_jobs += _generate_jobs(languages=['grpc-node', 'ruby', 'php'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200173 configs=['dbg', 'opt'],
174 platforms=['linux', 'macos'],
175 labels=['basictests', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700176 extra_args=extra_args,
177 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700178
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200179 # supported on mac only.
180 test_jobs += _generate_jobs(languages=['objc'],
181 configs=['dbg', 'opt'],
182 platforms=['macos'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200183 labels=['basictests', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700184 extra_args=extra_args,
185 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700186
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200187 # sanitizers
188 test_jobs += _generate_jobs(languages=['c'],
Matt Kwongd42f55b2017-05-04 15:29:32 -0700189 configs=['msan', 'asan', 'tsan', 'ubsan'],
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200190 platforms=['linux'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200191 labels=['sanitizers', 'corelang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700192 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200193 inner_jobs=inner_jobs,
194 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200195 test_jobs += _generate_jobs(languages=['c++'],
Jan Tattermusch67cd21e2017-09-19 16:21:20 +0200196 configs=['asan'],
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200197 platforms=['linux'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200198 labels=['sanitizers', 'corelang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700199 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200200 inner_jobs=inner_jobs,
201 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
Jan Tattermusch67cd21e2017-09-19 16:21:20 +0200202 test_jobs += _generate_jobs(languages=['c++'],
203 configs=['tsan'],
204 platforms=['linux'],
205 labels=['sanitizers', 'corelang'],
206 extra_args=extra_args,
207 inner_jobs=inner_jobs,
208 timeout_seconds=_CPP_TSAN_RUNTESTS_TIMEOUT)
murgatroid991687cab2016-10-11 11:42:01 -0700209
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200210 return test_jobs
211
murgatroid991687cab2016-10-11 11:42:01 -0700212
Matt Kwongfef98962016-10-27 10:45:47 -0700213def _create_portability_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200214 test_jobs = []
215 # portability C x86
216 test_jobs += _generate_jobs(languages=['c'],
217 configs=['dbg'],
218 platforms=['linux'],
219 arch='x86',
220 compiler='default',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200221 labels=['portability', 'corelang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700222 extra_args=extra_args,
223 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700224
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200225 # portability C and C++ on x64
Ken Payson02909062017-05-04 12:33:58 -0700226 for compiler in ['gcc4.8', 'gcc5.3', 'gcc_musl',
Matt Kwonge3beac92016-11-01 12:53:04 -0700227 'clang3.5', 'clang3.6', 'clang3.7']:
Vijay Paiadd2e4d2017-05-10 10:25:13 -0700228 test_jobs += _generate_jobs(languages=['c', 'c++'],
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200229 configs=['dbg'],
230 platforms=['linux'],
231 arch='x64',
232 compiler=compiler,
Jan Tattermuscha3899422017-07-13 11:24:02 +0200233 labels=['portability', 'corelang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700234 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200235 inner_jobs=inner_jobs,
236 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
murgatroid991687cab2016-10-11 11:42:01 -0700237
Jan Tattermuscha8003e82017-08-23 15:43:17 +0200238 # portability C on Windows 64-bit (x86 is the default)
239 test_jobs += _generate_jobs(languages=['c'],
240 configs=['dbg'],
241 platforms=['windows'],
242 arch='x64',
243 compiler='default',
244 labels=['portability', 'corelang'],
245 extra_args=extra_args,
246 inner_jobs=inner_jobs)
Jan Tattermuschadd32252017-06-26 17:13:14 +0200247
248 # portability C++ on Windows
249 # TODO(jtattermusch): some of the tests are failing, so we force --build_only
250 test_jobs += _generate_jobs(languages=['c++'],
251 configs=['dbg'],
252 platforms=['windows'],
253 arch='default',
254 compiler='default',
255 labels=['portability', 'corelang'],
256 extra_args=extra_args + ['--build_only'],
257 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700258
Jan Tattermuscha8003e82017-08-23 15:43:17 +0200259 # portability C and C++ on Windows using VS2017 (build only)
260 # TODO(jtattermusch): some of the tests are failing, so we force --build_only
261 test_jobs += _generate_jobs(languages=['c', 'c++'],
262 configs=['dbg'],
263 platforms=['windows'],
264 arch='x64',
265 compiler='cmake_vs2017',
266 labels=['portability', 'corelang'],
267 extra_args=extra_args + ['--build_only'],
268 inner_jobs=inner_jobs)
269
Yuchen Zeng15618622017-03-19 22:31:14 -0700270 # C and C++ with the c-ares DNS resolver on Linux
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800271 test_jobs += _generate_jobs(languages=['c', 'c++'],
Yuchen Zeng87b59102016-11-08 10:50:12 -0800272 configs=['dbg'], platforms=['linux'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200273 labels=['portability', 'corelang'],
Yuchen Zeng87b59102016-11-08 10:50:12 -0800274 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200275 extra_envs={'GRPC_DNS_RESOLVER': 'ares'},
276 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
Yuchen Zeng87b59102016-11-08 10:50:12 -0800277
Yuchen Zeng15618622017-03-19 22:31:14 -0700278 # TODO(zyc): Turn on this test after adding c-ares support on windows.
Jan Tattermusch29828c52017-09-12 16:42:55 +0200279 # C with the c-ares DNS resolver on Windows
Yuchen Zeng15618622017-03-19 22:31:14 -0700280 # test_jobs += _generate_jobs(languages=['c'],
281 # configs=['dbg'], platforms=['windows'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200282 # labels=['portability', 'corelang'],
Yuchen Zeng15618622017-03-19 22:31:14 -0700283 # extra_args=extra_args,
284 # extra_envs={'GRPC_DNS_RESOLVER': 'ares'})
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800285
Jan Tattermuschadd32252017-06-26 17:13:14 +0200286 # C and C++ build with cmake on Linux
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100287 # TODO(jtattermusch): some of the tests are failing, so we force --build_only
288 # to make sure it's buildable at least.
289 test_jobs += _generate_jobs(languages=['c', 'c++'],
290 configs=['dbg'],
Jan Tattermuschadd32252017-06-26 17:13:14 +0200291 platforms=['linux'],
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100292 arch='default',
293 compiler='cmake',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200294 labels=['portability', 'corelang'],
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100295 extra_args=extra_args + ['--build_only'],
296 inner_jobs=inner_jobs)
297
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200298 test_jobs += _generate_jobs(languages=['python'],
299 configs=['dbg'],
300 platforms=['linux'],
301 arch='default',
Ken Payson02909062017-05-04 12:33:58 -0700302 compiler='python_alpine',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200303 labels=['portability', 'multilang'],
Ken Payson02909062017-05-04 12:33:58 -0700304 extra_args=extra_args,
305 inner_jobs=inner_jobs)
306
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200307 test_jobs += _generate_jobs(languages=['csharp'],
308 configs=['dbg'],
309 platforms=['linux'],
310 arch='default',
311 compiler='coreclr',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200312 labels=['portability', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700313 extra_args=extra_args,
314 inner_jobs=inner_jobs)
murgatroid99804c9e92016-12-05 12:19:57 -0800315
murgatroid991191b722017-02-08 11:56:52 -0800316 test_jobs += _generate_jobs(languages=['c'],
317 configs=['dbg'],
318 platforms=['linux'],
319 iomgr_platform='uv',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200320 labels=['portability', 'corelang'],
murgatroid991191b722017-02-08 11:56:52 -0800321 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200322 inner_jobs=inner_jobs,
323 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
murgatroid991191b722017-02-08 11:56:52 -0800324
murgatroid991687cab2016-10-11 11:42:01 -0700325 return test_jobs
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200326
327
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200328def _allowed_labels():
329 """Returns a list of existing job labels."""
330 all_labels = set()
331 for job in _create_test_jobs() + _create_portability_test_jobs():
332 for label in job.labels:
333 all_labels.add(label)
334 return sorted(all_labels)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200335
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200336
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100337def _runs_per_test_type(arg_str):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100338 """Auxiliary function to parse the "runs_per_test" flag."""
339 try:
340 n = int(arg_str)
341 if n <= 0: raise ValueError
342 return n
343 except:
344 msg = '\'{}\' is not a positive integer'.format(arg_str)
345 raise argparse.ArgumentTypeError(msg)
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100346
347
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700348if __name__ == "__main__":
349 argp = argparse.ArgumentParser(description='Run a matrix of run_tests.py tests.')
350 argp.add_argument('-j', '--jobs',
351 default=multiprocessing.cpu_count()/_DEFAULT_INNER_JOBS,
352 type=int,
353 help='Number of concurrent run_tests.py instances.')
354 argp.add_argument('-f', '--filter',
355 choices=_allowed_labels(),
356 nargs='+',
357 default=[],
358 help='Filter targets to run by label with AND semantics.')
Jan Tattermusch6a851292016-12-20 10:20:42 +0100359 argp.add_argument('--exclude',
360 choices=_allowed_labels(),
361 nargs='+',
362 default=[],
363 help='Exclude targets with any of given labels.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700364 argp.add_argument('--build_only',
365 default=False,
366 action='store_const',
367 const=True,
368 help='Pass --build_only flag to run_tests.py instances.')
369 argp.add_argument('--force_default_poller', default=False, action='store_const', const=True,
370 help='Pass --force_default_poller to run_tests.py instances.')
371 argp.add_argument('--dry_run',
372 default=False,
373 action='store_const',
374 const=True,
375 help='Only print what would be run.')
376 argp.add_argument('--filter_pr_tests',
377 default=False,
378 action='store_const',
379 const=True,
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100380 help='Filters out tests irrelevant to pull request changes.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700381 argp.add_argument('--base_branch',
382 default='origin/master',
383 type=str,
384 help='Branch that pull request is requesting to merge into')
385 argp.add_argument('--inner_jobs',
386 default=_DEFAULT_INNER_JOBS,
387 type=int,
388 help='Number of jobs in each run_tests.py instance')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100389 argp.add_argument('-n', '--runs_per_test', default=1, type=_runs_per_test_type,
390 help='How many times to run each tests. >1 runs implies ' +
391 'omitting passing test from the output & reports.')
Craig Tillerceea9692017-04-21 07:49:57 -0700392 argp.add_argument('--max_time', default=-1, type=int,
393 help='Maximum amount of time to run tests for' +
394 '(other tests will be skipped)')
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200395 argp.add_argument('--internal_ci',
396 default=False,
397 action='store_const',
398 const=True,
399 help='Put reports into subdirectories to improve presentation of '
400 'results by Internal CI.')
Matt Kwong52ff9862017-04-17 13:56:51 -0700401 argp.add_argument('--bq_result_table',
402 default='',
403 type=str,
404 nargs='?',
405 help='Upload test results to a specified BQ table.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700406 args = argp.parse_args()
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200407
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200408 if args.internal_ci:
409 _report_filename = _report_filename_internal_ci # override the function
410
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700411 extra_args = []
412 if args.build_only:
413 extra_args.append('--build_only')
414 if args.force_default_poller:
415 extra_args.append('--force_default_poller')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100416 if args.runs_per_test > 1:
417 extra_args.append('-n')
418 extra_args.append('%s' % args.runs_per_test)
419 extra_args.append('--quiet_success')
Craig Tillerceea9692017-04-21 07:49:57 -0700420 if args.max_time > 0:
421 extra_args.extend(('--max_time', '%d' % args.max_time))
Matt Kwong52ff9862017-04-17 13:56:51 -0700422 if args.bq_result_table:
423 extra_args.append('--bq_result_table')
424 extra_args.append('%s' % args.bq_result_table)
425 extra_args.append('--measure_cpu_costs')
Matt Kwongc5fd8902017-08-10 13:39:21 -0700426 extra_args.append('--disable_auto_set_flakes')
Matt Kwongfef98962016-10-27 10:45:47 -0700427
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700428 all_jobs = _create_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs) + \
429 _create_portability_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200430
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700431 jobs = []
432 for job in all_jobs:
433 if not args.filter or all(filter in job.labels for filter in args.filter):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100434 if not any(exclude_label in job.labels for exclude_label in args.exclude):
435 jobs.append(job)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200436
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700437 if not jobs:
438 jobset.message('FAILED', 'No test suites match given criteria.',
439 do_newline=True)
440 sys.exit(1)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200441
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700442 print('IMPORTANT: The changes you are testing need to be locally committed')
443 print('because only the committed changes in the current branch will be')
444 print('copied to the docker environment or into subworkspaces.')
murgatroid991687cab2016-10-11 11:42:01 -0700445
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700446 skipped_jobs = []
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200447
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700448 if args.filter_pr_tests:
449 print('Looking for irrelevant tests to skip...')
450 relevant_jobs = filter_tests(jobs, args.base_branch)
451 if len(relevant_jobs) == len(jobs):
452 print('No tests will be skipped.')
453 else:
454 print('These tests will be skipped:')
Matt Kwongaa6c94c2016-11-09 15:53:23 -0800455 skipped_jobs = list(set(jobs) - set(relevant_jobs))
456 # Sort by shortnames to make printing of skipped tests consistent
457 skipped_jobs.sort(key=lambda job: job.shortname)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700458 for job in list(skipped_jobs):
459 print(' %s' % job.shortname)
460 jobs = relevant_jobs
461
462 print('Will run these tests:')
463 for job in jobs:
464 if args.dry_run:
465 print(' %s: "%s"' % (job.shortname, ' '.join(job.cmdline)))
466 else:
467 print(' %s' % job.shortname)
Matt Kwong5c691c62016-10-20 17:11:18 -0700468 print
469
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200470 if args.dry_run:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700471 print('--dry_run was used, exiting')
472 sys.exit(1)
473
474 jobset.message('START', 'Running test matrix.', do_newline=True)
475 num_failures, resultset = jobset.run(jobs,
476 newline_on_success=True,
477 travis=True,
478 maxjobs=args.jobs)
479 # Merge skipped tests into results to show skipped tests on report.xml
480 if skipped_jobs:
Nathaniel Manista21e7dfc2017-03-12 18:24:09 +0000481 ignored_num_skipped_failures, skipped_results = jobset.run(
482 skipped_jobs, skip_jobs=True)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700483 resultset.update(skipped_results)
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200484 report_utils.render_junit_xml_report(resultset, _report_filename('aggregate_tests'),
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700485 suite_name='aggregate_tests')
486
487 if num_failures == 0:
488 jobset.message('SUCCESS', 'All run_tests.py instance finished successfully.',
489 do_newline=True)
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200490 else:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700491 jobset.message('FAILED', 'Some run_tests.py instance have failed.',
492 do_newline=True)
493 sys.exit(1)