# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/coverage/coverage.gni")
import("//build/config/ios/ios_sdk.gni")
import("//build/util/generate_wrapper.gni")

# Invokes generate_wrapper to create an executable script wrapping iOS'
# run.py with baked in arguments. Only takes effect when test entry in
# gn_isolate_map.pyl is updated to type="generated_script" with script
# set to the wrapper output path.
#
# Arguments:
#
# data
#   (optional, default [ "//ios/build/bots/scripts/" ]) list of files or
#   directories required to run target
#
# data_deps
#   (optional) list of target non-linked labels
#
# deps
#   (optional) list of files or directories required to run target
#
# executable_args
#   (optional) a list of string arguments to pass to run.py
#
# retries
#   (optional, default 3) number of retry attempts
#
# shards
#   (optional, default 1) number of shards to execute tests in parallel. not
#   the same as swarming shards.
#
# wrapper_output_name
#   (optional, default "run_${target_name}") name of the wrapper script
#
template("ios_test_runner_wrapper") {
  generate_wrapper(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "retries",
                             "shards",
                             "wrapper_output_name",
                           ])
    testonly = true
    executable = "//testing/test_env.py"

    # iOS main test runner
    _runner_path =
        rebase_path("//ios/build/bots/scripts/run.py", root_build_dir)

    executable_args = [ "@WrappedPath(${_runner_path})" ]

    # arguments passed to run.py
    if (defined(invoker.executable_args)) {
      executable_args += invoker.executable_args
    }

    _rebased_mac_toolchain = rebase_path("//mac_toolchain", root_build_dir)
    _rebased_xcode_path = rebase_path("//Xcode.app", root_build_dir)

    # --out-dir argument is specified in gn_isolate_map.pyl because
    # ${ISOLATED_OUTDIR} doesn't get resolved through this wrapper.
    executable_args += [
      "--xcode-path",
      "@WrappedPath(${_rebased_xcode_path})",
      "--mac-toolchain-cmd",
      "@WrappedPath(${_rebased_mac_toolchain})",
    ]

    # Default retries to 3
    if (!defined(retries)) {
      retries = 3
    }
    executable_args += [
      "--retries",
      "${retries}",
    ]

    # Default shards to 1
    if (!defined(shards)) {
      shards = 1
    }
    executable_args += [
      "--shards",
      "${shards}",
    ]

    data_deps = [ "//testing:test_scripts_shared" ]
    if (defined(invoker.data_deps)) {
      data_deps += invoker.data_deps
    }

    # test runner relies on iossim for simulator builds.
    if (target_environment == "simulator") {
      _rebased_root_build_dir = rebase_path("${root_build_dir}", root_build_dir)
      data_deps += [ "//testing/iossim" ]

      executable_args += [
        "--iossim",
        "@WrappedPath(${_rebased_root_build_dir}/iossim)",
      ]
    }

    if (use_clang_coverage) {
      executable_args += [ "--use-clang-coverage" ]
    }

    if (!is_debug) {
      executable_args += [ "--release" ]
    }

    # wrapper script output name and path
    if (!defined(wrapper_output_name)) {
      _wrapper_output_name = "run_${target_name}"
    } else {
      _wrapper_output_name = wrapper_output_name
    }

    # Test targets may attempt to generate multiple wrappers for a suite with
    # multiple different toolchains when running with additional_target_cpus.
    # Generate the wrapper script into root_out_dir rather than root_build_dir
    # to ensure those wrappers are distinct.
    wrapper_script = "${root_out_dir}/bin/${_wrapper_output_name}"

    data = []
    if (defined(invoker.data)) {
      data += invoker.data
    }
    data += [
      "//.vpython",
      "//ios/build/bots/scripts/",
      "//testing/test_env.py",
    ]
  }
}
