# Copyright 2017 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.

if (is_android) {
  import("//build/config/android/rules.gni")
}

static_library("consent_auditor") {
  sources = [
    "consent_auditor.h",
    "consent_auditor_impl.cc",
    "consent_auditor_impl.h",
    "consent_sync_bridge.h",
    "consent_sync_bridge_impl.cc",
    "consent_sync_bridge_impl.h",
    "pref_names.cc",
    "pref_names.h",
  ]

  deps = [
    "//components/keyed_service/core",
    "//components/prefs",
    "//components/sync",
  ]
}

if (is_android) {
  java_cpp_enum("consent_auditor_java") {
    sources = [ "consent_auditor.h" ]
  }
}

source_set("test_support") {
  testonly = true
  sources = [
    "fake_consent_auditor.cc",
    "fake_consent_auditor.h",
  ]

  deps = [
    ":consent_auditor",
    "//components/sync",
    "//testing/gmock",
  ]
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "consent_auditor_impl_unittest.cc",
    "consent_sync_bridge_impl_unittest.cc",
  ]

  deps = [
    ":consent_auditor",
    "//base/test:test_support",
    "//components/prefs:test_support",
    "//components/sync",
    "//components/sync:test_support",
    "//components/variations:test_support",
    "//testing/gmock",
    "//testing/gtest",
  ]
}
