# Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import("../webrtc.gni")

group("p2p") {
  public_deps = [
    ":libstunprober",
    ":rtc_p2p",
  ]
}

config("rtc_p2p_inherited_config") {
  defines = [ "FEATURE_ENABLE_VOICEMAIL" ]
}

rtc_static_library("rtc_p2p") {
  sources = [
    "base/asyncstuntcpsocket.cc",
    "base/asyncstuntcpsocket.h",
    "base/basicpacketsocketfactory.cc",
    "base/basicpacketsocketfactory.h",
    "base/candidatepairinterface.h",
    "base/common.h",
    "base/dtlstransport.cc",
    "base/dtlstransport.h",
    "base/dtlstransportinternal.cc",
    "base/dtlstransportinternal.h",
    "base/icetransportinternal.cc",
    "base/icetransportinternal.h",
    "base/jseptransport.cc",
    "base/jseptransport.h",
    "base/p2pconstants.cc",
    "base/p2pconstants.h",
    "base/p2ptransportchannel.cc",
    "base/p2ptransportchannel.h",
    "base/packetlossestimator.cc",
    "base/packetlossestimator.h",
    "base/packetsocketfactory.cc",
    "base/packetsocketfactory.h",
    "base/packettransportinterface.h",
    "base/packettransportinternal.cc",
    "base/packettransportinternal.h",
    "base/port.cc",
    "base/port.h",
    "base/portallocator.cc",
    "base/portallocator.h",
    "base/portinterface.cc",
    "base/portinterface.h",
    "base/pseudotcp.cc",
    "base/pseudotcp.h",
    "base/relayport.cc",
    "base/relayport.h",
    "base/session.cc",
    "base/session.h",
    "base/sessiondescription.cc",
    "base/sessiondescription.h",
    "base/stun.cc",
    "base/stun.h",
    "base/stunport.cc",
    "base/stunport.h",
    "base/stunrequest.cc",
    "base/stunrequest.h",
    "base/tcpport.cc",
    "base/tcpport.h",
    "base/transport.h",
    "base/transportdescription.cc",
    "base/transportdescription.h",
    "base/transportdescriptionfactory.cc",
    "base/transportdescriptionfactory.h",
    "base/transportinfo.h",
    "base/turnport.cc",
    "base/turnport.h",
    "base/udpport.h",
    "base/udptransport.cc",
    "base/udptransport.h",
    "client/basicportallocator.cc",
    "client/basicportallocator.h",
    "client/relayportfactoryinterface.h",
    "client/socketmonitor.cc",
    "client/socketmonitor.h",
    "client/turnportfactory.cc",
    "client/turnportfactory.h",
  ]

  defines = []

  deps = [
    "../api:libjingle_peerconnection_api",
    "../api:optional",
    "../api:ortc_api",
    "../rtc_base:checks",
    "../rtc_base:rtc_base",
    "../rtc_base:stringutils",
    "../system_wrappers:field_trial_api",
  ]

  public_configs = [ ":rtc_p2p_inherited_config" ]

  if (build_with_chromium) {
    if (is_nacl) {
      deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
    }
  } else {
    sources += [
      "base/relayserver.cc",
      "base/relayserver.h",
      "base/stunserver.cc",
      "base/stunserver.h",
      "base/turnserver.cc",
      "base/turnserver.h",
    ]
    defines += [
      "FEATURE_ENABLE_VOICEMAIL",
      "FEATURE_ENABLE_PSTN",
    ]
  }
}

if (rtc_include_tests) {
  rtc_source_set("p2p_test_utils") {
    testonly = true
    sources = [
      "base/fakecandidatepair.h",
      "base/fakedtlstransport.h",
      "base/fakeicetransport.h",
      "base/fakepackettransport.h",
      "base/fakeportallocator.h",
      "base/mockicetransport.h",
      "base/testrelayserver.h",
      "base/teststunserver.cc",
      "base/teststunserver.h",
      "base/testturncustomizer.h",
      "base/testturnserver.h",
    ]
    deps = [
      ":rtc_p2p",
      "../api:libjingle_peerconnection_api",
      "../api:ortc_api",
      "../rtc_base:rtc_base",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:rtc_base_tests_utils",
      "../test:test_support",
      "//testing/gmock",
    ]
  }

  rtc_source_set("rtc_p2p_unittests") {
    testonly = true

    sources = [
      "base/asyncstuntcpsocket_unittest.cc",
      "base/dtlstransport_unittest.cc",
      "base/jseptransport_unittest.cc",
      "base/p2ptransportchannel_unittest.cc",
      "base/packetlossestimator_unittest.cc",
      "base/port_unittest.cc",
      "base/portallocator_unittest.cc",
      "base/pseudotcp_unittest.cc",
      "base/relayport_unittest.cc",
      "base/relayserver_unittest.cc",
      "base/stun_unittest.cc",
      "base/stunport_unittest.cc",
      "base/stunrequest_unittest.cc",
      "base/stunserver_unittest.cc",
      "base/tcpport_unittest.cc",
      "base/transportdescriptionfactory_unittest.cc",
      "base/turnport_unittest.cc",
      "base/turnserver_unittest.cc",
      "base/udptransport_unittest.cc",
      "client/basicportallocator_unittest.cc",
    ]
    deps = [
      ":p2p_test_utils",
      ":rtc_p2p",
      "../api:fakemetricsobserver",
      "../api:ortc_api",
      "../rtc_base:checks",
      "../rtc_base:rtc_base",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:rtc_base_tests_utils",
      "../rtc_base:stringutils",
      "../test:test_support",
      "//testing/gmock",
      "//testing/gtest",
    ]
    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
    defines = [ "GTEST_RELATIVE_PATH" ]
  }
}

rtc_static_library("libstunprober") {
  sources = [
    "stunprober/stunprober.cc",
    "stunprober/stunprober.h",
  ]

  deps = [
    ":rtc_p2p",
    "..:webrtc_common",
    "../:typedefs",
    "../rtc_base:checks",
    "../rtc_base:rtc_base",
  ]
}

if (rtc_include_tests) {
  rtc_source_set("libstunprober_unittests") {
    testonly = true

    sources = [
      "stunprober/stunprober_unittest.cc",
    ]
    deps = [
      ":libstunprober",
      ":p2p_test_utils",
      ":rtc_p2p",
      "../rtc_base:checks",
      "../rtc_base:rtc_base",
      "../rtc_base:rtc_base_tests_utils",
      "//testing/gmock",
      "//testing/gtest",
    ]
    defines = [ "GTEST_RELATIVE_PATH" ]
  }
}
