# Copyright (c) 2014 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.

# TODO(kjellander): Rebase this to webrtc/build/common.gypi changes after r6330.

import("//build/config/linux/pkg_config.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("build/webrtc.gni")
import("//testing/test.gni")
import("//third_party/protobuf/proto_library.gni")

# Contains the defines and includes in common.gypi that are duplicated both as
# target_defaults and direct_dependent_settings.
config("common_inherited_config") {
  defines = []
  cflags = []
  ldflags = []
  if (build_with_mozilla) {
    defines += [ "WEBRTC_MOZILLA_BUILD" ]
  }
  if (build_with_chromium) {
    defines = [
      # TODO(kjellander): Cleanup unused ones and move defines closer to
      # the source when webrtc:4256 is completed.
      "FEATURE_ENABLE_SSL",
      "FEATURE_ENABLE_VOICEMAIL",
      "EXPAT_RELATIVE_PATH",
      "GTEST_RELATIVE_PATH",
      "NO_MAIN_THREAD_WRAPPING",
      "NO_SOUND_SYSTEM",
      "WEBRTC_CHROMIUM_BUILD",
    ]
    include_dirs = [
      # The overrides must be included first as that is the mechanism for
      # selecting the override headers in Chromium.
      "../webrtc_overrides",

      # Allow includes to be prefixed with webrtc/ in case it is not an
      # immediate subdirectory of the top-level.
      "..",
    ]
  }
  if (is_posix) {
    defines += [ "WEBRTC_POSIX" ]
  }
  if (is_ios) {
    defines += [
      "WEBRTC_MAC",
      "WEBRTC_IOS",
    ]
  }
  if (is_ios && rtc_use_objc_h264) {
    defines += [ "WEBRTC_OBJC_H264" ]
  }
  if (is_linux) {
    defines += [ "WEBRTC_LINUX" ]
  }
  if (is_mac) {
    defines += [ "WEBRTC_MAC" ]
  }
  if (is_win) {
    defines += [
      "WEBRTC_WIN",
      "_CRT_SECURE_NO_WARNINGS",  # Suppress warnings about _vsnprinf
    ]
  }
  if (is_android) {
    defines += [
      "WEBRTC_LINUX",
      "WEBRTC_ANDROID",
    ]
  }
  if (is_chromeos) {
    defines += [ "CHROMEOS" ]
  }

  if (rtc_sanitize_coverage != "") {
    assert(is_clang, "sanitizer coverage requires clang")
    cflags += [ "-fsanitize-coverage=${rtc_sanitize_coverage}" ]
    ldflags += [ "-fsanitize-coverage=${rtc_sanitize_coverage}" ]
  }

  # TODO(GYP): Support these in GN.
  # if (is_bsd) {
  #   defines += [ "BSD" ]
  # }
  # if (is_openbsd) {
  #   defines += [ "OPENBSD" ]
  # }
  # if (is_freebsd) {
  #   defines += [ "FREEBSD" ]
  # }
}

if (rtc_have_dbus_glib) {
  pkg_config("dbus-glib") {
    packages = [ "dbus-glib-1" ]
  }
}

config("common_config") {
  cflags = []
  cflags_cc = []
  defines = []

  if (rtc_restrict_logging) {
    defines += [ "WEBRTC_RESTRICT_LOGGING" ]
  }

  if (rtc_include_internal_audio_device) {
    defines += [ "WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE" ]
  }

  if (rtc_have_dbus_glib) {
    defines += [ "HAVE_DBUS_GLIB" ]

    # TODO(kjellander): Investigate this, it seems like include <dbus/dbus.h>
    # is still not found even if the execution of
    # build/config/linux/pkg-config.py dbus-glib-1 returns correct include
    # dirs on Linux.
    all_dependent_configs = [ "dbus-glib" ]
  }

  if (rtc_relative_path) {
    defines += [ "EXPAT_RELATIVE_PATH" ]
  }

  if (build_with_chromium) {
    defines += [
      # NOTICE: Since common_inherited_config is used in public_configs for our
      # targets, there's no point including the defines in that config here.
      # TODO(kjellander): Cleanup unused ones and move defines closer to the
      # source when webrtc:4256 is completed.
      "ENABLE_EXTERNAL_AUTH",
      "HAVE_OPENSSL_SSL_H",
      "HAVE_SCTP",
      "HAVE_SRTP",
      "HAVE_WEBRTC_VIDEO",
      "HAVE_WEBRTC_VOICE",
      "LOGGING_INSIDE_WEBRTC",
      "SRTP_RELATIVE_PATH",
      "SSL_USE_OPENSSL",
      "USE_WEBRTC_DEV_BRANCH",
    ]
  } else {
    if (is_posix) {
      # -Wextra is currently disabled in Chromium"s common.gypi. Enable
      # for targets that can handle it. For Android/arm64 right now
      # there will be an "enumeral and non-enumeral type in conditional
      # expression" warning in android_tools/ndk_experimental"s version
      # of stlport.
      # See: https://code.google.com/p/chromium/issues/detail?id=379699
      if (current_cpu != "arm64" || !is_android) {
        cflags = [
          "-Wextra",

          # We need to repeat some flags from Chromium"s common.gypi
          # here that get overridden by -Wextra.
          "-Wno-unused-parameter",
          "-Wno-missing-field-initializers",
          "-Wno-strict-overflow",
        ]
        cflags_cc = [
          "-Wnon-virtual-dtor",

          # This is enabled for clang; enable for gcc as well.
          "-Woverloaded-virtual",
        ]
      }
    }

    if (is_clang) {
      cflags += [
        "-Wimplicit-fallthrough",
        "-Wthread-safety",
        "-Winconsistent-missing-override",
      ]
    }
  }

  if (current_cpu == "arm64") {
    defines += [ "WEBRTC_ARCH_ARM64" ]
    defines += [ "WEBRTC_HAS_NEON" ]
  }

  if (current_cpu == "arm") {
    defines += [ "WEBRTC_ARCH_ARM" ]
    if (arm_version >= 7) {
      defines += [ "WEBRTC_ARCH_ARM_V7" ]
      if (arm_use_neon) {
        defines += [ "WEBRTC_HAS_NEON" ]
      }
    }
  }

  if (current_cpu == "mipsel") {
    defines += [ "MIPS32_LE" ]
    if (mips_float_abi == "hard") {
      defines += [ "MIPS_FPU_LE" ]
    }
    if (mips_arch_variant == "r2") {
      defines += [ "MIPS32_R2_LE" ]
    }
    if (mips_dsp_rev == 1) {
      defines += [ "MIPS_DSP_R1_LE" ]
    } else if (mips_dsp_rev == 2) {
      defines += [
        "MIPS_DSP_R1_LE",
        "MIPS_DSP_R2_LE",
      ]
    }
  }

  if (is_android && !is_clang) {
    # The Android NDK doesn"t provide optimized versions of these
    # functions. Ensure they are disabled for all compilers.
    cflags += [
      "-fno-builtin-cos",
      "-fno-builtin-sin",
      "-fno-builtin-cosf",
      "-fno-builtin-sinf",
    ]
  }

  if (use_libfuzzer || use_drfuzz || use_afl) {
    # Used in Chromium's overrides to disable logging
    defines += [ "WEBRTC_UNSAFE_FUZZER_MODE" ]
  }
}

config("common_objc") {
  libs = [ "Foundation.framework" ]
  precompiled_header = "sdk/objc/WebRTC-Prefix.pch"
  precompiled_source = "sdk/objc/WebRTC-Prefix.pch"
}

if (!is_ios || !build_with_chromium) {
  source_set("webrtc") {
    sources = [
      "call.h",
      "config.h",
      "transport.h",
    ]

    defines = []
    configs += [ ":common_config" ]
    public_configs = [ ":common_inherited_config" ]

    deps = [
      ":webrtc_common",
      "audio",
      "base:rtc_base",
      "call",
      "common_audio",
      "common_video",
      "modules",
      "stats",
      "system_wrappers",
      "tools",
      "video",
      "voice_engine",
    ]

    if (build_with_chromium) {
      deps += [ "modules/video_capture" ]
    } else {
      # TODO(kjellander): Enable for Chromium as well when bugs.webrtc.org/4256
      # is fixed. Right now it's not possible due to circular dependencies.
      deps += [
        "api",
        "media",
        "p2p",
        "pc",
      ]
    }

    if (rtc_enable_protobuf) {
      defines += [ "ENABLE_RTC_EVENT_LOG" ]
      deps += [ ":rtc_event_log_proto" ]
    }
  }
}

if (!build_with_chromium) {
  executable("webrtc_tests") {
    testonly = true
    deps = [
      ":webrtc",
      "modules/video_capture:video_capture_internal_impl",
      "test",
      "//build/config/sanitizers:deps",
    ]
  }

  executable("video_loopback") {
    testonly = true
    sources = [
      "test/run_test.h",
      "video/video_loopback.cc",
    ]

    if (is_mac) {
      sources += [ "test/mac/run_test.mm" ]
    } else {
      sources += [ "test/run_test.cc" ]
    }
    deps = [
      ":video_quality_test",
      "system_wrappers:metrics_default",
      "test:field_trial",
      "test:test_common",
      "test:test_renderer",
      "//build/config/sanitizers:deps",
      "//testing/gmock",
      "//testing/gtest",
      "//third_party/gflags",
    ]
    if (is_clang && !is_nacl) {
      # Suppress warnings from Chrome's Clang plugins.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }
}

source_set("webrtc_common") {
  sources = [
    "audio_sink.h",
    "common_types.cc",
    "common_types.h",
    "config.cc",
    "config.h",
    "engine_configurations.h",
    "typedefs.h",
  ]

  configs += [ ":common_config" ]
  public_configs = [ ":common_inherited_config" ]

  if (is_clang && !is_nacl) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }
}

if (rtc_enable_protobuf) {
  proto_library("rtc_event_log_proto") {
    sources = [
      "call/rtc_event_log.proto",
    ]
    proto_out_dir = "webrtc/call"
  }
}

source_set("rtc_event_log") {
  sources = [
    "call/rtc_event_log.cc",
    "call/rtc_event_log.h",
    "call/rtc_event_log_helper_thread.cc",
    "call/rtc_event_log_helper_thread.h",
  ]

  defines = []
  configs += [ ":common_config" ]
  public_configs = [ ":common_inherited_config" ]

  deps = [
    ":webrtc_common",
    "modules/rtp_rtcp",
  ]

  if (rtc_enable_protobuf) {
    defines += [ "ENABLE_RTC_EVENT_LOG" ]
    deps += [ ":rtc_event_log_proto" ]
  }
  if (is_clang && !is_nacl) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }
}

if (rtc_enable_protobuf) {
  source_set("rtc_event_log_parser") {
    sources = [
      "call/rtc_event_log_parser.cc",
      "call/rtc_event_log_parser.h",
    ]

    configs += [ ":common_config" ]
    public_configs = [ ":common_inherited_config" ]

    public_deps = [
      ":rtc_event_log_proto",
      ":webrtc_common",
    ]

    if (is_clang && !is_nacl) {
      # Suppress warnings from Chrome's Clang plugins.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }
}

if (use_libfuzzer || use_drfuzz || use_afl) {
  # This target is only here for gn to discover fuzzer build targets under
  # webrtc/test/fuzzers/.
  group("webrtc_fuzzers_dummy") {
    testonly = true
    deps = [
      "test/fuzzers:webrtc_fuzzer_main",
    ]
  }
}

if (rtc_include_tests) {
  config("rtc_unittests_config") {
    # GN orders flags on a target before flags from configs. The default config
    # adds -Wall, and this flag have to be after -Wall -- so they need to
    # come from a config and can"t be on the target directly.
    if (is_clang) {
      cflags = [
        "-Wno-missing-braces",
        "-Wno-sign-compare",
        "-Wno-unused-const-variable",
      ]
    }
  }

  test("rtc_unittests") {
    testonly = true
    sources = [
      "base/array_view_unittest.cc",
      "base/atomicops_unittest.cc",
      "base/autodetectproxy_unittest.cc",
      "base/bandwidthsmoother_unittest.cc",
      "base/base64_unittest.cc",
      "base/basictypes_unittest.cc",
      "base/bind_unittest.cc",
      "base/bitbuffer_unittest.cc",
      "base/buffer_unittest.cc",
      "base/bufferqueue_unittest.cc",
      "base/bytebuffer_unittest.cc",
      "base/byteorder_unittest.cc",
      "base/callback_unittest.cc",
      "base/copyonwritebuffer_unittest.cc",
      "base/crc32_unittest.cc",
      "base/criticalsection_unittest.cc",
      "base/event_tracer_unittest.cc",
      "base/event_unittest.cc",
      "base/exp_filter_unittest.cc",
      "base/filerotatingstream_unittest.cc",
      "base/fileutils_unittest.cc",
      "base/helpers_unittest.cc",
      "base/httpbase_unittest.cc",
      "base/httpcommon_unittest.cc",
      "base/httpserver_unittest.cc",
      "base/ipaddress_unittest.cc",
      "base/logging_unittest.cc",
      "base/md5digest_unittest.cc",
      "base/messagedigest_unittest.cc",
      "base/messagequeue_unittest.cc",
      "base/mod_ops_unittest.cc",
      "base/multipart_unittest.cc",
      "base/nat_unittest.cc",
      "base/network_unittest.cc",
      "base/onetimeevent_unittest.cc",
      "base/optional_unittest.cc",
      "base/optionsfile_unittest.cc",
      "base/pathutils_unittest.cc",
      "base/platform_thread_unittest.cc",
      "base/profiler_unittest.cc",
      "base/proxy_unittest.cc",
      "base/proxydetect_unittest.cc",
      "base/random_unittest.cc",
      "base/rate_limiter_unittest.cc",
      "base/rate_statistics_unittest.cc",
      "base/ratelimiter_unittest.cc",
      "base/ratetracker_unittest.cc",
      "base/referencecountedsingletonfactory_unittest.cc",
      "base/rollingaccumulator_unittest.cc",
      "base/rtccertificate_unittest.cc",
      "base/rtccertificategenerator_unittest.cc",
      "base/scopedptrcollection_unittest.cc",
      "base/sequenced_task_checker_unittest.cc",
      "base/sha1digest_unittest.cc",
      "base/sharedexclusivelock_unittest.cc",
      "base/signalthread_unittest.cc",
      "base/sigslot_unittest.cc",
      "base/sigslottester.h",
      "base/sigslottester.h.pump",
      "base/stream_unittest.cc",
      "base/stringencode_unittest.cc",
      "base/stringutils_unittest.cc",
      "base/swap_queue_unittest.cc",

      # TODO(ronghuawu): Reenable this test.
      # "systeminfo_unittest.cc",
      "base/task_queue_unittest.cc",
      "base/task_unittest.cc",
      "base/testclient_unittest.cc",
      "base/thread_checker_unittest.cc",
      "base/thread_unittest.cc",
      "base/timestampaligner_unittest.cc",
      "base/timeutils_unittest.cc",
      "base/urlencode_unittest.cc",
      "base/versionparsing_unittest.cc",

      # TODO(ronghuawu): Reenable this test.
      # "windowpicker_unittest.cc",
      "p2p/base/dtlstransportchannel_unittest.cc",
      "p2p/base/fakeportallocator.h",
      "p2p/base/faketransportcontroller.h",
      "p2p/base/p2ptransportchannel_unittest.cc",
      "p2p/base/port_unittest.cc",
      "p2p/base/portallocator_unittest.cc",
      "p2p/base/pseudotcp_unittest.cc",
      "p2p/base/relayport_unittest.cc",
      "p2p/base/relayserver_unittest.cc",
      "p2p/base/stun_unittest.cc",
      "p2p/base/stunport_unittest.cc",
      "p2p/base/stunrequest_unittest.cc",
      "p2p/base/stunserver_unittest.cc",
      "p2p/base/tcpport_unittest.cc",
      "p2p/base/testrelayserver.h",
      "p2p/base/teststunserver.h",
      "p2p/base/testturnserver.h",
      "p2p/base/transport_unittest.cc",
      "p2p/base/transportcontroller_unittest.cc",
      "p2p/base/transportdescriptionfactory_unittest.cc",
      "p2p/base/turnport_unittest.cc",
      "p2p/base/turnserver_unittest.cc",
      "p2p/client/basicportallocator_unittest.cc",
      "p2p/stunprober/stunprober_unittest.cc",
    ]

    if (is_linux) {
      sources += [
        "base/latebindingsymboltable_unittest.cc",

        # TODO(ronghuawu): Reenable this test.
        # "linux_unittest.cc",
        "base/linuxfdwalk_unittest.cc",
      ]
    }

    if (is_win) {
      sources += [
        "base/win32_unittest.cc",
        "base/win32regkey_unittest.cc",
        "base/win32window_unittest.cc",
        "base/win32windowpicker_unittest.cc",
        "base/winfirewall_unittest.cc",
      ]
    }

    if (is_mac) {
      sources += [ "base/macutils_unittest.cc" ]
    }

    if (is_posix) {
      sources += [
        "base/ssladapter_unittest.cc",
        "base/sslidentity_unittest.cc",
        "base/sslstreamadapter_unittest.cc",
      ]
    }
    if (is_ios || (is_mac && target_cpu != "x86")) {
      defines = [ "CARBON_DEPRECATED=YES" ]
    }

    if (rtc_use_quic) {
      sources += [
        "p2p/quic/quicconnectionhelper_unittest.cc",
        "p2p/quic/quicsession_unittest.cc",
        "p2p/quic/quictransport_unittest.cc",
        "p2p/quic/quictransportchannel_unittest.cc",
        "p2p/quic/reliablequicstream_unittest.cc",
      ]
    }

    configs += [
      ":common_config",
      ":rtc_unittests_config",
    ]
    public_configs = [ ":common_inherited_config" ]

    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }

    deps = [
      "base:rtc_base",
      "base:rtc_base_tests_utils",
      "base:rtc_task_queue",
      "p2p:libstunprober",
      "p2p:rtc_p2p",
      "//testing/gmock",
      "//testing/gtest",
    ]

    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_support" ]
      shard_timeout = 900
    }

    if (is_ios || (is_mac && mac_deployment_target == "10.7")) {
      deps += [
        "sdk:rtc_sdk_peerconnection_objc",
        "system_wrappers:system_wrappers_default",
      ]
      sources += [
        "sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm",
        "sdk/objc/Framework/UnitTests/RTCDataChannelConfigurationTest.mm",
        "sdk/objc/Framework/UnitTests/RTCIceCandidateTest.mm",
        "sdk/objc/Framework/UnitTests/RTCIceServerTest.mm",
        "sdk/objc/Framework/UnitTests/RTCMediaConstraintsTest.mm",
        "sdk/objc/Framework/UnitTests/RTCSessionDescriptionTest.mm",
      ]

      # TODO(tkchin): Cleanup this warning.
      cflags = [ "-Wno-objc-property-no-attribute" ]

      # |-ObjC| flag needed to make sure category method implementations
      # are included:
      # https://developer.apple.com/library/mac/qa/qa1490/_index.html
      ldflags = [ "-ObjC" ]
    }
  }

  test("xmllite_xmpp_unittests") {
    configs += [
      ":common_config",
      ":rtc_unittests_config",
    ]
    public_configs = [ ":common_inherited_config" ]

    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }

    deps = [
      "base:rtc_base_tests_utils",
      "libjingle/xmllite:rtc_xmllite",
      "libjingle/xmpp:rtc_xmpp",
      "//testing/gtest",
    ]

    sources = [
      "libjingle/xmllite/qname_unittest.cc",
      "libjingle/xmllite/xmlbuilder_unittest.cc",
      "libjingle/xmllite/xmlelement_unittest.cc",
      "libjingle/xmllite/xmlnsstack_unittest.cc",
      "libjingle/xmllite/xmlparser_unittest.cc",
      "libjingle/xmllite/xmlprinter_unittest.cc",
      "libjingle/xmpp/fakexmppclient.h",
      "libjingle/xmpp/hangoutpubsubclient_unittest.cc",
      "libjingle/xmpp/jid_unittest.cc",
      "libjingle/xmpp/mucroomconfigtask_unittest.cc",
      "libjingle/xmpp/mucroomdiscoverytask_unittest.cc",
      "libjingle/xmpp/mucroomlookuptask_unittest.cc",
      "libjingle/xmpp/mucroomuniquehangoutidtask_unittest.cc",
      "libjingle/xmpp/pingtask_unittest.cc",
      "libjingle/xmpp/pubsubclient_unittest.cc",
      "libjingle/xmpp/pubsubtasks_unittest.cc",
      "libjingle/xmpp/util_unittest.cc",
      "libjingle/xmpp/util_unittest.h",
      "libjingle/xmpp/xmppengine_unittest.cc",
      "libjingle/xmpp/xmpplogintask_unittest.cc",
      "libjingle/xmpp/xmppstanzaparser_unittest.cc",
    ]
  }

  # TODO(pbos): Rename test suite, this is no longer "just" for video targets.
  test("video_engine_tests") {
    testonly = true
    deps = [
      "audio:audio_tests",
      "call:call_tests",
      "modules/video_capture",
      "test:test_common",
      "test:test_main",
      "video:video_tests",
    ]
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_native_code" ]
      shard_timeout = 900
    }
    if (is_android || is_ios) {
      data = [
        "//resources/foreman_cif_short.yuv",
        "//resources/voice_engine/audio_long16.pcm",
      ]
    }
  }

  source_set("video_quality_test") {
    testonly = true
    configs += [ ":common_config" ]
    public_configs = [ ":common_inherited_config" ]
    sources = [
      "video/video_quality_test.cc",
      "video/video_quality_test.h",
    ]
    deps = [
      ":webrtc",
      "system_wrappers",
      "//testing/gtest",
    ]
    if (!is_android) {
      deps += [ "modules/video_capture:video_capture_internal_impl" ]
    }
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }

  test("webrtc_perf_tests") {
    testonly = true
    configs += [
      ":common_config",
      ":rtc_unittests_config",
    ]
    public_configs = [ ":common_inherited_config" ]
    sources = [
      "call/call_perf_tests.cc",
      "call/rampup_tests.cc",
      "call/rampup_tests.h",
      "modules/audio_coding/neteq/test/neteq_performance_unittest.cc",
      "modules/audio_processing/audio_processing_performance_unittest.cc",
      "modules/audio_processing/level_controller/level_controller_complexity_unittest.cc",
      "modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc",
      "video/full_stack.cc",
    ]
    deps = [
      ":video_quality_test",
      ":webrtc",
      "modules/audio_coding:neteq_test_support",
      "modules/audio_processing",
      "modules/audio_processing:audioproc_test_utils",
      "modules/remote_bitrate_estimator:bwe_simulator",
      "modules/rtp_rtcp",
      "test:channel_transport",
      "test:test_common",
      "test:test_main",
      "test:test_renderer",
      "voice_engine",
      "//testing/gmock",
      "//testing/gtest",
    ]
    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_native_code" ]
      data = [
        "//resources/audio_coding/speech_mono_16kHz.pcm",
        "//resources/audio_coding/testfile32kHz.pcm",
        "//resources/ConferenceMotion_1280_720_50.yuv",
        "//resources/difficult_photo_1850_1110.yuv",
        "//resources/foreman_cif.yuv",
        "//resources/google-wifi-3mbps.rx",
        "//resources/paris_qcif.yuv",
        "//resources/photo_1850_1110.yuv",
        "//resources/presentation_1850_1110.yuv",
        "//resources/verizon4g-downlink.rx",
        "//resources/voice_engine/audio_long16.pcm",
        "//resources/web_screenshot_1850_1110.yuv",
      ]
      shard_timeout = 2700
    }
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }

  test("webrtc_nonparallel_tests") {
    testonly = true
    configs += [
      ":common_config",
      ":rtc_unittests_config",
    ]
    public_configs = [ ":common_inherited_config" ]
    sources = [
      "base/nullsocketserver_unittest.cc",
      "base/physicalsocketserver_unittest.cc",
      "base/socket_unittest.cc",
      "base/socket_unittest.h",
      "base/socketaddress_unittest.cc",
      "base/virtualsocket_unittest.cc",
    ]
    deps = [
      "base:rtc_base",
      "base:rtc_base_tests_utils",
      "//testing/gtest",
    ]
    if (is_win) {
      sources += [ "base/win32socketserver_unittest.cc" ]
    }
    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_support" ]
      shard_timeout = 900
    }

    if (is_mac) {
      sources += [ "base/macsocketserver_unittest.cc" ]
    }
    if (is_ios || (is_mac && target_cpu != "x86")) {
      defines = [ "CARBON_DEPRECATED=YES" ]
    }
    if (is_clang) {
      # Suppress warnings from the Chromium Clang plugin.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }
}
