blob: 34d839e0b8b1a7c2b58b43829228b180e34415d9 [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)
Jan Tattermuscha3899422017-07-13 11:24:02 +0200155
156 test_jobs += _generate_jobs(languages=['csharp', 'node', 'python'],
157 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)
Jan Tattermuscha3899422017-07-13 11:24:02 +0200171
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
murgatroid99804c9e92016-12-05 12:19:57 -0800325 test_jobs += _generate_jobs(languages=['node'],
326 configs=['dbg'],
327 platforms=['linux'],
328 arch='default',
murgatroid99f25f5052017-04-13 17:22:32 -0700329 compiler='electron1.6',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200330 labels=['portability', 'multilang'],
murgatroid991191b722017-02-08 11:56:52 -0800331 extra_args=extra_args,
332 inner_jobs=inner_jobs)
333
334 test_jobs += _generate_jobs(languages=['node'],
335 configs=['dbg'],
336 platforms=['linux'],
337 arch='default',
338 compiler='node4',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200339 labels=['portability', 'multilang'],
murgatroid991191b722017-02-08 11:56:52 -0800340 extra_args=extra_args,
341 inner_jobs=inner_jobs)
342
343 test_jobs += _generate_jobs(languages=['node'],
344 configs=['dbg'],
345 platforms=['linux'],
346 arch='default',
347 compiler='node6',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200348 labels=['portability', 'multilang'],
murgatroid991191b722017-02-08 11:56:52 -0800349 extra_args=extra_args,
350 inner_jobs=inner_jobs)
351
murgatroid994bea5b92017-05-30 17:37:02 -0700352 test_jobs += _generate_jobs(languages=['node'],
353 configs=['dbg'],
354 platforms=['linux'],
355 arch='default',
356 compiler='node7',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200357 labels=['portability', 'multilang'],
murgatroid994bea5b92017-05-30 17:37:02 -0700358 extra_args=extra_args,
359 inner_jobs=inner_jobs)
360
murgatroid991687cab2016-10-11 11:42:01 -0700361 return test_jobs
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200362
363
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200364def _allowed_labels():
365 """Returns a list of existing job labels."""
366 all_labels = set()
367 for job in _create_test_jobs() + _create_portability_test_jobs():
368 for label in job.labels:
369 all_labels.add(label)
370 return sorted(all_labels)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200371
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200372
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100373def _runs_per_test_type(arg_str):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100374 """Auxiliary function to parse the "runs_per_test" flag."""
375 try:
376 n = int(arg_str)
377 if n <= 0: raise ValueError
378 return n
379 except:
380 msg = '\'{}\' is not a positive integer'.format(arg_str)
381 raise argparse.ArgumentTypeError(msg)
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100382
383
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700384if __name__ == "__main__":
385 argp = argparse.ArgumentParser(description='Run a matrix of run_tests.py tests.')
386 argp.add_argument('-j', '--jobs',
387 default=multiprocessing.cpu_count()/_DEFAULT_INNER_JOBS,
388 type=int,
389 help='Number of concurrent run_tests.py instances.')
390 argp.add_argument('-f', '--filter',
391 choices=_allowed_labels(),
392 nargs='+',
393 default=[],
394 help='Filter targets to run by label with AND semantics.')
Jan Tattermusch6a851292016-12-20 10:20:42 +0100395 argp.add_argument('--exclude',
396 choices=_allowed_labels(),
397 nargs='+',
398 default=[],
399 help='Exclude targets with any of given labels.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700400 argp.add_argument('--build_only',
401 default=False,
402 action='store_const',
403 const=True,
404 help='Pass --build_only flag to run_tests.py instances.')
405 argp.add_argument('--force_default_poller', default=False, action='store_const', const=True,
406 help='Pass --force_default_poller to run_tests.py instances.')
407 argp.add_argument('--dry_run',
408 default=False,
409 action='store_const',
410 const=True,
411 help='Only print what would be run.')
412 argp.add_argument('--filter_pr_tests',
413 default=False,
414 action='store_const',
415 const=True,
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100416 help='Filters out tests irrelevant to pull request changes.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700417 argp.add_argument('--base_branch',
418 default='origin/master',
419 type=str,
420 help='Branch that pull request is requesting to merge into')
421 argp.add_argument('--inner_jobs',
422 default=_DEFAULT_INNER_JOBS,
423 type=int,
424 help='Number of jobs in each run_tests.py instance')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100425 argp.add_argument('-n', '--runs_per_test', default=1, type=_runs_per_test_type,
426 help='How many times to run each tests. >1 runs implies ' +
427 'omitting passing test from the output & reports.')
Craig Tillerceea9692017-04-21 07:49:57 -0700428 argp.add_argument('--max_time', default=-1, type=int,
429 help='Maximum amount of time to run tests for' +
430 '(other tests will be skipped)')
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200431 argp.add_argument('--internal_ci',
432 default=False,
433 action='store_const',
434 const=True,
435 help='Put reports into subdirectories to improve presentation of '
436 'results by Internal CI.')
Matt Kwong52ff9862017-04-17 13:56:51 -0700437 argp.add_argument('--bq_result_table',
438 default='',
439 type=str,
440 nargs='?',
441 help='Upload test results to a specified BQ table.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700442 args = argp.parse_args()
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200443
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200444 if args.internal_ci:
445 _report_filename = _report_filename_internal_ci # override the function
446
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700447 extra_args = []
448 if args.build_only:
449 extra_args.append('--build_only')
450 if args.force_default_poller:
451 extra_args.append('--force_default_poller')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100452 if args.runs_per_test > 1:
453 extra_args.append('-n')
454 extra_args.append('%s' % args.runs_per_test)
455 extra_args.append('--quiet_success')
Craig Tillerceea9692017-04-21 07:49:57 -0700456 if args.max_time > 0:
457 extra_args.extend(('--max_time', '%d' % args.max_time))
Matt Kwong52ff9862017-04-17 13:56:51 -0700458 if args.bq_result_table:
459 extra_args.append('--bq_result_table')
460 extra_args.append('%s' % args.bq_result_table)
461 extra_args.append('--measure_cpu_costs')
Matt Kwongc5fd8902017-08-10 13:39:21 -0700462 extra_args.append('--disable_auto_set_flakes')
Matt Kwongfef98962016-10-27 10:45:47 -0700463
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700464 all_jobs = _create_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs) + \
465 _create_portability_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200466
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700467 jobs = []
468 for job in all_jobs:
469 if not args.filter or all(filter in job.labels for filter in args.filter):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100470 if not any(exclude_label in job.labels for exclude_label in args.exclude):
471 jobs.append(job)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200472
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700473 if not jobs:
474 jobset.message('FAILED', 'No test suites match given criteria.',
475 do_newline=True)
476 sys.exit(1)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200477
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700478 print('IMPORTANT: The changes you are testing need to be locally committed')
479 print('because only the committed changes in the current branch will be')
480 print('copied to the docker environment or into subworkspaces.')
murgatroid991687cab2016-10-11 11:42:01 -0700481
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700482 skipped_jobs = []
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200483
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700484 if args.filter_pr_tests:
485 print('Looking for irrelevant tests to skip...')
486 relevant_jobs = filter_tests(jobs, args.base_branch)
487 if len(relevant_jobs) == len(jobs):
488 print('No tests will be skipped.')
489 else:
490 print('These tests will be skipped:')
Matt Kwongaa6c94c2016-11-09 15:53:23 -0800491 skipped_jobs = list(set(jobs) - set(relevant_jobs))
492 # Sort by shortnames to make printing of skipped tests consistent
493 skipped_jobs.sort(key=lambda job: job.shortname)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700494 for job in list(skipped_jobs):
495 print(' %s' % job.shortname)
496 jobs = relevant_jobs
497
498 print('Will run these tests:')
499 for job in jobs:
500 if args.dry_run:
501 print(' %s: "%s"' % (job.shortname, ' '.join(job.cmdline)))
502 else:
503 print(' %s' % job.shortname)
Matt Kwong5c691c62016-10-20 17:11:18 -0700504 print
505
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200506 if args.dry_run:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700507 print('--dry_run was used, exiting')
508 sys.exit(1)
509
510 jobset.message('START', 'Running test matrix.', do_newline=True)
511 num_failures, resultset = jobset.run(jobs,
512 newline_on_success=True,
513 travis=True,
514 maxjobs=args.jobs)
515 # Merge skipped tests into results to show skipped tests on report.xml
516 if skipped_jobs:
Nathaniel Manista21e7dfc2017-03-12 18:24:09 +0000517 ignored_num_skipped_failures, skipped_results = jobset.run(
518 skipped_jobs, skip_jobs=True)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700519 resultset.update(skipped_results)
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200520 report_utils.render_junit_xml_report(resultset, _report_filename('aggregate_tests'),
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700521 suite_name='aggregate_tests')
522
523 if num_failures == 0:
524 jobset.message('SUCCESS', 'All run_tests.py instance finished successfully.',
525 do_newline=True)
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200526 else:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700527 jobset.message('FAILED', 'Some run_tests.py instance have failed.',
528 do_newline=True)
529 sys.exit(1)