# Copyright 2018 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("//services/service_manager/public/service_manifest.gni")

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

static_library("multidevice_setup") {
  sources = [
    "account_status_change_delegate_notifier.cc",
    "account_status_change_delegate_notifier.h",
    "account_status_change_delegate_notifier_impl.cc",
    "account_status_change_delegate_notifier_impl.h",
    "android_sms_app_installing_status_observer.cc",
    "android_sms_app_installing_status_observer.h",
    "device_reenroller.cc",
    "device_reenroller.h",
    "eligible_host_devices_provider.h",
    "eligible_host_devices_provider_impl.cc",
    "eligible_host_devices_provider_impl.h",
    "feature_state_manager.cc",
    "feature_state_manager.h",
    "feature_state_manager_impl.cc",
    "feature_state_manager_impl.h",
    "grandfathered_easy_unlock_host_disabler.cc",
    "grandfathered_easy_unlock_host_disabler.h",
    "host_backend_delegate.cc",
    "host_backend_delegate.h",
    "host_backend_delegate_impl.cc",
    "host_backend_delegate_impl.h",
    "host_device_timestamp_manager.h",
    "host_device_timestamp_manager_impl.cc",
    "host_device_timestamp_manager_impl.h",
    "host_status_provider.cc",
    "host_status_provider.h",
    "host_status_provider_impl.cc",
    "host_status_provider_impl.h",
    "host_verifier.cc",
    "host_verifier.h",
    "host_verifier_impl.cc",
    "host_verifier_impl.h",
    "multidevice_setup_base.cc",
    "multidevice_setup_base.h",
    "multidevice_setup_impl.cc",
    "multidevice_setup_impl.h",
    "multidevice_setup_initializer.cc",
    "multidevice_setup_initializer.h",
    "multidevice_setup_service.cc",
    "multidevice_setup_service.h",
    "privileged_host_device_setter_base.cc",
    "privileged_host_device_setter_base.h",
    "privileged_host_device_setter_impl.cc",
    "privileged_host_device_setter_impl.h",
  ]

  deps = [
    "//base",
    "//chromeos/components/multidevice",
    "//chromeos/components/multidevice/logging",
    "//chromeos/services/device_sync/proto:util",
    "//chromeos/services/device_sync/public/cpp",
    "//chromeos/services/device_sync/public/mojom",
    "//chromeos/services/multidevice_setup/proto",
    "//chromeos/services/multidevice_setup/public/cpp:android_sms_app_helper_delegate",
    "//chromeos/services/multidevice_setup/public/cpp:android_sms_pairing_state_tracker",
    "//chromeos/services/multidevice_setup/public/cpp:auth_token_validator",
    "//chromeos/services/multidevice_setup/public/cpp:oobe_completion_tracker",
    "//chromeos/services/multidevice_setup/public/cpp:prefs",
    "//chromeos/services/multidevice_setup/public/mojom",
    "//chromeos/services/secure_channel/public/cpp/client",
    "//chromeos/services/secure_channel/public/mojom",
    "//components/pref_registry",
    "//components/prefs:prefs",
    "//services/service_manager/public/cpp",
  ]
}

service_manifest("manifest") {
  name = "multidevice_setup"
  source = "manifest.json"
}

static_library("test_support") {
  testonly = true

  sources = [
    "fake_account_status_change_delegate.cc",
    "fake_account_status_change_delegate.h",
    "fake_account_status_change_delegate_notifier.h",
    "fake_eligible_host_devices_provider.cc",
    "fake_eligible_host_devices_provider.h",
    "fake_feature_state_manager.cc",
    "fake_feature_state_manager.h",
    "fake_feature_state_observer.cc",
    "fake_feature_state_observer.h",
    "fake_host_backend_delegate.cc",
    "fake_host_backend_delegate.h",
    "fake_host_device_timestamp_manager.cc",
    "fake_host_device_timestamp_manager.h",
    "fake_host_status_observer.cc",
    "fake_host_status_observer.h",
    "fake_host_status_provider.cc",
    "fake_host_status_provider.h",
    "fake_host_verifier.cc",
    "fake_host_verifier.h",
  ]

  deps = [
    ":multidevice_setup",
    "//base",
    "//chromeos/components/multidevice",
    "//chromeos/services/multidevice_setup/public/mojom",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

source_set("unit_tests") {
  testonly = true

  sources = [
    "account_status_change_delegate_notifier_impl_unittest.cc",
    "android_sms_app_installing_status_observer_unittest.cc",
    "device_reenroller_unittest.cc",
    "eligible_host_devices_provider_impl_unittest.cc",
    "feature_state_manager_impl_unittest.cc",
    "grandfathered_easy_unlock_host_disabler_unittest.cc",
    "host_backend_delegate_impl_unittest.cc",
    "host_device_timestamp_manager_impl_unittest.cc",
    "host_status_provider_impl_unittest.cc",
    "host_verifier_impl_unittest.cc",
    "multidevice_setup_impl_unittest.cc",
    "multidevice_setup_service_unittest.cc",
    "privileged_host_device_setter_impl_unittest.cc",
  ]

  deps = [
    ":multidevice_setup",
    ":test_support",
    "//base",
    "//base/test:test_support",
    "//chromeos/components/multidevice",
    "//chromeos/components/multidevice:test_support",
    "//chromeos/services/device_sync/public/cpp:test_support",
    "//chromeos/services/multidevice_setup/public/cpp:oobe_completion_tracker",
    "//chromeos/services/multidevice_setup/public/cpp:prefs",
    "//chromeos/services/multidevice_setup/public/cpp:test_support",
    "//chromeos/services/multidevice_setup/public/cpp:unit_tests",
    "//chromeos/services/multidevice_setup/public/mojom",
    "//chromeos/services/secure_channel/public/cpp/client:test_support",
    "//components/sync_preferences:test_support",
    "//services/service_manager/public/cpp/test:test_support",
    "//testing/gmock",
    "//testing/gtest",
  ]
}
