# Copyright 2014 The Chromium 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/ui.gni")
import("//testing/test.gni")
import("//third_party/protobuf/proto_library.gni")

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

declare_args() {
  # Use binder. Binder related code is compiled only when true.
  use_binder = false
}

gypi_values = exec_script("//build/gypi_to_gn.py",
                          [ rebase_path("chromeos.gyp") ],
                          "scope",
                          [ "chromeos.gyp" ])

component("chromeos") {
  configs += [ "//net/third_party/nss/ssl:ssl_config" ]
  public_deps = [
    "//dbus",
  ]
  deps = [
    ":cryptohome_proto",
    ":power_manager_proto",
    "//base",
    "//base:i18n",
    "//base/third_party/dynamic_annotations",
    "//components/device_event_log",
    "//components/onc",
    "//components/policy/proto",
    "//components/prefs",
    "//components/proxy_config",
    "//components/signin/core/account_id",
    "//components/user_manager",
    "//crypto",
    "//crypto:platform",
    "//google_apis",
    "//third_party/icu",
    "//third_party/libxml",
    "//third_party/protobuf:protobuf_lite",
    "//url",
  ]
  sources = gypi_values.chromeos_sources
  defines = [ "CHROMEOS_IMPLEMENTATION" ]
  if (target_cpu == "arm" || target_cpu == "x86") {
    defines += [ "BINDER_IPC_32BIT" ]
  }
}

# TYhis 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
  configs += [ "//build/config/linux:dbus" ]
  public_deps = [
    ":chromeos",
    ":cryptohome_proto",
    ":power_manager_proto",
    ":test_support_without_gmock",
    "//testing/gmock",
  ]
  sources = [
    "attestation/mock_attestation_flow.cc",
    "attestation/mock_attestation_flow.h",
    "chromeos_test_utils.cc",
    "chromeos_test_utils.h",
    "cryptohome/mock_async_method_caller.cc",
    "cryptohome/mock_async_method_caller.h",
    "cryptohome/mock_homedir_methods.cc",
    "cryptohome/mock_homedir_methods.h",
    "dbus/mock_cryptohome_client.cc",
    "dbus/mock_cryptohome_client.h",
    "dbus/mock_lorgnette_manager_client.cc",
    "dbus/mock_lorgnette_manager_client.h",
    "dbus/mock_permission_broker_client.cc",
    "dbus/mock_permission_broker_client.h",
    "dbus/mock_session_manager_client.cc",
    "dbus/mock_session_manager_client.h",
    "dbus/mock_shill_manager_client.cc",
    "dbus/mock_shill_manager_client.h",
    "dbus/mock_shill_profile_client.cc",
    "dbus/mock_shill_profile_client.h",
    "dbus/mock_shill_service_client.cc",
    "dbus/mock_shill_service_client.h",
    "dbus/services/service_provider_test_helper.cc",
    "dbus/services/service_provider_test_helper.h",
    "disks/mock_disk_mount_manager.cc",
    "disks/mock_disk_mount_manager.h",
    "geolocation/simple_geolocation_request_test_monitor.cc",
    "geolocation/simple_geolocation_request_test_monitor.h",
    "login/auth/fake_extended_authenticator.cc",
    "login/auth/fake_extended_authenticator.h",
    "login/auth/mock_auth_attempt_state_resolver.cc",
    "login/auth/mock_auth_attempt_state_resolver.h",
    "login/auth/mock_auth_status_consumer.cc",
    "login/auth/mock_auth_status_consumer.h",
    "login/auth/mock_url_fetchers.cc",
    "login/auth/mock_url_fetchers.h",
    "network/fake_network_device_handler.cc",
    "network/fake_network_device_handler.h",
    "network/mock_managed_network_configuration_handler.cc",
    "network/mock_managed_network_configuration_handler.h",
    "network/onc/onc_test_utils.cc",
    "network/onc/onc_test_utils.h",
    "system/fake_statistics_provider.cc",
    "system/fake_statistics_provider.h",
  ]
}

static_library("test_support_without_gmock") {
  testonly = true
  configs += [ "//build/config/linux:dbus" ]
  deps = [
    ":chromeos",
    ":cryptohome_proto",
    ":power_manager_proto",
    "//crypto",
  ]
  sources = [
    "dbus/fake_cros_disks_client.cc",
    "dbus/fake_cros_disks_client.h",
    "dbus/fake_session_manager_client.cc",
    "dbus/fake_session_manager_client.h",
    "dbus/fake_shill_manager_client.cc",
    "dbus/fake_shill_manager_client.h",
    "dbus/fake_update_engine_client.cc",
    "dbus/fake_update_engine_client.h",
  ]
}

test("chromeos_unittests") {
  configs += [
    "//build/config/linux:dbus",
    "//net/third_party/nss/ssl:ssl_config",
  ]
  deps = [
    ":cryptohome_proto",
    ":power_manager_proto",
    ":test_support",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//components/onc",
    "//components/prefs:test_support",
    "//components/proxy_config",
    "//components/signin/core/account_id",
    "//crypto",
    "//crypto:test_support",
    "//dbus:test_support",
    "//google_apis",
    "//net",
    "//net:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/icu",
    "//url",
  ]
  sources = gypi_values.chromeos_test_sources
  if (use_binder) {
    if (target_cpu == "arm" || target_cpu == "x86") {
      defines += [ "BINDER_IPC_32BIT" ]
    }
    sources += gypi_values.chromeos_binder_test_sources
  }
}

proto_library("power_manager_proto") {
  sources = [
    "//third_party/cros_system_api/dbus/power_manager/input_event.proto",
    "//third_party/cros_system_api/dbus/power_manager/peripheral_battery_status.proto",
    "//third_party/cros_system_api/dbus/power_manager/policy.proto",
    "//third_party/cros_system_api/dbus/power_manager/power_supply_properties.proto",
    "//third_party/cros_system_api/dbus/power_manager/suspend.proto",
  ]

  proto_out_dir = "chromeos/dbus/power_manager"
}

proto_library("cryptohome_proto") {
  sources = [
    "//third_party/cros_system_api/dbus/cryptohome/key.proto",
    "//third_party/cros_system_api/dbus/cryptohome/rpc.proto",
  ]

  proto_out_dir = "chromeos/dbus/cryptohome"
}

proto_library("cryptohome_signkey_proto") {
  sources = [
    "//third_party/cros_system_api/dbus/cryptohome/signed_secret.proto",
  ]

  proto_out_dir = "chromeos/cryptohome"
}
