# 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/network_service_async_socket.cc",
    "glue/network_service_async_socket.h",
    "glue/network_service_config.cc",
    "glue/network_service_config.h",
    "glue/task_pump.cc",
    "glue/task_pump.h",
    "glue/thread_wrapper.cc",
    "glue/thread_wrapper.h",
    "glue/utils.cc",
    "glue/utils.h",
  ]
  public_deps = [
    "//third_party/webrtc_overrides",
  ]
  deps = [
    ":jingle_fake_socket",
    "//base",
    "//base/third_party/dynamic_annotations",
    "//net",
    "//services/network/public/mojom",
    "//third_party/libjingle_xmpp:rtc_task_runner",
  ]

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

  if (is_nacl) {
    sources -= [
      "glue/network_service_async_socket.cc",
      "glue/network_service_config.cc",
    ]
    deps -= [ "//services/network/public/mojom" ]
  }
}

# These files are separated into their own target to avoid a circular dependency
# since services/network depends on this.
static_library("jingle_fake_socket") {
  sources = [
    "glue/fake_ssl_client_socket.cc",
    "glue/fake_ssl_client_socket.h",
  ]
  deps = [
    "//base",
    "//net",
  ]
}

# 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",
    "//third_party/libjingle_xmpp:rtc_task_runner",
    "//url",
  ]
}

static_library("notifier_test_util") {
  testonly = true
  sources = [
    "glue/network_service_config_test_util.cc",
    "glue/network_service_config_test_util.h",
    "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",
    "//services/network:network_service",
    "//services/network/public/mojom",
    "//testing/gmock",
  ]
}

test("jingle_unittests") {
  sources = [
    "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/network_service_async_socket_unittest.cc",
    "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",
    "run_all_unittests.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/network_service_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:test_support",
    "//mojo/core/embedder",
    "//mojo/public/cpp/bindings",
    "//mojo/public/cpp/system",
    "//net",
    "//net:test_support",
    "//services/network:network_service",
    "//services/network:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/libjingle_xmpp:rtc_task_runner",
  ]
}
