# 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/config/features.gni")
import("//media/media_options.gni")
import("//testing/test.gni")

if (enable_webrtc || !is_android) {
  static_library("jingle_glue") {
    sources = [
      "glue/chrome_async_socket.cc",
      "glue/chrome_async_socket.h",
      "glue/fake_ssl_client_socket.cc",
      "glue/fake_ssl_client_socket.h",
      "glue/resolving_client_socket_factory.h",
      "glue/task_pump.cc",
      "glue/task_pump.h",
      "glue/thread_wrapper.cc",
      "glue/thread_wrapper.h",
      "glue/utils.cc",
      "glue/utils.h",
      "glue/xmpp_client_socket_factory.cc",
      "glue/xmpp_client_socket_factory.h",
    ]
    public_deps = [
      "//third_party/webrtc_overrides",
    ]
    deps = [
      "//base",
      "//base/third_party/dynamic_annotations",
      "//net",
      "//services/network:network_service",
    ]

    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

    if (is_nacl) {
      sources -= [
        "glue/chrome_async_socket.cc",
        "glue/xmpp_client_socket_factory.cc",
      ]
      deps -= [ "//services/network:network_service" ]
    }
  }

  # A library for sending and receiving peer-issued notifications.
  static_library("notifier") {
    sources = [
      "notifier/base/const_communicator.h",
      "notifier/base/gaia_constants.cc",
      "notifier/base/gaia_constants.h",
      "notifier/base/gaia_token_pre_xmpp_auth.cc",
      "notifier/base/gaia_token_pre_xmpp_auth.h",
      "notifier/base/notification_method.cc",
      "notifier/base/notification_method.h",
      "notifier/base/notifier_options.cc",
      "notifier/base/notifier_options.h",
      "notifier/base/notifier_options_util.cc",
      "notifier/base/notifier_options_util.h",
      "notifier/base/server_information.cc",
      "notifier/base/server_information.h",
      "notifier/base/weak_xmpp_client.cc",
      "notifier/base/weak_xmpp_client.h",
      "notifier/base/xmpp_connection.cc",
      "notifier/base/xmpp_connection.h",
      "notifier/communicator/connection_settings.cc",
      "notifier/communicator/connection_settings.h",
      "notifier/communicator/login.cc",
      "notifier/communicator/login.h",
      "notifier/communicator/login_settings.cc",
      "notifier/communicator/login_settings.h",
      "notifier/communicator/single_login_attempt.cc",
      "notifier/communicator/single_login_attempt.h",
      "notifier/listener/non_blocking_push_client.cc",
      "notifier/listener/non_blocking_push_client.h",
      "notifier/listener/notification_constants.cc",
      "notifier/listener/notification_constants.h",
      "notifier/listener/notification_defines.cc",
      "notifier/listener/notification_defines.h",
      "notifier/listener/push_client.cc",
      "notifier/listener/push_client.h",
      "notifier/listener/push_client_observer.cc",
      "notifier/listener/push_client_observer.h",
      "notifier/listener/push_notifications_listen_task.cc",
      "notifier/listener/push_notifications_listen_task.h",
      "notifier/listener/push_notifications_send_update_task.cc",
      "notifier/listener/push_notifications_send_update_task.h",
      "notifier/listener/push_notifications_subscribe_task.cc",
      "notifier/listener/push_notifications_subscribe_task.h",
      "notifier/listener/send_ping_task.cc",
      "notifier/listener/send_ping_task.h",
      "notifier/listener/xml_element_util.cc",
      "notifier/listener/xml_element_util.h",
      "notifier/listener/xmpp_push_client.cc",
      "notifier/listener/xmpp_push_client.h",
    ]
    defines = [ "_CRT_SECURE_NO_WARNINGS" ]

    public_deps = [
      "//third_party/libjingle_xmpp",
      "//third_party/webrtc_overrides",
    ]
    deps = [
      ":jingle_glue",
      "//base",
      "//net",
      "//third_party/expat",
      "//url",
    ]
  }

  static_library("notifier_test_util") {
    testonly = true
    sources = [
      "notifier/base/fake_base_task.cc",
      "notifier/base/fake_base_task.h",
      "notifier/listener/fake_push_client.cc",
      "notifier/listener/fake_push_client.h",
      "notifier/listener/fake_push_client_observer.cc",
      "notifier/listener/fake_push_client_observer.h",
    ]
    public_deps = [
      ":jingle_glue",
      ":notifier",
    ]
    deps = [
      "//base",
      "//testing/gmock",
    ]
  }

  test("jingle_unittests") {
    sources = [
      "glue/chrome_async_socket_unittest.cc",
      "glue/fake_ssl_client_socket_unittest.cc",
      "glue/jingle_glue_mock_objects.cc",
      "glue/jingle_glue_mock_objects.h",
      "glue/logging_unittest.cc",
      "glue/mock_task.cc",
      "glue/mock_task.h",
      "glue/task_pump_unittest.cc",
      "glue/thread_wrapper_unittest.cc",
      "notifier/base/weak_xmpp_client_unittest.cc",
      "notifier/base/xmpp_connection_unittest.cc",
      "notifier/communicator/connection_settings_unittest.cc",
      "notifier/communicator/login_settings_unittest.cc",
      "notifier/communicator/single_login_attempt_unittest.cc",
      "notifier/listener/non_blocking_push_client_unittest.cc",
      "notifier/listener/notification_defines_unittest.cc",
      "notifier/listener/push_client_unittest.cc",
      "notifier/listener/push_notifications_send_update_task_unittest.cc",
      "notifier/listener/push_notifications_subscribe_task_unittest.cc",
      "notifier/listener/send_ping_task_unittest.cc",
      "notifier/listener/xml_element_util_unittest.cc",
      "notifier/listener/xmpp_push_client_unittest.cc",
    ]

    if (is_android || is_ios) {
      sources -= [
        # TODO(jrg):
        # EXPECT_DEBUG_DEATH() uses features not enabled.
        # Should we -std=c++0x or -std=gnu++0x?
        "glue/chrome_async_socket_unittest.cc",
        "notifier/base/xmpp_connection_unittest.cc",
      ]
    }

    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

    public_deps = [
      "//third_party/libjingle_xmpp",
      "//third_party/webrtc_overrides",
    ]
    deps = [
      ":jingle_glue",
      ":notifier",
      ":notifier_test_util",
      "//base",
      "//base/test:run_all_unittests",
      "//base/test:test_support",
      "//net",
      "//net:test_support",
      "//testing/gmock",
      "//testing/gtest",
    ]
  }
} else {
  # !enable_webrtc and is_android
  # Stub targets as Android doesn't use libjingle when webrtc is disabled.
  source_set("jingle_glue") {
  }

  source_set("jingle_glue_test_util") {
  }

  static_library("notifier") {
    sources = [
      "notifier/base/gaia_constants.cc",
      "notifier/base/gaia_constants.h",
      "notifier/base/notification_method.cc",
      "notifier/base/notification_method.h",
      "notifier/base/notifier_options.cc",
      "notifier/base/notifier_options.h",
    ]
    deps = [
      "//base",
      "//net",
    ]
  }

  source_set("notifier_test_util") {
  }
}
