# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/buildflag_header.gni")
import("//build/config/ui.gni")
import("//testing/libfuzzer/fuzzer_test.gni")
import("//testing/test.gni")
import("./features.gni")
import("./tast_control.gni")

if (is_chromeos_device) {
  import("//build/config/chromeos/rules.gni")
}

assert(is_chromeos, "Non-Chrome-OS builds must not depend on //chromeos")

# Used by targets that compile into the implementation.
config("chromeos_implementation") {
  defines = [ "CHROMEOS_IMPLEMENTATION" ]
}

buildflag_header("features") {
  header = "features.h"
  flags = [ "USE_REAL_CHROMEOS_SERVICES=$use_real_chromeos_services" ]
}

component("chromeos") {
  deps = [ "//chromeos/dbus/constants" ]
  sources = []

  if (is_chromeos_ash) {
    configs += [ ":chromeos_implementation" ]
    if (current_cpu == "arm" || current_cpu == "x86") {
      defines = [ "BINDER_IPC_32BIT" ]
    }
  }
}

source_set("chromeos_export") {
  deps = [ "//base" ]
  sources = [ "chromeos_export.h" ]
}

# This must be a static library instead of a source set because some of the
# files pull in things with dependencies that aren't linked in all cases.
#
# TODO this should probably be changed such that it links in all cases and
# can be converted to a source set.
static_library("test_support") {
  testonly = true
  public_deps = [ ":test_support_source_set" ]
}

source_set("test_support_source_set") {
  testonly = true
  public_deps = [
    ":chromeos",
    ":test_utils",
  ]
  deps = [
    "//testing/gmock",
    "//testing/gtest",
  ]
  if (is_chromeos_ash) {
    deps += [
      "//chromeos/ash/components/dbus:test_support",
      "//chromeos/ash/components/login/login_state:test_support",
      "//chromeos/ash/components/network:test_support",
      "//google_apis",
      "//net:test_support",
      "//services/network:test_support",
    ]
  }
}

source_set("test_utils") {
  deps = [ "//base" ]
  sources = [
    "test/chromeos_test_utils.cc",
    "test/chromeos_test_utils.h",
  ]
}

test("chromeos_unittests") {
  configs += [ "//build/config/linux/dbus" ]

  deps = [
    "//base",
    "//base/test:test_support",
    "//build:chromeos_buildflags",
    "//mojo/core/embedder",
  ]

  sources = [ "test/run_all_unittests.cc" ]

  # Tests that are common to Ash and Lacros.
  deps += [
    "//chromeos/components/firewall_hole:unit_tests",
    "//chromeos/constants:unit_tests",
    "//chromeos/system:unit_tests",
  ]

  if (is_chromeos_ash) {
    deps += [
      ":test_support",
      "//chromeos/ash/components:test_support",
      "//chromeos/ash/components:unit_tests",
      "//chromeos/ash/components/dbus:test_support",
      "//chromeos/ash/components/network:test_support",
      "//chromeos/ash/services:unit_tests",
      "//chromeos/crosapi/cpp:unit_tests",
      "//chromeos/crosapi/mojom:unit_tests",
      "//chromeos/dbus:unit_tests",
      "//chromeos/printing:unit_tests",
      "//chromeos/process_proxy:unit_tests",
      "//chromeos/services:unit_tests",
      "//chromeos/startup:unit_tests",
      "//chromeos/ui/base:unit_tests",
      "//chromeos/utils:unit_tests",
      "//chromeos/version:unit_tests",
      "//components/onc",
      "//components/prefs:test_support",
      "//components/proxy_config",
      "//crypto",
      "//dbus:test_support",
      "//google_apis",
      "//net",
      "//net:test_support",
      "//services/network/public/cpp",
      "//url",
    ]
  }

  if (is_chromeos_lacros) {
    deps += [ "//chromeos/lacros:unit_tests" ]
  }

  data = [ "test/data/" ]
}

# The following definitions only apply when building for a CrOS board (ie: not
# linux-chromeos). See the following for reference:
# https://chromium.googlesource.com/chromium/src/+/main/docs/chromeos_build_instructions.md
# https://chromium.googlesource.com/chromiumos/docs/+/main/simple_chrome_workflow.md
if (is_chromeos_ash && is_chromeos_device) {
  # This builds a tool that prepares a DUT or VM for testing, which can be
  # utilized by wrapping a host-side script test.
  generate_runner_script("cros_test_wrapper") {
    generated_script = "$root_build_dir/bin/cros_test_wrapper"

    # Assume every time we build cros_test_wrapper, we also build chrome and
    # want to deploy it to the DUT.
    deploy_chrome = true

    # The only targets that currently use cros_test_wrapper are Telemetry-based
    # tests, which have their own crash/symbolization handling code. So, strip
    # Chrome before deploying in order to save disk space and avoid potential
    # memory issues on 32-bit devices.
    strip_chrome = true
  }

  tast_test("chrome_login_tast_tests") {
    tast_tests = [
      "ui.ChromeCrashLoggedIn",
      "ui.ChromeCrashNotLoggedIn",
    ]
  }

  # Used to report the size of various partitions. For more details, see:
  # https://source.chromium.org/search?q=report_disk_usage.go
  tast_test("disk_usage_tast_test") {
    tast_tests = [ "platform.ReportDiskUsage" ]
  }

  # Tast test sources live in the Chromium OS repository.
  # To diagnose tast failures or disable tests, see go/tast-failures
  # For any builders that run this target, it should also build Lacros.
  tast_test("chrome_all_tast_tests") {
    if (is_skylab) {
      # TODO(b/284405976): Add a !no_chrome_dcheck condition automatically by reading the build configuration.
      tast_attr_expr = "(\"group:mainline\" && \"dep:chrome\" && !\"dep:no_chrome_dcheck\" && !informational)"
    } else {
      deploy_lacros_chrome = true
    }

    # To disable a specific test, add it to the
    # tast_disabled_tests_from_chrome_all list in "tast_control.gni" and cite
    # a bug.
    tast_disabled_tests = tast_disabled_tests_from_chrome_all
  }

  tast_test("chrome_all_tast_tests_informational") {
    enable_tast_informational_tests = true
  }

  tast_test("chrome_criticalstaging_tast_tests") {
    if (is_skylab) {
      # TODO(b/284405976): Add a !no_chrome_dcheck condition automatically by reading the build configuration.
      # TODO(b/294489383): Re-enable lacros tests once lacros chrome is deployed to ash skylab builders.
      tast_attr_expr = "(\"group:mainline\" && \"dep:chrome\" && !\"dep:no_chrome_dcheck\" && !\"dep:lacros\" && \"informational\" && \"group:criticalstaging\")"
    } else {
      deploy_lacros_chrome = true
    }

    # To disable a specific test, add it to the
    # tast_disabled_tests_from_chrome_all list in "tast_control.gni" and cite
    # a bug.
    tast_disabled_tests = tast_disabled_tests_from_chrome_all
  }

  tast_test("chrome_disabled_tast_tests") {
    tast_tests = tast_disabled_tests_from_chrome_all
  }

  tast_test("chrome_variations_tast_tests") {
    tast_tests = [ "ui.ChromeVariationsSmoke" ]
  }

  group("cros_chrome_deploy") {
    # The following run-time dependencies are needed to deploy chrome to a
    # ChromeOS device. See the link for the full list:
    # https://codesearch.chromium.org/chromium/src/third_party/chromite/lib/chrome_util.py?l=341
    # Most of these are copy targets, for which GN doesn't add their outputs
    # as runtime-deps. See the link below for more details:
    # https://chromium.googlesource.com/chromium/src/+/main/tools/gn/docs/reference.md#actions-and-copies
    data_deps = [ "//chrome:xdg_mime" ]

    # TODO(bpastene): Figure out what's generating resources/chromeos/ and
    # declare it as a dep instead of adding the dir directly.
    data = [ "$root_out_dir/resources/chromeos/" ]
  }
}
