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

# GYP version: components/gcm_driver.gypi:gcm_driver
static_library("gcm_driver") {
  sources = [
    "android/component_jni_registrar.cc",
    "android/component_jni_registrar.h",
    "default_gcm_app_handler.cc",
    "default_gcm_app_handler.h",
    "gcm_account_mapper.cc",
    "gcm_account_mapper.h",
    "gcm_account_tracker.cc",
    "gcm_account_tracker.h",
    "gcm_activity.cc",
    "gcm_activity.h",
    "gcm_app_handler.cc",
    "gcm_app_handler.h",
    "gcm_backoff_policy.cc",
    "gcm_backoff_policy.h",
    "gcm_channel_status_request.cc",
    "gcm_channel_status_request.h",
    "gcm_channel_status_syncer.cc",
    "gcm_channel_status_syncer.h",
    "gcm_client.cc",
    "gcm_client.h",
    "gcm_client_factory.cc",
    "gcm_client_factory.h",
    "gcm_client_impl.cc",
    "gcm_client_impl.h",
    "gcm_connection_observer.cc",
    "gcm_connection_observer.h",
    "gcm_delayed_task_controller.cc",
    "gcm_delayed_task_controller.h",
    "gcm_desktop_utils.cc",
    "gcm_desktop_utils.h",
    "gcm_driver.cc",
    "gcm_driver.h",
    "gcm_driver_android.cc",
    "gcm_driver_android.h",
    "gcm_driver_constants.cc",
    "gcm_driver_constants.h",
    "gcm_driver_desktop.cc",
    "gcm_driver_desktop.h",
    "gcm_internals_constants.cc",
    "gcm_internals_constants.h",
    "gcm_profile_service.cc",
    "gcm_profile_service.h",
    "gcm_stats_recorder_impl.cc",
    "gcm_stats_recorder_impl.h",
    "registration_info.cc",
    "registration_info.h",
    "system_encryptor.cc",
    "system_encryptor.h",
  ]

  deps = [
    "crypto",
    "//base",
    "//components/gcm_driver/common",
    "//components/os_crypt",
    "//components/sync_driver",
    "//google_apis/gcm",
    "//net",
    "//sync/protocol",
    "//url:url",
  ]

  if (is_chromeos) {
    deps += [ "//components/timers" ]
  }

  if (is_android) {
    sources -= [
      "gcm_account_mapper.cc",
      "gcm_account_mapper.h",
      "gcm_channel_status_request.cc",
      "gcm_channel_status_request.h",
      "gcm_channel_status_syncer.cc",
      "gcm_channel_status_syncer.h",
      "gcm_client_factory.cc",
      "gcm_client_factory.h",
      "gcm_client_impl.cc",
      "gcm_client_impl.h",
      "gcm_desktop_utils.cc",
      "gcm_desktop_utils.h",
      "gcm_driver_desktop.cc",
      "gcm_driver_desktop.h",
      "gcm_stats_recorder_impl.cc",
      "gcm_stats_recorder_impl.h",
    ]
    deps -= [ "//google_apis/gcm" ]
    deps += [ "android:jni_headers" ]
  }
}

# GYP version: components/gcm_driver.gypi:gcm_driver_test_support
source_set("test_support") {
  testonly = true
  sources = [
    "fake_gcm_app_handler.cc",
    "fake_gcm_app_handler.h",
    "fake_gcm_client.cc",
    "fake_gcm_client.h",
    "fake_gcm_client_factory.cc",
    "fake_gcm_client_factory.h",
    "fake_gcm_driver.cc",
    "fake_gcm_driver.h",
  ]

  public_deps = [
    ":gcm_driver",
  ]
  deps = [
    "//base",
    "//google_apis/gcm:test_support",
    "//testing/gtest",
  ]

  if (is_android) {
    sources -= [
      "fake_gcm_client.cc",
      "fake_gcm_client.h",
      "fake_gcm_client_factory.cc",
      "fake_gcm_client_factory.h",
    ]
    deps -= [ "//google_apis/gcm:test_support" ]
  }
}

source_set("unit_tests") {
  testonly = true

  sources = [
    "gcm_account_tracker_unittest.cc",
  ]

  deps = [
    ":gcm_driver",
    ":test_support",
    "//testing/gtest",
    "//third_party/protobuf:protobuf_lite",
  ]

  if (!is_android) {
    sources += [
      "gcm_account_mapper_unittest.cc",
      "gcm_channel_status_request_unittest.cc",
      "gcm_client_impl_unittest.cc",
      "gcm_delayed_task_controller_unittest.cc",
      "gcm_driver_desktop_unittest.cc",
      "gcm_stats_recorder_impl_unittest.cc",
    ]
  }
}
