# 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.

group("tools") {
  testonly = true

  public_deps = [
    ":build_infra",
    ":test_infra",
    "//tools/bindc:host($host_toolchain)",
    "//tools/blackout:all",
    "//tools/bootserver_old:host($host_toolchain)",
    "//tools/build",
    "//tools/clidoc:clidoc",
    "//tools/cmc:install($host_toolchain)",
    "//tools/component_id_index($host_toolchain)",
    "//tools/component_manager_config($host_toolchain)",
    "//tools/create:install($host_toolchain)",
    "//tools/dart-strict-deps:strict_deps($host_toolchain)",
    "//tools/debroot($host_toolchain)",
    "//tools/doc_checker($host_toolchain)",
    "//tools/fidl",
    "//tools/fidlcat:fidlcat_host",
    "//tools/fvdl:host($host_toolchain)",
    "//tools/integration/fint($host_toolchain)",
    "//tools/jq5:install($host_toolchain)",
    "//tools/loglistener:host($host_toolchain)",
    "//tools/make-efi:host",
    "//tools/make-fuchsia-vol:host",
    "//tools/mdlint:host",
    "//tools/net/device-finder:host",
    "//tools/netprotocol($host_toolchain)",
    "//tools/sdk-tools:tools($host_toolchain)",
    "//tools/symbol-index($host_toolchain)",
    "//tools/symbolizer($host_toolchain)",
    "//tools/virtual_device:fvd($host_toolchain)",
    "//tools/zedmon/client:zedmon_client",
  ]
}

# Tools that are used by the infrastructure for building.
group("build_infra") {
  public_deps = [
    "//tools/artifactory($host_toolchain)",
    "//tools/blobstats($host_toolchain)",
    "//tools/build/ninjago/buildstats($host_toolchain)",
    "//tools/build/ninjago/ninjatrace($host_toolchain)",
    "//tools/size_checker/cmd:host($host_toolchain)",
  ]
}

# Tools that are used by the infrastructure for running tests.
group("test_infra") {
  testonly = true

  # Tools that are only needed on the type of host that does the build.
  public_deps = [
    "//tools/integration/testsharder($host_toolchain)",

    # The symbolizer should only be needed on Linux x64, but cross-compilation
    # doesn't work for this tool and the Mac builders don't use it, so just
    # build it for the host toolchain.
    "//tools/symbolizer($host_toolchain)",
  ]

  # Tools that are only needed on Linux x64, regardless of the current host.
  linux_x64_only_tools = [
    "//src/diagnostics/triage:triage_bin",
    "//tools/debug/covargs",
    "//tools/debug/symbolize",
    "//tools/testing/resultdb",
    "//tools/testing/tefmocheck",
  ]

  # Tools needed on all possible hosts.
  # Anything that runs on ARM64 hosts during testing should be here,
  # since in that case the build happens on an X64 host.
  all_host_tools = [
    "//src/storage/bin/fvm",
    "//tools/bootserver",
    "//tools/botanist",
    "//tools/testing:tools",
  ]

  foreach(tool, linux_x64_only_tools) {
    if (host_os == "linux") {
      public_deps += [ "$tool($host_x64_toolchain)" ]
    } else {
      public_deps += [ "$tool($linux_x64_toolchain)" ]
    }
  }

  all_host_toolchains = []
  if (host_os == "linux") {
    all_host_toolchains += [
      host_arm64_toolchain,
      host_x64_toolchain,
    ]
  } else if (host_os == "mac") {
    all_host_toolchains += [ host_toolchain ]
  }

  foreach(tool, all_host_tools) {
    foreach(toolchain, all_host_toolchains) {
      public_deps += [ "$tool($toolchain)" ]
    }
  }
}

group("e2e_tests") {
  testonly = true

  deps = []

  # TODO(fxbug.dev/63992): Temporarily disable bootserver_old tests on coverage builders.
  if (!is_coverage) {
    deps += [ "//tools/bootserver_old/tests($host_toolchain)" ]
  }
}

group("tests_no_e2e") {
  testonly = true
  assert_no_deps = e2e_test_libs

  deps = [
    "//tools/artifactory:tests",
    "//tools/bindc:tests",
    "//tools/blackout:tests",
    "//tools/blobstats:tests",
    "//tools/bootserver:tests($host_toolchain)",
    "//tools/botanist:tests($host_toolchain)",
    "//tools/build:tests($host_toolchain)",
    "//tools/cargo-gnaw:tests",
    "//tools/check-licenses:tests",
    "//tools/clidoc:tests",
    "//tools/cmc:tests",
    "//tools/component_id_index:tests($host_toolchain)",
    "//tools/component_manager_config:tests($host_toolchain)",
    "//tools/create:tests",
    "//tools/dart-strict-deps:tests($host_toolchain)",
    "//tools/debug:tests($host_toolchain)",
    "//tools/devshell:tests($host_toolchain)",
    "//tools/doc_checker:tests",
    "//tools/femu-control:tests",
    "//tools/fidl:tests",
    "//tools/fidlcat:fidlcat_host_tests($host_toolchain)",
    "//tools/fidlcat/tests",
    "//tools/fuzz:tests($host_toolchain)",
    "//tools/fvdl:tests",
    "//tools/golden-util:tests",
    "//tools/integration:tests($host_toolchain)",
    "//tools/jq5:tests($host_toolchain)",
    "//tools/lib:tests($host_toolchain)",
    "//tools/make-fuchsia-vol:tests",
    "//tools/mdlint:tests",
    "//tools/net:tests($host_toolchain)",
    "//tools/qemu:tests($host_toolchain)",
    "//tools/sdk-tools:tests($host_toolchain)",
    "//tools/serial:tests($host_toolchain)",
    "//tools/size_checker:tests($host_toolchain)",
    "//tools/symbol-index:tests",
    "//tools/symbolizer:tests",
    "//tools/sys-realm-analyzer:tests($host_toolchain)",
    "//tools/testing:tests($host_toolchain)",
    "//tools/virtual_device:tests($host_toolchain)",
    "//tools/zedmon:tests",
  ]
}

group("tests") {
  testonly = true
  deps = [
    ":e2e_tests",
    ":tests_no_e2e",

    # `emulator:tests` contains unit tests for emulator, which depend on
    # emulator so we can't put it in `tests_no_e2e`, but it's not an e2e tests
    # neither.
    "//tools/emulator:tests",
  ]
}
