#!/usr/bin/env vpython3

# Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

"""MB - the Meta-Build wrapper around GN.

MB is a wrapper script for GN that can be used to generate build files
for sets of canned configurations and analyze them.
"""

import os
import sys

_SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__))
_SRC_DIR = os.path.dirname(os.path.dirname(_SCRIPT_DIR))
sys.path.insert(0, _SRC_DIR)

from tools.mb import mb


def _GetExecutable(target, platform):
    executable_prefix = '.\\' if platform == 'win32' else './'
    executable_suffix = '.exe' if platform == 'win32' else ''
    return executable_prefix + target + executable_suffix


def main(args):
    mbw = WebRTCMetaBuildWrapper()
    return mbw.Main(args)


class WebRTCMetaBuildWrapper(mb.MetaBuildWrapper):

    def __init__(self):
        super().__init__()
        # Make sure default_config and default_isolate_map are attributes of the
        # parent class before changing their values.
        # pylint: disable=access-member-before-definition
        assert self.default_config
        assert self.default_isolate_map
        self.default_config = os.path.join(_SCRIPT_DIR, 'mb_config.pyl')
        self.default_isolate_map = os.path.join(_SRC_DIR, 'infra', 'specs',
                                                'gn_isolate_map.pyl')

    def GetSwarmingCommand(self, target, vals):
        isolate_map = self.ReadIsolateMap()
        test_type = isolate_map[target]['type']

        is_android = 'target_os="android"' in vals['gn_args']
        is_fuchsia = 'target_os="fuchsia"' in vals['gn_args']
        is_ios = 'target_os="ios"' in vals['gn_args']
        is_linux = self.platform.startswith('linux') and not is_android
        is_win = self.platform.startswith('win')

        if test_type not in ('console_test_launcher',
                             'non_parallel_console_test_launcher', 'raw',
                             'additional_compile_target', 'generated_script'):
            self.WriteFailureAndRaise('No command line for '
                                      '%s found (test type %s).' %
                                      (target, test_type),
                                      output_path=None)

        extra_files = [
            '../../testing/test_env.py',
            '../../vpython.toml',
            '../../vpython.toml.uv.lock',
        ]
        vpython_exe = 'vpython3'

        if (is_ios or is_fuchsia or test_type in ('generated_script', 'raw')):
            if is_win:
                cmdline = ['bin\\run_{}.bat'.format(target)]
            else:
                cmdline = ['bin/run_{}'.format(target)]
        elif is_android:
            cmdline = [
                'luci-auth', 'context', '--', vpython_exe,
                '../../build/android/test_wrapper/logdog_wrapper.py',
                '--target', target, '--logdog-bin-cmd',
                '../../.task_template_packages/logdog_butler',
                '--logcat-output-file', '${ISOLATED_OUTDIR}/logcats',
                '--store-tombstones'
            ]
        else:
            cmdline = []
            if isolate_map[target].get('use_pipewire', False):
                cmdline = [
                    vpython_exe, '../../tools_webrtc/configure_pipewire.py'
                ]
                extra_files.append('../../tools_webrtc/configure_pipewire.py')

            # is_linux uses use_ozone and x11 by default.
            if is_linux and isolate_map[target].get('use_xvfb', False):
                cmdline += [vpython_exe, '../../testing/xvfb.py']
                extra_files.append('../../testing/xvfb.py')
            else:
                cmdline += [vpython_exe, '../../testing/test_env.py']

            extra_files += [
                '../../third_party/gtest-parallel/gtest-parallel',
                '../../third_party/gtest-parallel/gtest_parallel.py',
                '../../tools_webrtc/gtest-parallel-wrapper.py',
            ]
            output_dir = '${ISOLATED_OUTDIR}/test_logs'
            cmdline += [
                '../../tools_webrtc/gtest-parallel-wrapper.py',
                '--output_dir=%s' % output_dir,
                '--gtest_color=no',
            ]
            if test_type == 'non_parallel_console_test_launcher':
                # Still use the gtest-parallel-wrapper.py script since we
                # need it to run tests on swarming, but don't execute tests
                # in parallel.
                cmdline.append('--workers=1')

            asan = 'is_asan=true' in vals['gn_args']
            lsan = 'is_lsan=true' in vals['gn_args']
            msan = 'is_msan=true' in vals['gn_args']
            tsan = 'is_tsan=true' in vals['gn_args']
            sanitizer = asan or lsan or msan or tsan
            if not sanitizer:
                # Retry would hide most sanitizers detections.
                cmdline.append('--retry_failed=3')

            cmdline.append(_GetExecutable(target, self.platform))

            cmdline.extend([
                '--asan=%d' % asan,
                '--lsan=%d' % lsan,
                '--msan=%d' % msan,
                '--tsan=%d' % tsan,
            ])

        cmdline += isolate_map[target].get('args', [])

        return cmdline, extra_files

if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))
