# 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("//components/gcm_driver/config.gni")

static_library("instance_id") {
  sources = [
    "instance_id.cc",
    "instance_id.h",
    "instance_id_driver.cc",
    "instance_id_driver.h",
    "instance_id_impl.cc",
    "instance_id_impl.h",
    "instance_id_profile_service.cc",
    "instance_id_profile_service.h",
  ]

  deps = [
    "//base",
    "//components/gcm_driver:gcm_buildflags",
    "//components/keyed_service/core:core",
    "//components/prefs:prefs",
    "//crypto",
    "//services/network/public/mojom",
  ]

  if (use_gcm_from_platform) {
    sources -= [
      "instance_id_impl.cc",
      "instance_id_impl.h",
    ]
    sources += [
      "instance_id_android.cc",
      "instance_id_android.h",
    ]
    deps += [ "android:jni_headers" ]
  }
}

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

  public_deps = [
    ":instance_id",
  ]
  deps = [
    "//base",
    "//components/gcm_driver",
    "//testing/gtest",
  ]

  if (is_android) {
    deps += [ "android:test_support_jni_headers" ]
  }
}

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

  deps = [
    ":instance_id",
    ":test_support",
    "//base",
    "//components/gcm_driver:gcm_buildflags",
    "//google_apis/gcm",
    "//net:test_support",
    "//testing/gtest",
  ]
}
