# 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/buildflag_header.gni")
import("//build/config/features.gni")

source_set("sync_driver") {
  sources = [
    "about_sync_util.cc",
    "about_sync_util.h",
    "backend_data_type_configurer.cc",
    "backend_data_type_configurer.h",
    "backend_migrator.cc",
    "backend_migrator.h",
    "change_processor.cc",
    "change_processor.h",
    "data_type_controller.cc",
    "data_type_controller.h",
    "data_type_encryption_handler.cc",
    "data_type_encryption_handler.h",
    "data_type_error_handler.h",
    "data_type_manager.cc",
    "data_type_manager.h",
    "data_type_manager_impl.cc",
    "data_type_manager_impl.h",
    "data_type_manager_observer.h",
    "data_type_status_table.cc",
    "data_type_status_table.h",
    "device_count_metrics_provider.cc",
    "device_count_metrics_provider.h",
    "device_info.cc",
    "device_info.h",
    "device_info_data_type_controller.cc",
    "device_info_data_type_controller.h",
    "device_info_model_type_controller.cc",
    "device_info_model_type_controller.h",
    "device_info_service.cc",
    "device_info_service.h",
    "device_info_sync_service.cc",
    "device_info_sync_service.h",
    "device_info_tracker.h",
    "directory_data_type_controller.cc",
    "directory_data_type_controller.h",
    "frontend_data_type_controller.cc",
    "frontend_data_type_controller.h",
    "generic_change_processor.cc",
    "generic_change_processor.h",
    "generic_change_processor_factory.cc",
    "generic_change_processor_factory.h",
    "glue/browser_thread_model_worker.cc",
    "glue/browser_thread_model_worker.h",
    "glue/chrome_report_unrecoverable_error.cc",
    "glue/chrome_report_unrecoverable_error.h",
    "glue/sync_backend_host.cc",
    "glue/sync_backend_host.h",
    "glue/sync_backend_host_core.cc",
    "glue/sync_backend_host_core.h",
    "glue/sync_backend_host_impl.cc",
    "glue/sync_backend_host_impl.h",
    "glue/sync_backend_registrar.cc",
    "glue/sync_backend_registrar.h",
    "glue/ui_model_worker.cc",
    "glue/ui_model_worker.h",
    "invalidation_adapter.cc",
    "invalidation_adapter.h",
    "invalidation_helper.cc",
    "invalidation_helper.h",
    "local_device_info_provider.h",
    "local_device_info_provider_impl.cc",
    "local_device_info_provider_impl.h",
    "model_association_manager.cc",
    "model_association_manager.h",
    "model_associator.h",
    "non_blocking_data_type_controller.cc",
    "non_blocking_data_type_controller.h",
    "non_ui_data_type_controller.cc",
    "non_ui_data_type_controller.h",
    "non_ui_model_type_controller.cc",
    "non_ui_model_type_controller.h",
    "pref_names.cc",
    "pref_names.h",
    "profile_sync_auth_provider.cc",
    "profile_sync_auth_provider.h",
    "protocol_event_observer.cc",
    "protocol_event_observer.h",
    "proxy_data_type_controller.cc",
    "proxy_data_type_controller.h",
    "shared_change_processor.cc",
    "shared_change_processor.h",
    "shared_change_processor_ref.cc",
    "shared_change_processor_ref.h",
    "signin_manager_wrapper.cc",
    "signin_manager_wrapper.h",
    "startup_controller.cc",
    "startup_controller.h",
    "sync_api_component_factory.h",
    "sync_client.cc",
    "sync_client.h",
    "sync_driver_switches.cc",
    "sync_driver_switches.h",
    "sync_error_controller.cc",
    "sync_error_controller.h",
    "sync_frontend.cc",
    "sync_frontend.h",
    "sync_prefs.cc",
    "sync_prefs.h",
    "sync_service.cc",
    "sync_service.h",
    "sync_service_observer.cc",
    "sync_service_observer.h",
    "sync_service_utils.cc",
    "sync_service_utils.h",
    "sync_stopped_reporter.cc",
    "sync_stopped_reporter.h",
    "sync_type_preference_provider.h",
    "sync_util.cc",
    "sync_util.h",
    "system_encryptor.cc",
    "system_encryptor.h",
    "ui_data_type_controller.cc",
    "ui_data_type_controller.h",
    "ui_model_type_controller.cc",
    "ui_model_type_controller.h",
    "user_selectable_sync_type.h",
  ]

  public_deps = [
    "//third_party/cacheinvalidation",
  ]
  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//components/data_use_measurement/core",
    "//components/invalidation/public",
    "//components/metrics",
    "//components/os_crypt",
    "//components/pref_registry",
    "//components/prefs",
    "//components/signin/core/browser",
    "//components/version_info",
    "//google_apis",
    "//net",
    "//sync",
  ]

  if (enable_configuration_policy) {
    sources += [
      "sync_policy_handler.cc",
      "sync_policy_handler.h",
    ]
    deps += [
      "//components/policy",
      "//components/policy:policy_component",
    ]
  }
}

source_set("test_support") {
  testonly = true
  sources = [
    "change_processor_mock.cc",
    "change_processor_mock.h",
    "data_type_controller_mock.cc",
    "data_type_controller_mock.h",
    "data_type_error_handler_mock.cc",
    "data_type_error_handler_mock.h",
    "data_type_manager_mock.cc",
    "data_type_manager_mock.h",
    "fake_data_type_controller.cc",
    "fake_data_type_controller.h",
    "fake_generic_change_processor.cc",
    "fake_generic_change_processor.h",
    "fake_sync_client.cc",
    "fake_sync_client.h",
    "fake_sync_service.cc",
    "fake_sync_service.h",
    "frontend_data_type_controller_mock.cc",
    "frontend_data_type_controller_mock.h",
    "glue/sync_backend_host_mock.cc",
    "glue/sync_backend_host_mock.h",
    "local_device_info_provider_mock.cc",
    "local_device_info_provider_mock.h",
    "model_associator_mock.cc",
    "model_associator_mock.h",
    "non_ui_data_type_controller_mock.cc",
    "non_ui_data_type_controller_mock.h",
    "sync_api_component_factory_mock.cc",
    "sync_api_component_factory_mock.h",
  ]

  public_deps = [
    ":sync_driver",
    "//sync",
  ]

  deps = [
    "//base",
    "//components/version_info",
    "//google_apis",
    "//sync:test_support_sync_internal_api",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "about_sync_util_unittest.cc",
    "backend_migrator_unittest.cc",
    "data_type_manager_impl_unittest.cc",
    "device_count_metrics_provider_unittest.cc",
    "device_info_data_type_controller_unittest.cc",
    "device_info_service_unittest.cc",
    "device_info_sync_service_unittest.cc",
    "frontend_data_type_controller_unittest.cc",
    "generic_change_processor_unittest.cc",
    "glue/browser_thread_model_worker_unittest.cc",
    "glue/sync_backend_host_impl_unittest.cc",
    "glue/sync_backend_registrar_unittest.cc",
    "glue/ui_model_worker_unittest.cc",
    "local_device_info_provider_unittest.cc",
    "model_association_manager_unittest.cc",
    "non_ui_data_type_controller_unittest.cc",
    "non_ui_model_type_controller_unittest.cc",
    "profile_sync_auth_provider_unittest.cc",
    "shared_change_processor_unittest.cc",
    "startup_controller_unittest.cc",
    "sync_prefs_unittest.cc",
    "sync_stopped_reporter_unittest.cc",
    "sync_util_unittest.cc",
    "system_encryptor_unittest.cc",
    "ui_data_type_controller_unittest.cc",
    "ui_model_type_controller_unittest.cc",
  ]
  deps = [
    ":test_support",
    "//base",
    "//base/test:test_support",
    "//components/invalidation/impl",
    "//components/os_crypt",
    "//components/pref_registry:test_support",
    "//components/prefs:test_support",
    "//components/signin/core/browser:test_support",
    "//components/syncable_prefs",
    "//components/syncable_prefs:test_support",
    "//components/version_info",
    "//net:test_support",
    "//sync:test_support_sync_api",
    "//sync:test_support_sync_internal_api",
    "//testing/gmock",
    "//testing/gtest",
    "//url",
  ]

  if (enable_configuration_policy) {
    sources += [ "sync_policy_handler_unittest.cc" ]
    deps += [
      "//components/policy",
      "//components/policy:policy_component",
    ]
  }
}
