# 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",
  ]
  deps = [
    "//base",
    "//net",
    "//third_party/webrtc_overrides:webrtc_component",
  ]
}

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