blob: 957e7b569e29a4c560cf9524d73957a00c84c9db [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 Tattermuscha1906d52016-09-19 18:37:17 +020038# Number of jobs assigned to each run_tests.py instance
Matt Kwongfef98962016-10-27 10:45:47 -070039_DEFAULT_INNER_JOBS = 2
Jan Tattermuscha1906d52016-09-19 18:37:17 +020040
Jan Tattermusch5a59c432017-03-07 19:57:13 +010041# report suffix is important for reports to get picked up by internal CI
42_REPORT_SUFFIX = 'sponge_log.xml'
43
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020044
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020045def _report_filename(name):
46 """Generates report file name"""
47 return 'report_%s_%s' % (name, _REPORT_SUFFIX)
48
49
50def _report_filename_internal_ci(name):
51 """Generates report file name that leads to better presentation by internal CI"""
52 return '%s/%s' % (name, _REPORT_SUFFIX)
53
54
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080055def _docker_jobspec(name, runtests_args=[], runtests_envs={},
Jan Tattermusch29828c52017-09-12 16:42:55 +020056 inner_jobs=_DEFAULT_INNER_JOBS,
57 timeout_seconds=None):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020058 """Run a single instance of run_tests.py in a docker container"""
Jan Tattermusch29828c52017-09-12 16:42:55 +020059 if not timeout_seconds:
60 timeout_seconds = _DEFAULT_RUNTESTS_TIMEOUT
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020061 test_job = jobset.JobSpec(
62 cmdline=['python', 'tools/run_tests/run_tests.py',
63 '--use_docker',
64 '-t',
Matt Kwongfef98962016-10-27 10:45:47 -070065 '-j', str(inner_jobs),
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020066 '-x', _report_filename(name),
Jan Tattermuschcfcc0752016-10-09 17:02:34 +020067 '--report_suite_name', '%s' % name] + runtests_args,
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080068 environ=runtests_envs,
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020069 shortname='run_tests_%s' % name,
Jan Tattermusch29828c52017-09-12 16:42:55 +020070 timeout_seconds=timeout_seconds)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020071 return test_job
72
73
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080074def _workspace_jobspec(name, runtests_args=[], workspace_name=None,
Jan Tattermusch29828c52017-09-12 16:42:55 +020075 runtests_envs={}, inner_jobs=_DEFAULT_INNER_JOBS,
76 timeout_seconds=None):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020077 """Run a single instance of run_tests.py in a separate workspace"""
Jan Tattermuscha1906d52016-09-19 18:37:17 +020078 if not workspace_name:
79 workspace_name = 'workspace_%s' % name
Jan Tattermusch29828c52017-09-12 16:42:55 +020080 if not timeout_seconds:
81 timeout_seconds = _DEFAULT_RUNTESTS_TIMEOUT
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020082 env = {'WORKSPACE_NAME': workspace_name}
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080083 env.update(runtests_envs)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020084 test_job = jobset.JobSpec(
Jan Tattermuschff61b8c2017-03-01 15:57:33 +010085 cmdline=['bash',
86 'tools/run_tests/helper_scripts/run_tests_in_workspace.sh',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020087 '-t',
Matt Kwongfef98962016-10-27 10:45:47 -070088 '-j', str(inner_jobs),
Jan Tattermuschac9c9f92017-04-28 20:56:05 +020089 '-x', '../%s' % _report_filename(name),
Jan Tattermuschcfcc0752016-10-09 17:02:34 +020090 '--report_suite_name', '%s' % name] + runtests_args,
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020091 environ=env,
92 shortname='run_tests_%s' % name,
Jan Tattermusch29828c52017-09-12 16:42:55 +020093 timeout_seconds=timeout_seconds)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020094 return test_job
95
96
murgatroid991191b722017-02-08 11:56:52 -080097def _generate_jobs(languages, configs, platforms, iomgr_platform = 'native',
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +020098 arch=None, compiler=None,
Yuchen Zengfdae4bd2016-11-07 17:46:16 -080099 labels=[], extra_args=[], extra_envs={},
Jan Tattermusch29828c52017-09-12 16:42:55 +0200100 inner_jobs=_DEFAULT_INNER_JOBS,
101 timeout_seconds=None):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200102 result = []
103 for language in languages:
104 for platform in platforms:
105 for config in configs:
murgatroid991191b722017-02-08 11:56:52 -0800106 name = '%s_%s_%s_%s' % (language, platform, config, iomgr_platform)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200107 runtests_args = ['-l', language,
murgatroid99d0cda5c2017-03-07 18:04:52 -0800108 '-c', config,
109 '--iomgr_platform', iomgr_platform]
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200110 if arch or compiler:
111 name += '_%s_%s' % (arch, compiler)
112 runtests_args += ['--arch', arch,
113 '--compiler', compiler]
Jan Tattermusch0b0d9d42017-06-13 09:55:59 +0200114 if '--build_only' in extra_args:
115 name += '_buildonly'
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800116 for extra_env in extra_envs:
Yuchen Zeng87b59102016-11-08 10:50:12 -0800117 name += '_%s_%s' % (extra_env, extra_envs[extra_env])
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200118
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200119 runtests_args += extra_args
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200120 if platform == 'linux':
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800121 job = _docker_jobspec(name=name, runtests_args=runtests_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200122 runtests_envs=extra_envs, inner_jobs=inner_jobs,
123 timeout_seconds=timeout_seconds)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200124 else:
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800125 job = _workspace_jobspec(name=name, runtests_args=runtests_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200126 runtests_envs=extra_envs, inner_jobs=inner_jobs,
127 timeout_seconds=timeout_seconds)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200128
murgatroid99d0cda5c2017-03-07 18:04:52 -0800129 job.labels = [platform, config, language, iomgr_platform] + labels
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200130 result.append(job)
131 return result
132
133
Matt Kwongfef98962016-10-27 10:45:47 -0700134def _create_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200135 test_jobs = []
136 # supported on linux only
137 test_jobs += _generate_jobs(languages=['sanity', 'php7'],
138 configs=['dbg', 'opt'],
139 platforms=['linux'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200140 labels=['basictests', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700141 extra_args=extra_args,
142 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700143
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200144 # supported on all platforms.
Jan Tattermuscha3899422017-07-13 11:24:02 +0200145 test_jobs += _generate_jobs(languages=['c'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200146 configs=['dbg', 'opt'],
147 platforms=['linux', 'macos', 'windows'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200148 labels=['basictests', 'corelang'],
149 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200150 inner_jobs=inner_jobs,
151 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
Jan Tattermuscha3899422017-07-13 11:24:02 +0200152
153 test_jobs += _generate_jobs(languages=['csharp', 'node', 'python'],
154 configs=['dbg', 'opt'],
155 platforms=['linux', 'macos', 'windows'],
156 labels=['basictests', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700157 extra_args=extra_args,
158 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700159
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200160 # supported on linux and mac.
Jan Tattermuscha3899422017-07-13 11:24:02 +0200161 test_jobs += _generate_jobs(languages=['c++'],
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200162 configs=['dbg', 'opt'],
163 platforms=['linux', 'macos'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200164 labels=['basictests', 'corelang'],
165 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200166 inner_jobs=inner_jobs,
167 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
Jan Tattermuscha3899422017-07-13 11:24:02 +0200168
169 test_jobs += _generate_jobs(languages=['ruby', 'php'],
170 configs=['dbg', 'opt'],
171 platforms=['linux', 'macos'],
172 labels=['basictests', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700173 extra_args=extra_args,
174 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700175
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200176 # supported on mac only.
177 test_jobs += _generate_jobs(languages=['objc'],
178 configs=['dbg', 'opt'],
179 platforms=['macos'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200180 labels=['basictests', 'multilang'],
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 # sanitizers
185 test_jobs += _generate_jobs(languages=['c'],
Matt Kwongd42f55b2017-05-04 15:29:32 -0700186 configs=['msan', 'asan', 'tsan', 'ubsan'],
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200187 platforms=['linux'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200188 labels=['sanitizers', 'corelang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700189 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200190 inner_jobs=inner_jobs,
191 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200192 test_jobs += _generate_jobs(languages=['c++'],
193 configs=['asan', 'tsan'],
194 platforms=['linux'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200195 labels=['sanitizers', 'corelang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700196 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200197 inner_jobs=inner_jobs,
198 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
murgatroid991687cab2016-10-11 11:42:01 -0700199
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200200 return test_jobs
201
murgatroid991687cab2016-10-11 11:42:01 -0700202
Matt Kwongfef98962016-10-27 10:45:47 -0700203def _create_portability_test_jobs(extra_args=[], inner_jobs=_DEFAULT_INNER_JOBS):
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200204 test_jobs = []
205 # portability C x86
206 test_jobs += _generate_jobs(languages=['c'],
207 configs=['dbg'],
208 platforms=['linux'],
209 arch='x86',
210 compiler='default',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200211 labels=['portability', 'corelang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700212 extra_args=extra_args,
213 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700214
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200215 # portability C and C++ on x64
Ken Payson02909062017-05-04 12:33:58 -0700216 for compiler in ['gcc4.8', 'gcc5.3', 'gcc_musl',
Matt Kwonge3beac92016-11-01 12:53:04 -0700217 'clang3.5', 'clang3.6', 'clang3.7']:
Vijay Paiadd2e4d2017-05-10 10:25:13 -0700218 test_jobs += _generate_jobs(languages=['c', 'c++'],
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200219 configs=['dbg'],
220 platforms=['linux'],
221 arch='x64',
222 compiler=compiler,
Jan Tattermuscha3899422017-07-13 11:24:02 +0200223 labels=['portability', 'corelang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700224 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200225 inner_jobs=inner_jobs,
226 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
murgatroid991687cab2016-10-11 11:42:01 -0700227
Jan Tattermuscha8003e82017-08-23 15:43:17 +0200228 # portability C on Windows 64-bit (x86 is the default)
229 test_jobs += _generate_jobs(languages=['c'],
230 configs=['dbg'],
231 platforms=['windows'],
232 arch='x64',
233 compiler='default',
234 labels=['portability', 'corelang'],
235 extra_args=extra_args,
236 inner_jobs=inner_jobs)
Jan Tattermuschadd32252017-06-26 17:13:14 +0200237
238 # portability C++ on Windows
239 # TODO(jtattermusch): some of the tests are failing, so we force --build_only
240 test_jobs += _generate_jobs(languages=['c++'],
241 configs=['dbg'],
242 platforms=['windows'],
243 arch='default',
244 compiler='default',
245 labels=['portability', 'corelang'],
246 extra_args=extra_args + ['--build_only'],
247 inner_jobs=inner_jobs)
murgatroid991687cab2016-10-11 11:42:01 -0700248
Jan Tattermuscha8003e82017-08-23 15:43:17 +0200249 # portability C and C++ on Windows using VS2017 (build only)
250 # TODO(jtattermusch): some of the tests are failing, so we force --build_only
251 test_jobs += _generate_jobs(languages=['c', 'c++'],
252 configs=['dbg'],
253 platforms=['windows'],
254 arch='x64',
255 compiler='cmake_vs2017',
256 labels=['portability', 'corelang'],
257 extra_args=extra_args + ['--build_only'],
258 inner_jobs=inner_jobs)
259
Yuchen Zeng15618622017-03-19 22:31:14 -0700260 # C and C++ with the c-ares DNS resolver on Linux
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800261 test_jobs += _generate_jobs(languages=['c', 'c++'],
Yuchen Zeng87b59102016-11-08 10:50:12 -0800262 configs=['dbg'], platforms=['linux'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200263 labels=['portability', 'corelang'],
Yuchen Zeng87b59102016-11-08 10:50:12 -0800264 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200265 extra_envs={'GRPC_DNS_RESOLVER': 'ares'},
266 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
Yuchen Zeng87b59102016-11-08 10:50:12 -0800267
Yuchen Zeng15618622017-03-19 22:31:14 -0700268 # TODO(zyc): Turn on this test after adding c-ares support on windows.
Jan Tattermusch29828c52017-09-12 16:42:55 +0200269 # C with the c-ares DNS resolver on Windows
Yuchen Zeng15618622017-03-19 22:31:14 -0700270 # test_jobs += _generate_jobs(languages=['c'],
271 # configs=['dbg'], platforms=['windows'],
Jan Tattermuscha3899422017-07-13 11:24:02 +0200272 # labels=['portability', 'corelang'],
Yuchen Zeng15618622017-03-19 22:31:14 -0700273 # extra_args=extra_args,
274 # extra_envs={'GRPC_DNS_RESOLVER': 'ares'})
Yuchen Zengfdae4bd2016-11-07 17:46:16 -0800275
Jan Tattermuschadd32252017-06-26 17:13:14 +0200276 # C and C++ build with cmake on Linux
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100277 # TODO(jtattermusch): some of the tests are failing, so we force --build_only
278 # to make sure it's buildable at least.
279 test_jobs += _generate_jobs(languages=['c', 'c++'],
280 configs=['dbg'],
Jan Tattermuschadd32252017-06-26 17:13:14 +0200281 platforms=['linux'],
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100282 arch='default',
283 compiler='cmake',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200284 labels=['portability', 'corelang'],
Jan Tattermuschdfb03bb2017-01-25 19:27:58 +0100285 extra_args=extra_args + ['--build_only'],
286 inner_jobs=inner_jobs)
287
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200288 test_jobs += _generate_jobs(languages=['python'],
289 configs=['dbg'],
290 platforms=['linux'],
291 arch='default',
Ken Payson02909062017-05-04 12:33:58 -0700292 compiler='python_alpine',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200293 labels=['portability', 'multilang'],
Ken Payson02909062017-05-04 12:33:58 -0700294 extra_args=extra_args,
295 inner_jobs=inner_jobs)
296
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200297 test_jobs += _generate_jobs(languages=['csharp'],
298 configs=['dbg'],
299 platforms=['linux'],
300 arch='default',
301 compiler='coreclr',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200302 labels=['portability', 'multilang'],
Matt Kwongfef98962016-10-27 10:45:47 -0700303 extra_args=extra_args,
304 inner_jobs=inner_jobs)
murgatroid99804c9e92016-12-05 12:19:57 -0800305
murgatroid991191b722017-02-08 11:56:52 -0800306 test_jobs += _generate_jobs(languages=['c'],
307 configs=['dbg'],
308 platforms=['linux'],
309 iomgr_platform='uv',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200310 labels=['portability', 'corelang'],
murgatroid991191b722017-02-08 11:56:52 -0800311 extra_args=extra_args,
Jan Tattermusch29828c52017-09-12 16:42:55 +0200312 inner_jobs=inner_jobs,
313 timeout_seconds=_CPP_RUNTESTS_TIMEOUT)
murgatroid991191b722017-02-08 11:56:52 -0800314
murgatroid99804c9e92016-12-05 12:19:57 -0800315 test_jobs += _generate_jobs(languages=['node'],
316 configs=['dbg'],
317 platforms=['linux'],
318 arch='default',
murgatroid99f25f5052017-04-13 17:22:32 -0700319 compiler='electron1.6',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200320 labels=['portability', 'multilang'],
murgatroid991191b722017-02-08 11:56:52 -0800321 extra_args=extra_args,
322 inner_jobs=inner_jobs)
323
324 test_jobs += _generate_jobs(languages=['node'],
325 configs=['dbg'],
326 platforms=['linux'],
327 arch='default',
328 compiler='node4',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200329 labels=['portability', 'multilang'],
murgatroid991191b722017-02-08 11:56:52 -0800330 extra_args=extra_args,
331 inner_jobs=inner_jobs)
332
333 test_jobs += _generate_jobs(languages=['node'],
334 configs=['dbg'],
335 platforms=['linux'],
336 arch='default',
337 compiler='node6',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200338 labels=['portability', 'multilang'],
murgatroid991191b722017-02-08 11:56:52 -0800339 extra_args=extra_args,
340 inner_jobs=inner_jobs)
341
murgatroid994bea5b92017-05-30 17:37:02 -0700342 test_jobs += _generate_jobs(languages=['node'],
343 configs=['dbg'],
344 platforms=['linux'],
345 arch='default',
346 compiler='node7',
Jan Tattermuscha3899422017-07-13 11:24:02 +0200347 labels=['portability', 'multilang'],
murgatroid994bea5b92017-05-30 17:37:02 -0700348 extra_args=extra_args,
349 inner_jobs=inner_jobs)
350
murgatroid991687cab2016-10-11 11:42:01 -0700351 return test_jobs
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200352
353
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200354def _allowed_labels():
355 """Returns a list of existing job labels."""
356 all_labels = set()
357 for job in _create_test_jobs() + _create_portability_test_jobs():
358 for label in job.labels:
359 all_labels.add(label)
360 return sorted(all_labels)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200361
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200362
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100363def _runs_per_test_type(arg_str):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100364 """Auxiliary function to parse the "runs_per_test" flag."""
365 try:
366 n = int(arg_str)
367 if n <= 0: raise ValueError
368 return n
369 except:
370 msg = '\'{}\' is not a positive integer'.format(arg_str)
371 raise argparse.ArgumentTypeError(msg)
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100372
373
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700374if __name__ == "__main__":
375 argp = argparse.ArgumentParser(description='Run a matrix of run_tests.py tests.')
376 argp.add_argument('-j', '--jobs',
377 default=multiprocessing.cpu_count()/_DEFAULT_INNER_JOBS,
378 type=int,
379 help='Number of concurrent run_tests.py instances.')
380 argp.add_argument('-f', '--filter',
381 choices=_allowed_labels(),
382 nargs='+',
383 default=[],
384 help='Filter targets to run by label with AND semantics.')
Jan Tattermusch6a851292016-12-20 10:20:42 +0100385 argp.add_argument('--exclude',
386 choices=_allowed_labels(),
387 nargs='+',
388 default=[],
389 help='Exclude targets with any of given labels.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700390 argp.add_argument('--build_only',
391 default=False,
392 action='store_const',
393 const=True,
394 help='Pass --build_only flag to run_tests.py instances.')
395 argp.add_argument('--force_default_poller', default=False, action='store_const', const=True,
396 help='Pass --force_default_poller to run_tests.py instances.')
397 argp.add_argument('--dry_run',
398 default=False,
399 action='store_const',
400 const=True,
401 help='Only print what would be run.')
402 argp.add_argument('--filter_pr_tests',
403 default=False,
404 action='store_const',
405 const=True,
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100406 help='Filters out tests irrelevant to pull request changes.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700407 argp.add_argument('--base_branch',
408 default='origin/master',
409 type=str,
410 help='Branch that pull request is requesting to merge into')
411 argp.add_argument('--inner_jobs',
412 default=_DEFAULT_INNER_JOBS,
413 type=int,
414 help='Number of jobs in each run_tests.py instance')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100415 argp.add_argument('-n', '--runs_per_test', default=1, type=_runs_per_test_type,
416 help='How many times to run each tests. >1 runs implies ' +
417 'omitting passing test from the output & reports.')
Craig Tillerceea9692017-04-21 07:49:57 -0700418 argp.add_argument('--max_time', default=-1, type=int,
419 help='Maximum amount of time to run tests for' +
420 '(other tests will be skipped)')
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200421 argp.add_argument('--internal_ci',
422 default=False,
423 action='store_const',
424 const=True,
425 help='Put reports into subdirectories to improve presentation of '
426 'results by Internal CI.')
Matt Kwong52ff9862017-04-17 13:56:51 -0700427 argp.add_argument('--bq_result_table',
428 default='',
429 type=str,
430 nargs='?',
431 help='Upload test results to a specified BQ table.')
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700432 args = argp.parse_args()
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200433
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200434 if args.internal_ci:
435 _report_filename = _report_filename_internal_ci # override the function
436
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700437 extra_args = []
438 if args.build_only:
439 extra_args.append('--build_only')
440 if args.force_default_poller:
441 extra_args.append('--force_default_poller')
Jan Tattermusch68e27bf2016-12-16 14:09:03 +0100442 if args.runs_per_test > 1:
443 extra_args.append('-n')
444 extra_args.append('%s' % args.runs_per_test)
445 extra_args.append('--quiet_success')
Craig Tillerceea9692017-04-21 07:49:57 -0700446 if args.max_time > 0:
447 extra_args.extend(('--max_time', '%d' % args.max_time))
Matt Kwong52ff9862017-04-17 13:56:51 -0700448 if args.bq_result_table:
449 extra_args.append('--bq_result_table')
450 extra_args.append('%s' % args.bq_result_table)
451 extra_args.append('--measure_cpu_costs')
Matt Kwongc5fd8902017-08-10 13:39:21 -0700452 extra_args.append('--disable_auto_set_flakes')
Matt Kwongfef98962016-10-27 10:45:47 -0700453
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700454 all_jobs = _create_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs) + \
455 _create_portability_test_jobs(extra_args=extra_args, inner_jobs=args.inner_jobs)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200456
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700457 jobs = []
458 for job in all_jobs:
459 if not args.filter or all(filter in job.labels for filter in args.filter):
Jan Tattermusch6a851292016-12-20 10:20:42 +0100460 if not any(exclude_label in job.labels for exclude_label in args.exclude):
461 jobs.append(job)
Jan Tattermusch6d7c6ef2016-09-22 13:40:48 +0200462
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700463 if not jobs:
464 jobset.message('FAILED', 'No test suites match given criteria.',
465 do_newline=True)
466 sys.exit(1)
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200467
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700468 print('IMPORTANT: The changes you are testing need to be locally committed')
469 print('because only the committed changes in the current branch will be')
470 print('copied to the docker environment or into subworkspaces.')
murgatroid991687cab2016-10-11 11:42:01 -0700471
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700472 skipped_jobs = []
Jan Tattermusch9c79e8d2016-09-19 14:33:18 +0200473
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700474 if args.filter_pr_tests:
475 print('Looking for irrelevant tests to skip...')
476 relevant_jobs = filter_tests(jobs, args.base_branch)
477 if len(relevant_jobs) == len(jobs):
478 print('No tests will be skipped.')
479 else:
480 print('These tests will be skipped:')
Matt Kwongaa6c94c2016-11-09 15:53:23 -0800481 skipped_jobs = list(set(jobs) - set(relevant_jobs))
482 # Sort by shortnames to make printing of skipped tests consistent
483 skipped_jobs.sort(key=lambda job: job.shortname)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700484 for job in list(skipped_jobs):
485 print(' %s' % job.shortname)
486 jobs = relevant_jobs
487
488 print('Will run these tests:')
489 for job in jobs:
490 if args.dry_run:
491 print(' %s: "%s"' % (job.shortname, ' '.join(job.cmdline)))
492 else:
493 print(' %s' % job.shortname)
Matt Kwong5c691c62016-10-20 17:11:18 -0700494 print
495
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200496 if args.dry_run:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700497 print('--dry_run was used, exiting')
498 sys.exit(1)
499
500 jobset.message('START', 'Running test matrix.', do_newline=True)
501 num_failures, resultset = jobset.run(jobs,
502 newline_on_success=True,
503 travis=True,
504 maxjobs=args.jobs)
505 # Merge skipped tests into results to show skipped tests on report.xml
506 if skipped_jobs:
Nathaniel Manista21e7dfc2017-03-12 18:24:09 +0000507 ignored_num_skipped_failures, skipped_results = jobset.run(
508 skipped_jobs, skip_jobs=True)
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700509 resultset.update(skipped_results)
Jan Tattermuschac9c9f92017-04-28 20:56:05 +0200510 report_utils.render_junit_xml_report(resultset, _report_filename('aggregate_tests'),
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700511 suite_name='aggregate_tests')
512
513 if num_failures == 0:
514 jobset.message('SUCCESS', 'All run_tests.py instance finished successfully.',
515 do_newline=True)
Jan Tattermusch7b9c21a2016-09-22 14:44:27 +0200516 else:
Matt Kwong7e9bd6c2016-10-24 17:30:25 -0700517 jobset.message('FAILED', 'Some run_tests.py instance have failed.',
518 do_newline=True)
519 sys.exit(1)