# Copyright 2015 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/features.gni")

static_library("sync_preferences") {
  sources = [
    "pref_model_associator.cc",
    "pref_model_associator.h",
    "pref_model_associator_client.h",
    "pref_service_syncable.cc",
    "pref_service_syncable.h",
    "pref_service_syncable_factory.cc",
    "pref_service_syncable_factory.h",
    "pref_service_syncable_observer.h",
    "synced_pref_observer.h",
  ]

  deps = [
    "//base",
    "//components/pref_registry",
    "//components/prefs",
    "//components/sync",
  ]

  if (is_chromeos) {
    deps += [ "//chromeos/constants" ]
  }

  if (!is_ios) {
    deps += [ "//components/policy/core/browser" ]
  }
}

static_library("test_support") {
  testonly = true
  sources = [
    "pref_service_mock_factory.cc",
    "pref_service_mock_factory.h",
    "testing_pref_service_syncable.cc",
    "testing_pref_service_syncable.h",
  ]

  deps = [
    ":sync_preferences",
    "//base",
    "//components/pref_registry",
    "//components/prefs:test_support",
    "//testing/gtest",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "pref_model_associator_unittest.cc",
    "pref_service_syncable_unittest.cc",
  ]

  deps = [
    ":sync_preferences",
    ":test_support",
    "//base/test:test_support",
    "//components/pref_registry",
    "//components/prefs",
    "//components/prefs:test_support",
    "//components/sync",
    "//components/sync:test_support_model",
    "//testing/gtest",
  ]

  if (is_chromeos) {
    deps += [ "//chromeos/constants" ]
  }
}
