# Copyright 2021 The Fuchsia 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/host.gni")
import("//build/rust/rustc_binary.gni")
import("//build/rust/rustc_test.gni")

if (is_host) {
  crate_deps = [
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:argh",
    "//third_party/rust_crates:rayon",
    "//third_party/rust_crates:serde_json",
    "//third_party/rust_crates:tempfile",
    "//third_party/rust_crates:toml",
    "//third_party/rust_crates:walkdir",
    "//tools/cargo-gnaw:cargo-gnaw-lib",
  ]

  rustc_binary("auto_owners_bin") {
    output_name = "auto_owners"
    with_unit_tests = false
    deps = crate_deps
    sources = [ "src/main.rs" ]
  }

  rustc_test("auto_owners_test") {
    source_root = "src/main.rs"
    sources = [ "src/main.rs" ]

    deps = crate_deps + [
             "//third_party/rust_crates:once_cell",
             "//third_party/rust_crates:pretty_assertions",
             "//third_party/rust_crates:serial_test",
           ]

    non_rust_deps = [
      ":auto_owners_gn",
      ":auto_owners_test_data",
    ]
  }

  test_output_dir = "$root_out_dir/test_data/tools/auto_owners"

  host_test_data("auto_owners_test_data") {
    sources = [
      "tests/common/.gn",
      "tests/common/build/BUILD.gn",
      "tests/common/build/BUILDCONFIG.gn",
      "tests/common/build/toolchain/BUILD.gn",
      "tests/empty/BUILD.gn",
      "tests/empty/foo/BUILD.gn",
      "tests/missing/BUILD.gn",
      "tests/pass/BUILD.gn",
      "tests/pass/foo/BUILD.gn",
    ]
    outputs = [ "$test_output_dir/{{source_target_relative}}" ]
  }

  # we need to copy the GN binary from the builder into the test output directory so we can
  # run it on a different bot than does the builds
  # TODO(fxbug.dev/74196) extract this, cargo-gnaw's, potentially others to a file in //build
  template("_copy_tool") {
    action(target_name) {
      hermetic_deps = false
      source = "//prebuilt/third_party/${invoker.tool}/${host_platform}"
      target = "${invoker.out_dir}/${invoker.tool}"
      inputs = [ "$source/.versions/${invoker.tool}.cipd_version" ]
      script = "//build/copy_tree.py"
      stamp = "${target}.stamp"
      args = [
        rebase_path(source, root_build_dir),
        rebase_path(target, root_build_dir),
        rebase_path(stamp, root_build_dir),
      ]

      # In theory we could use the version file as our output, but that causes
      # a problem: ninja will attempt to mkdir $target, and if $target exists
      # but is not a directory, the build will fail. So we use a stamp file in
      # the parent directory instead.
      outputs = [ stamp ]

      metadata = {
        test_runtime_deps = [ target ]
      }
    }
  }

  _copy_tool("auto_owners_gn") {
    tool = "gn"
    out_dir = "$test_output_dir/runfiles"
  }
}

install_host_tools("install_auto_owners") {
  deps = [ ":auto_owners_bin" ]
  outputs = [ "auto_owners" ]
}

group("auto_owners") {
  deps = [
    ":auto_owners_bin($host_toolchain)",
    ":install_auto_owners",
  ]
}

# run with `fx test host_x64/auto_owners_test`
group("tests") {
  testonly = true
  deps = [ ":auto_owners_test($host_toolchain)" ]
}
