# 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/copy_tree.gni")
import("//build/host.gni")
import("//build/rust/rustc_binary.gni")
import("//build/rust/rustc_test.gni")
import("//build/testing/host_test_data.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.
  auto_owners_gn_out_dir = "${test_output_dir}/runfiles/gn"
  copy_tree("auto_owners_gn_copy") {
    src_dir = "//prebuilt/third_party/gn/${host_platform}"
    dest_dir = auto_owners_gn_out_dir
    inputs = [ "${src_dir}/.versions/gn.cipd_version" ]
  }

  # Make the copied directory available at test runtime.
  host_test_data("auto_owners_gn") {
    sources = [ auto_owners_gn_out_dir ]
    deps = [ ":auto_owners_gn_copy" ]
  }
}

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)" ]
}
