chromium/chromeos/BUILD.gn

# 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_disabled_tests_on_this_board = []
  foreach(_test, tast_disabled_tests_from_chrome_all) {
    _test_name_and_board = []
    _test_name_and_board = string_split(_test, "@") + [ "" ]
    _test_name = _test_name_and_board[0]
    _test_board = _test_name_and_board[1]
    if (_test_board == "" || _test_board == cros_board) {
      _tast_disabled_tests_on_this_board += [ _test_name ]
    }
  }

  # 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") {
    tast_attr_expr = "\"group:mainline\" && \"dep:chrome\" && !informational"
    if (is_skylab) {
      # TODO(b/284405976): Add a !no_chrome_dcheck condition automatically by reading the build configuration.
      tast_attr_expr = "($tast_attr_expr && !\"dep:no_chrome_dcheck\")"
    }

    # 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_on_this_board
  }

  tast_test("chrome_all_tast_tests_informational") {
    enable_tast_informational_tests = true
  }

  tast_test("chrome_criticalstaging_tast_tests") {
    tast_attr_expr = "\"group:mainline\" && \"dep:chrome\" && !\"dep:lacros\" && \"informational\" && \"group:criticalstaging\""
    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 = "($tast_attr_expr && !\"dep:no_chrome_dcheck\")"
    }

    tast_disabled_tests = _tast_disabled_tests_on_this_board
  }

  tast_test("chrome_disabled_tast_tests") {
    tast_tests = _tast_disabled_tests_on_this_board
  }

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

  # Test suite to test the CrOS basic functionality (See http://go/cq-medium).
  tast_test("cq_medium_tast_tests") {
    tast_attr_expr = "\"group:cq-medium\" && \"dep:chrome\" && \"group:mainline\" && !informational"
    if (is_skylab) {
      # TODO(b/284405976): Add a !no_chrome_dcheck condition automatically by reading the build configuration.
      tast_attr_expr = "($tast_attr_expr && !\"dep:no_chrome_dcheck\")"
    }

    tast_disabled_tests = _tast_disabled_tests_on_this_board
  }

  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/" ]
  }
}