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