# 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/packages/prebuilt_test_manifest.gni")
import("//src/chromium/generate_pkg.gni")
import("//src/sys/core/build/core_shard.gni")

prebuilt_archive_root_path = "//prebuilt/third_party"
build_output_gen_base_path = "/gen"

# Generates targets for WebEngine prebuilts.
#
# Parameters
#
#   archive_path_suffix (required)
#     Appended to the name of the target in archive paths.
#
#   repository (required; string)
#     The repository host name part of the package URL.
#     See https://fuchsia.dev/fuchsia-src/concepts/packages/package_url#repository
#     for more details.
template("generate_fuchsia_web_targets") {
  # Default visibility for targets generated by this template.
  visibility = []
  assert(defined(invoker.archive_path_suffix))
  assert(defined(invoker.repository))
  not_needed([ "target_name" ])

  repository = invoker.repository

  # WebEngine - a Chromium implementation of `fuchsia.web`.
  # Only buildbot bundles that need WebEngine to run tests should depend on
  # this target. See https://fxbug.dev/42070261 for why this is necessary.
  # The in-tree tests themselves depend on ":web_context_provider_for_test"
  # below.
  group("web_engine") {
    visibility += [
      # Allow developers to include it using `--with-cache` or `--with`.
      # This has a side effect of allowing in-tree //products to include it due
      # to the way they are currently assembled.
      "//:developer_cache_packages",
      "//:developer_universe_packages",

      # Allow buildbot bundles to include it so that tests can be run.
      "//bundles/buildbot/*",
    ]
    deps = [ ":web_engine_pkg" ]
    testonly = true
  }

  # Used by integration tests to indicate they need WebEngine, specifically the
  # `context_provider.cm` Component, in the Products on which they run. It has
  # no effect. Bots and developers running such tests must build and depend on,
  # respectively, ":web_engine".
  # TODO(https://fxbug.dev/42070261): Remove once a better solution is available.
  group("web_context_provider_for_test") {
    # No new tests relying on WebEngine should be added in tree.
    visibility += [
      "//src/chromium/web_runner_tests/*",
      "//src/testing/system-validation:*",
      "//src/ui/a11y/lib/semantics/tests:*",
      "//src/ui/tests/integration_graphics_tests/web-pixel-tests:*",
      "//src/ui/tests/integration_input_tests/mouse/*",
      "//src/ui/tests/integration_input_tests/text-input//*",
      "//src/ui/tests/integration_input_tests/touch/*",
      "//src/ui/tests/integration_input_tests/virtual-keyboard/*",
      "//src/ui/tests/integration_input_tests/web-touch-input/*",
    ]
    testonly = true
  }

  # Generates ":web_engine_pkg".
  generate_fuchsia_web_package_flavors("web_engine") {
    # Prevent dependencies on the package other than ":web_engine", which has
    # a specific visibility list.
    visibility += [ ":web_engine" ]

    prebuilt_archive_base_path = "${prebuilt_archive_root_path}/${target_name}${invoker.archive_path_suffix}"
    custom_package_path = "${build_output_gen_base_path}/fuchsia_web/webengine/${target_name}/${target_name}.far"
  }

  # TODO(crbug.com/1385930): Templatize the shard file to allow specification of
  # the `repo-hostname` and replace all other instances of similar build rules.
  core_shard("web_context_provider_core_shard") {
    visibility += [ ":web_engine_PKG" ]
    shard_file = "config/web_context_provider.core_shard.cml"
  }
}

# Generates targets for prebuilts used for testing WebEngine.
#
# Parameters
#
#   archive_path_suffix (required)
#     Appended to the name of the target in archive base paths.
#
#   repository (required; string)
#     The repository host name part of the package URL.
#     See https://fuchsia.dev/fuchsia-src/concepts/packages/package_url#repository
#     for more details.
template("generate_fuchsia_web_test_targets") {
  # Default visibility for targets generated by this template.
  visibility = []
  assert(defined(invoker.archive_path_suffix))
  assert(defined(invoker.repository))
  not_needed([ "target_name" ])

  repository = invoker.repository

  group("web_engine_shell") {
    visibility += [ "*" ]
    deps = [ ":web_engine_shell_pkg" ]
    testonly = true
  }

  # Generates ":web_engine_shell_pkg".
  generate_fuchsia_web_package_flavors("web_engine_shell") {
    visibility += [ ":web_engine_shell" ]

    prebuilt_archive_base_path = "${prebuilt_archive_root_path}/${target_name}${invoker.archive_path_suffix}"
    custom_package_path = "${build_output_gen_base_path}/fuchsia_web/shell/${target_name}/${target_name}.far"

    testonly = true
  }
}

if (current_cpu == "riscv64") {
  # The real generate_test_targets() definition below fails at `gn gen` time
  # because prebuilt_test_manifest() uses read_file() to parse a manifest
  # file that does not exist for riscv64 yet.
  #
  # TODO(https://fxbug.dev/42072732): Provide riscv64 Chromium prebuilts
  # Alternatively, move this check up in the dependency chain.
  template("generate_test_targets") {
    visibility = [ ":*" ]
    not_needed([ "target_name" ])
    not_needed(invoker, "*")
    group("tests") {
    }
  }
} else {
  # Generates targets for Chromium test prebuilts and manifests.
  #
  # Parameters
  #
  #   archive_path_suffix (required)
  #     Appended to the name of the target in archive paths.
  template("generate_test_targets") {
    # Default visibility for targets generated by this template.
    visibility = [ ":*" ]
    assert(defined(invoker.archive_path_suffix))
    not_needed([ "target_name" ])

    # Configure groups of prebuilt tests from Chromium.

    default_test_environments = [
      atlas_env,
      nuc_env,
    ]

    _prebuilt_archive_base_path = "${prebuilt_archive_root_path}/web_engine_tests${invoker.archive_path_suffix}"
    archive_dir = "${_prebuilt_archive_base_path}/arch/${target_cpu}"

    # The specific tests binaries are specified by the "tests" target in
    # https://source.chromium.org/chromium/chromium/src/+/main:build/fuchsia/cipd/BUILD.gn.
    prebuilt_test_manifest("chromium_common_tests") {
      manifest_name = "common_tests_manifest.json"
      environments = default_test_environments
      log_settings = {
        max_severity = "ERROR"
      }
      deps = [ ":chromium_test_base_deps" ]
    }

    prebuilt_test_manifest("chromium_web_engine_tests") {
      manifest_name = "web_engine_tests_manifest.json"
      environments = default_test_environments
      log_settings = {
        max_severity = "ERROR"
      }
      deps = [ ":chromium_test_base_deps" ]
    }

    # This target is provided for use by //src:test* targets. Dependencies on
    # Chromium tests should reference specific target(s).
    group("tests") {
      testonly = true
      visibility += [ "//src:*" ]

      deps = [
        ":chromium_common_tests",
        ":chromium_web_engine_tests",
        ":web_engine_shell",
        "web_runner_tests:tests",
        "//src/fonts:downstream_test_deps",
      ]
    }
  }
}
