# 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/host.gni")
import("//build/packages/prebuilt_test_manifest.gni")
import("//src/chromium/build_args.gni")
import("//src/chromium/generate_pkg_and_config.gni")
import("//src/lib/icu/tzdata/icu_tzdata_config_data.gni")

# Helper template that generates prebuilt Chromium packages.
#
# Parameters:
#   archive_path_suffix: For a given package target, the archive_path_suffix
#                        is appended to the innermost folder of the base paths
#                        passed into the generate_package_flavors_and_config template.

template("generate_chromium_targets") {
  assert(defined(invoker.archive_path_suffix))

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

  # This target is provided for use by //src:src* targets. Dependencies on
  # Chromium-supplied packages should reference specific package(s).
  group(target_name) {
    visibility = [ "//src:*" ]

    public_deps = [
      ":web_engine",
      ":web_runner",
    ]

    # TODO(fxbug.dev/81925): Uncomment once this will not fail without
    # `-fetch-optional=chrome-browser`.
    # if (target_cpu == "x64") {
    #   public_deps += [ ":chrome_browser", ]
    # }
  }

  group("web_engine") {
    deps = [
      ":tzdata_for_web_engine",
      ":web_engine_config",
      ":web_engine_pkg",
    ]
  }

  # TODO(fxbug.dev/70573): Remove when use_chromium_canary is deprecated.
  # TODO(fxbug.dev/81925): Remove else condition when release chrome is
  # available.
  if (use_chromium_canary) {
    package_flavor_selections += [
      {
        name = "web_engine_pkg"
        flavor = "canary"
      },
      {
        name = "web_engine_shell_pkg"
        flavor = "canary"
      },
      {
        name = "web_runner_pkg"
        flavor = "canary"
      },
      {
        name = "chrome_browser_pkg"
        flavor = "canary"
      },
    ]
  } else {
    package_flavor_selections += [
      {
        name = "chrome_browser_pkg"
        flavor = "canary"
      },
    ]
  }

  # Setting chromium_build_dir in args.gn allows using chromium packages built
  # directly in Chromium source.
  if (chromium_build_dir != "") {
    package_flavor_selections += [
      {
        name = "web_engine_pkg"
        flavor = "custom"
      },
      {
        name = "web_engine_shell_pkg"
        flavor = "custom"
      },
      {
        name = "web_runner_pkg"
        flavor = "custom"
      },
      {
        name = "chrome_browser_pkg"
        flavor = "custom"
      },
    ]
  }

  generate_package_flavors_and_config("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/engine/${target_name}/${target_name}.far"
    selections = package_flavor_selections

    # Config data arguments.
    for_pkg = "sysmgr"
    sources = [ "//src/chromium/config/web_context_provider.config" ]
  }

  icu_tzdata_config_data("tzdata_for_web_engine") {
    for_pkg = "web_engine"
  }

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

  generate_package_flavors("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/engine/${target_name}/${target_name}.far"
    selections = package_flavor_selections

    testonly = true
  }

  group("web_runner") {
    deps = [
      ":web_runner_config",
      ":web_runner_pkg",
    ]
  }

  generate_package_flavors_and_config("web_runner") {
    prebuilt_archive_base_path = "${prebuilt_archive_root_path}/${target_name}${invoker.archive_path_suffix}"

    custom_package_path = "${build_output_gen_base_path}/fuchsia/runners/${target_name}/${target_name}.far"
    selections = package_flavor_selections

    # Config data arguments.
    for_pkg = "appmgr"
    sources = [ "//src/chromium/config/http_scheme_map.config" ]
    outputs = [ "scheme_map/http.config" ]
  }

  # Only add chrome_browser for x64, arm64 is still WIP: http://crbug/1320078
  if (target_cpu == "x64") {
    group("chrome_browser") {
      deps = [
        ":chrome_browser_pkg",
        ":tzdata_for_chrome_browser",
      ]
    }

    icu_tzdata_config_data("tzdata_for_chrome_browser") {
      for_pkg = "chrome_browser"
    }

    generate_package_flavors("chrome_browser") {
      prebuilt_archive_base_path = "${prebuilt_archive_root_path}/chrome"
      package_name = "chrome"
      repository = "chromium.org"
      custom_package_path =
          "${build_output_gen_base_path}/chrome/app/chrome/chrome.far"
      selections = package_flavor_selections
    }
  }

  # TODO(fxbug.dev/71642): Migrate the uses of this variable below to
  # generate_pkg_and_config.gni. A simple function with a Boolean could be sufficient.
  if (use_chromium_canary) {
    flavor_suffix = "_latest"
  } else {
    flavor_suffix = ""
  }

  if (is_host) {
    copy("chromedriver") {
      outputs = [ "${host_tools_dir}/chromedriver" ]
      sources = [ "${prebuilt_archive_root_path}/chromedriver${invoker.archive_path_suffix}${flavor_suffix}/linux-x64/chromedriver" ]
    }
  } else {
    # Prebuilt FAR tests
    test_env = [
      atlas_env,
      nuc_env,
    ]

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

    # The specific tests binaries are specified by the "tests" target in
    # https://source.chromium.org/chromium/chromium/src/+/main:fuchsia/cipd/BUILD.gn.
    prebuilt_test_manifest("chromium_common_tests") {
      manifest_name = "common_tests_manifest.json"
      environments = test_env
      log_settings = {
        max_severity = "ERROR"
      }
      deps = [
        # The targets below have exactly the same contents, so will not be taking
        # extra storage in configurations that use them both.
        ":tzdata_for_base_unittests",
        ":tzdata_for_chromium_tests_base_unittests",
        ":tzdata_for_media_unittests",
      ]
    }

    prebuilt_test_manifest("chromium_web_engine_tests") {
      manifest_name = "web_engine_tests_manifest.json"
      environments = test_env
      log_settings = {
        max_severity = "ERROR"
      }
      deps = [
        ":web_engine",
        ":web_runner",
      ]
    }

    prebuilt_test_manifest("chromium_cast_runner_tests") {
      manifest_name = "cast_runner_tests_manifest.json"
      environments = [ nuc_env ]
      log_settings = {
        max_severity = "ERROR"
      }
    }

    icu_tzdata_config_data("tzdata_for_chromium_tests_base_unittests") {
      for_pkg = "chromium_tests_base_unittests"
      testonly = true
    }

    icu_tzdata_config_data("tzdata_for_base_unittests") {
      for_pkg = "base_unittests"
      testonly = true
    }

    icu_tzdata_config_data("tzdata_for_media_unittests") {
      for_pkg = "media_unittests"
      testonly = true
    }

    # 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_cast_runner_tests",
        ":chromium_common_tests",
        ":chromium_web_engine_tests",
        ":web_engine_shell",
        "web_runner_tests:tests",
        "//src/fonts:downstream_test_deps",
      ]
    }
  }
}
