1*d9f75844SAndroid Build Coastguard Worker#!/usr/bin/env vpython3 2*d9f75844SAndroid Build Coastguard Worker 3*d9f75844SAndroid Build Coastguard Worker# Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 4*d9f75844SAndroid Build Coastguard Worker# 5*d9f75844SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license 6*d9f75844SAndroid Build Coastguard Worker# that can be found in the LICENSE file in the root of the source 7*d9f75844SAndroid Build Coastguard Worker# tree. An additional intellectual property rights grant can be found 8*d9f75844SAndroid Build Coastguard Worker# in the file PATENTS. All contributing project authors may 9*d9f75844SAndroid Build Coastguard Worker# be found in the AUTHORS file in the root of the source tree. 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker"""MB - the Meta-Build wrapper around GN. 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard WorkerMB is a wrapper script for GN that can be used to generate build files 14*d9f75844SAndroid Build Coastguard Workerfor sets of canned configurations and analyze them. 15*d9f75844SAndroid Build Coastguard Worker""" 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Workerimport os 18*d9f75844SAndroid Build Coastguard Workerimport sys 19*d9f75844SAndroid Build Coastguard Worker 20*d9f75844SAndroid Build Coastguard Worker_SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) 21*d9f75844SAndroid Build Coastguard Worker_SRC_DIR = os.path.dirname(os.path.dirname(_SCRIPT_DIR)) 22*d9f75844SAndroid Build Coastguard Workersys.path.insert(0, _SRC_DIR) 23*d9f75844SAndroid Build Coastguard Worker 24*d9f75844SAndroid Build Coastguard Workerfrom tools.mb import mb 25*d9f75844SAndroid Build Coastguard Worker 26*d9f75844SAndroid Build Coastguard Worker 27*d9f75844SAndroid Build Coastguard Workerdef _GetExecutable(target, platform): 28*d9f75844SAndroid Build Coastguard Worker executable_prefix = '.\\' if platform == 'win32' else './' 29*d9f75844SAndroid Build Coastguard Worker executable_suffix = '.exe' if platform == 'win32' else '' 30*d9f75844SAndroid Build Coastguard Worker return executable_prefix + target + executable_suffix 31*d9f75844SAndroid Build Coastguard Worker 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Workerdef main(args): 34*d9f75844SAndroid Build Coastguard Worker mbw = WebRTCMetaBuildWrapper() 35*d9f75844SAndroid Build Coastguard Worker return mbw.Main(args) 36*d9f75844SAndroid Build Coastguard Worker 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard Workerclass WebRTCMetaBuildWrapper(mb.MetaBuildWrapper): 39*d9f75844SAndroid Build Coastguard Worker def __init__(self): 40*d9f75844SAndroid Build Coastguard Worker super().__init__() 41*d9f75844SAndroid Build Coastguard Worker # Make sure default_config and default_isolate_map are attributes of the 42*d9f75844SAndroid Build Coastguard Worker # parent class before changing their values. 43*d9f75844SAndroid Build Coastguard Worker # pylint: disable=access-member-before-definition 44*d9f75844SAndroid Build Coastguard Worker assert self.default_config 45*d9f75844SAndroid Build Coastguard Worker assert self.default_isolate_map 46*d9f75844SAndroid Build Coastguard Worker self.default_config = os.path.join(_SCRIPT_DIR, 'mb_config.pyl') 47*d9f75844SAndroid Build Coastguard Worker self.default_isolate_map = os.path.join(_SRC_DIR, 'infra', 'specs', 48*d9f75844SAndroid Build Coastguard Worker 'gn_isolate_map.pyl') 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker def GetSwarmingCommand(self, target, vals): 51*d9f75844SAndroid Build Coastguard Worker isolate_map = self.ReadIsolateMap() 52*d9f75844SAndroid Build Coastguard Worker test_type = isolate_map[target]['type'] 53*d9f75844SAndroid Build Coastguard Worker 54*d9f75844SAndroid Build Coastguard Worker is_android = 'target_os="android"' in vals['gn_args'] 55*d9f75844SAndroid Build Coastguard Worker is_fuchsia = 'target_os="fuchsia"' in vals['gn_args'] 56*d9f75844SAndroid Build Coastguard Worker is_ios = 'target_os="ios"' in vals['gn_args'] 57*d9f75844SAndroid Build Coastguard Worker is_linux = self.platform.startswith('linux') and not is_android 58*d9f75844SAndroid Build Coastguard Worker is_win = self.platform.startswith('win') 59*d9f75844SAndroid Build Coastguard Worker 60*d9f75844SAndroid Build Coastguard Worker if test_type == 'nontest': 61*d9f75844SAndroid Build Coastguard Worker self.WriteFailureAndRaise('We should not be isolating %s.' % target, 62*d9f75844SAndroid Build Coastguard Worker output_path=None) 63*d9f75844SAndroid Build Coastguard Worker if test_type not in ('console_test_launcher', 'windowed_test_launcher', 64*d9f75844SAndroid Build Coastguard Worker 'non_parallel_console_test_launcher', 'raw', 65*d9f75844SAndroid Build Coastguard Worker 'additional_compile_target', 'junit_test', 'script'): 66*d9f75844SAndroid Build Coastguard Worker self.WriteFailureAndRaise('No command line for ' 67*d9f75844SAndroid Build Coastguard Worker '%s found (test type %s).' % 68*d9f75844SAndroid Build Coastguard Worker (target, test_type), 69*d9f75844SAndroid Build Coastguard Worker output_path=None) 70*d9f75844SAndroid Build Coastguard Worker 71*d9f75844SAndroid Build Coastguard Worker cmdline = [] 72*d9f75844SAndroid Build Coastguard Worker extra_files = [ 73*d9f75844SAndroid Build Coastguard Worker '../../.vpython3', 74*d9f75844SAndroid Build Coastguard Worker '../../testing/test_env.py', 75*d9f75844SAndroid Build Coastguard Worker ] 76*d9f75844SAndroid Build Coastguard Worker vpython_exe = 'vpython3' 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard Worker if isolate_map[target].get('script'): 79*d9f75844SAndroid Build Coastguard Worker cmdline += [ 80*d9f75844SAndroid Build Coastguard Worker vpython_exe, 81*d9f75844SAndroid Build Coastguard Worker '../../' + self.ToSrcRelPath(isolate_map[target]['script']) 82*d9f75844SAndroid Build Coastguard Worker ] 83*d9f75844SAndroid Build Coastguard Worker elif is_android: 84*d9f75844SAndroid Build Coastguard Worker cmdline += [ 85*d9f75844SAndroid Build Coastguard Worker 'luci-auth', 'context', '--', vpython_exe, 86*d9f75844SAndroid Build Coastguard Worker '../../build/android/test_wrapper/logdog_wrapper.py', '--target', 87*d9f75844SAndroid Build Coastguard Worker target, '--logdog-bin-cmd', 88*d9f75844SAndroid Build Coastguard Worker '../../.task_template_packages/logdog_butler', '--logcat-output-file', 89*d9f75844SAndroid Build Coastguard Worker '${ISOLATED_OUTDIR}/logcats', '--store-tombstones' 90*d9f75844SAndroid Build Coastguard Worker ] 91*d9f75844SAndroid Build Coastguard Worker elif is_ios or is_fuchsia or test_type == 'raw': 92*d9f75844SAndroid Build Coastguard Worker if is_win: 93*d9f75844SAndroid Build Coastguard Worker cmdline += ['bin\\run_{}.bat'.format(target)] 94*d9f75844SAndroid Build Coastguard Worker else: 95*d9f75844SAndroid Build Coastguard Worker cmdline += ['bin/run_{}'.format(target)] 96*d9f75844SAndroid Build Coastguard Worker else: 97*d9f75844SAndroid Build Coastguard Worker if isolate_map[target].get('use_webcam', False): 98*d9f75844SAndroid Build Coastguard Worker cmdline += [ 99*d9f75844SAndroid Build Coastguard Worker vpython_exe, '../../tools_webrtc/ensure_webcam_is_running.py' 100*d9f75844SAndroid Build Coastguard Worker ] 101*d9f75844SAndroid Build Coastguard Worker extra_files.append('../../tools_webrtc/ensure_webcam_is_running.py') 102*d9f75844SAndroid Build Coastguard Worker if isolate_map[target].get('use_pipewire', False): 103*d9f75844SAndroid Build Coastguard Worker cmdline += [vpython_exe, '../../tools_webrtc/configure_pipewire.py'] 104*d9f75844SAndroid Build Coastguard Worker extra_files.append('../../tools_webrtc/configure_pipewire.py') 105*d9f75844SAndroid Build Coastguard Worker 106*d9f75844SAndroid Build Coastguard Worker # is_linux uses use_ozone and x11 by default. 107*d9f75844SAndroid Build Coastguard Worker use_x11 = is_linux 108*d9f75844SAndroid Build Coastguard Worker 109*d9f75844SAndroid Build Coastguard Worker xvfb = use_x11 and test_type == 'windowed_test_launcher' 110*d9f75844SAndroid Build Coastguard Worker if xvfb: 111*d9f75844SAndroid Build Coastguard Worker cmdline += [vpython_exe, '../../testing/xvfb.py'] 112*d9f75844SAndroid Build Coastguard Worker extra_files.append('../../testing/xvfb.py') 113*d9f75844SAndroid Build Coastguard Worker else: 114*d9f75844SAndroid Build Coastguard Worker cmdline += [vpython_exe, '../../testing/test_env.py'] 115*d9f75844SAndroid Build Coastguard Worker 116*d9f75844SAndroid Build Coastguard Worker extra_files += [ 117*d9f75844SAndroid Build Coastguard Worker '../../third_party/gtest-parallel/gtest-parallel', 118*d9f75844SAndroid Build Coastguard Worker '../../third_party/gtest-parallel/gtest_parallel.py', 119*d9f75844SAndroid Build Coastguard Worker '../../tools_webrtc/gtest-parallel-wrapper.py', 120*d9f75844SAndroid Build Coastguard Worker ] 121*d9f75844SAndroid Build Coastguard Worker output_dir = '${ISOLATED_OUTDIR}/test_logs' 122*d9f75844SAndroid Build Coastguard Worker timeout = isolate_map[target].get('timeout', 900) 123*d9f75844SAndroid Build Coastguard Worker cmdline += [ 124*d9f75844SAndroid Build Coastguard Worker '../../tools_webrtc/gtest-parallel-wrapper.py', 125*d9f75844SAndroid Build Coastguard Worker '--output_dir=%s' % output_dir, 126*d9f75844SAndroid Build Coastguard Worker '--gtest_color=no', 127*d9f75844SAndroid Build Coastguard Worker # We tell gtest-parallel to interrupt the test after 900 128*d9f75844SAndroid Build Coastguard Worker # seconds, so it can exit cleanly and report results, 129*d9f75844SAndroid Build Coastguard Worker # instead of being interrupted by swarming and not 130*d9f75844SAndroid Build Coastguard Worker # reporting anything. 131*d9f75844SAndroid Build Coastguard Worker '--timeout=%s' % timeout, 132*d9f75844SAndroid Build Coastguard Worker ] 133*d9f75844SAndroid Build Coastguard Worker if test_type == 'non_parallel_console_test_launcher': 134*d9f75844SAndroid Build Coastguard Worker # Still use the gtest-parallel-wrapper.py script since we 135*d9f75844SAndroid Build Coastguard Worker # need it to run tests on swarming, but don't execute tests 136*d9f75844SAndroid Build Coastguard Worker # in parallel. 137*d9f75844SAndroid Build Coastguard Worker cmdline.append('--workers=1') 138*d9f75844SAndroid Build Coastguard Worker 139*d9f75844SAndroid Build Coastguard Worker asan = 'is_asan=true' in vals['gn_args'] 140*d9f75844SAndroid Build Coastguard Worker lsan = 'is_lsan=true' in vals['gn_args'] 141*d9f75844SAndroid Build Coastguard Worker msan = 'is_msan=true' in vals['gn_args'] 142*d9f75844SAndroid Build Coastguard Worker tsan = 'is_tsan=true' in vals['gn_args'] 143*d9f75844SAndroid Build Coastguard Worker sanitizer = asan or lsan or msan or tsan 144*d9f75844SAndroid Build Coastguard Worker if not sanitizer: 145*d9f75844SAndroid Build Coastguard Worker # Retry would hide most sanitizers detections. 146*d9f75844SAndroid Build Coastguard Worker cmdline.append('--retry_failed=3') 147*d9f75844SAndroid Build Coastguard Worker 148*d9f75844SAndroid Build Coastguard Worker cmdline.append(_GetExecutable(target, self.platform)) 149*d9f75844SAndroid Build Coastguard Worker 150*d9f75844SAndroid Build Coastguard Worker cmdline.extend([ 151*d9f75844SAndroid Build Coastguard Worker '--asan=%d' % asan, 152*d9f75844SAndroid Build Coastguard Worker '--lsan=%d' % lsan, 153*d9f75844SAndroid Build Coastguard Worker '--msan=%d' % msan, 154*d9f75844SAndroid Build Coastguard Worker '--tsan=%d' % tsan, 155*d9f75844SAndroid Build Coastguard Worker ]) 156*d9f75844SAndroid Build Coastguard Worker 157*d9f75844SAndroid Build Coastguard Worker cmdline += isolate_map[target].get('args', []) 158*d9f75844SAndroid Build Coastguard Worker 159*d9f75844SAndroid Build Coastguard Worker return cmdline, extra_files 160*d9f75844SAndroid Build Coastguard Worker 161*d9f75844SAndroid Build Coastguard Workerif __name__ == '__main__': 162*d9f75844SAndroid Build Coastguard Worker sys.exit(main(sys.argv[1:])) 163