# 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/candidate.h",
    "base/candidatepairinterface.h",
    "base/common.h",
    "base/dtlstransport.cc",
    "base/dtlstransport.h",
    "base/dtlstransportinternal.h",
    "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.h",
    "base/packettransportinterface.h",
    "base/packettransportinternal.h",
    "base/port.cc",
    "base/port.h",
    "base/portallocator.cc",
    "base/portallocator.h",
    "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/socketmonitor.cc",
    "client/socketmonitor.h",
  ]

  defines = []

  deps = [
    "../api:libjingle_peerconnection_api",
    "../api:optional",
    "../api:ortc_api",
    "../rtc_base:rtc_base",
    "../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 (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
  }
}

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: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

    # Skip restricting visibility on mobile platforms since the tests on those
    # gets additional generated targets which would require many lines here to
    # cover (which would be confusing to read and hard to maintain).
    if (!is_android && !is_ios) {
      visibility = [ "..:rtc_unittests" ]
    }
    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:rtc_base",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:rtc_base_tests_utils",
      "../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",
    "../rtc_base:rtc_base",
  ]
}

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

    # Skip restricting visibility on mobile platforms since the tests on those
    # gets additional generated targets which would require many lines here to
    # cover (which would be confusing to read and hard to maintain).
    if (!is_android && !is_ios) {
      visibility = [ "..:rtc_unittests" ]
    }
    sources = [
      "stunprober/stunprober_unittest.cc",
    ]
    deps = [
      ":libstunprober",
      ":p2p_test_utils",
      ":rtc_p2p",
      "../rtc_base:rtc_base",
      "../rtc_base:rtc_base_tests_utils",
      "//testing/gmock",
      "//testing/gtest",
    ]
    defines = [ "GTEST_RELATIVE_PATH" ]
  }
}
