xref: /aosp_15_r20/external/webrtc/tools_webrtc/mb/mb.py (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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