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

if (enable_webrtc || !is_android) {
  jingle_includes = exec_script("//build/gypi_to_gn.py",
                                [ rebase_path("jingle.gypi") ],
                                "scope",
                                [ "jingle.gypi" ])

  # GYP version: jingle/jingle.gyp:jingle_glue
  static_library("jingle_glue") {
    sources = jingle_includes.jingle_glue_sources
    public_deps = [
      "//third_party/libjingle",
    ]
    deps = [
      "//base",
      "//base/third_party/dynamic_annotations",
      "//net",
    ]
  }

  # A library for sending and receiving peer-issued notifications.
  # GYP version: jingle/jingle.gyp:notifier
  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.h",
      "notifier/base/notification_method.cc",
      "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_observer.cc",
      "notifier/listener/push_client_observer.h",
      "notifier/listener/push_client.cc",
      "notifier/listener/push_client.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",
    ]
    deps = [
      "//base",
      "//net",
      "//third_party/expat",
      "//url",
      ":jingle_glue",
    ]
  }

  # GYP version: jingle/jingle.gyp:notifier_test_util
  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",
    ]
    deps = [
      ":notifier",
      "//base",
      "//testing/gmock",
    ]
  }

  # GYP version: jingle/jingle.gyp:jingle_unittests
  # TODO(GYP): Convert to executable when its dependencies are linkable.
  source_set("jingle_unittests") {
    testonly = true
    sources = [
      "glue/channel_socket_adapter_unittest.cc",
      "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/proxy_resolving_client_socket_unittest.cc",
      "glue/pseudotcp_adapter_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",
    ]

    if (is_android) {
      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",
      ]
    }

    public_deps = [
      "//third_party/libjingle",
    ]
    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",
    ]
  }
} else {
  # !enable_webrtc and is_android
  # Stub targets as Android doesn't use libjingle when webrtc is disabled.
  source_set("jingle_glue") { }

  source_set("jingle_glue_test_util") { }

  # GYP version: jingle/jingle.gyp:notifier
  static_library("notifier") {
    sources = [
      "notifier/base/gaia_constants.cc",
      "notifier/base/gaia_constants.h",
      "notifier/base/notification_method.h",
      "notifier/base/notification_method.cc",
      "notifier/base/notifier_options.cc",
      "notifier/base/notifier_options.h",
    ]
    deps = [
      "//base",
      "//net"
    ]
  }

  source_set("notifier_test_util") { }
}
