# Copyright 2015 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.

static_library("signaling") {
  sources = [
    "delegating_signal_strategy.cc",
    "delegating_signal_strategy.h",
    "iq_sender.cc",
    "iq_sender.h",
    "jid_util.cc",
    "jid_util.h",
    "log_to_server.cc",
    "log_to_server.h",
    "push_notification_subscriber.cc",
    "push_notification_subscriber.h",
    "server_log_entry.cc",
    "server_log_entry.h",
    "signal_strategy.h",
    "signaling_address.cc",
    "signaling_address.h",
    "xmpp_login_handler.cc",
    "xmpp_login_handler.h",
    "xmpp_signal_strategy.cc",
    "xmpp_signal_strategy.h",
    "xmpp_stream_parser.cc",
    "xmpp_stream_parser.h",
  ]

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

  public_deps = [
    "//remoting/proto",
    "//third_party/libjingle_xmpp",
    "//third_party/webrtc_overrides",
  ]

  deps = [
    "//base",
    "//crypto",
    "//jingle:jingle_glue",
    "//net",
    "//remoting/base",
  ]

  if (is_nacl) {
    sources -= [
      "log_to_server.cc",
      "server_log_entry.cc",
      "xmpp_signal_strategy.cc",
    ]
  }
}

static_library("test_support") {
  testonly = true

  sources = [
    "fake_signal_strategy.cc",
    "fake_signal_strategy.h",
    "mock_signal_strategy.cc",
    "mock_signal_strategy.h",
  ]

  public_deps = [
    ":signaling",
    "//testing/gmock",
  ]
}

source_set("unit_tests") {
  testonly = true

  sources = [
    "iq_sender_unittest.cc",
    "jid_util_unittest.cc",
    "log_to_server_unittest.cc",
    "push_notification_subscriber_unittest.cc",
    "server_log_entry_unittest.cc",
    "server_log_entry_unittest.h",
    "signaling_address_unittest.cc",
    "xmpp_login_handler_unittest.cc",
    "xmpp_signal_strategy_unittest.cc",
    "xmpp_stream_parser_unittest.cc",
  ]

  deps = [
    ":test_support",
    "//net:test_support",
    "//testing/gmock",
    "//testing/gtest",
  ]
}
