# Copyright 2019 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/sdk/sdk_host_tool.gni")
import("//build/testing/host_test.gni")
import("//build/testing/host_test_data.gni")
import("./build/ffx.gni")

group("ffx") {
  testonly = true

  public_deps = [
    ":ffx_tool",
    ":tests",
    "lib",
  ]
}

if (is_host) {
  ffx("ffx") {
    version = "0.1.0"
    edition = "2018"
    with_unit_tests = true

    plugin_deps = [
      "//src/connectivity/network/net-cli/ffx:ffx_net",
      "//src/connectivity/network/testing/network-test-realm/ffx:ffx_net_test_realm",
      "//src/developer/ffx/plugins/agis:ffx_agis",
      "//src/developer/ffx/plugins/assembly:ffx_assembly",
      "//src/developer/ffx/plugins/component:ffx_component",
      "//src/developer/ffx/plugins/config:ffx_config_plugin",
      "//src/developer/ffx/plugins/cts:ffx_cts",
      "//src/developer/ffx/plugins/daemon:ffx_daemon_plugin",
      "//src/developer/ffx/plugins/debug:ffx_debug_plugin",
      "//src/developer/ffx/plugins/doctor:ffx_doctor",
      "//src/developer/ffx/plugins/driver:ffx_driver",
      "//src/developer/ffx/plugins/efi:ffx_efi",
      "//src/developer/ffx/plugins/emulator:ffx_emulator",
      "//src/developer/ffx/plugins/flutter:ffx_flutter",
      "//src/developer/ffx/plugins/inspect:ffx_inspect",
      "//src/developer/ffx/plugins/log:ffx_log",
      "//src/developer/ffx/plugins/overnet:ffx_overnet_plugin",
      "//src/developer/ffx/plugins/packaging:ffx_packaging",
      "//src/developer/ffx/plugins/pdk:ffx_pdk",
      "//src/developer/ffx/plugins/platform:ffx_platform",
      "//src/developer/ffx/plugins/product_bundle:ffx_product_bundle",
      "//src/developer/ffx/plugins/profile:ffx_profile",
      "//src/developer/ffx/plugins/repository:ffx_repository",
      "//src/developer/ffx/plugins/schema:ffx_schema",
      "//src/developer/ffx/plugins/scrutiny:ffx_scrutiny",
      "//src/developer/ffx/plugins/sdk:ffx_sdk",
      "//src/developer/ffx/plugins/self-test:ffx_selftest",
      "//src/developer/ffx/plugins/session:ffx_session",
      "//src/developer/ffx/plugins/setui:ffx_setui",
      "//src/developer/ffx/plugins/starnix:ffx_starnix",
      "//src/developer/ffx/plugins/target:ffx_target",
      "//src/developer/ffx/plugins/trace:ffx_trace",
      "//src/developer/ffx/plugins/triage:ffx_triage",
      "//src/developer/ffx/plugins/version:ffx_version",
      "//src/developer/ffx/plugins/wlan:ffx_wlan",
      "//src/storage/ffx:ffx_storage",
      "//src/sys/run_test_suite/ffx/test:ffx_test",
    ]

    args_sources = [ "src/args.rs" ]

    args_deps = [
      "//src/developer/ffx/config:lib",
      "//src/developer/ffx/lib/writer:lib",
    ]

    sources = [
      "src/lib.rs",
      "src/main.rs",
    ]

    test_deps = [
      "//sdk/fidl/fuchsia.developer.ffx:fuchsia.developer.ffx-rustc",
      "//sdk/fidl/fuchsia.overnet:fuchsia.overnet-rustc",
      "//src/connectivity/overnet/lib/ascendd",
      "//third_party/rust_crates:async-lock",
      "//third_party/rust_crates:tempfile",
    ]
  }

  sdk_host_tool("bin_sdk") {
    # TODO(fxbug.dev/57313): partner only at this time while we shake
    # out alpha bugs and fill-in docs, etc.
    category = "partner"
    output_name = "ffx"

    deps = [ ":ffx_bin" ]
  }

  host_test("ffx-e2e-without-target") {
    binary_path = "$root_out_dir/ffx"
    args = [
      "self-test",
      "--include-target",
      "false",
    ]

    deps = [ ":ffx_bin" ]
  }

  host_test("ffx-e2e-with-target") {
    binary_path = "$root_out_dir/ffx"
    args = [
      "--config",
      "sdk.root=.,sdk.type=in-tree",
      "self-test",
    ]

    deps = [
      ":ffx-e2e-test-data",
      ":ffx_bin",
    ]

    # TODO(fxbug.dev/60683): split additional dimensions such as multi-device
    # mac + device, etc.
    environments = [
      # XXX(fxbug.dev/64897): support arm64 HTI tests
      # emu_env,
      nuc_env,
    ]
  }

  host_test_data("ffx-e2e-test-data") {
    sources = [
      "$root_out_dir/gen/src/developer/debug/zxdb/zxdb_sdk.meta.json",
      "$root_out_dir/zxdb",
    ]
  }
}

install_host_tools("host") {
  deps = [ ":ffx_bin" ]
  outputs = [ "ffx" ]
}

group("ffx_tool") {
  deps = [
    ":ffx_bin($host_toolchain)",
    ":host",
  ]
}

group("runtime") {
  deps = [
    # The tool
    ":host",

    # Target-side dependencies
    "//src/developer/remote-control:runtime",
  ]
}

group("tests") {
  testonly = true
  deps = [
    # ffx end to end tests, through `ffx self-test` invocations, one includes
    # tests that must have a target present, the other can be run without a
    # target present.
    ":ffx-e2e-with-target($host_toolchain)",
    ":ffx-e2e-without-target($host_toolchain)",

    # Most ffx plugin test suites are included downstream of the group defined
    # by the ffx template above.
    ":ffx_tests($host_toolchain)",

    # Individual library tests, for libraries that are not plugins.
    "lib:tests($host_toolchain)",
    "logger:tests($host_toolchain)",
    "plugins/packaging:tests($host_toolchain)",
  ]
}
