# 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/auto_owners($host_toolchain)",
    "//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/femu-control:host($host_toolchain)",
    "//tools/fidl",
    "//tools/fidlcat:fidlcat_host",
    "//tools/fvdl:host($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/pretty_serial:install($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)",

    # The infrastructure uses a version of fint built using the Go toolchain,
    # rather than Ninja, so we technically don't need to include fint here. But
    # we still want the build graph to be considered to be affected by fint
    # changes, because fint is always used by the infrastructure to build
    # fuchsia and it may affect later infrastructure steps that might be skipped
    # if the build graph was considered unaffected.
    "//tools/integration/fint($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/auto_owners:tests($host_toolchain)",
    "//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/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/pretty_serial:tests",
    "//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",
  ]

  # Tests that shouldn't be built on macOS (fxbug.dev/79219)
  if (is_linux) {
    deps += [ "//tools/fuzz: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",
  ]
}
