# 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/package:ffx_package",
      "//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",

      # Required by the test_debug_limbo in `ffx self-test`.
      # We cannot add it to the dependency of `ffx self-test` plugin because that will make
      # the crasher into all production builds.
      "//src/developer/forensics/crasher($target_toolchain)",
    ]

    # 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/package:tests($host_toolchain)",
  ]
}
