# 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")

if (is_host) {
  prebuilt_cargo_outdated = "//prebuilt/third_party/rust_cargo_outdated/${host_platform}/cargo-outdated"
  test_output_dir = "$root_out_dir/test_data/tools/update_crates/tests"
  update_crates_path = "$host_tools_dir/update_crates"

  host_test("update_crates_test_with_local_registry") {
    binary_path = "$root_out_dir/update_crates_test_bin"

    # host tests are invoked with cwd=root_build_dir, so rebase all paths relative to that
    args = [
      "--test-base-dir",
      rebase_path(test_output_dir, root_build_dir),
      "--rust-bin-dir",
      "$out_rustc_prefix/bin",
      "--cargo-outdated",
      rebase_path(prebuilt_cargo_outdated, root_build_dir),
      "--update-crates",
      rebase_path(update_crates_path, root_build_dir),
    ]

    deps = [
      ":update_crates_cargo_outdated",
      ":update_crates_for_test",
      ":update_crates_test_bin",
      ":uses_local_registry_test_data",
      "//build/rust:prebuilt_toolchain_host_test_data",
    ]
  }

  rustc_binary("update_crates_test_bin") {
    edition = "2021"
    source_root = "with_local_registry.rs"
    sources = [ "with_local_registry.rs" ]

    deps = [
      "//third_party/rust_crates:argh",
      "//third_party/rust_crates:hex",
      "//third_party/rust_crates:once_cell",
      "//third_party/rust_crates:serde",
      "//third_party/rust_crates:serde_json",
      "//third_party/rust_crates:sha2",
      "//third_party/rust_crates:tempfile",
      "//third_party/rust_crates:toml",
      "//third_party/rust_crates:walkdir",
    ]
  }

  host_test_data("update_crates_cargo_outdated") {
    sources = [ prebuilt_cargo_outdated ]
  }

  host_test_data("update_crates_for_test") {
    sources = [ update_crates_path ]
    deps = [ "..:install_update_crates" ]
  }

  host_test_data("uses_local_registry_test_data") {
    sources = [
      "local_registry_sources/test_dep_a_1/Cargo.toml",
      "local_registry_sources/test_dep_a_1/src/lib.rs",
      "local_registry_sources/test_dep_a_2/Cargo.toml",
      "local_registry_sources/test_dep_a_2/src/lib.rs",
      "local_registry_sources/test_dep_b_1/Cargo.toml",
      "local_registry_sources/test_dep_b_1/src/lib.rs",
      "local_registry_sources/test_dep_b_2/Cargo.toml",
      "local_registry_sources/test_dep_b_2/src/lib.rs",
      "local_registry_sources/test_dep_c_1/Cargo.toml",
      "local_registry_sources/test_dep_c_1/src/lib.rs",
      "local_registry_sources/test_dep_c_2/Cargo.toml",
      "local_registry_sources/test_dep_c_2/src/lib.rs",
      "uses_local_registry/Cargo.expected.toml",
      "uses_local_registry/Cargo.toml",
      "uses_local_registry/outdated.toml",
      "uses_local_registry/src/lib.rs",
    ]
    outputs = [ "$test_output_dir/{{source_target_relative}}" ]
  }
}

group("tests") {
  testonly = true
  deps = [ ":update_crates_test_with_local_registry($host_toolchain)" ]
}
