# Copyright 2018 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.

assert(is_fuchsia)

import("//build/config/chromecast_build.gni")
import("//build/config/fuchsia/config.gni")
import("//build/config/fuchsia/package.gni")
import("//build/config/sysroot.gni")

blobstore_qcow_path = "$root_out_dir/fvm.blk.qcow2"

template("generate_runner_script") {
  _pkg_dir = "$root_out_dir/gen/" + get_label_info(invoker.package_name, "dir")
  _manifest_path = "$_pkg_dir/${invoker.package_name}.archive_manifest"
  _package_path = "$_pkg_dir/${invoker.package_name}.far"

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "runner_script",
                             "target",
                             "testonly",
                           ])

    deps = [
      "//build/config/fuchsia:blobstore_extended_qcow2",
      "//testing/buildbot/filters:fuchsia_filters",
    ]

    _generated_script = "${invoker.generated_script}"

    script = "//build/fuchsia/create_runner_script.py"

    outputs = [
      _generated_script,
    ]

    data = [
      _generated_script,
      _manifest_path,
      "//build/fuchsia/",
      "//build/util/lib/",
      "${fuchsia_sdk}/",
    ]

    # Arguments used at build time by the runner script generator.
    args = [
      "--script-output-path",
      rebase_path(_generated_script, root_build_dir, root_out_dir),
    ]

    if (defined(invoker.use_test_server) && invoker.use_test_server) {
      args += [ "--enable-test-server" ]
    }

    # Arguments used at runtime by the test runner.
    args += [
      "--runner-script",
      runner_script,
      "--output-directory",
      rebase_path(root_build_dir, root_build_dir),
      "--target-cpu",
      target_cpu,
      "--package",
      rebase_path(_package_path, root_out_dir, root_build_dir),
      "--package-name",
      invoker.package_name,
      "--package-manifest",
      rebase_path(_manifest_path),
    ]
  }
}

# This template is used to generate a runner script for test binaries into the
# build dir for Fuchsia. It's generally used from the "test" template.
template("test_runner_script") {
  generate_runner_script(target_name) {
    testonly = true
    runner_script = "test_runner.py"
    generated_script =
        "$root_build_dir/bin/run_" + get_label_info(invoker.test_name, "name")
    forward_variables_from(invoker, "*")
  }
}

# This template is used to generate a runner script for arbitrary executables
# into the build dir for Fuchsia. The executable is specified as a target
# pass to the "exe_target" attribute.
template("fuchsia_executable_runner") {
  forward_variables_from(invoker, [ "exe_target" ])

  _pkg_target = "${target_name}_pkg"
  _gen_runner_target = "${target_name}_runner"
  _archive_target = "${target_name}_archive"
  _exe_name = get_label_info(exe_target, "name")

  # Define the target dependencies as the union of the executable target
  # and the invoker's deps.
  if (defined(invoker.deps)) {
    _combined_deps = invoker.deps + [ exe_target ]
  } else {
    _combined_deps = [ exe_target ]
  }

  package(_pkg_target) {
    forward_variables_from(invoker, [ "testonly" ])
    package_name = _exe_name
    sandbox_policy = "//build/config/fuchsia/sandbox_policy"
    binary = _exe_name
    deps = _combined_deps
  }

  generate_runner_script(_gen_runner_target) {
    forward_variables_from(invoker, [ "testonly" ])
    runner_script = "exe_runner.py"
    generated_script = "$root_build_dir/bin/run_${_exe_name}"
    package_name = _exe_name
  }

  group(target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = [
      ":${_archive_target}",
      ":${_gen_runner_target}",
      ":${_pkg_target}",
    ]

    # Disable packaging for Chromecast builds. (https://crbug.com/810069)
    if (is_chromecast) {
      deps -= [ ":${_pkg_target}" ]
    }
  }

  generate_runner_script(_archive_target) {
    forward_variables_from(invoker, [ "testonly" ])
    runner_script = "archive_builder.py"
    generated_script =
        "$root_build_dir/bin/archive_" + get_label_info(exe_target, "name")
    package_name = _exe_name
  }
}
