# 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("//testing/test.gni")

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",
    ]
  }

  if (is_android) {
    # LibjingleLogTest don't pass on Android (crbug.com/843104).
    sources -= [ "glue/logging_unittest.cc" ]
  }

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

  public_deps = [
    "//third_party/libjingle_xmpp",
    "//third_party/webrtc_overrides",
    "//third_party/webrtc_overrides:init_webrtc",
  ]
  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",
  ]
}
