# 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")

source_set("webrtc_glue") {
  sources = [
    "glue/thread_wrapper.cc",
    "glue/thread_wrapper.h",
    "glue/utils.cc",
    "glue/utils.h",
  ]
  public_deps = [
    "//third_party/webrtc/rtc_base",
  ]
  deps = [
    "//base",
    "//net",
    "//third_party/webrtc/api:libjingle_peerconnection_api",
  ]
}

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",
  ]
  public_deps = [
    "//services/network/public/mojom",
  ]
  deps = [
    "//base",
    "//net",
    "//third_party/libjingle_xmpp:rtc_task_runner",
  ]

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

# These files are separated into their own target to avoid a circular dependency
# since services/network depends on this.
source_set("fake_ssl_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" ]

  deps = [
    ":fake_ssl_socket",
    ":jingle_glue",
    ":notifier",
    ":notifier_test_util",
    ":webrtc_glue",
    "//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",
    "//third_party/webrtc_overrides",
    "//third_party/webrtc_overrides:init_webrtc",
  ]
}
