# 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",
    "refcounter.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 (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",
        "task_queue_posix.h",
      ]
    }
    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" ]
  }
}

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.cc",
    "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.cc",
    "testechoserver.h",
    "testutils.cc",
    "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 (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",
    ]
  }

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

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

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

  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) {
      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
  }
}
