GN: Add modules_unittests

Changes:
* Enabled protobuf for iOS globally.
* Set WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE on a global
scope similar to GYP since tests depend on it.
* Added missing rtc_libvpx_build_vp9 variable.
* Moved out audio_coding defines into .gni file to avoid code duplication
* Renamed files to avoid object naming conflicts that GN disallows:
  * webrtc/modules/audio_processing/{echo_cancellation_unittest.cc->echo_cancellation_bit_exact_unittest.cc}
  * webrtc/modules/video_coding/codecs/vp9/{screenshare_layers_unittest.cc->vp9_screenshare_layers_unittest.cc}

BUG=webrtc:5949
TESTED=Built and ran the tests on Mac. Also ran:
gn gen out/Default --args="rtc_enable_bwe_test_logging=true"
and verified that more objects are being built (1885 vs 1883)
when compiling modules_unittests.

NOTRY=True
NOPRESUBMIT=True

Review-Url: https://codereview.webrtc.org/2041233006
Cr-Original-Commit-Position: refs/heads/master@{#13108}
Cr-Mirrored-From: https://chromium.googlesource.com/external/webrtc
Cr-Mirrored-Commit: fb11424551dae924869ae54059cb1612836cb6f7
diff --git a/BUILD.gn b/BUILD.gn
index 02a16d1..565810c 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -254,17 +254,7 @@
     "call",
     "common_audio",
     "common_video",
-    "modules/audio_coding",
-    "modules/audio_conference_mixer",
-    "modules/audio_device",
-    "modules/audio_processing",
-    "modules/bitrate_controller",
-    "modules/desktop_capture",
-    "modules/media_file",
-    "modules/rtp_rtcp",
-    "modules/utility",
-    "modules/video_coding",
-    "modules/video_processing",
+    "modules",
     "system_wrappers",
     "tools",
     "video",
diff --git a/build/webrtc.gni b/build/webrtc.gni
index aa86c99..28a9ef5 100644
--- a/build/webrtc.gni
+++ b/build/webrtc.gni
@@ -42,6 +42,7 @@
   rtc_build_libjpeg = true
   rtc_build_libsrtp = true
   rtc_build_libvpx = true
+  rtc_libvpx_build_vp9 = true
   rtc_build_libyuv = true
   rtc_build_openmax_dl = true
   rtc_build_opus = true
@@ -73,10 +74,6 @@
     rtc_build_libevent = true
   }
 
-  if (is_ios) {
-    rtc_enable_protobuf = false
-  }
-
   if (current_cpu == "arm" || current_cpu == "arm64") {
     rtc_prefer_fixed_point = true
   }
diff --git a/modules/BUILD.gn b/modules/BUILD.gn
new file mode 100644
index 0000000..4eeaa59
--- /dev/null
+++ b/modules/BUILD.gn
@@ -0,0 +1,540 @@
+# 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("../build/webrtc.gni")
+import("audio_coding/audio_coding.gni")
+import("//testing/test.gni")
+
+declare_args() {
+  # Desktop capturer is supported only on Windows, OSX and Linux.
+  rtc_desktop_capture_supported = is_win || is_mac || is_linux
+}
+
+group("modules") {
+  deps = [
+    "audio_coding",
+    "audio_conference_mixer",
+    "audio_device",
+    "audio_processing",
+    "bitrate_controller",
+    "desktop_capture",
+    "media_file",
+    "rtp_rtcp",
+    "utility",
+    "video_coding",
+    "video_processing",
+  ]
+}
+
+if (rtc_include_tests) {
+  test("modules_unittests") {
+    testonly = true
+
+    defines = audio_coding_defines
+    deps = []
+    sources = [
+      "audio_coding/acm2/acm_receiver_unittest_oldapi.cc",
+      "audio_coding/acm2/audio_coding_module_unittest_oldapi.cc",
+      "audio_coding/acm2/call_statistics_unittest.cc",
+      "audio_coding/acm2/codec_manager_unittest.cc",
+      "audio_coding/acm2/initial_delay_manager_unittest.cc",
+      "audio_coding/acm2/rent_a_codec_unittest.cc",
+      "audio_coding/codecs/audio_decoder_factory_unittest.cc",
+      "audio_coding/codecs/cng/audio_encoder_cng_unittest.cc",
+      "audio_coding/codecs/cng/cng_unittest.cc",
+      "audio_coding/codecs/isac/fix/source/filterbanks_unittest.cc",
+      "audio_coding/codecs/isac/fix/source/filters_unittest.cc",
+      "audio_coding/codecs/isac/fix/source/lpc_masking_model_unittest.cc",
+      "audio_coding/codecs/isac/fix/source/transform_unittest.cc",
+      "audio_coding/codecs/isac/main/source/audio_encoder_isac_unittest.cc",
+      "audio_coding/codecs/isac/main/source/isac_unittest.cc",
+      "audio_coding/codecs/isac/unittest.cc",
+      "audio_coding/codecs/mock/mock_audio_encoder.cc",
+      "audio_coding/codecs/opus/audio_encoder_opus_unittest.cc",
+      "audio_coding/codecs/opus/opus_unittest.cc",
+      "audio_coding/codecs/red/audio_encoder_copy_red_unittest.cc",
+      "audio_coding/neteq/audio_classifier_unittest.cc",
+      "audio_coding/neteq/audio_multi_vector_unittest.cc",
+      "audio_coding/neteq/audio_vector_unittest.cc",
+      "audio_coding/neteq/background_noise_unittest.cc",
+      "audio_coding/neteq/buffer_level_filter_unittest.cc",
+      "audio_coding/neteq/comfort_noise_unittest.cc",
+      "audio_coding/neteq/decision_logic_unittest.cc",
+      "audio_coding/neteq/decoder_database_unittest.cc",
+      "audio_coding/neteq/delay_manager_unittest.cc",
+      "audio_coding/neteq/delay_peak_detector_unittest.cc",
+      "audio_coding/neteq/dsp_helper_unittest.cc",
+      "audio_coding/neteq/dtmf_buffer_unittest.cc",
+      "audio_coding/neteq/dtmf_tone_generator_unittest.cc",
+      "audio_coding/neteq/expand_unittest.cc",
+      "audio_coding/neteq/merge_unittest.cc",
+      "audio_coding/neteq/mock/mock_audio_decoder.h",
+      "audio_coding/neteq/mock/mock_audio_vector.h",
+      "audio_coding/neteq/mock/mock_buffer_level_filter.h",
+      "audio_coding/neteq/mock/mock_decoder_database.h",
+      "audio_coding/neteq/mock/mock_delay_manager.h",
+      "audio_coding/neteq/mock/mock_delay_peak_detector.h",
+      "audio_coding/neteq/mock/mock_dtmf_buffer.h",
+      "audio_coding/neteq/mock/mock_dtmf_tone_generator.h",
+      "audio_coding/neteq/mock/mock_expand.h",
+      "audio_coding/neteq/mock/mock_external_decoder_pcm16b.h",
+      "audio_coding/neteq/mock/mock_packet_buffer.h",
+      "audio_coding/neteq/mock/mock_payload_splitter.h",
+      "audio_coding/neteq/nack_tracker_unittest.cc",
+      "audio_coding/neteq/neteq_external_decoder_unittest.cc",
+      "audio_coding/neteq/neteq_impl_unittest.cc",
+      "audio_coding/neteq/neteq_network_stats_unittest.cc",
+      "audio_coding/neteq/neteq_stereo_unittest.cc",
+      "audio_coding/neteq/neteq_unittest.cc",
+      "audio_coding/neteq/normal_unittest.cc",
+      "audio_coding/neteq/packet_buffer_unittest.cc",
+      "audio_coding/neteq/payload_splitter_unittest.cc",
+      "audio_coding/neteq/post_decode_vad_unittest.cc",
+      "audio_coding/neteq/random_vector_unittest.cc",
+      "audio_coding/neteq/sync_buffer_unittest.cc",
+      "audio_coding/neteq/tick_timer_unittest.cc",
+      "audio_coding/neteq/time_stretch_unittest.cc",
+      "audio_coding/neteq/timestamp_scaler_unittest.cc",
+      "audio_coding/neteq/tools/input_audio_file_unittest.cc",
+      "audio_coding/neteq/tools/packet_unittest.cc",
+      "audio_conference_mixer/test/audio_conference_mixer_unittest.cc",
+      "audio_device/fine_audio_buffer_unittest.cc",
+      "audio_processing/aec/echo_cancellation_unittest.cc",
+      "audio_processing/aec/system_delay_unittest.cc",
+      "audio_processing/agc/agc_manager_direct_unittest.cc",
+
+      # TODO(ajm): Fix to match new interface.
+      # "audio_processing/agc/agc_unittest.cc",
+      "audio_processing/agc/loudness_histogram_unittest.cc",
+      "audio_processing/agc/mock_agc.h",
+      "audio_processing/beamformer/array_util_unittest.cc",
+      "audio_processing/beamformer/complex_matrix_unittest.cc",
+      "audio_processing/beamformer/covariance_matrix_generator_unittest.cc",
+      "audio_processing/beamformer/matrix_unittest.cc",
+      "audio_processing/beamformer/mock_nonlinear_beamformer.h",
+      "audio_processing/beamformer/nonlinear_beamformer_unittest.cc",
+      "audio_processing/echo_cancellation_impl_unittest.cc",
+      "audio_processing/intelligibility/intelligibility_enhancer_unittest.cc",
+      "audio_processing/intelligibility/intelligibility_utils_unittest.cc",
+      "audio_processing/splitting_filter_unittest.cc",
+      "audio_processing/transient/dyadic_decimator_unittest.cc",
+      "audio_processing/transient/file_utils.cc",
+      "audio_processing/transient/file_utils.h",
+      "audio_processing/transient/file_utils_unittest.cc",
+      "audio_processing/transient/moving_moments_unittest.cc",
+      "audio_processing/transient/transient_detector_unittest.cc",
+      "audio_processing/transient/transient_suppressor_unittest.cc",
+      "audio_processing/transient/wpd_node_unittest.cc",
+      "audio_processing/transient/wpd_tree_unittest.cc",
+      "audio_processing/utility/block_mean_calculator_unittest.cc",
+      "audio_processing/utility/delay_estimator_unittest.cc",
+      "audio_processing/vad/gmm_unittest.cc",
+      "audio_processing/vad/pitch_based_vad_unittest.cc",
+      "audio_processing/vad/pitch_internal_unittest.cc",
+      "audio_processing/vad/pole_zero_filter_unittest.cc",
+      "audio_processing/vad/standalone_vad_unittest.cc",
+      "audio_processing/vad/vad_audio_proc_unittest.cc",
+      "audio_processing/vad/vad_circular_buffer_unittest.cc",
+      "audio_processing/vad/voice_activity_detector_unittest.cc",
+      "bitrate_controller/bitrate_controller_unittest.cc",
+      "bitrate_controller/send_side_bandwidth_estimation_unittest.cc",
+      "congestion_controller/congestion_controller_unittest.cc",
+      "media_file/media_file_unittest.cc",
+      "module_common_types_unittest.cc",
+      "pacing/bitrate_prober_unittest.cc",
+      "pacing/paced_sender_unittest.cc",
+      "pacing/packet_router_unittest.cc",
+      "remote_bitrate_estimator/bwe_simulations.cc",
+      "remote_bitrate_estimator/include/mock/mock_remote_bitrate_estimator.h",
+      "remote_bitrate_estimator/include/mock/mock_remote_bitrate_observer.h",
+      "remote_bitrate_estimator/inter_arrival_unittest.cc",
+      "remote_bitrate_estimator/overuse_detector_unittest.cc",
+      "remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc",
+      "remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc",
+      "remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc",
+      "remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h",
+      "remote_bitrate_estimator/remote_estimator_proxy_unittest.cc",
+      "remote_bitrate_estimator/send_time_history_unittest.cc",
+      "remote_bitrate_estimator/test/bwe_test_framework_unittest.cc",
+      "remote_bitrate_estimator/test/bwe_unittest.cc",
+      "remote_bitrate_estimator/test/estimators/nada_unittest.cc",
+      "remote_bitrate_estimator/test/metric_recorder_unittest.cc",
+      "remote_bitrate_estimator/transport_feedback_adapter_unittest.cc",
+      "rtp_rtcp/source/byte_io_unittest.cc",
+      "rtp_rtcp/source/fec_receiver_unittest.cc",
+      "rtp_rtcp/source/fec_test_helper.cc",
+      "rtp_rtcp/source/fec_test_helper.h",
+      "rtp_rtcp/source/mock/mock_rtp_payload_strategy.h",
+      "rtp_rtcp/source/nack_rtx_unittest.cc",
+      "rtp_rtcp/source/packet_loss_stats_unittest.cc",
+      "rtp_rtcp/source/producer_fec_unittest.cc",
+      "rtp_rtcp/source/receive_statistics_unittest.cc",
+      "rtp_rtcp/source/remote_ntp_time_estimator_unittest.cc",
+      "rtp_rtcp/source/rtcp_format_remb_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/app_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/bye_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/common_header_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/compound_packet_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/dlrr_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/extended_jitter_report_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/extended_reports_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/fir_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/nack_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/pli_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/rapid_resync_request_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/receiver_report_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/remb_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/report_block_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/rpsi_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/rrtr_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/sdes_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/sender_report_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/sli_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/tmmbn_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/tmmbr_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/transport_feedback_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet/voip_metric_unittest.cc",
+      "rtp_rtcp/source/rtcp_packet_unittest.cc",
+      "rtp_rtcp/source/rtcp_receiver_unittest.cc",
+      "rtp_rtcp/source/rtcp_sender_unittest.cc",
+      "rtp_rtcp/source/rtcp_utility_unittest.cc",
+      "rtp_rtcp/source/rtp_fec_unittest.cc",
+      "rtp_rtcp/source/rtp_format_h264_unittest.cc",
+      "rtp_rtcp/source/rtp_format_vp8_test_helper.cc",
+      "rtp_rtcp/source/rtp_format_vp8_test_helper.h",
+      "rtp_rtcp/source/rtp_format_vp8_unittest.cc",
+      "rtp_rtcp/source/rtp_format_vp9_unittest.cc",
+      "rtp_rtcp/source/rtp_header_extension_unittest.cc",
+      "rtp_rtcp/source/rtp_packet_history_unittest.cc",
+      "rtp_rtcp/source/rtp_packet_unittest.cc",
+      "rtp_rtcp/source/rtp_payload_registry_unittest.cc",
+      "rtp_rtcp/source/rtp_rtcp_impl_unittest.cc",
+      "rtp_rtcp/source/rtp_sender_unittest.cc",
+      "rtp_rtcp/source/time_util_unittest.cc",
+      "rtp_rtcp/source/vp8_partition_aggregator_unittest.cc",
+      "rtp_rtcp/test/testAPI/test_api.cc",
+      "rtp_rtcp/test/testAPI/test_api.h",
+      "rtp_rtcp/test/testAPI/test_api_audio.cc",
+      "rtp_rtcp/test/testAPI/test_api_rtcp.cc",
+      "rtp_rtcp/test/testAPI/test_api_video.cc",
+      "utility/source/audio_frame_operations_unittest.cc",
+      "utility/source/file_player_unittests.cc",
+      "utility/source/process_thread_impl_unittest.cc",
+      "video_coding/codecs/test/packet_manipulator_unittest.cc",
+      "video_coding/codecs/test/stats_unittest.cc",
+      "video_coding/codecs/test/videoprocessor_unittest.cc",
+      "video_coding/codecs/vp8/default_temporal_layers_unittest.cc",
+      "video_coding/codecs/vp8/reference_picture_selection_unittest.cc",
+      "video_coding/codecs/vp8/screenshare_layers_unittest.cc",
+      "video_coding/codecs/vp8/simulcast_encoder_adapter_unittest.cc",
+      "video_coding/codecs/vp8/simulcast_unittest.cc",
+      "video_coding/codecs/vp8/simulcast_unittest.h",
+      "video_coding/decoding_state_unittest.cc",
+      "video_coding/frame_buffer2_unittest.cc",
+      "video_coding/histogram_unittest.cc",
+      "video_coding/include/mock/mock_vcm_callbacks.h",
+      "video_coding/jitter_buffer_unittest.cc",
+      "video_coding/jitter_estimator_tests.cc",
+      "video_coding/media_optimization_unittest.cc",
+      "video_coding/nack_module_unittest.cc",
+      "video_coding/percentile_filter_unittest.cc",
+      "video_coding/protection_bitrate_calculator_unittest.cc",
+      "video_coding/receiver_unittest.cc",
+      "video_coding/sequence_number_util_unittest.cc",
+      "video_coding/session_info_unittest.cc",
+      "video_coding/test/stream_generator.cc",
+      "video_coding/test/stream_generator.h",
+      "video_coding/timing_unittest.cc",
+      "video_coding/utility/frame_dropper_unittest.cc",
+      "video_coding/utility/h264_bitstream_parser_unittest.cc",
+      "video_coding/utility/ivf_file_writer_unittest.cc",
+      "video_coding/utility/quality_scaler_unittest.cc",
+      "video_coding/video_coding_robustness_unittest.cc",
+      "video_coding/video_packet_buffer_unittest.cc",
+      "video_coding/video_receiver_unittest.cc",
+      "video_coding/video_sender_unittest.cc",
+      "video_processing/test/denoiser_test.cc",
+      "video_processing/test/video_processing_unittest.cc",
+      "video_processing/test/video_processing_unittest.h",
+    ]
+
+    if (rtc_libvpx_build_vp9) {
+      sources +=
+          [ "video_coding/codecs/vp9/vp9_screenshare_layers_unittest.cc" ]
+    }
+
+    if (rtc_desktop_capture_supported || is_android) {
+      deps += [ "desktop_capture" ]
+      sources += [
+        "desktop_capture/desktop_region_unittest.cc",
+        "desktop_capture/differ_block_unittest.cc",
+        "desktop_capture/differ_unittest.cc",
+      ]
+    }
+
+    if (rtc_desktop_capture_supported) {
+      deps += [ "desktop_capture" ]
+      sources += [
+        "desktop_capture/desktop_and_cursor_composer_unittest.cc",
+        "desktop_capture/mouse_cursor_monitor_unittest.cc",
+        "desktop_capture/screen_capturer_helper_unittest.cc",
+        "desktop_capture/screen_capturer_mac_unittest.cc",
+        "desktop_capture/screen_capturer_mock_objects.h",
+        "desktop_capture/screen_capturer_unittest.cc",
+        "desktop_capture/win/cursor_unittest.cc",
+        "desktop_capture/win/cursor_unittest_resources.h",
+        "desktop_capture/win/cursor_unittest_resources.rc",
+        "desktop_capture/window_capturer_unittest.cc",
+      ]
+    }
+
+    if (rtc_prefer_fixed_point) {
+      defines += [ "WEBRTC_AUDIOPROC_FIXED_PROFILE" ]
+    } else {
+      defines += [ "WEBRTC_AUDIOPROC_FLOAT_PROFILE" ]
+    }
+
+    if (rtc_enable_protobuf) {
+      defines += [
+        "WEBRTC_AUDIOPROC_DEBUG_DUMP",
+        "WEBRTC_NETEQ_UNITTEST_BITEXACT",
+      ]
+      deps += [
+        "audio_coding:neteq_unittest_proto",
+        "audio_processing:audioproc_protobuf_utils",
+        "audio_processing:audioproc_unittest_proto",
+      ]
+      sources += [
+        "audio_processing/audio_processing_impl_locking_unittest.cc",
+        "audio_processing/audio_processing_impl_unittest.cc",
+        "audio_processing/audio_processing_unittest.cc",
+        "audio_processing/echo_cancellation_bit_exact_unittest.cc",
+        "audio_processing/echo_control_mobile_unittest.cc",
+        "audio_processing/gain_control_unittest.cc",
+        "audio_processing/high_pass_filter_unittest.cc",
+        "audio_processing/level_estimator_unittest.cc",
+        "audio_processing/noise_suppression_unittest.cc",
+        "audio_processing/test/audio_buffer_tools.cc",
+        "audio_processing/test/audio_buffer_tools.h",
+        "audio_processing/test/bitexactness_tools.cc",
+        "audio_processing/test/bitexactness_tools.h",
+        "audio_processing/test/debug_dump_replayer.cc",
+        "audio_processing/test/debug_dump_replayer.h",
+        "audio_processing/test/debug_dump_test.cc",
+        "audio_processing/test/test_utils.h",
+        "audio_processing/voice_detection_unittest.cc",
+      ]
+    }
+
+    if (rtc_build_libvpx) {
+      deps += [ rtc_libvpx_dir ]
+    }
+
+    configs += [ "..:common_config" ]
+    public_configs = [ "..:common_inherited_config" ]
+
+    # TODO(jschuh): bugs.webrtc.org/1348: fix this warning.
+    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
+
+    if (is_clang) {
+      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
+      configs -= [ "//build/config/clang:find_bad_constructs" ]
+    }
+
+    if (is_win) {
+      cflags = [
+        # TODO(kjellander): bugs.webrtc.org/261: Fix this warning.
+        "/wd4373",  # virtual function override.
+      ]
+    }
+
+    deps += [
+      "..:webrtc_common",
+      "../base:rtc_base",  # TODO(kjellander): Cleanup in bugs.webrtc.org/3806.
+      "../common_audio",
+      "../common_video",
+      "../system_wrappers:system_wrappers",
+      "../test:rtp_test_utils",
+      "../test:test_common",
+      "../test:test_support_main",
+      "../test:test_support_main",
+      "../test:video_test_common",
+      "../tools:agc_test_utils",
+      "audio_coding",
+      "audio_coding:acm_receive_test",
+      "audio_coding:acm_send_test",
+      "audio_coding:builtin_audio_decoder_factory",
+      "audio_coding:cng",
+      "audio_coding:isac_fix",
+      "audio_coding:neteq",
+      "audio_coding:neteq_test_support",
+      "audio_coding:neteq_unittest_tools",
+      "audio_coding:pcm16b",
+      "audio_coding:red",
+      "audio_coding:webrtc_opus",
+      "audio_conference_mixer",
+      "audio_device",
+      "audio_processing",
+      "audio_processing:audioproc_test_utils",
+      "bitrate_controller",
+      "media_file",
+      "pacing",
+      "remote_bitrate_estimator",
+      "remote_bitrate_estimator:bwe_simulator",
+      "rtp_rtcp",
+      "utility",
+      "video_capture",
+      "video_coding",
+      "video_coding:video_codecs_test_framework",
+      "video_coding:webrtc_vp8",
+      "video_coding:webrtc_vp9",
+      "video_processing",
+      "//testing/gmock",
+      "//testing/gtest",
+      "//third_party/gflags",
+    ]
+
+    if (is_android) {
+      deps += [ "//testing/android/native_test:native_test_support" ]
+
+      # Need to disable error due to the line in
+      # base/android/jni_android.h triggering it:
+      # const BASE_EXPORT jobject GetApplicationContext()
+      # error: type qualifiers ignored on function return type
+      cflags = [ "-Wno-ignored-qualifiers" ]
+      sources += [
+        "audio_device/android/audio_device_unittest.cc",
+        "audio_device/android/audio_manager_unittest.cc",
+        "audio_device/android/ensure_initialized.cc",
+        "audio_device/android/ensure_initialized.h",
+      ]
+
+      # This needs to be kept in sync with the .isolate file.
+      # TODO(kjellander); Move this to android_assets targets instead.
+      data = [
+        "//data/audio_processing/output_data_fixed.pb",
+        "//data/audio_processing/output_data_float.pb",
+        "//data/audio_processing/output_data_mac.pb",
+        "//data/voice_engine/audio_tiny48.wav",
+        "//resources/att-downlink.rx",
+        "//resources/att-uplink.rx",
+        "//resources/audio_coding/neteq_opus.rtp",
+        "//resources/audio_coding/neteq_universal_new.rtp",
+        "//resources/audio_coding/speech_mono_16kHz.pcm",
+        "//resources/audio_coding/speech_mono_32_48kHz.pcm",
+        "//resources/audio_coding/testfile32kHz.pcm",
+        "//resources/audio_coding/teststereo32kHz.pcm",
+        "//resources/audio_device/audio_short16.pcm",
+        "//resources/audio_device/audio_short44.pcm",
+        "//resources/audio_device/audio_short48.pcm",
+        "//resources/audio_processing/agc/agc_audio.pcm",
+        "//resources/audio_processing/agc/agc_no_circular_buffer.dat",
+        "//resources/audio_processing/agc/agc_pitch_gain.dat",
+        "//resources/audio_processing/agc/agc_pitch_lag.dat",
+        "//resources/audio_processing/agc/agc_spectral_peak.dat",
+        "//resources/audio_processing/agc/agc_vad.dat",
+        "//resources/audio_processing/agc/agc_voicing_prob.dat",
+        "//resources/audio_processing/agc/agc_with_circular_buffer.dat",
+        "//resources/audio_processing/transient/ajm-macbook-1-spke16m.pcm",
+        "//resources/audio_processing/transient/audio16kHz.pcm",
+        "//resources/audio_processing/transient/audio32kHz.pcm",
+        "//resources/audio_processing/transient/audio48kHz.pcm",
+        "//resources/audio_processing/transient/audio8kHz.pcm",
+        "//resources/audio_processing/transient/detect16kHz.dat",
+        "//resources/audio_processing/transient/detect32kHz.dat",
+        "//resources/audio_processing/transient/detect48kHz.dat",
+        "//resources/audio_processing/transient/detect8kHz.dat",
+        "//resources/audio_processing/transient/double-utils.dat",
+        "//resources/audio_processing/transient/float-utils.dat",
+        "//resources/audio_processing/transient/suppressed16kHz.pcm",
+        "//resources/audio_processing/transient/suppressed32kHz.pcm",
+        "//resources/audio_processing/transient/suppressed8kHz.pcm",
+        "//resources/audio_processing/transient/wpd0.dat",
+        "//resources/audio_processing/transient/wpd1.dat",
+        "//resources/audio_processing/transient/wpd2.dat",
+        "//resources/audio_processing/transient/wpd3.dat",
+        "//resources/audio_processing/transient/wpd4.dat",
+        "//resources/audio_processing/transient/wpd5.dat",
+        "//resources/audio_processing/transient/wpd6.dat",
+        "//resources/audio_processing/transient/wpd7.dat",
+        "//resources/deflicker_before_cif_short.yuv",
+        "//resources/far16_stereo.pcm",
+        "//resources/far32_stereo.pcm",
+        "//resources/far44_stereo.pcm",
+        "//resources/far48_stereo.pcm",
+        "//resources/far8_stereo.pcm",
+        "//resources/foremanColorEnhanced_cif_short.yuv",
+        "//resources/foreman_cif.yuv",
+        "//resources/foreman_cif_short.yuv",
+        "//resources/near16_stereo.pcm",
+        "//resources/near32_stereo.pcm",
+        "//resources/near44_stereo.pcm",
+        "//resources/near48_stereo.pcm",
+        "//resources/near8_stereo.pcm",
+        "//resources/ref03.aecdump",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke1_0_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke1_0_TOF.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke1_1_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke1_1_TOF.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke2_0_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke2_0_TOF.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke2_1_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke2_1_TOF.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingDelay1_0_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingDelay1_0_TOF.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingLoss1_0_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingLoss1_0_TOF.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_Multi1_1_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_Multi1_1_TOF.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyChoke_0_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyChoke_0_TOF.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyChoke_1_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyChoke_1_TOF.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyDelay_0_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyDelay_0_TOF.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyLoss_0_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyLoss_0_TOF.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_UnlimitedSpeed_0_AST.bin",
+        "//resources/remote_bitrate_estimator/VideoSendersTest_BweTest_UnlimitedSpeed_0_TOF.bin",
+        "//resources/short_mixed_mono_48.dat",
+        "//resources/short_mixed_mono_48_arm.dat",
+        "//resources/short_mixed_mono_48.pcm",
+        "//resources/short_mixed_stereo_48.dat",
+        "//resources/short_mixed_stereo_48.pcm",
+        "//resources/sprint-downlink.rx",
+        "//resources/sprint-uplink.rx",
+        "//resources/synthetic-trace.rx",
+        "//resources/tmobile-downlink.rx",
+        "//resources/tmobile-uplink.rx",
+        "//resources/utility/encapsulated_pcm16b_8khz.wav",
+        "//resources/utility/encapsulated_pcmu_8khz.wav",
+        "//resources/verizon3g-downlink.rx",
+        "//resources/verizon3g-uplink.rx",
+        "//resources/verizon4g-downlink.rx",
+        "//resources/verizon4g-uplink.rx",
+      ]
+    }
+
+    if (is_ios) {
+      configs += [
+        "..:common_objc",
+        "//build/config/compiler:enable_arc",
+      ]
+
+      sources += [
+        "audio_device/ios/audio_device_unittest_ios.cc",
+        "audio_device/ios/objc/RTCAudioSessionTest.mm",
+        "video_coding/codecs/h264/h264_video_toolbox_nalu_unittest.cc",
+      ]
+
+      ldflags = [ "-ObjC" ]
+
+      # TODO(kjellander): Mac bundle files.
+    }
+  }
+}
diff --git a/modules/audio_coding/BUILD.gn b/modules/audio_coding/BUILD.gn
index f072f31..d2c09a3 100644
--- a/modules/audio_coding/BUILD.gn
+++ b/modules/audio_coding/BUILD.gn
@@ -6,38 +6,39 @@
 # 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/arm.gni")
 import("../../build/webrtc.gni")
+import("audio_coding.gni")
+import("//build/config/arm.gni")
+import("//testing/test.gni")
+import("//third_party/protobuf/proto_library.gni")
 
 audio_codec_deps = [
   ":cng",
   ":g711",
   ":pcm16b",
 ]
-audio_codec_defines = []
 if (rtc_include_ilbc) {
-  audio_codec_defines += [ "WEBRTC_CODEC_ILBC" ]
   audio_codec_deps += [ ":ilbc" ]
 }
 if (rtc_include_opus) {
-  audio_codec_defines += [ "WEBRTC_CODEC_OPUS" ]
   audio_codec_deps += [ ":webrtc_opus" ]
 }
 if (!build_with_mozilla) {
   if (current_cpu == "arm") {
-    audio_codec_defines += [ "WEBRTC_CODEC_ISACFX" ]
     audio_codec_deps += [ ":isac_fix" ]
   } else {
-    audio_codec_defines += [ "WEBRTC_CODEC_ISAC" ]
     audio_codec_deps += [ ":isac" ]
   }
-  audio_codec_defines += [ "WEBRTC_CODEC_G722" ]
   audio_codec_deps += [ ":g722" ]
 }
 if (!build_with_mozilla && !build_with_chromium) {
-  audio_codec_defines += [ "WEBRTC_CODEC_RED" ]
   audio_codec_deps += [ ":red" ]
 }
+audio_coding_deps = audio_codec_deps + [
+                      "../..:webrtc_common",
+                      "../../common_audio",
+                      "../../system_wrappers",
+                    ]
 
 source_set("audio_decoder_factory_interface") {
   sources = [
@@ -115,6 +116,12 @@
     ":audio_coding_config",
   ]
 
+  if (rtc_include_opus) {
+    public_deps = [
+      ":webrtc_opus",
+    ]
+  }
+
   if (is_win) {
     cflags = [
       # TODO(kjellander): Bug 261: fix this warning.
@@ -123,20 +130,16 @@
   }
 
   if (is_clang) {
-    # Suppress warnings from Chrome's Clang plugins.
-    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
+    # Suppress warnings from the Chromium Clang plugins (bugs.webrtc.org/163).
     configs -= [ "//build/config/clang:find_bad_constructs" ]
   }
 
-  deps = audio_codec_deps + [
+  deps = audio_coding_deps + [
            ":neteq",
            ":rent_a_codec",
            "../..:rtc_event_log",
-           "../..:webrtc_common",
-           "../../common_audio",
-           "../../system_wrappers",
          ]
-  defines = audio_codec_defines
+  defines = audio_coding_defines
 }
 
 source_set("audio_decoder_interface") {
@@ -887,3 +890,136 @@
     deps += [ ":g722" ]
   }
 }
+
+if (rtc_include_tests) {
+  source_set("acm_receive_test") {
+    testonly = true
+    sources = [
+      "acm2/acm_receive_test_oldapi.cc",
+      "acm2/acm_receive_test_oldapi.h",
+    ]
+
+    configs += [ "../..:common_config" ]
+    public_configs = [ "../..:common_inherited_config" ]
+
+    if (is_clang) {
+      # Suppress warnings from the Chromium Clang plugins (bugs.webrtc.org/163).
+      configs -= [ "//build/config/clang:find_bad_constructs" ]
+    }
+
+    defines = audio_coding_defines
+
+    deps = audio_coding_deps + [
+             ":audio_coding",
+             ":neteq_unittest_tools",
+             "//testing/gtest",
+           ]
+  }
+
+  source_set("acm_send_test") {
+    testonly = true
+    sources = [
+      "acm2/acm_send_test_oldapi.cc",
+      "acm2/acm_send_test_oldapi.h",
+    ]
+
+    configs += [ "../..:common_config" ]
+    public_configs = [ "../..:common_inherited_config" ]
+
+    if (is_clang) {
+      # Suppress warnings from the Chromium Clang plugins (bugs.webrtc.org/163).
+      configs -= [ "//build/config/clang:find_bad_constructs" ]
+    }
+
+    defines = audio_coding_defines
+
+    deps = audio_coding_deps + [
+             ":audio_coding",
+             ":neteq_unittest_tools",
+             "//testing/gtest",
+           ]
+  }
+
+  if (rtc_enable_protobuf) {
+    proto_library("neteq_unittest_proto") {
+      sources = [
+        "neteq/neteq_unittest.proto",
+      ]
+      proto_out_dir = "webrtc/audio_coding/neteq"
+    }
+  }
+
+  source_set("neteq_test_support") {
+    testonly = true
+    sources = [
+      "neteq/tools/neteq_external_decoder_test.cc",
+      "neteq/tools/neteq_external_decoder_test.h",
+      "neteq/tools/neteq_performance_test.cc",
+      "neteq/tools/neteq_performance_test.h",
+      "neteq/tools/neteq_quality_test.cc",
+      "neteq/tools/neteq_quality_test.h",
+    ]
+
+    configs += [ "../..:common_config" ]
+    public_configs = [ "../..:common_inherited_config" ]
+
+    if (is_clang) {
+      # Suppress warnings from the Chromium Clang plugins (bugs.webrtc.org/163).
+      configs -= [ "//build/config/clang:find_bad_constructs" ]
+    }
+
+    deps = [
+      ":neteq",
+      ":neteq_unittest_tools",
+      ":pcm16b",
+      "//testing/gtest",
+      "//third_party/gflags",
+    ]
+  }
+
+  config("neteq_unittest_tools_config") {
+    include_dirs = [ "tools" ]
+  }
+
+  source_set("neteq_unittest_tools") {
+    testonly = true
+    sources = [
+      "neteq/tools/audio_checksum.h",
+      "neteq/tools/audio_loop.cc",
+      "neteq/tools/audio_loop.h",
+      "neteq/tools/audio_sink.h",
+      "neteq/tools/constant_pcm_packet_source.cc",
+      "neteq/tools/constant_pcm_packet_source.h",
+      "neteq/tools/input_audio_file.cc",
+      "neteq/tools/input_audio_file.h",
+      "neteq/tools/output_audio_file.h",
+      "neteq/tools/output_wav_file.h",
+      "neteq/tools/packet.cc",
+      "neteq/tools/packet.h",
+      "neteq/tools/packet_source.h",
+      "neteq/tools/resample_input_audio_file.cc",
+      "neteq/tools/resample_input_audio_file.h",
+      "neteq/tools/rtp_file_source.cc",
+      "neteq/tools/rtp_file_source.h",
+      "neteq/tools/rtp_generator.cc",
+      "neteq/tools/rtp_generator.h",
+    ]
+
+    configs += [ "../..:common_config" ]
+    public_configs = [
+      "../..:common_inherited_config",
+      ":neteq_unittest_tools_config",
+    ]
+
+    if (is_clang) {
+      # Suppress warnings from the Chromium Clang plugins (bugs.webrtc.org/163).
+      configs -= [ "//build/config/clang:find_bad_constructs" ]
+    }
+
+    deps = [
+      "../../common_audio",
+      "../../test:rtp_test_utils",
+      "../rtp_rtcp",
+    ]
+  }
+}
diff --git a/modules/audio_coding/audio_coding.gni b/modules/audio_coding/audio_coding.gni
new file mode 100644
index 0000000..d346d47
--- /dev/null
+++ b/modules/audio_coding/audio_coding.gni
@@ -0,0 +1,30 @@
+# 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("../../build/webrtc.gni")
+
+audio_codec_defines = []
+if (rtc_include_ilbc) {
+  audio_codec_defines += [ "WEBRTC_CODEC_ILBC" ]
+}
+if (rtc_include_opus) {
+  audio_codec_defines += [ "WEBRTC_CODEC_OPUS" ]
+}
+if (!build_with_mozilla) {
+  if (current_cpu == "arm") {
+    audio_codec_defines += [ "WEBRTC_CODEC_ISACFX" ]
+  } else {
+    audio_codec_defines += [ "WEBRTC_CODEC_ISAC" ]
+  }
+  audio_codec_defines += [ "WEBRTC_CODEC_G722" ]
+}
+if (!build_with_mozilla && !build_with_chromium) {
+  audio_codec_defines += [ "WEBRTC_CODEC_RED" ]
+}
+
+audio_coding_defines = audio_codec_defines
diff --git a/modules/audio_device/BUILD.gn b/modules/audio_device/BUILD.gn
index b8aadee..92061a2 100644
--- a/modules/audio_device/BUILD.gn
+++ b/modules/audio_device/BUILD.gn
@@ -140,7 +140,9 @@
       ]
     }
     if (is_ios) {
-      deps += [ "../../sdk:rtc_sdk_common_objc" ]
+      public_deps = [
+        "../../sdk:rtc_sdk_common_objc",
+      ]
       sources += [
         "ios/audio_device_ios.h",
         "ios/audio_device_ios.mm",
@@ -157,7 +159,7 @@
         "ios/voice_processing_audio_unit.h",
         "ios/voice_processing_audio_unit.mm",
       ]
-      cflags += [ "-fobjc-arc" ]  # CLANG_ENABLE_OBJC_ARC = YES.
+      configs += [ "//build/config/compiler:enable_arc" ]
 
       libs = [
         "AudioToolbox.framework",
diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn
index e249c85..037e6bb 100644
--- a/modules/audio_processing/BUILD.gn
+++ b/modules/audio_processing/BUILD.gn
@@ -211,8 +211,7 @@
   configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
 
   if (is_clang) {
-    # Suppress warnings from Chrome's Clang plugins.
-    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
+    # Suppress warnings from the Chromium Clang plugins (bugs.webrtc.org/163).
     configs -= [ "//build/config/clang:find_bad_constructs" ]
   }
 
@@ -295,3 +294,46 @@
     }
   }
 }
+
+if (rtc_include_tests) {
+  source_set("audioproc_test_utils") {
+    testonly = true
+    sources = [
+      "test/test_utils.cc",
+      "test/test_utils.h",
+    ]
+
+    configs += [ "../..:common_config" ]
+    public_configs = [ "../..:common_inherited_config" ]
+
+    if (is_clang) {
+      # Suppress warnings from the Chromium Clang plugins (bugs.webrtc.org/163).
+      configs -= [ "//build/config/clang:find_bad_constructs" ]
+    }
+
+    deps = [
+      "../../base:rtc_base_approved",
+      "../../common_audio",
+    ]
+  }
+
+  if (rtc_enable_protobuf) {
+    proto_library("audioproc_unittest_proto") {
+      sources = [
+        "test/unittest.proto",
+      ]
+      proto_out_dir = "webrtc/modules/audio_processing"
+    }
+
+    source_set("audioproc_protobuf_utils") {
+      sources = [
+        "test/protobuf_utils.cc",
+        "test/protobuf_utils.h",
+      ]
+
+      deps = [
+        ":audioproc_unittest_proto",
+      ]
+    }
+  }
+}
diff --git a/modules/audio_processing/echo_cancellation_unittest.cc b/modules/audio_processing/echo_cancellation_bit_exact_unittest.cc
similarity index 100%
rename from modules/audio_processing/echo_cancellation_unittest.cc
rename to modules/audio_processing/echo_cancellation_bit_exact_unittest.cc
diff --git a/modules/desktop_capture/BUILD.gn b/modules/desktop_capture/BUILD.gn
index 63e43d9..6caef4d 100644
--- a/modules/desktop_capture/BUILD.gn
+++ b/modules/desktop_capture/BUILD.gn
@@ -138,7 +138,7 @@
 
   deps = [
     ":primitives",
-    "../../base:rtc_base_approved",
+    "../../base:rtc_base",  # TODO(kjellander): Cleanup in bugs.webrtc.org/3806.
     "../../system_wrappers",
   ]
 
diff --git a/modules/modules.gyp b/modules/modules.gyp
index efdc817..5e38028 100644
--- a/modules/modules.gyp
+++ b/modules/modules.gyp
@@ -151,6 +151,7 @@
             '<(DEPTH)/testing/gmock.gyp:gmock',
             '<(DEPTH)/testing/gtest.gyp:gtest',
             '<(DEPTH)/third_party/gflags/gflags.gyp:gflags',
+            '<(webrtc_root)/base/base.gyp:rtc_base',
             '<(webrtc_root)/common.gyp:webrtc_common',
             '<(webrtc_root)/common_audio/common_audio.gyp:common_audio',
             '<(webrtc_root)/common_video/common_video.gyp:common_video',
@@ -392,7 +393,7 @@
           'conditions': [
             ['libvpx_build_vp9==1', {
               'sources': [
-                'video_coding/codecs/vp9/screenshare_layers_unittest.cc',
+                'video_coding/codecs/vp9/vp9_screenshare_layers_unittest.cc',
               ],
             }],
             ['enable_bwe_test_logging==1', {
@@ -445,8 +446,8 @@
                 'audio_processing/audio_processing_impl_locking_unittest.cc',
                 'audio_processing/audio_processing_impl_unittest.cc',
                 'audio_processing/audio_processing_unittest.cc',
+                'audio_processing/echo_cancellation_bit_exact_unittest.cc',
                 'audio_processing/echo_control_mobile_unittest.cc',
-                'audio_processing/echo_cancellation_unittest.cc',
                 'audio_processing/gain_control_unittest.cc',
                 'audio_processing/high_pass_filter_unittest.cc',
                 'audio_processing/level_estimator_unittest.cc',
diff --git a/modules/remote_bitrate_estimator/BUILD.gn b/modules/remote_bitrate_estimator/BUILD.gn
index 703bffa..7dcf236 100644
--- a/modules/remote_bitrate_estimator/BUILD.gn
+++ b/modules/remote_bitrate_estimator/BUILD.gn
@@ -6,6 +6,9 @@
 # in the file PATENTS.  All contributing project authors may
 # be found in the AUTHORS file in the root of the source tree.
 
+import("../../build/webrtc.gni")
+import("//testing/test.gni")
+
 declare_args() {
   # Set this to true to enable BWE test logging.
   rtc_enable_bwe_test_logging = false
@@ -47,8 +50,7 @@
   public_configs = [ "../..:common_inherited_config" ]
 
   if (is_clang) {
-    # Suppress warnings from Chrome's Clang plugins.
-    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
+    # Suppress warnings from the Chromium Clang plugins (bugs.webrtc.org/163).
     configs -= [ "//build/config/clang:find_bad_constructs" ]
   }
 
@@ -58,3 +60,66 @@
     "../../system_wrappers",
   ]
 }
+
+if (rtc_include_tests) {
+  source_set("bwe_simulator") {
+    testonly = true
+    sources = [
+      "test/bwe.cc",
+      "test/bwe.h",
+      "test/bwe_test.cc",
+      "test/bwe_test.h",
+      "test/bwe_test_baselinefile.cc",
+      "test/bwe_test_baselinefile.h",
+      "test/bwe_test_fileutils.cc",
+      "test/bwe_test_fileutils.h",
+      "test/bwe_test_framework.cc",
+      "test/bwe_test_framework.h",
+      "test/bwe_test_logging.h",
+      "test/estimators/nada.cc",
+      "test/estimators/nada.h",
+      "test/estimators/remb.cc",
+      "test/estimators/remb.h",
+      "test/estimators/send_side.cc",
+      "test/estimators/send_side.h",
+      "test/estimators/tcp.cc",
+      "test/estimators/tcp.h",
+      "test/metric_recorder.cc",
+      "test/metric_recorder.h",
+      "test/packet.h",
+      "test/packet_receiver.cc",
+      "test/packet_receiver.h",
+      "test/packet_sender.cc",
+      "test/packet_sender.h",
+    ]
+
+    if (rtc_enable_bwe_test_logging) {
+      defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=1" ]
+      sources += [ "test/bwe_test_logging.cc" ]
+    } else {
+      defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=0" ]
+    }
+
+    configs += [ "../..:common_config" ]
+    public_configs = [ "../..:common_inherited_config" ]
+
+    if (is_clang) {
+      # Suppress warnings from the Chromium Clang plugins (bugs.webrtc.org/163).
+      configs -= [ "//build/config/clang:find_bad_constructs" ]
+    }
+
+    if (is_win) {
+      cflags = [
+        # TODO(kjellander): Bug 261: fix this warning.
+        "/wd4373",  # virtual function override.
+      ]
+    }
+
+    deps = [
+      "../../test:test_support",
+      "../pacing",
+      "//testing/gmock",
+      "//testing/gtest",
+    ]
+  }
+}
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimator.gypi b/modules/remote_bitrate_estimator/remote_bitrate_estimator.gypi
index b041eca..9978beb 100644
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimator.gypi
+++ b/modules/remote_bitrate_estimator/remote_bitrate_estimator.gypi
@@ -64,6 +64,8 @@
           'target_name': 'bwe_simulator',
           'type': 'static_library',
           'dependencies': [
+            '<(webrtc_root)/modules/modules.gyp:paced_sender',
+            '<(webrtc_root)/test/test.gyp:test_support',
             '<(DEPTH)/testing/gtest.gyp:gtest',
             '<(DEPTH)/testing/gmock.gyp:gmock',
           ],
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index 7b11384..30d0f11 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -308,3 +308,33 @@
     deps += [ rtc_libvpx_dir ]
   }
 }
+
+if (rtc_include_tests) {
+  source_set("video_codecs_test_framework") {
+    testonly = true
+    sources = [
+      "codecs/test/mock/mock_packet_manipulator.h",
+      "codecs/test/packet_manipulator.cc",
+      "codecs/test/packet_manipulator.h",
+      "codecs/test/predictive_packet_manipulator.cc",
+      "codecs/test/predictive_packet_manipulator.h",
+      "codecs/test/stats.cc",
+      "codecs/test/stats.h",
+      "codecs/test/videoprocessor.cc",
+      "codecs/test/videoprocessor.h",
+    ]
+
+    configs += [ "../..:common_config" ]
+    public_configs = [ "../..:common_inherited_config" ]
+
+    if (is_clang) {
+      # 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" ]
+    }
+
+    deps = [
+      "../../test:test_support",
+    ]
+  }
+}
diff --git a/modules/video_coding/codecs/vp9/screenshare_layers_unittest.cc b/modules/video_coding/codecs/vp9/vp9_screenshare_layers_unittest.cc
similarity index 100%
rename from modules/video_coding/codecs/vp9/screenshare_layers_unittest.cc
rename to modules/video_coding/codecs/vp9/vp9_screenshare_layers_unittest.cc