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

import("//build/config/crypto.gni")
import("//build/config/ui.gni")
import("../webrtc.gni")

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}
if (is_win) {
  import("//build/config/clang/clang.gni")
}

group("base") {
  public_deps = [
    ":rtc_base",
    ":rtc_base_approved",
    ":rtc_task_queue",
    ":sequenced_task_checker",
    ":weak_ptr",
  ]
  if (is_android) {
    public_deps += [ ":base_java" ]
  }
}

config("rtc_base_chromium_config") {
  defines = [ "NO_MAIN_THREAD_WRAPPING" ]
}

config("rtc_base_all_dependent_config") {
  if (is_ios) {
    libs = [
      "CFNetwork.framework",
      "Security.framework",
      "SystemConfiguration.framework",
      "UIKit.framework",
    ]
  }
  if (is_mac) {
    libs = [
      "Cocoa.framework",
      "Foundation.framework",
      "IOKit.framework",
      "Security.framework",
      "SystemConfiguration.framework",
    ]
  }
}

if (!rtc_build_ssl) {
  config("external_ssl_library") {
    assert(rtc_ssl_root != "",
           "You must specify rtc_ssl_root when rtc_build_ssl==0.")
    include_dirs = [ rtc_ssl_root ]
  }
}

source_set("protobuf_utils") {
  sources = [
    "protobuf_utils.h",
  ]
  if (rtc_enable_protobuf) {
    public_deps = [
      "//third_party/protobuf:protobuf_lite",
    ]
  }
}

source_set("compile_assert_c") {
  sources = [
    "compile_assert_c.h",
  ]
}

rtc_source_set("rtc_base_approved") {
  public_deps = [
    ":rtc_base_approved_generic",
  ]
  if (is_mac && !build_with_chromium) {
    public_deps += [ ":rtc_base_approved_objc" ]
  }
}

# The subset of rtc_base approved for use outside of libjingle.
rtc_source_set("rtc_base_approved_generic") {
  visibility = [
    ":rtc_base_approved",
    ":rtc_base_approved_objc",
  ]

  # TODO(kjellander): Remove (bugs.webrtc.org/7480)
  # Enabling GN check triggers a cyclic dependency caused by rate_limiter.cc:
  #   :rtc_base_approved -> ../system_wrappers -> :rtc_base_approved
  check_includes = false
  defines = []
  libs = []
  deps = []

  sources = [
    "arraysize.h",
    "atomicops.h",
    "base64.cc",
    "base64.h",
    "basictypes.h",
    "bind.h",
    "bitbuffer.cc",
    "bitbuffer.h",
    "bitrateallocationstrategy.cc",
    "bitrateallocationstrategy.h",
    "buffer.h",
    "bufferqueue.cc",
    "bufferqueue.h",
    "bytebuffer.cc",
    "bytebuffer.h",
    "byteorder.h",
    "checks.cc",
    "checks.h",
    "constructormagic.h",
    "copyonwritebuffer.cc",
    "copyonwritebuffer.h",
    "criticalsection.cc",
    "criticalsection.h",
    "deprecation.h",
    "event.cc",
    "event.h",
    "event_tracer.cc",
    "event_tracer.h",
    "file.cc",
    "file.h",
    "flags.cc",
    "flags.h",
    "format_macros.h",
    "function_view.h",
    "histogram_percentile_counter.cc",
    "histogram_percentile_counter.h",
    "ignore_wundef.h",
    "location.cc",
    "location.h",
    "mod_ops.h",
    "moving_max_counter.h",
    "onetimeevent.h",
    "pathutils.cc",
    "pathutils.h",
    "platform_file.cc",
    "platform_file.h",
    "platform_thread.cc",
    "platform_thread.h",
    "platform_thread_types.h",
    "ptr_util.h",
    "race_checker.cc",
    "race_checker.h",
    "random.cc",
    "random.h",
    "rate_limiter.cc",
    "rate_limiter.h",
    "rate_statistics.cc",
    "rate_statistics.h",
    "ratetracker.cc",
    "ratetracker.h",
    "refcount.h",
    "refcountedobject.h",
    "safe_compare.h",
    "safe_conversions.h",
    "safe_conversions_impl.h",
    "safe_minmax.h",
    "sanitizer.h",
    "scoped_ref_ptr.h",
    "string_to_number.cc",
    "string_to_number.h",
    "stringencode.cc",
    "stringencode.h",
    "stringize_macros.h",
    "stringutils.cc",
    "stringutils.h",
    "swap_queue.h",
    "template_util.h",
    "thread_annotations.h",
    "thread_checker.h",
    "thread_checker_impl.cc",
    "thread_checker_impl.h",
    "timestampaligner.cc",
    "timestampaligner.h",
    "timeutils.cc",
    "timeutils.h",
    "trace_event.h",
    "type_traits.h",
  ]

  deps += [ "..:webrtc_common" ]

  if (is_android) {
    libs += [ "log" ]
  }

  if (is_posix) {
    sources += [ "file_posix.cc" ]
  }

  if (is_win) {
    sources += [ "file_win.cc" ]
  }

  if (build_with_chromium) {
    # Dependency on chromium's logging (in //base).
    deps += [ "//base:base" ]
    sources += [
      "../../webrtc_overrides/rtc_base/logging.cc",
      "../../webrtc_overrides/rtc_base/logging.h",
    ]
  } else {
    sources += [
      "logging.cc",
      "logging.h",
    ]
  }
  if (is_component_build && is_win) {
    # Copy the VS runtime DLLs into the isolate so that they don't have to be
    # preinstalled on the target machine. The debug runtimes have a "d" at
    # the end.
    # This is a copy of https://codereview.chromium.org/1783973002.
    # TODO(ehmaldonado): We'd like Chromium to make this changes easier to use,
    # so we don't have to copy their changes and risk breakages.
    # See http://crbug.com/653569
    if (is_debug) {
      vcrt_suffix = "d"
    } else {
      vcrt_suffix = ""
    }

    # These runtime files are copied to the output directory by the
    # vs_toolchain script that runs as part of toolchain configuration.
    data = [
      "$root_out_dir/msvcp140${vcrt_suffix}.dll",
      "$root_out_dir/vccorlib140${vcrt_suffix}.dll",
      "$root_out_dir/vcruntime140${vcrt_suffix}.dll",

      # Universal Windows 10 CRT files
      "$root_out_dir/api-ms-win-core-console-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-datetime-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-debug-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-errorhandling-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-file-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-file-l1-2-0.dll",
      "$root_out_dir/api-ms-win-core-file-l2-1-0.dll",
      "$root_out_dir/api-ms-win-core-handle-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-heap-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-interlocked-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-libraryloader-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-localization-l1-2-0.dll",
      "$root_out_dir/api-ms-win-core-memory-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-namedpipe-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-processenvironment-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-processthreads-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-processthreads-l1-1-1.dll",
      "$root_out_dir/api-ms-win-core-profile-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-rtlsupport-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-string-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-synch-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-synch-l1-2-0.dll",
      "$root_out_dir/api-ms-win-core-sysinfo-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-timezone-l1-1-0.dll",
      "$root_out_dir/api-ms-win-core-util-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-conio-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-convert-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-environment-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-filesystem-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-heap-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-locale-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-math-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-multibyte-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-private-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-process-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-runtime-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-stdio-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-string-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-time-l1-1-0.dll",
      "$root_out_dir/api-ms-win-crt-utility-l1-1-0.dll",
      "$root_out_dir/ucrtbase${vcrt_suffix}.dll",
    ]
    if (is_asan) {
      if (current_cpu == "x64") {
        data += [ "$clang_base_path/lib/clang/$clang_version/lib/windows/clang_rt.asan_dynamic-x86_64.dll" ]
      } else {
        data += [ "$clang_base_path/lib/clang/$clang_version/lib/windows/clang_rt.asan_dynamic-i386.dll" ]
      }
    }
  }
  if (is_nacl) {
    deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
  }
}

if (is_mac && !build_with_chromium) {
  config("rtc_base_approved_objc_all_dependent_config") {
    visibility = [ ":rtc_base_approved_objc" ]
    libs = [ "Foundation.framework" ]  # needed for logging_mac.mm
  }

  rtc_source_set("rtc_base_approved_objc") {
    visibility = [ ":rtc_base_approved" ]
    all_dependent_configs = [ ":rtc_base_approved_objc_all_dependent_config" ]
    sources = [
      "logging_mac.mm",
    ]
    deps = [
      ":rtc_base_approved_generic",
    ]
  }
}

rtc_source_set("rtc_task_queue") {
  deps = [
    ":rtc_base_approved",
  ]
  public_deps = [
    ":rtc_task_queue_api",
  ]

  if (rtc_link_task_queue_impl) {
    deps += [ ":rtc_task_queue_impl" ]
  }
}

# WebRTC targets must not directly depend on rtc_task_queue_api or
# rtc_task_queue_impl. Instead, depend on rtc_task_queue.
# The build flag |rtc_link_task_queue_impl| decides if WebRTC targets will link
# to the default implemenation in rtc_task_queue_impl or if an externally
# provided implementation should be used. An external implementation should
# depend on rtc_task_queue_api.
rtc_source_set("rtc_task_queue_api") {
  sources = [
    "task_queue.h",
  ]
  deps = [
    ":rtc_base_approved",
  ]
}

rtc_source_set("rtc_task_queue_impl") {
  deps = [
    ":rtc_base_approved",
    ":rtc_task_queue_api",
  ]
  if (build_with_chromium) {
    sources = [
      "../../webrtc_overrides/rtc_base/task_queue.cc",
    ]
  } else {
    if (rtc_build_libevent) {
      deps += [ "//base/third_party/libevent" ]
    }
    if (rtc_enable_libevent) {
      sources = [
        "task_queue_libevent.cc",
        "task_queue_posix.cc",
        "task_queue_posix.h",
      ]
    } else {
      if (is_mac || is_ios) {
        sources = [
          "task_queue_gcd.cc",
          "task_queue_posix.cc",
        ]
      }
      if (is_win) {
        sources = [
          "task_queue_win.cc",
        ]
      }
    }
  }
}

rtc_static_library("sequenced_task_checker") {
  sources = [
    "sequenced_task_checker.h",
    "sequenced_task_checker_impl.cc",
    "sequenced_task_checker_impl.h",
  ]
  deps = [
    ":rtc_base_approved",
    ":rtc_task_queue",
  ]
}

rtc_static_library("weak_ptr") {
  sources = [
    "weak_ptr.cc",
    "weak_ptr.h",
  ]
  deps = [
    ":rtc_base_approved",
    ":sequenced_task_checker",
  ]
}

rtc_static_library("rtc_numerics") {
  sources = [
    "numerics/exp_filter.cc",
    "numerics/exp_filter.h",
    "numerics/percentile_filter.h",
  ]
  deps = [
    ":rtc_base_approved",
  ]
}

config("rtc_base_warnings_config") {
  if (is_win && is_clang) {
    cflags = [
      # Disable warnings failing when compiling with Clang on Windows.
      # https://bugs.chromium.org/p/webrtc/issues/detail?id=5366
      "-Wno-sign-compare",
      "-Wno-missing-braces",
    ]
  }
}

rtc_source_set("rtc_json") {
  defines = []
  sources = [
    "json.cc",
    "json.h",
  ]
  if (rtc_build_json) {
    public_deps = [
      "//third_party/jsoncpp",
    ]
  } else {
    include_dirs = [ "$rtc_jsoncpp_root" ]

    # When defined changes the include path for json.h to where it is
    # expected to be when building json outside of the standalone build.
    defines += [ "WEBRTC_EXTERNAL_JSON" ]
  }
}

rtc_static_library("rtc_base") {
  public_deps = [
    ":rtc_base_generic",
  ]
  if (is_win) {
    sources = [
      "noop.cc",
    ]
  }
  if (is_ios || is_mac) {
    sources = [
      "noop.mm",
    ]
    public_deps += [ ":rtc_base_objc" ]
  }
}

if (is_ios || is_mac) {
  rtc_source_set("rtc_base_objc") {
    sources = [
      "thread_darwin.mm",
    ]
    deps = [
      ":rtc_base_generic",
    ]
    visibility = [ ":rtc_base" ]
  }
}

rtc_static_library("rtc_base_generic") {
  cflags = []
  cflags_cc = []
  libs = []
  defines = []
  deps = [
    "..:webrtc_common",
    "../api:optional",
  ]
  public_deps = [
    ":rtc_base_approved",
  ]
  public_configs = []

  all_dependent_configs = [ ":rtc_base_all_dependent_config" ]

  sources = [
    "asyncinvoker-inl.h",
    "asyncinvoker.cc",
    "asyncinvoker.h",
    "asyncpacketsocket.cc",
    "asyncpacketsocket.h",
    "asyncresolverinterface.cc",
    "asyncresolverinterface.h",
    "asyncsocket.cc",
    "asyncsocket.h",
    "asynctcpsocket.cc",
    "asynctcpsocket.h",
    "asyncudpsocket.cc",
    "asyncudpsocket.h",
    "crc32.cc",
    "crc32.h",
    "cryptstring.cc",
    "cryptstring.h",
    "filerotatingstream.cc",
    "filerotatingstream.h",
    "fileutils.cc",
    "fileutils.h",
    "gunit_prod.h",
    "helpers.cc",
    "helpers.h",
    "httpbase.cc",
    "httpbase.h",
    "httpcommon-inl.h",
    "httpcommon.cc",
    "httpcommon.h",
    "ipaddress.cc",
    "ipaddress.h",
    "messagedigest.cc",
    "messagedigest.h",
    "messagehandler.cc",
    "messagehandler.h",
    "messagequeue.cc",
    "messagequeue.h",
    "nethelpers.cc",
    "nethelpers.h",
    "network.cc",
    "network.h",
    "network_constants.h",
    "networkmonitor.cc",
    "networkmonitor.h",
    "nullsocketserver.cc",
    "nullsocketserver.h",
    "openssl.h",
    "openssladapter.cc",
    "openssladapter.h",
    "openssldigest.cc",
    "openssldigest.h",
    "opensslidentity.cc",
    "opensslidentity.h",
    "opensslstreamadapter.cc",
    "opensslstreamadapter.h",
    "physicalsocketserver.cc",
    "physicalsocketserver.h",
    "proxyinfo.cc",
    "proxyinfo.h",
    "ratelimiter.cc",
    "ratelimiter.h",
    "rtccertificate.cc",
    "rtccertificate.h",
    "rtccertificategenerator.cc",
    "rtccertificategenerator.h",
    "signalthread.cc",
    "signalthread.h",
    "sigslot.cc",
    "sigslot.h",
    "sigslotrepeater.h",
    "socket.h",
    "socketadapters.cc",
    "socketadapters.h",
    "socketaddress.cc",
    "socketaddress.h",
    "socketaddresspair.cc",
    "socketaddresspair.h",
    "socketfactory.h",
    "socketserver.h",
    "socketstream.cc",
    "socketstream.h",
    "ssladapter.cc",
    "ssladapter.h",
    "sslfingerprint.cc",
    "sslfingerprint.h",
    "sslidentity.cc",
    "sslidentity.h",
    "sslstreamadapter.cc",
    "sslstreamadapter.h",
    "stream.cc",
    "stream.h",
    "thread.cc",
    "thread.h",
  ]

  visibility = [
    ":rtc_base",
    ":rtc_base_objc",
  ]

  # TODO(henrike): issue 3307, make rtc_base build with the Chromium default
  # compiler settings.
  suppressed_configs += [ "//build/config/compiler:chromium_code" ]
  configs += [ "//build/config/compiler:no_chromium_code" ]
  if (!is_win) {
    cflags += [ "-Wno-uninitialized" ]
  }

  if (build_with_chromium) {
    if (is_win) {
      sources += [ "../../webrtc_overrides/rtc_base/win32socketinit.cc" ]
    }
    include_dirs = [ "../../boringssl/src/include" ]
    public_configs += [ ":rtc_base_chromium_config" ]
  } else {
    configs += [ ":rtc_base_warnings_config" ]
    sources += [
      "callback.h",
      "logsinks.cc",
      "logsinks.h",
      "mathutils.h",
      "optionsfile.cc",
      "optionsfile.h",
      "rollingaccumulator.h",
      "sslroots.h",
      "transformadapter.cc",
      "transformadapter.h",
      "window.h",
    ]

    if (is_win) {
      sources += [
        "win32socketinit.cc",
        "win32socketinit.h",
        "win32socketserver.cc",
        "win32socketserver.h",
      ]
    }
  }  # !build_with_chromium

  if (rtc_build_ssl) {
    deps += [ "//third_party/boringssl" ]
  } else {
    configs += [ ":external_ssl_library" ]
  }

  if (is_android) {
    sources += [
      "ifaddrs-android.cc",
      "ifaddrs-android.h",
    ]

    libs += [
      "log",
      "GLESv2",
    ]
  }

  if (is_ios || is_mac) {
    sources += [ "macifaddrs_converter.cc" ]
  }

  if (use_x11) {
    libs += [
      "dl",
      "rt",
      "Xext",
      "X11",
      "Xcomposite",
      "Xrender",
    ]
  }

  if (is_linux) {
    libs += [
      "dl",
      "rt",
    ]
  }

  if (is_mac) {
    sources += [
      "macutils.cc",
      "macutils.h",
    ]
    libs += [
      # For ProcessInformationCopyDictionary in unixfilesystem.cc.
      "ApplicationServices.framework",
    ]
  }

  if (is_win) {
    sources += [
      "win32.cc",
      "win32.h",
      "win32filesystem.cc",
      "win32filesystem.h",
      "win32securityerrors.cc",
      "win32window.cc",
      "win32window.h",
    ]

    libs += [
      "crypt32.lib",
      "iphlpapi.lib",
      "secur32.lib",
    ]

    cflags += [
      # Suppress warnings about WIN32_LEAN_AND_MEAN.
      "/wd4005",
      "/wd4703",
    ]

    defines += [ "_CRT_NONSTDC_NO_DEPRECATE" ]
  }

  if (is_posix) {
    sources += [
      "ifaddrs_converter.cc",
      "ifaddrs_converter.h",
      "unixfilesystem.cc",
      "unixfilesystem.h",
    ]
  }

  if (is_nacl) {
    deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
    defines += [ "timezone=_timezone" ]
    sources -= [ "ifaddrs_converter.cc" ]
  }
  if (is_win && is_clang) {
    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
  }
}

rtc_source_set("gtest_prod") {
  sources = [
    "gtest_prod_util.h",
  ]
}

config("rtc_base_tests_utils_exported_config") {
  defines = [ "GTEST_RELATIVE_PATH" ]
}

config("rtc_base_tests_utils_warnings_config") {
  if (is_win && is_clang) {
    cflags = [
      # See https://bugs.chromium.org/p/webrtc/issues/detail?id=6270
      "-Wno-reorder",
      "-Wno-sign-compare",
    ]
  }
}

rtc_source_set("rtc_base_tests_utils") {
  testonly = true
  sources = [
    # Also use this as a convenient dumping ground for misc files that are
    # included by multiple targets below.
    "cpu_time.cc",
    "cpu_time.h",
    "fakeclock.cc",
    "fakeclock.h",
    "fakenetwork.h",
    "fakesslidentity.h",
    "firewallsocketserver.cc",
    "firewallsocketserver.h",
    "gunit.h",
    "httpserver.cc",
    "httpserver.h",
    "md5.cc",
    "md5.h",
    "md5digest.cc",
    "md5digest.h",
    "memory_usage.cc",
    "memory_usage.h",
    "natserver.cc",
    "natserver.h",
    "natsocketfactory.cc",
    "natsocketfactory.h",
    "nattypes.cc",
    "nattypes.h",
    "proxyserver.cc",
    "proxyserver.h",
    "refcount.h",
    "sha1.cc",
    "sha1.h",
    "sha1digest.cc",
    "sha1digest.h",
    "sigslottester.h",
    "sigslottester.h.pump",
    "testbase64.h",
    "testclient.cc",
    "testclient.h",
    "testechoserver.h",
    "testutils.h",
    "timedelta.h",
    "virtualsocketserver.cc",
    "virtualsocketserver.h",
  ]
  configs += [ ":rtc_base_tests_utils_warnings_config" ]
  public_configs = [ ":rtc_base_tests_utils_exported_config" ]
  deps = [
    ":rtc_base",
    "../test:field_trial",
    "../test:test_support",
  ]
  public_deps = [
    "//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" ]
  }
}

if (rtc_include_tests) {
  rtc_source_set("rtc_base_tests_main") {
    testonly = true
    sources = [
      "unittest_main.cc",
    ]
    public_configs = [ ":rtc_base_tests_utils_exported_config" ]
    deps = [
      ":rtc_base",
      ":rtc_base_approved",
      ":rtc_base_tests_utils",
      "../test:field_trial",
      "../test:test_support",
    ]

    public_deps = [
      "//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" ]
    }
  }

  rtc_source_set("rtc_base_nonparallel_tests") {
    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) {
      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
      #visibility = [ "..:webrtc_nonparallel_tests" ]
    }
    sources = [
      "cpu_time_unittest.cc",
      "filerotatingstream_unittest.cc",
      "nullsocketserver_unittest.cc",
      "physicalsocketserver_unittest.cc",
      "socket_unittest.cc",
      "socket_unittest.h",
      "socketaddress_unittest.cc",
    ]
    deps = [
      ":rtc_base",
      ":rtc_base_tests_main",
      ":rtc_base_tests_utils",
      "../system_wrappers:system_wrappers",
      "../test:test_support",
      "//testing/gtest",
    ]
    if (is_win) {
      sources += [ "win32socketserver_unittest.cc" ]
    }

    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" ]
    }
  }

  rtc_source_set("rtc_base_approved_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) {
      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
      #visibility = [ "..:rtc_unittests" ]
    }
    sources = [
      "atomicops_unittest.cc",
      "base64_unittest.cc",
      "basictypes_unittest.cc",
      "bind_unittest.cc",
      "bitbuffer_unittest.cc",
      "buffer_unittest.cc",
      "bufferqueue_unittest.cc",
      "bytebuffer_unittest.cc",
      "byteorder_unittest.cc",
      "copyonwritebuffer_unittest.cc",
      "criticalsection_unittest.cc",
      "event_tracer_unittest.cc",
      "event_unittest.cc",
      "file_unittest.cc",
      "function_view_unittest.cc",
      "histogram_percentile_counter_unittest.cc",
      "logging_unittest.cc",
      "md5digest_unittest.cc",
      "mod_ops_unittest.cc",
      "moving_max_counter_unittest.cc",
      "onetimeevent_unittest.cc",
      "pathutils_unittest.cc",
      "platform_thread_unittest.cc",
      "random_unittest.cc",
      "rate_limiter_unittest.cc",
      "rate_statistics_unittest.cc",
      "ratetracker_unittest.cc",
      "refcountedobject_unittest.cc",
      "safe_compare_unittest.cc",
      "safe_minmax_unittest.cc",
      "string_to_number_unittest.cc",
      "stringencode_unittest.cc",
      "stringize_macros_unittest.cc",
      "stringutils_unittest.cc",
      "swap_queue_unittest.cc",
      "thread_annotations_unittest.cc",
      "thread_checker_unittest.cc",
      "timestampaligner_unittest.cc",
      "timeutils_unittest.cc",
      "virtualsocket_unittest.cc",
    ]
    deps = [
      ":rtc_base",
      ":rtc_base_approved",
      ":rtc_base_tests_main",
      ":rtc_base_tests_utils",
      ":rtc_task_queue",
      "../api:array_view",
      "../system_wrappers:system_wrappers",
      "../test:test_support",
    ]
    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" ]
    }
  }

  rtc_source_set("rtc_task_queue_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) {
      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
      #visibility = [ "..:rtc_unittests" ]
    }
    sources = [
      "task_queue_unittest.cc",
    ]
    deps = [
      ":rtc_base_approved",
      ":rtc_base_tests_main",
      ":rtc_base_tests_utils",
      ":rtc_task_queue",
      "../test:test_support",
    ]
    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" ]
    }
  }

  rtc_source_set("sequenced_task_checker_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) {
      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
      #visibility = [ "..:rtc_unittests" ]
    }
    sources = [
      "sequenced_task_checker_unittest.cc",
    ]
    deps = [
      ":rtc_base_approved",
      ":rtc_base_tests_main",
      ":rtc_task_queue",
      ":sequenced_task_checker",
      "../test:test_support",
    ]
  }

  rtc_source_set("weak_ptr_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) {
      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
      #visibility = [ "..:rtc_unittests" ]
    }
    sources = [
      "weak_ptr_unittest.cc",
    ]
    deps = [
      ":rtc_base_tests_main",
      ":rtc_base_tests_utils",
      ":rtc_task_queue",
      ":weak_ptr",
      "../test:test_support",
    ]
  }

  rtc_source_set("rtc_numerics_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) {
      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
      #visibility = [ "..:rtc_unittests" ]
    }
    sources = [
      "numerics/exp_filter_unittest.cc",
      "numerics/percentile_filter_unittest.cc",
    ]
    deps = [
      ":rtc_base_approved",
      ":rtc_base_tests_main",
      ":rtc_numerics",
      "../test:test_support",
    ]
  }

  config("rtc_base_unittests_config") {
    if (is_clang) {
      cflags = [ "-Wno-unused-const-variable" ]
    }
  }
  rtc_source_set("rtc_base_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) {
      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
      #visibility = [ "..:rtc_unittests" ]
    }
    sources = [
      "callback_unittest.cc",
      "crc32_unittest.cc",
      "helpers_unittest.cc",
      "httpbase_unittest.cc",
      "httpcommon_unittest.cc",
      "httpserver_unittest.cc",
      "ipaddress_unittest.cc",
      "memory_usage_unittest.cc",
      "messagedigest_unittest.cc",
      "messagequeue_unittest.cc",
      "nat_unittest.cc",
      "network_unittest.cc",
      "optionsfile_unittest.cc",
      "proxy_unittest.cc",
      "ptr_util_unittest.cc",
      "ratelimiter_unittest.cc",
      "rollingaccumulator_unittest.cc",
      "rtccertificate_unittest.cc",
      "rtccertificategenerator_unittest.cc",
      "sha1digest_unittest.cc",
      "signalthread_unittest.cc",
      "sigslot_unittest.cc",
      "sigslottester_unittest.cc",
      "stream_unittest.cc",
      "testclient_unittest.cc",
      "thread_unittest.cc",
    ]
    if (is_win) {
      sources += [
        "win32_unittest.cc",
        "win32window_unittest.cc",
      ]
    }
    if (is_posix) {
      sources += [
        "openssladapter_unittest.cc",
        "ssladapter_unittest.cc",
        "sslidentity_unittest.cc",
        "sslstreamadapter_unittest.cc",
      ]
    }
    deps = [
      ":rtc_base_tests_main",
      ":rtc_base_tests_utils",
      "../api:optional",
      "../test:test_support",
    ]
    public_deps = [
      ":rtc_base",
    ]
    configs += [ ":rtc_base_unittests_config" ]
    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 (build_with_chromium) {
      include_dirs = [ "../../boringssl/src/include" ]
    }
    if (rtc_build_ssl) {
      deps += [ "//third_party/boringssl" ]
    } else {
      configs += [ ":external_ssl_library" ]
    }
  }
}

if (is_android) {
  android_library("base_java") {
    java_files = [
      "java/src/org/webrtc/ContextUtils.java",
      "java/src/org/webrtc/Logging.java",
      "java/src/org/webrtc/Size.java",
      "java/src/org/webrtc/ThreadUtils.java",
    ]

    # TODO(sakal): Fix build hooks crbug.com/webrtc/8148
    no_build_hooks = true
  }
}
