# 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/config/fuchsia/zircon.gni")
import("//build/testing/environments.gni")

group("src") {
  testonly = true
  deps = [
    ":tests",
    "camera",
    "cast",
    "chromium",
    "cobalt",
    "connectivity",
    "dart",
    "developer",
    "devices",
    "diagnostics",
    "experiences",
    "factory",
    "flutter",
    "fonts",
    "graphics",
    "identity",
    "ledger",
    "lib",
    "media",
    "modular",
    "recovery",
    "session",
    "speech",
    "storage",
    "sys",
    "testing",
    "ui",
    "virtualization",
  ]
}

group("tests") {
  testonly = true

  deps = [
    ":zircon_host_tests",
    "bringup:tests",
    "camera:tests",
    "chromium:tests",
    "cobalt:tests",
    "connectivity:tests",
    "developer:tests",
    "devices:tests",
    "diagnostics:tests",
    "experiences:tests",
    "factory:tests",
    "fonts:tests",
    "graphics:tests",
    "identity:tests",
    "ledger:tests",
    "lib:tests",
    "media:tests",
    "modular:tests",
    "recovery:tests",
    "session:tests",
    "speech:tests",
    "storage:tests",
    "sys:tests",
    "testing:tests",
    "tests",
    "ui:tests",
    "virtualization:tests",
  ]
}

# We link host tests from the zircon build into the fuchsia build directory
# and synthesize test metadata for them so that these tests may be run as
# fuchsia tests.
zircon_host_test_deps = []
zircon_test_specs = read_file("$zircon_root_build_dir/tests.json", "json")
foreach(entry, zircon_test_specs) {
  zircon_test = {  # Clear from previous iteration.
  }
  zircon_test = entry.test
  is_disabled = defined(zircon_test.disabled) && zircon_test.disabled != ""
  if (!is_disabled &&
      (zircon_test.os == host_os && zircon_test.cpu == host_cpu)) {
    # We need a unique target name derived from the test entry, and slashes are
    # bad.
    copy_target_name =
        string_replace("_zircon_host_tests.${zircon_test.path}", "/", "_")
    copy_deps = []

    if (defined(zircon_test.runtime_deps)) {
      entries = read_file("$zircon_root_build_dir/${zircon_test.runtime_deps}",
                          "json")
      foreach(entry, entries) {
        # Same as above.
        copy_dep_target_name =
            string_replace("_zircon_host_tests.$entry", "/", "_")

        copy(copy_dep_target_name) {
          sources = [ "$zircon_root_build_dir/$entry" ]
          outputs = [ "$root_build_dir/$entry" ]
        }
        copy_deps += [ ":$copy_dep_target_name" ]
      }

      runtime_deps_file = "$target_gen_dir/$copy_target_name.deps.json"
      write_file(runtime_deps_file, entries, "json")
    }

    copy(copy_target_name) {
      testonly = true
      sources = [ "$zircon_root_build_dir/${zircon_test.path}" ]
      outputs = [ "$root_build_dir/${zircon_test.path}" ]
      deps = copy_deps

      metadata = {
        tests = [
          {
            test = {
              forward_variables_from(zircon_test,
                                     "*",
                                     [
                                       "disabled",
                                       "runtime_deps",
                                     ])
              label = string_replace(label, "//", "//zircon/")
              if (defined(runtime_deps_file)) {
                runtime_deps = rebase_path(runtime_deps_file, root_build_dir)
              }
            }

            # We only run host tests from x64 builds to avoid duplication.
            if (target_cpu == "x64") {
              environments = [ host_env ]
            } else {
              environments = []
            }
          },
        ]
      }
    }
    zircon_host_test_deps += [ ":$copy_target_name" ]
  }
}

group("zircon_host_tests") {
  testonly = true
  deps = zircon_host_test_deps
}

group("host_tests") {
  testonly = true
  public_deps = [ "//src/ledger:host_tests" ]
}
