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

# This has a group corresponding to each product name.  It gives the
# additional base packages that should be included in the build done by
# a bot to run tests and build-time checks to cover that product's code.

group("bringup") {
  testonly = true
  deps = [ "//bundles/bringup:tests" ]
}

# This group contains tests that don't depend on any known e2e test libraries.
# This happens to exclude unit tests for these e2e libraries, so this group is
# not meant to be used directly. It serves as an intermediate group for
# constructing `core_no_e2e` below.
group("no_e2e_dep") {
  testonly = true
  assert_no_deps = e2e_test_libs

  deps = [
    "//build:tests",
    "//bundles:tools",
    "//examples",
    "//examples:tests",
    "//garnet",
    "//garnet/packages:all",
    "//scripts:tests",
    "//scripts/sdk/gn:tests",
    "//src/diagnostics:tests",
    "//src/media/audio/bundles:virtual_audio_driver",
    "//src/media/bundles:examples",
    "//src/media/bundles:services",
    "//src/media/bundles:tools",
    "//third_party/go:tests",
    "//tools",
    "//topaz/bundles:buildbot",

    # The following groups have known e2e tests explicitly excluded.
    "//bundles/fidl:tests_no_e2e",
    "//sdk:tests_no_e2e",
    "//sdk/cts:cts_no_e2e",
    "//src:src_no_e2e",
    "//tools:tests_no_e2e",
  ]
}

# This group contains no e2e tests. Tests in this group:
#
# * Either doesn't transitively depend on any known e2e test libraries;
# * Or are unit tests for known e2e test libraries.
group("core_no_e2e") {
  testonly = true
  deps = [ ":no_e2e_dep" ] + e2e_lib_unit_tests
}

group("core") {
  testonly = true
  deps = [
    ":core_no_e2e",

    # Add in e2e tests excluded from `no_e2e`.
    "//bundles/fidl:tests",
    "//sdk:tests",
    "//sdk/cts",
    "//src",
    "//tools",

    # Placed with core because core does not run scenic, in contrast to terminal bundle.
    # (perf:touch_input_test expects scenic _not_ to be running)
    "//src/tests/end_to_end/perf:touch_input_test",
    "//src/tests/end_to_end/screen_is_not_black:config",
  ]

  # Ensure paths to known e2e test libs are always up-to-date.
  deps += e2e_test_libs
}

group("terminal") {
  testonly = true
  deps = [
    # TODO(fxbug.dev/51983): Re-organize these deps to include all packages
    # required for running tests.
    "//garnet/bin/run_test_component",
    "//src/tests/end_to_end/screen_is_not_black:config",
  ]
}

group("workstation") {
  testonly = true
  deps = [
    "//garnet/bin/setui_client:setui_client",
    "//src/tests/end_to_end/screen_is_not_black:config",
  ]
}

# "host-tests" targets are for tests which depend on package artifacts such as
# the FVM. They should be included using `fx set --with-host`.

# This group contains no e2e tests. Tests in this group:
#
# * Either doesn't transitively depend on any known e2e test libraries;
# * Or are unit tests for known e2e test libraries.
group("host-tests_no_e2e") {
  testonly = true
  assert_no_deps = e2e_test_libs
}

group("host-tests") {
  testonly = true
  deps = [ ":host-tests_no_e2e" ]
  if (is_linux) {
    deps += [ "//tools/fvdl/e2e:tests" ]
  }
}
