diff --git a/base/BUILD.gn b/base/BUILD.gn
deleted file mode 100644
index 28542b2..0000000
--- a/base/BUILD.gn
+++ /dev/null
@@ -1,3164 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# HOW TO WRITE CONDITIONALS IN THIS FILE
-# ======================================
-#
-# In many other places, one would write a conditional that expresses all the
-# cases when a source file is used or unused, and then either add or subtract
-# it from the sources list in that case
-#
-# Since base includes so many low-level things that vary widely and
-# unpredictably for the various build types, we prefer a slightly different
-# style. Instead, there are big per-platform blocks of inclusions and
-# exclusions. If a given file has an inclusion or exclusion rule that applies
-# for multiple conditions, prefer to duplicate it in both lists. This makes it
-# a bit easier to see which files apply in which cases rather than having a
-# huge sequence of random-looking conditionals.
-
-import("//build/buildflag_header.gni")
-import("//build/config/allocator.gni")
-import("//build/config/arm.gni")
-import("//build/config/c++/c++.gni")
-import("//build/config/chromecast_build.gni")
-import("//build/config/compiler/compiler.gni")
-import("//build/config/dcheck_always_on.gni")
-import("//build/config/jumbo.gni")
-import("//build/config/nacl/config.gni")
-import("//build/config/sysroot.gni")
-import("//build/config/ui.gni")
-import("//build/nocompile.gni")
-import("//testing/libfuzzer/fuzzer_test.gni")
-import("//testing/test.gni")
-
-declare_args() {
-  # Override this value to give a specific build date.
-  # See //base/build_time.cc and //build/write_build_date_header.py for more
-  # details and the expected format.
-  override_build_date = "N/A"
-
-  # Indicates if the Location object contains the source code information
-  # (file, function, line). False means only the program counter (and currently
-  # file name) is saved.
-  enable_location_source = true
-
-  # Unsafe developer build. Has developer-friendly features that may weaken or
-  # disable security measures like sandboxing or ASLR.
-  # IMPORTANT: Unsafe developer builds should never be distributed to end users.
-  is_unsafe_developer_build = !is_official_build
-
-  # Set to true to disable COM init check hooks.
-  com_init_check_hook_disabled = false
-
-  # Set to true to enable mutex priority inheritance. See the comments in
-  # LockImpl::PriorityInheritanceAvailable() in lock_impl_posix.cc for the
-  # platform requirements to safely enable priority inheritance.
-  enable_mutex_priority_inheritance = false
-}
-
-# Determines whether libevent should be dep.
-dep_libevent = !is_fuchsia && !is_win && !(is_nacl && !is_nacl_nonsfi)
-
-# Determines whether message_pump_libevent should be used.
-use_libevent = dep_libevent && !is_ios
-
-if (is_android) {
-  import("//build/config/android/rules.gni")
-}
-
-if (is_fuchsia) {
-  import("//third_party/fuchsia-sdk/fidl_library.gni")
-}
-
-config("base_flags") {
-  if (is_clang) {
-    cflags = [
-      # Don't die on dtoa code that uses a char as an array index.
-      # This is required solely for base/third_party/dmg_fp/dtoa_wrapper.cc.
-      "-Wno-char-subscripts",
-
-      # Ideally all product code (but no test code) in chrome would have these
-      # flags. But this isn't trivial so start with //base as a minimum
-      # requirement.
-      # https://groups.google.com/a/chromium.org/d/topic/chromium-dev/B9Q5KTD7iCo/discussion
-      "-Wglobal-constructors",
-      "-Wexit-time-destructors",
-    ]
-  }
-}
-
-config("base_implementation") {
-  defines = [ "BASE_IMPLEMENTATION" ]
-  configs = [ "//build/config/compiler:wexit_time_destructors" ]
-}
-
-if (is_win) {
-  # This is in a separate config so the flags can be applied to dependents.
-  # ldflags in GN aren't automatically inherited.
-  config("base_win_linker_flags") {
-    ldflags = [
-      "/DELAYLOAD:cfgmgr32.dll",
-      "/DELAYLOAD:powrprof.dll",
-      "/DELAYLOAD:setupapi.dll",
-    ]
-  }
-}
-
-if (is_nacl_nonsfi) {
-  # Must be in a config because of how GN orders flags (otherwise -Wall will
-  # appear after this, and turn it back on).
-  config("nacl_nonsfi_warnings") {
-    # file_util_posix.cc contains a function which is not
-    # being used by nacl_helper_nonsfi.
-    cflags = [ "-Wno-unused-function" ]
-  }
-}
-
-if (is_android) {
-  config("android_system_libs") {
-    libs = [ "log" ]  # Used by logging.cc.
-  }
-}
-
-# Base and everything it depends on should be a static library rather than
-# a source set. Base is more of a "library" in the classic sense in that many
-# small parts of it are used in many different contexts. This combined with a
-# few static initializers floating around means that dead code stripping
-# still leaves a lot of code behind that isn't always used. For example, this
-# saves more than 40K for a smaller target like chrome_elf.
-#
-# Use static libraries for the helper stuff as well like //base/debug since
-# those things refer back to base code, which will force base compilation units
-# to be linked in where they wouldn't have otherwise. This does not include
-# test code (test support and anything in the test directory) which should use
-# source_set as is recommended for GN targets).
-jumbo_component("base") {
-  if (is_nacl_nonsfi) {
-    # TODO(phosek) bug 570839: If field_trial.cc is in a static library,
-    # nacl_helper_nonsfi doesn't link properly on Linux in debug builds. The
-    # reasons for this seem to involve obscure toolchain bugs. This should be
-    # fixed and this target should always be a static_library in the
-    # non-component case.
-    static_component_type = "source_set"
-  }
-  if (is_nacl || is_ios) {
-    # Link errors related to malloc functions if libbase for nacl is
-    # compiled with jumbo: https://crbug.com/775959.
-    # Same for ios: https://crbug.com/776313.
-    never_build_jumbo = true
-  }
-
-  sources = [
-    "allocator/allocator_check.cc",
-    "allocator/allocator_check.h",
-    "allocator/allocator_extension.cc",
-    "allocator/allocator_extension.h",
-    "allocator/allocator_interception_mac.h",
-    "allocator/allocator_interception_mac.mm",
-    "allocator/allocator_shim.h",
-    "allocator/malloc_zone_functions_mac.cc",
-    "allocator/malloc_zone_functions_mac.h",
-    "android/android_hardware_buffer_abi.h",
-    "android/android_hardware_buffer_compat.cc",
-    "android/android_hardware_buffer_compat.h",
-    "android/animation_frame_time_histogram.cc",
-    "android/apk_assets.cc",
-    "android/apk_assets.h",
-    "android/application_status_listener.cc",
-    "android/application_status_listener.h",
-    "android/base_jni_onload.cc",
-    "android/base_jni_onload.h",
-    "android/build_info.cc",
-    "android/build_info.h",
-    "android/callback_android.cc",
-    "android/callback_android.h",
-    "android/child_process_service.cc",
-    "android/command_line_android.cc",
-    "android/content_uri_utils.cc",
-    "android/content_uri_utils.h",
-    "android/cpu_features.cc",
-    "android/early_trace_event_binding.cc",
-    "android/event_log.cc",
-    "android/event_log.h",
-    "android/field_trial_list.cc",
-    "android/important_file_writer_android.cc",
-    "android/java_exception_reporter.cc",
-    "android/java_exception_reporter.h",
-    "android/java_handler_thread.cc",
-    "android/java_handler_thread.h",
-    "android/java_runtime.cc",
-    "android/java_runtime.h",
-    "android/jni_android.cc",
-    "android/jni_android.h",
-    "android/jni_array.cc",
-    "android/jni_array.h",
-    "android/jni_generator/jni_generator_helper.h",
-    "android/jni_int_wrapper.h",
-    "android/jni_registrar.cc",
-    "android/jni_registrar.h",
-    "android/jni_string.cc",
-    "android/jni_string.h",
-    "android/jni_utils.cc",
-    "android/jni_utils.h",
-    "android/jni_weak_ref.cc",
-    "android/jni_weak_ref.h",
-    "android/library_loader/anchor_functions.cc",
-    "android/library_loader/anchor_functions.h",
-    "android/library_loader/library_load_from_apk_status_codes.h",
-    "android/library_loader/library_loader_hooks.cc",
-    "android/library_loader/library_loader_hooks.h",
-    "android/library_loader/library_prefetcher.cc",
-    "android/library_loader/library_prefetcher.h",
-    "android/locale_utils.cc",
-    "android/locale_utils.h",
-    "android/memory_pressure_listener_android.cc",
-    "android/memory_pressure_listener_android.h",
-    "android/path_service_android.cc",
-    "android/path_utils.cc",
-    "android/path_utils.h",
-    "android/record_histogram.cc",
-    "android/record_user_action.cc",
-    "android/scoped_hardware_buffer_handle.cc",
-    "android/scoped_hardware_buffer_handle.h",
-    "android/scoped_java_ref.cc",
-    "android/scoped_java_ref.h",
-    "android/statistics_recorder_android.cc",
-    "android/sys_utils.cc",
-    "android/sys_utils.h",
-    "android/throw_uncaught_exception.cc",
-    "android/throw_uncaught_exception.h",
-    "android/time_utils.cc",
-    "android/timezone_utils.cc",
-    "android/timezone_utils.h",
-    "android/trace_event_binding.cc",
-    "android/unguessable_token_android.cc",
-    "android/unguessable_token_android.h",
-    "at_exit.cc",
-    "at_exit.h",
-    "atomic_ref_count.h",
-    "atomic_sequence_num.h",
-    "atomicops.h",
-    "atomicops_internals_atomicword_compat.h",
-    "atomicops_internals_portable.h",
-    "atomicops_internals_x86_msvc.h",
-    "auto_reset.h",
-    "barrier_closure.cc",
-    "barrier_closure.h",
-    "base64.cc",
-    "base64.h",
-    "base64url.cc",
-    "base64url.h",
-    "base_export.h",
-    "base_switches.h",
-    "big_endian.cc",
-    "big_endian.h",
-    "bind.h",
-    "bind_helpers.h",
-    "bind_internal.h",
-    "bit_cast.h",
-    "bits.h",
-    "build_time.cc",
-    "build_time.h",
-    "callback.h",
-    "callback_forward.h",
-    "callback_helpers.cc",
-    "callback_helpers.h",
-    "callback_internal.cc",
-    "callback_internal.h",
-    "callback_list.h",
-    "cancelable_callback.h",
-    "command_line.cc",
-    "command_line.h",
-    "compiler_specific.h",
-    "component_export.h",
-    "containers/adapters.h",
-    "containers/circular_deque.h",
-    "containers/flat_map.h",
-    "containers/flat_set.h",
-    "containers/flat_tree.h",
-    "containers/hash_tables.h",
-    "containers/id_map.h",
-    "containers/linked_list.h",
-    "containers/mru_cache.h",
-    "containers/small_map.h",
-    "containers/span.h",
-    "containers/stack.h",
-    "containers/stack_container.h",
-    "containers/unique_ptr_adapters.h",
-    "containers/vector_buffer.h",
-    "cpu.cc",
-    "cpu.h",
-    "critical_closure.h",
-    "critical_closure_internal_ios.mm",
-
-    # This file depends on files from the "debug/allocator" target,
-    # but this target does not depend on "debug/allocator".
-    "debug/activity_analyzer.cc",
-    "debug/activity_analyzer.h",
-    "debug/activity_tracker.cc",
-    "debug/activity_tracker.h",
-    "debug/alias.cc",
-    "debug/alias.h",
-    "debug/asan_invalid_access.cc",
-    "debug/asan_invalid_access.h",
-    "debug/close_handle_hook_win.cc",
-    "debug/close_handle_hook_win.h",
-    "debug/crash_logging.cc",
-    "debug/crash_logging.h",
-    "debug/debugger.cc",
-    "debug/debugger.h",
-    "debug/debugger_win.cc",
-    "debug/dump_without_crashing.cc",
-    "debug/dump_without_crashing.h",
-    "debug/gdi_debug_util_win.cc",
-    "debug/gdi_debug_util_win.h",
-    "debug/leak_annotations.h",
-    "debug/leak_tracker.h",
-    "debug/proc_maps_linux.cc",
-    "debug/proc_maps_linux.h",
-    "debug/profiler.cc",
-    "debug/profiler.h",
-    "debug/stack_trace.cc",
-    "debug/stack_trace.h",
-    "debug/stack_trace_android.cc",
-    "debug/stack_trace_win.cc",
-    "debug/task_annotator.cc",
-    "debug/task_annotator.h",
-    "debug/thread_heap_usage_tracker.cc",
-    "debug/thread_heap_usage_tracker.h",
-    "deferred_sequenced_task_runner.cc",
-    "deferred_sequenced_task_runner.h",
-    "environment.cc",
-    "environment.h",
-    "export_template.h",
-    "feature_list.cc",
-    "feature_list.h",
-    "file_descriptor_store.cc",
-    "file_descriptor_store.h",
-    "file_version_info.h",
-    "file_version_info_mac.h",
-    "file_version_info_mac.mm",
-    "file_version_info_win.cc",
-    "file_version_info_win.h",
-    "files/dir_reader_fallback.h",
-    "files/dir_reader_linux.h",
-    "files/file.cc",
-    "files/file.h",
-    "files/file_enumerator.cc",
-    "files/file_enumerator.h",
-    "files/file_enumerator_win.cc",
-    "files/file_path.cc",
-    "files/file_path.h",
-    "files/file_path_constants.cc",
-    "files/file_path_watcher.cc",
-    "files/file_path_watcher.h",
-    "files/file_path_watcher_fsevents.cc",
-    "files/file_path_watcher_fsevents.h",
-    "files/file_path_watcher_kqueue.cc",
-    "files/file_path_watcher_kqueue.h",
-    "files/file_path_watcher_linux.cc",
-    "files/file_path_watcher_mac.cc",
-    "files/file_path_watcher_win.cc",
-    "files/file_proxy.cc",
-    "files/file_proxy.h",
-    "files/file_tracing.cc",
-    "files/file_tracing.h",
-    "files/file_util.cc",
-    "files/file_util.h",
-    "files/file_util_android.cc",
-    "files/file_util_linux.cc",
-    "files/file_util_mac.mm",
-    "files/file_util_win.cc",
-    "files/file_win.cc",
-    "files/important_file_writer.cc",
-    "files/important_file_writer.h",
-    "files/memory_mapped_file.cc",
-    "files/memory_mapped_file.h",
-    "files/memory_mapped_file_win.cc",
-    "files/platform_file.h",
-    "files/scoped_file.cc",
-    "files/scoped_file.h",
-    "files/scoped_temp_dir.cc",
-    "files/scoped_temp_dir.h",
-    "format_macros.h",
-    "gtest_prod_util.h",
-    "guid.cc",
-    "guid.h",
-    "hash.cc",
-    "hash.h",
-    "ios/block_types.h",
-    "ios/crb_protocol_observers.h",
-    "ios/crb_protocol_observers.mm",
-    "ios/device_util.h",
-    "ios/device_util.mm",
-    "ios/ios_util.h",
-    "ios/ios_util.mm",
-    "ios/ns_error_util.h",
-    "ios/ns_error_util.mm",
-    "ios/scoped_critical_action.h",
-    "ios/scoped_critical_action.mm",
-    "ios/weak_nsobject.h",
-    "ios/weak_nsobject.mm",
-    "json/json_file_value_serializer.cc",
-    "json/json_file_value_serializer.h",
-    "json/json_parser.cc",
-    "json/json_parser.h",
-    "json/json_reader.cc",
-    "json/json_reader.h",
-    "json/json_string_value_serializer.cc",
-    "json/json_string_value_serializer.h",
-    "json/json_value_converter.cc",
-    "json/json_value_converter.h",
-    "json/json_writer.cc",
-    "json/json_writer.h",
-    "json/string_escape.cc",
-    "json/string_escape.h",
-    "lazy_instance.h",
-    "lazy_instance_helpers.cc",
-    "lazy_instance_helpers.h",
-    "linux_util.cc",
-    "linux_util.h",
-    "location.cc",
-    "location.h",
-    "logging.cc",
-    "logging.h",
-    "logging_win.cc",
-    "logging_win.h",
-    "mac/authorization_util.h",
-    "mac/authorization_util.mm",
-    "mac/availability.h",
-    "mac/bind_objc_block.h",
-    "mac/bundle_locations.h",
-    "mac/bundle_locations.mm",
-    "mac/call_with_eh_frame.cc",
-    "mac/call_with_eh_frame.h",
-    "mac/call_with_eh_frame_asm.S",
-    "mac/close_nocancel.cc",
-    "mac/dispatch_source_mach.cc",
-    "mac/dispatch_source_mach.h",
-    "mac/foundation_util.h",
-    "mac/foundation_util.mm",
-    "mac/launch_services_util.h",
-    "mac/launch_services_util.mm",
-    "mac/launchd.cc",
-    "mac/launchd.h",
-    "mac/mac_logging.h",
-    "mac/mac_logging.mm",
-    "mac/mac_util.h",
-    "mac/mac_util.mm",
-    "mac/mach_logging.cc",
-    "mac/mach_logging.h",
-    "mac/mach_port_broker.h",
-    "mac/mach_port_broker.mm",
-    "mac/mach_port_util.cc",
-    "mac/mach_port_util.h",
-    "mac/objc_release_properties.h",
-    "mac/objc_release_properties.mm",
-    "mac/os_crash_dumps.cc",
-    "mac/os_crash_dumps.h",
-    "mac/scoped_aedesc.h",
-    "mac/scoped_authorizationref.h",
-    "mac/scoped_block.h",
-    "mac/scoped_cffiledescriptorref.h",
-    "mac/scoped_cftyperef.h",
-    "mac/scoped_dispatch_object.h",
-    "mac/scoped_ionotificationportref.h",
-    "mac/scoped_ioobject.h",
-    "mac/scoped_ioplugininterface.h",
-    "mac/scoped_launch_data.h",
-    "mac/scoped_mach_port.cc",
-    "mac/scoped_mach_port.h",
-    "mac/scoped_mach_vm.cc",
-    "mac/scoped_mach_vm.h",
-    "mac/scoped_nsautorelease_pool.h",
-    "mac/scoped_nsautorelease_pool.mm",
-    "mac/scoped_nsobject.h",
-    "mac/scoped_nsobject.mm",
-    "mac/scoped_objc_class_swizzler.h",
-    "mac/scoped_objc_class_swizzler.mm",
-    "mac/scoped_sending_event.h",
-    "mac/scoped_sending_event.mm",
-    "mac/sdk_forward_declarations.h",
-    "mac/sdk_forward_declarations.mm",
-    "macros.h",
-    "md5.cc",
-    "md5.h",
-    "memory/aligned_memory.cc",
-    "memory/aligned_memory.h",
-    "memory/discardable_memory.cc",
-    "memory/discardable_memory.h",
-    "memory/discardable_memory_allocator.cc",
-    "memory/discardable_memory_allocator.h",
-    "memory/discardable_shared_memory.cc",
-    "memory/discardable_shared_memory.h",
-    "memory/free_deleter.h",
-    "memory/linked_ptr.h",
-    "memory/memory_coordinator_client.cc",
-    "memory/memory_coordinator_client.h",
-    "memory/memory_coordinator_client_registry.cc",
-    "memory/memory_coordinator_client_registry.h",
-    "memory/memory_coordinator_proxy.cc",
-    "memory/memory_coordinator_proxy.h",
-    "memory/memory_pressure_listener.cc",
-    "memory/memory_pressure_listener.h",
-    "memory/memory_pressure_monitor.cc",
-    "memory/memory_pressure_monitor.h",
-    "memory/memory_pressure_monitor_chromeos.cc",
-    "memory/memory_pressure_monitor_chromeos.h",
-    "memory/memory_pressure_monitor_mac.cc",
-    "memory/memory_pressure_monitor_mac.h",
-    "memory/memory_pressure_monitor_win.cc",
-    "memory/memory_pressure_monitor_win.h",
-    "memory/platform_shared_memory_region.cc",
-    "memory/platform_shared_memory_region.h",
-    "memory/protected_memory.cc",
-    "memory/protected_memory.h",
-    "memory/protected_memory_cfi.h",
-    "memory/protected_memory_win.cc",
-    "memory/ptr_util.h",
-    "memory/raw_scoped_refptr_mismatch_checker.h",
-    "memory/read_only_shared_memory_region.cc",
-    "memory/read_only_shared_memory_region.h",
-    "memory/ref_counted.cc",
-    "memory/ref_counted.h",
-    "memory/ref_counted_delete_on_sequence.h",
-    "memory/ref_counted_memory.cc",
-    "memory/ref_counted_memory.h",
-    "memory/scoped_policy.h",
-    "memory/scoped_refptr.h",
-    "memory/shared_memory.h",
-    "memory/shared_memory_handle.cc",
-    "memory/shared_memory_handle.h",
-    "memory/shared_memory_helper.cc",
-    "memory/shared_memory_helper.h",
-    "memory/shared_memory_mapping.cc",
-    "memory/shared_memory_mapping.h",
-    "memory/shared_memory_tracker.cc",
-    "memory/shared_memory_tracker.h",
-    "memory/singleton.h",
-    "memory/unsafe_shared_memory_region.cc",
-    "memory/unsafe_shared_memory_region.h",
-    "memory/weak_ptr.cc",
-    "memory/weak_ptr.h",
-    "memory/writable_shared_memory_region.cc",
-    "memory/writable_shared_memory_region.h",
-    "message_loop/incoming_task_queue.cc",
-    "message_loop/incoming_task_queue.h",
-    "message_loop/message_loop.cc",
-    "message_loop/message_loop.h",
-    "message_loop/message_loop_current.cc",
-    "message_loop/message_loop_current.h",
-    "message_loop/message_loop_task_runner.cc",
-    "message_loop/message_loop_task_runner.h",
-    "message_loop/message_pump.cc",
-    "message_loop/message_pump.h",
-    "message_loop/message_pump_android.cc",
-    "message_loop/message_pump_android.h",
-    "message_loop/message_pump_default.cc",
-    "message_loop/message_pump_default.h",
-    "message_loop/message_pump_for_io.h",
-    "message_loop/message_pump_for_ui.h",
-    "message_loop/message_pump_glib.cc",
-    "message_loop/message_pump_glib.h",
-    "message_loop/message_pump_io_ios.cc",
-    "message_loop/message_pump_io_ios.h",
-    "message_loop/message_pump_mac.h",
-    "message_loop/message_pump_mac.mm",
-    "message_loop/message_pump_win.cc",
-    "message_loop/message_pump_win.h",
-    "message_loop/timer_slack.h",
-    "metrics/bucket_ranges.cc",
-    "metrics/bucket_ranges.h",
-    "metrics/dummy_histogram.cc",
-    "metrics/dummy_histogram.h",
-    "metrics/field_trial.cc",
-    "metrics/field_trial.h",
-    "metrics/field_trial_param_associator.cc",
-    "metrics/field_trial_param_associator.h",
-    "metrics/field_trial_params.cc",
-    "metrics/field_trial_params.h",
-    "metrics/histogram.cc",
-    "metrics/histogram.h",
-    "metrics/histogram_base.cc",
-    "metrics/histogram_base.h",
-    "metrics/histogram_delta_serialization.cc",
-    "metrics/histogram_delta_serialization.h",
-    "metrics/histogram_flattener.h",
-    "metrics/histogram_functions.cc",
-    "metrics/histogram_functions.h",
-    "metrics/histogram_macros.h",
-    "metrics/histogram_macros_internal.h",
-    "metrics/histogram_macros_local.h",
-    "metrics/histogram_samples.cc",
-    "metrics/histogram_samples.h",
-    "metrics/histogram_snapshot_manager.cc",
-    "metrics/histogram_snapshot_manager.h",
-    "metrics/metrics_hashes.cc",
-    "metrics/metrics_hashes.h",
-    "metrics/persistent_histogram_allocator.cc",
-    "metrics/persistent_histogram_allocator.h",
-    "metrics/persistent_memory_allocator.cc",
-    "metrics/persistent_memory_allocator.h",
-    "metrics/persistent_sample_map.cc",
-    "metrics/persistent_sample_map.h",
-    "metrics/record_histogram_checker.h",
-    "metrics/sample_map.cc",
-    "metrics/sample_map.h",
-    "metrics/sample_vector.cc",
-    "metrics/sample_vector.h",
-    "metrics/single_sample_metrics.cc",
-    "metrics/single_sample_metrics.h",
-    "metrics/sparse_histogram.cc",
-    "metrics/sparse_histogram.h",
-    "metrics/statistics_recorder.cc",
-    "metrics/statistics_recorder.h",
-    "metrics/user_metrics.cc",
-    "metrics/user_metrics.h",
-    "metrics/user_metrics_action.h",
-    "native_library.cc",
-    "native_library.h",
-    "native_library_ios.mm",
-    "native_library_mac.mm",
-    "native_library_win.cc",
-    "nix/mime_util_xdg.cc",
-    "nix/mime_util_xdg.h",
-    "nix/xdg_util.cc",
-    "nix/xdg_util.h",
-    "no_destructor.h",
-    "observer_list.h",
-    "observer_list_threadsafe.cc",
-    "observer_list_threadsafe.h",
-    "optional.h",
-    "os_compat_android.cc",
-    "os_compat_android.h",
-    "os_compat_nacl.cc",
-    "os_compat_nacl.h",
-    "path_service.cc",
-    "path_service.h",
-    "pending_task.cc",
-    "pending_task.h",
-    "pickle.cc",
-    "pickle.h",
-    "post_task_and_reply_with_result_internal.h",
-    "power_monitor/power_monitor.cc",
-    "power_monitor/power_monitor.h",
-    "power_monitor/power_monitor_device_source.cc",
-    "power_monitor/power_monitor_device_source.h",
-    "power_monitor/power_monitor_source.cc",
-    "power_monitor/power_monitor_source.h",
-    "power_monitor/power_observer.h",
-    "process/internal_linux.cc",
-    "process/internal_linux.h",
-    "process/kill.cc",
-    "process/kill.h",
-    "process/kill_mac.cc",
-    "process/kill_win.cc",
-    "process/launch.cc",
-    "process/launch.h",
-    "process/launch_ios.cc",
-    "process/launch_mac.cc",
-    "process/launch_win.cc",
-    "process/memory.cc",
-    "process/memory.h",
-    "process/memory_linux.cc",
-    "process/memory_mac.mm",
-    "process/memory_win.cc",
-    "process/port_provider_mac.cc",
-    "process/port_provider_mac.h",
-    "process/process.h",
-    "process/process_handle.cc",
-    "process/process_handle.h",
-
-    #"process/process_handle_freebsd.cc",  # Unused in Chromium build.
-    "process/process_handle_linux.cc",
-    "process/process_handle_mac.cc",
-
-    #"process/process_handle_openbsd.cc",  # Unused in Chromium build.
-    "process/process_handle_win.cc",
-    "process/process_info.h",
-    "process/process_info_linux.cc",
-    "process/process_info_mac.cc",
-    "process/process_info_win.cc",
-    "process/process_iterator.cc",
-    "process/process_iterator.h",
-
-    #"process/process_iterator_freebsd.cc",  # Unused in Chromium build.
-    "process/process_iterator_linux.cc",
-    "process/process_iterator_mac.cc",
-
-    #"process/process_iterator_openbsd.cc",  # Unused in Chromium build.
-    "process/process_iterator_win.cc",
-    "process/process_linux.cc",
-    "process/process_mac.cc",
-    "process/process_metrics.cc",
-    "process/process_metrics.h",
-
-    #"process/process_metrics_freebsd.cc",  # Unused in Chromium build.
-    "process/process_metrics_ios.cc",
-    "process/process_metrics_linux.cc",
-    "process/process_metrics_mac.cc",
-
-    #"process/process_metrics_openbsd.cc",  # Unused in Chromium build.
-    "process/process_metrics_win.cc",
-    "process/process_win.cc",
-    "profiler/native_stack_sampler.cc",
-    "profiler/native_stack_sampler.h",
-    "profiler/native_stack_sampler_mac.cc",
-    "profiler/native_stack_sampler_win.cc",
-    "profiler/stack_sampling_profiler.cc",
-    "profiler/stack_sampling_profiler.h",
-    "rand_util.cc",
-    "rand_util.h",
-    "rand_util_nacl.cc",
-    "rand_util_win.cc",
-    "run_loop.cc",
-    "run_loop.h",
-    "sampling_heap_profiler/sampling_heap_profiler.cc",
-    "sampling_heap_profiler/sampling_heap_profiler.h",
-    "scoped_clear_errno.h",
-    "scoped_generic.h",
-    "scoped_native_library.cc",
-    "scoped_native_library.h",
-    "scoped_observer.h",
-    "sequence_checker.h",
-    "sequence_checker_impl.cc",
-    "sequence_checker_impl.h",
-    "sequence_token.cc",
-    "sequence_token.h",
-    "sequenced_task_runner.cc",
-    "sequenced_task_runner.h",
-    "sequenced_task_runner_helpers.h",
-    "sha1.cc",
-    "sha1.h",
-    "single_thread_task_runner.h",
-    "stl_util.h",
-    "strings/char_traits.h",
-    "strings/latin1_string_conversions.cc",
-    "strings/latin1_string_conversions.h",
-    "strings/nullable_string16.cc",
-    "strings/nullable_string16.h",
-    "strings/pattern.cc",
-    "strings/pattern.h",
-    "strings/safe_sprintf.cc",
-    "strings/safe_sprintf.h",
-    "strings/strcat.cc",
-    "strings/strcat.h",
-    "strings/string16.cc",
-    "strings/string16.h",
-    "strings/string_number_conversions.cc",
-    "strings/string_number_conversions.h",
-    "strings/string_piece.cc",
-    "strings/string_piece.h",
-    "strings/string_piece_forward.h",
-    "strings/string_split.cc",
-    "strings/string_split.h",
-    "strings/string_tokenizer.h",
-    "strings/string_util.cc",
-    "strings/string_util.h",
-    "strings/string_util_constants.cc",
-    "strings/string_util_win.h",
-    "strings/stringize_macros.h",
-    "strings/stringprintf.cc",
-    "strings/stringprintf.h",
-    "strings/sys_string_conversions.h",
-    "strings/sys_string_conversions_mac.mm",
-    "strings/sys_string_conversions_win.cc",
-    "strings/utf_offset_string_conversions.cc",
-    "strings/utf_offset_string_conversions.h",
-    "strings/utf_string_conversion_utils.cc",
-    "strings/utf_string_conversion_utils.h",
-    "strings/utf_string_conversions.cc",
-    "strings/utf_string_conversions.h",
-    "supports_user_data.cc",
-    "supports_user_data.h",
-    "sync_socket.h",
-    "sync_socket_win.cc",
-    "synchronization/atomic_flag.cc",
-    "synchronization/atomic_flag.h",
-    "synchronization/cancellation_flag.h",
-    "synchronization/condition_variable.h",
-    "synchronization/condition_variable_win.cc",
-    "synchronization/lock.cc",
-    "synchronization/lock.h",
-    "synchronization/lock_impl.h",
-    "synchronization/lock_impl_win.cc",
-    "synchronization/spin_wait.h",
-    "synchronization/waitable_event.h",
-    "synchronization/waitable_event_mac.cc",
-    "synchronization/waitable_event_watcher.h",
-    "synchronization/waitable_event_watcher_mac.cc",
-    "synchronization/waitable_event_watcher_win.cc",
-    "synchronization/waitable_event_win.cc",
-    "sys_byteorder.h",
-    "sys_info.cc",
-    "sys_info.h",
-    "sys_info_android.cc",
-    "sys_info_chromeos.cc",
-    "sys_info_internal.h",
-    "syslog_logging.cc",
-    "syslog_logging.h",
-
-    #"sys_info_freebsd.cc",  # Unused in Chromium build.
-    "sys_info_ios.mm",
-    "sys_info_linux.cc",
-    "sys_info_mac.mm",
-
-    #"sys_info_openbsd.cc",  # Unused in Chromium build.
-    "sys_info_win.cc",
-    "system_monitor/system_monitor.cc",
-    "system_monitor/system_monitor.h",
-    "task/cancelable_task_tracker.cc",
-    "task/cancelable_task_tracker.h",
-    "task_runner.cc",
-    "task_runner.h",
-    "task_runner_util.h",
-    "task_scheduler/can_schedule_sequence_observer.h",
-    "task_scheduler/delayed_task_manager.cc",
-    "task_scheduler/delayed_task_manager.h",
-    "task_scheduler/environment_config.cc",
-    "task_scheduler/environment_config.h",
-    "task_scheduler/initialization_util.cc",
-    "task_scheduler/initialization_util.h",
-    "task_scheduler/lazy_task_runner.cc",
-    "task_scheduler/lazy_task_runner.h",
-    "task_scheduler/platform_native_worker_pool_win.cc",
-    "task_scheduler/platform_native_worker_pool_win.h",
-    "task_scheduler/post_task.cc",
-    "task_scheduler/post_task.h",
-    "task_scheduler/priority_queue.cc",
-    "task_scheduler/priority_queue.h",
-    "task_scheduler/scheduler_lock.h",
-    "task_scheduler/scheduler_lock_impl.cc",
-    "task_scheduler/scheduler_lock_impl.h",
-    "task_scheduler/scheduler_single_thread_task_runner_manager.cc",
-    "task_scheduler/scheduler_single_thread_task_runner_manager.h",
-    "task_scheduler/scheduler_worker.cc",
-    "task_scheduler/scheduler_worker.h",
-    "task_scheduler/scheduler_worker_observer.h",
-    "task_scheduler/scheduler_worker_params.h",
-    "task_scheduler/scheduler_worker_pool.cc",
-    "task_scheduler/scheduler_worker_pool.h",
-    "task_scheduler/scheduler_worker_pool_impl.cc",
-    "task_scheduler/scheduler_worker_pool_impl.h",
-    "task_scheduler/scheduler_worker_pool_params.cc",
-    "task_scheduler/scheduler_worker_pool_params.h",
-    "task_scheduler/scheduler_worker_stack.cc",
-    "task_scheduler/scheduler_worker_stack.h",
-    "task_scheduler/scoped_set_task_priority_for_current_thread.cc",
-    "task_scheduler/scoped_set_task_priority_for_current_thread.h",
-    "task_scheduler/sequence.cc",
-    "task_scheduler/sequence.h",
-    "task_scheduler/sequence_sort_key.cc",
-    "task_scheduler/sequence_sort_key.h",
-    "task_scheduler/service_thread.cc",
-    "task_scheduler/service_thread.h",
-    "task_scheduler/single_thread_task_runner_thread_mode.h",
-    "task_scheduler/task.cc",
-    "task_scheduler/task.h",
-    "task_scheduler/task_scheduler.cc",
-    "task_scheduler/task_scheduler.h",
-    "task_scheduler/task_scheduler_impl.cc",
-    "task_scheduler/task_scheduler_impl.h",
-    "task_scheduler/task_tracker.cc",
-    "task_scheduler/task_tracker.h",
-    "task_scheduler/task_traits.cc",
-    "task_scheduler/task_traits.h",
-    "task_scheduler/task_traits_details.h",
-    "task_scheduler/tracked_ref.h",
-    "template_util.h",
-    "test/malloc_wrapper.h",
-    "third_party/dmg_fp/dmg_fp.h",
-    "third_party/dmg_fp/dtoa_wrapper.cc",
-    "third_party/dmg_fp/g_fmt.cc",
-    "third_party/icu/icu_utf.cc",
-    "third_party/icu/icu_utf.h",
-    "third_party/nspr/prtime.cc",
-    "third_party/nspr/prtime.h",
-    "third_party/superfasthash/superfasthash.c",
-    "thread_annotations.h",
-    "threading/platform_thread.h",
-    "threading/platform_thread_android.cc",
-    "threading/platform_thread_linux.cc",
-    "threading/platform_thread_mac.mm",
-    "threading/platform_thread_win.cc",
-    "threading/post_task_and_reply_impl.cc",
-    "threading/post_task_and_reply_impl.h",
-    "threading/scoped_blocking_call.cc",
-    "threading/scoped_blocking_call.h",
-    "threading/sequence_local_storage_map.cc",
-    "threading/sequence_local_storage_map.h",
-    "threading/sequence_local_storage_slot.cc",
-    "threading/sequence_local_storage_slot.h",
-    "threading/sequenced_task_runner_handle.cc",
-    "threading/sequenced_task_runner_handle.h",
-    "threading/simple_thread.cc",
-    "threading/simple_thread.h",
-    "threading/thread.cc",
-    "threading/thread.h",
-    "threading/thread_checker.h",
-    "threading/thread_checker_impl.cc",
-    "threading/thread_checker_impl.h",
-    "threading/thread_collision_warner.cc",
-    "threading/thread_collision_warner.h",
-    "threading/thread_id_name_manager.cc",
-    "threading/thread_id_name_manager.h",
-    "threading/thread_local.h",
-    "threading/thread_local_storage.cc",
-    "threading/thread_local_storage.h",
-    "threading/thread_local_storage_win.cc",
-    "threading/thread_restrictions.cc",
-    "threading/thread_restrictions.h",
-    "threading/thread_task_runner_handle.cc",
-    "threading/thread_task_runner_handle.h",
-    "threading/watchdog.cc",
-    "threading/watchdog.h",
-    "time/clock.cc",
-    "time/clock.h",
-    "time/default_clock.cc",
-    "time/default_clock.h",
-    "time/default_tick_clock.cc",
-    "time/default_tick_clock.h",
-    "time/tick_clock.cc",
-    "time/tick_clock.h",
-    "time/time.cc",
-    "time/time.h",
-    "time/time_override.cc",
-    "time/time_override.h",
-    "time/time_to_iso8601.cc",
-    "time/time_to_iso8601.h",
-    "timer/elapsed_timer.cc",
-    "timer/elapsed_timer.h",
-    "timer/hi_res_timer_manager.h",
-    "timer/hi_res_timer_manager_win.cc",
-    "timer/mock_timer.cc",
-    "timer/mock_timer.h",
-    "timer/timer.cc",
-    "timer/timer.h",
-    "trace_event/auto_open_close_event.cc",
-    "trace_event/auto_open_close_event.h",
-    "trace_event/blame_context.cc",
-    "trace_event/blame_context.h",
-    "trace_event/category_registry.cc",
-    "trace_event/category_registry.h",
-    "trace_event/common/trace_event_common.h",
-    "trace_event/event_name_filter.cc",
-    "trace_event/event_name_filter.h",
-    "trace_event/heap_profiler.h",
-    "trace_event/heap_profiler_allocation_context.cc",
-    "trace_event/heap_profiler_allocation_context.h",
-    "trace_event/heap_profiler_allocation_context_tracker.cc",
-    "trace_event/heap_profiler_allocation_context_tracker.h",
-    "trace_event/heap_profiler_event_filter.cc",
-    "trace_event/heap_profiler_event_filter.h",
-    "trace_event/heap_profiler_heap_dump_writer.cc",
-    "trace_event/heap_profiler_heap_dump_writer.h",
-    "trace_event/heap_profiler_serialization_state.cc",
-    "trace_event/heap_profiler_serialization_state.h",
-    "trace_event/heap_profiler_stack_frame_deduplicator.cc",
-    "trace_event/heap_profiler_stack_frame_deduplicator.h",
-    "trace_event/heap_profiler_type_name_deduplicator.cc",
-    "trace_event/heap_profiler_type_name_deduplicator.h",
-    "trace_event/java_heap_dump_provider_android.cc",
-    "trace_event/java_heap_dump_provider_android.h",
-    "trace_event/malloc_dump_provider.cc",
-    "trace_event/malloc_dump_provider.h",
-    "trace_event/memory_allocator_dump.cc",
-    "trace_event/memory_allocator_dump.h",
-    "trace_event/memory_allocator_dump_guid.cc",
-    "trace_event/memory_allocator_dump_guid.h",
-    "trace_event/memory_dump_manager.cc",
-    "trace_event/memory_dump_manager.h",
-    "trace_event/memory_dump_manager_test_utils.h",
-    "trace_event/memory_dump_provider.h",
-    "trace_event/memory_dump_provider_info.cc",
-    "trace_event/memory_dump_provider_info.h",
-    "trace_event/memory_dump_request_args.cc",
-    "trace_event/memory_dump_request_args.h",
-    "trace_event/memory_dump_scheduler.cc",
-    "trace_event/memory_dump_scheduler.h",
-    "trace_event/memory_infra_background_whitelist.cc",
-    "trace_event/memory_infra_background_whitelist.h",
-    "trace_event/memory_peak_detector.cc",
-    "trace_event/memory_peak_detector.h",
-    "trace_event/memory_usage_estimator.cc",
-    "trace_event/memory_usage_estimator.h",
-    "trace_event/process_memory_dump.cc",
-    "trace_event/process_memory_dump.h",
-    "trace_event/trace_buffer.cc",
-    "trace_event/trace_buffer.h",
-    "trace_event/trace_category.h",
-    "trace_event/trace_config.cc",
-    "trace_event/trace_config.h",
-    "trace_event/trace_config_category_filter.cc",
-    "trace_event/trace_config_category_filter.h",
-    "trace_event/trace_event.h",
-    "trace_event/trace_event_android.cc",
-    "trace_event/trace_event_argument.cc",
-    "trace_event/trace_event_argument.h",
-    "trace_event/trace_event_etw_export_win.cc",
-    "trace_event/trace_event_etw_export_win.h",
-    "trace_event/trace_event_filter.cc",
-    "trace_event/trace_event_filter.h",
-    "trace_event/trace_event_impl.cc",
-    "trace_event/trace_event_impl.h",
-    "trace_event/trace_event_memory_overhead.cc",
-    "trace_event/trace_event_memory_overhead.h",
-    "trace_event/trace_event_system_stats_monitor.cc",
-    "trace_event/trace_event_system_stats_monitor.h",
-    "trace_event/trace_log.cc",
-    "trace_event/trace_log.h",
-    "trace_event/trace_log_constants.cc",
-    "trace_event/tracing_agent.cc",
-    "trace_event/tracing_agent.h",
-    "tuple.h",
-    "unguessable_token.cc",
-    "unguessable_token.h",
-    "value_conversions.cc",
-    "value_conversions.h",
-    "value_iterators.cc",
-    "value_iterators.h",
-    "values.cc",
-    "values.h",
-    "version.cc",
-    "version.h",
-    "vlog.cc",
-    "vlog.h",
-    "win/async_operation.h",
-    "win/com_init_check_hook.cc",
-    "win/com_init_check_hook.h",
-    "win/com_init_util.cc",
-    "win/com_init_util.h",
-    "win/core_winrt_util.cc",
-    "win/core_winrt_util.h",
-    "win/current_module.h",
-    "win/enum_variant.cc",
-    "win/enum_variant.h",
-    "win/event_trace_consumer.h",
-    "win/event_trace_controller.cc",
-    "win/event_trace_controller.h",
-    "win/event_trace_provider.cc",
-    "win/event_trace_provider.h",
-    "win/i18n.cc",
-    "win/i18n.h",
-    "win/iat_patch_function.cc",
-    "win/iat_patch_function.h",
-    "win/iunknown_impl.cc",
-    "win/iunknown_impl.h",
-    "win/message_window.cc",
-    "win/message_window.h",
-    "win/object_watcher.cc",
-    "win/object_watcher.h",
-    "win/patch_util.cc",
-    "win/patch_util.h",
-    "win/process_startup_helper.cc",
-    "win/process_startup_helper.h",
-    "win/registry.cc",
-    "win/registry.h",
-    "win/resource_util.cc",
-    "win/resource_util.h",
-    "win/scoped_bstr.cc",
-    "win/scoped_bstr.h",
-    "win/scoped_co_mem.h",
-    "win/scoped_com_initializer.cc",
-    "win/scoped_com_initializer.h",
-    "win/scoped_gdi_object.h",
-    "win/scoped_handle.cc",
-    "win/scoped_handle.h",
-    "win/scoped_handle_verifier.cc",
-    "win/scoped_handle_verifier.h",
-    "win/scoped_hdc.h",
-    "win/scoped_hglobal.h",
-    "win/scoped_hstring.cc",
-    "win/scoped_hstring.h",
-    "win/scoped_process_information.cc",
-    "win/scoped_process_information.h",
-    "win/scoped_propvariant.h",
-    "win/scoped_select_object.h",
-    "win/scoped_variant.cc",
-    "win/scoped_variant.h",
-    "win/scoped_windows_thread_environment.h",
-    "win/scoped_winrt_initializer.cc",
-    "win/scoped_winrt_initializer.h",
-    "win/shortcut.cc",
-    "win/shortcut.h",
-    "win/startup_information.cc",
-    "win/startup_information.h",
-    "win/typed_event_handler.h",
-    "win/wait_chain.cc",
-    "win/wait_chain.h",
-    "win/win_util.cc",
-    "win/win_util.h",
-    "win/windows_version.cc",
-    "win/windows_version.h",
-    "win/winrt_storage_util.cc",
-    "win/winrt_storage_util.h",
-    "win/wrapped_window_proc.cc",
-    "win/wrapped_window_proc.h",
-  ]
-
-  # winternl.h and NTSecAPI.h have different definitions of UNICODE_STRING.
-  # There's only one client of NTSecAPI.h in base but several of winternl.h,
-  # so exclude the NTSecAPI.h one.
-  if (is_win) {
-    jumbo_excluded_sources = [ "rand_util_win.cc" ]
-  }
-
-  if (is_posix) {
-    sources += [
-      "base_paths_posix.h",
-      "debug/debugger_posix.cc",
-      "debug/stack_trace_posix.cc",
-      "file_descriptor_posix.h",
-      "files/dir_reader_posix.h",
-      "files/file_descriptor_watcher_posix.cc",
-      "files/file_descriptor_watcher_posix.h",
-      "files/file_enumerator_posix.cc",
-      "files/file_posix.cc",
-      "files/file_util_posix.cc",
-      "files/memory_mapped_file_posix.cc",
-      "memory/protected_memory_posix.cc",
-      "message_loop/watchable_io_message_pump_posix.cc",
-      "message_loop/watchable_io_message_pump_posix.h",
-      "native_library_posix.cc",
-      "posix/eintr_wrapper.h",
-      "posix/file_descriptor_shuffle.cc",
-      "posix/file_descriptor_shuffle.h",
-      "posix/global_descriptors.cc",
-      "posix/global_descriptors.h",
-      "posix/safe_strerror.cc",
-      "posix/safe_strerror.h",
-      "posix/unix_domain_socket.cc",
-      "posix/unix_domain_socket.h",
-      "process/kill_posix.cc",
-      "process/launch_posix.cc",
-      "process/process_handle_posix.cc",
-      "process/process_metrics_posix.cc",
-      "process/process_posix.cc",
-      "profiler/native_stack_sampler_posix.cc",
-      "rand_util_posix.cc",
-      "strings/string_util_posix.h",
-      "strings/sys_string_conversions_posix.cc",
-      "sync_socket_posix.cc",
-      "synchronization/condition_variable_posix.cc",
-      "synchronization/lock_impl_posix.cc",
-      "synchronization/waitable_event_posix.cc",
-      "synchronization/waitable_event_watcher_posix.cc",
-      "sys_info_posix.cc",
-      "task_scheduler/task_tracker_posix.cc",
-      "task_scheduler/task_tracker_posix.h",
-      "threading/platform_thread_internal_posix.cc",
-      "threading/platform_thread_internal_posix.h",
-      "threading/platform_thread_posix.cc",
-      "threading/thread_local_storage_posix.cc",
-      "timer/hi_res_timer_manager_posix.cc",
-    ]
-  }
-
-  if (!is_nacl) {
-    sources += [
-      "base_paths.cc",
-      "base_paths.h",
-      "base_paths_android.cc",
-      "base_paths_android.h",
-      "base_paths_mac.h",
-      "base_paths_mac.mm",
-      "base_paths_posix.h",
-      "base_paths_win.cc",
-      "base_paths_win.h",
-      "metrics/persistent_histogram_storage.cc",
-      "metrics/persistent_histogram_storage.h",
-    ]
-
-    if (is_linux) {
-      sources += [
-        "base_paths_posix.cc",
-        "debug/elf_reader_linux.cc",
-        "debug/elf_reader_linux.h",
-      ]
-    }
-  }
-
-  all_dependent_configs = []
-  defines = []
-  data = []
-  data_deps = []
-
-  configs += [
-    ":base_flags",
-    ":base_implementation",
-    "//build/config:precompiled_headers",
-    "//build/config/compiler:noshadowing",
-  ]
-
-  deps = [
-    "//base/allocator",
-    "//base/allocator:buildflags",
-    "//base/third_party/dynamic_annotations",
-    "//third_party/modp_b64",
-  ]
-
-  public_deps = [
-    ":anchor_functions_buildflags",
-    ":base_static",
-    ":build_date",
-    ":cfi_buildflags",
-    ":debugging_buildflags",
-    ":partition_alloc_buildflags",
-    ":protected_memory_buildflags",
-    ":synchronization_buildflags",
-    "//base/numerics:base_numerics",
-  ]
-
-  # Needed for <atomic> if using newer C++ library than sysroot, except if
-  # building inside the cros_sdk environment - use host_toolchain as a
-  # more robust check for this.
-  if (!use_sysroot && (is_android || (is_linux && !is_chromecast)) &&
-      host_toolchain != "//build/toolchain/cros:host") {
-    libs = [ "atomic" ]
-  }
-
-  if (use_allocator_shim) {
-    sources += [
-      "allocator/allocator_shim.cc",
-      "allocator/allocator_shim.h",
-      "allocator/allocator_shim_internals.h",
-      "allocator/allocator_shim_override_cpp_symbols.h",
-      "allocator/allocator_shim_override_libc_symbols.h",
-    ]
-    if (is_win) {
-      sources += [
-        "allocator/allocator_shim_default_dispatch_to_winheap.cc",
-        "allocator/allocator_shim_override_ucrt_symbols_win.h",
-        "allocator/winheap_stubs_win.cc",
-        "allocator/winheap_stubs_win.h",
-      ]
-    } else if (is_linux && use_allocator == "tcmalloc") {
-      sources += [
-        "allocator/allocator_shim_default_dispatch_to_tcmalloc.cc",
-        "allocator/allocator_shim_override_glibc_weak_symbols.h",
-      ]
-      deps += [ "//base/allocator:tcmalloc" ]
-    } else if (is_linux && use_allocator == "none") {
-      sources += [ "allocator/allocator_shim_default_dispatch_to_glibc.cc" ]
-    } else if (is_android && use_allocator == "none") {
-      sources += [
-        "allocator/allocator_shim_default_dispatch_to_linker_wrapped_symbols.cc",
-        "allocator/allocator_shim_override_linker_wrapped_symbols.h",
-      ]
-      all_dependent_configs += [ "//base/allocator:wrap_malloc_symbols" ]
-    } else if (is_mac) {
-      sources += [
-        "allocator/allocator_shim_default_dispatch_to_mac_zoned_malloc.cc",
-        "allocator/allocator_shim_default_dispatch_to_mac_zoned_malloc.h",
-        "allocator/allocator_shim_override_mac_symbols.h",
-      ]
-    }
-  }
-
-  # Allow more direct string conversions on platforms with native utf8
-  # strings
-  if (is_mac || is_ios || is_chromeos || is_chromecast || is_fuchsia) {
-    defines += [ "SYSTEM_NATIVE_UTF8" ]
-  }
-
-  # Android.
-  if (is_android) {
-    sources -= [ "debug/stack_trace_posix.cc" ]
-    sources += [
-      "memory/platform_shared_memory_region_android.cc",
-      "memory/shared_memory_android.cc",
-      "memory/shared_memory_handle_android.cc",
-      "time/time_android.cc",
-    ]
-
-    # Android uses some Linux sources, put those back.
-    set_sources_assignment_filter([])
-    sources += [
-      "debug/elf_reader_linux.cc",
-      "debug/elf_reader_linux.h",
-      "debug/proc_maps_linux.cc",
-      "debug/proc_maps_linux.h",
-      "files/file_path_watcher_linux.cc",
-      "power_monitor/power_monitor_device_source_android.cc",
-      "process/internal_linux.cc",
-      "process/internal_linux.h",
-      "process/memory_linux.cc",
-      "process/process_handle_linux.cc",
-      "process/process_info_linux.cc",
-      "process/process_iterator_linux.cc",
-      "process/process_metrics_linux.cc",
-      "sys_info_linux.cc",
-    ]
-    set_sources_assignment_filter(sources_assignment_filter)
-
-    deps += [
-      ":base_jni_headers",
-      "//third_party/android_tools:cpu_features",
-      "//third_party/ashmem",
-    ]
-
-    # TODO(thomasanderson): Remove this once use_custom_libcxx is always set to
-    # true on Android.
-    if (!use_custom_libcxx) {
-      deps += [ "//buildtools/third_party/libc++abi:cxa_demangle_stub" ]
-    }
-
-    # Needs to be a public config so that dependent targets link against it as
-    # well when doing a component build.
-    public_configs = [ ":android_system_libs" ]
-
-    if (can_unwind_with_cfi_table) {
-      sources += [
-        "trace_event/cfi_backtrace_android.cc",
-        "trace_event/cfi_backtrace_android.h",
-      ]
-    }
-
-    # This is actually a linker script, but it can be added to the link in the
-    # same way as a library.
-    libs = [ "android/library_loader/anchor_functions.lds" ]
-  }
-
-  # Chromeos.
-  if (is_chromeos) {
-    sources += [ "power_monitor/power_monitor_device_source_chromeos.cc" ]
-  }
-
-  # Fuchsia.
-  if (is_fuchsia) {
-    sources += [
-      "base_paths_fuchsia.cc",
-      "base_paths_fuchsia.h",
-      "debug/debugger_posix.cc",
-      "debug/stack_trace_fuchsia.cc",
-      "file_descriptor_posix.h",
-      "files/dir_reader_posix.h",
-      "files/file_descriptor_watcher_posix.cc",
-      "files/file_descriptor_watcher_posix.h",
-      "files/file_enumerator_posix.cc",
-      "files/file_path_watcher_fuchsia.cc",
-      "files/file_posix.cc",
-      "files/file_util_posix.cc",
-      "files/memory_mapped_file_posix.cc",
-      "fuchsia/async_dispatcher.cc",
-      "fuchsia/async_dispatcher.h",
-      "fuchsia/component_context.cc",
-      "fuchsia/component_context.h",
-      "fuchsia/default_job.cc",
-      "fuchsia/default_job.h",
-      "fuchsia/fidl_interface_request.cc",
-      "fuchsia/fidl_interface_request.h",
-      "fuchsia/fuchsia_logging.cc",
-      "fuchsia/fuchsia_logging.h",
-      "fuchsia/scoped_zx_handle.cc",
-      "fuchsia/scoped_zx_handle.h",
-      "fuchsia/services_directory.cc",
-      "fuchsia/services_directory.h",
-      "memory/platform_shared_memory_region_fuchsia.cc",
-      "memory/protected_memory_posix.cc",
-      "memory/shared_memory_fuchsia.cc",
-      "memory/shared_memory_handle_fuchsia.cc",
-      "message_loop/message_pump_fuchsia.cc",
-      "message_loop/message_pump_fuchsia.h",
-      "message_loop/watchable_io_message_pump_posix.cc",
-      "message_loop/watchable_io_message_pump_posix.h",
-      "native_library_fuchsia.cc",
-      "posix/eintr_wrapper.h",
-      "posix/file_descriptor_shuffle.cc",
-      "posix/file_descriptor_shuffle.h",
-      "posix/global_descriptors.cc",
-      "posix/global_descriptors.h",
-      "posix/safe_strerror.cc",
-      "posix/safe_strerror.h",
-      "process/kill_fuchsia.cc",
-      "process/launch_fuchsia.cc",
-      "process/memory_fuchsia.cc",
-      "process/process_fuchsia.cc",
-      "process/process_handle_fuchsia.cc",
-      "process/process_iterator_fuchsia.cc",
-      "process/process_metrics_fuchsia.cc",
-      "process/process_metrics_posix.cc",
-      "profiler/native_stack_sampler_posix.cc",
-      "rand_util_fuchsia.cc",
-      "strings/string_util_posix.h",
-      "strings/sys_string_conversions_posix.cc",
-      "sync_socket_posix.cc",
-      "synchronization/condition_variable_posix.cc",
-      "synchronization/lock_impl_posix.cc",
-      "synchronization/waitable_event_posix.cc",
-      "synchronization/waitable_event_watcher_posix.cc",
-      "sys_info_fuchsia.cc",
-      "sys_info_posix.cc",
-      "task_scheduler/task_tracker_posix.cc",
-      "task_scheduler/task_tracker_posix.h",
-      "threading/platform_thread_fuchsia.cc",
-      "threading/platform_thread_posix.cc",
-      "threading/thread_local_storage_posix.cc",
-      "time/time_conversion_posix.cc",
-      "time/time_exploded_posix.cc",
-      "time/time_fuchsia.cc",
-      "timer/hi_res_timer_manager_posix.cc",
-    ]
-
-    # These only need to be public deps because of includes of their headers
-    # by public //base headers, which requires they be on the include path.
-    # TODO(https://crbug.com/841171): Move these back to |deps|.
-    public_deps += [
-      "//third_party/fuchsia-sdk:async",
-      "//third_party/fuchsia-sdk:launchpad",
-    ]
-
-    deps += [
-      "//third_party/fuchsia-sdk:async_default",
-      "//third_party/fuchsia-sdk:fdio",
-      "//third_party/fuchsia-sdk:fidl",
-      "//third_party/fuchsia-sdk:svc",
-      "//third_party/fuchsia-sdk:zx",
-    ]
-  }
-
-  # NaCl.
-  if (is_nacl) {
-    # We reset sources_assignment_filter in order to explicitly include
-    # the linux file (which would otherwise be filtered out).
-    set_sources_assignment_filter([])
-    sources += [
-      "files/file_path_watcher_stub.cc",
-      "memory/shared_memory_nacl.cc",
-      "process/process_metrics_nacl.cc",
-      "sync_socket_nacl.cc",
-      "threading/platform_thread_linux.cc",
-    ]
-    set_sources_assignment_filter(sources_assignment_filter)
-
-    sources -= [
-      "cpu.cc",
-      "debug/crash_logging.cc",
-      "debug/crash_logging.h",
-      "debug/stack_trace.cc",
-      "debug/stack_trace_posix.cc",
-      "files/file_enumerator_posix.cc",
-      "files/file_proxy.cc",
-      "files/important_file_writer.cc",
-      "files/important_file_writer.h",
-      "files/scoped_temp_dir.cc",
-      "memory/discardable_memory.cc",
-      "memory/discardable_memory.h",
-      "memory/discardable_memory_allocator.cc",
-      "memory/discardable_memory_allocator.h",
-      "memory/discardable_shared_memory.cc",
-      "memory/discardable_shared_memory.h",
-      "memory/shared_memory_helper.cc",
-      "memory/shared_memory_helper.h",
-      "native_library.cc",
-      "native_library_posix.cc",
-      "path_service.cc",
-      "process/kill.cc",
-      "process/kill.h",
-      "process/memory.cc",
-      "process/memory.h",
-      "process/process_iterator.cc",
-      "process/process_iterator.h",
-      "process/process_metrics.cc",
-      "process/process_metrics_posix.cc",
-      "process/process_posix.cc",
-      "scoped_native_library.cc",
-      "sync_socket_posix.cc",
-      "sys_info.cc",
-      "sys_info_posix.cc",
-      "task_scheduler/initialization_util.cc",
-      "task_scheduler/initialization_util.h",
-      "trace_event/trace_event_system_stats_monitor.cc",
-    ]
-
-    if (is_nacl_nonsfi) {
-      sources -= [ "rand_util_nacl.cc" ]
-      configs += [ ":nacl_nonsfi_warnings" ]
-    } else {
-      sources -= [
-        "files/file_descriptor_watcher_posix.cc",
-        "files/file_descriptor_watcher_posix.h",
-        "files/file_util.cc",
-        "files/file_util.h",
-        "files/file_util_posix.cc",
-        "json/json_file_value_serializer.cc",
-        "json/json_file_value_serializer.h",
-        "posix/unix_domain_socket.cc",
-        "process/kill_posix.cc",
-        "process/launch.cc",
-        "process/launch.h",
-        "process/launch_posix.cc",
-        "rand_util_posix.cc",
-        "task_scheduler/task_tracker_posix.cc",
-        "task_scheduler/task_tracker_posix.h",
-      ]
-    }
-  } else {
-    # Remove NaCl stuff.
-    sources -= [
-      "os_compat_nacl.cc",
-      "os_compat_nacl.h",
-      "rand_util_nacl.cc",
-    ]
-
-    if (use_partition_alloc) {
-      # Add stuff that doesn't work in NaCl.
-      sources += [
-        # PartitionAlloc uses SpinLock, which doesn't work in NaCl (see below).
-        "allocator/partition_allocator/address_space_randomization.cc",
-        "allocator/partition_allocator/address_space_randomization.h",
-        "allocator/partition_allocator/oom.h",
-        "allocator/partition_allocator/page_allocator.cc",
-        "allocator/partition_allocator/page_allocator.h",
-        "allocator/partition_allocator/page_allocator_internal.h",
-        "allocator/partition_allocator/partition_alloc.cc",
-        "allocator/partition_allocator/partition_alloc.h",
-        "allocator/partition_allocator/partition_alloc_constants.h",
-        "allocator/partition_allocator/partition_bucket.cc",
-        "allocator/partition_allocator/partition_bucket.h",
-        "allocator/partition_allocator/partition_cookie.h",
-        "allocator/partition_allocator/partition_direct_map_extent.h",
-        "allocator/partition_allocator/partition_freelist_entry.h",
-        "allocator/partition_allocator/partition_oom.cc",
-        "allocator/partition_allocator/partition_oom.h",
-        "allocator/partition_allocator/partition_page.cc",
-        "allocator/partition_allocator/partition_page.h",
-        "allocator/partition_allocator/partition_root_base.cc",
-        "allocator/partition_allocator/partition_root_base.h",
-        "allocator/partition_allocator/spin_lock.cc",
-        "allocator/partition_allocator/spin_lock.h",
-      ]
-      if (is_win) {
-        sources +=
-            [ "allocator/partition_allocator/page_allocator_internals_win.h" ]
-      } else if (is_posix || is_fuchsia) {
-        sources +=
-            [ "allocator/partition_allocator/page_allocator_internals_posix.h" ]
-      }
-    }
-  }
-
-  # Windows.
-  if (is_win) {
-    sources += [
-      "memory/platform_shared_memory_region_win.cc",
-      "memory/shared_memory_handle_win.cc",
-      "memory/shared_memory_win.cc",
-      "power_monitor/power_monitor_device_source_win.cc",
-      "profiler/win32_stack_frame_unwinder.cc",
-      "profiler/win32_stack_frame_unwinder.h",
-      "time/time_win.cc",
-    ]
-
-    sources -= [
-      "file_descriptor_store.cc",
-      "file_descriptor_store.h",
-      "memory/shared_memory_helper.cc",
-      "memory/shared_memory_helper.h",
-      "strings/string16.cc",
-    ]
-
-    deps += [
-      "//base/trace_event/etw_manifest:chrome_events_win",
-      "//base/win:base_win_buildflags",
-    ]
-
-    data_deps += [ "//build/win:runtime_libs" ]
-
-    if (com_init_check_hook_disabled) {
-      defines += [ "COM_INIT_CHECK_HOOK_DISABLED" ]
-    }
-
-    # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
-    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-    libs = [
-      "cfgmgr32.lib",
-      "powrprof.lib",
-      "propsys.lib",
-      "setupapi.lib",
-      "userenv.lib",
-      "winmm.lib",
-    ]
-    all_dependent_configs += [
-      ":base_win_linker_flags",
-      "//tools/win/DebugVisualizers:chrome",
-    ]
-  }
-
-  # Desktop Mac.
-  if (is_mac) {
-    sources -= [ "profiler/native_stack_sampler_posix.cc" ]
-    sources += [
-      "mac/scoped_typeref.h",
-      "memory/platform_shared_memory_region_mac.cc",
-      "memory/shared_memory_handle_mac.cc",
-      "memory/shared_memory_mac.cc",
-      "power_monitor/power_monitor_device_source_mac.mm",
-      "time/time_conversion_posix.cc",
-      "time/time_exploded_posix.cc",
-      "time/time_mac.cc",
-    ]
-
-    libs = [
-      "ApplicationServices.framework",
-      "AppKit.framework",
-      "bsm",
-      "CoreFoundation.framework",
-      "IOKit.framework",
-      "Security.framework",
-    ]
-  }
-
-  # Mac or iOS.
-  if (is_mac || is_ios) {
-    sources -= [
-      "native_library_posix.cc",
-      "strings/sys_string_conversions_posix.cc",
-      "synchronization/waitable_event_posix.cc",
-      "synchronization/waitable_event_watcher_posix.cc",
-      "threading/platform_thread_internal_posix.cc",
-    ]
-  } else {
-    # Non-Mac/ios.
-    sources -= [
-      "files/file_path_watcher_fsevents.cc",
-      "files/file_path_watcher_fsevents.h",
-      "files/file_path_watcher_kqueue.cc",
-      "files/file_path_watcher_kqueue.h",
-    ]
-  }
-
-  # Linux.
-  if (is_linux) {
-    # TODO(brettw) this will need to be parameterized at some point.
-    linux_configs = []
-    if (use_glib) {
-      linux_configs += [ "//build/config/linux:glib" ]
-    }
-
-    defines += [ "USE_SYMBOLIZE" ]
-
-    configs += linux_configs
-    all_dependent_configs += linux_configs
-
-    # These dependencies are not required on Android, and in the case
-    # of xdg_mime must be excluded due to licensing restrictions.
-    deps += [
-      "//base/third_party/symbolize",
-      "//base/third_party/xdg_mime",
-      "//base/third_party/xdg_user_dirs",
-    ]
-  } else {
-    # Non-Linux.
-    sources -= [
-      "nix/mime_util_xdg.cc",
-      "nix/mime_util_xdg.h",
-      "nix/xdg_util.cc",
-      "nix/xdg_util.h",
-    ]
-
-    if (!is_android) {
-      sources -= [
-        "linux_util.cc",
-        "linux_util.h",
-      ]
-    }
-  }
-
-  # iOS
-  if (is_ios) {
-    set_sources_assignment_filter([])
-
-    sources -= [
-      "files/file_path_watcher.cc",
-      "files/file_path_watcher.h",
-      "files/file_path_watcher_fsevents.cc",
-      "files/file_path_watcher_fsevents.h",
-      "files/file_path_watcher_kqueue.cc",
-      "files/file_path_watcher_kqueue.h",
-      "memory/discardable_shared_memory.cc",
-      "memory/discardable_shared_memory.h",
-      "process/kill.cc",
-      "process/kill.h",
-      "process/kill_posix.cc",
-      "process/launch.cc",
-      "process/launch.h",
-      "process/launch_posix.cc",
-      "process/memory.cc",
-      "process/memory.h",
-      "process/process_iterator.cc",
-      "process/process_iterator.h",
-      "process/process_metrics_posix.cc",
-      "process/process_posix.cc",
-      "sync_socket.h",
-      "sync_socket_posix.cc",
-      "synchronization/waitable_event_watcher.h",
-    ]
-    sources += [
-      "base_paths_mac.h",
-      "base_paths_mac.mm",
-      "file_version_info_mac.h",
-      "file_version_info_mac.mm",
-      "files/file_util_mac.mm",
-      "mac/bundle_locations.h",
-      "mac/bundle_locations.mm",
-      "mac/call_with_eh_frame.cc",
-      "mac/call_with_eh_frame.h",
-      "mac/foundation_util.h",
-      "mac/foundation_util.mm",
-      "mac/mac_logging.h",
-      "mac/mac_logging.mm",
-      "mac/mach_logging.cc",
-      "mac/mach_logging.h",
-      "mac/objc_release_properties.h",
-      "mac/objc_release_properties.mm",
-      "mac/scoped_block.h",
-      "mac/scoped_mach_port.cc",
-      "mac/scoped_mach_port.h",
-      "mac/scoped_mach_vm.cc",
-      "mac/scoped_mach_vm.h",
-      "mac/scoped_nsautorelease_pool.h",
-      "mac/scoped_nsautorelease_pool.mm",
-      "mac/scoped_nsobject.h",
-      "mac/scoped_nsobject.mm",
-      "mac/scoped_objc_class_swizzler.h",
-      "mac/scoped_objc_class_swizzler.mm",
-      "mac/scoped_typeref.h",
-      "message_loop/message_pump_mac.h",
-      "message_loop/message_pump_mac.mm",
-      "power_monitor/power_monitor_device_source_ios.mm",
-      "process/memory_stubs.cc",
-      "strings/sys_string_conversions_mac.mm",
-      "synchronization/waitable_event_mac.cc",
-      "threading/platform_thread_mac.mm",
-      "time/time_conversion_posix.cc",
-      "time/time_mac.cc",
-    ]
-
-    set_sources_assignment_filter(sources_assignment_filter)
-  }
-
-  if (dep_libevent) {
-    deps += [ "//base/third_party/libevent" ]
-  }
-
-  if (use_libevent) {
-    sources += [
-      "message_loop/message_pump_libevent.cc",
-      "message_loop/message_pump_libevent.h",
-    ]
-  }
-
-  # Android and MacOS have their own custom shared memory handle
-  # implementations. e.g. due to supporting both POSIX and native handles.
-  if (is_posix && !is_android && !is_mac) {
-    sources += [
-      "memory/platform_shared_memory_region_posix.cc",
-      "memory/shared_memory_handle_posix.cc",
-    ]
-  }
-
-  if (is_posix && !is_mac && !is_nacl) {
-    sources += [ "memory/shared_memory_posix.cc" ]
-  }
-
-  if (is_posix && !is_mac && !is_ios) {
-    sources += [
-      "time/time_conversion_posix.cc",
-      "time/time_exploded_posix.cc",
-      "time/time_now_posix.cc",
-    ]
-  }
-
-  if ((is_posix && !is_mac && !is_ios && !is_android && !is_chromeos) ||
-      is_fuchsia) {
-    sources += [ "power_monitor/power_monitor_device_source_stub.cc" ]
-  }
-
-  if (!use_glib) {
-    sources -= [
-      "message_loop/message_pump_glib.cc",
-      "message_loop/message_pump_glib.h",
-    ]
-  }
-
-  if (using_sanitizer) {
-    data += [ "//tools/valgrind/asan/" ]
-    if (is_win) {
-      data +=
-          [ "//third_party/llvm-build/Release+Asserts/bin/llvm-symbolizer.exe" ]
-    } else {
-      data += [ "//third_party/llvm-build/Release+Asserts/bin/llvm-symbolizer" ]
-    }
-  }
-
-  configs += [ "//build/config/compiler:wexit_time_destructors" ]
-  if (!is_debug) {
-    configs -= [ "//build/config/compiler:default_optimization" ]
-    configs += [ "//build/config/compiler:optimize_max" ]
-  }
-}
-
-# Build flags for Control Flow Integrity
-# https://www.chromium.org/developers/testing/control-flow-integrity
-buildflag_header("cfi_buildflags") {
-  header = "cfi_buildflags.h"
-
-  # buildflag entries added to this header must also must be manually added to
-  # tools/gn/bootstrap/bootstrap.py
-  flags = [
-    # TODO(pcc): remove CFI_CAST_CHECK, see https://crbug.com/626794.
-    "CFI_CAST_CHECK=$is_cfi && $use_cfi_cast",
-    "CFI_ICALL_CHECK=$is_cfi && $use_cfi_icall",
-    "CFI_ENFORCEMENT_TRAP=$is_cfi && !$use_cfi_diag",
-    "CFI_ENFORCEMENT_DIAGNOSTIC=$is_cfi && $use_cfi_diag && !$use_cfi_recover",
-  ]
-}
-
-buildflag_header("debugging_buildflags") {
-  header = "debugging_buildflags.h"
-  header_dir = "base/debug"
-
-  # buildflag entries added to this header must also must be manually added to
-  # tools/gn/bootstrap/bootstrap.py
-  flags = [
-    "ENABLE_LOCATION_SOURCE=$enable_location_source",
-    "ENABLE_PROFILING=$enable_profiling",
-    "CAN_UNWIND_WITH_FRAME_POINTERS=$can_unwind_with_frame_pointers",
-    "UNSAFE_DEVELOPER_BUILD=$is_unsafe_developer_build",
-    "CAN_UNWIND_WITH_CFI_TABLE=$can_unwind_with_cfi_table",
-  ]
-}
-
-# Build flags for ProtectedMemory, temporary workaround for crbug.com/792777
-# TODO(vtsyrklevich): Remove once support for gold on Android/CrOs is dropped
-buildflag_header("protected_memory_buildflags") {
-  header = "protected_memory_buildflags.h"
-  header_dir = "base/memory"
-
-  # buildflag entries added to this header must also must be manually added to
-  # tools/gn/bootstrap/bootstrap.py
-  flags = [ "USE_LLD=$use_lld" ]
-}
-
-buildflag_header("synchronization_buildflags") {
-  header = "synchronization_buildflags.h"
-  header_dir = "base/synchronization"
-
-  flags =
-      [ "ENABLE_MUTEX_PRIORITY_INHERITANCE=$enable_mutex_priority_inheritance" ]
-}
-
-buildflag_header("anchor_functions_buildflags") {
-  header = "anchor_functions_buildflags.h"
-  header_dir = "base/android/library_loader"
-  _supports_code_ordering = current_cpu == "arm"
-
-  # buildflag entries added to this header must also must be manually added to
-  # tools/gn/bootstrap/bootstrap.py
-  flags = [
-    "USE_LLD=$use_lld",
-    "SUPPORTS_CODE_ORDERING=$_supports_code_ordering",
-  ]
-}
-
-buildflag_header("partition_alloc_buildflags") {
-  header = "partition_alloc_buildflags.h"
-  header_dir = "base"
-
-  flags = [ "USE_PARTITION_ALLOC=$use_partition_alloc" ]
-}
-
-# This is the subset of files from base that should not be used with a dynamic
-# library. Note that this library cannot depend on base because base depends on
-# base_static.
-static_library("base_static") {
-  sources = [
-    "base_switches.cc",
-    "base_switches.h",
-  ]
-
-  if (is_win) {
-    public_deps = [
-      "//base/win:pe_image",
-    ]
-
-    # Disable sanitizer coverage in win/pe_image.cc. It is called by the sandbox
-    # before sanitizer coverage can initialize. http://crbug.com/484711
-    configs -= [ "//build/config/sanitizers:default_sanitizer_flags" ]
-    configs +=
-        [ "//build/config/sanitizers:default_sanitizer_flags_but_coverage" ]
-  }
-
-  if (!is_debug) {
-    configs -= [ "//build/config/compiler:default_optimization" ]
-    configs += [ "//build/config/compiler:optimize_max" ]
-  }
-}
-
-component("i18n") {
-  output_name = "base_i18n"
-  sources = [
-    "i18n/base_i18n_export.h",
-    "i18n/base_i18n_switches.cc",
-    "i18n/base_i18n_switches.h",
-    "i18n/bidi_line_iterator.cc",
-    "i18n/bidi_line_iterator.h",
-    "i18n/break_iterator.cc",
-    "i18n/break_iterator.h",
-    "i18n/case_conversion.cc",
-    "i18n/case_conversion.h",
-    "i18n/char_iterator.cc",
-    "i18n/char_iterator.h",
-    "i18n/character_encoding.cc",
-    "i18n/character_encoding.h",
-    "i18n/encoding_detection.cc",
-    "i18n/encoding_detection.h",
-    "i18n/file_util_icu.cc",
-    "i18n/file_util_icu.h",
-    "i18n/i18n_constants.cc",
-    "i18n/i18n_constants.h",
-    "i18n/icu_string_conversions.cc",
-    "i18n/icu_string_conversions.h",
-    "i18n/icu_util.cc",
-    "i18n/icu_util.h",
-    "i18n/message_formatter.cc",
-    "i18n/message_formatter.h",
-    "i18n/number_formatting.cc",
-    "i18n/number_formatting.h",
-    "i18n/rtl.cc",
-    "i18n/rtl.h",
-    "i18n/streaming_utf8_validator.cc",
-    "i18n/streaming_utf8_validator.h",
-    "i18n/string_compare.cc",
-    "i18n/string_compare.h",
-    "i18n/string_search.cc",
-    "i18n/string_search.h",
-    "i18n/time_formatting.cc",
-    "i18n/time_formatting.h",
-    "i18n/timezone.cc",
-    "i18n/timezone.h",
-    "i18n/unicodestring.h",
-    "i18n/utf8_validator_tables.cc",
-    "i18n/utf8_validator_tables.h",
-  ]
-  defines = [ "BASE_I18N_IMPLEMENTATION" ]
-  configs += [ "//build/config/compiler:wexit_time_destructors" ]
-  public_deps = [
-    "//third_party/ced",
-    "//third_party/icu",
-  ]
-  deps = [
-    ":base",
-    "//base/third_party/dynamic_annotations",
-  ]
-
-  if (!is_debug) {
-    configs -= [ "//build/config/compiler:default_optimization" ]
-    configs += [ "//build/config/compiler:optimize_max" ]
-  }
-
-  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  if (is_mac) {
-    libs = [ "CoreFoundation.framework" ]
-  }
-}
-
-test("base_perftests") {
-  sources = [
-    "message_loop/message_loop_perftest.cc",
-    "message_loop/message_pump_perftest.cc",
-
-    # "test/run_all_unittests.cc",
-    "json/json_perftest.cc",
-    "synchronization/waitable_event_perftest.cc",
-    "threading/thread_perftest.cc",
-  ]
-  deps = [
-    ":base",
-    "//base/test:test_support",
-    "//base/test:test_support_perf",
-    "//testing/gtest",
-    "//testing/perf",
-  ]
-
-  if (is_android) {
-    deps += [ "//testing/android/native_test:native_test_native_code" ]
-  }
-}
-
-test("base_i18n_perftests") {
-  sources = [
-    "i18n/streaming_utf8_validator_perftest.cc",
-  ]
-  deps = [
-    ":base",
-    ":i18n",
-    "//base/test:test_support",
-    "//base/test:test_support_perf",
-    "//testing/gtest",
-  ]
-}
-
-if (!is_ios) {
-  executable("build_utf8_validator_tables") {
-    sources = [
-      "i18n/build_utf8_validator_tables.cc",
-    ]
-    deps = [
-      ":base",
-      "//build/config:exe_and_shlib_deps",
-      "//build/win:default_exe_manifest",
-      "//third_party/icu:icuuc",
-    ]
-  }
-
-  executable("check_example") {
-    sources = [
-      "check_example.cc",
-    ]
-    deps = [
-      ":base",
-      "//build/config:exe_and_shlib_deps",
-      "//build/win:default_exe_manifest",
-    ]
-  }
-}
-
-if (is_win) {
-  # Target to manually rebuild pe_image_test.dll which is checked into
-  # base/test/data/pe_image.
-  shared_library("pe_image_test") {
-    sources = [
-      "win/pe_image_test.cc",
-    ]
-    ldflags = [
-      "/DELAYLOAD:cfgmgr32.dll",
-      "/DELAYLOAD:shell32.dll",
-      "/SUBSYSTEM:WINDOWS",
-    ]
-    libs = [
-      "cfgmgr32.lib",
-      "shell32.lib",
-    ]
-    deps = [
-      "//build/config:exe_and_shlib_deps",
-    ]
-  }
-
-  loadable_module("scoped_handle_test_dll") {
-    sources = [
-      "win/scoped_handle_test_dll.cc",
-    ]
-    deps = [
-      ":base",
-      "//base/win:base_win_buildflags",
-    ]
-  }
-}
-
-if (is_win || is_mac) {
-  if (current_cpu == "x64") {
-    # Must be a shared library so that it can be unloaded during testing.
-    shared_library("base_profiler_test_support_library") {
-      sources = [
-        "profiler/test_support_library.cc",
-      ]
-      deps = [
-        "//build/config:exe_and_shlib_deps",
-      ]
-    }
-  }
-}
-
-bundle_data("base_unittests_bundle_data") {
-  testonly = true
-  sources = [
-    "test/data/file_util/binary_file.bin",
-    "test/data/file_util/binary_file_diff.bin",
-    "test/data/file_util/binary_file_same.bin",
-    "test/data/file_util/blank_line.txt",
-    "test/data/file_util/blank_line_crlf.txt",
-    "test/data/file_util/crlf.txt",
-    "test/data/file_util/different.txt",
-    "test/data/file_util/different_first.txt",
-    "test/data/file_util/different_last.txt",
-    "test/data/file_util/empty1.txt",
-    "test/data/file_util/empty2.txt",
-    "test/data/file_util/first1.txt",
-    "test/data/file_util/first2.txt",
-    "test/data/file_util/original.txt",
-    "test/data/file_util/same.txt",
-    "test/data/file_util/same_length.txt",
-    "test/data/file_util/shortened.txt",
-    "test/data/json/bom_feff.json",
-    "test/data/serializer_nested_test.json",
-    "test/data/serializer_test.json",
-    "test/data/serializer_test_nowhitespace.json",
-  ]
-  outputs = [
-    "{{bundle_resources_dir}}/" +
-        "{{source_root_relative_dir}}/{{source_file_part}}",
-  ]
-}
-
-if (is_ios || is_mac) {
-  source_set("base_unittests_arc") {
-    testonly = true
-    set_sources_assignment_filter([])
-    sources = [
-      "mac/bind_objc_block_unittest_arc.mm",
-      "mac/scoped_nsobject_unittest_arc.mm",
-    ]
-    set_sources_assignment_filter(sources_assignment_filter)
-    configs += [ "//build/config/compiler:enable_arc" ]
-    deps = [
-      ":base",
-      "//testing/gtest",
-    ]
-  }
-}
-
-if (is_fuchsia) {
-  fidl_library("test_fidl") {
-    namespace = "base.fuchsia"
-    namespace_path = "base/fuchsia"
-
-    sources = [
-      "fuchsia/test.fidl",
-    ]
-  }
-}
-
-test("base_unittests") {
-  sources = [
-    "allocator/allocator_interception_mac_unittest.mm",
-    "allocator/malloc_zone_functions_mac_unittest.cc",
-    "allocator/tcmalloc_unittest.cc",
-    "android/application_status_listener_unittest.cc",
-    "android/content_uri_utils_unittest.cc",
-    "android/jni_android_unittest.cc",
-    "android/jni_array_unittest.cc",
-    "android/jni_string_unittest.cc",
-    "android/library_loader/library_prefetcher_unittest.cc",
-    "android/path_utils_unittest.cc",
-    "android/scoped_java_ref_unittest.cc",
-    "android/sys_utils_unittest.cc",
-    "android/unguessable_token_android_unittest.cc",
-    "at_exit_unittest.cc",
-    "atomicops_unittest.cc",
-    "barrier_closure_unittest.cc",
-    "base64_unittest.cc",
-    "base64url_unittest.cc",
-    "big_endian_unittest.cc",
-    "bind_unittest.cc",
-    "bit_cast_unittest.cc",
-    "bits_unittest.cc",
-    "build_time_unittest.cc",
-    "callback_helpers_unittest.cc",
-    "callback_list_unittest.cc",
-    "callback_unittest.cc",
-    "cancelable_callback_unittest.cc",
-    "command_line_unittest.cc",
-    "component_export_unittest.cc",
-    "containers/adapters_unittest.cc",
-    "containers/circular_deque_unittest.cc",
-    "containers/flat_map_unittest.cc",
-    "containers/flat_set_unittest.cc",
-    "containers/flat_tree_unittest.cc",
-    "containers/hash_tables_unittest.cc",
-    "containers/id_map_unittest.cc",
-    "containers/linked_list_unittest.cc",
-    "containers/mru_cache_unittest.cc",
-    "containers/small_map_unittest.cc",
-    "containers/span_unittest.cc",
-    "containers/stack_container_unittest.cc",
-    "containers/unique_ptr_adapters_unittest.cc",
-    "containers/vector_buffer_unittest.cc",
-    "cpu_unittest.cc",
-    "debug/activity_analyzer_unittest.cc",
-    "debug/activity_tracker_unittest.cc",
-    "debug/alias_unittest.cc",
-    "debug/crash_logging_unittest.cc",
-    "debug/debugger_unittest.cc",
-    "debug/elf_reader_linux_unittest.cc",
-    "debug/leak_tracker_unittest.cc",
-    "debug/proc_maps_linux_unittest.cc",
-    "debug/stack_trace_unittest.cc",
-    "debug/task_annotator_unittest.cc",
-    "debug/thread_heap_usage_tracker_unittest.cc",
-    "deferred_sequenced_task_runner_unittest.cc",
-    "environment_unittest.cc",
-    "feature_list_unittest.cc",
-    "file_version_info_win_unittest.cc",
-    "files/file_enumerator_unittest.cc",
-    "files/file_path_unittest.cc",
-    "files/file_path_watcher_unittest.cc",
-    "files/file_proxy_unittest.cc",
-    "files/file_unittest.cc",
-    "files/file_util_unittest.cc",
-    "files/important_file_writer_unittest.cc",
-    "files/memory_mapped_file_unittest.cc",
-    "files/scoped_temp_dir_unittest.cc",
-    "gmock_unittest.cc",
-    "guid_unittest.cc",
-    "hash_unittest.cc",
-    "i18n/bidi_line_iterator_unittest.cc",
-    "i18n/break_iterator_unittest.cc",
-    "i18n/case_conversion_unittest.cc",
-    "i18n/char_iterator_unittest.cc",
-    "i18n/character_encoding_unittest.cc",
-    "i18n/file_util_icu_unittest.cc",
-    "i18n/icu_string_conversions_unittest.cc",
-    "i18n/message_formatter_unittest.cc",
-    "i18n/number_formatting_unittest.cc",
-    "i18n/rtl_unittest.cc",
-    "i18n/streaming_utf8_validator_unittest.cc",
-    "i18n/string_search_unittest.cc",
-    "i18n/time_formatting_unittest.cc",
-    "i18n/timezone_unittest.cc",
-    "ios/crb_protocol_observers_unittest.mm",
-    "ios/device_util_unittest.mm",
-    "ios/weak_nsobject_unittest.mm",
-    "json/json_parser_unittest.cc",
-    "json/json_reader_unittest.cc",
-    "json/json_value_converter_unittest.cc",
-    "json/json_value_serializer_unittest.cc",
-    "json/json_writer_unittest.cc",
-    "json/string_escape_unittest.cc",
-    "lazy_instance_unittest.cc",
-    "logging_unittest.cc",
-    "mac/bind_objc_block_unittest.mm",
-    "mac/call_with_eh_frame_unittest.mm",
-    "mac/dispatch_source_mach_unittest.cc",
-    "mac/foundation_util_unittest.mm",
-    "mac/mac_util_unittest.mm",
-    "mac/mach_port_broker_unittest.cc",
-    "mac/objc_release_properties_unittest.mm",
-    "mac/scoped_nsobject_unittest.mm",
-    "mac/scoped_objc_class_swizzler_unittest.mm",
-    "mac/scoped_sending_event_unittest.mm",
-    "md5_unittest.cc",
-    "memory/aligned_memory_unittest.cc",
-    "memory/discardable_shared_memory_unittest.cc",
-    "memory/linked_ptr_unittest.cc",
-    "memory/memory_coordinator_client_registry_unittest.cc",
-    "memory/memory_pressure_listener_unittest.cc",
-    "memory/memory_pressure_monitor_chromeos_unittest.cc",
-    "memory/memory_pressure_monitor_mac_unittest.cc",
-    "memory/memory_pressure_monitor_unittest.cc",
-    "memory/memory_pressure_monitor_win_unittest.cc",
-    "memory/platform_shared_memory_region_unittest.cc",
-    "memory/protected_memory_unittest.cc",
-    "memory/ptr_util_unittest.cc",
-    "memory/ref_counted_memory_unittest.cc",
-    "memory/ref_counted_unittest.cc",
-    "memory/shared_memory_mac_unittest.cc",
-    "memory/shared_memory_region_unittest.cc",
-    "memory/shared_memory_unittest.cc",
-    "memory/shared_memory_win_unittest.cc",
-    "memory/singleton_unittest.cc",
-    "memory/weak_ptr_unittest.cc",
-    "message_loop/message_loop_task_runner_unittest.cc",
-    "message_loop/message_loop_unittest.cc",
-    "message_loop/message_pump_glib_unittest.cc",
-    "message_loop/message_pump_io_ios_unittest.cc",
-    "message_loop/message_pump_mac_unittest.mm",
-    "metrics/bucket_ranges_unittest.cc",
-    "metrics/field_trial_params_unittest.cc",
-    "metrics/field_trial_unittest.cc",
-    "metrics/histogram_base_unittest.cc",
-    "metrics/histogram_delta_serialization_unittest.cc",
-    "metrics/histogram_functions_unittest.cc",
-    "metrics/histogram_macros_unittest.cc",
-    "metrics/histogram_samples_unittest.cc",
-    "metrics/histogram_snapshot_manager_unittest.cc",
-    "metrics/histogram_unittest.cc",
-    "metrics/metrics_hashes_unittest.cc",
-    "metrics/persistent_histogram_allocator_unittest.cc",
-    "metrics/persistent_histogram_storage_unittest.cc",
-    "metrics/persistent_memory_allocator_unittest.cc",
-    "metrics/persistent_sample_map_unittest.cc",
-    "metrics/sample_map_unittest.cc",
-    "metrics/sample_vector_unittest.cc",
-    "metrics/single_sample_metrics_unittest.cc",
-    "metrics/sparse_histogram_unittest.cc",
-    "metrics/statistics_recorder_unittest.cc",
-    "native_library_unittest.cc",
-    "no_destructor_unittest.cc",
-    "observer_list_unittest.cc",
-    "optional_unittest.cc",
-    "os_compat_android_unittest.cc",
-    "path_service_unittest.cc",
-    "pickle_unittest.cc",
-    "power_monitor/power_monitor_unittest.cc",
-    "process/launch_unittest_win.cc",
-    "process/memory_unittest.cc",
-    "process/memory_unittest_mac.h",
-    "process/memory_unittest_mac.mm",
-    "process/process_info_unittest.cc",
-    "process/process_metrics_unittest.cc",
-    "process/process_unittest.cc",
-    "process/process_util_unittest.cc",
-    "profiler/stack_sampling_profiler_unittest.cc",
-    "rand_util_unittest.cc",
-    "run_loop_unittest.cc",
-    "safe_numerics_unittest.cc",
-    "scoped_clear_errno_unittest.cc",
-    "scoped_generic_unittest.cc",
-    "scoped_native_library_unittest.cc",
-    "security_unittest.cc",
-    "sequence_checker_unittest.cc",
-    "sequence_token_unittest.cc",
-    "sequenced_task_runner_unittest.cc",
-    "sha1_unittest.cc",
-    "stl_util_unittest.cc",
-    "strings/char_traits_unittest.cc",
-    "strings/nullable_string16_unittest.cc",
-    "strings/pattern_unittest.cc",
-    "strings/safe_sprintf_unittest.cc",
-    "strings/strcat_unittest.cc",
-    "strings/string16_unittest.cc",
-    "strings/string_number_conversions_unittest.cc",
-    "strings/string_piece_unittest.cc",
-    "strings/string_split_unittest.cc",
-    "strings/string_tokenizer_unittest.cc",
-    "strings/string_util_unittest.cc",
-    "strings/stringize_macros_unittest.cc",
-    "strings/stringprintf_unittest.cc",
-    "strings/sys_string_conversions_mac_unittest.mm",
-    "strings/sys_string_conversions_unittest.cc",
-    "strings/utf_offset_string_conversions_unittest.cc",
-    "strings/utf_string_conversions_unittest.cc",
-    "supports_user_data_unittest.cc",
-    "sync_socket_unittest.cc",
-    "synchronization/atomic_flag_unittest.cc",
-    "synchronization/condition_variable_unittest.cc",
-    "synchronization/lock_unittest.cc",
-    "synchronization/waitable_event_unittest.cc",
-    "synchronization/waitable_event_watcher_unittest.cc",
-    "sys_byteorder_unittest.cc",
-    "sys_info_unittest.cc",
-    "system_monitor/system_monitor_unittest.cc",
-    "task/cancelable_task_tracker_unittest.cc",
-    "task_runner_util_unittest.cc",
-    "task_scheduler/delayed_task_manager_unittest.cc",
-    "task_scheduler/lazy_task_runner_unittest.cc",
-    "task_scheduler/priority_queue_unittest.cc",
-    "task_scheduler/scheduler_lock_unittest.cc",
-    "task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc",
-    "task_scheduler/scheduler_worker_pool_impl_unittest.cc",
-    "task_scheduler/scheduler_worker_pool_unittest.cc",
-    "task_scheduler/scheduler_worker_stack_unittest.cc",
-    "task_scheduler/scheduler_worker_unittest.cc",
-    "task_scheduler/scoped_set_task_priority_for_current_thread_unittest.cc",
-    "task_scheduler/sequence_sort_key_unittest.cc",
-    "task_scheduler/sequence_unittest.cc",
-    "task_scheduler/service_thread_unittest.cc",
-    "task_scheduler/task_scheduler_impl_unittest.cc",
-    "task_scheduler/task_tracker_unittest.cc",
-    "task_scheduler/task_traits_unittest.cc",
-    "task_scheduler/task_unittest.cc",
-    "task_scheduler/test_task_factory.cc",
-    "task_scheduler/test_task_factory.h",
-    "task_scheduler/test_utils.cc",
-    "task_scheduler/test_utils.h",
-    "task_scheduler/tracked_ref_unittest.cc",
-    "template_util_unittest.cc",
-    "test/histogram_tester_unittest.cc",
-    "test/mock_callback_unittest.cc",
-    "test/scoped_feature_list_unittest.cc",
-    "test/scoped_mock_time_message_loop_task_runner_unittest.cc",
-    "test/scoped_task_environment_unittest.cc",
-    "test/test_mock_time_task_runner_unittest.cc",
-    "test/test_pending_task_unittest.cc",
-    "test/test_reg_util_win_unittest.cc",
-    "test/trace_event_analyzer_unittest.cc",
-    "test/user_action_tester_unittest.cc",
-    "thread_annotations_unittest.cc",
-    "threading/platform_thread_unittest.cc",
-    "threading/post_task_and_reply_impl_unittest.cc",
-    "threading/scoped_blocking_call_unittest.cc",
-    "threading/sequence_local_storage_map_unittest.cc",
-    "threading/sequence_local_storage_slot_unittest.cc",
-    "threading/sequenced_task_runner_handle_unittest.cc",
-    "threading/simple_thread_unittest.cc",
-    "threading/thread_checker_unittest.cc",
-    "threading/thread_collision_warner_unittest.cc",
-    "threading/thread_id_name_manager_unittest.cc",
-    "threading/thread_local_storage_unittest.cc",
-    "threading/thread_local_unittest.cc",
-    "threading/thread_restrictions_unittest.cc",
-    "threading/thread_task_runner_handle_unittest.cc",
-    "threading/thread_unittest.cc",
-    "threading/watchdog_unittest.cc",
-    "time/pr_time_unittest.cc",
-    "time/time_unittest.cc",
-    "time/time_win_unittest.cc",
-    "timer/hi_res_timer_manager_unittest.cc",
-    "timer/mock_timer_unittest.cc",
-    "timer/timer_unittest.cc",
-    "tools_sanity_unittest.cc",
-    "trace_event/blame_context_unittest.cc",
-    "trace_event/event_name_filter_unittest.cc",
-    "trace_event/heap_profiler_allocation_context_tracker_unittest.cc",
-    "trace_event/heap_profiler_heap_dump_writer_unittest.cc",
-    "trace_event/heap_profiler_stack_frame_deduplicator_unittest.cc",
-    "trace_event/heap_profiler_type_name_deduplicator_unittest.cc",
-    "trace_event/java_heap_dump_provider_android_unittest.cc",
-    "trace_event/memory_allocator_dump_unittest.cc",
-    "trace_event/memory_dump_manager_unittest.cc",
-    "trace_event/memory_dump_scheduler_unittest.cc",
-    "trace_event/memory_peak_detector_unittest.cc",
-    "trace_event/memory_usage_estimator_unittest.cc",
-    "trace_event/process_memory_dump_unittest.cc",
-    "trace_event/trace_category_unittest.cc",
-    "trace_event/trace_config_unittest.cc",
-    "trace_event/trace_event_argument_unittest.cc",
-    "trace_event/trace_event_filter_test_utils.cc",
-    "trace_event/trace_event_filter_test_utils.h",
-    "trace_event/trace_event_system_stats_monitor_unittest.cc",
-    "trace_event/trace_event_unittest.cc",
-    "tuple_unittest.cc",
-    "unguessable_token_unittest.cc",
-    "value_iterators_unittest.cc",
-    "values_unittest.cc",
-    "version_unittest.cc",
-    "vlog_unittest.cc",
-    "win/async_operation_unittest.cc",
-    "win/com_init_check_hook_unittest.cc",
-    "win/com_init_util_unittest.cc",
-    "win/core_winrt_util_unittest.cc",
-    "win/dllmain.cc",
-    "win/enum_variant_unittest.cc",
-    "win/event_trace_consumer_unittest.cc",
-    "win/event_trace_controller_unittest.cc",
-    "win/event_trace_provider_unittest.cc",
-    "win/i18n_unittest.cc",
-    "win/iunknown_impl_unittest.cc",
-    "win/message_window_unittest.cc",
-    "win/object_watcher_unittest.cc",
-    "win/pe_image_unittest.cc",
-    "win/registry_unittest.cc",
-    "win/scoped_bstr_unittest.cc",
-    "win/scoped_handle_unittest.cc",
-    "win/scoped_hstring_unittest.cc",
-    "win/scoped_process_information_unittest.cc",
-    "win/scoped_variant_unittest.cc",
-    "win/scoped_winrt_initializer_unittest.cc",
-    "win/shortcut_unittest.cc",
-    "win/startup_information_unittest.cc",
-    "win/typed_event_handler_unittest.cc",
-    "win/wait_chain_unittest.cc",
-    "win/win_includes_unittest.cc",
-    "win/win_util_unittest.cc",
-    "win/windows_version_unittest.cc",
-    "win/winrt_storage_util_unittest.cc",
-    "win/wrapped_window_proc_unittest.cc",
-  ]
-
-  defines = []
-
-  deps = [
-    ":base",
-    ":i18n",
-    "//base/allocator:buildflags",
-    "//base/test:native_library_test_utils",
-    "//base/test:run_all_base_unittests",
-    "//base/test:test_support",
-    "//base/third_party/dynamic_annotations",
-    "//testing/gmock",
-    "//testing/gtest",
-    "//third_party/icu",
-  ]
-
-  data_deps = [
-    "//base/test:test_child_process",
-    "//base/test:test_shared_library",
-  ]
-
-  if (is_ios || is_mac) {
-    deps += [ ":base_unittests_arc" ]
-  }
-
-  public_deps = [
-    ":base_unittests_bundle_data",
-  ]
-
-  data = [
-    "test/data/",
-  ]
-
-  if (is_posix) {
-    sources += [
-      "files/dir_reader_posix_unittest.cc",
-      "files/file_descriptor_watcher_posix_unittest.cc",
-      "message_loop/message_loop_io_posix_unittest.cc",
-      "posix/file_descriptor_shuffle_unittest.cc",
-      "posix/unix_domain_socket_unittest.cc",
-      "task_scheduler/task_tracker_posix_unittest.cc",
-    ]
-  }
-
-  # Allow more direct string conversions on platforms with native utf8
-  # strings
-  if (is_mac || is_ios || is_chromeos || is_chromecast || is_fuchsia) {
-    defines += [ "SYSTEM_NATIVE_UTF8" ]
-  }
-
-  if (is_android) {
-    # Add unwind tables in base_unittests_apk test apk. The unwind tables are
-    # generated from debug info in the binary. Removing "default_symbols" and
-    # adding symbols config removes the "strip_debug" config that strips the
-    # debug info, on base unittests apk.
-    if (can_unwind_with_cfi_table) {
-      configs -= [ "//build/config/compiler:default_symbols" ]
-      if (symbol_level == 2) {
-        configs += [ "//build/config/compiler:symbols" ]
-      } else {
-        configs += [ "//build/config/compiler:minimal_symbols" ]
-      }
-      add_unwind_tables_in_apk = true
-      sources += [ "trace_event/cfi_backtrace_android_unittest.cc" ]
-    }
-    sources -= [
-      "process/process_unittest.cc",
-      "process/process_util_unittest.cc",
-    ]
-    deps += [
-      ":base_java",
-      ":base_java_unittest_support",
-      "//base/test:test_support_java",
-    ]
-  }
-
-  if (is_ios) {
-    sources -= [
-      "files/file_path_watcher_unittest.cc",
-      "memory/discardable_shared_memory_unittest.cc",
-      "memory/shared_memory_unittest.cc",
-      "process/memory_unittest.cc",
-      "process/process_unittest.cc",
-      "process/process_util_unittest.cc",
-      "sync_socket_unittest.cc",
-      "synchronization/waitable_event_watcher_unittest.cc",
-    ]
-
-    # Pull in specific Mac files for iOS (which have been filtered out by file
-    # name rules).
-    set_sources_assignment_filter([])
-    sources += [
-      "mac/bind_objc_block_unittest.mm",
-      "mac/foundation_util_unittest.mm",
-      "mac/objc_release_properties_unittest.mm",
-      "mac/scoped_nsobject_unittest.mm",
-      "strings/sys_string_conversions_mac_unittest.mm",
-    ]
-    set_sources_assignment_filter(sources_assignment_filter)
-
-    # TODO(GYP): dep on copy_test_data_ios action.
-  }
-
-  if (use_partition_alloc) {
-    sources += [
-      "allocator/partition_allocator/address_space_randomization_unittest.cc",
-      "allocator/partition_allocator/page_allocator_unittest.cc",
-      "allocator/partition_allocator/partition_alloc_unittest.cc",
-      "allocator/partition_allocator/spin_lock_unittest.cc",
-    ]
-  }
-
-  if (is_mac) {
-    libs = [
-      "CoreFoundation.framework",
-      "Foundation.framework",
-    ]
-    if (current_cpu == "x64") {
-      data_deps += [ ":base_profiler_test_support_library" ]
-    }
-  }
-
-  if (is_linux) {
-    if (is_desktop_linux) {
-      sources += [ "nix/xdg_util_unittest.cc" ]
-    }
-
-    deps += [ "//base/test:malloc_wrapper" ]
-    defines += [
-      # This library is used by ElfReaderTest to test reading elf files.
-      "MALLOC_WRAPPER_LIB=\"${shlib_prefix}malloc_wrapper${shlib_extension}\"",
-    ]
-
-    if (!is_component_build) {
-      # Set rpath to find libmalloc_wrapper.so even in a non-component build.
-      configs += [ "//build/config/gcc:rpath_for_built_shared_libraries" ]
-    }
-  }
-
-  if (!use_glib) {
-    sources -= [ "message_loop/message_pump_glib_unittest.cc" ]
-  }
-
-  if (use_libevent) {
-    sources += [ "message_loop/message_pump_libevent_unittest.cc" ]
-    deps += [ "//base/third_party/libevent" ]
-  }
-
-  if (is_fuchsia) {
-    sources += [
-      "files/dir_reader_posix_unittest.cc",
-      "files/file_descriptor_watcher_posix_unittest.cc",
-      "fuchsia/services_directory_unittest.cc",
-      "message_loop/message_loop_io_posix_unittest.cc",
-      "posix/file_descriptor_shuffle_unittest.cc",
-      "task_scheduler/task_tracker_posix_unittest.cc",
-    ]
-
-    sources += [ "fuchsia/async_dispatcher_unittest.cc" ]
-    deps += [
-      ":test_fidl",
-      "//third_party/fuchsia-sdk:async",
-      "//third_party/fuchsia-sdk:async_default",
-      "//third_party/fuchsia-sdk:fdio",
-    ]
-  }
-
-  if (!is_fuchsia && !is_ios) {
-    sources += [ "files/file_locking_unittest.cc" ]
-  }
-
-  if (is_android) {
-    deps += [ "//testing/android/native_test:native_test_native_code" ]
-    set_sources_assignment_filter([])
-    sources += [
-      "debug/elf_reader_linux_unittest.cc",
-      "debug/proc_maps_linux_unittest.cc",
-      "trace_event/trace_event_android_unittest.cc",
-    ]
-    set_sources_assignment_filter(sources_assignment_filter)
-  }
-
-  if (is_win) {
-    deps += [ "//base:scoped_handle_test_dll" ]
-    if (current_cpu == "x64") {
-      sources += [ "profiler/win32_stack_frame_unwinder_unittest.cc" ]
-      data_deps += [ ":base_profiler_test_support_library" ]
-    }
-  }
-
-  if (use_allocator_shim) {
-    sources += [
-      "allocator/allocator_shim_unittest.cc",
-      "sampling_heap_profiler/sampling_heap_profiler_unittest.cc",
-    ]
-  }
-
-  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  # Symbols for crashes when running tests on swarming.
-  if (symbol_level > 0) {
-    if (is_win) {
-      data += [ "$root_out_dir/base_unittests.exe.pdb" ]
-    } else if (is_mac) {
-      # TODO(crbug.com/330301): make this conditional on mac_strip_release.
-      # data += [ "$root_out_dir/base_unittests.dSYM/" ]
-    }
-  }
-}
-
-action("build_date") {
-  script = "//build/write_build_date_header.py"
-
-  # Force recalculation if there's been a change.
-  inputs = [
-    "//build/util/LASTCHANGE",
-  ]
-  outputs = [
-    "$target_gen_dir/generated_build_date.h",
-  ]
-
-  args =
-      [ rebase_path("$target_gen_dir/generated_build_date.h", root_build_dir) ]
-
-  if (is_official_build) {
-    args += [ "official" ]
-  } else {
-    args += [ "default" ]
-  }
-
-  if (override_build_date != "N/A") {
-    args += [ override_build_date ]
-  }
-}
-
-if (enable_nocompile_tests) {
-  nocompile_test("base_nocompile_tests") {
-    sources = [
-      "bind_unittest.nc",
-      "callback_list_unittest.nc",
-      "callback_unittest.nc",
-      "containers/span_unittest.nc",
-      "memory/ref_counted_unittest.nc",
-      "memory/weak_ptr_unittest.nc",
-      "metrics/field_trial_params_unittest.nc",
-      "metrics/histogram_unittest.nc",
-      "optional_unittest.nc",
-      "strings/string16_unittest.nc",
-      "task_scheduler/task_traits_unittest.nc",
-      "thread_annotations_unittest.nc",
-    ]
-
-    deps = [
-      ":base",
-      "//base/test:run_all_unittests",
-      "//testing/gtest",
-    ]
-  }
-}
-
-if (is_android) {
-  generate_jni("base_jni_headers") {
-    sources = [
-      "android/java/src/org/chromium/base/AnimationFrameTimeHistogram.java",
-      "android/java/src/org/chromium/base/ApkAssets.java",
-      "android/java/src/org/chromium/base/ApplicationStatus.java",
-      "android/java/src/org/chromium/base/BuildInfo.java",
-      "android/java/src/org/chromium/base/Callback.java",
-      "android/java/src/org/chromium/base/CommandLine.java",
-      "android/java/src/org/chromium/base/ContentUriUtils.java",
-      "android/java/src/org/chromium/base/CpuFeatures.java",
-      "android/java/src/org/chromium/base/EarlyTraceEvent.java",
-      "android/java/src/org/chromium/base/EventLog.java",
-      "android/java/src/org/chromium/base/FieldTrialList.java",
-      "android/java/src/org/chromium/base/ImportantFileWriterAndroid.java",
-      "android/java/src/org/chromium/base/JNIUtils.java",
-      "android/java/src/org/chromium/base/JavaExceptionReporter.java",
-      "android/java/src/org/chromium/base/JavaHandlerThread.java",
-      "android/java/src/org/chromium/base/LocaleUtils.java",
-      "android/java/src/org/chromium/base/MemoryPressureListener.java",
-      "android/java/src/org/chromium/base/PathService.java",
-      "android/java/src/org/chromium/base/PathUtils.java",
-      "android/java/src/org/chromium/base/PowerMonitor.java",
-      "android/java/src/org/chromium/base/SysUtils.java",
-      "android/java/src/org/chromium/base/SystemMessageHandler.java",
-      "android/java/src/org/chromium/base/ThreadUtils.java",
-      "android/java/src/org/chromium/base/ThrowUncaughtException.java",
-      "android/java/src/org/chromium/base/TimeUtils.java",
-      "android/java/src/org/chromium/base/TimezoneUtils.java",
-      "android/java/src/org/chromium/base/TraceEvent.java",
-      "android/java/src/org/chromium/base/UnguessableToken.java",
-      "android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
-      "android/java/src/org/chromium/base/metrics/RecordHistogram.java",
-      "android/java/src/org/chromium/base/metrics/RecordUserAction.java",
-      "android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java",
-      "android/java/src/org/chromium/base/process_launcher/ChildProcessService.java",
-    ]
-
-    public_deps = [
-      ":android_runtime_jni_headers",
-    ]
-
-    jni_package = "base"
-  }
-
-  generate_jar_jni("android_runtime_jni_headers") {
-    jni_package = "base"
-    classes = [ "java/lang/Runtime.class" ]
-  }
-
-  android_library("base_java") {
-    srcjar_deps = [
-      ":base_android_java_enums_srcjar",
-      ":base_build_config_gen",
-      ":base_java_aidl",
-      ":base_native_libraries_gen",
-    ]
-
-    deps = [
-      "//third_party/android_tools:android_support_annotations_java",
-      "//third_party/android_tools:android_support_multidex_java",
-      "//third_party/android_tools:android_support_v4_java",
-      "//third_party/jsr-305:jsr_305_javalib",
-    ]
-
-    java_files = [
-      "android/java/src/org/chromium/base/ActivityState.java",
-      "android/java/src/org/chromium/base/AnimationFrameTimeHistogram.java",
-      "android/java/src/org/chromium/base/ApiCompatibilityUtils.java",
-      "android/java/src/org/chromium/base/ApkAssets.java",
-      "android/java/src/org/chromium/base/ApplicationStatus.java",
-      "android/java/src/org/chromium/base/BaseSwitches.java",
-      "android/java/src/org/chromium/base/BuildInfo.java",
-      "android/java/src/org/chromium/base/Callback.java",
-      "android/java/src/org/chromium/base/CollectionUtil.java",
-      "android/java/src/org/chromium/base/CommandLine.java",
-      "android/java/src/org/chromium/base/CommandLineInitUtil.java",
-      "android/java/src/org/chromium/base/ContentUriUtils.java",
-      "android/java/src/org/chromium/base/ContextUtils.java",
-      "android/java/src/org/chromium/base/CpuFeatures.java",
-      "android/java/src/org/chromium/base/DiscardableReferencePool.java",
-      "android/java/src/org/chromium/base/EarlyTraceEvent.java",
-      "android/java/src/org/chromium/base/EventLog.java",
-      "android/java/src/org/chromium/base/FieldTrialList.java",
-      "android/java/src/org/chromium/base/FileUtils.java",
-      "android/java/src/org/chromium/base/ImportantFileWriterAndroid.java",
-      "android/java/src/org/chromium/base/JNIUtils.java",
-      "android/java/src/org/chromium/base/JavaExceptionReporter.java",
-      "android/java/src/org/chromium/base/JavaHandlerThread.java",
-      "android/java/src/org/chromium/base/LocaleUtils.java",
-      "android/java/src/org/chromium/base/Log.java",
-      "android/java/src/org/chromium/base/MemoryPressureListener.java",
-      "android/java/src/org/chromium/base/NonThreadSafe.java",
-      "android/java/src/org/chromium/base/ObserverList.java",
-      "android/java/src/org/chromium/base/PackageUtils.java",
-      "android/java/src/org/chromium/base/PathService.java",
-      "android/java/src/org/chromium/base/PathUtils.java",
-      "android/java/src/org/chromium/base/PowerMonitor.java",
-      "android/java/src/org/chromium/base/Promise.java",
-      "android/java/src/org/chromium/base/ResourceExtractor.java",
-      "android/java/src/org/chromium/base/SecureRandomInitializer.java",
-      "android/java/src/org/chromium/base/StreamUtil.java",
-      "android/java/src/org/chromium/base/StrictModeContext.java",
-      "android/java/src/org/chromium/base/Supplier.java",
-      "android/java/src/org/chromium/base/SysUtils.java",
-      "android/java/src/org/chromium/base/SystemMessageHandler.java",
-      "android/java/src/org/chromium/base/ThreadUtils.java",
-      "android/java/src/org/chromium/base/ThrowUncaughtException.java",
-      "android/java/src/org/chromium/base/TimeUtils.java",
-      "android/java/src/org/chromium/base/TimezoneUtils.java",
-      "android/java/src/org/chromium/base/TraceEvent.java",
-      "android/java/src/org/chromium/base/UnguessableToken.java",
-      "android/java/src/org/chromium/base/VisibleForTesting.java",
-      "android/java/src/org/chromium/base/annotations/AccessedByNative.java",
-      "android/java/src/org/chromium/base/annotations/CalledByNative.java",
-      "android/java/src/org/chromium/base/annotations/CalledByNativeUnchecked.java",
-      "android/java/src/org/chromium/base/annotations/JNIAdditionalImport.java",
-      "android/java/src/org/chromium/base/annotations/JNINamespace.java",
-      "android/java/src/org/chromium/base/annotations/MainDex.java",
-      "android/java/src/org/chromium/base/annotations/NativeCall.java",
-      "android/java/src/org/chromium/base/annotations/NativeClassQualifiedName.java",
-      "android/java/src/org/chromium/base/annotations/RemovableInRelease.java",
-      "android/java/src/org/chromium/base/annotations/UsedByReflection.java",
-      "android/java/src/org/chromium/base/library_loader/LegacyLinker.java",
-      "android/java/src/org/chromium/base/library_loader/LibraryLoader.java",
-      "android/java/src/org/chromium/base/library_loader/Linker.java",
-      "android/java/src/org/chromium/base/library_loader/LoaderErrors.java",
-      "android/java/src/org/chromium/base/library_loader/NativeLibraryPreloader.java",
-      "android/java/src/org/chromium/base/library_loader/ProcessInitException.java",
-      "android/java/src/org/chromium/base/metrics/CachedMetrics.java",
-      "android/java/src/org/chromium/base/metrics/RecordHistogram.java",
-      "android/java/src/org/chromium/base/metrics/RecordUserAction.java",
-      "android/java/src/org/chromium/base/metrics/StatisticsRecorderAndroid.java",
-      "android/java/src/org/chromium/base/multidex/ChromiumMultiDexInstaller.java",
-      "android/java/src/org/chromium/base/process_launcher/ChildConnectionAllocator.java",
-      "android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java",
-      "android/java/src/org/chromium/base/process_launcher/ChildProcessConstants.java",
-      "android/java/src/org/chromium/base/process_launcher/ChildProcessLauncher.java",
-      "android/java/src/org/chromium/base/process_launcher/ChildProcessService.java",
-      "android/java/src/org/chromium/base/process_launcher/ChildProcessServiceDelegate.java",
-      "android/java/src/org/chromium/base/process_launcher/FileDescriptorInfo.java",
-      "android/java/src/org/chromium/base/memory/MemoryPressureMonitor.java",
-      "android/java/src/org/chromium/base/memory/MemoryPressureCallback.java",
-      "android/java/src/org/chromium/base/memory/MemoryPressureUma.java",
-    ]
-
-    # New versions of BuildConfig.java and NativeLibraries.java
-    # (with the actual correct values) will be created when creating an apk.
-    jar_excluded_patterns = [
-      "*/BuildConfig.class",
-      "*/NativeLibraries.class",
-      "*/NativeLibraries##*.class",
-    ]
-  }
-
-  android_aidl("base_java_aidl") {
-    import_include = [ "android/java/src" ]
-    sources = [
-      "android/java/src/org/chromium/base/process_launcher/ICallbackInt.aidl",
-      "android/java/src/org/chromium/base/process_launcher/IChildProcessService.aidl",
-    ]
-  }
-
-  android_library("base_javatests") {
-    testonly = true
-    deps = [
-      ":base_java",
-      ":base_java_test_support",
-      "//third_party/android_support_test_runner:runner_java",
-      "//third_party/junit:junit",
-    ]
-    java_files = [
-      "android/javatests/src/org/chromium/base/AdvancedMockContextTest.java",
-      "android/javatests/src/org/chromium/base/ApiCompatibilityUtilsTest.java",
-      "android/javatests/src/org/chromium/base/CommandLineInitUtilTest.java",
-      "android/javatests/src/org/chromium/base/CommandLineTest.java",
-      "android/javatests/src/org/chromium/base/EarlyTraceEventTest.java",
-
-      # TODO(nona): move to Junit once that is built for Android N.
-      "android/javatests/src/org/chromium/base/LocaleUtilsTest.java",
-      "android/javatests/src/org/chromium/base/ObserverListTest.java",
-      "android/javatests/src/org/chromium/base/StrictModeContextTest.java",
-      "android/javatests/src/org/chromium/base/metrics/RecordHistogramTest.java",
-    ]
-  }
-
-  android_library("base_java_test_support") {
-    testonly = true
-    deps = [
-      ":base_java",
-      "//testing/android/reporter:reporter_java",
-      "//third_party/android_support_test_runner:exposed_instrumentation_api_publish_java",
-      "//third_party/android_support_test_runner:rules_java",
-      "//third_party/android_support_test_runner:runner_java",
-      "//third_party/android_tools:android_support_annotations_java",
-      "//third_party/android_tools:android_support_chromium_java",
-      "//third_party/android_tools:android_support_compat_java",
-      "//third_party/hamcrest:hamcrest_core_java",
-      "//third_party/junit",
-      "//third_party/ub-uiautomator:ub_uiautomator_java",
-    ]
-
-    deps += android_extra_test_deps
-
-    java_files = [
-      "test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java",
-      "test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java",
-      "test/android/javatests/src/org/chromium/base/test/BaseChromiumRunnerCommon.java",
-      "test/android/javatests/src/org/chromium/base/test/BaseTestResult.java",
-      "test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java",
-      "test/android/javatests/src/org/chromium/base/test/SetUpTestRule.java",
-      "test/android/javatests/src/org/chromium/base/test/SetUpStatement.java",
-      "test/android/javatests/src/org/chromium/base/test/TestListInstrumentationRunListener.java",
-      "test/android/javatests/src/org/chromium/base/test/TestTraceEvent.java",
-      "test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunner.java",
-      "test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java",
-      "test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java",
-      "test/android/javatests/src/org/chromium/base/test/params/MethodParamAnnotationRule.java",
-      "test/android/javatests/src/org/chromium/base/test/params/MethodParamRule.java",
-      "test/android/javatests/src/org/chromium/base/test/params/ParameterAnnotations.java",
-      "test/android/javatests/src/org/chromium/base/test/params/ParameterizedFrameworkMethod.java",
-      "test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegate.java",
-      "test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommon.java",
-      "test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java",
-      "test/android/javatests/src/org/chromium/base/test/params/ParameterProvider.java",
-      "test/android/javatests/src/org/chromium/base/test/params/ParameterSet.java",
-      "test/android/javatests/src/org/chromium/base/test/util/AdvancedMockContext.java",
-      "test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java",
-      "test/android/javatests/src/org/chromium/base/test/util/CallbackHelper.java",
-      "test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java",
-      "test/android/javatests/src/org/chromium/base/test/util/DisableIf.java",
-      "test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java",
-      "test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessingUtils.java",
-      "test/android/javatests/src/org/chromium/base/test/util/DisabledTest.java",
-      "test/android/javatests/src/org/chromium/base/test/util/EnormousTest.java",
-      "test/android/javatests/src/org/chromium/base/test/util/Feature.java",
-      "test/android/javatests/src/org/chromium/base/test/util/FlakyTest.java",
-      "test/android/javatests/src/org/chromium/base/test/util/InMemorySharedPreferences.java",
-      "test/android/javatests/src/org/chromium/base/test/util/InstrumentationUtils.java",
-      "test/android/javatests/src/org/chromium/base/test/util/IntegrationTest.java",
-      "test/android/javatests/src/org/chromium/base/test/util/Manual.java",
-      "test/android/javatests/src/org/chromium/base/test/util/ManualSkipCheck.java",
-      "test/android/javatests/src/org/chromium/base/test/util/Matchers.java",
-      "test/android/javatests/src/org/chromium/base/test/util/MetricsUtils.java",
-      "test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevel.java",
-      "test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java",
-      "test/android/javatests/src/org/chromium/base/test/util/Restriction.java",
-      "test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java",
-      "test/android/javatests/src/org/chromium/base/test/util/RetryOnFailure.java",
-      "test/android/javatests/src/org/chromium/base/test/util/ScalableTimeout.java",
-      "test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java",
-      "test/android/javatests/src/org/chromium/base/test/util/TestFileUtil.java",
-      "test/android/javatests/src/org/chromium/base/test/util/TestThread.java",
-      "test/android/javatests/src/org/chromium/base/test/util/TimeoutScale.java",
-      "test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java",
-      "test/android/javatests/src/org/chromium/base/test/util/UrlUtils.java",
-      "test/android/javatests/src/org/chromium/base/test/util/parameter/CommandLineParameter.java",
-      "test/android/javatests/src/org/chromium/base/test/util/parameter/SkipCommandLineParameterization.java",
-    ]
-  }
-
-  android_library("base_java_process_launcher_test_support") {
-    testonly = true
-    deps = [
-      ":base_java",
-      ":base_java_test_support",
-    ]
-    java_files = [ "test/android/javatests/src/org/chromium/base/test/TestChildProcessConnection.java" ]
-  }
-
-  android_library("base_junit_test_support") {
-    # Plaform checks are broken for Robolectric.
-    bypass_platform_checks = true
-    testonly = true
-    java_files = [
-      "android/junit/src/org/chromium/base/metrics/test/ShadowRecordHistogram.java",
-      "test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java",
-    ]
-    deps = [
-      ":base_java",
-      "//testing/android/junit:junit_test_support",
-      "//third_party/robolectric:robolectric_all_java",
-    ]
-  }
-
-  junit_binary("base_junit_tests") {
-    java_files = [
-      "android/junit/src/org/chromium/base/ApplicationStatusTest.java",
-      "android/junit/src/org/chromium/base/DiscardableReferencePoolTest.java",
-      "android/junit/src/org/chromium/base/LogTest.java",
-      "android/junit/src/org/chromium/base/NonThreadSafeTest.java",
-      "android/junit/src/org/chromium/base/PromiseTest.java",
-      "android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java",
-      "android/junit/src/org/chromium/base/process_launcher/ChildConnectionAllocatorTest.java",
-      "android/junit/src/org/chromium/base/process_launcher/ChildProcessConnectionTest.java",
-      "test/android/junit/src/org/chromium/base/test/SetUpStatementTest.java",
-      "test/android/junit/src/org/chromium/base/test/TestListInstrumentationRunListenerTest.java",
-      "test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java",
-      "test/android/junit/src/org/chromium/base/test/util/DisableIfTest.java",
-      "test/android/junit/src/org/chromium/base/test/util/ManualSkipCheckTest.java",
-      "test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java",
-      "test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java",
-      "test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java",
-      "test/android/junit/src/org/chromium/base/test/params/ExampleParameterizedTest.java",
-      "test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerTest.java",
-      "test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommonTest.java",
-      "test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactoryTest.java",
-      "test/android/junit/src/org/chromium/base/test/params/ParameterizedTestNameTest.java",
-    ]
-    deps = [
-      ":base_java",
-      ":base_java_process_launcher_test_support",
-      ":base_java_test_support",
-      ":base_junit_test_support",
-      "//third_party/hamcrest:hamcrest_java",
-    ]
-  }
-
-  java_cpp_enum("base_android_java_enums_srcjar") {
-    sources = [
-      "android/application_status_listener.h",
-      "android/library_loader/library_load_from_apk_status_codes.h",
-      "android/library_loader/library_loader_hooks.h",
-      "memory/memory_pressure_listener.h",
-      "metrics/histogram_base.h",
-      "trace_event/trace_config.h",
-    ]
-  }
-
-  generate_build_config_srcjar("base_build_config_gen") {
-    use_final_fields = false
-  }
-
-  java_cpp_template("base_native_libraries_gen") {
-    sources = [
-      "android/java/templates/NativeLibraries.template",
-    ]
-    package_path = "org/chromium/base/library_loader"
-  }
-
-  android_library("base_java_unittest_support") {
-    testonly = true
-    deps = [
-      ":base_java",
-    ]
-    java_files = [
-      "test/android/java/src/org/chromium/base/ContentUriTestUtils.java",
-      "test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java",
-    ]
-  }
-}
-
-# Keep the list of fuzzer_tests in alphabetical order.
-fuzzer_test("base64_decode_fuzzer") {
-  sources = [
-    "base64_decode_fuzzer.cc",
-  ]
-  deps = [
-    "//base",
-  ]
-}
-
-fuzzer_test("base64_encode_fuzzer") {
-  sources = [
-    "base64_encode_fuzzer.cc",
-  ]
-  deps = [
-    "//base",
-  ]
-}
-
-fuzzer_test("base_json_correctness_fuzzer") {
-  sources = [
-    "json/json_correctness_fuzzer.cc",
-  ]
-  deps = [
-    ":base",
-  ]
-  dict = "//testing/libfuzzer/fuzzers/dicts/json.dict"
-}
-
-fuzzer_test("base_json_reader_fuzzer") {
-  sources = [
-    "json/json_reader_fuzzer.cc",
-  ]
-  deps = [
-    "//base",
-  ]
-  dict = "//testing/libfuzzer/fuzzers/dicts/json.dict"
-}
-
-fuzzer_test("base_json_string_escape_fuzzer") {
-  sources = [
-    "json/string_escape_fuzzer.cc",
-  ]
-  deps = [
-    "//base",
-  ]
-}
-
-fuzzer_test("string_number_conversions_fuzzer") {
-  sources = [
-    "strings/string_number_conversions_fuzzer.cc",
-  ]
-  deps = [
-    "//base",
-  ]
-}
-
-fuzzer_test("string_tokenizer_fuzzer") {
-  sources = [
-    "strings/string_tokenizer_fuzzer.cc",
-  ]
-  deps = [
-    "//base",
-  ]
-}
-
-fuzzer_test("utf_string_conversions_fuzzer") {
-  sources = [
-    "strings/utf_string_conversions_fuzzer.cc",
-  ]
-  deps = [
-    "//base",
-  ]
-}
-
-# TODO(dyaroshev): remove regression fuzzer, after we run it for a few days
-#                  and are confident that the transition was ok.
-fuzzer_test("utf_string_conversions_regression_fuzzer") {
-  sources = [
-    "strings/old_utf_string_conversions.cc",
-    "strings/old_utf_string_conversions.h",
-    "strings/utf_string_conversions_regression_fuzzer.cc",
-  ]
-  deps = [
-    ":base",
-  ]
-
-  libfuzzer_options = [ "max_len=32" ]
-}
diff --git a/base/allocator/BUILD.gn b/base/allocator/BUILD.gn
deleted file mode 100644
index 636a342..0000000
--- a/base/allocator/BUILD.gn
+++ /dev/null
@@ -1,284 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/buildflag_header.gni")
-import("//build/config/allocator.gni")
-import("//build/config/compiler/compiler.gni")
-
-declare_args() {
-  # Provide a way to force disable debugallocation in Debug builds,
-  # e.g. for profiling (it's more rare to profile Debug builds,
-  # but people sometimes need to do that).
-  enable_debugallocation = is_debug
-}
-
-# This "allocator" meta-target will forward to the default allocator according
-# to the build settings.
-group("allocator") {
-  public_deps = []
-  deps = []
-
-  if (use_allocator == "tcmalloc") {
-    deps += [ ":tcmalloc" ]
-  }
-}
-
-config("tcmalloc_flags") {
-  defines = []
-  if (enable_debugallocation) {
-    defines += [
-      # Use debugallocation for Debug builds to catch problems early
-      # and cleanly, http://crbug.com/30715 .
-      "TCMALLOC_FOR_DEBUGALLOCATION",
-    ]
-  }
-  if (use_allocator_shim) {
-    defines += [ "TCMALLOC_DONT_REPLACE_SYSTEM_ALLOC" ]
-  }
-  if (is_clang) {
-    cflags = [
-      # tcmalloc initializes some fields in the wrong order.
-      "-Wno-reorder",
-
-      # tcmalloc contains some unused local template specializations.
-      "-Wno-unused-function",
-
-      # tcmalloc uses COMPILE_ASSERT without static_assert but with typedefs.
-      "-Wno-unused-local-typedefs",
-
-      # for magic2_ in debugallocation.cc (only built in Debug builds) typedefs.
-      "-Wno-unused-private-field",
-    ]
-  } else {
-    cflags = []
-  }
-
-  if (is_linux || is_android) {
-    # We enable all warnings by default, but upstream disables a few.
-    # Keep "-Wno-*" flags in sync with upstream by comparing against:
-    # http://code.google.com/p/google-perftools/source/browse/trunk/Makefile.am
-    cflags += [
-      "-Wno-sign-compare",
-      "-Wno-unused-result",
-    ]
-  }
-}
-
-if (use_allocator == "tcmalloc") {
-  # tcmalloc currently won't compile on Android.
-  source_set("tcmalloc") {
-    tcmalloc_dir = "//third_party/tcmalloc/chromium"
-
-    # Don't check tcmalloc's includes. These files include various files like
-    # base/foo.h and they actually refer to tcmalloc's forked copy of base
-    # rather than the regular one, which confuses the header checker.
-    check_includes = false
-
-    sources = [
-      # Generated for our configuration from tcmalloc's build
-      # and checked in.
-      "$tcmalloc_dir/src/config.h",
-      "$tcmalloc_dir/src/config_android.h",
-      "$tcmalloc_dir/src/config_linux.h",
-      "$tcmalloc_dir/src/config_win.h",
-
-      # tcmalloc native and forked files.
-      "$tcmalloc_dir/src/base/abort.cc",
-      "$tcmalloc_dir/src/base/abort.h",
-      "$tcmalloc_dir/src/base/arm_instruction_set_select.h",
-      "$tcmalloc_dir/src/base/atomicops-internals-arm-generic.h",
-      "$tcmalloc_dir/src/base/atomicops-internals-arm-v6plus.h",
-      "$tcmalloc_dir/src/base/atomicops-internals-linuxppc.h",
-      "$tcmalloc_dir/src/base/atomicops-internals-macosx.h",
-      "$tcmalloc_dir/src/base/atomicops-internals-windows.h",
-      "$tcmalloc_dir/src/base/atomicops-internals-x86.cc",
-      "$tcmalloc_dir/src/base/atomicops-internals-x86.h",
-      "$tcmalloc_dir/src/base/atomicops.h",
-      "$tcmalloc_dir/src/base/commandlineflags.h",
-      "$tcmalloc_dir/src/base/cycleclock.h",
-
-      # We don't list dynamic_annotations.c since its copy is already
-      # present in the dynamic_annotations target.
-      "$tcmalloc_dir/src/base/elf_mem_image.cc",
-      "$tcmalloc_dir/src/base/elf_mem_image.h",
-      "$tcmalloc_dir/src/base/linuxthreads.cc",
-      "$tcmalloc_dir/src/base/linuxthreads.h",
-      "$tcmalloc_dir/src/base/logging.cc",
-      "$tcmalloc_dir/src/base/logging.h",
-      "$tcmalloc_dir/src/base/low_level_alloc.cc",
-      "$tcmalloc_dir/src/base/low_level_alloc.h",
-      "$tcmalloc_dir/src/base/spinlock.cc",
-      "$tcmalloc_dir/src/base/spinlock.h",
-      "$tcmalloc_dir/src/base/spinlock_internal.cc",
-      "$tcmalloc_dir/src/base/spinlock_internal.h",
-      "$tcmalloc_dir/src/base/synchronization_profiling.h",
-      "$tcmalloc_dir/src/base/sysinfo.cc",
-      "$tcmalloc_dir/src/base/sysinfo.h",
-      "$tcmalloc_dir/src/base/vdso_support.cc",
-      "$tcmalloc_dir/src/base/vdso_support.h",
-      "$tcmalloc_dir/src/central_freelist.cc",
-      "$tcmalloc_dir/src/central_freelist.h",
-      "$tcmalloc_dir/src/common.cc",
-      "$tcmalloc_dir/src/common.h",
-
-      # #included by debugallocation_shim.cc
-      #"$tcmalloc_dir/src/debugallocation.cc",
-      "$tcmalloc_dir/src/free_list.cc",
-      "$tcmalloc_dir/src/free_list.h",
-      "$tcmalloc_dir/src/gperftools/heap-profiler.h",
-      "$tcmalloc_dir/src/gperftools/malloc_extension.h",
-      "$tcmalloc_dir/src/gperftools/malloc_hook.h",
-      "$tcmalloc_dir/src/gperftools/stacktrace.h",
-      "$tcmalloc_dir/src/heap-profile-table.cc",
-      "$tcmalloc_dir/src/heap-profile-table.h",
-      "$tcmalloc_dir/src/heap-profiler.cc",
-      "$tcmalloc_dir/src/internal_logging.cc",
-      "$tcmalloc_dir/src/internal_logging.h",
-      "$tcmalloc_dir/src/linked_list.h",
-      "$tcmalloc_dir/src/malloc_extension.cc",
-      "$tcmalloc_dir/src/malloc_hook-inl.h",
-      "$tcmalloc_dir/src/malloc_hook.cc",
-      "$tcmalloc_dir/src/maybe_threads.cc",
-      "$tcmalloc_dir/src/maybe_threads.h",
-      "$tcmalloc_dir/src/memory_region_map.cc",
-      "$tcmalloc_dir/src/memory_region_map.h",
-      "$tcmalloc_dir/src/page_heap.cc",
-      "$tcmalloc_dir/src/page_heap.h",
-      "$tcmalloc_dir/src/raw_printer.cc",
-      "$tcmalloc_dir/src/raw_printer.h",
-      "$tcmalloc_dir/src/sampler.cc",
-      "$tcmalloc_dir/src/sampler.h",
-      "$tcmalloc_dir/src/span.cc",
-      "$tcmalloc_dir/src/span.h",
-      "$tcmalloc_dir/src/stack_trace_table.cc",
-      "$tcmalloc_dir/src/stack_trace_table.h",
-      "$tcmalloc_dir/src/stacktrace.cc",
-      "$tcmalloc_dir/src/static_vars.cc",
-      "$tcmalloc_dir/src/static_vars.h",
-      "$tcmalloc_dir/src/symbolize.cc",
-      "$tcmalloc_dir/src/symbolize.h",
-      "$tcmalloc_dir/src/system-alloc.cc",
-      "$tcmalloc_dir/src/system-alloc.h",
-
-      # #included by debugallocation_shim.cc
-      #"$tcmalloc_dir/src/tcmalloc.cc",
-      #"$tcmalloc_dir/src/tcmalloc.h",
-      "$tcmalloc_dir/src/thread_cache.cc",
-      "$tcmalloc_dir/src/thread_cache.h",
-      "$tcmalloc_dir/src/windows/port.cc",
-      "$tcmalloc_dir/src/windows/port.h",
-      "debugallocation_shim.cc",
-
-      # These are both #included by allocator_shim for maximal linking.
-      #"generic_allocators.cc",
-      #"win_allocator.cc",
-    ]
-
-    # Not included on mips64el.
-    if (current_cpu == "mips64el") {
-      sources -= [
-        "$tcmalloc_dir/src/base/linuxthreads.cc",
-        "$tcmalloc_dir/src/base/linuxthreads.h",
-      ]
-    }
-
-    # Disable the heap checker in tcmalloc.
-    defines = [ "NO_HEAP_CHECK" ]
-
-    include_dirs = [
-      ".",
-      "$tcmalloc_dir/src/base",
-      "$tcmalloc_dir/src",
-    ]
-
-    configs -= [ "//build/config/compiler:chromium_code" ]
-    configs += [
-      "//build/config/compiler:no_chromium_code",
-      ":tcmalloc_flags",
-    ]
-
-    # Thumb mode disabled due to bug in clang integrated assembler
-    # TODO(https://llvm.org/bugs/show_bug.cgi?id=31058)
-    configs -= [ "//build/config/compiler:compiler_arm_thumb" ]
-    configs += [ "//build/config/compiler:compiler_arm" ]
-
-    # TODO(crbug.com/633719) Make tcmalloc work with AFDO on GCC if possible.
-    if (!is_clang) {
-      configs -= [ "//build/config/compiler:afdo" ]
-    }
-
-    deps = []
-
-    if (enable_profiling) {
-      sources += [
-        "$tcmalloc_dir/src/base/thread_lister.c",
-        "$tcmalloc_dir/src/base/thread_lister.h",
-        "$tcmalloc_dir/src/profile-handler.cc",
-        "$tcmalloc_dir/src/profile-handler.h",
-        "$tcmalloc_dir/src/profiledata.cc",
-        "$tcmalloc_dir/src/profiledata.h",
-        "$tcmalloc_dir/src/profiler.cc",
-      ]
-      defines += [ "ENABLE_PROFILING=1" ]
-    }
-
-    if (is_linux || is_android) {
-      sources -= [
-        "$tcmalloc_dir/src/system-alloc.h",
-        "$tcmalloc_dir/src/windows/port.cc",
-        "$tcmalloc_dir/src/windows/port.h",
-      ]
-
-      # Compiling tcmalloc with -fvisibility=default is only necessary when
-      # not using the allocator shim, which provides the correct visibility
-      # annotations for those symbols which need to be exported (see
-      # //base/allocator/allocator_shim_override_glibc_weak_symbols.h and
-      # //base/allocator/allocator_shim_internals.h for the definition of
-      # SHIM_ALWAYS_EXPORT).
-      if (!use_allocator_shim) {
-        configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
-        configs += [ "//build/config/gcc:symbol_visibility_default" ]
-      }
-
-      ldflags = [
-        # Don't let linker rip this symbol out, otherwise the heap&cpu
-        # profilers will not initialize properly on startup.
-        "-Wl,-uIsHeapProfilerRunning,-uProfilerStart",
-
-        # Do the same for heap leak checker.
-        "-Wl,-u_Z21InitialMallocHook_NewPKvj,-u_Z22InitialMallocHook_MMapPKvS0_jiiix,-u_Z22InitialMallocHook_SbrkPKvi",
-        "-Wl,-u_Z21InitialMallocHook_NewPKvm,-u_Z22InitialMallocHook_MMapPKvS0_miiil,-u_Z22InitialMallocHook_SbrkPKvl",
-        "-Wl,-u_ZN15HeapLeakChecker12IgnoreObjectEPKv,-u_ZN15HeapLeakChecker14UnIgnoreObjectEPKv",
-      ]
-    }
-
-    # Make sure the allocation library is optimized as much as possible when
-    # we"re in release mode.
-    if (!is_debug) {
-      configs -= [ "//build/config/compiler:default_optimization" ]
-      configs += [ "//build/config/compiler:optimize_max" ]
-    }
-
-    deps += [ "//base/third_party/dynamic_annotations" ]
-  }
-}  # use_allocator == "tcmalloc"
-
-buildflag_header("buildflags") {
-  header = "buildflags.h"
-  flags = [ "USE_ALLOCATOR_SHIM=$use_allocator_shim" ]
-}
-
-# Used to shim malloc symbols on Android. see //base/allocator/README.md.
-config("wrap_malloc_symbols") {
-  ldflags = [
-    "-Wl,-wrap,calloc",
-    "-Wl,-wrap,free",
-    "-Wl,-wrap,malloc",
-    "-Wl,-wrap,memalign",
-    "-Wl,-wrap,posix_memalign",
-    "-Wl,-wrap,pvalloc",
-    "-Wl,-wrap,realloc",
-    "-Wl,-wrap,valloc",
-  ]
-}
diff --git a/base/allocator/allocator_shim_unittest.cc b/base/allocator/allocator_shim_unittest.cc
deleted file mode 100644
index 0a18eb2..0000000
--- a/base/allocator/allocator_shim_unittest.cc
+++ /dev/null
@@ -1,460 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/allocator/allocator_shim.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <memory>
-#include <new>
-#include <vector>
-
-#include "base/allocator/partition_allocator/partition_alloc.h"
-#include "base/atomicops.h"
-#include "base/process/process_metrics.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread_local.h"
-#include "build_config.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#elif defined(OS_MACOSX)
-#include <malloc/malloc.h>
-#include "base/allocator/allocator_interception_mac.h"
-#include "base/mac/mac_util.h"
-#include "third_party/apple_apsl/malloc.h"
-#else
-#include <malloc.h>
-#endif
-
-#if !defined(OS_WIN)
-#include <unistd.h>
-#endif
-
-// Some new Android NDKs (64 bit) does not expose (p)valloc anymore. These
-// functions are implemented at the shim-layer level.
-#if defined(OS_ANDROID)
-extern "C" {
-void* valloc(size_t size);
-void* pvalloc(size_t size);
-}
-#endif
-
-namespace base {
-namespace allocator {
-namespace {
-
-using testing::MockFunction;
-using testing::_;
-
-class AllocatorShimTest : public testing::Test {
- public:
-  static const size_t kMaxSizeTracked = 2 * base::kSystemPageSize;
-  AllocatorShimTest() : testing::Test() {}
-
-  static size_t Hash(const void* ptr) {
-    return reinterpret_cast<uintptr_t>(ptr) % kMaxSizeTracked;
-  }
-
-  static void* MockAlloc(const AllocatorDispatch* self,
-                         size_t size,
-                         void* context) {
-    if (instance_ && size < kMaxSizeTracked)
-      ++(instance_->allocs_intercepted_by_size[size]);
-    return self->next->alloc_function(self->next, size, context);
-  }
-
-  static void* MockAllocZeroInit(const AllocatorDispatch* self,
-                                 size_t n,
-                                 size_t size,
-                                 void* context) {
-    const size_t real_size = n * size;
-    if (instance_ && real_size < kMaxSizeTracked)
-      ++(instance_->zero_allocs_intercepted_by_size[real_size]);
-    return self->next->alloc_zero_initialized_function(self->next, n, size,
-                                                       context);
-  }
-
-  static void* MockAllocAligned(const AllocatorDispatch* self,
-                                size_t alignment,
-                                size_t size,
-                                void* context) {
-    if (instance_) {
-      if (size < kMaxSizeTracked)
-        ++(instance_->aligned_allocs_intercepted_by_size[size]);
-      if (alignment < kMaxSizeTracked)
-        ++(instance_->aligned_allocs_intercepted_by_alignment[alignment]);
-    }
-    return self->next->alloc_aligned_function(self->next, alignment, size,
-                                              context);
-  }
-
-  static void* MockRealloc(const AllocatorDispatch* self,
-                           void* address,
-                           size_t size,
-                           void* context) {
-    if (instance_) {
-      // Size 0xFEED a special sentinel for the NewHandlerConcurrency test.
-      // Hitting it for the first time will cause a failure, causing the
-      // invocation of the std::new_handler.
-      if (size == 0xFEED) {
-        if (!instance_->did_fail_realloc_0xfeed_once->Get()) {
-          instance_->did_fail_realloc_0xfeed_once->Set(true);
-          return nullptr;
-        } else {
-          return address;
-        }
-      }
-
-      if (size < kMaxSizeTracked)
-        ++(instance_->reallocs_intercepted_by_size[size]);
-      ++instance_->reallocs_intercepted_by_addr[Hash(address)];
-    }
-    return self->next->realloc_function(self->next, address, size, context);
-  }
-
-  static void MockFree(const AllocatorDispatch* self,
-                       void* address,
-                       void* context) {
-    if (instance_) {
-      ++instance_->frees_intercepted_by_addr[Hash(address)];
-    }
-    self->next->free_function(self->next, address, context);
-  }
-
-  static size_t MockGetSizeEstimate(const AllocatorDispatch* self,
-                                    void* address,
-                                    void* context) {
-    return self->next->get_size_estimate_function(self->next, address, context);
-  }
-
-  static unsigned MockBatchMalloc(const AllocatorDispatch* self,
-                                  size_t size,
-                                  void** results,
-                                  unsigned num_requested,
-                                  void* context) {
-    if (instance_) {
-      instance_->batch_mallocs_intercepted_by_size[size] =
-          instance_->batch_mallocs_intercepted_by_size[size] + num_requested;
-    }
-    return self->next->batch_malloc_function(self->next, size, results,
-                                             num_requested, context);
-  }
-
-  static void MockBatchFree(const AllocatorDispatch* self,
-                            void** to_be_freed,
-                            unsigned num_to_be_freed,
-                            void* context) {
-    if (instance_) {
-      for (unsigned i = 0; i < num_to_be_freed; ++i) {
-        ++instance_->batch_frees_intercepted_by_addr[Hash(to_be_freed[i])];
-      }
-    }
-    self->next->batch_free_function(self->next, to_be_freed, num_to_be_freed,
-                                    context);
-  }
-
-  static void MockFreeDefiniteSize(const AllocatorDispatch* self,
-                                   void* ptr,
-                                   size_t size,
-                                   void* context) {
-    if (instance_) {
-      ++instance_->frees_intercepted_by_addr[Hash(ptr)];
-      ++instance_->free_definite_sizes_intercepted_by_size[size];
-    }
-    self->next->free_definite_size_function(self->next, ptr, size, context);
-  }
-
-  static void NewHandler() {
-    if (!instance_)
-      return;
-    subtle::Barrier_AtomicIncrement(&instance_->num_new_handler_calls, 1);
-  }
-
-  int32_t GetNumberOfNewHandlerCalls() {
-    return subtle::Acquire_Load(&instance_->num_new_handler_calls);
-  }
-
-  void SetUp() override {
-    const size_t array_size = kMaxSizeTracked * sizeof(size_t);
-    memset(&allocs_intercepted_by_size, 0, array_size);
-    memset(&zero_allocs_intercepted_by_size, 0, array_size);
-    memset(&aligned_allocs_intercepted_by_size, 0, array_size);
-    memset(&aligned_allocs_intercepted_by_alignment, 0, array_size);
-    memset(&reallocs_intercepted_by_size, 0, array_size);
-    memset(&frees_intercepted_by_addr, 0, array_size);
-    memset(&batch_mallocs_intercepted_by_size, 0, array_size);
-    memset(&batch_frees_intercepted_by_addr, 0, array_size);
-    memset(&free_definite_sizes_intercepted_by_size, 0, array_size);
-    did_fail_realloc_0xfeed_once.reset(new ThreadLocalBoolean());
-    subtle::Release_Store(&num_new_handler_calls, 0);
-    instance_ = this;
-
-#if defined(OS_MACOSX)
-    InitializeAllocatorShim();
-#endif
-  }
-
-  void TearDown() override {
-    instance_ = nullptr;
-#if defined(OS_MACOSX)
-    UninterceptMallocZonesForTesting();
-#endif
-  }
-
- protected:
-  size_t allocs_intercepted_by_size[kMaxSizeTracked];
-  size_t zero_allocs_intercepted_by_size[kMaxSizeTracked];
-  size_t aligned_allocs_intercepted_by_size[kMaxSizeTracked];
-  size_t aligned_allocs_intercepted_by_alignment[kMaxSizeTracked];
-  size_t reallocs_intercepted_by_size[kMaxSizeTracked];
-  size_t reallocs_intercepted_by_addr[kMaxSizeTracked];
-  size_t frees_intercepted_by_addr[kMaxSizeTracked];
-  size_t batch_mallocs_intercepted_by_size[kMaxSizeTracked];
-  size_t batch_frees_intercepted_by_addr[kMaxSizeTracked];
-  size_t free_definite_sizes_intercepted_by_size[kMaxSizeTracked];
-  std::unique_ptr<ThreadLocalBoolean> did_fail_realloc_0xfeed_once;
-  subtle::Atomic32 num_new_handler_calls;
-
- private:
-  static AllocatorShimTest* instance_;
-};
-
-struct TestStruct1 {
-  uint32_t ignored;
-  uint8_t ignored_2;
-};
-
-struct TestStruct2 {
-  uint64_t ignored;
-  uint8_t ignored_3;
-};
-
-class ThreadDelegateForNewHandlerTest : public PlatformThread::Delegate {
- public:
-  ThreadDelegateForNewHandlerTest(WaitableEvent* event) : event_(event) {}
-
-  void ThreadMain() override {
-    event_->Wait();
-    void* temp = malloc(1);
-    void* res = realloc(temp, 0xFEED);
-    EXPECT_EQ(temp, res);
-  }
-
- private:
-  WaitableEvent* event_;
-};
-
-AllocatorShimTest* AllocatorShimTest::instance_ = nullptr;
-
-AllocatorDispatch g_mock_dispatch = {
-    &AllocatorShimTest::MockAlloc,         /* alloc_function */
-    &AllocatorShimTest::MockAllocZeroInit, /* alloc_zero_initialized_function */
-    &AllocatorShimTest::MockAllocAligned,  /* alloc_aligned_function */
-    &AllocatorShimTest::MockRealloc,       /* realloc_function */
-    &AllocatorShimTest::MockFree,          /* free_function */
-    &AllocatorShimTest::MockGetSizeEstimate,  /* get_size_estimate_function */
-    &AllocatorShimTest::MockBatchMalloc,      /* batch_malloc_function */
-    &AllocatorShimTest::MockBatchFree,        /* batch_free_function */
-    &AllocatorShimTest::MockFreeDefiniteSize, /* free_definite_size_function */
-    nullptr,                                  /* next */
-};
-
-TEST_F(AllocatorShimTest, InterceptLibcSymbols) {
-  InsertAllocatorDispatch(&g_mock_dispatch);
-
-  void* alloc_ptr = malloc(19);
-  ASSERT_NE(nullptr, alloc_ptr);
-  ASSERT_GE(allocs_intercepted_by_size[19], 1u);
-
-  void* zero_alloc_ptr = calloc(2, 23);
-  ASSERT_NE(nullptr, zero_alloc_ptr);
-  ASSERT_GE(zero_allocs_intercepted_by_size[2 * 23], 1u);
-
-#if !defined(OS_WIN)
-  const size_t kPageSize = base::GetPageSize();
-  void* posix_memalign_ptr = nullptr;
-  int res = posix_memalign(&posix_memalign_ptr, 256, 59);
-  ASSERT_EQ(0, res);
-  ASSERT_NE(nullptr, posix_memalign_ptr);
-  ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(posix_memalign_ptr) % 256);
-  ASSERT_GE(aligned_allocs_intercepted_by_alignment[256], 1u);
-  ASSERT_GE(aligned_allocs_intercepted_by_size[59], 1u);
-
-  void* valloc_ptr = valloc(61);
-  ASSERT_NE(nullptr, valloc_ptr);
-  ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(valloc_ptr) % kPageSize);
-  ASSERT_GE(aligned_allocs_intercepted_by_alignment[kPageSize], 1u);
-  ASSERT_GE(aligned_allocs_intercepted_by_size[61], 1u);
-#endif  // !OS_WIN
-
-#if !defined(OS_WIN) && !defined(OS_MACOSX)
-  void* memalign_ptr = memalign(128, 53);
-  ASSERT_NE(nullptr, memalign_ptr);
-  ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(memalign_ptr) % 128);
-  ASSERT_GE(aligned_allocs_intercepted_by_alignment[128], 1u);
-  ASSERT_GE(aligned_allocs_intercepted_by_size[53], 1u);
-
-  void* pvalloc_ptr = pvalloc(67);
-  ASSERT_NE(nullptr, pvalloc_ptr);
-  ASSERT_EQ(0u, reinterpret_cast<uintptr_t>(pvalloc_ptr) % kPageSize);
-  ASSERT_GE(aligned_allocs_intercepted_by_alignment[kPageSize], 1u);
-  // pvalloc rounds the size up to the next page.
-  ASSERT_GE(aligned_allocs_intercepted_by_size[kPageSize], 1u);
-#endif  // !OS_WIN && !OS_MACOSX
-
-  char* realloc_ptr = static_cast<char*>(malloc(10));
-  strcpy(realloc_ptr, "foobar");
-  void* old_realloc_ptr = realloc_ptr;
-  realloc_ptr = static_cast<char*>(realloc(realloc_ptr, 73));
-  ASSERT_GE(reallocs_intercepted_by_size[73], 1u);
-  ASSERT_GE(reallocs_intercepted_by_addr[Hash(old_realloc_ptr)], 1u);
-  ASSERT_EQ(0, strcmp(realloc_ptr, "foobar"));
-
-  free(alloc_ptr);
-  ASSERT_GE(frees_intercepted_by_addr[Hash(alloc_ptr)], 1u);
-
-  free(zero_alloc_ptr);
-  ASSERT_GE(frees_intercepted_by_addr[Hash(zero_alloc_ptr)], 1u);
-
-#if !defined(OS_WIN) && !defined(OS_MACOSX)
-  free(memalign_ptr);
-  ASSERT_GE(frees_intercepted_by_addr[Hash(memalign_ptr)], 1u);
-
-  free(pvalloc_ptr);
-  ASSERT_GE(frees_intercepted_by_addr[Hash(pvalloc_ptr)], 1u);
-#endif  // !OS_WIN && !OS_MACOSX
-
-#if !defined(OS_WIN)
-  free(posix_memalign_ptr);
-  ASSERT_GE(frees_intercepted_by_addr[Hash(posix_memalign_ptr)], 1u);
-
-  free(valloc_ptr);
-  ASSERT_GE(frees_intercepted_by_addr[Hash(valloc_ptr)], 1u);
-#endif  // !OS_WIN
-
-  free(realloc_ptr);
-  ASSERT_GE(frees_intercepted_by_addr[Hash(realloc_ptr)], 1u);
-
-  RemoveAllocatorDispatchForTesting(&g_mock_dispatch);
-
-  void* non_hooked_ptr = malloc(4095);
-  ASSERT_NE(nullptr, non_hooked_ptr);
-  ASSERT_EQ(0u, allocs_intercepted_by_size[4095]);
-  free(non_hooked_ptr);
-}
-
-#if defined(OS_MACOSX)
-TEST_F(AllocatorShimTest, InterceptLibcSymbolsBatchMallocFree) {
-  InsertAllocatorDispatch(&g_mock_dispatch);
-
-  unsigned count = 13;
-  std::vector<void*> results;
-  results.resize(count);
-  unsigned result_count = malloc_zone_batch_malloc(malloc_default_zone(), 99,
-                                                   results.data(), count);
-  ASSERT_EQ(count, result_count);
-
-  // TODO(erikchen): On macOS 10.12+, batch_malloc in the default zone may
-  // forward to another zone, which we've also shimmed, resulting in
-  // MockBatchMalloc getting called twice as often as we'd expect. This
-  // re-entrancy into the allocator shim is a bug that needs to be fixed.
-  // https://crbug.com/693237.
-  // ASSERT_EQ(count, batch_mallocs_intercepted_by_size[99]);
-
-  std::vector<void*> results_copy(results);
-  malloc_zone_batch_free(malloc_default_zone(), results.data(), count);
-  for (void* result : results_copy) {
-    ASSERT_GE(batch_frees_intercepted_by_addr[Hash(result)], 1u);
-  }
-  RemoveAllocatorDispatchForTesting(&g_mock_dispatch);
-}
-
-TEST_F(AllocatorShimTest, InterceptLibcSymbolsFreeDefiniteSize) {
-  InsertAllocatorDispatch(&g_mock_dispatch);
-
-  void* alloc_ptr = malloc(19);
-  ASSERT_NE(nullptr, alloc_ptr);
-  ASSERT_GE(allocs_intercepted_by_size[19], 1u);
-
-  ChromeMallocZone* default_zone =
-          reinterpret_cast<ChromeMallocZone*>(malloc_default_zone());
-  default_zone->free_definite_size(malloc_default_zone(), alloc_ptr, 19);
-  ASSERT_GE(free_definite_sizes_intercepted_by_size[19], 1u);
-  RemoveAllocatorDispatchForTesting(&g_mock_dispatch);
-}
-#endif  // defined(OS_MACOSX)
-
-TEST_F(AllocatorShimTest, InterceptCppSymbols) {
-  InsertAllocatorDispatch(&g_mock_dispatch);
-
-  TestStruct1* new_ptr = new TestStruct1;
-  ASSERT_NE(nullptr, new_ptr);
-  ASSERT_GE(allocs_intercepted_by_size[sizeof(TestStruct1)], 1u);
-
-  TestStruct1* new_array_ptr = new TestStruct1[3];
-  ASSERT_NE(nullptr, new_array_ptr);
-  ASSERT_GE(allocs_intercepted_by_size[sizeof(TestStruct1) * 3], 1u);
-
-  TestStruct2* new_nt_ptr = new (std::nothrow) TestStruct2;
-  ASSERT_NE(nullptr, new_nt_ptr);
-  ASSERT_GE(allocs_intercepted_by_size[sizeof(TestStruct2)], 1u);
-
-  TestStruct2* new_array_nt_ptr = new TestStruct2[3];
-  ASSERT_NE(nullptr, new_array_nt_ptr);
-  ASSERT_GE(allocs_intercepted_by_size[sizeof(TestStruct2) * 3], 1u);
-
-  delete new_ptr;
-  ASSERT_GE(frees_intercepted_by_addr[Hash(new_ptr)], 1u);
-
-  delete[] new_array_ptr;
-  ASSERT_GE(frees_intercepted_by_addr[Hash(new_array_ptr)], 1u);
-
-  delete new_nt_ptr;
-  ASSERT_GE(frees_intercepted_by_addr[Hash(new_nt_ptr)], 1u);
-
-  delete[] new_array_nt_ptr;
-  ASSERT_GE(frees_intercepted_by_addr[Hash(new_array_nt_ptr)], 1u);
-
-  RemoveAllocatorDispatchForTesting(&g_mock_dispatch);
-}
-
-// This test exercises the case of concurrent OOM failure, which would end up
-// invoking std::new_handler concurrently. This is to cover the CallNewHandler()
-// paths of allocator_shim.cc and smoke-test its thread safey.
-// The test creates kNumThreads threads. Each of them mallocs some memory, and
-// then does a realloc(<new memory>, 0xFEED).
-// The shim intercepts such realloc and makes it fail only once on each thread.
-// We expect to see excactly kNumThreads invocations of the new_handler.
-TEST_F(AllocatorShimTest, NewHandlerConcurrency) {
-  const int kNumThreads = 32;
-  PlatformThreadHandle threads[kNumThreads];
-
-  // The WaitableEvent here is used to attempt to trigger all the threads at
-  // the same time, after they have been initialized.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  ThreadDelegateForNewHandlerTest mock_thread_main(&event);
-
-  for (int i = 0; i < kNumThreads; ++i)
-    PlatformThread::Create(0, &mock_thread_main, &threads[i]);
-
-  std::set_new_handler(&AllocatorShimTest::NewHandler);
-  SetCallNewHandlerOnMallocFailure(true);  // It's going to fail on realloc().
-  InsertAllocatorDispatch(&g_mock_dispatch);
-  event.Signal();
-  for (int i = 0; i < kNumThreads; ++i)
-    PlatformThread::Join(threads[i]);
-  RemoveAllocatorDispatchForTesting(&g_mock_dispatch);
-  ASSERT_EQ(kNumThreads, GetNumberOfNewHandlerCalls());
-}
-
-}  // namespace
-}  // namespace allocator
-}  // namespace base
diff --git a/base/allocator/malloc_zone_functions_mac_unittest.cc b/base/allocator/malloc_zone_functions_mac_unittest.cc
deleted file mode 100644
index 09aa429..0000000
--- a/base/allocator/malloc_zone_functions_mac_unittest.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/allocator/malloc_zone_functions_mac.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace allocator {
-
-class MallocZoneFunctionsTest : public testing::Test {
- protected:
-  void TearDown() override { ClearAllMallocZonesForTesting(); }
-};
-
-TEST_F(MallocZoneFunctionsTest, TestDefaultZoneMallocFree) {
-  ChromeMallocZone* malloc_zone =
-      reinterpret_cast<ChromeMallocZone*>(malloc_default_zone());
-  StoreMallocZone(malloc_zone);
-  int* test = reinterpret_cast<int*>(
-      g_malloc_zones[0].malloc(malloc_default_zone(), 33));
-  test[0] = 1;
-  test[1] = 2;
-  g_malloc_zones[0].free(malloc_default_zone(), test);
-}
-
-TEST_F(MallocZoneFunctionsTest, IsZoneAlreadyStored) {
-  ChromeMallocZone* malloc_zone =
-      reinterpret_cast<ChromeMallocZone*>(malloc_default_zone());
-  EXPECT_FALSE(IsMallocZoneAlreadyStored(malloc_zone));
-  StoreMallocZone(malloc_zone);
-  EXPECT_TRUE(IsMallocZoneAlreadyStored(malloc_zone));
-}
-
-TEST_F(MallocZoneFunctionsTest, CannotDoubleStoreZone) {
-  ChromeMallocZone* malloc_zone =
-      reinterpret_cast<ChromeMallocZone*>(malloc_default_zone());
-  StoreMallocZone(malloc_zone);
-  StoreMallocZone(malloc_zone);
-  EXPECT_EQ(1, GetMallocZoneCountForTesting());
-}
-
-TEST_F(MallocZoneFunctionsTest, CannotStoreMoreThanMaxZones) {
-  std::vector<ChromeMallocZone> zones;
-  zones.resize(kMaxZoneCount * 2);
-  for (int i = 0; i < kMaxZoneCount * 2; ++i) {
-    ChromeMallocZone& zone = zones[i];
-    memcpy(&zone, malloc_default_zone(), sizeof(ChromeMallocZone));
-    StoreMallocZone(&zone);
-  }
-
-  int max_zone_count = kMaxZoneCount;
-  EXPECT_EQ(max_zone_count, GetMallocZoneCountForTesting());
-}
-
-}  // namespace allocator
-}  // namespace base
diff --git a/base/allocator/partition_allocator/address_space_randomization_unittest.cc b/base/allocator/partition_allocator/address_space_randomization_unittest.cc
deleted file mode 100644
index a9fe1ce..0000000
--- a/base/allocator/partition_allocator/address_space_randomization_unittest.cc
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/allocator/partition_allocator/address_space_randomization.h"
-
-#include "base/allocator/partition_allocator/page_allocator.h"
-#include "base/bit_cast.h"
-#include "base/bits.h"
-#include "base/sys_info.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#include "base/win/windows_version.h"
-// VersionHelpers.h must be included after windows.h.
-#include <VersionHelpers.h>
-#endif
-
-namespace base {
-
-namespace {
-
-uintptr_t GetMask() {
-  uintptr_t mask = internal::kASLRMask;
-#if defined(ARCH_CPU_64_BITS)
-// Sanitizers use their own kASLRMask constant.
-#if defined(OS_WIN) && !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
-  if (!IsWindows8Point1OrGreater()) {
-    mask = internal::kASLRMaskBefore8_10;
-  }
-#endif  // defined(OS_WIN) && !defined(MEMORY_TOOL_REPLACES_ALLOCATOR))
-#elif defined(ARCH_CPU_32_BITS)
-#if defined(OS_WIN)
-  BOOL is_wow64 = FALSE;
-  if (!IsWow64Process(GetCurrentProcess(), &is_wow64))
-    is_wow64 = FALSE;
-  if (!is_wow64) {
-    mask = 0;
-  }
-#endif  // defined(OS_WIN)
-#endif  // defined(ARCH_CPU_32_BITS)
-  return mask;
-}
-
-const size_t kSamples = 100;
-
-uintptr_t GetAddressBits() {
-  return reinterpret_cast<uintptr_t>(base::GetRandomPageBase());
-}
-
-uintptr_t GetRandomBits() {
-  return GetAddressBits() - internal::kASLROffset;
-}
-
-}  // namespace
-
-// Configurations without ASLR are tested here.
-TEST(AddressSpaceRandomizationTest, DisabledASLR) {
-  uintptr_t mask = GetMask();
-  if (!mask) {
-#if defined(OS_WIN) && defined(ARCH_CPU_32_BITS)
-    // ASLR should be turned off on 32-bit Windows.
-    EXPECT_EQ(nullptr, base::GetRandomPageBase());
-#else
-    // Otherwise, nullptr is very unexpected.
-    EXPECT_NE(nullptr, base::GetRandomPageBase());
-#endif
-  }
-}
-
-TEST(AddressSpaceRandomizationTest, Alignment) {
-  uintptr_t mask = GetMask();
-  if (!mask)
-    return;
-
-  for (size_t i = 0; i < kSamples; ++i) {
-    uintptr_t address = GetAddressBits();
-    EXPECT_EQ(0ULL, (address & kPageAllocationGranularityOffsetMask));
-  }
-}
-
-TEST(AddressSpaceRandomizationTest, Range) {
-  uintptr_t mask = GetMask();
-  if (!mask)
-    return;
-
-  uintptr_t min = internal::kASLROffset;
-  uintptr_t max = internal::kASLROffset + internal::kASLRMask;
-  for (size_t i = 0; i < kSamples; ++i) {
-    uintptr_t address = GetAddressBits();
-    EXPECT_LE(min, address);
-    EXPECT_GE(max + mask, address);
-  }
-}
-
-TEST(AddressSpaceRandomizationTest, Predictable) {
-  uintptr_t mask = GetMask();
-  if (!mask)
-    return;
-
-  const uintptr_t kInitialSeed = 0xfeed5eedULL;
-  base::SetRandomPageBaseSeed(kInitialSeed);
-
-  std::vector<uintptr_t> sequence;
-  for (size_t i = 0; i < kSamples; ++i) {
-    uintptr_t address = reinterpret_cast<uintptr_t>(base::GetRandomPageBase());
-    sequence.push_back(address);
-  }
-
-  base::SetRandomPageBaseSeed(kInitialSeed);
-
-  for (size_t i = 0; i < kSamples; ++i) {
-    uintptr_t address = reinterpret_cast<uintptr_t>(base::GetRandomPageBase());
-    EXPECT_EQ(address, sequence[i]);
-  }
-}
-
-// This randomness test is adapted from V8's PRNG tests.
-
-// Chi squared for getting m 0s out of n bits.
-double ChiSquared(int m, int n) {
-  double ys_minus_np1 = (m - n / 2.0);
-  double chi_squared_1 = ys_minus_np1 * ys_minus_np1 * 2.0 / n;
-  double ys_minus_np2 = ((n - m) - n / 2.0);
-  double chi_squared_2 = ys_minus_np2 * ys_minus_np2 * 2.0 / n;
-  return chi_squared_1 + chi_squared_2;
-}
-
-// Test for correlations between recent bits from the PRNG, or bits that are
-// biased.
-void RandomBitCorrelation(int random_bit) {
-  uintptr_t mask = GetMask();
-  if ((mask & (1ULL << random_bit)) == 0)
-    return;  // bit is always 0.
-
-#ifdef DEBUG
-  constexpr int kHistory = 2;
-  constexpr int kRepeats = 1000;
-#else
-  constexpr int kHistory = 8;
-  constexpr int kRepeats = 10000;
-#endif
-  constexpr int kPointerBits = 8 * sizeof(void*);
-  uintptr_t history[kHistory];
-  // The predictor bit is either constant 0 or 1, or one of the bits from the
-  // history.
-  for (int predictor_bit = -2; predictor_bit < kPointerBits; predictor_bit++) {
-    // The predicted bit is one of the bits from the PRNG.
-    for (int ago = 0; ago < kHistory; ago++) {
-      // We don't want to check whether each bit predicts itself.
-      if (ago == 0 && predictor_bit == random_bit)
-        continue;
-
-      // Enter the new random value into the history.
-      for (int i = ago; i >= 0; i--) {
-        history[i] = GetRandomBits();
-      }
-
-      // Find out how many of the bits are the same as the prediction bit.
-      int m = 0;
-      for (int i = 0; i < kRepeats; i++) {
-        uintptr_t random = GetRandomBits();
-        for (int j = ago - 1; j >= 0; j--)
-          history[j + 1] = history[j];
-        history[0] = random;
-
-        int predicted;
-        if (predictor_bit >= 0) {
-          predicted = (history[ago] >> predictor_bit) & 1;
-        } else {
-          predicted = predictor_bit == -2 ? 0 : 1;
-        }
-        int bit = (random >> random_bit) & 1;
-        if (bit == predicted)
-          m++;
-      }
-
-      // Chi squared analysis for k = 2 (2, states: same/not-same) and one
-      // degree of freedom (k - 1).
-      double chi_squared = ChiSquared(m, kRepeats);
-      // For 1 degree of freedom this corresponds to 1 in a million.  We are
-      // running ~8000 tests, so that would be surprising.
-      CHECK_GE(24, chi_squared);
-      // If the predictor bit is a fixed 0 or 1 then it makes no sense to
-      // repeat the test with a different age.
-      if (predictor_bit < 0)
-        break;
-    }
-  }
-}
-
-// Tests are fairly slow, so give each random bit its own test.
-#define TEST_RANDOM_BIT(BIT)                                        \
-  TEST(AddressSpaceRandomizationTest, RandomBitCorrelations##BIT) { \
-    RandomBitCorrelation(BIT);                                      \
-  }
-
-// The first 12 bits on all platforms are always 0.
-TEST_RANDOM_BIT(12)
-TEST_RANDOM_BIT(13)
-TEST_RANDOM_BIT(14)
-TEST_RANDOM_BIT(15)
-TEST_RANDOM_BIT(16)
-TEST_RANDOM_BIT(17)
-TEST_RANDOM_BIT(18)
-TEST_RANDOM_BIT(19)
-TEST_RANDOM_BIT(20)
-TEST_RANDOM_BIT(21)
-TEST_RANDOM_BIT(22)
-TEST_RANDOM_BIT(23)
-TEST_RANDOM_BIT(24)
-TEST_RANDOM_BIT(25)
-TEST_RANDOM_BIT(26)
-TEST_RANDOM_BIT(27)
-TEST_RANDOM_BIT(28)
-TEST_RANDOM_BIT(29)
-TEST_RANDOM_BIT(30)
-TEST_RANDOM_BIT(31)
-#if defined(ARCH_CPU_64_BITS)
-TEST_RANDOM_BIT(32)
-TEST_RANDOM_BIT(33)
-TEST_RANDOM_BIT(34)
-TEST_RANDOM_BIT(35)
-TEST_RANDOM_BIT(36)
-TEST_RANDOM_BIT(37)
-TEST_RANDOM_BIT(38)
-TEST_RANDOM_BIT(39)
-TEST_RANDOM_BIT(40)
-TEST_RANDOM_BIT(41)
-TEST_RANDOM_BIT(42)
-TEST_RANDOM_BIT(43)
-TEST_RANDOM_BIT(44)
-TEST_RANDOM_BIT(45)
-TEST_RANDOM_BIT(46)
-TEST_RANDOM_BIT(47)
-TEST_RANDOM_BIT(48)
-// No platforms have more than 48 address bits.
-#endif  // defined(ARCH_CPU_64_BITS)
-
-#undef TEST_RANDOM_BIT
-
-}  // namespace base
diff --git a/base/allocator/partition_allocator/page_allocator_unittest.cc b/base/allocator/partition_allocator/page_allocator_unittest.cc
deleted file mode 100644
index ad14c06..0000000
--- a/base/allocator/partition_allocator/page_allocator_unittest.cc
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/allocator/partition_allocator/page_allocator.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "base/allocator/partition_allocator/address_space_randomization.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
-#include <setjmp.h>
-#include <signal.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-#endif  // defined(OS_POSIX) && !defined(OS_FUCHSIA)
-
-#if !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
-
-namespace base {
-
-namespace {
-
-// Any number of bytes that can be allocated with no trouble.
-constexpr size_t kEasyAllocSize =
-    (1024 * 1024) & ~(kPageAllocationGranularity - 1);
-
-// A huge amount of memory, greater than or equal to the ASLR space.
-constexpr size_t kHugeMemoryAmount =
-    std::max(internal::kASLRMask, std::size_t{2} * internal::kASLRMask);
-
-}  // namespace
-
-TEST(PageAllocatorTest, Rounding) {
-  EXPECT_EQ(0u, RoundUpToSystemPage(0u));
-  EXPECT_EQ(kSystemPageSize, RoundUpToSystemPage(1));
-  EXPECT_EQ(kSystemPageSize, RoundUpToSystemPage(kSystemPageSize - 1));
-  EXPECT_EQ(kSystemPageSize, RoundUpToSystemPage(kSystemPageSize));
-  EXPECT_EQ(2 * kSystemPageSize, RoundUpToSystemPage(kSystemPageSize + 1));
-  EXPECT_EQ(0u, RoundDownToSystemPage(0u));
-  EXPECT_EQ(0u, RoundDownToSystemPage(kSystemPageSize - 1));
-  EXPECT_EQ(kSystemPageSize, RoundDownToSystemPage(kSystemPageSize));
-  EXPECT_EQ(kSystemPageSize, RoundDownToSystemPage(kSystemPageSize + 1));
-  EXPECT_EQ(kSystemPageSize, RoundDownToSystemPage(2 * kSystemPageSize - 1));
-  EXPECT_EQ(0u, RoundUpToPageAllocationGranularity(0u));
-  EXPECT_EQ(kPageAllocationGranularity, RoundUpToPageAllocationGranularity(1));
-  EXPECT_EQ(kPageAllocationGranularity,
-            RoundUpToPageAllocationGranularity(kPageAllocationGranularity - 1));
-  EXPECT_EQ(kPageAllocationGranularity,
-            RoundUpToPageAllocationGranularity(kPageAllocationGranularity));
-  EXPECT_EQ(2 * kPageAllocationGranularity,
-            RoundUpToPageAllocationGranularity(kPageAllocationGranularity + 1));
-  EXPECT_EQ(0u, RoundDownToPageAllocationGranularity(0u));
-  EXPECT_EQ(
-      0u, RoundDownToPageAllocationGranularity(kPageAllocationGranularity - 1));
-  EXPECT_EQ(kPageAllocationGranularity,
-            RoundDownToPageAllocationGranularity(kPageAllocationGranularity));
-  EXPECT_EQ(kPageAllocationGranularity, RoundDownToPageAllocationGranularity(
-                                            kPageAllocationGranularity + 1));
-  EXPECT_EQ(
-      kPageAllocationGranularity,
-      RoundDownToPageAllocationGranularity(2 * kPageAllocationGranularity - 1));
-}
-
-// Test that failed page allocations invoke base::ReleaseReservation().
-// We detect this by making a reservation and ensuring that after failure, we
-// can make a new reservation.
-TEST(PageAllocatorTest, AllocFailure) {
-  // Release any reservation made by another test.
-  ReleaseReservation();
-
-  // We can make a reservation.
-  EXPECT_TRUE(ReserveAddressSpace(kEasyAllocSize));
-
-  // We can't make another reservation until we trigger an allocation failure.
-  EXPECT_FALSE(ReserveAddressSpace(kEasyAllocSize));
-
-  size_t size = kHugeMemoryAmount;
-  // Skip the test for sanitizers and platforms with ASLR turned off.
-  if (size == 0)
-    return;
-
-  void* result = AllocPages(nullptr, size, kPageAllocationGranularity,
-                            PageInaccessible, PageTag::kChromium, false);
-  if (result == nullptr) {
-    // We triggered allocation failure. Our reservation should have been
-    // released, and we should be able to make a new reservation.
-    EXPECT_TRUE(ReserveAddressSpace(kEasyAllocSize));
-    ReleaseReservation();
-    return;
-  }
-  // We couldn't fail. Make sure reservation is still there.
-  EXPECT_FALSE(ReserveAddressSpace(kEasyAllocSize));
-}
-
-// TODO(crbug.com/765801): Test failed on chromium.win/Win10 Tests x64.
-#if defined(OS_WIN) && defined(ARCH_CPU_64_BITS)
-#define MAYBE_ReserveAddressSpace DISABLED_ReserveAddressSpace
-#else
-#define MAYBE_ReserveAddressSpace ReserveAddressSpace
-#endif  // defined(OS_WIN) && defined(ARCH_CPU_64_BITS)
-
-// Test that reserving address space can fail.
-TEST(PageAllocatorTest, MAYBE_ReserveAddressSpace) {
-  // Release any reservation made by another test.
-  ReleaseReservation();
-
-  size_t size = kHugeMemoryAmount;
-  // Skip the test for sanitizers and platforms with ASLR turned off.
-  if (size == 0)
-    return;
-
-  bool success = ReserveAddressSpace(size);
-  if (!success) {
-    EXPECT_TRUE(ReserveAddressSpace(kEasyAllocSize));
-    return;
-  }
-  // We couldn't fail. Make sure reservation is still there.
-  EXPECT_FALSE(ReserveAddressSpace(kEasyAllocSize));
-}
-
-TEST(PageAllocatorTest, AllocAndFreePages) {
-  void* buffer = AllocPages(nullptr, kPageAllocationGranularity,
-                            kPageAllocationGranularity, PageReadWrite,
-                            PageTag::kChromium, true);
-  EXPECT_TRUE(buffer);
-  int* buffer0 = reinterpret_cast<int*>(buffer);
-  *buffer0 = 42;
-  EXPECT_EQ(42, *buffer0);
-  FreePages(buffer, kPageAllocationGranularity);
-}
-
-// Test permission setting on POSIX, where we can set a trap handler.
-#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
-
-namespace {
-sigjmp_buf g_continuation;
-
-void SignalHandler(int signal, siginfo_t* info, void*) {
-  siglongjmp(g_continuation, 1);
-}
-}  // namespace
-
-// On Mac, sometimes we get SIGBUS instead of SIGSEGV, so handle that too.
-#if defined(OS_MACOSX)
-#define EXTRA_FAULT_BEGIN_ACTION() \
-  struct sigaction old_bus_action; \
-  sigaction(SIGBUS, &action, &old_bus_action);
-#define EXTRA_FAULT_END_ACTION() sigaction(SIGBUS, &old_bus_action, nullptr);
-#else
-#define EXTRA_FAULT_BEGIN_ACTION()
-#define EXTRA_FAULT_END_ACTION()
-#endif
-
-// Install a signal handler so we can catch the fault we're about to trigger.
-#define FAULT_TEST_BEGIN()                  \
-  struct sigaction action = {};             \
-  struct sigaction old_action = {};         \
-  action.sa_sigaction = SignalHandler;      \
-  sigemptyset(&action.sa_mask);             \
-  action.sa_flags = SA_SIGINFO;             \
-  sigaction(SIGSEGV, &action, &old_action); \
-  EXTRA_FAULT_BEGIN_ACTION();               \
-  int const save_sigs = 1;                  \
-  if (!sigsetjmp(g_continuation, save_sigs)) {
-// Fault generating code goes here...
-
-// Handle when sigsetjmp returns nonzero (we are returning from our handler).
-#define FAULT_TEST_END()                      \
-  }                                           \
-  else {                                      \
-    sigaction(SIGSEGV, &old_action, nullptr); \
-    EXTRA_FAULT_END_ACTION();                 \
-  }
-
-TEST(PageAllocatorTest, InaccessiblePages) {
-  void* buffer = AllocPages(nullptr, kPageAllocationGranularity,
-                            kPageAllocationGranularity, PageInaccessible,
-                            PageTag::kChromium, true);
-  EXPECT_TRUE(buffer);
-
-  FAULT_TEST_BEGIN();
-
-  // Reading from buffer should fault.
-  int* buffer0 = reinterpret_cast<int*>(buffer);
-  int buffer0_contents = *buffer0;
-  EXPECT_EQ(buffer0_contents, *buffer0);
-  EXPECT_TRUE(false);
-
-  FAULT_TEST_END();
-
-  FreePages(buffer, kPageAllocationGranularity);
-}
-
-TEST(PageAllocatorTest, ReadExecutePages) {
-  void* buffer = AllocPages(nullptr, kPageAllocationGranularity,
-                            kPageAllocationGranularity, PageReadExecute,
-                            PageTag::kChromium, true);
-  EXPECT_TRUE(buffer);
-  int* buffer0 = reinterpret_cast<int*>(buffer);
-  // Reading from buffer should succeed.
-  int buffer0_contents = *buffer0;
-
-  FAULT_TEST_BEGIN();
-
-  // Writing to buffer should fault.
-  *buffer0 = ~buffer0_contents;
-  EXPECT_TRUE(false);
-
-  FAULT_TEST_END();
-
-  // Make sure no write occurred.
-  EXPECT_EQ(buffer0_contents, *buffer0);
-  FreePages(buffer, kPageAllocationGranularity);
-}
-
-#endif  // defined(OS_POSIX) && !defined(OS_FUCHSIA)
-
-}  // namespace base
-
-#endif  // !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc
deleted file mode 100644
index 994f339..0000000
--- a/base/allocator/partition_allocator/partition_alloc_unittest.cc
+++ /dev/null
@@ -1,2129 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/allocator/partition_allocator/partition_alloc.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/allocator/partition_allocator/address_space_randomization.h"
-#include "base/bit_cast.h"
-#include "base/bits.h"
-#include "base/sys_info.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_POSIX)
-#include <sys/mman.h>
-#if !defined(OS_FUCHSIA)
-#include <sys/resource.h>
-#endif
-#include <sys/time.h>
-#endif  // defined(OS_POSIX)
-
-#if !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
-
-// Because there is so much deep inspection of the internal objects,
-// explicitly annotating the namespaces for commonly expected objects makes the
-// code unreadable. Prefer using directives instead.
-using base::internal::PartitionBucket;
-using base::internal::PartitionPage;
-
-namespace {
-
-constexpr size_t kTestMaxAllocation = base::kSystemPageSize;
-
-bool IsLargeMemoryDevice() {
-  // Treat any device with 2GiB or more of physical memory as a "large memory
-  // device". We check for slightly less than 2GiB so that devices with a small
-  // amount of memory not accessible to the OS still count as "large".
-  return base::SysInfo::AmountOfPhysicalMemory() >= 2040LL * 1024 * 1024;
-}
-
-bool SetAddressSpaceLimit() {
-#if !defined(ARCH_CPU_64_BITS) || !defined(OS_POSIX)
-  // 32 bits => address space is limited already.
-  return true;
-#elif defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_FUCHSIA)
-  // macOS will accept, but not enforce, |RLIMIT_AS| changes. See
-  // https://crbug.com/435269 and rdar://17576114.
-  //
-  // Note: This number must be not less than 6 GB, because with
-  // sanitizer_coverage_flags=edge, it reserves > 5 GB of address space. See
-  // https://crbug.com/674665.
-  const size_t kAddressSpaceLimit = static_cast<size_t>(6144) * 1024 * 1024;
-  struct rlimit limit;
-  if (getrlimit(RLIMIT_AS, &limit) != 0)
-    return false;
-  if (limit.rlim_cur == RLIM_INFINITY || limit.rlim_cur > kAddressSpaceLimit) {
-    limit.rlim_cur = kAddressSpaceLimit;
-    if (setrlimit(RLIMIT_AS, &limit) != 0)
-      return false;
-  }
-  return true;
-#else
-  return false;
-#endif
-}
-
-bool ClearAddressSpaceLimit() {
-#if !defined(ARCH_CPU_64_BITS) || !defined(OS_POSIX) || defined(OS_FUCHSIA)
-  return true;
-#elif defined(OS_POSIX)
-  struct rlimit limit;
-  if (getrlimit(RLIMIT_AS, &limit) != 0)
-    return false;
-  limit.rlim_cur = limit.rlim_max;
-  if (setrlimit(RLIMIT_AS, &limit) != 0)
-    return false;
-  return true;
-#else
-  return false;
-#endif
-}
-
-}  // namespace
-
-namespace base {
-
-// NOTE: Though this test actually excercises interfaces inside the ::base
-// namespace, the unittest is inside the ::base::internal spaces because a
-// portion of the test expectations require inspecting objects and behavior
-// in the ::base::internal namespace. An alternate formulation would be to
-// explicitly add using statements for each inspected type but this felt more
-// readable.
-namespace internal {
-
-const size_t kTestAllocSize = 16;
-#if !DCHECK_IS_ON()
-const size_t kPointerOffset = 0;
-const size_t kExtraAllocSize = 0;
-#else
-const size_t kPointerOffset = kCookieSize;
-const size_t kExtraAllocSize = kCookieSize * 2;
-#endif
-const size_t kRealAllocSize = kTestAllocSize + kExtraAllocSize;
-const size_t kTestBucketIndex = kRealAllocSize >> kBucketShift;
-
-const char* type_name = nullptr;
-
-class PartitionAllocTest : public testing::Test {
- protected:
-  PartitionAllocTest() = default;
-
-  ~PartitionAllocTest() override = default;
-
-  void SetUp() override {
-    allocator.init();
-    generic_allocator.init();
-  }
-
-  PartitionPage* GetFullPage(size_t size) {
-    size_t real_size = size + kExtraAllocSize;
-    size_t bucket_index = real_size >> kBucketShift;
-    PartitionBucket* bucket = &allocator.root()->buckets()[bucket_index];
-    size_t num_slots =
-        (bucket->num_system_pages_per_slot_span * kSystemPageSize) / real_size;
-    void* first = nullptr;
-    void* last = nullptr;
-    size_t i;
-    for (i = 0; i < num_slots; ++i) {
-      void* ptr = allocator.root()->Alloc(size, type_name);
-      EXPECT_TRUE(ptr);
-      if (!i)
-        first = PartitionCookieFreePointerAdjust(ptr);
-      else if (i == num_slots - 1)
-        last = PartitionCookieFreePointerAdjust(ptr);
-    }
-    EXPECT_EQ(PartitionPage::FromPointer(first),
-              PartitionPage::FromPointer(last));
-    if (bucket->num_system_pages_per_slot_span ==
-        kNumSystemPagesPerPartitionPage)
-      EXPECT_EQ(reinterpret_cast<size_t>(first) & kPartitionPageBaseMask,
-                reinterpret_cast<size_t>(last) & kPartitionPageBaseMask);
-    EXPECT_EQ(num_slots, static_cast<size_t>(
-                             bucket->active_pages_head->num_allocated_slots));
-    EXPECT_EQ(nullptr, bucket->active_pages_head->freelist_head);
-    EXPECT_TRUE(bucket->active_pages_head);
-    EXPECT_TRUE(bucket->active_pages_head !=
-                PartitionPage::get_sentinel_page());
-    return bucket->active_pages_head;
-  }
-
-  void CycleFreeCache(size_t size) {
-    size_t real_size = size + kExtraAllocSize;
-    size_t bucket_index = real_size >> kBucketShift;
-    PartitionBucket* bucket = &allocator.root()->buckets()[bucket_index];
-    DCHECK(!bucket->active_pages_head->num_allocated_slots);
-
-    for (size_t i = 0; i < kMaxFreeableSpans; ++i) {
-      void* ptr = allocator.root()->Alloc(size, type_name);
-      EXPECT_EQ(1, bucket->active_pages_head->num_allocated_slots);
-      PartitionFree(ptr);
-      EXPECT_EQ(0, bucket->active_pages_head->num_allocated_slots);
-      EXPECT_NE(-1, bucket->active_pages_head->empty_cache_index);
-    }
-  }
-
-  void CycleGenericFreeCache(size_t size) {
-    for (size_t i = 0; i < kMaxFreeableSpans; ++i) {
-      void* ptr = generic_allocator.root()->Alloc(size, type_name);
-      PartitionPage* page =
-          PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-      PartitionBucket* bucket = page->bucket;
-      EXPECT_EQ(1, bucket->active_pages_head->num_allocated_slots);
-      generic_allocator.root()->Free(ptr);
-      EXPECT_EQ(0, bucket->active_pages_head->num_allocated_slots);
-      EXPECT_NE(-1, bucket->active_pages_head->empty_cache_index);
-    }
-  }
-
-  void DoReturnNullTest(size_t allocSize, bool use_realloc) {
-    // TODO(crbug.com/678782): Where necessary and possible, disable the
-    // platform's OOM-killing behavior. OOM-killing makes this test flaky on
-    // low-memory devices.
-    if (!IsLargeMemoryDevice()) {
-      LOG(WARNING)
-          << "Skipping test on this device because of crbug.com/678782";
-      return;
-    }
-
-    ASSERT_TRUE(SetAddressSpaceLimit());
-
-    // Work out the number of allocations for 6 GB of memory.
-    const int numAllocations = (6 * 1024 * 1024) / (allocSize / 1024);
-
-    void** ptrs = reinterpret_cast<void**>(generic_allocator.root()->Alloc(
-        numAllocations * sizeof(void*), type_name));
-    int i;
-
-    for (i = 0; i < numAllocations; ++i) {
-      if (use_realloc) {
-        ptrs[i] = PartitionAllocGenericFlags(
-            generic_allocator.root(), PartitionAllocReturnNull, 1, type_name);
-        ptrs[i] = PartitionReallocGenericFlags(generic_allocator.root(),
-                                               PartitionAllocReturnNull,
-                                               ptrs[i], allocSize, type_name);
-      } else {
-        ptrs[i] = PartitionAllocGenericFlags(generic_allocator.root(),
-                                             PartitionAllocReturnNull,
-                                             allocSize, type_name);
-      }
-      if (!i)
-        EXPECT_TRUE(ptrs[0]);
-      if (!ptrs[i]) {
-        ptrs[i] = PartitionAllocGenericFlags(generic_allocator.root(),
-                                             PartitionAllocReturnNull,
-                                             allocSize, type_name);
-        EXPECT_FALSE(ptrs[i]);
-        break;
-      }
-    }
-
-    // We shouldn't succeed in allocating all 6 GB of memory. If we do, then
-    // we're not actually testing anything here.
-    EXPECT_LT(i, numAllocations);
-
-    // Free, reallocate and free again each block we allocated. We do this to
-    // check that freeing memory also works correctly after a failed allocation.
-    for (--i; i >= 0; --i) {
-      generic_allocator.root()->Free(ptrs[i]);
-      ptrs[i] = PartitionAllocGenericFlags(generic_allocator.root(),
-                                           PartitionAllocReturnNull, allocSize,
-                                           type_name);
-      EXPECT_TRUE(ptrs[i]);
-      generic_allocator.root()->Free(ptrs[i]);
-    }
-
-    generic_allocator.root()->Free(ptrs);
-
-    EXPECT_TRUE(ClearAddressSpaceLimit());
-  }
-
-  SizeSpecificPartitionAllocator<kTestMaxAllocation> allocator;
-  PartitionAllocatorGeneric generic_allocator;
-};
-
-class PartitionAllocDeathTest : public PartitionAllocTest {};
-
-namespace {
-
-void FreeFullPage(PartitionPage* page) {
-  size_t size = page->bucket->slot_size;
-  size_t num_slots =
-      (page->bucket->num_system_pages_per_slot_span * kSystemPageSize) / size;
-  EXPECT_EQ(num_slots, static_cast<size_t>(abs(page->num_allocated_slots)));
-  char* ptr = reinterpret_cast<char*>(PartitionPage::ToPointer(page));
-  size_t i;
-  for (i = 0; i < num_slots; ++i) {
-    PartitionFree(ptr + kPointerOffset);
-    ptr += size;
-  }
-}
-
-#if defined(OS_LINUX)
-bool CheckPageInCore(void* ptr, bool in_core) {
-  unsigned char ret = 0;
-  EXPECT_EQ(0, mincore(ptr, kSystemPageSize, &ret));
-  return in_core == (ret & 1);
-}
-
-#define CHECK_PAGE_IN_CORE(ptr, in_core) \
-  EXPECT_TRUE(CheckPageInCore(ptr, in_core))
-#else
-#define CHECK_PAGE_IN_CORE(ptr, in_core) (void)(0)
-#endif  // defined(OS_LINUX)
-
-class MockPartitionStatsDumper : public PartitionStatsDumper {
- public:
-  MockPartitionStatsDumper()
-      : total_resident_bytes(0),
-        total_active_bytes(0),
-        total_decommittable_bytes(0),
-        total_discardable_bytes(0) {}
-
-  void PartitionDumpTotals(const char* partition_name,
-                           const PartitionMemoryStats* stats) override {
-    EXPECT_GE(stats->total_mmapped_bytes, stats->total_resident_bytes);
-    EXPECT_EQ(total_resident_bytes, stats->total_resident_bytes);
-    EXPECT_EQ(total_active_bytes, stats->total_active_bytes);
-    EXPECT_EQ(total_decommittable_bytes, stats->total_decommittable_bytes);
-    EXPECT_EQ(total_discardable_bytes, stats->total_discardable_bytes);
-  }
-
-  void PartitionsDumpBucketStats(
-      const char* partition_name,
-      const PartitionBucketMemoryStats* stats) override {
-    (void)partition_name;
-    EXPECT_TRUE(stats->is_valid);
-    EXPECT_EQ(0u, stats->bucket_slot_size & kAllocationGranularityMask);
-    bucket_stats.push_back(*stats);
-    total_resident_bytes += stats->resident_bytes;
-    total_active_bytes += stats->active_bytes;
-    total_decommittable_bytes += stats->decommittable_bytes;
-    total_discardable_bytes += stats->discardable_bytes;
-  }
-
-  bool IsMemoryAllocationRecorded() {
-    return total_resident_bytes != 0 && total_active_bytes != 0;
-  }
-
-  const PartitionBucketMemoryStats* GetBucketStats(size_t bucket_size) {
-    for (size_t i = 0; i < bucket_stats.size(); ++i) {
-      if (bucket_stats[i].bucket_slot_size == bucket_size)
-        return &bucket_stats[i];
-    }
-    return nullptr;
-  }
-
- private:
-  size_t total_resident_bytes;
-  size_t total_active_bytes;
-  size_t total_decommittable_bytes;
-  size_t total_discardable_bytes;
-
-  std::vector<PartitionBucketMemoryStats> bucket_stats;
-};
-
-}  // namespace
-
-// Check that the most basic of allocate / free pairs work.
-TEST_F(PartitionAllocTest, Basic) {
-  PartitionBucket* bucket = &allocator.root()->buckets()[kTestBucketIndex];
-  PartitionPage* seedPage = PartitionPage::get_sentinel_page();
-
-  EXPECT_FALSE(bucket->empty_pages_head);
-  EXPECT_FALSE(bucket->decommitted_pages_head);
-  EXPECT_EQ(seedPage, bucket->active_pages_head);
-  EXPECT_EQ(nullptr, bucket->active_pages_head->next_page);
-
-  void* ptr = allocator.root()->Alloc(kTestAllocSize, type_name);
-  EXPECT_TRUE(ptr);
-  EXPECT_EQ(kPointerOffset,
-            reinterpret_cast<size_t>(ptr) & kPartitionPageOffsetMask);
-  // Check that the offset appears to include a guard page.
-  EXPECT_EQ(kPartitionPageSize + kPointerOffset,
-            reinterpret_cast<size_t>(ptr) & kSuperPageOffsetMask);
-
-  PartitionFree(ptr);
-  // Expect that the last active page gets noticed as empty but doesn't get
-  // decommitted.
-  EXPECT_TRUE(bucket->empty_pages_head);
-  EXPECT_FALSE(bucket->decommitted_pages_head);
-}
-
-// Test multiple allocations, and freelist handling.
-TEST_F(PartitionAllocTest, MultiAlloc) {
-  char* ptr1 = reinterpret_cast<char*>(
-      allocator.root()->Alloc(kTestAllocSize, type_name));
-  char* ptr2 = reinterpret_cast<char*>(
-      allocator.root()->Alloc(kTestAllocSize, type_name));
-  EXPECT_TRUE(ptr1);
-  EXPECT_TRUE(ptr2);
-  ptrdiff_t diff = ptr2 - ptr1;
-  EXPECT_EQ(static_cast<ptrdiff_t>(kRealAllocSize), diff);
-
-  // Check that we re-use the just-freed slot.
-  PartitionFree(ptr2);
-  ptr2 = reinterpret_cast<char*>(
-      allocator.root()->Alloc(kTestAllocSize, type_name));
-  EXPECT_TRUE(ptr2);
-  diff = ptr2 - ptr1;
-  EXPECT_EQ(static_cast<ptrdiff_t>(kRealAllocSize), diff);
-  PartitionFree(ptr1);
-  ptr1 = reinterpret_cast<char*>(
-      allocator.root()->Alloc(kTestAllocSize, type_name));
-  EXPECT_TRUE(ptr1);
-  diff = ptr2 - ptr1;
-  EXPECT_EQ(static_cast<ptrdiff_t>(kRealAllocSize), diff);
-
-  char* ptr3 = reinterpret_cast<char*>(
-      allocator.root()->Alloc(kTestAllocSize, type_name));
-  EXPECT_TRUE(ptr3);
-  diff = ptr3 - ptr1;
-  EXPECT_EQ(static_cast<ptrdiff_t>(kRealAllocSize * 2), diff);
-
-  PartitionFree(ptr1);
-  PartitionFree(ptr2);
-  PartitionFree(ptr3);
-}
-
-// Test a bucket with multiple pages.
-TEST_F(PartitionAllocTest, MultiPages) {
-  PartitionBucket* bucket = &allocator.root()->buckets()[kTestBucketIndex];
-
-  PartitionPage* page = GetFullPage(kTestAllocSize);
-  FreeFullPage(page);
-  EXPECT_TRUE(bucket->empty_pages_head);
-  EXPECT_EQ(PartitionPage::get_sentinel_page(), bucket->active_pages_head);
-  EXPECT_EQ(nullptr, page->next_page);
-  EXPECT_EQ(0, page->num_allocated_slots);
-
-  page = GetFullPage(kTestAllocSize);
-  PartitionPage* page2 = GetFullPage(kTestAllocSize);
-
-  EXPECT_EQ(page2, bucket->active_pages_head);
-  EXPECT_EQ(nullptr, page2->next_page);
-  EXPECT_EQ(reinterpret_cast<uintptr_t>(PartitionPage::ToPointer(page)) &
-                kSuperPageBaseMask,
-            reinterpret_cast<uintptr_t>(PartitionPage::ToPointer(page2)) &
-                kSuperPageBaseMask);
-
-  // Fully free the non-current page. This will leave us with no current
-  // active page because one is empty and the other is full.
-  FreeFullPage(page);
-  EXPECT_EQ(0, page->num_allocated_slots);
-  EXPECT_TRUE(bucket->empty_pages_head);
-  EXPECT_EQ(PartitionPage::get_sentinel_page(), bucket->active_pages_head);
-
-  // Allocate a new page, it should pull from the freelist.
-  page = GetFullPage(kTestAllocSize);
-  EXPECT_FALSE(bucket->empty_pages_head);
-  EXPECT_EQ(page, bucket->active_pages_head);
-
-  FreeFullPage(page);
-  FreeFullPage(page2);
-  EXPECT_EQ(0, page->num_allocated_slots);
-  EXPECT_EQ(0, page2->num_allocated_slots);
-  EXPECT_EQ(0, page2->num_unprovisioned_slots);
-  EXPECT_NE(-1, page2->empty_cache_index);
-}
-
-// Test some finer aspects of internal page transitions.
-TEST_F(PartitionAllocTest, PageTransitions) {
-  PartitionBucket* bucket = &allocator.root()->buckets()[kTestBucketIndex];
-
-  PartitionPage* page1 = GetFullPage(kTestAllocSize);
-  EXPECT_EQ(page1, bucket->active_pages_head);
-  EXPECT_EQ(nullptr, page1->next_page);
-  PartitionPage* page2 = GetFullPage(kTestAllocSize);
-  EXPECT_EQ(page2, bucket->active_pages_head);
-  EXPECT_EQ(nullptr, page2->next_page);
-
-  // Bounce page1 back into the non-full list then fill it up again.
-  char* ptr =
-      reinterpret_cast<char*>(PartitionPage::ToPointer(page1)) + kPointerOffset;
-  PartitionFree(ptr);
-  EXPECT_EQ(page1, bucket->active_pages_head);
-  (void)allocator.root()->Alloc(kTestAllocSize, type_name);
-  EXPECT_EQ(page1, bucket->active_pages_head);
-  EXPECT_EQ(page2, bucket->active_pages_head->next_page);
-
-  // Allocating another page at this point should cause us to scan over page1
-  // (which is both full and NOT our current page), and evict it from the
-  // freelist. Older code had a O(n^2) condition due to failure to do this.
-  PartitionPage* page3 = GetFullPage(kTestAllocSize);
-  EXPECT_EQ(page3, bucket->active_pages_head);
-  EXPECT_EQ(nullptr, page3->next_page);
-
-  // Work out a pointer into page2 and free it.
-  ptr =
-      reinterpret_cast<char*>(PartitionPage::ToPointer(page2)) + kPointerOffset;
-  PartitionFree(ptr);
-  // Trying to allocate at this time should cause us to cycle around to page2
-  // and find the recently freed slot.
-  char* newPtr = reinterpret_cast<char*>(
-      allocator.root()->Alloc(kTestAllocSize, type_name));
-  EXPECT_EQ(ptr, newPtr);
-  EXPECT_EQ(page2, bucket->active_pages_head);
-  EXPECT_EQ(page3, page2->next_page);
-
-  // Work out a pointer into page1 and free it. This should pull the page
-  // back into the list of available pages.
-  ptr =
-      reinterpret_cast<char*>(PartitionPage::ToPointer(page1)) + kPointerOffset;
-  PartitionFree(ptr);
-  // This allocation should be satisfied by page1.
-  newPtr = reinterpret_cast<char*>(
-      allocator.root()->Alloc(kTestAllocSize, type_name));
-  EXPECT_EQ(ptr, newPtr);
-  EXPECT_EQ(page1, bucket->active_pages_head);
-  EXPECT_EQ(page2, page1->next_page);
-
-  FreeFullPage(page3);
-  FreeFullPage(page2);
-  FreeFullPage(page1);
-
-  // Allocating whilst in this state exposed a bug, so keep the test.
-  ptr = reinterpret_cast<char*>(
-      allocator.root()->Alloc(kTestAllocSize, type_name));
-  PartitionFree(ptr);
-}
-
-// Test some corner cases relating to page transitions in the internal
-// free page list metadata bucket.
-TEST_F(PartitionAllocTest, FreePageListPageTransitions) {
-  PartitionBucket* bucket = &allocator.root()->buckets()[kTestBucketIndex];
-
-  size_t numToFillFreeListPage =
-      kPartitionPageSize / (sizeof(PartitionPage) + kExtraAllocSize);
-  // The +1 is because we need to account for the fact that the current page
-  // never gets thrown on the freelist.
-  ++numToFillFreeListPage;
-  auto pages = std::make_unique<PartitionPage* []>(numToFillFreeListPage);
-
-  size_t i;
-  for (i = 0; i < numToFillFreeListPage; ++i) {
-    pages[i] = GetFullPage(kTestAllocSize);
-  }
-  EXPECT_EQ(pages[numToFillFreeListPage - 1], bucket->active_pages_head);
-  for (i = 0; i < numToFillFreeListPage; ++i)
-    FreeFullPage(pages[i]);
-  EXPECT_EQ(PartitionPage::get_sentinel_page(), bucket->active_pages_head);
-  EXPECT_TRUE(bucket->empty_pages_head);
-
-  // Allocate / free in a different bucket size so we get control of a
-  // different free page list. We need two pages because one will be the last
-  // active page and not get freed.
-  PartitionPage* page1 = GetFullPage(kTestAllocSize * 2);
-  PartitionPage* page2 = GetFullPage(kTestAllocSize * 2);
-  FreeFullPage(page1);
-  FreeFullPage(page2);
-
-  for (i = 0; i < numToFillFreeListPage; ++i) {
-    pages[i] = GetFullPage(kTestAllocSize);
-  }
-  EXPECT_EQ(pages[numToFillFreeListPage - 1], bucket->active_pages_head);
-
-  for (i = 0; i < numToFillFreeListPage; ++i)
-    FreeFullPage(pages[i]);
-  EXPECT_EQ(PartitionPage::get_sentinel_page(), bucket->active_pages_head);
-  EXPECT_TRUE(bucket->empty_pages_head);
-}
-
-// Test a large series of allocations that cross more than one underlying
-// 64KB super page allocation.
-TEST_F(PartitionAllocTest, MultiPageAllocs) {
-  // This is guaranteed to cross a super page boundary because the first
-  // partition page "slot" will be taken up by a guard page.
-  size_t numPagesNeeded = kNumPartitionPagesPerSuperPage;
-  // The super page should begin and end in a guard so we one less page in
-  // order to allocate a single page in the new super page.
-  --numPagesNeeded;
-
-  EXPECT_GT(numPagesNeeded, 1u);
-  auto pages = std::make_unique<PartitionPage* []>(numPagesNeeded);
-  uintptr_t firstSuperPageBase = 0;
-  size_t i;
-  for (i = 0; i < numPagesNeeded; ++i) {
-    pages[i] = GetFullPage(kTestAllocSize);
-    void* storagePtr = PartitionPage::ToPointer(pages[i]);
-    if (!i)
-      firstSuperPageBase =
-          reinterpret_cast<uintptr_t>(storagePtr) & kSuperPageBaseMask;
-    if (i == numPagesNeeded - 1) {
-      uintptr_t secondSuperPageBase =
-          reinterpret_cast<uintptr_t>(storagePtr) & kSuperPageBaseMask;
-      uintptr_t secondSuperPageOffset =
-          reinterpret_cast<uintptr_t>(storagePtr) & kSuperPageOffsetMask;
-      EXPECT_FALSE(secondSuperPageBase == firstSuperPageBase);
-      // Check that we allocated a guard page for the second page.
-      EXPECT_EQ(kPartitionPageSize, secondSuperPageOffset);
-    }
-  }
-  for (i = 0; i < numPagesNeeded; ++i)
-    FreeFullPage(pages[i]);
-}
-
-// Test the generic allocation functions that can handle arbitrary sizes and
-// reallocing etc.
-TEST_F(PartitionAllocTest, GenericAlloc) {
-  void* ptr = generic_allocator.root()->Alloc(1, type_name);
-  EXPECT_TRUE(ptr);
-  generic_allocator.root()->Free(ptr);
-  ptr = generic_allocator.root()->Alloc(kGenericMaxBucketed + 1, type_name);
-  EXPECT_TRUE(ptr);
-  generic_allocator.root()->Free(ptr);
-
-  ptr = generic_allocator.root()->Alloc(1, type_name);
-  EXPECT_TRUE(ptr);
-  void* origPtr = ptr;
-  char* charPtr = static_cast<char*>(ptr);
-  *charPtr = 'A';
-
-  // Change the size of the realloc, remaining inside the same bucket.
-  void* newPtr = generic_allocator.root()->Realloc(ptr, 2, type_name);
-  EXPECT_EQ(ptr, newPtr);
-  newPtr = generic_allocator.root()->Realloc(ptr, 1, type_name);
-  EXPECT_EQ(ptr, newPtr);
-  newPtr =
-      generic_allocator.root()->Realloc(ptr, kGenericSmallestBucket, type_name);
-  EXPECT_EQ(ptr, newPtr);
-
-  // Change the size of the realloc, switching buckets.
-  newPtr = generic_allocator.root()->Realloc(ptr, kGenericSmallestBucket + 1,
-                                             type_name);
-  EXPECT_NE(newPtr, ptr);
-  // Check that the realloc copied correctly.
-  char* newCharPtr = static_cast<char*>(newPtr);
-  EXPECT_EQ(*newCharPtr, 'A');
-#if DCHECK_IS_ON()
-  // Subtle: this checks for an old bug where we copied too much from the
-  // source of the realloc. The condition can be detected by a trashing of
-  // the uninitialized value in the space of the upsized allocation.
-  EXPECT_EQ(kUninitializedByte,
-            static_cast<unsigned char>(*(newCharPtr + kGenericSmallestBucket)));
-#endif
-  *newCharPtr = 'B';
-  // The realloc moved. To check that the old allocation was freed, we can
-  // do an alloc of the old allocation size and check that the old allocation
-  // address is at the head of the freelist and reused.
-  void* reusedPtr = generic_allocator.root()->Alloc(1, type_name);
-  EXPECT_EQ(reusedPtr, origPtr);
-  generic_allocator.root()->Free(reusedPtr);
-
-  // Downsize the realloc.
-  ptr = newPtr;
-  newPtr = generic_allocator.root()->Realloc(ptr, 1, type_name);
-  EXPECT_EQ(newPtr, origPtr);
-  newCharPtr = static_cast<char*>(newPtr);
-  EXPECT_EQ(*newCharPtr, 'B');
-  *newCharPtr = 'C';
-
-  // Upsize the realloc to outside the partition.
-  ptr = newPtr;
-  newPtr = generic_allocator.root()->Realloc(ptr, kGenericMaxBucketed + 1,
-                                             type_name);
-  EXPECT_NE(newPtr, ptr);
-  newCharPtr = static_cast<char*>(newPtr);
-  EXPECT_EQ(*newCharPtr, 'C');
-  *newCharPtr = 'D';
-
-  // Upsize and downsize the realloc, remaining outside the partition.
-  ptr = newPtr;
-  newPtr = generic_allocator.root()->Realloc(ptr, kGenericMaxBucketed * 10,
-                                             type_name);
-  newCharPtr = static_cast<char*>(newPtr);
-  EXPECT_EQ(*newCharPtr, 'D');
-  *newCharPtr = 'E';
-  ptr = newPtr;
-  newPtr = generic_allocator.root()->Realloc(ptr, kGenericMaxBucketed * 2,
-                                             type_name);
-  newCharPtr = static_cast<char*>(newPtr);
-  EXPECT_EQ(*newCharPtr, 'E');
-  *newCharPtr = 'F';
-
-  // Downsize the realloc to inside the partition.
-  ptr = newPtr;
-  newPtr = generic_allocator.root()->Realloc(ptr, 1, type_name);
-  EXPECT_NE(newPtr, ptr);
-  EXPECT_EQ(newPtr, origPtr);
-  newCharPtr = static_cast<char*>(newPtr);
-  EXPECT_EQ(*newCharPtr, 'F');
-
-  generic_allocator.root()->Free(newPtr);
-}
-
-// Test the generic allocation functions can handle some specific sizes of
-// interest.
-TEST_F(PartitionAllocTest, GenericAllocSizes) {
-  void* ptr = generic_allocator.root()->Alloc(0, type_name);
-  EXPECT_TRUE(ptr);
-  generic_allocator.root()->Free(ptr);
-
-  // kPartitionPageSize is interesting because it results in just one
-  // allocation per page, which tripped up some corner cases.
-  size_t size = kPartitionPageSize - kExtraAllocSize;
-  ptr = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_TRUE(ptr);
-  void* ptr2 = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_TRUE(ptr2);
-  generic_allocator.root()->Free(ptr);
-  // Should be freeable at this point.
-  PartitionPage* page =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  EXPECT_NE(-1, page->empty_cache_index);
-  generic_allocator.root()->Free(ptr2);
-
-  size = (((kPartitionPageSize * kMaxPartitionPagesPerSlotSpan) -
-           kSystemPageSize) /
-          2) -
-         kExtraAllocSize;
-  ptr = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_TRUE(ptr);
-  memset(ptr, 'A', size);
-  ptr2 = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_TRUE(ptr2);
-  void* ptr3 = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_TRUE(ptr3);
-  void* ptr4 = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_TRUE(ptr4);
-
-  page = PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  PartitionPage* page2 =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr3));
-  EXPECT_NE(page, page2);
-
-  generic_allocator.root()->Free(ptr);
-  generic_allocator.root()->Free(ptr3);
-  generic_allocator.root()->Free(ptr2);
-  // Should be freeable at this point.
-  EXPECT_NE(-1, page->empty_cache_index);
-  EXPECT_EQ(0, page->num_allocated_slots);
-  EXPECT_EQ(0, page->num_unprovisioned_slots);
-  void* newPtr = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_EQ(ptr3, newPtr);
-  newPtr = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_EQ(ptr2, newPtr);
-#if defined(OS_LINUX) && !DCHECK_IS_ON()
-  // On Linux, we have a guarantee that freelisting a page should cause its
-  // contents to be nulled out. We check for null here to detect an bug we
-  // had where a large slot size was causing us to not properly free all
-  // resources back to the system.
-  // We only run the check when asserts are disabled because when they are
-  // enabled, the allocated area is overwritten with an "uninitialized"
-  // byte pattern.
-  EXPECT_EQ(0, *(reinterpret_cast<char*>(newPtr) + (size - 1)));
-#endif
-  generic_allocator.root()->Free(newPtr);
-  generic_allocator.root()->Free(ptr3);
-  generic_allocator.root()->Free(ptr4);
-
-  // Can we allocate a massive (512MB) size?
-  // Allocate 512MB, but +1, to test for cookie writing alignment issues.
-  // Test this only if the device has enough memory or it might fail due
-  // to OOM.
-  if (IsLargeMemoryDevice()) {
-    ptr = generic_allocator.root()->Alloc(512 * 1024 * 1024 + 1, type_name);
-    generic_allocator.root()->Free(ptr);
-  }
-
-  // Check a more reasonable, but still direct mapped, size.
-  // Chop a system page and a byte off to test for rounding errors.
-  size = 20 * 1024 * 1024;
-  size -= kSystemPageSize;
-  size -= 1;
-  ptr = generic_allocator.root()->Alloc(size, type_name);
-  char* charPtr = reinterpret_cast<char*>(ptr);
-  *(charPtr + (size - 1)) = 'A';
-  generic_allocator.root()->Free(ptr);
-
-  // Can we free null?
-  generic_allocator.root()->Free(nullptr);
-
-  // Do we correctly get a null for a failed allocation?
-  EXPECT_EQ(nullptr, PartitionAllocGenericFlags(
-                         generic_allocator.root(), PartitionAllocReturnNull,
-                         3u * 1024 * 1024 * 1024, type_name));
-}
-
-// Test that we can fetch the real allocated size after an allocation.
-TEST_F(PartitionAllocTest, GenericAllocGetSize) {
-  void* ptr;
-  size_t requested_size, actual_size, predicted_size;
-
-  EXPECT_TRUE(PartitionAllocSupportsGetSize());
-
-  // Allocate something small.
-  requested_size = 511 - kExtraAllocSize;
-  predicted_size = generic_allocator.root()->ActualSize(requested_size);
-  ptr = generic_allocator.root()->Alloc(requested_size, type_name);
-  EXPECT_TRUE(ptr);
-  actual_size = PartitionAllocGetSize(ptr);
-  EXPECT_EQ(predicted_size, actual_size);
-  EXPECT_LT(requested_size, actual_size);
-  generic_allocator.root()->Free(ptr);
-
-  // Allocate a size that should be a perfect match for a bucket, because it
-  // is an exact power of 2.
-  requested_size = (256 * 1024) - kExtraAllocSize;
-  predicted_size = generic_allocator.root()->ActualSize(requested_size);
-  ptr = generic_allocator.root()->Alloc(requested_size, type_name);
-  EXPECT_TRUE(ptr);
-  actual_size = PartitionAllocGetSize(ptr);
-  EXPECT_EQ(predicted_size, actual_size);
-  EXPECT_EQ(requested_size, actual_size);
-  generic_allocator.root()->Free(ptr);
-
-  // Allocate a size that is a system page smaller than a bucket. GetSize()
-  // should return a larger size than we asked for now.
-  size_t num = 64;
-  while (num * kSystemPageSize >= 1024 * 1024) {
-    num /= 2;
-  }
-  requested_size = num * kSystemPageSize - kSystemPageSize - kExtraAllocSize;
-  predicted_size = generic_allocator.root()->ActualSize(requested_size);
-  ptr = generic_allocator.root()->Alloc(requested_size, type_name);
-  EXPECT_TRUE(ptr);
-  actual_size = PartitionAllocGetSize(ptr);
-  EXPECT_EQ(predicted_size, actual_size);
-  EXPECT_EQ(requested_size + kSystemPageSize, actual_size);
-  // Check that we can write at the end of the reported size too.
-  char* charPtr = reinterpret_cast<char*>(ptr);
-  *(charPtr + (actual_size - 1)) = 'A';
-  generic_allocator.root()->Free(ptr);
-
-  // Allocate something very large, and uneven.
-  if (IsLargeMemoryDevice()) {
-    requested_size = 512 * 1024 * 1024 - 1;
-    predicted_size = generic_allocator.root()->ActualSize(requested_size);
-    ptr = generic_allocator.root()->Alloc(requested_size, type_name);
-    EXPECT_TRUE(ptr);
-    actual_size = PartitionAllocGetSize(ptr);
-    EXPECT_EQ(predicted_size, actual_size);
-    EXPECT_LT(requested_size, actual_size);
-    generic_allocator.root()->Free(ptr);
-  }
-
-  // Too large allocation.
-  requested_size = kGenericMaxDirectMapped + 1;
-  predicted_size = generic_allocator.root()->ActualSize(requested_size);
-  EXPECT_EQ(requested_size, predicted_size);
-}
-
-// Test the realloc() contract.
-TEST_F(PartitionAllocTest, Realloc) {
-  // realloc(0, size) should be equivalent to malloc().
-  void* ptr =
-      generic_allocator.root()->Realloc(nullptr, kTestAllocSize, type_name);
-  memset(ptr, 'A', kTestAllocSize);
-  PartitionPage* page =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  // realloc(ptr, 0) should be equivalent to free().
-  void* ptr2 = generic_allocator.root()->Realloc(ptr, 0, type_name);
-  EXPECT_EQ(nullptr, ptr2);
-  EXPECT_EQ(PartitionCookieFreePointerAdjust(ptr), page->freelist_head);
-
-  // Test that growing an allocation with realloc() copies everything from the
-  // old allocation.
-  size_t size = kSystemPageSize - kExtraAllocSize;
-  EXPECT_EQ(size, generic_allocator.root()->ActualSize(size));
-  ptr = generic_allocator.root()->Alloc(size, type_name);
-  memset(ptr, 'A', size);
-  ptr2 = generic_allocator.root()->Realloc(ptr, size + 1, type_name);
-  EXPECT_NE(ptr, ptr2);
-  char* charPtr2 = static_cast<char*>(ptr2);
-  EXPECT_EQ('A', charPtr2[0]);
-  EXPECT_EQ('A', charPtr2[size - 1]);
-#if DCHECK_IS_ON()
-  EXPECT_EQ(kUninitializedByte, static_cast<unsigned char>(charPtr2[size]));
-#endif
-
-  // Test that shrinking an allocation with realloc() also copies everything
-  // from the old allocation.
-  ptr = generic_allocator.root()->Realloc(ptr2, size - 1, type_name);
-  EXPECT_NE(ptr2, ptr);
-  char* charPtr = static_cast<char*>(ptr);
-  EXPECT_EQ('A', charPtr[0]);
-  EXPECT_EQ('A', charPtr[size - 2]);
-#if DCHECK_IS_ON()
-  EXPECT_EQ(kUninitializedByte, static_cast<unsigned char>(charPtr[size - 1]));
-#endif
-
-  generic_allocator.root()->Free(ptr);
-
-  // Test that shrinking a direct mapped allocation happens in-place.
-  size = kGenericMaxBucketed + 16 * kSystemPageSize;
-  ptr = generic_allocator.root()->Alloc(size, type_name);
-  size_t actual_size = PartitionAllocGetSize(ptr);
-  ptr2 = generic_allocator.root()->Realloc(
-      ptr, kGenericMaxBucketed + 8 * kSystemPageSize, type_name);
-  EXPECT_EQ(ptr, ptr2);
-  EXPECT_EQ(actual_size - 8 * kSystemPageSize, PartitionAllocGetSize(ptr2));
-
-  // Test that a previously in-place shrunk direct mapped allocation can be
-  // expanded up again within its original size.
-  ptr = generic_allocator.root()->Realloc(ptr2, size - kSystemPageSize,
-                                          type_name);
-  EXPECT_EQ(ptr2, ptr);
-  EXPECT_EQ(actual_size - kSystemPageSize, PartitionAllocGetSize(ptr));
-
-  // Test that a direct mapped allocation is performed not in-place when the
-  // new size is small enough.
-  ptr2 = generic_allocator.root()->Realloc(ptr, kSystemPageSize, type_name);
-  EXPECT_NE(ptr, ptr2);
-
-  generic_allocator.root()->Free(ptr2);
-}
-
-// Tests the handing out of freelists for partial pages.
-TEST_F(PartitionAllocTest, PartialPageFreelists) {
-  size_t big_size = allocator.root()->max_allocation - kExtraAllocSize;
-  EXPECT_EQ(kSystemPageSize - kAllocationGranularity,
-            big_size + kExtraAllocSize);
-  size_t bucket_index = (big_size + kExtraAllocSize) >> kBucketShift;
-  PartitionBucket* bucket = &allocator.root()->buckets()[bucket_index];
-  EXPECT_EQ(nullptr, bucket->empty_pages_head);
-
-  void* ptr = allocator.root()->Alloc(big_size, type_name);
-  EXPECT_TRUE(ptr);
-
-  PartitionPage* page =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  size_t totalSlots =
-      (page->bucket->num_system_pages_per_slot_span * kSystemPageSize) /
-      (big_size + kExtraAllocSize);
-  EXPECT_EQ(4u, totalSlots);
-  // The freelist should have one entry, because we were able to exactly fit
-  // one object slot and one freelist pointer (the null that the head points
-  // to) into a system page.
-  EXPECT_TRUE(page->freelist_head);
-  EXPECT_EQ(1, page->num_allocated_slots);
-  EXPECT_EQ(2, page->num_unprovisioned_slots);
-
-  void* ptr2 = allocator.root()->Alloc(big_size, type_name);
-  EXPECT_TRUE(ptr2);
-  EXPECT_FALSE(page->freelist_head);
-  EXPECT_EQ(2, page->num_allocated_slots);
-  EXPECT_EQ(2, page->num_unprovisioned_slots);
-
-  void* ptr3 = allocator.root()->Alloc(big_size, type_name);
-  EXPECT_TRUE(ptr3);
-  EXPECT_TRUE(page->freelist_head);
-  EXPECT_EQ(3, page->num_allocated_slots);
-  EXPECT_EQ(0, page->num_unprovisioned_slots);
-
-  void* ptr4 = allocator.root()->Alloc(big_size, type_name);
-  EXPECT_TRUE(ptr4);
-  EXPECT_FALSE(page->freelist_head);
-  EXPECT_EQ(4, page->num_allocated_slots);
-  EXPECT_EQ(0, page->num_unprovisioned_slots);
-
-  void* ptr5 = allocator.root()->Alloc(big_size, type_name);
-  EXPECT_TRUE(ptr5);
-
-  PartitionPage* page2 =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr5));
-  EXPECT_EQ(1, page2->num_allocated_slots);
-
-  // Churn things a little whilst there's a partial page freelist.
-  PartitionFree(ptr);
-  ptr = allocator.root()->Alloc(big_size, type_name);
-  void* ptr6 = allocator.root()->Alloc(big_size, type_name);
-
-  PartitionFree(ptr);
-  PartitionFree(ptr2);
-  PartitionFree(ptr3);
-  PartitionFree(ptr4);
-  PartitionFree(ptr5);
-  PartitionFree(ptr6);
-  EXPECT_NE(-1, page->empty_cache_index);
-  EXPECT_NE(-1, page2->empty_cache_index);
-  EXPECT_TRUE(page2->freelist_head);
-  EXPECT_EQ(0, page2->num_allocated_slots);
-
-  // And test a couple of sizes that do not cross kSystemPageSize with a single
-  // allocation.
-  size_t mediumSize = (kSystemPageSize / 2) - kExtraAllocSize;
-  bucket_index = (mediumSize + kExtraAllocSize) >> kBucketShift;
-  bucket = &allocator.root()->buckets()[bucket_index];
-  EXPECT_EQ(nullptr, bucket->empty_pages_head);
-
-  ptr = allocator.root()->Alloc(mediumSize, type_name);
-  EXPECT_TRUE(ptr);
-  page = PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  EXPECT_EQ(1, page->num_allocated_slots);
-  totalSlots =
-      (page->bucket->num_system_pages_per_slot_span * kSystemPageSize) /
-      (mediumSize + kExtraAllocSize);
-  size_t firstPageSlots = kSystemPageSize / (mediumSize + kExtraAllocSize);
-  EXPECT_EQ(2u, firstPageSlots);
-  EXPECT_EQ(totalSlots - firstPageSlots, page->num_unprovisioned_slots);
-
-  PartitionFree(ptr);
-
-  size_t smallSize = (kSystemPageSize / 4) - kExtraAllocSize;
-  bucket_index = (smallSize + kExtraAllocSize) >> kBucketShift;
-  bucket = &allocator.root()->buckets()[bucket_index];
-  EXPECT_EQ(nullptr, bucket->empty_pages_head);
-
-  ptr = allocator.root()->Alloc(smallSize, type_name);
-  EXPECT_TRUE(ptr);
-  page = PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  EXPECT_EQ(1, page->num_allocated_slots);
-  totalSlots =
-      (page->bucket->num_system_pages_per_slot_span * kSystemPageSize) /
-      (smallSize + kExtraAllocSize);
-  firstPageSlots = kSystemPageSize / (smallSize + kExtraAllocSize);
-  EXPECT_EQ(totalSlots - firstPageSlots, page->num_unprovisioned_slots);
-
-  PartitionFree(ptr);
-  EXPECT_TRUE(page->freelist_head);
-  EXPECT_EQ(0, page->num_allocated_slots);
-
-  size_t verySmallSize = 32 - kExtraAllocSize;
-  bucket_index = (verySmallSize + kExtraAllocSize) >> kBucketShift;
-  bucket = &allocator.root()->buckets()[bucket_index];
-  EXPECT_EQ(nullptr, bucket->empty_pages_head);
-
-  ptr = allocator.root()->Alloc(verySmallSize, type_name);
-  EXPECT_TRUE(ptr);
-  page = PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  EXPECT_EQ(1, page->num_allocated_slots);
-  totalSlots =
-      (page->bucket->num_system_pages_per_slot_span * kSystemPageSize) /
-      (verySmallSize + kExtraAllocSize);
-  firstPageSlots = kSystemPageSize / (verySmallSize + kExtraAllocSize);
-  EXPECT_EQ(totalSlots - firstPageSlots, page->num_unprovisioned_slots);
-
-  PartitionFree(ptr);
-  EXPECT_TRUE(page->freelist_head);
-  EXPECT_EQ(0, page->num_allocated_slots);
-
-  // And try an allocation size (against the generic allocator) that is
-  // larger than a system page.
-  size_t pageAndAHalfSize =
-      (kSystemPageSize + (kSystemPageSize / 2)) - kExtraAllocSize;
-  ptr = generic_allocator.root()->Alloc(pageAndAHalfSize, type_name);
-  EXPECT_TRUE(ptr);
-  page = PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  EXPECT_EQ(1, page->num_allocated_slots);
-  EXPECT_TRUE(page->freelist_head);
-  totalSlots =
-      (page->bucket->num_system_pages_per_slot_span * kSystemPageSize) /
-      (pageAndAHalfSize + kExtraAllocSize);
-  EXPECT_EQ(totalSlots - 2, page->num_unprovisioned_slots);
-  generic_allocator.root()->Free(ptr);
-
-  // And then make sure than exactly the page size only faults one page.
-  size_t pageSize = kSystemPageSize - kExtraAllocSize;
-  ptr = generic_allocator.root()->Alloc(pageSize, type_name);
-  EXPECT_TRUE(ptr);
-  page = PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  EXPECT_EQ(1, page->num_allocated_slots);
-  EXPECT_FALSE(page->freelist_head);
-  totalSlots =
-      (page->bucket->num_system_pages_per_slot_span * kSystemPageSize) /
-      (pageSize + kExtraAllocSize);
-  EXPECT_EQ(totalSlots - 1, page->num_unprovisioned_slots);
-  generic_allocator.root()->Free(ptr);
-}
-
-// Test some of the fragmentation-resistant properties of the allocator.
-TEST_F(PartitionAllocTest, PageRefilling) {
-  PartitionBucket* bucket = &allocator.root()->buckets()[kTestBucketIndex];
-
-  // Grab two full pages and a non-full page.
-  PartitionPage* page1 = GetFullPage(kTestAllocSize);
-  PartitionPage* page2 = GetFullPage(kTestAllocSize);
-  void* ptr = allocator.root()->Alloc(kTestAllocSize, type_name);
-  EXPECT_TRUE(ptr);
-  EXPECT_NE(page1, bucket->active_pages_head);
-  EXPECT_NE(page2, bucket->active_pages_head);
-  PartitionPage* page =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  EXPECT_EQ(1, page->num_allocated_slots);
-
-  // Work out a pointer into page2 and free it; and then page1 and free it.
-  char* ptr2 =
-      reinterpret_cast<char*>(PartitionPage::ToPointer(page1)) + kPointerOffset;
-  PartitionFree(ptr2);
-  ptr2 =
-      reinterpret_cast<char*>(PartitionPage::ToPointer(page2)) + kPointerOffset;
-  PartitionFree(ptr2);
-
-  // If we perform two allocations from the same bucket now, we expect to
-  // refill both the nearly full pages.
-  (void)allocator.root()->Alloc(kTestAllocSize, type_name);
-  (void)allocator.root()->Alloc(kTestAllocSize, type_name);
-  EXPECT_EQ(1, page->num_allocated_slots);
-
-  FreeFullPage(page2);
-  FreeFullPage(page1);
-  PartitionFree(ptr);
-}
-
-// Basic tests to ensure that allocations work for partial page buckets.
-TEST_F(PartitionAllocTest, PartialPages) {
-  // Find a size that is backed by a partial partition page.
-  size_t size = sizeof(void*);
-  PartitionBucket* bucket = nullptr;
-  while (size < kTestMaxAllocation) {
-    bucket = &allocator.root()->buckets()[size >> kBucketShift];
-    if (bucket->num_system_pages_per_slot_span %
-        kNumSystemPagesPerPartitionPage)
-      break;
-    size += sizeof(void*);
-  }
-  EXPECT_LT(size, kTestMaxAllocation);
-
-  PartitionPage* page1 = GetFullPage(size);
-  PartitionPage* page2 = GetFullPage(size);
-  FreeFullPage(page2);
-  FreeFullPage(page1);
-}
-
-// Test correct handling if our mapping collides with another.
-TEST_F(PartitionAllocTest, MappingCollision) {
-  // The -2 is because the first and last partition pages in a super page are
-  // guard pages.
-  size_t numPartitionPagesNeeded = kNumPartitionPagesPerSuperPage - 2;
-  auto firstSuperPagePages =
-      std::make_unique<PartitionPage* []>(numPartitionPagesNeeded);
-  auto secondSuperPagePages =
-      std::make_unique<PartitionPage* []>(numPartitionPagesNeeded);
-
-  size_t i;
-  for (i = 0; i < numPartitionPagesNeeded; ++i)
-    firstSuperPagePages[i] = GetFullPage(kTestAllocSize);
-
-  char* pageBase =
-      reinterpret_cast<char*>(PartitionPage::ToPointer(firstSuperPagePages[0]));
-  EXPECT_EQ(kPartitionPageSize,
-            reinterpret_cast<uintptr_t>(pageBase) & kSuperPageOffsetMask);
-  pageBase -= kPartitionPageSize;
-  // Map a single system page either side of the mapping for our allocations,
-  // with the goal of tripping up alignment of the next mapping.
-  void* map1 = AllocPages(pageBase - kPageAllocationGranularity,
-                          kPageAllocationGranularity,
-                          kPageAllocationGranularity, PageInaccessible);
-  EXPECT_TRUE(map1);
-  void* map2 = AllocPages(pageBase + kSuperPageSize, kPageAllocationGranularity,
-                          kPageAllocationGranularity, PageInaccessible);
-  EXPECT_TRUE(map2);
-
-  for (i = 0; i < numPartitionPagesNeeded; ++i)
-    secondSuperPagePages[i] = GetFullPage(kTestAllocSize);
-
-  FreePages(map1, kPageAllocationGranularity);
-  FreePages(map2, kPageAllocationGranularity);
-
-  pageBase = reinterpret_cast<char*>(
-      PartitionPage::ToPointer(secondSuperPagePages[0]));
-  EXPECT_EQ(kPartitionPageSize,
-            reinterpret_cast<uintptr_t>(pageBase) & kSuperPageOffsetMask);
-  pageBase -= kPartitionPageSize;
-  // Map a single system page either side of the mapping for our allocations,
-  // with the goal of tripping up alignment of the next mapping.
-  map1 = AllocPages(pageBase - kPageAllocationGranularity,
-                    kPageAllocationGranularity, kPageAllocationGranularity,
-                    PageReadWrite);
-  EXPECT_TRUE(map1);
-  map2 = AllocPages(pageBase + kSuperPageSize, kPageAllocationGranularity,
-                    kPageAllocationGranularity, PageReadWrite);
-  EXPECT_TRUE(map2);
-  EXPECT_TRUE(
-      SetSystemPagesAccess(map1, kPageAllocationGranularity, PageInaccessible));
-  EXPECT_TRUE(
-      SetSystemPagesAccess(map2, kPageAllocationGranularity, PageInaccessible));
-
-  PartitionPage* pageInThirdSuperPage = GetFullPage(kTestAllocSize);
-  FreePages(map1, kPageAllocationGranularity);
-  FreePages(map2, kPageAllocationGranularity);
-
-  EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(
-                    PartitionPage::ToPointer(pageInThirdSuperPage)) &
-                    kPartitionPageOffsetMask);
-
-  // And make sure we really did get a page in a new superpage.
-  EXPECT_NE(reinterpret_cast<uintptr_t>(
-                PartitionPage::ToPointer(firstSuperPagePages[0])) &
-                kSuperPageBaseMask,
-            reinterpret_cast<uintptr_t>(
-                PartitionPage::ToPointer(pageInThirdSuperPage)) &
-                kSuperPageBaseMask);
-  EXPECT_NE(reinterpret_cast<uintptr_t>(
-                PartitionPage::ToPointer(secondSuperPagePages[0])) &
-                kSuperPageBaseMask,
-            reinterpret_cast<uintptr_t>(
-                PartitionPage::ToPointer(pageInThirdSuperPage)) &
-                kSuperPageBaseMask);
-
-  FreeFullPage(pageInThirdSuperPage);
-  for (i = 0; i < numPartitionPagesNeeded; ++i) {
-    FreeFullPage(firstSuperPagePages[i]);
-    FreeFullPage(secondSuperPagePages[i]);
-  }
-}
-
-// Tests that pages in the free page cache do get freed as appropriate.
-TEST_F(PartitionAllocTest, FreeCache) {
-  EXPECT_EQ(0U, allocator.root()->total_size_of_committed_pages);
-
-  size_t big_size = allocator.root()->max_allocation - kExtraAllocSize;
-  size_t bucket_index = (big_size + kExtraAllocSize) >> kBucketShift;
-  PartitionBucket* bucket = &allocator.root()->buckets()[bucket_index];
-
-  void* ptr = allocator.root()->Alloc(big_size, type_name);
-  EXPECT_TRUE(ptr);
-  PartitionPage* page =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  EXPECT_EQ(nullptr, bucket->empty_pages_head);
-  EXPECT_EQ(1, page->num_allocated_slots);
-  EXPECT_EQ(kPartitionPageSize,
-            allocator.root()->total_size_of_committed_pages);
-  PartitionFree(ptr);
-  EXPECT_EQ(0, page->num_allocated_slots);
-  EXPECT_NE(-1, page->empty_cache_index);
-  EXPECT_TRUE(page->freelist_head);
-
-  CycleFreeCache(kTestAllocSize);
-
-  // Flushing the cache should have really freed the unused page.
-  EXPECT_FALSE(page->freelist_head);
-  EXPECT_EQ(-1, page->empty_cache_index);
-  EXPECT_EQ(0, page->num_allocated_slots);
-  PartitionBucket* cycle_free_cache_bucket =
-      &allocator.root()->buckets()[kTestBucketIndex];
-  EXPECT_EQ(
-      cycle_free_cache_bucket->num_system_pages_per_slot_span * kSystemPageSize,
-      allocator.root()->total_size_of_committed_pages);
-
-  // Check that an allocation works ok whilst in this state (a free'd page
-  // as the active pages head).
-  ptr = allocator.root()->Alloc(big_size, type_name);
-  EXPECT_FALSE(bucket->empty_pages_head);
-  PartitionFree(ptr);
-
-  // Also check that a page that is bouncing immediately between empty and
-  // used does not get freed.
-  for (size_t i = 0; i < kMaxFreeableSpans * 2; ++i) {
-    ptr = allocator.root()->Alloc(big_size, type_name);
-    EXPECT_TRUE(page->freelist_head);
-    PartitionFree(ptr);
-    EXPECT_TRUE(page->freelist_head);
-  }
-  EXPECT_EQ(kPartitionPageSize,
-            allocator.root()->total_size_of_committed_pages);
-}
-
-// Tests for a bug we had with losing references to free pages.
-TEST_F(PartitionAllocTest, LostFreePagesBug) {
-  size_t size = kPartitionPageSize - kExtraAllocSize;
-
-  void* ptr = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_TRUE(ptr);
-  void* ptr2 = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_TRUE(ptr2);
-
-  PartitionPage* page =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr));
-  PartitionPage* page2 =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr2));
-  PartitionBucket* bucket = page->bucket;
-
-  EXPECT_EQ(nullptr, bucket->empty_pages_head);
-  EXPECT_EQ(-1, page->num_allocated_slots);
-  EXPECT_EQ(1, page2->num_allocated_slots);
-
-  generic_allocator.root()->Free(ptr);
-  generic_allocator.root()->Free(ptr2);
-
-  EXPECT_TRUE(bucket->empty_pages_head);
-  EXPECT_TRUE(bucket->empty_pages_head->next_page);
-  EXPECT_EQ(0, page->num_allocated_slots);
-  EXPECT_EQ(0, page2->num_allocated_slots);
-  EXPECT_TRUE(page->freelist_head);
-  EXPECT_TRUE(page2->freelist_head);
-
-  CycleGenericFreeCache(kTestAllocSize);
-
-  EXPECT_FALSE(page->freelist_head);
-  EXPECT_FALSE(page2->freelist_head);
-
-  EXPECT_TRUE(bucket->empty_pages_head);
-  EXPECT_TRUE(bucket->empty_pages_head->next_page);
-  EXPECT_EQ(PartitionPage::get_sentinel_page(), bucket->active_pages_head);
-
-  // At this moment, we have two decommitted pages, on the empty list.
-  ptr = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_TRUE(ptr);
-  generic_allocator.root()->Free(ptr);
-
-  EXPECT_EQ(PartitionPage::get_sentinel_page(), bucket->active_pages_head);
-  EXPECT_TRUE(bucket->empty_pages_head);
-  EXPECT_TRUE(bucket->decommitted_pages_head);
-
-  CycleGenericFreeCache(kTestAllocSize);
-
-  // We're now set up to trigger a historical bug by scanning over the active
-  // pages list. The current code gets into a different state, but we'll keep
-  // the test as being an interesting corner case.
-  ptr = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_TRUE(ptr);
-  generic_allocator.root()->Free(ptr);
-
-  EXPECT_TRUE(bucket->active_pages_head);
-  EXPECT_TRUE(bucket->empty_pages_head);
-  EXPECT_TRUE(bucket->decommitted_pages_head);
-}
-
-// Unit tests that check if an allocation fails in "return null" mode,
-// repeating it doesn't crash, and still returns null. The tests need to
-// stress memory subsystem limits to do so, hence they try to allocate
-// 6 GB of memory, each with a different per-allocation block sizes.
-//
-// On 64-bit systems we need to restrict the address space to force allocation
-// failure, so these tests run only on POSIX systems that provide setrlimit(),
-// and use it to limit address space to 6GB.
-//
-// Disable these tests on Android because, due to the allocation-heavy behavior,
-// they tend to get OOM-killed rather than pass.
-// TODO(https://crbug.com/779645): Fuchsia currently sets OS_POSIX, but does
-// not provide a working setrlimit().
-#if !defined(ARCH_CPU_64_BITS) || \
-    (defined(OS_POSIX) &&         \
-     !(defined(OS_FUCHSIA) || defined(OS_MACOSX) || defined(OS_ANDROID)))
-
-// This is defined as a separate test class because RepeatedReturnNull
-// test exhausts the process memory, and breaks any test in the same
-// class that runs after it.
-class PartitionAllocReturnNullTest : public PartitionAllocTest {};
-
-// Test "return null" for larger, direct-mapped allocations first. As a
-// direct-mapped allocation's pages are unmapped and freed on release, this
-// test is performd first for these "return null" tests in order to leave
-// sufficient unreserved virtual memory around for the later one(s).
-TEST_F(PartitionAllocReturnNullTest, RepeatedReturnNullDirect) {
-  // A direct-mapped allocation size.
-  DoReturnNullTest(32 * 1024 * 1024, false);
-}
-
-// Test "return null" with a 512 kB block size.
-TEST_F(PartitionAllocReturnNullTest, RepeatedReturnNull) {
-  // A single-slot but non-direct-mapped allocation size.
-  DoReturnNullTest(512 * 1024, false);
-}
-
-// Repeating the above tests using Realloc instead of Alloc.
-class PartitionReallocReturnNullTest : public PartitionAllocTest {};
-
-TEST_F(PartitionReallocReturnNullTest, RepeatedReturnNullDirect) {
-  DoReturnNullTest(32 * 1024 * 1024, true);
-}
-
-TEST_F(PartitionReallocReturnNullTest, RepeatedReturnNull) {
-  DoReturnNullTest(512 * 1024, true);
-}
-
-#endif  // !defined(ARCH_CPU_64_BITS) || (defined(OS_POSIX) &&
-        // !(defined(OS_FUCHSIA) || defined(OS_MACOSX) || defined(OS_ANDROID)))
-
-// Death tests misbehave on Android, http://crbug.com/643760.
-#if defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
-
-// Make sure that malloc(-1) dies.
-// In the past, we had an integer overflow that would alias malloc(-1) to
-// malloc(0), which is not good.
-TEST_F(PartitionAllocDeathTest, LargeAllocs) {
-  // Largest alloc.
-  EXPECT_DEATH(
-      generic_allocator.root()->Alloc(static_cast<size_t>(-1), type_name), "");
-  // And the smallest allocation we expect to die.
-  EXPECT_DEATH(
-      generic_allocator.root()->Alloc(kGenericMaxDirectMapped + 1, type_name),
-      "");
-}
-
-// Check that our immediate double-free detection works.
-TEST_F(PartitionAllocDeathTest, ImmediateDoubleFree) {
-  void* ptr = generic_allocator.root()->Alloc(kTestAllocSize, type_name);
-  EXPECT_TRUE(ptr);
-  generic_allocator.root()->Free(ptr);
-
-  EXPECT_DEATH(generic_allocator.root()->Free(ptr), "");
-}
-
-// Check that our refcount-based double-free detection works.
-TEST_F(PartitionAllocDeathTest, RefcountDoubleFree) {
-  void* ptr = generic_allocator.root()->Alloc(kTestAllocSize, type_name);
-  EXPECT_TRUE(ptr);
-  void* ptr2 = generic_allocator.root()->Alloc(kTestAllocSize, type_name);
-  EXPECT_TRUE(ptr2);
-  generic_allocator.root()->Free(ptr);
-  generic_allocator.root()->Free(ptr2);
-  // This is not an immediate double-free so our immediate detection won't
-  // fire. However, it does take the "refcount" of the partition page to -1,
-  // which is illegal and should be trapped.
-  EXPECT_DEATH(generic_allocator.root()->Free(ptr), "");
-}
-
-// Check that guard pages are present where expected.
-TEST_F(PartitionAllocDeathTest, GuardPages) {
-// PartitionAlloc adds kPartitionPageSize to the requested size
-// (for metadata), and then rounds that size to kPageAllocationGranularity.
-// To be able to reliably write one past a direct allocation, choose a size
-// that's
-// a) larger than kGenericMaxBucketed (to make the allocation direct)
-// b) aligned at kPageAllocationGranularity boundaries after
-//    kPartitionPageSize has been added to it.
-// (On 32-bit, PartitionAlloc adds another kSystemPageSize to the
-// allocation size before rounding, but there it marks the memory right
-// after size as inaccessible, so it's fine to write 1 past the size we
-// hand to PartitionAlloc and we don't need to worry about allocation
-// granularities.)
-#define ALIGN(N, A) (((N) + (A)-1) / (A) * (A))
-  const int kSize = ALIGN(kGenericMaxBucketed + 1 + kPartitionPageSize,
-                          kPageAllocationGranularity) -
-                    kPartitionPageSize;
-#undef ALIGN
-  static_assert(kSize > kGenericMaxBucketed,
-                "allocation not large enough for direct allocation");
-  size_t size = kSize - kExtraAllocSize;
-  void* ptr = generic_allocator.root()->Alloc(size, type_name);
-
-  EXPECT_TRUE(ptr);
-  char* charPtr = reinterpret_cast<char*>(ptr) - kPointerOffset;
-
-  EXPECT_DEATH(*(charPtr - 1) = 'A', "");
-  EXPECT_DEATH(*(charPtr + size + kExtraAllocSize) = 'A', "");
-
-  generic_allocator.root()->Free(ptr);
-}
-
-// Check that a bad free() is caught where the free() refers to an unused
-// partition page of a large allocation.
-TEST_F(PartitionAllocDeathTest, FreeWrongPartitionPage) {
-  // This large size will result in a direct mapped allocation with guard
-  // pages at either end.
-  void* ptr =
-      generic_allocator.root()->Alloc(kPartitionPageSize * 2, type_name);
-  EXPECT_TRUE(ptr);
-  char* badPtr = reinterpret_cast<char*>(ptr) + kPartitionPageSize;
-
-  EXPECT_DEATH(generic_allocator.root()->Free(badPtr), "");
-
-  generic_allocator.root()->Free(ptr);
-}
-
-#endif  // !defined(OS_ANDROID) && !defined(OS_IOS)
-
-// Tests that |PartitionDumpStatsGeneric| and |PartitionDumpStats| run without
-// crashing and return non-zero values when memory is allocated.
-TEST_F(PartitionAllocTest, DumpMemoryStats) {
-  {
-    void* ptr = allocator.root()->Alloc(kTestAllocSize, type_name);
-    MockPartitionStatsDumper mockStatsDumper;
-    allocator.root()->DumpStats("mock_allocator", false /* detailed dump */,
-                                &mockStatsDumper);
-    EXPECT_TRUE(mockStatsDumper.IsMemoryAllocationRecorded());
-    PartitionFree(ptr);
-  }
-
-  // This series of tests checks the active -> empty -> decommitted states.
-  {
-    {
-      void* ptr =
-          generic_allocator.root()->Alloc(2048 - kExtraAllocSize, type_name);
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats = dumper.GetBucketStats(2048);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_EQ(2048u, stats->bucket_slot_size);
-      EXPECT_EQ(2048u, stats->active_bytes);
-      EXPECT_EQ(kSystemPageSize, stats->resident_bytes);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(0u, stats->discardable_bytes);
-      EXPECT_EQ(0u, stats->num_full_pages);
-      EXPECT_EQ(1u, stats->num_active_pages);
-      EXPECT_EQ(0u, stats->num_empty_pages);
-      EXPECT_EQ(0u, stats->num_decommitted_pages);
-      generic_allocator.root()->Free(ptr);
-    }
-
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_FALSE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats = dumper.GetBucketStats(2048);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_EQ(2048u, stats->bucket_slot_size);
-      EXPECT_EQ(0u, stats->active_bytes);
-      EXPECT_EQ(kSystemPageSize, stats->resident_bytes);
-      EXPECT_EQ(kSystemPageSize, stats->decommittable_bytes);
-      EXPECT_EQ(0u, stats->discardable_bytes);
-      EXPECT_EQ(0u, stats->num_full_pages);
-      EXPECT_EQ(0u, stats->num_active_pages);
-      EXPECT_EQ(1u, stats->num_empty_pages);
-      EXPECT_EQ(0u, stats->num_decommitted_pages);
-    }
-
-    // TODO(crbug.com/722911): Commenting this out causes this test to fail when
-    // run singly (--gtest_filter=PartitionAllocTest.DumpMemoryStats), but not
-    // when run with the others (--gtest_filter=PartitionAllocTest.*).
-    CycleGenericFreeCache(kTestAllocSize);
-
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_FALSE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats = dumper.GetBucketStats(2048);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_EQ(2048u, stats->bucket_slot_size);
-      EXPECT_EQ(0u, stats->active_bytes);
-      EXPECT_EQ(0u, stats->resident_bytes);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(0u, stats->discardable_bytes);
-      EXPECT_EQ(0u, stats->num_full_pages);
-      EXPECT_EQ(0u, stats->num_active_pages);
-      EXPECT_EQ(0u, stats->num_empty_pages);
-      EXPECT_EQ(1u, stats->num_decommitted_pages);
-    }
-  }
-
-  // This test checks for correct empty page list accounting.
-  {
-    size_t size = kPartitionPageSize - kExtraAllocSize;
-    void* ptr1 = generic_allocator.root()->Alloc(size, type_name);
-    void* ptr2 = generic_allocator.root()->Alloc(size, type_name);
-    generic_allocator.root()->Free(ptr1);
-    generic_allocator.root()->Free(ptr2);
-
-    CycleGenericFreeCache(kTestAllocSize);
-
-    ptr1 = generic_allocator.root()->Alloc(size, type_name);
-
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(kPartitionPageSize);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_EQ(kPartitionPageSize, stats->bucket_slot_size);
-      EXPECT_EQ(kPartitionPageSize, stats->active_bytes);
-      EXPECT_EQ(kPartitionPageSize, stats->resident_bytes);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(0u, stats->discardable_bytes);
-      EXPECT_EQ(1u, stats->num_full_pages);
-      EXPECT_EQ(0u, stats->num_active_pages);
-      EXPECT_EQ(0u, stats->num_empty_pages);
-      EXPECT_EQ(1u, stats->num_decommitted_pages);
-    }
-    generic_allocator.root()->Free(ptr1);
-  }
-
-  // This test checks for correct direct mapped accounting.
-  {
-    size_t size_smaller = kGenericMaxBucketed + 1;
-    size_t size_bigger = (kGenericMaxBucketed * 2) + 1;
-    size_t real_size_smaller =
-        (size_smaller + kSystemPageOffsetMask) & kSystemPageBaseMask;
-    size_t real_size_bigger =
-        (size_bigger + kSystemPageOffsetMask) & kSystemPageBaseMask;
-    void* ptr = generic_allocator.root()->Alloc(size_smaller, type_name);
-    void* ptr2 = generic_allocator.root()->Alloc(size_bigger, type_name);
-
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(real_size_smaller);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_TRUE(stats->is_direct_map);
-      EXPECT_EQ(real_size_smaller, stats->bucket_slot_size);
-      EXPECT_EQ(real_size_smaller, stats->active_bytes);
-      EXPECT_EQ(real_size_smaller, stats->resident_bytes);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(0u, stats->discardable_bytes);
-      EXPECT_EQ(1u, stats->num_full_pages);
-      EXPECT_EQ(0u, stats->num_active_pages);
-      EXPECT_EQ(0u, stats->num_empty_pages);
-      EXPECT_EQ(0u, stats->num_decommitted_pages);
-
-      stats = dumper.GetBucketStats(real_size_bigger);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_TRUE(stats->is_direct_map);
-      EXPECT_EQ(real_size_bigger, stats->bucket_slot_size);
-      EXPECT_EQ(real_size_bigger, stats->active_bytes);
-      EXPECT_EQ(real_size_bigger, stats->resident_bytes);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(0u, stats->discardable_bytes);
-      EXPECT_EQ(1u, stats->num_full_pages);
-      EXPECT_EQ(0u, stats->num_active_pages);
-      EXPECT_EQ(0u, stats->num_empty_pages);
-      EXPECT_EQ(0u, stats->num_decommitted_pages);
-    }
-
-    generic_allocator.root()->Free(ptr2);
-    generic_allocator.root()->Free(ptr);
-
-    // Whilst we're here, allocate again and free with different ordering to
-    // give a workout to our linked list code.
-    ptr = generic_allocator.root()->Alloc(size_smaller, type_name);
-    ptr2 = generic_allocator.root()->Alloc(size_bigger, type_name);
-    generic_allocator.root()->Free(ptr);
-    generic_allocator.root()->Free(ptr2);
-  }
-
-  // This test checks large-but-not-quite-direct allocations.
-  {
-    constexpr size_t requested_size = 16 * kSystemPageSize;
-    void* ptr = generic_allocator.root()->Alloc(requested_size + 1, type_name);
-
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      size_t slot_size =
-          requested_size + (requested_size / kGenericNumBucketsPerOrder);
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(slot_size);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_FALSE(stats->is_direct_map);
-      EXPECT_EQ(slot_size, stats->bucket_slot_size);
-      EXPECT_EQ(requested_size + 1 + kExtraAllocSize, stats->active_bytes);
-      EXPECT_EQ(slot_size, stats->resident_bytes);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(kSystemPageSize, stats->discardable_bytes);
-      EXPECT_EQ(1u, stats->num_full_pages);
-      EXPECT_EQ(0u, stats->num_active_pages);
-      EXPECT_EQ(0u, stats->num_empty_pages);
-      EXPECT_EQ(0u, stats->num_decommitted_pages);
-    }
-
-    generic_allocator.root()->Free(ptr);
-
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_FALSE(dumper.IsMemoryAllocationRecorded());
-
-      size_t slot_size =
-          requested_size + (requested_size / kGenericNumBucketsPerOrder);
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(slot_size);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_FALSE(stats->is_direct_map);
-      EXPECT_EQ(slot_size, stats->bucket_slot_size);
-      EXPECT_EQ(0u, stats->active_bytes);
-      EXPECT_EQ(slot_size, stats->resident_bytes);
-      EXPECT_EQ(slot_size, stats->decommittable_bytes);
-      EXPECT_EQ(0u, stats->num_full_pages);
-      EXPECT_EQ(0u, stats->num_active_pages);
-      EXPECT_EQ(1u, stats->num_empty_pages);
-      EXPECT_EQ(0u, stats->num_decommitted_pages);
-    }
-
-    void* ptr2 = generic_allocator.root()->Alloc(
-        requested_size + kSystemPageSize + 1, type_name);
-    EXPECT_EQ(ptr, ptr2);
-
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      size_t slot_size =
-          requested_size + (requested_size / kGenericNumBucketsPerOrder);
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(slot_size);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_FALSE(stats->is_direct_map);
-      EXPECT_EQ(slot_size, stats->bucket_slot_size);
-      EXPECT_EQ(requested_size + kSystemPageSize + 1 + kExtraAllocSize,
-                stats->active_bytes);
-      EXPECT_EQ(slot_size, stats->resident_bytes);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(0u, stats->discardable_bytes);
-      EXPECT_EQ(1u, stats->num_full_pages);
-      EXPECT_EQ(0u, stats->num_active_pages);
-      EXPECT_EQ(0u, stats->num_empty_pages);
-      EXPECT_EQ(0u, stats->num_decommitted_pages);
-    }
-
-    generic_allocator.root()->Free(ptr2);
-  }
-}
-
-// Tests the API to purge freeable memory.
-TEST_F(PartitionAllocTest, Purge) {
-  char* ptr = reinterpret_cast<char*>(
-      generic_allocator.root()->Alloc(2048 - kExtraAllocSize, type_name));
-  generic_allocator.root()->Free(ptr);
-  {
-    MockPartitionStatsDumper dumper;
-    generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                        false /* detailed dump */, &dumper);
-    EXPECT_FALSE(dumper.IsMemoryAllocationRecorded());
-
-    const PartitionBucketMemoryStats* stats = dumper.GetBucketStats(2048);
-    EXPECT_TRUE(stats);
-    EXPECT_TRUE(stats->is_valid);
-    EXPECT_EQ(kSystemPageSize, stats->decommittable_bytes);
-    EXPECT_EQ(kSystemPageSize, stats->resident_bytes);
-  }
-  generic_allocator.root()->PurgeMemory(PartitionPurgeDecommitEmptyPages);
-  {
-    MockPartitionStatsDumper dumper;
-    generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                        false /* detailed dump */, &dumper);
-    EXPECT_FALSE(dumper.IsMemoryAllocationRecorded());
-
-    const PartitionBucketMemoryStats* stats = dumper.GetBucketStats(2048);
-    EXPECT_TRUE(stats);
-    EXPECT_TRUE(stats->is_valid);
-    EXPECT_EQ(0u, stats->decommittable_bytes);
-    EXPECT_EQ(0u, stats->resident_bytes);
-  }
-  // Calling purge again here is a good way of testing we didn't mess up the
-  // state of the free cache ring.
-  generic_allocator.root()->PurgeMemory(PartitionPurgeDecommitEmptyPages);
-
-  char* bigPtr = reinterpret_cast<char*>(
-      generic_allocator.root()->Alloc(256 * 1024, type_name));
-  generic_allocator.root()->Free(bigPtr);
-  generic_allocator.root()->PurgeMemory(PartitionPurgeDecommitEmptyPages);
-
-  CHECK_PAGE_IN_CORE(ptr - kPointerOffset, false);
-  CHECK_PAGE_IN_CORE(bigPtr - kPointerOffset, false);
-}
-
-// Tests that we prefer to allocate into a non-empty partition page over an
-// empty one. This is an important aspect of minimizing memory usage for some
-// allocation sizes, particularly larger ones.
-TEST_F(PartitionAllocTest, PreferActiveOverEmpty) {
-  size_t size = (kSystemPageSize * 2) - kExtraAllocSize;
-  // Allocate 3 full slot spans worth of 8192-byte allocations.
-  // Each slot span for this size is 16384 bytes, or 1 partition page and 2
-  // slots.
-  void* ptr1 = generic_allocator.root()->Alloc(size, type_name);
-  void* ptr2 = generic_allocator.root()->Alloc(size, type_name);
-  void* ptr3 = generic_allocator.root()->Alloc(size, type_name);
-  void* ptr4 = generic_allocator.root()->Alloc(size, type_name);
-  void* ptr5 = generic_allocator.root()->Alloc(size, type_name);
-  void* ptr6 = generic_allocator.root()->Alloc(size, type_name);
-
-  PartitionPage* page1 =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr1));
-  PartitionPage* page2 =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr3));
-  PartitionPage* page3 =
-      PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr6));
-  EXPECT_NE(page1, page2);
-  EXPECT_NE(page2, page3);
-  PartitionBucket* bucket = page1->bucket;
-  EXPECT_EQ(page3, bucket->active_pages_head);
-
-  // Free up the 2nd slot in each slot span.
-  // This leaves the active list containing 3 pages, each with 1 used and 1
-  // free slot. The active page will be the one containing ptr1.
-  generic_allocator.root()->Free(ptr6);
-  generic_allocator.root()->Free(ptr4);
-  generic_allocator.root()->Free(ptr2);
-  EXPECT_EQ(page1, bucket->active_pages_head);
-
-  // Empty the middle page in the active list.
-  generic_allocator.root()->Free(ptr3);
-  EXPECT_EQ(page1, bucket->active_pages_head);
-
-  // Empty the the first page in the active list -- also the current page.
-  generic_allocator.root()->Free(ptr1);
-
-  // A good choice here is to re-fill the third page since the first two are
-  // empty. We used to fail that.
-  void* ptr7 = generic_allocator.root()->Alloc(size, type_name);
-  EXPECT_EQ(ptr6, ptr7);
-  EXPECT_EQ(page3, bucket->active_pages_head);
-
-  generic_allocator.root()->Free(ptr5);
-  generic_allocator.root()->Free(ptr7);
-}
-
-// Tests the API to purge discardable memory.
-TEST_F(PartitionAllocTest, PurgeDiscardable) {
-  // Free the second of two 4096 byte allocations and then purge.
-  {
-    void* ptr1 = generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name);
-    char* ptr2 = reinterpret_cast<char*>(generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name));
-    generic_allocator.root()->Free(ptr2);
-    PartitionPage* page =
-        PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr1));
-    EXPECT_EQ(2u, page->num_unprovisioned_slots);
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(kSystemPageSize);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(kSystemPageSize, stats->discardable_bytes);
-      EXPECT_EQ(kSystemPageSize, stats->active_bytes);
-      EXPECT_EQ(2 * kSystemPageSize, stats->resident_bytes);
-    }
-    CHECK_PAGE_IN_CORE(ptr2 - kPointerOffset, true);
-    generic_allocator.root()->PurgeMemory(
-        PartitionPurgeDiscardUnusedSystemPages);
-    CHECK_PAGE_IN_CORE(ptr2 - kPointerOffset, false);
-    EXPECT_EQ(3u, page->num_unprovisioned_slots);
-
-    generic_allocator.root()->Free(ptr1);
-  }
-  // Free the first of two 4096 byte allocations and then purge.
-  {
-    char* ptr1 = reinterpret_cast<char*>(generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name));
-    void* ptr2 = generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name);
-    generic_allocator.root()->Free(ptr1);
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(kSystemPageSize);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-#if defined(OS_WIN)
-      EXPECT_EQ(0u, stats->discardable_bytes);
-#else
-      EXPECT_EQ(kSystemPageSize, stats->discardable_bytes);
-#endif
-      EXPECT_EQ(kSystemPageSize, stats->active_bytes);
-      EXPECT_EQ(2 * kSystemPageSize, stats->resident_bytes);
-    }
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset, true);
-    generic_allocator.root()->PurgeMemory(
-        PartitionPurgeDiscardUnusedSystemPages);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset, false);
-
-    generic_allocator.root()->Free(ptr2);
-  }
-  {
-    constexpr size_t requested_size = 2.25 * kSystemPageSize;
-    char* ptr1 = reinterpret_cast<char*>(generic_allocator.root()->Alloc(
-        requested_size - kExtraAllocSize, type_name));
-    void* ptr2 = generic_allocator.root()->Alloc(
-        requested_size - kExtraAllocSize, type_name);
-    void* ptr3 = generic_allocator.root()->Alloc(
-        requested_size - kExtraAllocSize, type_name);
-    void* ptr4 = generic_allocator.root()->Alloc(
-        requested_size - kExtraAllocSize, type_name);
-    memset(ptr1, 'A', requested_size - kExtraAllocSize);
-    memset(ptr2, 'A', requested_size - kExtraAllocSize);
-    generic_allocator.root()->Free(ptr2);
-    generic_allocator.root()->Free(ptr1);
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(requested_size);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(2 * kSystemPageSize, stats->discardable_bytes);
-      EXPECT_EQ(requested_size * 2, stats->active_bytes);
-      EXPECT_EQ(9 * kSystemPageSize, stats->resident_bytes);
-    }
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset, true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + kSystemPageSize, true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 2), true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 3), true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 4), true);
-    generic_allocator.root()->PurgeMemory(
-        PartitionPurgeDiscardUnusedSystemPages);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset, true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + kSystemPageSize, false);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 2), true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 3), false);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 4), true);
-
-    generic_allocator.root()->Free(ptr3);
-    generic_allocator.root()->Free(ptr4);
-  }
-
-// When kSystemPageSize = 16384 (as on _MIPS_ARCH_LOONGSON), 64 *
-// kSystemPageSize (see the #else branch below) caused this test to OOM.
-// Therefore, for systems with 16 KiB pages, use 32 * kSystemPageSize.
-//
-// TODO(palmer): Refactor this to branch on page size instead of architecture,
-// for clarity of purpose and for applicability to more architectures.
-#if defined(_MIPS_ARCH_LOONGSON)
-  {
-    char* ptr1 = reinterpret_cast<char*>(PartitionAllocGeneric(
-        generic_allocator.root(), (32 * kSystemPageSize) - kExtraAllocSize,
-        type_name));
-    memset(ptr1, 'A', (32 * kSystemPageSize) - kExtraAllocSize);
-    PartitionFreeGeneric(generic_allocator.root(), ptr1);
-    ptr1 = reinterpret_cast<char*>(PartitionAllocGeneric(
-        generic_allocator.root(), (31 * kSystemPageSize) - kExtraAllocSize,
-        type_name));
-    {
-      MockPartitionStatsDumper dumper;
-      PartitionDumpStatsGeneric(generic_allocator.root(),
-                                "mock_generic_allocator",
-                                false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(32 * kSystemPageSize);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(kSystemPageSize, stats->discardable_bytes);
-      EXPECT_EQ(31 * kSystemPageSize, stats->active_bytes);
-      EXPECT_EQ(32 * kSystemPageSize, stats->resident_bytes);
-    }
-    CheckPageInCore(ptr1 - kPointerOffset + (kSystemPageSize * 30), true);
-    CheckPageInCore(ptr1 - kPointerOffset + (kSystemPageSize * 31), true);
-    PartitionPurgeMemoryGeneric(generic_allocator.root(),
-                                PartitionPurgeDiscardUnusedSystemPages);
-    CheckPageInCore(ptr1 - kPointerOffset + (kSystemPageSize * 30), true);
-    CheckPageInCore(ptr1 - kPointerOffset + (kSystemPageSize * 31), false);
-
-    PartitionFreeGeneric(generic_allocator.root(), ptr1);
-  }
-#else
-  {
-    char* ptr1 = reinterpret_cast<char*>(generic_allocator.root()->Alloc(
-        (64 * kSystemPageSize) - kExtraAllocSize, type_name));
-    memset(ptr1, 'A', (64 * kSystemPageSize) - kExtraAllocSize);
-    generic_allocator.root()->Free(ptr1);
-    ptr1 = reinterpret_cast<char*>(generic_allocator.root()->Alloc(
-        (61 * kSystemPageSize) - kExtraAllocSize, type_name));
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(64 * kSystemPageSize);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(3 * kSystemPageSize, stats->discardable_bytes);
-      EXPECT_EQ(61 * kSystemPageSize, stats->active_bytes);
-      EXPECT_EQ(64 * kSystemPageSize, stats->resident_bytes);
-    }
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 60), true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 61), true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 62), true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 63), true);
-    generic_allocator.root()->PurgeMemory(
-        PartitionPurgeDiscardUnusedSystemPages);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 60), true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 61), false);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 62), false);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 63), false);
-
-    generic_allocator.root()->Free(ptr1);
-  }
-#endif
-  // This sub-test tests truncation of the provisioned slots in a trickier
-  // case where the freelist is rewritten.
-  generic_allocator.root()->PurgeMemory(PartitionPurgeDecommitEmptyPages);
-  {
-    char* ptr1 = reinterpret_cast<char*>(generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name));
-    void* ptr2 = generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name);
-    void* ptr3 = generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name);
-    void* ptr4 = generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name);
-    ptr1[0] = 'A';
-    ptr1[kSystemPageSize] = 'A';
-    ptr1[kSystemPageSize * 2] = 'A';
-    ptr1[kSystemPageSize * 3] = 'A';
-    PartitionPage* page =
-        PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr1));
-    generic_allocator.root()->Free(ptr2);
-    generic_allocator.root()->Free(ptr4);
-    generic_allocator.root()->Free(ptr1);
-    EXPECT_EQ(0u, page->num_unprovisioned_slots);
-
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(kSystemPageSize);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-#if defined(OS_WIN)
-      EXPECT_EQ(kSystemPageSize, stats->discardable_bytes);
-#else
-      EXPECT_EQ(2 * kSystemPageSize, stats->discardable_bytes);
-#endif
-      EXPECT_EQ(kSystemPageSize, stats->active_bytes);
-      EXPECT_EQ(4 * kSystemPageSize, stats->resident_bytes);
-    }
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset, true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + kSystemPageSize, true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 2), true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 3), true);
-    generic_allocator.root()->PurgeMemory(
-        PartitionPurgeDiscardUnusedSystemPages);
-    EXPECT_EQ(1u, page->num_unprovisioned_slots);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset, true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + kSystemPageSize, false);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 2), true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 3), false);
-
-    // Let's check we didn't brick the freelist.
-    void* ptr1b = generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name);
-    EXPECT_EQ(ptr1, ptr1b);
-    void* ptr2b = generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name);
-    EXPECT_EQ(ptr2, ptr2b);
-    EXPECT_FALSE(page->freelist_head);
-
-    generic_allocator.root()->Free(ptr1);
-    generic_allocator.root()->Free(ptr2);
-    generic_allocator.root()->Free(ptr3);
-  }
-  // This sub-test is similar, but tests a double-truncation.
-  generic_allocator.root()->PurgeMemory(PartitionPurgeDecommitEmptyPages);
-  {
-    char* ptr1 = reinterpret_cast<char*>(generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name));
-    void* ptr2 = generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name);
-    void* ptr3 = generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name);
-    void* ptr4 = generic_allocator.root()->Alloc(
-        kSystemPageSize - kExtraAllocSize, type_name);
-    ptr1[0] = 'A';
-    ptr1[kSystemPageSize] = 'A';
-    ptr1[kSystemPageSize * 2] = 'A';
-    ptr1[kSystemPageSize * 3] = 'A';
-    PartitionPage* page =
-        PartitionPage::FromPointer(PartitionCookieFreePointerAdjust(ptr1));
-    generic_allocator.root()->Free(ptr4);
-    generic_allocator.root()->Free(ptr3);
-    EXPECT_EQ(0u, page->num_unprovisioned_slots);
-
-    {
-      MockPartitionStatsDumper dumper;
-      generic_allocator.root()->DumpStats("mock_generic_allocator",
-                                          false /* detailed dump */, &dumper);
-      EXPECT_TRUE(dumper.IsMemoryAllocationRecorded());
-
-      const PartitionBucketMemoryStats* stats =
-          dumper.GetBucketStats(kSystemPageSize);
-      EXPECT_TRUE(stats);
-      EXPECT_TRUE(stats->is_valid);
-      EXPECT_EQ(0u, stats->decommittable_bytes);
-      EXPECT_EQ(2 * kSystemPageSize, stats->discardable_bytes);
-      EXPECT_EQ(2 * kSystemPageSize, stats->active_bytes);
-      EXPECT_EQ(4 * kSystemPageSize, stats->resident_bytes);
-    }
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset, true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + kSystemPageSize, true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 2), true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 3), true);
-    generic_allocator.root()->PurgeMemory(
-        PartitionPurgeDiscardUnusedSystemPages);
-    EXPECT_EQ(2u, page->num_unprovisioned_slots);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset, true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + kSystemPageSize, true);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 2), false);
-    CHECK_PAGE_IN_CORE(ptr1 - kPointerOffset + (kSystemPageSize * 3), false);
-
-    EXPECT_FALSE(page->freelist_head);
-
-    generic_allocator.root()->Free(ptr1);
-    generic_allocator.root()->Free(ptr2);
-  }
-}
-
-TEST_F(PartitionAllocTest, ReallocMovesCookies) {
-  // Resize so as to be sure to hit a "resize in place" case, and ensure that
-  // use of the entire result is compatible with the debug mode's cookies, even
-  // when the bucket size is large enough to span more than one partition page
-  // and we can track the "raw" size. See https://crbug.com/709271
-  static constexpr size_t kSize =
-      base::kMaxSystemPagesPerSlotSpan * base::kSystemPageSize;
-  void* ptr = generic_allocator.root()->Alloc(kSize + 1, type_name);
-  EXPECT_TRUE(ptr);
-
-  memset(ptr, 0xbd, kSize + 1);
-  ptr = generic_allocator.root()->Realloc(ptr, kSize + 2, type_name);
-  EXPECT_TRUE(ptr);
-
-  memset(ptr, 0xbd, kSize + 2);
-  generic_allocator.root()->Free(ptr);
-}
-
-TEST_F(PartitionAllocTest, SmallReallocDoesNotMoveTrailingCookie) {
-  // For crbug.com/781473
-  static constexpr size_t kSize = 264;
-  void* ptr = generic_allocator.root()->Alloc(kSize, type_name);
-  EXPECT_TRUE(ptr);
-
-  ptr = generic_allocator.root()->Realloc(ptr, kSize + 16, type_name);
-  EXPECT_TRUE(ptr);
-
-  generic_allocator.root()->Free(ptr);
-}
-
-}  // namespace internal
-}  // namespace base
-
-#endif  // !defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
diff --git a/base/allocator/partition_allocator/spin_lock_unittest.cc b/base/allocator/partition_allocator/spin_lock_unittest.cc
deleted file mode 100644
index 6a1fd6b..0000000
--- a/base/allocator/partition_allocator/spin_lock_unittest.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/allocator/partition_allocator/spin_lock.h"
-
-#include <memory>
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/threading/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-static const size_t kBufferSize = 16;
-
-static subtle::SpinLock g_lock;
-
-static void FillBuffer(volatile char* buffer, char fill_pattern) {
-  for (size_t i = 0; i < kBufferSize; ++i)
-    buffer[i] = fill_pattern;
-}
-
-static void ChangeAndCheckBuffer(volatile char* buffer) {
-  FillBuffer(buffer, '\0');
-  int total = 0;
-  for (size_t i = 0; i < kBufferSize; ++i)
-    total += buffer[i];
-
-  EXPECT_EQ(0, total);
-
-  // This will mess with the other thread's calculation if we accidentally get
-  // concurrency.
-  FillBuffer(buffer, '!');
-}
-
-static void ThreadMain(volatile char* buffer) {
-  for (int i = 0; i < 500000; ++i) {
-    subtle::SpinLock::Guard guard(g_lock);
-    ChangeAndCheckBuffer(buffer);
-  }
-}
-
-TEST(SpinLockTest, Torture) {
-  char shared_buffer[kBufferSize];
-
-  Thread thread1("thread1");
-  Thread thread2("thread2");
-
-  thread1.StartAndWaitForTesting();
-  thread2.StartAndWaitForTesting();
-
-  thread1.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(&ThreadMain, Unretained(static_cast<char*>(shared_buffer))));
-  thread2.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(&ThreadMain, Unretained(static_cast<char*>(shared_buffer))));
-}
-
-}  // namespace base
diff --git a/base/allocator/tcmalloc_unittest.cc b/base/allocator/tcmalloc_unittest.cc
deleted file mode 100644
index 4b5b664..0000000
--- a/base/allocator/tcmalloc_unittest.cc
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdio.h>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/process/process_metrics.h"
-#include "base/sys_info.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(USE_TCMALLOC)
-namespace {
-
-using std::min;
-
-#ifdef NDEBUG
-// We wrap malloc and free in noinline functions to ensure that we test the real
-// implementation of the allocator. Otherwise, the compiler may specifically
-// recognize the calls to malloc and free in our tests and optimize them away.
-NOINLINE void* TCMallocDoMallocForTest(size_t size) {
-  return malloc(size);
-}
-
-NOINLINE void TCMallocDoFreeForTest(void* ptr) {
-  free(ptr);
-}
-#endif
-
-// Fill a buffer of the specified size with a predetermined pattern
-static void Fill(unsigned char* buffer, int n) {
-  for (int i = 0; i < n; i++) {
-    buffer[i] = (i & 0xff);
-  }
-}
-
-// Check that the specified buffer has the predetermined pattern
-// generated by Fill()
-static bool Valid(unsigned char* buffer, int n) {
-  for (int i = 0; i < n; i++) {
-    if (buffer[i] != (i & 0xff)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-// Return the next interesting size/delta to check.  Returns -1 if no more.
-static int NextSize(int size) {
-  if (size < 100)
-    return size + 1;
-
-  if (size < 100000) {
-    // Find next power of two
-    int power = 1;
-    while (power < size)
-      power <<= 1;
-
-    // Yield (power-1, power, power+1)
-    if (size < power - 1)
-      return power - 1;
-
-    if (size == power - 1)
-      return power;
-
-    CHECK_EQ(size, power);
-    return power + 1;
-  } else {
-    return -1;
-  }
-}
-
-static void TestCalloc(size_t n, size_t s, bool ok) {
-  char* p = reinterpret_cast<char*>(calloc(n, s));
-  if (!ok) {
-    EXPECT_EQ(nullptr, p) << "calloc(n, s) should not succeed";
-  } else {
-    EXPECT_NE(reinterpret_cast<void*>(NULL), p)
-        << "calloc(n, s) should succeed";
-    for (size_t i = 0; i < n * s; i++) {
-      EXPECT_EQ('\0', p[i]);
-    }
-    free(p);
-  }
-}
-
-bool IsLowMemoryDevice() {
-  return base::SysInfo::AmountOfPhysicalMemory() <= 256LL * 1024 * 1024;
-}
-
-}  // namespace
-
-TEST(TCMallocTest, Malloc) {
-  // Try allocating data with a bunch of alignments and sizes
-  for (int size = 1; size < 1048576; size *= 2) {
-    unsigned char* ptr = reinterpret_cast<unsigned char*>(malloc(size));
-    // Should be 2 byte aligned
-    EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(ptr) & 1);
-    Fill(ptr, size);
-    EXPECT_TRUE(Valid(ptr, size));
-    free(ptr);
-  }
-}
-
-TEST(TCMallocTest, Calloc) {
-  TestCalloc(0, 0, true);
-  TestCalloc(0, 1, true);
-  TestCalloc(1, 1, true);
-  TestCalloc(1 << 10, 0, true);
-  TestCalloc(1 << 20, 0, true);
-  TestCalloc(0, 1 << 10, true);
-  TestCalloc(0, 1 << 20, true);
-  TestCalloc(1 << 20, 2, true);
-  TestCalloc(2, 1 << 20, true);
-  TestCalloc(1000, 1000, true);
-}
-
-#ifdef NDEBUG
-// This makes sure that reallocing a small number of bytes in either
-// direction doesn't cause us to allocate new memory. Tcmalloc in debug mode
-// does not follow this.
-TEST(TCMallocTest, ReallocSmallDelta) {
-  int start_sizes[] = {100, 1000, 10000, 100000};
-  int deltas[] = {1, -2, 4, -8, 16, -32, 64, -128};
-
-  for (unsigned s = 0; s < sizeof(start_sizes) / sizeof(*start_sizes); ++s) {
-    void* p = malloc(start_sizes[s]);
-    ASSERT_TRUE(p);
-    // The larger the start-size, the larger the non-reallocing delta.
-    for (unsigned d = 0; d < s * 2; ++d) {
-      void* new_p = realloc(p, start_sizes[s] + deltas[d]);
-      ASSERT_EQ(p, new_p);  // realloc should not allocate new memory
-    }
-    // Test again, but this time reallocing smaller first.
-    for (unsigned d = 0; d < s * 2; ++d) {
-      void* new_p = realloc(p, start_sizes[s] - deltas[d]);
-      ASSERT_EQ(p, new_p);  // realloc should not allocate new memory
-    }
-    free(p);
-  }
-}
-#endif
-
-TEST(TCMallocTest, Realloc) {
-  for (int src_size = 0; src_size >= 0; src_size = NextSize(src_size)) {
-    for (int dst_size = 0; dst_size >= 0; dst_size = NextSize(dst_size)) {
-      unsigned char* src = reinterpret_cast<unsigned char*>(malloc(src_size));
-      Fill(src, src_size);
-      unsigned char* dst =
-          reinterpret_cast<unsigned char*>(realloc(src, dst_size));
-      EXPECT_TRUE(Valid(dst, min(src_size, dst_size)));
-      Fill(dst, dst_size);
-      EXPECT_TRUE(Valid(dst, dst_size));
-      if (dst != nullptr)
-        free(dst);
-    }
-  }
-
-  // The logic below tries to allocate kNumEntries * 9000 ~= 130 MB of memory.
-  // This would cause the test to crash on low memory devices with no VM
-  // overcommit (e.g., chromecast).
-  if (IsLowMemoryDevice())
-    return;
-
-  // Now make sure realloc works correctly even when we overflow the
-  // packed cache, so some entries are evicted from the cache.
-  // The cache has 2^12 entries, keyed by page number.
-  const int kNumEntries = 1 << 14;
-  int** p = reinterpret_cast<int**>(malloc(sizeof(*p) * kNumEntries));
-  int sum = 0;
-  for (int i = 0; i < kNumEntries; i++) {
-    // no page size is likely to be bigger than 8192?
-    p[i] = reinterpret_cast<int*>(malloc(8192));
-    p[i][1000] = i;  // use memory deep in the heart of p
-  }
-  for (int i = 0; i < kNumEntries; i++) {
-    p[i] = reinterpret_cast<int*>(realloc(p[i], 9000));
-  }
-  for (int i = 0; i < kNumEntries; i++) {
-    sum += p[i][1000];
-    free(p[i]);
-  }
-  EXPECT_EQ(kNumEntries / 2 * (kNumEntries - 1), sum);  // assume kNE is even
-  free(p);
-}
-
-#ifdef NDEBUG
-TEST(TCMallocFreeTest, BadPointerInFirstPageOfTheLargeObject) {
-  const size_t kPageSize = base::GetPageSize();
-  char* p =
-      reinterpret_cast<char*>(TCMallocDoMallocForTest(10 * kPageSize + 1));
-  for (unsigned offset = 1; offset < kPageSize; offset <<= 1) {
-    ASSERT_DEATH(TCMallocDoFreeForTest(p + offset),
-                 "Pointer is not pointing to the start of a span");
-  }
-  TCMallocDoFreeForTest(p);
-}
-
-// TODO(ssid): Fix flakiness and enable the test, crbug.com/571549.
-TEST(TCMallocFreeTest, DISABLED_BadPageAlignedPointerInsideLargeObject) {
-  const size_t kPageSize = base::GetPageSize();
-  const size_t kMaxSize = 10 * kPageSize;
-  char* p = reinterpret_cast<char*>(TCMallocDoMallocForTest(kMaxSize + 1));
-
-  for (unsigned offset = kPageSize; offset < kMaxSize; offset += kPageSize) {
-    // Only the first and last page of a span are in heap map. So for others
-    // tcmalloc will give a general error of invalid pointer.
-    ASSERT_DEATH(TCMallocDoFreeForTest(p + offset), "");
-  }
-  ASSERT_DEATH(TCMallocDoFreeForTest(p + kMaxSize),
-               "Pointer is not pointing to the start of a span");
-  TCMallocDoFreeForTest(p);
-}
-
-TEST(TCMallocFreeTest, DoubleFreeLargeObject) {
-  const size_t kMaxSize = 10 * base::GetPageSize();
-  char* p = reinterpret_cast<char*>(TCMallocDoMallocForTest(kMaxSize + 1));
-  ASSERT_DEATH(TCMallocDoFreeForTest(p); TCMallocDoFreeForTest(p),
-               "Object was not in-use");
-}
-
-TEST(TCMallocFreeTest, DoubleFreeSmallObject) {
-  const size_t kPageSize = base::GetPageSize();
-  for (size_t size = 1; size <= kPageSize; size <<= 1) {
-    char* p = reinterpret_cast<char*>(TCMallocDoMallocForTest(size));
-    ASSERT_DEATH(TCMallocDoFreeForTest(p); TCMallocDoFreeForTest(p),
-                 "Circular loop in list detected");
-  }
-}
-#endif  // NDEBUG
-
-#endif
diff --git a/base/at_exit_unittest.cc b/base/at_exit_unittest.cc
deleted file mode 100644
index 3de061f..0000000
--- a/base/at_exit_unittest.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/at_exit.h"
-#include "base/bind.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-int g_test_counter_1 = 0;
-int g_test_counter_2 = 0;
-
-void IncrementTestCounter1(void* unused) {
-  ++g_test_counter_1;
-}
-
-void IncrementTestCounter2(void* unused) {
-  ++g_test_counter_2;
-}
-
-void ZeroTestCounters() {
-  g_test_counter_1 = 0;
-  g_test_counter_2 = 0;
-}
-
-void ExpectCounter1IsZero(void* unused) {
-  EXPECT_EQ(0, g_test_counter_1);
-}
-
-void ExpectParamIsNull(void* param) {
-  EXPECT_EQ(nullptr, param);
-}
-
-void ExpectParamIsCounter(void* param) {
-  EXPECT_EQ(&g_test_counter_1, param);
-}
-
-}  // namespace
-
-class AtExitTest : public testing::Test {
- private:
-  // Don't test the global AtExitManager, because asking it to process its
-  // AtExit callbacks can ruin the global state that other tests may depend on.
-  base::ShadowingAtExitManager exit_manager_;
-};
-
-TEST_F(AtExitTest, Basic) {
-  ZeroTestCounters();
-  base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr);
-  base::AtExitManager::RegisterCallback(&IncrementTestCounter2, nullptr);
-  base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr);
-
-  EXPECT_EQ(0, g_test_counter_1);
-  EXPECT_EQ(0, g_test_counter_2);
-  base::AtExitManager::ProcessCallbacksNow();
-  EXPECT_EQ(2, g_test_counter_1);
-  EXPECT_EQ(1, g_test_counter_2);
-}
-
-TEST_F(AtExitTest, LIFOOrder) {
-  ZeroTestCounters();
-  base::AtExitManager::RegisterCallback(&IncrementTestCounter1, nullptr);
-  base::AtExitManager::RegisterCallback(&ExpectCounter1IsZero, nullptr);
-  base::AtExitManager::RegisterCallback(&IncrementTestCounter2, nullptr);
-
-  EXPECT_EQ(0, g_test_counter_1);
-  EXPECT_EQ(0, g_test_counter_2);
-  base::AtExitManager::ProcessCallbacksNow();
-  EXPECT_EQ(1, g_test_counter_1);
-  EXPECT_EQ(1, g_test_counter_2);
-}
-
-TEST_F(AtExitTest, Param) {
-  base::AtExitManager::RegisterCallback(&ExpectParamIsNull, nullptr);
-  base::AtExitManager::RegisterCallback(&ExpectParamIsCounter,
-                                        &g_test_counter_1);
-  base::AtExitManager::ProcessCallbacksNow();
-}
-
-TEST_F(AtExitTest, Task) {
-  ZeroTestCounters();
-  base::AtExitManager::RegisterTask(base::Bind(&ExpectParamIsCounter,
-                                               &g_test_counter_1));
-  base::AtExitManager::ProcessCallbacksNow();
-}
diff --git a/base/atomicops_unittest.cc b/base/atomicops_unittest.cc
deleted file mode 100644
index 7298609..0000000
--- a/base/atomicops_unittest.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/atomicops.h"
-
-#include <stdint.h>
-#include <string.h>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-template <class AtomicType>
-static void TestAtomicIncrement() {
-  // For now, we just test single threaded execution
-
-  // use a guard value to make sure the NoBarrier_AtomicIncrement doesn't go
-  // outside the expected address bounds.  This is in particular to
-  // test that some future change to the asm code doesn't cause the
-  // 32-bit NoBarrier_AtomicIncrement doesn't do the wrong thing on 64-bit
-  // machines.
-  struct {
-    AtomicType prev_word;
-    AtomicType count;
-    AtomicType next_word;
-  } s;
-
-  AtomicType prev_word_value, next_word_value;
-  memset(&prev_word_value, 0xFF, sizeof(AtomicType));
-  memset(&next_word_value, 0xEE, sizeof(AtomicType));
-
-  s.prev_word = prev_word_value;
-  s.count = 0;
-  s.next_word = next_word_value;
-
-  EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, 1), 1);
-  EXPECT_EQ(s.count, 1);
-  EXPECT_EQ(s.prev_word, prev_word_value);
-  EXPECT_EQ(s.next_word, next_word_value);
-
-  EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, 2), 3);
-  EXPECT_EQ(s.count, 3);
-  EXPECT_EQ(s.prev_word, prev_word_value);
-  EXPECT_EQ(s.next_word, next_word_value);
-
-  EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, 3), 6);
-  EXPECT_EQ(s.count, 6);
-  EXPECT_EQ(s.prev_word, prev_word_value);
-  EXPECT_EQ(s.next_word, next_word_value);
-
-  EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, -3), 3);
-  EXPECT_EQ(s.count, 3);
-  EXPECT_EQ(s.prev_word, prev_word_value);
-  EXPECT_EQ(s.next_word, next_word_value);
-
-  EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, -2), 1);
-  EXPECT_EQ(s.count, 1);
-  EXPECT_EQ(s.prev_word, prev_word_value);
-  EXPECT_EQ(s.next_word, next_word_value);
-
-  EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, -1), 0);
-  EXPECT_EQ(s.count, 0);
-  EXPECT_EQ(s.prev_word, prev_word_value);
-  EXPECT_EQ(s.next_word, next_word_value);
-
-  EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, -1), -1);
-  EXPECT_EQ(s.count, -1);
-  EXPECT_EQ(s.prev_word, prev_word_value);
-  EXPECT_EQ(s.next_word, next_word_value);
-
-  EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, -4), -5);
-  EXPECT_EQ(s.count, -5);
-  EXPECT_EQ(s.prev_word, prev_word_value);
-  EXPECT_EQ(s.next_word, next_word_value);
-
-  EXPECT_EQ(base::subtle::NoBarrier_AtomicIncrement(&s.count, 5), 0);
-  EXPECT_EQ(s.count, 0);
-  EXPECT_EQ(s.prev_word, prev_word_value);
-  EXPECT_EQ(s.next_word, next_word_value);
-}
-
-
-#define NUM_BITS(T) (sizeof(T) * 8)
-
-
-template <class AtomicType>
-static void TestCompareAndSwap() {
-  AtomicType value = 0;
-  AtomicType prev = base::subtle::NoBarrier_CompareAndSwap(&value, 0, 1);
-  EXPECT_EQ(1, value);
-  EXPECT_EQ(0, prev);
-
-  // Verify that CAS will *not* change "value" if it doesn't match the
-  // expected  number. CAS will always return the actual value of the
-  // variable from before any change.
-  AtomicType fail = base::subtle::NoBarrier_CompareAndSwap(&value, 0, 2);
-  EXPECT_EQ(1, value);
-  EXPECT_EQ(1, fail);
-
-  // Use test value that has non-zero bits in both halves, more for testing
-  // 64-bit implementation on 32-bit platforms.
-  const AtomicType k_test_val = (static_cast<uint64_t>(1) <<
-                                 (NUM_BITS(AtomicType) - 2)) + 11;
-  value = k_test_val;
-  prev = base::subtle::NoBarrier_CompareAndSwap(&value, 0, 5);
-  EXPECT_EQ(k_test_val, value);
-  EXPECT_EQ(k_test_val, prev);
-
-  value = k_test_val;
-  prev = base::subtle::NoBarrier_CompareAndSwap(&value, k_test_val, 5);
-  EXPECT_EQ(5, value);
-  EXPECT_EQ(k_test_val, prev);
-}
-
-
-template <class AtomicType>
-static void TestAtomicExchange() {
-  AtomicType value = 0;
-  AtomicType new_value = base::subtle::NoBarrier_AtomicExchange(&value, 1);
-  EXPECT_EQ(1, value);
-  EXPECT_EQ(0, new_value);
-
-  // Use test value that has non-zero bits in both halves, more for testing
-  // 64-bit implementation on 32-bit platforms.
-  const AtomicType k_test_val = (static_cast<uint64_t>(1) <<
-                                 (NUM_BITS(AtomicType) - 2)) + 11;
-  value = k_test_val;
-  new_value = base::subtle::NoBarrier_AtomicExchange(&value, k_test_val);
-  EXPECT_EQ(k_test_val, value);
-  EXPECT_EQ(k_test_val, new_value);
-
-  value = k_test_val;
-  new_value = base::subtle::NoBarrier_AtomicExchange(&value, 5);
-  EXPECT_EQ(5, value);
-  EXPECT_EQ(k_test_val, new_value);
-}
-
-
-template <class AtomicType>
-static void TestAtomicIncrementBounds() {
-  // Test at rollover boundary between int_max and int_min
-  AtomicType test_val = (static_cast<uint64_t>(1) <<
-                         (NUM_BITS(AtomicType) - 1));
-  AtomicType value = -1 ^ test_val;
-  AtomicType new_value = base::subtle::NoBarrier_AtomicIncrement(&value, 1);
-  EXPECT_EQ(test_val, value);
-  EXPECT_EQ(value, new_value);
-
-  base::subtle::NoBarrier_AtomicIncrement(&value, -1);
-  EXPECT_EQ(-1 ^ test_val, value);
-
-  // Test at 32-bit boundary for 64-bit atomic type.
-  test_val = static_cast<uint64_t>(1) << (NUM_BITS(AtomicType) / 2);
-  value = test_val - 1;
-  new_value = base::subtle::NoBarrier_AtomicIncrement(&value, 1);
-  EXPECT_EQ(test_val, value);
-  EXPECT_EQ(value, new_value);
-
-  base::subtle::NoBarrier_AtomicIncrement(&value, -1);
-  EXPECT_EQ(test_val - 1, value);
-}
-
-// Return an AtomicType with the value 0xa5a5a5..
-template <class AtomicType>
-static AtomicType TestFillValue() {
-  AtomicType val = 0;
-  memset(&val, 0xa5, sizeof(AtomicType));
-  return val;
-}
-
-// This is a simple sanity check that values are correct. Not testing
-// atomicity
-template <class AtomicType>
-static void TestStore() {
-  const AtomicType kVal1 = TestFillValue<AtomicType>();
-  const AtomicType kVal2 = static_cast<AtomicType>(-1);
-
-  AtomicType value;
-
-  base::subtle::NoBarrier_Store(&value, kVal1);
-  EXPECT_EQ(kVal1, value);
-  base::subtle::NoBarrier_Store(&value, kVal2);
-  EXPECT_EQ(kVal2, value);
-
-  base::subtle::Acquire_Store(&value, kVal1);
-  EXPECT_EQ(kVal1, value);
-  base::subtle::Acquire_Store(&value, kVal2);
-  EXPECT_EQ(kVal2, value);
-
-  base::subtle::Release_Store(&value, kVal1);
-  EXPECT_EQ(kVal1, value);
-  base::subtle::Release_Store(&value, kVal2);
-  EXPECT_EQ(kVal2, value);
-}
-
-// This is a simple sanity check that values are correct. Not testing
-// atomicity
-template <class AtomicType>
-static void TestLoad() {
-  const AtomicType kVal1 = TestFillValue<AtomicType>();
-  const AtomicType kVal2 = static_cast<AtomicType>(-1);
-
-  AtomicType value;
-
-  value = kVal1;
-  EXPECT_EQ(kVal1, base::subtle::NoBarrier_Load(&value));
-  value = kVal2;
-  EXPECT_EQ(kVal2, base::subtle::NoBarrier_Load(&value));
-
-  value = kVal1;
-  EXPECT_EQ(kVal1, base::subtle::Acquire_Load(&value));
-  value = kVal2;
-  EXPECT_EQ(kVal2, base::subtle::Acquire_Load(&value));
-
-  value = kVal1;
-  EXPECT_EQ(kVal1, base::subtle::Release_Load(&value));
-  value = kVal2;
-  EXPECT_EQ(kVal2, base::subtle::Release_Load(&value));
-}
-
-TEST(AtomicOpsTest, Inc) {
-  TestAtomicIncrement<base::subtle::Atomic32>();
-  TestAtomicIncrement<base::subtle::AtomicWord>();
-}
-
-TEST(AtomicOpsTest, CompareAndSwap) {
-  TestCompareAndSwap<base::subtle::Atomic32>();
-  TestCompareAndSwap<base::subtle::AtomicWord>();
-}
-
-TEST(AtomicOpsTest, Exchange) {
-  TestAtomicExchange<base::subtle::Atomic32>();
-  TestAtomicExchange<base::subtle::AtomicWord>();
-}
-
-TEST(AtomicOpsTest, IncrementBounds) {
-  TestAtomicIncrementBounds<base::subtle::Atomic32>();
-  TestAtomicIncrementBounds<base::subtle::AtomicWord>();
-}
-
-TEST(AtomicOpsTest, Store) {
-  TestStore<base::subtle::Atomic32>();
-  TestStore<base::subtle::AtomicWord>();
-}
-
-TEST(AtomicOpsTest, Load) {
-  TestLoad<base::subtle::Atomic32>();
-  TestLoad<base::subtle::AtomicWord>();
-}
diff --git a/base/barrier_closure_unittest.cc b/base/barrier_closure_unittest.cc
deleted file mode 100644
index 819f6ac..0000000
--- a/base/barrier_closure_unittest.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/barrier_closure.h"
-
-#include "base/bind.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-void Increment(int* count) { (*count)++; }
-
-TEST(BarrierClosureTest, RunImmediatelyForZeroClosures) {
-  int count = 0;
-  base::Closure done_closure(base::Bind(&Increment, base::Unretained(&count)));
-
-  base::Closure barrier_closure = base::BarrierClosure(0, done_closure);
-  EXPECT_EQ(1, count);
-}
-
-TEST(BarrierClosureTest, RunAfterNumClosures) {
-  int count = 0;
-  base::Closure done_closure(base::Bind(&Increment, base::Unretained(&count)));
-
-  base::Closure barrier_closure = base::BarrierClosure(2, done_closure);
-  EXPECT_EQ(0, count);
-
-  barrier_closure.Run();
-  EXPECT_EQ(0, count);
-
-  barrier_closure.Run();
-  EXPECT_EQ(1, count);
-}
-
-class DestructionIndicator {
- public:
-  // Sets |*destructed| to true in destructor.
-  DestructionIndicator(bool* destructed) : destructed_(destructed) {
-    *destructed_ = false;
-  }
-
-  ~DestructionIndicator() { *destructed_ = true; }
-
-  void DoNothing() {}
-
- private:
-  bool* destructed_;
-};
-
-TEST(BarrierClosureTest, ReleasesDoneClosureWhenDone) {
-  bool done_destructed = false;
-  base::Closure barrier_closure = base::BarrierClosure(
-      1,
-      base::BindOnce(&DestructionIndicator::DoNothing,
-                     base::Owned(new DestructionIndicator(&done_destructed))));
-  EXPECT_FALSE(done_destructed);
-  barrier_closure.Run();
-  EXPECT_TRUE(done_destructed);
-}
-
-void ResetBarrierClosure(base::Closure* closure) {
-  *closure = base::Closure();
-}
-
-// Tests a case when |done_closure| resets a |barrier_closure|.
-// |barrier_closure| is a Closure holding the |done_closure|. |done_closure|
-// holds a pointer back to the |barrier_closure|. When |barrier_closure| is
-// Run() it calls ResetBarrierClosure() which erases the |barrier_closure| while
-// still inside of its Run(). The Run() implementation (in base::BarrierClosure)
-// must not try use itself after executing ResetBarrierClosure() or this test
-// would crash inside Run().
-TEST(BarrierClosureTest, KeepingClosureAliveUntilDone) {
-  base::Closure barrier_closure;
-  base::Closure done_closure =
-      base::Bind(ResetBarrierClosure, &barrier_closure);
-  barrier_closure = base::BarrierClosure(1, done_closure);
-  barrier_closure.Run();
-}
-
-}  // namespace
diff --git a/base/base64_unittest.cc b/base/base64_unittest.cc
deleted file mode 100644
index 91651f4..0000000
--- a/base/base64_unittest.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/base64.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(Base64Test, Basic) {
-  const std::string kText = "hello world";
-  const std::string kBase64Text = "aGVsbG8gd29ybGQ=";
-
-  std::string encoded;
-  std::string decoded;
-  bool ok;
-
-  Base64Encode(kText, &encoded);
-  EXPECT_EQ(kBase64Text, encoded);
-
-  ok = Base64Decode(encoded, &decoded);
-  EXPECT_TRUE(ok);
-  EXPECT_EQ(kText, decoded);
-}
-
-TEST(Base64Test, InPlace) {
-  const std::string kText = "hello world";
-  const std::string kBase64Text = "aGVsbG8gd29ybGQ=";
-  std::string text(kText);
-
-  Base64Encode(text, &text);
-  EXPECT_EQ(kBase64Text, text);
-
-  bool ok = Base64Decode(text, &text);
-  EXPECT_TRUE(ok);
-  EXPECT_EQ(text, kText);
-}
-
-}  // namespace base
diff --git a/base/base64url_unittest.cc b/base/base64url_unittest.cc
deleted file mode 100644
index 45aa4a8..0000000
--- a/base/base64url_unittest.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/base64url.h"
-
-#include "base/macros.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-TEST(Base64UrlTest, EncodeIncludePaddingPolicy) {
-  std::string output;
-  Base64UrlEncode("hello?world", Base64UrlEncodePolicy::INCLUDE_PADDING,
-                  &output);
-
-  // Base64 version: aGVsbG8/d29ybGQ=
-  EXPECT_EQ("aGVsbG8_d29ybGQ=", output);
-
-  // Test for behavior for very short and empty strings.
-  Base64UrlEncode("??", Base64UrlEncodePolicy::INCLUDE_PADDING, &output);
-  EXPECT_EQ("Pz8=", output);
-
-  Base64UrlEncode("", Base64UrlEncodePolicy::INCLUDE_PADDING, &output);
-  EXPECT_EQ("", output);
-}
-
-TEST(Base64UrlTest, EncodeOmitPaddingPolicy) {
-  std::string output;
-  Base64UrlEncode("hello?world", Base64UrlEncodePolicy::OMIT_PADDING, &output);
-
-  // base64 version: aGVsbG8/d29ybGQ=
-  EXPECT_EQ("aGVsbG8_d29ybGQ", output);
-
-  // Test for behavior for very short and empty strings.
-  Base64UrlEncode("??", Base64UrlEncodePolicy::OMIT_PADDING, &output);
-  EXPECT_EQ("Pz8", output);
-
-  Base64UrlEncode("", Base64UrlEncodePolicy::OMIT_PADDING, &output);
-  EXPECT_EQ("", output);
-}
-
-TEST(Base64UrlTest, DecodeRequirePaddingPolicy) {
-  std::string output;
-  ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ=",
-                              Base64UrlDecodePolicy::REQUIRE_PADDING, &output));
-
-  EXPECT_EQ("hello?world", output);
-
-  ASSERT_FALSE(Base64UrlDecode(
-      "aGVsbG8_d29ybGQ", Base64UrlDecodePolicy::REQUIRE_PADDING, &output));
-
-  // Test for behavior for very short and empty strings.
-  ASSERT_TRUE(
-      Base64UrlDecode("Pz8=", Base64UrlDecodePolicy::REQUIRE_PADDING, &output));
-  EXPECT_EQ("??", output);
-
-  ASSERT_TRUE(
-      Base64UrlDecode("", Base64UrlDecodePolicy::REQUIRE_PADDING, &output));
-  EXPECT_EQ("", output);
-}
-
-TEST(Base64UrlTest, DecodeIgnorePaddingPolicy) {
-  std::string output;
-  ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ",
-                              Base64UrlDecodePolicy::IGNORE_PADDING, &output));
-
-  EXPECT_EQ("hello?world", output);
-
-  // Including the padding is accepted as well.
-  ASSERT_TRUE(Base64UrlDecode("aGVsbG8_d29ybGQ=",
-                              Base64UrlDecodePolicy::IGNORE_PADDING, &output));
-
-  EXPECT_EQ("hello?world", output);
-}
-
-TEST(Base64UrlTest, DecodeDisallowPaddingPolicy) {
-  std::string output;
-  ASSERT_FALSE(Base64UrlDecode(
-      "aGVsbG8_d29ybGQ=", Base64UrlDecodePolicy::DISALLOW_PADDING, &output));
-
-  // The policy will allow the input when padding has been omitted.
-  ASSERT_TRUE(Base64UrlDecode(
-      "aGVsbG8_d29ybGQ", Base64UrlDecodePolicy::DISALLOW_PADDING, &output));
-
-  EXPECT_EQ("hello?world", output);
-}
-
-TEST(Base64UrlTest, DecodeDisallowsBase64Alphabet) {
-  std::string output;
-
-  // The "/" character is part of the conventional base64 alphabet, but has been
-  // substituted with "_" in the base64url alphabet.
-  ASSERT_FALSE(Base64UrlDecode(
-      "aGVsbG8/d29ybGQ=", Base64UrlDecodePolicy::REQUIRE_PADDING, &output));
-}
-
-TEST(Base64UrlTest, DecodeDisallowsPaddingOnly) {
-  std::string output;
-
-  ASSERT_FALSE(Base64UrlDecode(
-      "=", Base64UrlDecodePolicy::IGNORE_PADDING, &output));
-  ASSERT_FALSE(Base64UrlDecode(
-      "==", Base64UrlDecodePolicy::IGNORE_PADDING, &output));
-  ASSERT_FALSE(Base64UrlDecode(
-      "===", Base64UrlDecodePolicy::IGNORE_PADDING, &output));
-  ASSERT_FALSE(Base64UrlDecode(
-      "====", Base64UrlDecodePolicy::IGNORE_PADDING, &output));
-}
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/big_endian_unittest.cc b/base/big_endian_unittest.cc
deleted file mode 100644
index 4e1e7ce..0000000
--- a/base/big_endian_unittest.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/big_endian.h"
-
-#include <stdint.h>
-
-#include "base/strings/string_piece.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(BigEndianReaderTest, ReadsValues) {
-  char data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF,
-                  0x1A, 0x2B, 0x3C, 0x4D, 0x5E };
-  char buf[2];
-  uint8_t u8;
-  uint16_t u16;
-  uint32_t u32;
-  uint64_t u64;
-  base::StringPiece piece;
-  BigEndianReader reader(data, sizeof(data));
-
-  EXPECT_TRUE(reader.Skip(2));
-  EXPECT_EQ(data + 2, reader.ptr());
-  EXPECT_EQ(reader.remaining(), static_cast<int>(sizeof(data)) - 2);
-  EXPECT_TRUE(reader.ReadBytes(buf, sizeof(buf)));
-  EXPECT_EQ(0x2, buf[0]);
-  EXPECT_EQ(0x3, buf[1]);
-  EXPECT_TRUE(reader.ReadU8(&u8));
-  EXPECT_EQ(0x4, u8);
-  EXPECT_TRUE(reader.ReadU16(&u16));
-  EXPECT_EQ(0x0506, u16);
-  EXPECT_TRUE(reader.ReadU32(&u32));
-  EXPECT_EQ(0x0708090Au, u32);
-  EXPECT_TRUE(reader.ReadU64(&u64));
-  EXPECT_EQ(0x0B0C0D0E0F1A2B3Cllu, u64);
-  base::StringPiece expected(reader.ptr(), 2);
-  EXPECT_TRUE(reader.ReadPiece(&piece, 2));
-  EXPECT_EQ(2u, piece.size());
-  EXPECT_EQ(expected.data(), piece.data());
-}
-
-TEST(BigEndianReaderTest, RespectsLength) {
-  char data[8];
-  char buf[2];
-  uint8_t u8;
-  uint16_t u16;
-  uint32_t u32;
-  uint64_t u64;
-  base::StringPiece piece;
-  BigEndianReader reader(data, sizeof(data));
-  // 8 left
-  EXPECT_FALSE(reader.Skip(9));
-  EXPECT_TRUE(reader.Skip(1));
-  // 7 left
-  EXPECT_FALSE(reader.ReadU64(&u64));
-  EXPECT_TRUE(reader.Skip(4));
-  // 3 left
-  EXPECT_FALSE(reader.ReadU32(&u32));
-  EXPECT_FALSE(reader.ReadPiece(&piece, 4));
-  EXPECT_TRUE(reader.Skip(2));
-  // 1 left
-  EXPECT_FALSE(reader.ReadU16(&u16));
-  EXPECT_FALSE(reader.ReadBytes(buf, 2));
-  EXPECT_TRUE(reader.Skip(1));
-  // 0 left
-  EXPECT_FALSE(reader.ReadU8(&u8));
-  EXPECT_EQ(0, reader.remaining());
-}
-
-TEST(BigEndianWriterTest, WritesValues) {
-  char expected[] = { 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE,
-                      0xF, 0x1A, 0x2B, 0x3C };
-  char data[sizeof(expected)];
-  char buf[] = { 0x2, 0x3 };
-  memset(data, 0, sizeof(data));
-  BigEndianWriter writer(data, sizeof(data));
-
-  EXPECT_TRUE(writer.Skip(2));
-  EXPECT_TRUE(writer.WriteBytes(buf, sizeof(buf)));
-  EXPECT_TRUE(writer.WriteU8(0x4));
-  EXPECT_TRUE(writer.WriteU16(0x0506));
-  EXPECT_TRUE(writer.WriteU32(0x0708090A));
-  EXPECT_TRUE(writer.WriteU64(0x0B0C0D0E0F1A2B3Cllu));
-  EXPECT_EQ(0, memcmp(expected, data, sizeof(expected)));
-}
-
-TEST(BigEndianWriterTest, RespectsLength) {
-  char data[8];
-  char buf[2];
-  uint8_t u8 = 0;
-  uint16_t u16 = 0;
-  uint32_t u32 = 0;
-  uint64_t u64 = 0;
-  BigEndianWriter writer(data, sizeof(data));
-  // 8 left
-  EXPECT_FALSE(writer.Skip(9));
-  EXPECT_TRUE(writer.Skip(1));
-  // 7 left
-  EXPECT_FALSE(writer.WriteU64(u64));
-  EXPECT_TRUE(writer.Skip(4));
-  // 3 left
-  EXPECT_FALSE(writer.WriteU32(u32));
-  EXPECT_TRUE(writer.Skip(2));
-  // 1 left
-  EXPECT_FALSE(writer.WriteU16(u16));
-  EXPECT_FALSE(writer.WriteBytes(buf, 2));
-  EXPECT_TRUE(writer.Skip(1));
-  // 0 left
-  EXPECT_FALSE(writer.WriteU8(u8));
-  EXPECT_EQ(0, writer.remaining());
-}
-
-}  // namespace base
diff --git a/base/bind_unittest.cc b/base/bind_unittest.cc
deleted file mode 100644
index 5162a08..0000000
--- a/base/bind_unittest.cc
+++ /dev/null
@@ -1,1496 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/test/bind_test_util.h"
-#include "base/test/gtest_util.h"
-#include "build_config.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::_;
-using ::testing::Mock;
-using ::testing::ByMove;
-using ::testing::Return;
-using ::testing::StrictMock;
-
-namespace base {
-namespace {
-
-class IncompleteType;
-
-class NoRef {
- public:
-  NoRef() = default;
-
-  MOCK_METHOD0(VoidMethod0, void());
-  MOCK_CONST_METHOD0(VoidConstMethod0, void());
-
-  MOCK_METHOD0(IntMethod0, int());
-  MOCK_CONST_METHOD0(IntConstMethod0, int());
-
-  MOCK_METHOD1(VoidMethodWithIntArg, void(int));
-  MOCK_METHOD0(UniquePtrMethod0, std::unique_ptr<int>());
-
- private:
-  // Particularly important in this test to ensure no copies are made.
-  DISALLOW_COPY_AND_ASSIGN(NoRef);
-};
-
-class HasRef : public NoRef {
- public:
-  HasRef() = default;
-
-  MOCK_CONST_METHOD0(AddRef, void());
-  MOCK_CONST_METHOD0(Release, bool());
-
- private:
-  // Particularly important in this test to ensure no copies are made.
-  DISALLOW_COPY_AND_ASSIGN(HasRef);
-};
-
-class HasRefPrivateDtor : public HasRef {
- private:
-  ~HasRefPrivateDtor() = default;
-};
-
-static const int kParentValue = 1;
-static const int kChildValue = 2;
-
-class Parent {
- public:
-  void AddRef() const {}
-  void Release() const {}
-  virtual void VirtualSet() { value = kParentValue; }
-  void NonVirtualSet() { value = kParentValue; }
-  int value;
-};
-
-class Child : public Parent {
- public:
-  void VirtualSet() override { value = kChildValue; }
-  void NonVirtualSet() { value = kChildValue; }
-};
-
-class NoRefParent {
- public:
-  virtual void VirtualSet() { value = kParentValue; }
-  void NonVirtualSet() { value = kParentValue; }
-  int value;
-};
-
-class NoRefChild : public NoRefParent {
-  void VirtualSet() override { value = kChildValue; }
-  void NonVirtualSet() { value = kChildValue; }
-};
-
-// Used for probing the number of copies and moves that occur if a type must be
-// coerced during argument forwarding in the Run() methods.
-struct DerivedCopyMoveCounter {
-  DerivedCopyMoveCounter(int* copies,
-                         int* assigns,
-                         int* move_constructs,
-                         int* move_assigns)
-      : copies_(copies),
-        assigns_(assigns),
-        move_constructs_(move_constructs),
-        move_assigns_(move_assigns) {}
-  int* copies_;
-  int* assigns_;
-  int* move_constructs_;
-  int* move_assigns_;
-};
-
-// Used for probing the number of copies and moves in an argument.
-class CopyMoveCounter {
- public:
-  CopyMoveCounter(int* copies,
-                  int* assigns,
-                  int* move_constructs,
-                  int* move_assigns)
-      : copies_(copies),
-        assigns_(assigns),
-        move_constructs_(move_constructs),
-        move_assigns_(move_assigns) {}
-
-  CopyMoveCounter(const CopyMoveCounter& other)
-      : copies_(other.copies_),
-        assigns_(other.assigns_),
-        move_constructs_(other.move_constructs_),
-        move_assigns_(other.move_assigns_) {
-    (*copies_)++;
-  }
-
-  CopyMoveCounter(CopyMoveCounter&& other)
-      : copies_(other.copies_),
-        assigns_(other.assigns_),
-        move_constructs_(other.move_constructs_),
-        move_assigns_(other.move_assigns_) {
-    (*move_constructs_)++;
-  }
-
-  // Probing for copies from coercion.
-  explicit CopyMoveCounter(const DerivedCopyMoveCounter& other)
-      : copies_(other.copies_),
-        assigns_(other.assigns_),
-        move_constructs_(other.move_constructs_),
-        move_assigns_(other.move_assigns_) {
-    (*copies_)++;
-  }
-
-  // Probing for moves from coercion.
-  explicit CopyMoveCounter(DerivedCopyMoveCounter&& other)
-      : copies_(other.copies_),
-        assigns_(other.assigns_),
-        move_constructs_(other.move_constructs_),
-        move_assigns_(other.move_assigns_) {
-    (*move_constructs_)++;
-  }
-
-  const CopyMoveCounter& operator=(const CopyMoveCounter& rhs) {
-    copies_ = rhs.copies_;
-    assigns_ = rhs.assigns_;
-    move_constructs_ = rhs.move_constructs_;
-    move_assigns_ = rhs.move_assigns_;
-
-    (*assigns_)++;
-
-    return *this;
-  }
-
-  const CopyMoveCounter& operator=(CopyMoveCounter&& rhs) {
-    copies_ = rhs.copies_;
-    assigns_ = rhs.assigns_;
-    move_constructs_ = rhs.move_constructs_;
-    move_assigns_ = rhs.move_assigns_;
-
-    (*move_assigns_)++;
-
-    return *this;
-  }
-
-  int copies() const {
-    return *copies_;
-  }
-
- private:
-  int* copies_;
-  int* assigns_;
-  int* move_constructs_;
-  int* move_assigns_;
-};
-
-// Used for probing the number of copies in an argument. The instance is a
-// copyable and non-movable type.
-class CopyCounter {
- public:
-  CopyCounter(int* copies, int* assigns)
-      : counter_(copies, assigns, nullptr, nullptr) {}
-  CopyCounter(const CopyCounter& other) = default;
-  CopyCounter& operator=(const CopyCounter& other) = default;
-
-  explicit CopyCounter(const DerivedCopyMoveCounter& other) : counter_(other) {}
-
-  int copies() const { return counter_.copies(); }
-
- private:
-  CopyMoveCounter counter_;
-};
-
-// Used for probing the number of moves in an argument. The instance is a
-// non-copyable and movable type.
-class MoveCounter {
- public:
-  MoveCounter(int* move_constructs, int* move_assigns)
-      : counter_(nullptr, nullptr, move_constructs, move_assigns) {}
-  MoveCounter(MoveCounter&& other) : counter_(std::move(other.counter_)) {}
-  MoveCounter& operator=(MoveCounter&& other) {
-    counter_ = std::move(other.counter_);
-    return *this;
-  }
-
-  explicit MoveCounter(DerivedCopyMoveCounter&& other)
-      : counter_(std::move(other)) {}
-
- private:
-  CopyMoveCounter counter_;
-};
-
-class DeleteCounter {
- public:
-  explicit DeleteCounter(int* deletes)
-      : deletes_(deletes) {
-  }
-
-  ~DeleteCounter() {
-    (*deletes_)++;
-  }
-
-  void VoidMethod0() {}
-
- private:
-  int* deletes_;
-};
-
-template <typename T>
-T PassThru(T scoper) {
-  return scoper;
-}
-
-// Some test functions that we can Bind to.
-template <typename T>
-T PolymorphicIdentity(T t) {
-  return t;
-}
-
-template <typename... Ts>
-struct VoidPolymorphic {
-  static void Run(Ts... t) {}
-};
-
-int Identity(int n) {
-  return n;
-}
-
-int ArrayGet(const int array[], int n) {
-  return array[n];
-}
-
-int Sum(int a, int b, int c, int d, int e, int f) {
-  return a + b + c + d + e + f;
-}
-
-const char* CStringIdentity(const char* s) {
-  return s;
-}
-
-int GetCopies(const CopyMoveCounter& counter) {
-  return counter.copies();
-}
-
-int UnwrapNoRefParent(NoRefParent p) {
-  return p.value;
-}
-
-int UnwrapNoRefParentPtr(NoRefParent* p) {
-  return p->value;
-}
-
-int UnwrapNoRefParentConstRef(const NoRefParent& p) {
-  return p.value;
-}
-
-void RefArgSet(int &n) {
-  n = 2;
-}
-
-void PtrArgSet(int *n) {
-  *n = 2;
-}
-
-int FunctionWithWeakFirstParam(WeakPtr<NoRef> o, int n) {
-  return n;
-}
-
-int FunctionWithScopedRefptrFirstParam(const scoped_refptr<HasRef>& o, int n) {
-  return n;
-}
-
-void TakesACallback(const Closure& callback) {
-  callback.Run();
-}
-
-int Noexcept() noexcept {
-  return 42;
-}
-
-class BindTest : public ::testing::Test {
- public:
-  BindTest() {
-    const_has_ref_ptr_ = &has_ref_;
-    const_no_ref_ptr_ = &no_ref_;
-    static_func_mock_ptr = &static_func_mock_;
-  }
-
-  ~BindTest() override = default;
-
-  static void VoidFunc0() {
-    static_func_mock_ptr->VoidMethod0();
-  }
-
-  static int IntFunc0() { return static_func_mock_ptr->IntMethod0(); }
-  int NoexceptMethod() noexcept { return 42; }
-  int ConstNoexceptMethod() const noexcept { return 42; }
-
- protected:
-  StrictMock<NoRef> no_ref_;
-  StrictMock<HasRef> has_ref_;
-  const HasRef* const_has_ref_ptr_;
-  const NoRef* const_no_ref_ptr_;
-  StrictMock<NoRef> static_func_mock_;
-
-  // Used by the static functions to perform expectations.
-  static StrictMock<NoRef>* static_func_mock_ptr;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(BindTest);
-};
-
-StrictMock<NoRef>* BindTest::static_func_mock_ptr;
-StrictMock<NoRef>* g_func_mock_ptr;
-
-void VoidFunc0() {
-  g_func_mock_ptr->VoidMethod0();
-}
-
-int IntFunc0() {
-  return g_func_mock_ptr->IntMethod0();
-}
-
-TEST_F(BindTest, BasicTest) {
-  Callback<int(int, int, int)> cb = Bind(&Sum, 32, 16, 8);
-  EXPECT_EQ(92, cb.Run(13, 12, 11));
-
-  Callback<int(int, int, int, int, int, int)> c1 = Bind(&Sum);
-  EXPECT_EQ(69, c1.Run(14, 13, 12, 11, 10, 9));
-
-  Callback<int(int, int, int)> c2 = Bind(c1, 32, 16, 8);
-  EXPECT_EQ(86, c2.Run(11, 10, 9));
-
-  Callback<int()> c3 = Bind(c2, 4, 2, 1);
-  EXPECT_EQ(63, c3.Run());
-}
-
-// Test that currying the rvalue result of another Bind() works correctly.
-//   - rvalue should be usable as argument to Bind().
-//   - multiple runs of resulting Callback remain valid.
-TEST_F(BindTest, CurryingRvalueResultOfBind) {
-  int n = 0;
-  RepeatingClosure cb = BindRepeating(&TakesACallback,
-                                      BindRepeating(&PtrArgSet, &n));
-
-  // If we implement Bind() such that the return value has auto_ptr-like
-  // semantics, the second call here will fail because ownership of
-  // the internal BindState<> would have been transfered to a *temporary*
-  // constructon of a Callback object on the first call.
-  cb.Run();
-  EXPECT_EQ(2, n);
-
-  n = 0;
-  cb.Run();
-  EXPECT_EQ(2, n);
-}
-
-TEST_F(BindTest, RepeatingCallbackBasicTest) {
-  RepeatingCallback<int(int)> c0 = BindRepeating(&Sum, 1, 2, 4, 8, 16);
-
-  // RepeatingCallback can run via a lvalue-reference.
-  EXPECT_EQ(63, c0.Run(32));
-
-  // It is valid to call a RepeatingCallback more than once.
-  EXPECT_EQ(54, c0.Run(23));
-
-  // BindRepeating can handle a RepeatingCallback as the target functor.
-  RepeatingCallback<int()> c1 = BindRepeating(c0, 11);
-
-  // RepeatingCallback can run via a rvalue-reference.
-  EXPECT_EQ(42, std::move(c1).Run());
-
-  // BindRepeating can handle a rvalue-reference of RepeatingCallback.
-  EXPECT_EQ(32, BindRepeating(std::move(c0), 1).Run());
-}
-
-TEST_F(BindTest, OnceCallbackBasicTest) {
-  OnceCallback<int(int)> c0 = BindOnce(&Sum, 1, 2, 4, 8, 16);
-
-  // OnceCallback can run via a rvalue-reference.
-  EXPECT_EQ(63, std::move(c0).Run(32));
-
-  // After running via the rvalue-reference, the value of the OnceCallback
-  // is undefined. The implementation simply clears the instance after the
-  // invocation.
-  EXPECT_TRUE(c0.is_null());
-
-  c0 = BindOnce(&Sum, 2, 3, 5, 7, 11);
-
-  // BindOnce can handle a rvalue-reference of OnceCallback as the target
-  // functor.
-  OnceCallback<int()> c1 = BindOnce(std::move(c0), 13);
-  EXPECT_EQ(41, std::move(c1).Run());
-
-  RepeatingCallback<int(int)> c2 = BindRepeating(&Sum, 2, 3, 5, 7, 11);
-  EXPECT_EQ(41, BindOnce(c2, 13).Run());
-}
-
-// IgnoreResult adapter test.
-//   - Function with return value.
-//   - Method with return value.
-//   - Const Method with return.
-//   - Method with return value bound to WeakPtr<>.
-//   - Const Method with return bound to WeakPtr<>.
-TEST_F(BindTest, IgnoreResultForRepeating) {
-  EXPECT_CALL(static_func_mock_, IntMethod0()).WillOnce(Return(1337));
-  EXPECT_CALL(has_ref_, AddRef()).Times(2);
-  EXPECT_CALL(has_ref_, Release()).Times(2);
-  EXPECT_CALL(has_ref_, IntMethod0()).WillOnce(Return(10));
-  EXPECT_CALL(has_ref_, IntConstMethod0()).WillOnce(Return(11));
-  EXPECT_CALL(no_ref_, IntMethod0()).WillOnce(Return(12));
-  EXPECT_CALL(no_ref_, IntConstMethod0()).WillOnce(Return(13));
-
-  RepeatingClosure normal_func_cb = BindRepeating(IgnoreResult(&IntFunc0));
-  normal_func_cb.Run();
-
-  RepeatingClosure non_void_method_cb =
-      BindRepeating(IgnoreResult(&HasRef::IntMethod0), &has_ref_);
-  non_void_method_cb.Run();
-
-  RepeatingClosure non_void_const_method_cb =
-      BindRepeating(IgnoreResult(&HasRef::IntConstMethod0), &has_ref_);
-  non_void_const_method_cb.Run();
-
-  WeakPtrFactory<NoRef> weak_factory(&no_ref_);
-  WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_);
-
-  RepeatingClosure non_void_weak_method_cb  =
-      BindRepeating(IgnoreResult(&NoRef::IntMethod0),
-                    weak_factory.GetWeakPtr());
-  non_void_weak_method_cb.Run();
-
-  RepeatingClosure non_void_weak_const_method_cb =
-      BindRepeating(IgnoreResult(&NoRef::IntConstMethod0),
-                    weak_factory.GetWeakPtr());
-  non_void_weak_const_method_cb.Run();
-
-  weak_factory.InvalidateWeakPtrs();
-  non_void_weak_const_method_cb.Run();
-  non_void_weak_method_cb.Run();
-}
-
-TEST_F(BindTest, IgnoreResultForOnce) {
-  EXPECT_CALL(static_func_mock_, IntMethod0()).WillOnce(Return(1337));
-  EXPECT_CALL(has_ref_, AddRef()).Times(2);
-  EXPECT_CALL(has_ref_, Release()).Times(2);
-  EXPECT_CALL(has_ref_, IntMethod0()).WillOnce(Return(10));
-  EXPECT_CALL(has_ref_, IntConstMethod0()).WillOnce(Return(11));
-
-  OnceClosure normal_func_cb = BindOnce(IgnoreResult(&IntFunc0));
-  std::move(normal_func_cb).Run();
-
-  OnceClosure non_void_method_cb =
-      BindOnce(IgnoreResult(&HasRef::IntMethod0), &has_ref_);
-  std::move(non_void_method_cb).Run();
-
-  OnceClosure non_void_const_method_cb =
-      BindOnce(IgnoreResult(&HasRef::IntConstMethod0), &has_ref_);
-  std::move(non_void_const_method_cb).Run();
-
-  WeakPtrFactory<NoRef> weak_factory(&no_ref_);
-  WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_);
-
-  OnceClosure non_void_weak_method_cb  =
-      BindOnce(IgnoreResult(&NoRef::IntMethod0),
-                  weak_factory.GetWeakPtr());
-  OnceClosure non_void_weak_const_method_cb =
-      BindOnce(IgnoreResult(&NoRef::IntConstMethod0),
-                  weak_factory.GetWeakPtr());
-
-  weak_factory.InvalidateWeakPtrs();
-  std::move(non_void_weak_const_method_cb).Run();
-  std::move(non_void_weak_method_cb).Run();
-}
-
-// Functions that take reference parameters.
-//  - Forced reference parameter type still stores a copy.
-//  - Forced const reference parameter type still stores a copy.
-TEST_F(BindTest, ReferenceArgumentBindingForRepeating) {
-  int n = 1;
-  int& ref_n = n;
-  const int& const_ref_n = n;
-
-  RepeatingCallback<int()> ref_copies_cb = BindRepeating(&Identity, ref_n);
-  EXPECT_EQ(n, ref_copies_cb.Run());
-  n++;
-  EXPECT_EQ(n - 1, ref_copies_cb.Run());
-
-  RepeatingCallback<int()> const_ref_copies_cb =
-      BindRepeating(&Identity, const_ref_n);
-  EXPECT_EQ(n, const_ref_copies_cb.Run());
-  n++;
-  EXPECT_EQ(n - 1, const_ref_copies_cb.Run());
-}
-
-TEST_F(BindTest, ReferenceArgumentBindingForOnce) {
-  int n = 1;
-  int& ref_n = n;
-  const int& const_ref_n = n;
-
-  OnceCallback<int()> ref_copies_cb = BindOnce(&Identity, ref_n);
-  n++;
-  EXPECT_EQ(n - 1, std::move(ref_copies_cb).Run());
-
-  OnceCallback<int()> const_ref_copies_cb =
-      BindOnce(&Identity, const_ref_n);
-  n++;
-  EXPECT_EQ(n - 1, std::move(const_ref_copies_cb).Run());
-}
-
-// Check that we can pass in arrays and have them be stored as a pointer.
-//  - Array of values stores a pointer.
-//  - Array of const values stores a pointer.
-TEST_F(BindTest, ArrayArgumentBindingForRepeating) {
-  int array[4] = {1, 1, 1, 1};
-  const int (*const_array_ptr)[4] = &array;
-
-  RepeatingCallback<int()> array_cb = BindRepeating(&ArrayGet, array, 1);
-  EXPECT_EQ(1, array_cb.Run());
-
-  RepeatingCallback<int()> const_array_cb =
-      BindRepeating(&ArrayGet, *const_array_ptr, 1);
-  EXPECT_EQ(1, const_array_cb.Run());
-
-  array[1] = 3;
-  EXPECT_EQ(3, array_cb.Run());
-  EXPECT_EQ(3, const_array_cb.Run());
-}
-
-TEST_F(BindTest, ArrayArgumentBindingForOnce) {
-  int array[4] = {1, 1, 1, 1};
-  const int (*const_array_ptr)[4] = &array;
-
-  OnceCallback<int()> array_cb = BindOnce(&ArrayGet, array, 1);
-  OnceCallback<int()> const_array_cb =
-      BindOnce(&ArrayGet, *const_array_ptr, 1);
-
-  array[1] = 3;
-  EXPECT_EQ(3, std::move(array_cb).Run());
-  EXPECT_EQ(3, std::move(const_array_cb).Run());
-}
-
-// WeakPtr() support.
-//   - Method bound to WeakPtr<> to non-const object.
-//   - Const method bound to WeakPtr<> to non-const object.
-//   - Const method bound to WeakPtr<> to const object.
-//   - Normal Function with WeakPtr<> as P1 can have return type and is
-//     not canceled.
-TEST_F(BindTest, WeakPtrForRepeating) {
-  EXPECT_CALL(no_ref_, VoidMethod0());
-  EXPECT_CALL(no_ref_, VoidConstMethod0()).Times(2);
-
-  WeakPtrFactory<NoRef> weak_factory(&no_ref_);
-  WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_);
-
-  RepeatingClosure method_cb =
-      BindRepeating(&NoRef::VoidMethod0, weak_factory.GetWeakPtr());
-  method_cb.Run();
-
-  RepeatingClosure const_method_cb =
-      BindRepeating(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr());
-  const_method_cb.Run();
-
-  RepeatingClosure const_method_const_ptr_cb =
-      BindRepeating(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr());
-  const_method_const_ptr_cb.Run();
-
-  RepeatingCallback<int(int)> normal_func_cb =
-      BindRepeating(&FunctionWithWeakFirstParam, weak_factory.GetWeakPtr());
-  EXPECT_EQ(1, normal_func_cb.Run(1));
-
-  weak_factory.InvalidateWeakPtrs();
-  const_weak_factory.InvalidateWeakPtrs();
-
-  method_cb.Run();
-  const_method_cb.Run();
-  const_method_const_ptr_cb.Run();
-
-  // Still runs even after the pointers are invalidated.
-  EXPECT_EQ(2, normal_func_cb.Run(2));
-}
-
-TEST_F(BindTest, WeakPtrForOnce) {
-  WeakPtrFactory<NoRef> weak_factory(&no_ref_);
-  WeakPtrFactory<const NoRef> const_weak_factory(const_no_ref_ptr_);
-
-  OnceClosure method_cb =
-      BindOnce(&NoRef::VoidMethod0, weak_factory.GetWeakPtr());
-  OnceClosure const_method_cb =
-      BindOnce(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr());
-  OnceClosure const_method_const_ptr_cb =
-      BindOnce(&NoRef::VoidConstMethod0, const_weak_factory.GetWeakPtr());
-  Callback<int(int)> normal_func_cb =
-      Bind(&FunctionWithWeakFirstParam, weak_factory.GetWeakPtr());
-
-  weak_factory.InvalidateWeakPtrs();
-  const_weak_factory.InvalidateWeakPtrs();
-
-  std::move(method_cb).Run();
-  std::move(const_method_cb).Run();
-  std::move(const_method_const_ptr_cb).Run();
-
-  // Still runs even after the pointers are invalidated.
-  EXPECT_EQ(2, std::move(normal_func_cb).Run(2));
-}
-
-// ConstRef() wrapper support.
-//   - Binding w/o ConstRef takes a copy.
-//   - Binding a ConstRef takes a reference.
-//   - Binding ConstRef to a function ConstRef does not copy on invoke.
-TEST_F(BindTest, ConstRefForRepeating) {
-  int n = 1;
-
-  RepeatingCallback<int()> copy_cb = BindRepeating(&Identity, n);
-  RepeatingCallback<int()> const_ref_cb = BindRepeating(&Identity, ConstRef(n));
-  EXPECT_EQ(n, copy_cb.Run());
-  EXPECT_EQ(n, const_ref_cb.Run());
-  n++;
-  EXPECT_EQ(n - 1, copy_cb.Run());
-  EXPECT_EQ(n, const_ref_cb.Run());
-
-  int copies = 0;
-  int assigns = 0;
-  int move_constructs = 0;
-  int move_assigns = 0;
-  CopyMoveCounter counter(&copies, &assigns, &move_constructs, &move_assigns);
-  RepeatingCallback<int()> all_const_ref_cb =
-      BindRepeating(&GetCopies, ConstRef(counter));
-  EXPECT_EQ(0, all_const_ref_cb.Run());
-  EXPECT_EQ(0, copies);
-  EXPECT_EQ(0, assigns);
-  EXPECT_EQ(0, move_constructs);
-  EXPECT_EQ(0, move_assigns);
-}
-
-TEST_F(BindTest, ConstRefForOnce) {
-  int n = 1;
-
-  OnceCallback<int()> copy_cb = BindOnce(&Identity, n);
-  OnceCallback<int()> const_ref_cb = BindOnce(&Identity, ConstRef(n));
-  n++;
-  EXPECT_EQ(n - 1, std::move(copy_cb).Run());
-  EXPECT_EQ(n, std::move(const_ref_cb).Run());
-
-  int copies = 0;
-  int assigns = 0;
-  int move_constructs = 0;
-  int move_assigns = 0;
-  CopyMoveCounter counter(&copies, &assigns, &move_constructs, &move_assigns);
-  OnceCallback<int()> all_const_ref_cb =
-      BindOnce(&GetCopies, ConstRef(counter));
-  EXPECT_EQ(0, std::move(all_const_ref_cb).Run());
-  EXPECT_EQ(0, copies);
-  EXPECT_EQ(0, assigns);
-  EXPECT_EQ(0, move_constructs);
-  EXPECT_EQ(0, move_assigns);
-}
-
-// Test Owned() support.
-TEST_F(BindTest, OwnedForRepeating) {
-  int deletes = 0;
-  DeleteCounter* counter = new DeleteCounter(&deletes);
-
-  // If we don't capture, delete happens on Callback destruction/reset.
-  // return the same value.
-  RepeatingCallback<DeleteCounter*()> no_capture_cb =
-      BindRepeating(&PolymorphicIdentity<DeleteCounter*>, Owned(counter));
-  ASSERT_EQ(counter, no_capture_cb.Run());
-  ASSERT_EQ(counter, no_capture_cb.Run());
-  EXPECT_EQ(0, deletes);
-  no_capture_cb.Reset();  // This should trigger a delete.
-  EXPECT_EQ(1, deletes);
-
-  deletes = 0;
-  counter = new DeleteCounter(&deletes);
-  RepeatingClosure own_object_cb =
-      BindRepeating(&DeleteCounter::VoidMethod0, Owned(counter));
-  own_object_cb.Run();
-  EXPECT_EQ(0, deletes);
-  own_object_cb.Reset();
-  EXPECT_EQ(1, deletes);
-}
-
-TEST_F(BindTest, OwnedForOnce) {
-  int deletes = 0;
-  DeleteCounter* counter = new DeleteCounter(&deletes);
-
-  // If we don't capture, delete happens on Callback destruction/reset.
-  // return the same value.
-  OnceCallback<DeleteCounter*()> no_capture_cb =
-      BindOnce(&PolymorphicIdentity<DeleteCounter*>, Owned(counter));
-  EXPECT_EQ(0, deletes);
-  no_capture_cb.Reset();  // This should trigger a delete.
-  EXPECT_EQ(1, deletes);
-
-  deletes = 0;
-  counter = new DeleteCounter(&deletes);
-  OnceClosure own_object_cb =
-      BindOnce(&DeleteCounter::VoidMethod0, Owned(counter));
-  EXPECT_EQ(0, deletes);
-  own_object_cb.Reset();
-  EXPECT_EQ(1, deletes);
-}
-
-template <typename T>
-class BindVariantsTest : public ::testing::Test {
-};
-
-struct RepeatingTestConfig {
-  template <typename Signature>
-  using CallbackType = RepeatingCallback<Signature>;
-  using ClosureType = RepeatingClosure;
-
-  template <typename F, typename... Args>
-  static CallbackType<MakeUnboundRunType<F, Args...>>
-  Bind(F&& f, Args&&... args) {
-    return BindRepeating(std::forward<F>(f), std::forward<Args>(args)...);
-  }
-};
-
-struct OnceTestConfig {
-  template <typename Signature>
-  using CallbackType = OnceCallback<Signature>;
-  using ClosureType = OnceClosure;
-
-  template <typename F, typename... Args>
-  static CallbackType<MakeUnboundRunType<F, Args...>>
-  Bind(F&& f, Args&&... args) {
-    return BindOnce(std::forward<F>(f), std::forward<Args>(args)...);
-  }
-};
-
-using BindVariantsTestConfig = ::testing::Types<
-  RepeatingTestConfig, OnceTestConfig>;
-TYPED_TEST_CASE(BindVariantsTest, BindVariantsTestConfig);
-
-template <typename TypeParam, typename Signature>
-using CallbackType = typename TypeParam::template CallbackType<Signature>;
-
-// Function type support.
-//   - Normal function.
-//   - Normal function bound with non-refcounted first argument.
-//   - Method bound to non-const object.
-//   - Method bound to scoped_refptr.
-//   - Const method bound to non-const object.
-//   - Const method bound to const object.
-//   - Derived classes can be used with pointers to non-virtual base functions.
-//   - Derived classes can be used with pointers to virtual base functions (and
-//     preserve virtual dispatch).
-TYPED_TEST(BindVariantsTest, FunctionTypeSupport) {
-  using ClosureType = typename TypeParam::ClosureType;
-
-  StrictMock<HasRef> has_ref;
-  StrictMock<NoRef> no_ref;
-  StrictMock<NoRef> static_func_mock;
-  const HasRef* const_has_ref_ptr = &has_ref;
-  g_func_mock_ptr = &static_func_mock;
-
-  EXPECT_CALL(static_func_mock, VoidMethod0());
-  EXPECT_CALL(has_ref, AddRef()).Times(4);
-  EXPECT_CALL(has_ref, Release()).Times(4);
-  EXPECT_CALL(has_ref, VoidMethod0()).Times(2);
-  EXPECT_CALL(has_ref, VoidConstMethod0()).Times(2);
-
-  ClosureType normal_cb = TypeParam::Bind(&VoidFunc0);
-  CallbackType<TypeParam, NoRef*()> normal_non_refcounted_cb =
-      TypeParam::Bind(&PolymorphicIdentity<NoRef*>, &no_ref);
-  std::move(normal_cb).Run();
-  EXPECT_EQ(&no_ref, std::move(normal_non_refcounted_cb).Run());
-
-  ClosureType method_cb = TypeParam::Bind(&HasRef::VoidMethod0, &has_ref);
-  ClosureType method_refptr_cb =
-      TypeParam::Bind(&HasRef::VoidMethod0, WrapRefCounted(&has_ref));
-  ClosureType const_method_nonconst_obj_cb =
-      TypeParam::Bind(&HasRef::VoidConstMethod0, &has_ref);
-  ClosureType const_method_const_obj_cb =
-      TypeParam::Bind(&HasRef::VoidConstMethod0, const_has_ref_ptr);
-  std::move(method_cb).Run();
-  std::move(method_refptr_cb).Run();
-  std::move(const_method_nonconst_obj_cb).Run();
-  std::move(const_method_const_obj_cb).Run();
-
-  Child child;
-  child.value = 0;
-  ClosureType virtual_set_cb = TypeParam::Bind(&Parent::VirtualSet, &child);
-  std::move(virtual_set_cb).Run();
-  EXPECT_EQ(kChildValue, child.value);
-
-  child.value = 0;
-  ClosureType non_virtual_set_cb =
-      TypeParam::Bind(&Parent::NonVirtualSet, &child);
-  std::move(non_virtual_set_cb).Run();
-  EXPECT_EQ(kParentValue, child.value);
-}
-
-// Return value support.
-//   - Function with return value.
-//   - Method with return value.
-//   - Const method with return value.
-//   - Move-only return value.
-TYPED_TEST(BindVariantsTest, ReturnValues) {
-  StrictMock<NoRef> static_func_mock;
-  StrictMock<HasRef> has_ref;
-  g_func_mock_ptr = &static_func_mock;
-  const HasRef* const_has_ref_ptr = &has_ref;
-
-  EXPECT_CALL(static_func_mock, IntMethod0()).WillOnce(Return(1337));
-  EXPECT_CALL(has_ref, AddRef()).Times(4);
-  EXPECT_CALL(has_ref, Release()).Times(4);
-  EXPECT_CALL(has_ref, IntMethod0()).WillOnce(Return(31337));
-  EXPECT_CALL(has_ref, IntConstMethod0())
-      .WillOnce(Return(41337))
-      .WillOnce(Return(51337));
-  EXPECT_CALL(has_ref, UniquePtrMethod0())
-      .WillOnce(Return(ByMove(std::make_unique<int>(42))));
-
-  CallbackType<TypeParam, int()> normal_cb = TypeParam::Bind(&IntFunc0);
-  CallbackType<TypeParam, int()> method_cb =
-      TypeParam::Bind(&HasRef::IntMethod0, &has_ref);
-  CallbackType<TypeParam, int()> const_method_nonconst_obj_cb =
-      TypeParam::Bind(&HasRef::IntConstMethod0, &has_ref);
-  CallbackType<TypeParam, int()> const_method_const_obj_cb =
-      TypeParam::Bind(&HasRef::IntConstMethod0, const_has_ref_ptr);
-  CallbackType<TypeParam, std::unique_ptr<int>()> move_only_rv_cb =
-      TypeParam::Bind(&HasRef::UniquePtrMethod0, &has_ref);
-  EXPECT_EQ(1337, std::move(normal_cb).Run());
-  EXPECT_EQ(31337, std::move(method_cb).Run());
-  EXPECT_EQ(41337, std::move(const_method_nonconst_obj_cb).Run());
-  EXPECT_EQ(51337, std::move(const_method_const_obj_cb).Run());
-  EXPECT_EQ(42, *std::move(move_only_rv_cb).Run());
-}
-
-// Argument binding tests.
-//   - Argument binding to primitive.
-//   - Argument binding to primitive pointer.
-//   - Argument binding to a literal integer.
-//   - Argument binding to a literal string.
-//   - Argument binding with template function.
-//   - Argument binding to an object.
-//   - Argument binding to pointer to incomplete type.
-//   - Argument gets type converted.
-//   - Pointer argument gets converted.
-//   - Const Reference forces conversion.
-TYPED_TEST(BindVariantsTest, ArgumentBinding) {
-  int n = 2;
-
-  EXPECT_EQ(n, TypeParam::Bind(&Identity, n).Run());
-  EXPECT_EQ(&n, TypeParam::Bind(&PolymorphicIdentity<int*>, &n).Run());
-  EXPECT_EQ(3, TypeParam::Bind(&Identity, 3).Run());
-  EXPECT_STREQ("hi", TypeParam::Bind(&CStringIdentity, "hi").Run());
-  EXPECT_EQ(4, TypeParam::Bind(&PolymorphicIdentity<int>, 4).Run());
-
-  NoRefParent p;
-  p.value = 5;
-  EXPECT_EQ(5, TypeParam::Bind(&UnwrapNoRefParent, p).Run());
-
-  IncompleteType* incomplete_ptr = reinterpret_cast<IncompleteType*>(123);
-  EXPECT_EQ(incomplete_ptr,
-            TypeParam::Bind(&PolymorphicIdentity<IncompleteType*>,
-                            incomplete_ptr).Run());
-
-  NoRefChild c;
-  c.value = 6;
-  EXPECT_EQ(6, TypeParam::Bind(&UnwrapNoRefParent, c).Run());
-
-  c.value = 7;
-  EXPECT_EQ(7, TypeParam::Bind(&UnwrapNoRefParentPtr, &c).Run());
-
-  c.value = 8;
-  EXPECT_EQ(8, TypeParam::Bind(&UnwrapNoRefParentConstRef, c).Run());
-}
-
-// Unbound argument type support tests.
-//   - Unbound value.
-//   - Unbound pointer.
-//   - Unbound reference.
-//   - Unbound const reference.
-//   - Unbound unsized array.
-//   - Unbound sized array.
-//   - Unbound array-of-arrays.
-TYPED_TEST(BindVariantsTest, UnboundArgumentTypeSupport) {
-  CallbackType<TypeParam, void(int)> unbound_value_cb =
-      TypeParam::Bind(&VoidPolymorphic<int>::Run);
-  CallbackType<TypeParam, void(int*)> unbound_pointer_cb =
-      TypeParam::Bind(&VoidPolymorphic<int*>::Run);
-  CallbackType<TypeParam, void(int&)> unbound_ref_cb =
-      TypeParam::Bind(&VoidPolymorphic<int&>::Run);
-  CallbackType<TypeParam, void(const int&)> unbound_const_ref_cb =
-      TypeParam::Bind(&VoidPolymorphic<const int&>::Run);
-  CallbackType<TypeParam, void(int[])> unbound_unsized_array_cb =
-      TypeParam::Bind(&VoidPolymorphic<int[]>::Run);
-  CallbackType<TypeParam, void(int[2])> unbound_sized_array_cb =
-      TypeParam::Bind(&VoidPolymorphic<int[2]>::Run);
-  CallbackType<TypeParam, void(int[][2])> unbound_array_of_arrays_cb =
-      TypeParam::Bind(&VoidPolymorphic<int[][2]>::Run);
-  CallbackType<TypeParam, void(int&)> unbound_ref_with_bound_arg =
-      TypeParam::Bind(&VoidPolymorphic<int, int&>::Run, 1);
-}
-
-// Function with unbound reference parameter.
-//   - Original parameter is modified by callback.
-TYPED_TEST(BindVariantsTest, UnboundReferenceSupport) {
-  int n = 0;
-  CallbackType<TypeParam, void(int&)> unbound_ref_cb =
-      TypeParam::Bind(&RefArgSet);
-  std::move(unbound_ref_cb).Run(n);
-  EXPECT_EQ(2, n);
-}
-
-// Unretained() wrapper support.
-//   - Method bound to Unretained() non-const object.
-//   - Const method bound to Unretained() non-const object.
-//   - Const method bound to Unretained() const object.
-TYPED_TEST(BindVariantsTest, Unretained) {
-  StrictMock<NoRef> no_ref;
-  const NoRef* const_no_ref_ptr = &no_ref;
-
-  EXPECT_CALL(no_ref, VoidMethod0());
-  EXPECT_CALL(no_ref, VoidConstMethod0()).Times(2);
-
-  TypeParam::Bind(&NoRef::VoidMethod0, Unretained(&no_ref)).Run();
-  TypeParam::Bind(&NoRef::VoidConstMethod0, Unretained(&no_ref)).Run();
-  TypeParam::Bind(&NoRef::VoidConstMethod0, Unretained(const_no_ref_ptr)).Run();
-}
-
-TYPED_TEST(BindVariantsTest, ScopedRefptr) {
-  StrictMock<HasRef> has_ref;
-  EXPECT_CALL(has_ref, AddRef()).Times(1);
-  EXPECT_CALL(has_ref, Release()).Times(1);
-
-  const scoped_refptr<HasRef> refptr(&has_ref);
-  CallbackType<TypeParam, int()> scoped_refptr_const_ref_cb =
-      TypeParam::Bind(&FunctionWithScopedRefptrFirstParam,
-                      base::ConstRef(refptr), 1);
-  EXPECT_EQ(1, std::move(scoped_refptr_const_ref_cb).Run());
-}
-
-TYPED_TEST(BindVariantsTest, UniquePtrReceiver) {
-  std::unique_ptr<StrictMock<NoRef>> no_ref(new StrictMock<NoRef>);
-  EXPECT_CALL(*no_ref, VoidMethod0()).Times(1);
-  TypeParam::Bind(&NoRef::VoidMethod0, std::move(no_ref)).Run();
-}
-
-// Tests for Passed() wrapper support:
-//   - Passed() can be constructed from a pointer to scoper.
-//   - Passed() can be constructed from a scoper rvalue.
-//   - Using Passed() gives Callback Ownership.
-//   - Ownership is transferred from Callback to callee on the first Run().
-//   - Callback supports unbound arguments.
-template <typename T>
-class BindMoveOnlyTypeTest : public ::testing::Test {
-};
-
-struct CustomDeleter {
-  void operator()(DeleteCounter* c) { delete c; }
-};
-
-using MoveOnlyTypesToTest =
-    ::testing::Types<std::unique_ptr<DeleteCounter>,
-                     std::unique_ptr<DeleteCounter, CustomDeleter>>;
-TYPED_TEST_CASE(BindMoveOnlyTypeTest, MoveOnlyTypesToTest);
-
-TYPED_TEST(BindMoveOnlyTypeTest, PassedToBoundCallback) {
-  int deletes = 0;
-
-  TypeParam ptr(new DeleteCounter(&deletes));
-  Callback<TypeParam()> callback = Bind(&PassThru<TypeParam>, Passed(&ptr));
-  EXPECT_FALSE(ptr.get());
-  EXPECT_EQ(0, deletes);
-
-  // If we never invoke the Callback, it retains ownership and deletes.
-  callback.Reset();
-  EXPECT_EQ(1, deletes);
-}
-
-TYPED_TEST(BindMoveOnlyTypeTest, PassedWithRvalue) {
-  int deletes = 0;
-  Callback<TypeParam()> callback = Bind(
-      &PassThru<TypeParam>, Passed(TypeParam(new DeleteCounter(&deletes))));
-  EXPECT_EQ(0, deletes);
-
-  // If we never invoke the Callback, it retains ownership and deletes.
-  callback.Reset();
-  EXPECT_EQ(1, deletes);
-}
-
-// Check that ownership can be transferred back out.
-TYPED_TEST(BindMoveOnlyTypeTest, ReturnMoveOnlyType) {
-  int deletes = 0;
-  DeleteCounter* counter = new DeleteCounter(&deletes);
-  Callback<TypeParam()> callback =
-      Bind(&PassThru<TypeParam>, Passed(TypeParam(counter)));
-  TypeParam result = callback.Run();
-  ASSERT_EQ(counter, result.get());
-  EXPECT_EQ(0, deletes);
-
-  // Resetting does not delete since ownership was transferred.
-  callback.Reset();
-  EXPECT_EQ(0, deletes);
-
-  // Ensure that we actually did get ownership.
-  result.reset();
-  EXPECT_EQ(1, deletes);
-}
-
-TYPED_TEST(BindMoveOnlyTypeTest, UnboundForwarding) {
-  int deletes = 0;
-  TypeParam ptr(new DeleteCounter(&deletes));
-  // Test unbound argument forwarding.
-  Callback<TypeParam(TypeParam)> cb_unbound = Bind(&PassThru<TypeParam>);
-  cb_unbound.Run(std::move(ptr));
-  EXPECT_EQ(1, deletes);
-}
-
-void VerifyVector(const std::vector<std::unique_ptr<int>>& v) {
-  ASSERT_EQ(1u, v.size());
-  EXPECT_EQ(12345, *v[0]);
-}
-
-std::vector<std::unique_ptr<int>> AcceptAndReturnMoveOnlyVector(
-    std::vector<std::unique_ptr<int>> v) {
-  VerifyVector(v);
-  return v;
-}
-
-// Test that a vector containing move-only types can be used with Callback.
-TEST_F(BindTest, BindMoveOnlyVector) {
-  using MoveOnlyVector = std::vector<std::unique_ptr<int>>;
-
-  MoveOnlyVector v;
-  v.push_back(WrapUnique(new int(12345)));
-
-  // Early binding should work:
-  base::Callback<MoveOnlyVector()> bound_cb =
-      base::Bind(&AcceptAndReturnMoveOnlyVector, Passed(&v));
-  MoveOnlyVector intermediate_result = bound_cb.Run();
-  VerifyVector(intermediate_result);
-
-  // As should passing it as an argument to Run():
-  base::Callback<MoveOnlyVector(MoveOnlyVector)> unbound_cb =
-      base::Bind(&AcceptAndReturnMoveOnlyVector);
-  MoveOnlyVector final_result = unbound_cb.Run(std::move(intermediate_result));
-  VerifyVector(final_result);
-}
-
-// Argument copy-constructor usage for non-reference copy-only parameters.
-//   - Bound arguments are only copied once.
-//   - Forwarded arguments are only copied once.
-//   - Forwarded arguments with coercions are only copied twice (once for the
-//     coercion, and one for the final dispatch).
-TEST_F(BindTest, ArgumentCopies) {
-  int copies = 0;
-  int assigns = 0;
-
-  CopyCounter counter(&copies, &assigns);
-  Bind(&VoidPolymorphic<CopyCounter>::Run, counter);
-  EXPECT_EQ(1, copies);
-  EXPECT_EQ(0, assigns);
-
-  copies = 0;
-  assigns = 0;
-  Bind(&VoidPolymorphic<CopyCounter>::Run, CopyCounter(&copies, &assigns));
-  EXPECT_EQ(1, copies);
-  EXPECT_EQ(0, assigns);
-
-  copies = 0;
-  assigns = 0;
-  Bind(&VoidPolymorphic<CopyCounter>::Run).Run(counter);
-  EXPECT_EQ(2, copies);
-  EXPECT_EQ(0, assigns);
-
-  copies = 0;
-  assigns = 0;
-  Bind(&VoidPolymorphic<CopyCounter>::Run).Run(CopyCounter(&copies, &assigns));
-  EXPECT_EQ(1, copies);
-  EXPECT_EQ(0, assigns);
-
-  copies = 0;
-  assigns = 0;
-  DerivedCopyMoveCounter derived(&copies, &assigns, nullptr, nullptr);
-  Bind(&VoidPolymorphic<CopyCounter>::Run).Run(CopyCounter(derived));
-  EXPECT_EQ(2, copies);
-  EXPECT_EQ(0, assigns);
-
-  copies = 0;
-  assigns = 0;
-  Bind(&VoidPolymorphic<CopyCounter>::Run)
-      .Run(CopyCounter(
-          DerivedCopyMoveCounter(&copies, &assigns, nullptr, nullptr)));
-  EXPECT_EQ(2, copies);
-  EXPECT_EQ(0, assigns);
-}
-
-// Argument move-constructor usage for move-only parameters.
-//   - Bound arguments passed by move are not copied.
-TEST_F(BindTest, ArgumentMoves) {
-  int move_constructs = 0;
-  int move_assigns = 0;
-
-  Bind(&VoidPolymorphic<const MoveCounter&>::Run,
-       MoveCounter(&move_constructs, &move_assigns));
-  EXPECT_EQ(1, move_constructs);
-  EXPECT_EQ(0, move_assigns);
-
-  // TODO(tzik): Support binding move-only type into a non-reference parameter
-  // of a variant of Callback.
-
-  move_constructs = 0;
-  move_assigns = 0;
-  Bind(&VoidPolymorphic<MoveCounter>::Run)
-      .Run(MoveCounter(&move_constructs, &move_assigns));
-  EXPECT_EQ(1, move_constructs);
-  EXPECT_EQ(0, move_assigns);
-
-  move_constructs = 0;
-  move_assigns = 0;
-  Bind(&VoidPolymorphic<MoveCounter>::Run)
-      .Run(MoveCounter(DerivedCopyMoveCounter(
-          nullptr, nullptr, &move_constructs, &move_assigns)));
-  EXPECT_EQ(2, move_constructs);
-  EXPECT_EQ(0, move_assigns);
-}
-
-// Argument constructor usage for non-reference movable-copyable
-// parameters.
-//   - Bound arguments passed by move are not copied.
-//   - Forwarded arguments are only copied once.
-//   - Forwarded arguments with coercions are only copied once and moved once.
-TEST_F(BindTest, ArgumentCopiesAndMoves) {
-  int copies = 0;
-  int assigns = 0;
-  int move_constructs = 0;
-  int move_assigns = 0;
-
-  CopyMoveCounter counter(&copies, &assigns, &move_constructs, &move_assigns);
-  Bind(&VoidPolymorphic<CopyMoveCounter>::Run, counter);
-  EXPECT_EQ(1, copies);
-  EXPECT_EQ(0, assigns);
-  EXPECT_EQ(0, move_constructs);
-  EXPECT_EQ(0, move_assigns);
-
-  copies = 0;
-  assigns = 0;
-  move_constructs = 0;
-  move_assigns = 0;
-  Bind(&VoidPolymorphic<CopyMoveCounter>::Run,
-       CopyMoveCounter(&copies, &assigns, &move_constructs, &move_assigns));
-  EXPECT_EQ(0, copies);
-  EXPECT_EQ(0, assigns);
-  EXPECT_EQ(1, move_constructs);
-  EXPECT_EQ(0, move_assigns);
-
-  copies = 0;
-  assigns = 0;
-  move_constructs = 0;
-  move_assigns = 0;
-  Bind(&VoidPolymorphic<CopyMoveCounter>::Run).Run(counter);
-  EXPECT_EQ(1, copies);
-  EXPECT_EQ(0, assigns);
-  EXPECT_EQ(1, move_constructs);
-  EXPECT_EQ(0, move_assigns);
-
-  copies = 0;
-  assigns = 0;
-  move_constructs = 0;
-  move_assigns = 0;
-  Bind(&VoidPolymorphic<CopyMoveCounter>::Run)
-      .Run(CopyMoveCounter(&copies, &assigns, &move_constructs, &move_assigns));
-  EXPECT_EQ(0, copies);
-  EXPECT_EQ(0, assigns);
-  EXPECT_EQ(1, move_constructs);
-  EXPECT_EQ(0, move_assigns);
-
-  DerivedCopyMoveCounter derived_counter(&copies, &assigns, &move_constructs,
-                                         &move_assigns);
-  copies = 0;
-  assigns = 0;
-  move_constructs = 0;
-  move_assigns = 0;
-  Bind(&VoidPolymorphic<CopyMoveCounter>::Run)
-      .Run(CopyMoveCounter(derived_counter));
-  EXPECT_EQ(1, copies);
-  EXPECT_EQ(0, assigns);
-  EXPECT_EQ(1, move_constructs);
-  EXPECT_EQ(0, move_assigns);
-
-  copies = 0;
-  assigns = 0;
-  move_constructs = 0;
-  move_assigns = 0;
-  Bind(&VoidPolymorphic<CopyMoveCounter>::Run)
-      .Run(CopyMoveCounter(DerivedCopyMoveCounter(
-          &copies, &assigns, &move_constructs, &move_assigns)));
-  EXPECT_EQ(0, copies);
-  EXPECT_EQ(0, assigns);
-  EXPECT_EQ(2, move_constructs);
-  EXPECT_EQ(0, move_assigns);
-}
-
-TEST_F(BindTest, CapturelessLambda) {
-  EXPECT_FALSE(internal::IsCallableObject<void>::value);
-  EXPECT_FALSE(internal::IsCallableObject<int>::value);
-  EXPECT_FALSE(internal::IsCallableObject<void (*)()>::value);
-  EXPECT_FALSE(internal::IsCallableObject<void (NoRef::*)()>::value);
-
-  auto f = []() {};
-  EXPECT_TRUE(internal::IsCallableObject<decltype(f)>::value);
-
-  int i = 0;
-  auto g = [i]() { (void)i; };
-  EXPECT_TRUE(internal::IsCallableObject<decltype(g)>::value);
-
-  auto h = [](int, double) { return 'k'; };
-  EXPECT_TRUE((std::is_same<
-      char(int, double),
-      internal::ExtractCallableRunType<decltype(h)>>::value));
-
-  EXPECT_EQ(42, Bind([] { return 42; }).Run());
-  EXPECT_EQ(42, Bind([](int i) { return i * 7; }, 6).Run());
-
-  int x = 1;
-  base::Callback<void(int)> cb =
-      Bind([](int* x, int i) { *x *= i; }, Unretained(&x));
-  cb.Run(6);
-  EXPECT_EQ(6, x);
-  cb.Run(7);
-  EXPECT_EQ(42, x);
-}
-
-TEST_F(BindTest, EmptyFunctor) {
-  struct NonEmptyFunctor {
-    int operator()() const { return x; }
-    int x = 42;
-  };
-
-  struct EmptyFunctor {
-    int operator()() { return 42; }
-  };
-
-  struct EmptyFunctorConst {
-    int operator()() const { return 42; }
-  };
-
-  EXPECT_TRUE(internal::IsCallableObject<NonEmptyFunctor>::value);
-  EXPECT_TRUE(internal::IsCallableObject<EmptyFunctor>::value);
-  EXPECT_TRUE(internal::IsCallableObject<EmptyFunctorConst>::value);
-  EXPECT_EQ(42, BindOnce(EmptyFunctor()).Run());
-  EXPECT_EQ(42, BindOnce(EmptyFunctorConst()).Run());
-  EXPECT_EQ(42, BindRepeating(EmptyFunctorConst()).Run());
-}
-
-TEST_F(BindTest, CapturingLambdaForTesting) {
-  int x = 6;
-  EXPECT_EQ(42, BindLambdaForTesting([=](int y) { return x * y; }).Run(7));
-
-  auto f = [x](std::unique_ptr<int> y) { return x * *y; };
-  EXPECT_EQ(42, BindLambdaForTesting(f).Run(std::make_unique<int>(7)));
-}
-
-TEST_F(BindTest, Cancellation) {
-  EXPECT_CALL(no_ref_, VoidMethodWithIntArg(_)).Times(2);
-
-  WeakPtrFactory<NoRef> weak_factory(&no_ref_);
-  RepeatingCallback<void(int)> cb =
-      BindRepeating(&NoRef::VoidMethodWithIntArg, weak_factory.GetWeakPtr());
-  RepeatingClosure cb2 = BindRepeating(cb, 8);
-  OnceClosure cb3 = BindOnce(cb, 8);
-
-  OnceCallback<void(int)> cb4 =
-      BindOnce(&NoRef::VoidMethodWithIntArg, weak_factory.GetWeakPtr());
-  EXPECT_FALSE(cb4.IsCancelled());
-
-  OnceClosure cb5 = BindOnce(std::move(cb4), 8);
-
-  EXPECT_FALSE(cb.IsCancelled());
-  EXPECT_FALSE(cb2.IsCancelled());
-  EXPECT_FALSE(cb3.IsCancelled());
-  EXPECT_FALSE(cb5.IsCancelled());
-
-  cb.Run(6);
-  cb2.Run();
-
-  weak_factory.InvalidateWeakPtrs();
-
-  EXPECT_TRUE(cb.IsCancelled());
-  EXPECT_TRUE(cb2.IsCancelled());
-  EXPECT_TRUE(cb3.IsCancelled());
-  EXPECT_TRUE(cb5.IsCancelled());
-
-  cb.Run(6);
-  cb2.Run();
-  std::move(cb3).Run();
-  std::move(cb5).Run();
-}
-
-TEST_F(BindTest, OnceCallback) {
-  // Check if Callback variants have declarations of conversions as expected.
-  // Copy constructor and assignment of RepeatingCallback.
-  static_assert(std::is_constructible<
-      RepeatingClosure, const RepeatingClosure&>::value,
-      "RepeatingClosure should be copyable.");
-  static_assert(
-      std::is_assignable<RepeatingClosure, const RepeatingClosure&>::value,
-      "RepeatingClosure should be copy-assignable.");
-
-  // Move constructor and assignment of RepeatingCallback.
-  static_assert(std::is_constructible<
-      RepeatingClosure, RepeatingClosure&&>::value,
-      "RepeatingClosure should be movable.");
-  static_assert(std::is_assignable<RepeatingClosure, RepeatingClosure&&>::value,
-                "RepeatingClosure should be move-assignable");
-
-  // Conversions from OnceCallback to RepeatingCallback.
-  static_assert(!std::is_constructible<
-      RepeatingClosure, const OnceClosure&>::value,
-      "OnceClosure should not be convertible to RepeatingClosure.");
-  static_assert(
-      !std::is_assignable<RepeatingClosure, const OnceClosure&>::value,
-      "OnceClosure should not be convertible to RepeatingClosure.");
-
-  // Destructive conversions from OnceCallback to RepeatingCallback.
-  static_assert(!std::is_constructible<
-      RepeatingClosure, OnceClosure&&>::value,
-      "OnceClosure should not be convertible to RepeatingClosure.");
-  static_assert(!std::is_assignable<RepeatingClosure, OnceClosure&&>::value,
-                "OnceClosure should not be convertible to RepeatingClosure.");
-
-  // Copy constructor and assignment of OnceCallback.
-  static_assert(!std::is_constructible<
-      OnceClosure, const OnceClosure&>::value,
-      "OnceClosure should not be copyable.");
-  static_assert(!std::is_assignable<OnceClosure, const OnceClosure&>::value,
-                "OnceClosure should not be copy-assignable");
-
-  // Move constructor and assignment of OnceCallback.
-  static_assert(std::is_constructible<
-      OnceClosure, OnceClosure&&>::value,
-      "OnceClosure should be movable.");
-  static_assert(std::is_assignable<OnceClosure, OnceClosure&&>::value,
-                "OnceClosure should be move-assignable.");
-
-  // Conversions from RepeatingCallback to OnceCallback.
-  static_assert(std::is_constructible<
-      OnceClosure, const RepeatingClosure&>::value,
-      "RepeatingClosure should be convertible to OnceClosure.");
-  static_assert(std::is_assignable<OnceClosure, const RepeatingClosure&>::value,
-                "RepeatingClosure should be convertible to OnceClosure.");
-
-  // Destructive conversions from RepeatingCallback to OnceCallback.
-  static_assert(std::is_constructible<
-      OnceClosure, RepeatingClosure&&>::value,
-      "RepeatingClosure should be convertible to OnceClosure.");
-  static_assert(std::is_assignable<OnceClosure, RepeatingClosure&&>::value,
-                "RepeatingClosure should be covretible to OnceClosure.");
-
-  OnceClosure cb = BindOnce(&VoidPolymorphic<>::Run);
-  std::move(cb).Run();
-
-  // RepeatingCallback should be convertible to OnceCallback.
-  OnceClosure cb2 = BindRepeating(&VoidPolymorphic<>::Run);
-  std::move(cb2).Run();
-
-  RepeatingClosure cb3 = BindRepeating(&VoidPolymorphic<>::Run);
-  cb = cb3;
-  std::move(cb).Run();
-
-  cb = std::move(cb2);
-
-  OnceCallback<void(int)> cb4 =
-      BindOnce(&VoidPolymorphic<std::unique_ptr<int>, int>::Run,
-               std::make_unique<int>(0));
-  BindOnce(std::move(cb4), 1).Run();
-}
-
-// Callback construction and assignment tests.
-//   - Construction from an InvokerStorageHolder should not cause ref/deref.
-//   - Assignment from other callback should only cause one ref
-//
-// TODO(ajwong): Is there actually a way to test this?
-
-#if defined(OS_WIN)
-int __fastcall FastCallFunc(int n) {
-  return n;
-}
-
-int __stdcall StdCallFunc(int n) {
-  return n;
-}
-
-// Windows specific calling convention support.
-//   - Can bind a __fastcall function.
-//   - Can bind a __stdcall function.
-TEST_F(BindTest, WindowsCallingConventions) {
-  Callback<int()> fastcall_cb = Bind(&FastCallFunc, 1);
-  EXPECT_EQ(1, fastcall_cb.Run());
-
-  Callback<int()> stdcall_cb = Bind(&StdCallFunc, 2);
-  EXPECT_EQ(2, stdcall_cb.Run());
-}
-#endif
-
-// Test unwrapping the various wrapping functions.
-
-TEST_F(BindTest, UnwrapUnretained) {
-  int i = 0;
-  auto unretained = Unretained(&i);
-  EXPECT_EQ(&i, internal::Unwrap(unretained));
-  EXPECT_EQ(&i, internal::Unwrap(std::move(unretained)));
-}
-
-TEST_F(BindTest, UnwrapConstRef) {
-  int p = 0;
-  auto const_ref = ConstRef(p);
-  EXPECT_EQ(&p, &internal::Unwrap(const_ref));
-  EXPECT_EQ(&p, &internal::Unwrap(std::move(const_ref)));
-}
-
-TEST_F(BindTest, UnwrapRetainedRef) {
-  auto p = MakeRefCounted<RefCountedData<int>>();
-  auto retained_ref = RetainedRef(p);
-  EXPECT_EQ(p.get(), internal::Unwrap(retained_ref));
-  EXPECT_EQ(p.get(), internal::Unwrap(std::move(retained_ref)));
-}
-
-TEST_F(BindTest, UnwrapOwned) {
-  int* p = new int;
-  auto owned = Owned(p);
-  EXPECT_EQ(p, internal::Unwrap(owned));
-  EXPECT_EQ(p, internal::Unwrap(std::move(owned)));
-}
-
-TEST_F(BindTest, UnwrapPassed) {
-  int* p = new int;
-  auto passed = Passed(WrapUnique(p));
-  EXPECT_EQ(p, internal::Unwrap(passed).get());
-
-  p = new int;
-  EXPECT_EQ(p, internal::Unwrap(Passed(WrapUnique(p))).get());
-}
-
-TEST_F(BindTest, BindNoexcept) {
-  EXPECT_EQ(42, base::BindOnce(&Noexcept).Run());
-  EXPECT_EQ(
-      42,
-      base::BindOnce(&BindTest::NoexceptMethod, base::Unretained(this)).Run());
-  EXPECT_EQ(
-      42, base::BindOnce(&BindTest::ConstNoexceptMethod, base::Unretained(this))
-              .Run());
-}
-
-// Test null callbacks cause a DCHECK.
-TEST(BindDeathTest, NullCallback) {
-  base::Callback<void(int)> null_cb;
-  ASSERT_TRUE(null_cb.is_null());
-  EXPECT_DCHECK_DEATH(base::Bind(null_cb, 42));
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/bind_unittest.nc b/base/bind_unittest.nc
deleted file mode 100644
index d549d2e..0000000
--- a/base/bind_unittest.nc
+++ /dev/null
@@ -1,322 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a "No Compile Test" suite.
-// http://dev.chromium.org/developers/testing/no-compile-tests
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/test/bind_test_util.h"
-
-namespace base {
-
-// Do not put everything inside an anonymous namespace.  If you do, many of the
-// helper function declarations will generate unused definition warnings.
-
-static const int kParentValue = 1;
-static const int kChildValue = 2;
-
-class NoRef {
- public:
-  void VoidMethod0() {}
-  void VoidConstMethod0() const {}
-  int IntMethod0() { return 1; }
-};
-
-class HasRef : public NoRef, public base::RefCounted<HasRef> {
-};
-
-class Parent {
- public:
-  void AddRef() const {}
-  void Release() const {}
-  virtual void VirtualSet() { value = kParentValue; }
-  void NonVirtualSet() { value = kParentValue; }
-  int value;
-};
-
-class Child : public Parent {
- public:
-  virtual void VirtualSet() { value = kChildValue; }
-  void NonVirtualSet() { value = kChildValue; }
-};
-
-class NoRefParent {
- public:
-  virtual void VirtualSet() { value = kParentValue; }
-  void NonVirtualSet() { value = kParentValue; }
-  int value;
-};
-
-class NoRefChild : public NoRefParent {
-  virtual void VirtualSet() { value = kChildValue; }
-  void NonVirtualSet() { value = kChildValue; }
-};
-
-template <typename T>
-T PolymorphicIdentity(T t) {
-  return t;
-}
-
-int UnwrapParentRef(Parent& p) {
-  return p.value;
-}
-
-template <typename T>
-void VoidPolymorphic1(T t) {
-}
-
-void TakesMoveOnly(std::unique_ptr<int>) {
-}
-
-struct NonEmptyFunctor {
-  int x;
-  void operator()() const {}
-};
-
-// TODO(hans): Remove .* and update the static_assert expectations once we roll
-// past Clang r313315. https://crbug.com/765692.
-
-#if defined(NCTEST_METHOD_ON_CONST_OBJECT)  // [r"fatal error: static_assert failed .*\"Bound argument \|i\| of type \|Arg\| cannot be forwarded as \|Unwrapped\| to the bound functor, which declares it as \|Param\|\.\""]
-
-// Method bound to const-object.
-//
-// Only const methods should be allowed to work with const objects.
-void WontCompile() {
-  HasRef has_ref;
-  const HasRef* const_has_ref_ptr_ = &has_ref;
-  Callback<void()> method_to_const_cb =
-      Bind(&HasRef::VoidMethod0, const_has_ref_ptr_);
-  method_to_const_cb.Run();
-}
-
-#elif defined(NCTEST_METHOD_BIND_NEEDS_REFCOUNTED_OBJECT)  // [r"fatal error: static_assert failed \"Receivers may not be raw pointers\."]
-
-
-// Method bound to non-refcounted object.
-//
-// We require refcounts unless you have Unretained().
-void WontCompile() {
-  NoRef no_ref;
-  Callback<void()> no_ref_cb =
-      Bind(&NoRef::VoidMethod0, &no_ref);
-  no_ref_cb.Run();
-}
-
-#elif defined(NCTEST_CONST_METHOD_NEEDS_REFCOUNTED_OBJECT)  // [r"fatal error: static_assert failed \"Receivers may not be raw pointers\."]
-
-// Const Method bound to non-refcounted object.
-//
-// We require refcounts unless you have Unretained().
-void WontCompile() {
-  NoRef no_ref;
-  Callback<void()> no_ref_const_cb =
-      Bind(&NoRef::VoidConstMethod0, &no_ref);
-  no_ref_const_cb.Run();
-}
-
-#elif defined(NCTEST_CONST_POINTER)  // [r"fatal error: static_assert failed .*\"Bound argument \|i\| of type \|Arg\| cannot be forwarded as \|Unwrapped\| to the bound functor, which declares it as \|Param\|\.\""]
-
-// Const argument used with non-const pointer parameter of same type.
-//
-// This is just a const-correctness check.
-void WontCompile() {
-  const NoRef* const_no_ref_ptr;
-  Callback<NoRef*()> pointer_same_cb =
-      Bind(&PolymorphicIdentity<NoRef*>, const_no_ref_ptr);
-  pointer_same_cb.Run();
-}
-
-#elif defined(NCTEST_CONST_POINTER_SUBTYPE)  // [r"fatal error: static_assert failed .*\"Bound argument \|i\| of type \|Arg\| cannot be forwarded as \|Unwrapped\| to the bound functor, which declares it as \|Param\|\.\""]
-
-// Const argument used with non-const pointer parameter of super type.
-//
-// This is just a const-correctness check.
-void WontCompile() {
-  const NoRefChild* const_child_ptr;
-  Callback<NoRefParent*()> pointer_super_cb =
-    Bind(&PolymorphicIdentity<NoRefParent*>, const_child_ptr);
-  pointer_super_cb.Run();
-}
-
-#elif defined(DISABLED_NCTEST_DISALLOW_NON_CONST_REF_PARAM)  // [r"fatal error: no member named 'AddRef' in 'base::NoRef'"]
-// TODO(dcheng): I think there's a type safety promotion issue here where we can
-// pass a const ref to a non const-ref function, or vice versa accidentally. Or
-// we make a copy accidentally. Check.
-
-// Functions with reference parameters, unsupported.
-//
-// First, non-const reference parameters are disallowed by the Google
-// style guide. Second, since we are doing argument forwarding it becomes
-// very tricky to avoid copies, maintain const correctness, and not
-// accidentally have the function be modifying a temporary, or a copy.
-void WontCompile() {
-  Parent p;
-  Callback<int(Parent&)> ref_arg_cb = Bind(&UnwrapParentRef);
-  ref_arg_cb.Run(p);
-}
-
-#elif defined(NCTEST_DISALLOW_BIND_TO_NON_CONST_REF_PARAM)  // [r"fatal error: static_assert failed .*\"Bound argument \|i\| of type \|Arg\| cannot be forwarded as \|Unwrapped\| to the bound functor, which declares it as \|Param\|\.\""]
-
-// Binding functions with reference parameters, unsupported.
-//
-// See comment in NCTEST_DISALLOW_NON_CONST_REF_PARAM
-void WontCompile() {
-  Parent p;
-  Callback<int()> ref_cb = Bind(&UnwrapParentRef, p);
-  ref_cb.Run();
-}
-
-#elif defined(NCTEST_NO_IMPLICIT_ARRAY_PTR_CONVERSION)  // [r"fatal error: static_assert failed .*\"First bound argument to a method cannot be an array\.\""]
-
-// A method should not be bindable with an array of objects.
-//
-// This is likely not wanted behavior. We specifically check for it though
-// because it is possible, depending on how you implement prebinding, to
-// implicitly convert an array type to a pointer type.
-void WontCompile() {
-  HasRef p[10];
-  Callback<void()> method_bound_to_array_cb =
-      Bind(&HasRef::VoidMethod0, p);
-  method_bound_to_array_cb.Run();
-}
-
-#elif defined(NCTEST_NO_RVALUE_RAW_PTR_FOR_REFCOUNTED_TYPES)  // [r"fatal error: static_assert failed .*\"A parameter is a refcounted type and needs scoped_refptr\.\""]
-
-// Refcounted types should not be bound as a raw pointer.
-void WontCompile() {
-  HasRef for_raw_ptr;
-  int a;
-  Callback<void()> ref_count_as_raw_ptr_a =
-      Bind(&VoidPolymorphic1<int*>, &a);
-  Callback<void()> ref_count_as_raw_ptr =
-      Bind(&VoidPolymorphic1<HasRef*>, &for_raw_ptr);
-}
-
-#elif defined(NCTEST_NO_LVALUE_RAW_PTR_FOR_REFCOUNTED_TYPES)  // [r"fatal error: static_assert failed .*\"A parameter is a refcounted type and needs scoped_refptr\.\""]
-
-// Refcounted types should not be bound as a raw pointer.
-void WontCompile() {
-  HasRef* for_raw_ptr = nullptr;
-  Callback<void()> ref_count_as_raw_ptr =
-      Bind(&VoidPolymorphic1<HasRef*>, for_raw_ptr);
-}
-
-#elif defined(NCTEST_NO_RVALUE_CONST_RAW_PTR_FOR_REFCOUNTED_TYPES)  // [r"fatal error: static_assert failed .*\"A parameter is a refcounted type and needs scoped_refptr\.\""]
-
-// Refcounted types should not be bound as a raw pointer.
-void WontCompile() {
-  const HasRef for_raw_ptr;
-  Callback<void()> ref_count_as_raw_ptr =
-      Bind(&VoidPolymorphic1<const HasRef*>, &for_raw_ptr);
-}
-
-#elif defined(NCTEST_NO_LVALUE_CONST_RAW_PTR_FOR_REFCOUNTED_TYPES)  // [r"fatal error: static_assert failed .*\"A parameter is a refcounted type and needs scoped_refptr\.\""]
-
-// Refcounted types should not be bound as a raw pointer.
-void WontCompile() {
-  const HasRef* for_raw_ptr = nullptr;
-  Callback<void()> ref_count_as_raw_ptr =
-      Bind(&VoidPolymorphic1<const HasRef*>, for_raw_ptr);
-}
-
-#elif defined(NCTEST_WEAKPTR_BIND_MUST_RETURN_VOID)  // [r"fatal error: static_assert failed .*\"weak_ptrs can only bind to methods without return values\""]
-
-// WeakPtrs cannot be bound to methods with return types.
-void WontCompile() {
-  NoRef no_ref;
-  WeakPtrFactory<NoRef> weak_factory(&no_ref);
-  Callback<int()> weak_ptr_with_non_void_return_type =
-      Bind(&NoRef::IntMethod0, weak_factory.GetWeakPtr());
-  weak_ptr_with_non_void_return_type.Run();
-}
-
-#elif defined(NCTEST_DISALLOW_ASSIGN_DIFFERENT_TYPES)  // [r"fatal error: no viable conversion from 'Callback<MakeUnboundRunType<void \(\*\)\(int\)>>' to 'Callback<void \(\)>'"]
-
-// Bind result cannot be assigned to Callbacks with a mismatching type.
-void WontCompile() {
-  Closure callback_mismatches_bind_type = Bind(&VoidPolymorphic1<int>);
-}
-
-#elif defined(NCTEST_DISALLOW_CAPTURING_LAMBDA)  // [r"fatal error: implicit instantiation of undefined template 'base::internal::FunctorTraits<\(lambda at (\.\./)+base/bind_unittest.nc:[0-9]+:[0-9]+\), void>'"]
-
-void WontCompile() {
-  int i = 0, j = 0;
-  Bind([i,&j]() {j = i;});
-}
-
-#elif defined(NCTEST_DISALLOW_ONCECALLBACK_RUN_ON_LVALUE)  // [r"static_assert failed .*\"OnceCallback::Run\(\) may only be invoked on a non-const rvalue, i\.e\. std::move\(callback\)\.Run\(\)\.\""]
-
-void WontCompile() {
-  OnceClosure cb = Bind([] {});
-  cb.Run();
-}
-
-#elif defined(NCTEST_DISALLOW_ONCECALLBACK_RUN_ON_CONST_LVALUE)  // [r"static_assert failed .*\"OnceCallback::Run\(\) may only be invoked on a non-const rvalue, i\.e\. std::move\(callback\)\.Run\(\)\.\""]
-
-void WontCompile() {
-  const OnceClosure cb = Bind([] {});
-  cb.Run();
-}
-
-#elif defined(NCTEST_DISALLOW_ONCECALLBACK_RUN_ON_CONST_RVALUE)  // [r"static_assert failed .*\"OnceCallback::Run\(\) may only be invoked on a non-const rvalue, i\.e\. std::move\(callback\)\.Run\(\)\.\""]
-
-void WontCompile() {
-  const OnceClosure cb = Bind([] {});
-  std::move(cb).Run();
-}
-
-#elif defined(NCTEST_DISALLOW_BIND_ONCECALLBACK)  // [r"fatal error: static_assert failed .*\"BindRepeating cannot bind OnceCallback. Use BindOnce with std::move\(\)\.\""]
-
-void WontCompile() {
-  Bind(BindOnce([](int) {}), 42);
-}
-
-#elif defined(NCTEST_DISALLOW_BINDONCE_LVALUE_ONCECALLBACK)  // [r"fatal error: static_assert failed .*\"BindOnce requires non-const rvalue for OnceCallback binding\."]
-void WontCompile() {
-  auto cb = BindOnce([](int) {});
-  BindOnce(cb, 42);
-}
-
-#elif defined(NCTEST_DISALLOW_BINDONCE_RVALUE_CONST_ONCECALLBACK)  // [r"fatal error: static_assert failed .*\"BindOnce requires non-const rvalue for OnceCallback binding\."]
-
-void WontCompile() {
-  const auto cb = BindOnce([](int) {});
-  BindOnce(std::move(cb), 42);
-}
-
-#elif defined(NCTEST_BINDONCE_MOVEONLY_TYPE_BY_VALUE)  // [r"fatal error: static_assert failed .*\"Bound argument \|i\| is move-only but will be bound by copy\. Ensure \|Arg\| is mutable and bound using std::move\(\)\.\""]
-
-void WontCompile() {
-  std::unique_ptr<int> x;
-  BindOnce(&TakesMoveOnly, x);
-}
-
-#elif defined(NCTEST_BIND_MOVEONLY_TYPE_BY_VALUE)  // [r"Bound argument \|i\| is move-only but will be forwarded by copy\. Ensure \|Arg\| is bound using base::Passed\(\), not std::move\(\)."]
-
-void WontCompile() {
-  std::unique_ptr<int> x;
-  Bind(&TakesMoveOnly, x);
-}
-
-#elif defined(NCTEST_BIND_MOVEONLY_TYPE_WITH_STDMOVE)  // [r"Bound argument \|i\| is move-only but will be forwarded by copy\. Ensure \|Arg\| is bound using base::Passed\(\), not std::move\(\)."]
-
-void WontCompile() {
-  std::unique_ptr<int> x;
-  Bind(&TakesMoveOnly, std::move(x));
-}
-
-#elif defined(NCTEST_BIND_NON_EMPTY_FUNCTOR)  // [r"fatal error: implicit instantiation of undefined template 'base::internal::FunctorTraits<base::NonEmptyFunctor, void>'"]
-
-void WontCompile() {
-  Bind(NonEmptyFunctor());
-}
-
-#endif
-
-}  // namespace base
diff --git a/base/bit_cast_unittest.cc b/base/bit_cast_unittest.cc
deleted file mode 100644
index f36d3fe..0000000
--- a/base/bit_cast_unittest.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-#include "base/bit_cast.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-TEST(BitCastTest, FloatIntFloat) {
-  float f = 3.1415926f;
-  int i = bit_cast<int32_t>(f);
-  float f2 = bit_cast<float>(i);
-  EXPECT_EQ(f, f2);
-}
-
-struct A {
-  int x;
-};
-
-TEST(BitCastTest, StructureInt) {
-  A a = { 1 };
-  int b = bit_cast<int>(a);
-  EXPECT_EQ(1, b);
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/bits_unittest.cc b/base/bits_unittest.cc
deleted file mode 100644
index ceaad3f..0000000
--- a/base/bits_unittest.cc
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains the unit tests for the bit utilities.
-
-#include "base/bits.h"
-#include "build_config.h"
-
-#include <stddef.h>
-
-#include <limits>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace bits {
-
-TEST(BitsTest, Log2Floor) {
-  EXPECT_EQ(-1, Log2Floor(0));
-  EXPECT_EQ(0, Log2Floor(1));
-  EXPECT_EQ(1, Log2Floor(2));
-  EXPECT_EQ(1, Log2Floor(3));
-  EXPECT_EQ(2, Log2Floor(4));
-  for (int i = 3; i < 31; ++i) {
-    unsigned int value = 1U << i;
-    EXPECT_EQ(i, Log2Floor(value));
-    EXPECT_EQ(i, Log2Floor(value + 1));
-    EXPECT_EQ(i, Log2Floor(value + 2));
-    EXPECT_EQ(i - 1, Log2Floor(value - 1));
-    EXPECT_EQ(i - 1, Log2Floor(value - 2));
-  }
-  EXPECT_EQ(31, Log2Floor(0xffffffffU));
-}
-
-TEST(BitsTest, Log2Ceiling) {
-  EXPECT_EQ(-1, Log2Ceiling(0));
-  EXPECT_EQ(0, Log2Ceiling(1));
-  EXPECT_EQ(1, Log2Ceiling(2));
-  EXPECT_EQ(2, Log2Ceiling(3));
-  EXPECT_EQ(2, Log2Ceiling(4));
-  for (int i = 3; i < 31; ++i) {
-    unsigned int value = 1U << i;
-    EXPECT_EQ(i, Log2Ceiling(value));
-    EXPECT_EQ(i + 1, Log2Ceiling(value + 1));
-    EXPECT_EQ(i + 1, Log2Ceiling(value + 2));
-    EXPECT_EQ(i, Log2Ceiling(value - 1));
-    EXPECT_EQ(i, Log2Ceiling(value - 2));
-  }
-  EXPECT_EQ(32, Log2Ceiling(0xffffffffU));
-}
-
-TEST(BitsTest, Align) {
-  const size_t kSizeTMax = std::numeric_limits<size_t>::max();
-  EXPECT_EQ(0ul, Align(0, 4));
-  EXPECT_EQ(4ul, Align(1, 4));
-  EXPECT_EQ(4096ul, Align(1, 4096));
-  EXPECT_EQ(4096ul, Align(4096, 4096));
-  EXPECT_EQ(4096ul, Align(4095, 4096));
-  EXPECT_EQ(8192ul, Align(4097, 4096));
-  EXPECT_EQ(kSizeTMax - 31, Align(kSizeTMax - 62, 32));
-  EXPECT_EQ(kSizeTMax / 2 + 1, Align(1, kSizeTMax / 2 + 1));
-}
-
-TEST(BitsTest, CountLeadingZeroBits8) {
-  EXPECT_EQ(8u, CountLeadingZeroBits(uint8_t{0}));
-  EXPECT_EQ(7u, CountLeadingZeroBits(uint8_t{1}));
-  for (uint8_t shift = 0; shift <= 7; shift++) {
-    EXPECT_EQ(7u - shift,
-              CountLeadingZeroBits(static_cast<uint8_t>(1 << shift)));
-  }
-  EXPECT_EQ(4u, CountLeadingZeroBits(uint8_t{0x0f}));
-}
-
-TEST(BitsTest, CountLeadingZeroBits16) {
-  EXPECT_EQ(16u, CountLeadingZeroBits(uint16_t{0}));
-  EXPECT_EQ(15u, CountLeadingZeroBits(uint16_t{1}));
-  for (uint16_t shift = 0; shift <= 15; shift++) {
-    EXPECT_EQ(15u - shift,
-              CountLeadingZeroBits(static_cast<uint16_t>(1 << shift)));
-  }
-  EXPECT_EQ(4u, CountLeadingZeroBits(uint16_t{0x0f0f}));
-}
-
-TEST(BitsTest, CountLeadingZeroBits32) {
-  EXPECT_EQ(32u, CountLeadingZeroBits(uint32_t{0}));
-  EXPECT_EQ(31u, CountLeadingZeroBits(uint32_t{1}));
-  for (uint32_t shift = 0; shift <= 31; shift++) {
-    EXPECT_EQ(31u - shift, CountLeadingZeroBits(uint32_t{1} << shift));
-  }
-  EXPECT_EQ(4u, CountLeadingZeroBits(uint32_t{0x0f0f0f0f}));
-}
-
-TEST(BitsTest, CountTrailingeZeroBits8) {
-  EXPECT_EQ(8u, CountTrailingZeroBits(uint8_t{0}));
-  EXPECT_EQ(7u, CountTrailingZeroBits(uint8_t{128}));
-  for (uint8_t shift = 0; shift <= 7; shift++) {
-    EXPECT_EQ(shift, CountTrailingZeroBits(static_cast<uint8_t>(1 << shift)));
-  }
-  EXPECT_EQ(4u, CountTrailingZeroBits(uint8_t{0xf0}));
-}
-
-TEST(BitsTest, CountTrailingeZeroBits16) {
-  EXPECT_EQ(16u, CountTrailingZeroBits(uint16_t{0}));
-  EXPECT_EQ(15u, CountTrailingZeroBits(uint16_t{32768}));
-  for (uint16_t shift = 0; shift <= 15; shift++) {
-    EXPECT_EQ(shift, CountTrailingZeroBits(static_cast<uint16_t>(1 << shift)));
-  }
-  EXPECT_EQ(4u, CountTrailingZeroBits(uint16_t{0xf0f0}));
-}
-
-TEST(BitsTest, CountTrailingeZeroBits32) {
-  EXPECT_EQ(32u, CountTrailingZeroBits(uint32_t{0}));
-  EXPECT_EQ(31u, CountTrailingZeroBits(uint32_t{1} << 31));
-  for (uint32_t shift = 0; shift <= 31; shift++) {
-    EXPECT_EQ(shift, CountTrailingZeroBits(uint32_t{1} << shift));
-  }
-  EXPECT_EQ(4u, CountTrailingZeroBits(uint32_t{0xf0f0f0f0}));
-}
-
-#if defined(ARCH_CPU_64_BITS)
-
-TEST(BitsTest, CountLeadingZeroBits64) {
-  EXPECT_EQ(64u, CountLeadingZeroBits(uint64_t{0}));
-  EXPECT_EQ(63u, CountLeadingZeroBits(uint64_t{1}));
-  for (uint64_t shift = 0; shift <= 63; shift++) {
-    EXPECT_EQ(63u - shift, CountLeadingZeroBits(uint64_t{1} << shift));
-  }
-  EXPECT_EQ(4u, CountLeadingZeroBits(uint64_t{0x0f0f0f0f0f0f0f0f}));
-}
-
-TEST(BitsTest, CountTrailingeZeroBits64) {
-  EXPECT_EQ(64u, CountTrailingZeroBits(uint64_t{0}));
-  EXPECT_EQ(63u, CountTrailingZeroBits(uint64_t{1} << 63));
-  for (uint64_t shift = 0; shift <= 31; shift++) {
-    EXPECT_EQ(shift, CountTrailingZeroBits(uint64_t{1} << shift));
-  }
-  EXPECT_EQ(4u, CountTrailingZeroBits(uint64_t{0xf0f0f0f0f0f0f0f0}));
-}
-
-#endif  // ARCH_CPU_64_BITS
-
-TEST(BitsTest, CountLeadingZeroBitsSizeT) {
-#if defined(ARCH_CPU_64_BITS)
-  EXPECT_EQ(64u, CountLeadingZeroBitsSizeT(size_t{0}));
-  EXPECT_EQ(63u, CountLeadingZeroBitsSizeT(size_t{1}));
-  EXPECT_EQ(32u, CountLeadingZeroBitsSizeT(size_t{1} << 31));
-  EXPECT_EQ(1u, CountLeadingZeroBitsSizeT(size_t{1} << 62));
-  EXPECT_EQ(0u, CountLeadingZeroBitsSizeT(size_t{1} << 63));
-#else
-  EXPECT_EQ(32u, CountLeadingZeroBitsSizeT(size_t{0}));
-  EXPECT_EQ(31u, CountLeadingZeroBitsSizeT(size_t{1}));
-  EXPECT_EQ(1u, CountLeadingZeroBitsSizeT(size_t{1} << 30));
-  EXPECT_EQ(0u, CountLeadingZeroBitsSizeT(size_t{1} << 31));
-#endif  // ARCH_CPU_64_BITS
-}
-
-TEST(BitsTest, CountTrailingZeroBitsSizeT) {
-#if defined(ARCH_CPU_64_BITS)
-  EXPECT_EQ(64u, CountTrailingZeroBitsSizeT(size_t{0}));
-  EXPECT_EQ(63u, CountTrailingZeroBitsSizeT(size_t{1} << 63));
-  EXPECT_EQ(31u, CountTrailingZeroBitsSizeT(size_t{1} << 31));
-  EXPECT_EQ(1u, CountTrailingZeroBitsSizeT(size_t{2}));
-  EXPECT_EQ(0u, CountTrailingZeroBitsSizeT(size_t{1}));
-#else
-  EXPECT_EQ(32u, CountTrailingZeroBitsSizeT(size_t{0}));
-  EXPECT_EQ(31u, CountTrailingZeroBitsSizeT(size_t{1} << 31));
-  EXPECT_EQ(1u, CountTrailingZeroBitsSizeT(size_t{2}));
-  EXPECT_EQ(0u, CountTrailingZeroBitsSizeT(size_t{1}));
-#endif  // ARCH_CPU_64_BITS
-}
-
-TEST(BitsTest, PowerOfTwo) {
-  EXPECT_FALSE(IsPowerOfTwo(-1));
-  EXPECT_FALSE(IsPowerOfTwo(0));
-  EXPECT_TRUE(IsPowerOfTwo(1));
-  EXPECT_TRUE(IsPowerOfTwo(2));
-  // Unsigned 64 bit cases.
-  for (uint32_t i = 2; i < 64; i++) {
-    const uint64_t val = uint64_t{1} << i;
-    EXPECT_FALSE(IsPowerOfTwo(val - 1));
-    EXPECT_TRUE(IsPowerOfTwo(val));
-    EXPECT_FALSE(IsPowerOfTwo(val + 1));
-  }
-  // Signed 64 bit cases.
-  for (uint32_t i = 2; i < 63; i++) {
-    const int64_t val = int64_t{1} << i;
-    EXPECT_FALSE(IsPowerOfTwo(val - 1));
-    EXPECT_TRUE(IsPowerOfTwo(val));
-    EXPECT_FALSE(IsPowerOfTwo(val + 1));
-  }
-  // Signed integers with only the last bit set are negative, not powers of two.
-  EXPECT_FALSE(IsPowerOfTwo(int64_t{1} << 63));
-}
-
-}  // namespace bits
-}  // namespace base
diff --git a/base/callback_helpers_unittest.cc b/base/callback_helpers_unittest.cc
deleted file mode 100644
index 1c1102d..0000000
--- a/base/callback_helpers_unittest.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/callback_helpers.h"
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-void Increment(int* value) {
-  (*value)++;
-}
-
-TEST(CallbackHelpersTest, TestResetAndReturn) {
-  int run_count = 0;
-
-  base::Closure cb = base::Bind(&Increment, &run_count);
-  EXPECT_EQ(0, run_count);
-  base::ResetAndReturn(&cb).Run();
-  EXPECT_EQ(1, run_count);
-  EXPECT_FALSE(cb);
-
-  run_count = 0;
-
-  base::OnceClosure cb2 = base::BindOnce(&Increment, &run_count);
-  EXPECT_EQ(0, run_count);
-  base::ResetAndReturn(&cb2).Run();
-  EXPECT_EQ(1, run_count);
-  EXPECT_FALSE(cb2);
-}
-
-TEST(CallbackHelpersTest, TestScopedClosureRunnerExitScope) {
-  int run_count = 0;
-  {
-    base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count));
-    EXPECT_EQ(0, run_count);
-  }
-  EXPECT_EQ(1, run_count);
-}
-
-TEST(CallbackHelpersTest, TestScopedClosureRunnerRelease) {
-  int run_count = 0;
-  base::OnceClosure c;
-  {
-    base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count));
-    c = runner.Release();
-    EXPECT_EQ(0, run_count);
-  }
-  EXPECT_EQ(0, run_count);
-  std::move(c).Run();
-  EXPECT_EQ(1, run_count);
-}
-
-TEST(CallbackHelpersTest, TestScopedClosureRunnerReplaceClosure) {
-  int run_count_1 = 0;
-  int run_count_2 = 0;
-  {
-    base::ScopedClosureRunner runner;
-    runner.ReplaceClosure(base::Bind(&Increment, &run_count_1));
-    runner.ReplaceClosure(base::Bind(&Increment, &run_count_2));
-    EXPECT_EQ(0, run_count_1);
-    EXPECT_EQ(0, run_count_2);
-  }
-  EXPECT_EQ(0, run_count_1);
-  EXPECT_EQ(1, run_count_2);
-}
-
-TEST(CallbackHelpersTest, TestScopedClosureRunnerRunAndReset) {
-  int run_count_3 = 0;
-  {
-    base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count_3));
-    EXPECT_EQ(0, run_count_3);
-    runner.RunAndReset();
-    EXPECT_EQ(1, run_count_3);
-  }
-  EXPECT_EQ(1, run_count_3);
-}
-
-TEST(CallbackHelpersTest, TestScopedClosureRunnerMoveConstructor) {
-  int run_count = 0;
-  {
-    std::unique_ptr<base::ScopedClosureRunner> runner(
-        new base::ScopedClosureRunner(base::Bind(&Increment, &run_count)));
-    base::ScopedClosureRunner runner2(std::move(*runner));
-    runner.reset();
-    EXPECT_EQ(0, run_count);
-  }
-  EXPECT_EQ(1, run_count);
-}
-
-TEST(CallbackHelpersTest, TestScopedClosureRunnerMoveAssignment) {
-  int run_count_1 = 0;
-  int run_count_2 = 0;
-  {
-    base::ScopedClosureRunner runner(base::Bind(&Increment, &run_count_1));
-    {
-      base::ScopedClosureRunner runner2(base::Bind(&Increment, &run_count_2));
-      runner = std::move(runner2);
-      EXPECT_EQ(0, run_count_1);
-      EXPECT_EQ(0, run_count_2);
-    }
-    EXPECT_EQ(0, run_count_1);
-    EXPECT_EQ(0, run_count_2);
-  }
-  EXPECT_EQ(0, run_count_1);
-  EXPECT_EQ(1, run_count_2);
-}
-
-TEST(CallbackHelpersTest, TestAdaptCallbackForRepeating) {
-  int count = 0;
-  base::OnceCallback<void(int*)> cb =
-      base::BindOnce([](int* count) { ++*count; });
-
-  base::RepeatingCallback<void(int*)> wrapped =
-      base::AdaptCallbackForRepeating(std::move(cb));
-
-  EXPECT_EQ(0, count);
-  wrapped.Run(&count);
-  EXPECT_EQ(1, count);
-  wrapped.Run(&count);
-  EXPECT_EQ(1, count);
-}
-
-}  // namespace
diff --git a/base/callback_list_unittest.cc b/base/callback_list_unittest.cc
deleted file mode 100644
index 6eb5ff7..0000000
--- a/base/callback_list_unittest.cc
+++ /dev/null
@@ -1,339 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/callback_list.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/macros.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-class Listener {
- public:
-  Listener() : total_(0), scaler_(1) {}
-  explicit Listener(int scaler) : total_(0), scaler_(scaler) {}
-  void IncrementTotal() { total_++; }
-  void IncrementByMultipleOfScaler(int x) { total_ += x * scaler_; }
-
-  int total() const { return total_; }
-
- private:
-  int total_;
-  int scaler_;
-  DISALLOW_COPY_AND_ASSIGN(Listener);
-};
-
-class Remover {
- public:
-  Remover() : total_(0) {}
-  void IncrementTotalAndRemove() {
-    total_++;
-    removal_subscription_.reset();
-  }
-  void SetSubscriptionToRemove(
-      std::unique_ptr<CallbackList<void(void)>::Subscription> sub) {
-    removal_subscription_ = std::move(sub);
-  }
-
-  int total() const { return total_; }
-
- private:
-  int total_;
-  std::unique_ptr<CallbackList<void(void)>::Subscription> removal_subscription_;
-  DISALLOW_COPY_AND_ASSIGN(Remover);
-};
-
-class Adder {
- public:
-  explicit Adder(CallbackList<void(void)>* cb_reg)
-      : added_(false),
-        total_(0),
-        cb_reg_(cb_reg) {
-  }
-  void AddCallback() {
-    if (!added_) {
-      added_ = true;
-      subscription_ =
-          cb_reg_->Add(Bind(&Adder::IncrementTotal, Unretained(this)));
-    }
-  }
-  void IncrementTotal() { total_++; }
-
-  bool added() const { return added_; }
-
-  int total() const { return total_; }
-
- private:
-  bool added_;
-  int total_;
-  CallbackList<void(void)>* cb_reg_;
-  std::unique_ptr<CallbackList<void(void)>::Subscription> subscription_;
-  DISALLOW_COPY_AND_ASSIGN(Adder);
-};
-
-class Summer {
- public:
-  Summer() : value_(0) {}
-
-  void AddOneParam(int a) { value_ = a; }
-  void AddTwoParam(int a, int b) { value_ = a + b; }
-  void AddThreeParam(int a, int b, int c) { value_ = a + b + c; }
-  void AddFourParam(int a, int b, int c, int d) { value_ = a + b + c + d; }
-  void AddFiveParam(int a, int b, int c, int d, int e) {
-    value_ = a + b + c + d + e;
-  }
-  void AddSixParam(int a, int b, int c, int d, int e , int f) {
-    value_ = a + b + c + d + e + f;
-  }
-
-  int value() const { return value_; }
-
- private:
-  int value_;
-  DISALLOW_COPY_AND_ASSIGN(Summer);
-};
-
-class Counter {
- public:
-  Counter() : value_(0) {}
-
-  void Increment() { value_++; }
-
-  int value() const { return value_; }
-
- private:
-  int value_;
-  DISALLOW_COPY_AND_ASSIGN(Counter);
-};
-
-// Sanity check that we can instantiate a CallbackList for each arity.
-TEST(CallbackListTest, ArityTest) {
-  Summer s;
-
-  CallbackList<void(int)> c1;
-  std::unique_ptr<CallbackList<void(int)>::Subscription> subscription1 =
-      c1.Add(Bind(&Summer::AddOneParam, Unretained(&s)));
-
-  c1.Notify(1);
-  EXPECT_EQ(1, s.value());
-
-  CallbackList<void(int, int)> c2;
-  std::unique_ptr<CallbackList<void(int, int)>::Subscription> subscription2 =
-      c2.Add(Bind(&Summer::AddTwoParam, Unretained(&s)));
-
-  c2.Notify(1, 2);
-  EXPECT_EQ(3, s.value());
-
-  CallbackList<void(int, int, int)> c3;
-  std::unique_ptr<CallbackList<void(int, int, int)>::Subscription>
-      subscription3 = c3.Add(Bind(&Summer::AddThreeParam, Unretained(&s)));
-
-  c3.Notify(1, 2, 3);
-  EXPECT_EQ(6, s.value());
-
-  CallbackList<void(int, int, int, int)> c4;
-  std::unique_ptr<CallbackList<void(int, int, int, int)>::Subscription>
-      subscription4 = c4.Add(Bind(&Summer::AddFourParam, Unretained(&s)));
-
-  c4.Notify(1, 2, 3, 4);
-  EXPECT_EQ(10, s.value());
-
-  CallbackList<void(int, int, int, int, int)> c5;
-  std::unique_ptr<CallbackList<void(int, int, int, int, int)>::Subscription>
-      subscription5 = c5.Add(Bind(&Summer::AddFiveParam, Unretained(&s)));
-
-  c5.Notify(1, 2, 3, 4, 5);
-  EXPECT_EQ(15, s.value());
-
-  CallbackList<void(int, int, int, int, int, int)> c6;
-  std::unique_ptr<
-      CallbackList<void(int, int, int, int, int, int)>::Subscription>
-      subscription6 = c6.Add(Bind(&Summer::AddSixParam, Unretained(&s)));
-
-  c6.Notify(1, 2, 3, 4, 5, 6);
-  EXPECT_EQ(21, s.value());
-}
-
-// Sanity check that closures added to the list will be run, and those removed
-// from the list will not be run.
-TEST(CallbackListTest, BasicTest) {
-  CallbackList<void(void)> cb_reg;
-  Listener a, b, c;
-
-  std::unique_ptr<CallbackList<void(void)>::Subscription> a_subscription =
-      cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&a)));
-  std::unique_ptr<CallbackList<void(void)>::Subscription> b_subscription =
-      cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&b)));
-
-  EXPECT_TRUE(a_subscription.get());
-  EXPECT_TRUE(b_subscription.get());
-
-  cb_reg.Notify();
-
-  EXPECT_EQ(1, a.total());
-  EXPECT_EQ(1, b.total());
-
-  b_subscription.reset();
-
-  std::unique_ptr<CallbackList<void(void)>::Subscription> c_subscription =
-      cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&c)));
-
-  cb_reg.Notify();
-
-  EXPECT_EQ(2, a.total());
-  EXPECT_EQ(1, b.total());
-  EXPECT_EQ(1, c.total());
-
-  a_subscription.reset();
-  b_subscription.reset();
-  c_subscription.reset();
-}
-
-// Sanity check that callbacks with details added to the list will be run, with
-// the correct details, and those removed from the list will not be run.
-TEST(CallbackListTest, BasicTestWithParams) {
-  CallbackList<void(int)> cb_reg;
-  Listener a(1), b(-1), c(1);
-
-  std::unique_ptr<CallbackList<void(int)>::Subscription> a_subscription =
-      cb_reg.Add(Bind(&Listener::IncrementByMultipleOfScaler, Unretained(&a)));
-  std::unique_ptr<CallbackList<void(int)>::Subscription> b_subscription =
-      cb_reg.Add(Bind(&Listener::IncrementByMultipleOfScaler, Unretained(&b)));
-
-  EXPECT_TRUE(a_subscription.get());
-  EXPECT_TRUE(b_subscription.get());
-
-  cb_reg.Notify(10);
-
-  EXPECT_EQ(10, a.total());
-  EXPECT_EQ(-10, b.total());
-
-  b_subscription.reset();
-
-  std::unique_ptr<CallbackList<void(int)>::Subscription> c_subscription =
-      cb_reg.Add(Bind(&Listener::IncrementByMultipleOfScaler, Unretained(&c)));
-
-  cb_reg.Notify(10);
-
-  EXPECT_EQ(20, a.total());
-  EXPECT_EQ(-10, b.total());
-  EXPECT_EQ(10, c.total());
-
-  a_subscription.reset();
-  b_subscription.reset();
-  c_subscription.reset();
-}
-
-// Test the a callback can remove itself or a different callback from the list
-// during iteration without invalidating the iterator.
-TEST(CallbackListTest, RemoveCallbacksDuringIteration) {
-  CallbackList<void(void)> cb_reg;
-  Listener a, b;
-  Remover remover_1, remover_2;
-
-  std::unique_ptr<CallbackList<void(void)>::Subscription> remover_1_sub =
-      cb_reg.Add(
-          Bind(&Remover::IncrementTotalAndRemove, Unretained(&remover_1)));
-  std::unique_ptr<CallbackList<void(void)>::Subscription> remover_2_sub =
-      cb_reg.Add(
-          Bind(&Remover::IncrementTotalAndRemove, Unretained(&remover_2)));
-  std::unique_ptr<CallbackList<void(void)>::Subscription> a_subscription =
-      cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&a)));
-  std::unique_ptr<CallbackList<void(void)>::Subscription> b_subscription =
-      cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&b)));
-
-  // |remover_1| will remove itself.
-  remover_1.SetSubscriptionToRemove(std::move(remover_1_sub));
-  // |remover_2| will remove a.
-  remover_2.SetSubscriptionToRemove(std::move(a_subscription));
-
-  cb_reg.Notify();
-
-  // |remover_1| runs once (and removes itself), |remover_2| runs once (and
-  // removes a), |a| never runs, and |b| runs once.
-  EXPECT_EQ(1, remover_1.total());
-  EXPECT_EQ(1, remover_2.total());
-  EXPECT_EQ(0, a.total());
-  EXPECT_EQ(1, b.total());
-
-  cb_reg.Notify();
-
-  // Only |remover_2| and |b| run this time.
-  EXPECT_EQ(1, remover_1.total());
-  EXPECT_EQ(2, remover_2.total());
-  EXPECT_EQ(0, a.total());
-  EXPECT_EQ(2, b.total());
-}
-
-// Test that a callback can add another callback to the list durning iteration
-// without invalidating the iterator. The newly added callback should be run on
-// the current iteration as will all other callbacks in the list.
-TEST(CallbackListTest, AddCallbacksDuringIteration) {
-  CallbackList<void(void)> cb_reg;
-  Adder a(&cb_reg);
-  Listener b;
-  std::unique_ptr<CallbackList<void(void)>::Subscription> a_subscription =
-      cb_reg.Add(Bind(&Adder::AddCallback, Unretained(&a)));
-  std::unique_ptr<CallbackList<void(void)>::Subscription> b_subscription =
-      cb_reg.Add(Bind(&Listener::IncrementTotal, Unretained(&b)));
-
-  cb_reg.Notify();
-
-  EXPECT_EQ(1, a.total());
-  EXPECT_EQ(1, b.total());
-  EXPECT_TRUE(a.added());
-
-  cb_reg.Notify();
-
-  EXPECT_EQ(2, a.total());
-  EXPECT_EQ(2, b.total());
-}
-
-// Sanity check: notifying an empty list is a no-op.
-TEST(CallbackListTest, EmptyList) {
-  CallbackList<void(void)> cb_reg;
-
-  cb_reg.Notify();
-}
-
-TEST(CallbackList, RemovalCallback) {
-  Counter remove_count;
-  CallbackList<void(void)> cb_reg;
-  cb_reg.set_removal_callback(
-      Bind(&Counter::Increment, Unretained(&remove_count)));
-
-  std::unique_ptr<CallbackList<void(void)>::Subscription> subscription =
-      cb_reg.Add(DoNothing());
-
-  // Removing a subscription outside of iteration signals the callback.
-  EXPECT_EQ(0, remove_count.value());
-  subscription.reset();
-  EXPECT_EQ(1, remove_count.value());
-
-  // Configure two subscriptions to remove themselves.
-  Remover remover_1, remover_2;
-  std::unique_ptr<CallbackList<void(void)>::Subscription> remover_1_sub =
-      cb_reg.Add(
-          Bind(&Remover::IncrementTotalAndRemove, Unretained(&remover_1)));
-  std::unique_ptr<CallbackList<void(void)>::Subscription> remover_2_sub =
-      cb_reg.Add(
-          Bind(&Remover::IncrementTotalAndRemove, Unretained(&remover_2)));
-  remover_1.SetSubscriptionToRemove(std::move(remover_1_sub));
-  remover_2.SetSubscriptionToRemove(std::move(remover_2_sub));
-
-  // The callback should be signaled exactly once.
-  EXPECT_EQ(1, remove_count.value());
-  cb_reg.Notify();
-  EXPECT_EQ(2, remove_count.value());
-  EXPECT_TRUE(cb_reg.empty());
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/callback_list_unittest.nc b/base/callback_list_unittest.nc
deleted file mode 100644
index 7347f76..0000000
--- a/base/callback_list_unittest.nc
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a "No Compile Test" suite.
-// http://dev.chromium.org/developers/testing/no-compile-tests
-
-#include "base/callback_list.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/macros.h"
-
-namespace base {
-
-class Foo {
- public:
-  Foo() {}
-  ~Foo() {}
-};
-
-class FooListener {
- public:
-  FooListener() {}
-
-  void GotAScopedFoo(std::unique_ptr<Foo> f) { foo_ = std::move(f); }
-
-  std::unique_ptr<Foo> foo_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FooListener);
-};
-
-
-#if defined(NCTEST_MOVE_ONLY_TYPE_PARAMETER)  // [r"fatal error: call to (implicitly-)?deleted( copy)? constructor"]
-
-// Callbacks run with a move-only typed parameter.
-//
-// CallbackList does not support move-only typed parameters. Notify() is
-// designed to take zero or more parameters, and run each registered callback
-// with them. With move-only types, the parameter will be set to NULL after the
-// first callback has been run.
-void WontCompile() {
-  FooListener f;
-  CallbackList<void(std::unique_ptr<Foo>)> c1;
-  std::unique_ptr<CallbackList<void(std::unique_ptr<Foo>)>::Subscription> sub =
-      c1.Add(Bind(&FooListener::GotAScopedFoo, Unretained(&f)));
-  c1.Notify(std::unique_ptr<Foo>(new Foo()));
-}
-
-#endif
-
-}  // namespace base
diff --git a/base/callback_unittest.cc b/base/callback_unittest.cc
deleted file mode 100644
index c07d3ee..0000000
--- a/base/callback_unittest.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/callback.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/callback_internal.h"
-#include "base/memory/ref_counted.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-void NopInvokeFunc() {}
-
-// White-box testpoints to inject into a Callback<> object for checking
-// comparators and emptiness APIs.  Use a BindState that is specialized
-// based on a type we declared in the anonymous namespace above to remove any
-// chance of colliding with another instantiation and breaking the
-// one-definition-rule.
-struct FakeBindState : internal::BindStateBase {
-  FakeBindState() : BindStateBase(&NopInvokeFunc, &Destroy, &IsCancelled) {}
-
- private:
-  ~FakeBindState() = default;
-  static void Destroy(const internal::BindStateBase* self) {
-    delete static_cast<const FakeBindState*>(self);
-  }
-  static bool IsCancelled(const internal::BindStateBase*) {
-    return false;
-  }
-};
-
-namespace {
-
-class CallbackTest : public ::testing::Test {
- public:
-  CallbackTest()
-      : callback_a_(new FakeBindState()), callback_b_(new FakeBindState()) {}
-
-  ~CallbackTest() override = default;
-
- protected:
-  Callback<void()> callback_a_;
-  const Callback<void()> callback_b_;  // Ensure APIs work with const.
-  Callback<void()> null_callback_;
-};
-
-// Ensure we can create unbound callbacks. We need this to be able to store
-// them in class members that can be initialized later.
-TEST_F(CallbackTest, DefaultConstruction) {
-  Callback<void()> c0;
-  Callback<void(int)> c1;
-  Callback<void(int,int)> c2;
-  Callback<void(int,int,int)> c3;
-  Callback<void(int,int,int,int)> c4;
-  Callback<void(int,int,int,int,int)> c5;
-  Callback<void(int,int,int,int,int,int)> c6;
-
-  EXPECT_TRUE(c0.is_null());
-  EXPECT_TRUE(c1.is_null());
-  EXPECT_TRUE(c2.is_null());
-  EXPECT_TRUE(c3.is_null());
-  EXPECT_TRUE(c4.is_null());
-  EXPECT_TRUE(c5.is_null());
-  EXPECT_TRUE(c6.is_null());
-}
-
-TEST_F(CallbackTest, IsNull) {
-  EXPECT_TRUE(null_callback_.is_null());
-  EXPECT_FALSE(callback_a_.is_null());
-  EXPECT_FALSE(callback_b_.is_null());
-}
-
-TEST_F(CallbackTest, Equals) {
-  EXPECT_TRUE(callback_a_.Equals(callback_a_));
-  EXPECT_FALSE(callback_a_.Equals(callback_b_));
-  EXPECT_FALSE(callback_b_.Equals(callback_a_));
-
-  // We should compare based on instance, not type.
-  Callback<void()> callback_c(new FakeBindState());
-  Callback<void()> callback_a2 = callback_a_;
-  EXPECT_TRUE(callback_a_.Equals(callback_a2));
-  EXPECT_FALSE(callback_a_.Equals(callback_c));
-
-  // Empty, however, is always equal to empty.
-  Callback<void()> empty2;
-  EXPECT_TRUE(null_callback_.Equals(empty2));
-}
-
-TEST_F(CallbackTest, Reset) {
-  // Resetting should bring us back to empty.
-  ASSERT_FALSE(callback_a_.is_null());
-  ASSERT_FALSE(callback_a_.Equals(null_callback_));
-
-  callback_a_.Reset();
-
-  EXPECT_TRUE(callback_a_.is_null());
-  EXPECT_TRUE(callback_a_.Equals(null_callback_));
-}
-
-TEST_F(CallbackTest, Move) {
-  // Moving should reset the callback.
-  ASSERT_FALSE(callback_a_.is_null());
-  ASSERT_FALSE(callback_a_.Equals(null_callback_));
-
-  auto tmp = std::move(callback_a_);
-
-  EXPECT_TRUE(callback_a_.is_null());
-  EXPECT_TRUE(callback_a_.Equals(null_callback_));
-}
-
-struct TestForReentrancy {
-  TestForReentrancy()
-      : cb_already_run(false),
-        cb(Bind(&TestForReentrancy::AssertCBIsNull, Unretained(this))) {
-  }
-  void AssertCBIsNull() {
-    ASSERT_TRUE(cb.is_null());
-    cb_already_run = true;
-  }
-  bool cb_already_run;
-  Closure cb;
-};
-
-TEST_F(CallbackTest, ResetAndReturn) {
-  TestForReentrancy tfr;
-  ASSERT_FALSE(tfr.cb.is_null());
-  ASSERT_FALSE(tfr.cb_already_run);
-  ResetAndReturn(&tfr.cb).Run();
-  ASSERT_TRUE(tfr.cb.is_null());
-  ASSERT_TRUE(tfr.cb_already_run);
-}
-
-TEST_F(CallbackTest, NullAfterMoveRun) {
-  Closure cb = Bind([] {});
-  ASSERT_TRUE(cb);
-  std::move(cb).Run();
-  ASSERT_FALSE(cb);
-
-  const Closure cb2 = Bind([] {});
-  ASSERT_TRUE(cb2);
-  std::move(cb2).Run();
-  ASSERT_TRUE(cb2);
-
-  OnceClosure cb3 = BindOnce([] {});
-  ASSERT_TRUE(cb3);
-  std::move(cb3).Run();
-  ASSERT_FALSE(cb3);
-}
-
-class CallbackOwner : public base::RefCounted<CallbackOwner> {
- public:
-  explicit CallbackOwner(bool* deleted) {
-    callback_ = Bind(&CallbackOwner::Unused, this);
-    deleted_ = deleted;
-  }
-  void Reset() {
-    callback_.Reset();
-    // We are deleted here if no-one else had a ref to us.
-  }
-
- private:
-  friend class base::RefCounted<CallbackOwner>;
-  virtual ~CallbackOwner() {
-    *deleted_ = true;
-  }
-  void Unused() {
-    FAIL() << "Should never be called";
-  }
-
-  Closure callback_;
-  bool* deleted_;
-};
-
-TEST_F(CallbackTest, CallbackHasLastRefOnContainingObject) {
-  bool deleted = false;
-  CallbackOwner* owner = new CallbackOwner(&deleted);
-  owner->Reset();
-  ASSERT_TRUE(deleted);
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/callback_unittest.nc b/base/callback_unittest.nc
deleted file mode 100644
index 3261529..0000000
--- a/base/callback_unittest.nc
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a "No Compile Test" suite.
-// http://dev.chromium.org/developers/testing/no-compile-tests
-
-#include "base/callback.h"
-
-namespace base {
-
-class Parent {
-};
-
-class Child : Parent {
-};
-
-#if defined(NCTEST_EQUALS_REQUIRES_SAMETYPE)  // [r"fatal error: no viable conversion from 'RepeatingCallback<int \(\)>' to 'const RepeatingCallback<void \(\)>'"]
-
-// Attempting to call comparison function on two callbacks of different type.
-//
-// This should be a compile time failure because each callback type should be
-// considered distinct.
-void WontCompile() {
-  Closure c1;
-  Callback<int()> c2;
-  c1.Equals(c2);
-}
-
-#elif defined(NCTEST_CONSTRUCTION_FROM_SUBTYPE)  // [r"fatal error: no viable conversion from 'Callback<base::Parent \(\)>' to 'Callback<base::Child \(\)>'"]
-
-// Construction of Callback<A> from Callback<B> if A is supertype of B.
-//
-// While this is technically safe, most people aren't used to it when coding
-// C++ so if this is happening, it is almost certainly an error.
-void WontCompile() {
-  Callback<Parent()> cb_a;
-  Callback<Child()> cb_b = cb_a;
-}
-
-#elif defined(NCTEST_ASSIGNMENT_FROM_SUBTYPE)  // [r"fatal error: no viable overloaded '='"]
-
-// Assignment of Callback<A> from Callback<B> if A is supertype of B.
-// See explanation for NCTEST_CONSTRUCTION_FROM_SUBTYPE
-void WontCompile() {
-  Callback<Parent()> cb_a;
-  Callback<Child()> cb_b;
-  cb_a = cb_b;
-}
-
-#endif
-
-}  // namespace base
diff --git a/base/cancelable_callback_unittest.cc b/base/cancelable_callback_unittest.cc
deleted file mode 100644
index 373498c..0000000
--- a/base/cancelable_callback_unittest.cc
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/cancelable_callback.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/location.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-class TestRefCounted : public RefCountedThreadSafe<TestRefCounted> {
- private:
-  friend class RefCountedThreadSafe<TestRefCounted>;
-  ~TestRefCounted() = default;
-  ;
-};
-
-void Increment(int* count) { (*count)++; }
-void IncrementBy(int* count, int n) { (*count) += n; }
-void RefCountedParam(const scoped_refptr<TestRefCounted>& ref_counted) {}
-
-void OnMoveOnlyReceived(int* value, std::unique_ptr<int> result) {
-  *value = *result;
-}
-
-// Cancel().
-//  - Callback can be run multiple times.
-//  - After Cancel(), Run() completes but has no effect.
-TEST(CancelableCallbackTest, Cancel) {
-  int count = 0;
-  CancelableClosure cancelable(
-      base::Bind(&Increment, base::Unretained(&count)));
-
-  base::Closure callback = cancelable.callback();
-  callback.Run();
-  EXPECT_EQ(1, count);
-
-  callback.Run();
-  EXPECT_EQ(2, count);
-
-  cancelable.Cancel();
-  callback.Run();
-  EXPECT_EQ(2, count);
-}
-
-// Cancel() called multiple times.
-//  - Cancel() cancels all copies of the wrapped callback.
-//  - Calling Cancel() more than once has no effect.
-//  - After Cancel(), callback() returns a null callback.
-TEST(CancelableCallbackTest, MultipleCancel) {
-  int count = 0;
-  CancelableClosure cancelable(
-      base::Bind(&Increment, base::Unretained(&count)));
-
-  base::Closure callback1 = cancelable.callback();
-  base::Closure callback2 = cancelable.callback();
-  cancelable.Cancel();
-
-  callback1.Run();
-  EXPECT_EQ(0, count);
-
-  callback2.Run();
-  EXPECT_EQ(0, count);
-
-  // Calling Cancel() again has no effect.
-  cancelable.Cancel();
-
-  // callback() of a cancelled callback is null.
-  base::Closure callback3 = cancelable.callback();
-  EXPECT_TRUE(callback3.is_null());
-}
-
-// CancelableCallback destroyed before callback is run.
-//  - Destruction of CancelableCallback cancels outstanding callbacks.
-TEST(CancelableCallbackTest, CallbackCanceledOnDestruction) {
-  int count = 0;
-  base::Closure callback;
-
-  {
-    CancelableClosure cancelable(
-        base::Bind(&Increment, base::Unretained(&count)));
-
-    callback = cancelable.callback();
-    callback.Run();
-    EXPECT_EQ(1, count);
-  }
-
-  callback.Run();
-  EXPECT_EQ(1, count);
-}
-
-// Cancel() called on bound closure with a RefCounted parameter.
-//  - Cancel drops wrapped callback (and, implicitly, its bound arguments).
-TEST(CancelableCallbackTest, CancelDropsCallback) {
-  scoped_refptr<TestRefCounted> ref_counted = new TestRefCounted;
-  EXPECT_TRUE(ref_counted->HasOneRef());
-
-  CancelableClosure cancelable(base::Bind(RefCountedParam, ref_counted));
-  EXPECT_FALSE(cancelable.IsCancelled());
-  EXPECT_TRUE(ref_counted.get());
-  EXPECT_FALSE(ref_counted->HasOneRef());
-
-  // There is only one reference to |ref_counted| after the Cancel().
-  cancelable.Cancel();
-  EXPECT_TRUE(cancelable.IsCancelled());
-  EXPECT_TRUE(ref_counted.get());
-  EXPECT_TRUE(ref_counted->HasOneRef());
-}
-
-// Reset().
-//  - Reset() replaces the existing wrapped callback with a new callback.
-//  - Reset() deactivates outstanding callbacks.
-TEST(CancelableCallbackTest, Reset) {
-  int count = 0;
-  CancelableClosure cancelable(
-      base::Bind(&Increment, base::Unretained(&count)));
-
-  base::Closure callback = cancelable.callback();
-  callback.Run();
-  EXPECT_EQ(1, count);
-
-  callback.Run();
-  EXPECT_EQ(2, count);
-
-  cancelable.Reset(
-      base::Bind(&IncrementBy, base::Unretained(&count), 3));
-  EXPECT_FALSE(cancelable.IsCancelled());
-
-  // The stale copy of the cancelable callback is non-null.
-  ASSERT_FALSE(callback.is_null());
-
-  // The stale copy of the cancelable callback is no longer active.
-  callback.Run();
-  EXPECT_EQ(2, count);
-
-  base::Closure callback2 = cancelable.callback();
-  ASSERT_FALSE(callback2.is_null());
-
-  callback2.Run();
-  EXPECT_EQ(5, count);
-}
-
-// IsCanceled().
-//  - Cancel() transforms the CancelableCallback into a cancelled state.
-TEST(CancelableCallbackTest, IsNull) {
-  CancelableClosure cancelable;
-  EXPECT_TRUE(cancelable.IsCancelled());
-
-  int count = 0;
-  cancelable.Reset(base::Bind(&Increment,
-                              base::Unretained(&count)));
-  EXPECT_FALSE(cancelable.IsCancelled());
-
-  cancelable.Cancel();
-  EXPECT_TRUE(cancelable.IsCancelled());
-}
-
-// CancelableCallback posted to a MessageLoop with PostTask.
-//  - Callbacks posted to a MessageLoop can be cancelled.
-TEST(CancelableCallbackTest, PostTask) {
-  MessageLoop loop;
-
-  int count = 0;
-  CancelableClosure cancelable(base::Bind(&Increment,
-                                           base::Unretained(&count)));
-
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, cancelable.callback());
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(1, count);
-
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, cancelable.callback());
-
-  // Cancel before running the message loop.
-  cancelable.Cancel();
-  RunLoop().RunUntilIdle();
-
-  // Callback never ran due to cancellation; count is the same.
-  EXPECT_EQ(1, count);
-}
-
-// CancelableCallback can be used with move-only types.
-TEST(CancelableCallbackTest, MoveOnlyType) {
-  const int kExpectedResult = 42;
-
-  int result = 0;
-  CancelableCallback<void(std::unique_ptr<int>)> cb(
-      base::Bind(&OnMoveOnlyReceived, base::Unretained(&result)));
-  cb.callback().Run(base::WrapUnique(new int(kExpectedResult)));
-
-  EXPECT_EQ(kExpectedResult, result);
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/command_line_unittest.cc b/base/command_line_unittest.cc
deleted file mode 100644
index 2396830..0000000
--- a/base/command_line_unittest.cc
+++ /dev/null
@@ -1,440 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/command_line.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-// To test Windows quoting behavior, we use a string that has some backslashes
-// and quotes.
-// Consider the command-line argument: q\"bs1\bs2\\bs3q\\\"
-// Here it is with C-style escapes.
-static const CommandLine::StringType kTrickyQuoted =
-    FILE_PATH_LITERAL("q\\\"bs1\\bs2\\\\bs3q\\\\\\\"");
-// It should be parsed by Windows as: q"bs1\bs2\\bs3q\"
-// Here that is with C-style escapes.
-static const CommandLine::StringType kTricky =
-    FILE_PATH_LITERAL("q\"bs1\\bs2\\\\bs3q\\\"");
-
-TEST(CommandLineTest, CommandLineConstructor) {
-  const CommandLine::CharType* argv[] = {
-      FILE_PATH_LITERAL("program"),
-      FILE_PATH_LITERAL("--foo="),
-      FILE_PATH_LITERAL("-bAr"),
-      FILE_PATH_LITERAL("-spaetzel=pierogi"),
-      FILE_PATH_LITERAL("-baz"),
-      FILE_PATH_LITERAL("flim"),
-      FILE_PATH_LITERAL("--other-switches=--dog=canine --cat=feline"),
-      FILE_PATH_LITERAL("-spaetzle=Crepe"),
-      FILE_PATH_LITERAL("-=loosevalue"),
-      FILE_PATH_LITERAL("-"),
-      FILE_PATH_LITERAL("FLAN"),
-      FILE_PATH_LITERAL("a"),
-      FILE_PATH_LITERAL("--input-translation=45--output-rotation"),
-      FILE_PATH_LITERAL("--"),
-      FILE_PATH_LITERAL("--"),
-      FILE_PATH_LITERAL("--not-a-switch"),
-      FILE_PATH_LITERAL("\"in the time of submarines...\""),
-      FILE_PATH_LITERAL("unquoted arg-with-space")};
-  CommandLine cl(arraysize(argv), argv);
-
-  EXPECT_FALSE(cl.GetCommandLineString().empty());
-  EXPECT_FALSE(cl.HasSwitch("cruller"));
-  EXPECT_FALSE(cl.HasSwitch("flim"));
-  EXPECT_FALSE(cl.HasSwitch("program"));
-  EXPECT_FALSE(cl.HasSwitch("dog"));
-  EXPECT_FALSE(cl.HasSwitch("cat"));
-  EXPECT_FALSE(cl.HasSwitch("output-rotation"));
-  EXPECT_FALSE(cl.HasSwitch("not-a-switch"));
-  EXPECT_FALSE(cl.HasSwitch("--"));
-
-  EXPECT_EQ(FilePath(FILE_PATH_LITERAL("program")).value(),
-            cl.GetProgram().value());
-
-  EXPECT_TRUE(cl.HasSwitch("foo"));
-#if defined(OS_WIN)
-  EXPECT_TRUE(cl.HasSwitch("bar"));
-#else
-  EXPECT_FALSE(cl.HasSwitch("bar"));
-#endif
-  EXPECT_TRUE(cl.HasSwitch("baz"));
-  EXPECT_TRUE(cl.HasSwitch("spaetzle"));
-  EXPECT_TRUE(cl.HasSwitch("other-switches"));
-  EXPECT_TRUE(cl.HasSwitch("input-translation"));
-
-  EXPECT_EQ("Crepe", cl.GetSwitchValueASCII("spaetzle"));
-  EXPECT_EQ("", cl.GetSwitchValueASCII("foo"));
-  EXPECT_EQ("", cl.GetSwitchValueASCII("bar"));
-  EXPECT_EQ("", cl.GetSwitchValueASCII("cruller"));
-  EXPECT_EQ("--dog=canine --cat=feline", cl.GetSwitchValueASCII(
-      "other-switches"));
-  EXPECT_EQ("45--output-rotation", cl.GetSwitchValueASCII("input-translation"));
-
-  const CommandLine::StringVector& args = cl.GetArgs();
-  ASSERT_EQ(8U, args.size());
-
-  std::vector<CommandLine::StringType>::const_iterator iter = args.begin();
-  EXPECT_EQ(FILE_PATH_LITERAL("flim"), *iter);
-  ++iter;
-  EXPECT_EQ(FILE_PATH_LITERAL("-"), *iter);
-  ++iter;
-  EXPECT_EQ(FILE_PATH_LITERAL("FLAN"), *iter);
-  ++iter;
-  EXPECT_EQ(FILE_PATH_LITERAL("a"), *iter);
-  ++iter;
-  EXPECT_EQ(FILE_PATH_LITERAL("--"), *iter);
-  ++iter;
-  EXPECT_EQ(FILE_PATH_LITERAL("--not-a-switch"), *iter);
-  ++iter;
-  EXPECT_EQ(FILE_PATH_LITERAL("\"in the time of submarines...\""), *iter);
-  ++iter;
-  EXPECT_EQ(FILE_PATH_LITERAL("unquoted arg-with-space"), *iter);
-  ++iter;
-  EXPECT_TRUE(iter == args.end());
-}
-
-TEST(CommandLineTest, CommandLineFromString) {
-#if defined(OS_WIN)
-  CommandLine cl = CommandLine::FromString(
-      L"program --foo= -bAr  /Spaetzel=pierogi /Baz flim "
-      L"--other-switches=\"--dog=canine --cat=feline\" "
-      L"-spaetzle=Crepe   -=loosevalue  FLAN "
-      L"--input-translation=\"45\"--output-rotation "
-      L"--quotes=" + kTrickyQuoted + L" "
-      L"-- -- --not-a-switch "
-      L"\"in the time of submarines...\"");
-
-  EXPECT_FALSE(cl.GetCommandLineString().empty());
-  EXPECT_FALSE(cl.HasSwitch("cruller"));
-  EXPECT_FALSE(cl.HasSwitch("flim"));
-  EXPECT_FALSE(cl.HasSwitch("program"));
-  EXPECT_FALSE(cl.HasSwitch("dog"));
-  EXPECT_FALSE(cl.HasSwitch("cat"));
-  EXPECT_FALSE(cl.HasSwitch("output-rotation"));
-  EXPECT_FALSE(cl.HasSwitch("not-a-switch"));
-  EXPECT_FALSE(cl.HasSwitch("--"));
-
-  EXPECT_EQ(FilePath(FILE_PATH_LITERAL("program")).value(),
-            cl.GetProgram().value());
-
-  EXPECT_TRUE(cl.HasSwitch("foo"));
-  EXPECT_TRUE(cl.HasSwitch("bar"));
-  EXPECT_TRUE(cl.HasSwitch("baz"));
-  EXPECT_TRUE(cl.HasSwitch("spaetzle"));
-  EXPECT_TRUE(cl.HasSwitch("other-switches"));
-  EXPECT_TRUE(cl.HasSwitch("input-translation"));
-  EXPECT_TRUE(cl.HasSwitch("quotes"));
-
-  EXPECT_EQ("Crepe", cl.GetSwitchValueASCII("spaetzle"));
-  EXPECT_EQ("", cl.GetSwitchValueASCII("foo"));
-  EXPECT_EQ("", cl.GetSwitchValueASCII("bar"));
-  EXPECT_EQ("", cl.GetSwitchValueASCII("cruller"));
-  EXPECT_EQ("--dog=canine --cat=feline", cl.GetSwitchValueASCII(
-      "other-switches"));
-  EXPECT_EQ("45--output-rotation", cl.GetSwitchValueASCII("input-translation"));
-  EXPECT_EQ(kTricky, cl.GetSwitchValueNative("quotes"));
-
-  const CommandLine::StringVector& args = cl.GetArgs();
-  ASSERT_EQ(5U, args.size());
-
-  std::vector<CommandLine::StringType>::const_iterator iter = args.begin();
-  EXPECT_EQ(FILE_PATH_LITERAL("flim"), *iter);
-  ++iter;
-  EXPECT_EQ(FILE_PATH_LITERAL("FLAN"), *iter);
-  ++iter;
-  EXPECT_EQ(FILE_PATH_LITERAL("--"), *iter);
-  ++iter;
-  EXPECT_EQ(FILE_PATH_LITERAL("--not-a-switch"), *iter);
-  ++iter;
-  EXPECT_EQ(FILE_PATH_LITERAL("in the time of submarines..."), *iter);
-  ++iter;
-  EXPECT_TRUE(iter == args.end());
-
-  // Check that a generated string produces an equivalent command line.
-  CommandLine cl_duplicate = CommandLine::FromString(cl.GetCommandLineString());
-  EXPECT_EQ(cl.GetCommandLineString(), cl_duplicate.GetCommandLineString());
-#endif
-}
-
-// Tests behavior with an empty input string.
-TEST(CommandLineTest, EmptyString) {
-#if defined(OS_WIN)
-  CommandLine cl_from_string = CommandLine::FromString(L"");
-  EXPECT_TRUE(cl_from_string.GetCommandLineString().empty());
-  EXPECT_TRUE(cl_from_string.GetProgram().empty());
-  EXPECT_EQ(1U, cl_from_string.argv().size());
-  EXPECT_TRUE(cl_from_string.GetArgs().empty());
-#endif
-  CommandLine cl_from_argv(0, nullptr);
-  EXPECT_TRUE(cl_from_argv.GetCommandLineString().empty());
-  EXPECT_TRUE(cl_from_argv.GetProgram().empty());
-  EXPECT_EQ(1U, cl_from_argv.argv().size());
-  EXPECT_TRUE(cl_from_argv.GetArgs().empty());
-}
-
-TEST(CommandLineTest, GetArgumentsString) {
-  static const FilePath::CharType kPath1[] =
-      FILE_PATH_LITERAL("C:\\Some File\\With Spaces.ggg");
-  static const FilePath::CharType kPath2[] =
-      FILE_PATH_LITERAL("C:\\no\\spaces.ggg");
-
-  static const char kFirstArgName[] = "first-arg";
-  static const char kSecondArgName[] = "arg2";
-  static const char kThirdArgName[] = "arg with space";
-  static const char kFourthArgName[] = "nospace";
-  static const char kFifthArgName[] = "%1";
-
-  CommandLine cl(CommandLine::NO_PROGRAM);
-  cl.AppendSwitchPath(kFirstArgName, FilePath(kPath1));
-  cl.AppendSwitchPath(kSecondArgName, FilePath(kPath2));
-  cl.AppendArg(kThirdArgName);
-  cl.AppendArg(kFourthArgName);
-  cl.AppendArg(kFifthArgName);
-
-#if defined(OS_WIN)
-  CommandLine::StringType expected_first_arg(UTF8ToUTF16(kFirstArgName));
-  CommandLine::StringType expected_second_arg(UTF8ToUTF16(kSecondArgName));
-  CommandLine::StringType expected_third_arg(UTF8ToUTF16(kThirdArgName));
-  CommandLine::StringType expected_fourth_arg(UTF8ToUTF16(kFourthArgName));
-  CommandLine::StringType expected_fifth_arg(UTF8ToUTF16(kFifthArgName));
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  CommandLine::StringType expected_first_arg(kFirstArgName);
-  CommandLine::StringType expected_second_arg(kSecondArgName);
-  CommandLine::StringType expected_third_arg(kThirdArgName);
-  CommandLine::StringType expected_fourth_arg(kFourthArgName);
-  CommandLine::StringType expected_fifth_arg(kFifthArgName);
-#endif
-
-#if defined(OS_WIN)
-#define QUOTE_ON_WIN FILE_PATH_LITERAL("\"")
-#else
-#define QUOTE_ON_WIN FILE_PATH_LITERAL("")
-#endif  // OS_WIN
-
-  CommandLine::StringType expected_str;
-  expected_str.append(FILE_PATH_LITERAL("--"))
-              .append(expected_first_arg)
-              .append(FILE_PATH_LITERAL("="))
-              .append(QUOTE_ON_WIN)
-              .append(kPath1)
-              .append(QUOTE_ON_WIN)
-              .append(FILE_PATH_LITERAL(" "))
-              .append(FILE_PATH_LITERAL("--"))
-              .append(expected_second_arg)
-              .append(FILE_PATH_LITERAL("="))
-              .append(QUOTE_ON_WIN)
-              .append(kPath2)
-              .append(QUOTE_ON_WIN)
-              .append(FILE_PATH_LITERAL(" "))
-              .append(QUOTE_ON_WIN)
-              .append(expected_third_arg)
-              .append(QUOTE_ON_WIN)
-              .append(FILE_PATH_LITERAL(" "))
-              .append(expected_fourth_arg)
-              .append(FILE_PATH_LITERAL(" "));
-
-  CommandLine::StringType expected_str_no_quote_placeholders(expected_str);
-  expected_str_no_quote_placeholders.append(expected_fifth_arg);
-  EXPECT_EQ(expected_str_no_quote_placeholders, cl.GetArgumentsString());
-
-#if defined(OS_WIN)
-  CommandLine::StringType expected_str_quote_placeholders(expected_str);
-  expected_str_quote_placeholders.append(QUOTE_ON_WIN)
-                                 .append(expected_fifth_arg)
-                                 .append(QUOTE_ON_WIN);
-  EXPECT_EQ(expected_str_quote_placeholders,
-            cl.GetArgumentsStringWithPlaceholders());
-#endif
-}
-
-// Test methods for appending switches to a command line.
-TEST(CommandLineTest, AppendSwitches) {
-  std::string switch1 = "switch1";
-  std::string switch2 = "switch2";
-  std::string value2 = "value";
-  std::string switch3 = "switch3";
-  std::string value3 = "a value with spaces";
-  std::string switch4 = "switch4";
-  std::string value4 = "\"a value with quotes\"";
-  std::string switch5 = "quotes";
-  CommandLine::StringType value5 = kTricky;
-
-  CommandLine cl(FilePath(FILE_PATH_LITERAL("Program")));
-
-  cl.AppendSwitch(switch1);
-  cl.AppendSwitchASCII(switch2, value2);
-  cl.AppendSwitchASCII(switch3, value3);
-  cl.AppendSwitchASCII(switch4, value4);
-  cl.AppendSwitchASCII(switch5, value4);
-  cl.AppendSwitchNative(switch5, value5);
-
-  EXPECT_TRUE(cl.HasSwitch(switch1));
-  EXPECT_TRUE(cl.HasSwitch(switch2));
-  EXPECT_EQ(value2, cl.GetSwitchValueASCII(switch2));
-  EXPECT_TRUE(cl.HasSwitch(switch3));
-  EXPECT_EQ(value3, cl.GetSwitchValueASCII(switch3));
-  EXPECT_TRUE(cl.HasSwitch(switch4));
-  EXPECT_EQ(value4, cl.GetSwitchValueASCII(switch4));
-  EXPECT_TRUE(cl.HasSwitch(switch5));
-  EXPECT_EQ(value5, cl.GetSwitchValueNative(switch5));
-
-#if defined(OS_WIN)
-  EXPECT_EQ(L"Program "
-            L"--switch1 "
-            L"--switch2=value "
-            L"--switch3=\"a value with spaces\" "
-            L"--switch4=\"\\\"a value with quotes\\\"\" "
-            // Even though the switches are unique, appending can add repeat
-            // switches to argv.
-            L"--quotes=\"\\\"a value with quotes\\\"\" "
-            L"--quotes=\"" + kTrickyQuoted + L"\"",
-            cl.GetCommandLineString());
-#endif
-}
-
-TEST(CommandLineTest, AppendSwitchesDashDash) {
- const CommandLine::CharType* raw_argv[] = { FILE_PATH_LITERAL("prog"),
-                                             FILE_PATH_LITERAL("--"),
-                                             FILE_PATH_LITERAL("--arg1") };
-  CommandLine cl(arraysize(raw_argv), raw_argv);
-
-  cl.AppendSwitch("switch1");
-  cl.AppendSwitchASCII("switch2", "foo");
-
-  cl.AppendArg("--arg2");
-
-  EXPECT_EQ(FILE_PATH_LITERAL("prog --switch1 --switch2=foo -- --arg1 --arg2"),
-            cl.GetCommandLineString());
-  CommandLine::StringVector cl_argv = cl.argv();
-  EXPECT_EQ(FILE_PATH_LITERAL("prog"), cl_argv[0]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--switch1"), cl_argv[1]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--switch2=foo"), cl_argv[2]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--"), cl_argv[3]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--arg1"), cl_argv[4]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--arg2"), cl_argv[5]);
-}
-
-// Tests that when AppendArguments is called that the program is set correctly
-// on the target CommandLine object and the switches from the source
-// CommandLine are added to the target.
-TEST(CommandLineTest, AppendArguments) {
-  CommandLine cl1(FilePath(FILE_PATH_LITERAL("Program")));
-  cl1.AppendSwitch("switch1");
-  cl1.AppendSwitchASCII("switch2", "foo");
-
-  CommandLine cl2(CommandLine::NO_PROGRAM);
-  cl2.AppendArguments(cl1, true);
-  EXPECT_EQ(cl1.GetProgram().value(), cl2.GetProgram().value());
-  EXPECT_EQ(cl1.GetCommandLineString(), cl2.GetCommandLineString());
-
-  CommandLine c1(FilePath(FILE_PATH_LITERAL("Program1")));
-  c1.AppendSwitch("switch1");
-  CommandLine c2(FilePath(FILE_PATH_LITERAL("Program2")));
-  c2.AppendSwitch("switch2");
-
-  c1.AppendArguments(c2, true);
-  EXPECT_EQ(c1.GetProgram().value(), c2.GetProgram().value());
-  EXPECT_TRUE(c1.HasSwitch("switch1"));
-  EXPECT_TRUE(c1.HasSwitch("switch2"));
-}
-
-#if defined(OS_WIN)
-// Make sure that the command line string program paths are quoted as necessary.
-// This only makes sense on Windows and the test is basically here to guard
-// against regressions.
-TEST(CommandLineTest, ProgramQuotes) {
-  // Check that quotes are not added for paths without spaces.
-  const FilePath kProgram(L"Program");
-  CommandLine cl_program(kProgram);
-  EXPECT_EQ(kProgram.value(), cl_program.GetProgram().value());
-  EXPECT_EQ(kProgram.value(), cl_program.GetCommandLineString());
-
-  const FilePath kProgramPath(L"Program Path");
-
-  // Check that quotes are not returned from GetProgram().
-  CommandLine cl_program_path(kProgramPath);
-  EXPECT_EQ(kProgramPath.value(), cl_program_path.GetProgram().value());
-
-  // Check that quotes are added to command line string paths containing spaces.
-  CommandLine::StringType cmd_string(cl_program_path.GetCommandLineString());
-  EXPECT_EQ(L"\"Program Path\"", cmd_string);
-
-  // Check the optional quoting of placeholders in programs.
-  CommandLine cl_quote_placeholder(FilePath(L"%1"));
-  EXPECT_EQ(L"%1", cl_quote_placeholder.GetCommandLineString());
-  EXPECT_EQ(L"\"%1\"",
-            cl_quote_placeholder.GetCommandLineStringWithPlaceholders());
-}
-#endif
-
-// Calling Init multiple times should not modify the previous CommandLine.
-TEST(CommandLineTest, Init) {
-  // Call Init without checking output once so we know it's been called
-  // whether or not the test runner does so.
-  CommandLine::Init(0, nullptr);
-  CommandLine* initial = CommandLine::ForCurrentProcess();
-  EXPECT_FALSE(CommandLine::Init(0, nullptr));
-  CommandLine* current = CommandLine::ForCurrentProcess();
-  EXPECT_EQ(initial, current);
-}
-
-// Test that copies of CommandLine have a valid StringPiece map.
-TEST(CommandLineTest, Copy) {
-  std::unique_ptr<CommandLine> initial(
-      new CommandLine(CommandLine::NO_PROGRAM));
-  initial->AppendSwitch("a");
-  initial->AppendSwitch("bbbbbbbbbbbbbbb");
-  initial->AppendSwitch("c");
-  CommandLine copy_constructed(*initial);
-  CommandLine assigned = *initial;
-  CommandLine::SwitchMap switch_map = initial->GetSwitches();
-  initial.reset();
-  for (const auto& pair : switch_map)
-    EXPECT_TRUE(copy_constructed.HasSwitch(pair.first));
-  for (const auto& pair : switch_map)
-    EXPECT_TRUE(assigned.HasSwitch(pair.first));
-}
-
-TEST(CommandLineTest, PrependSimpleWrapper) {
-  CommandLine cl(FilePath(FILE_PATH_LITERAL("Program")));
-  cl.AppendSwitch("a");
-  cl.AppendSwitch("b");
-  cl.PrependWrapper(FILE_PATH_LITERAL("wrapper --foo --bar"));
-
-  EXPECT_EQ(6u, cl.argv().size());
-  EXPECT_EQ(FILE_PATH_LITERAL("wrapper"), cl.argv()[0]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--foo"), cl.argv()[1]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--bar"), cl.argv()[2]);
-  EXPECT_EQ(FILE_PATH_LITERAL("Program"), cl.argv()[3]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--a"), cl.argv()[4]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--b"), cl.argv()[5]);
-}
-
-TEST(CommandLineTest, PrependComplexWrapper) {
-  CommandLine cl(FilePath(FILE_PATH_LITERAL("Program")));
-  cl.AppendSwitch("a");
-  cl.AppendSwitch("b");
-  cl.PrependWrapper(
-      FILE_PATH_LITERAL("wrapper --foo='hello world' --bar=\"let's go\""));
-
-  EXPECT_EQ(6u, cl.argv().size());
-  EXPECT_EQ(FILE_PATH_LITERAL("wrapper"), cl.argv()[0]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--foo='hello world'"), cl.argv()[1]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--bar=\"let's go\""), cl.argv()[2]);
-  EXPECT_EQ(FILE_PATH_LITERAL("Program"), cl.argv()[3]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--a"), cl.argv()[4]);
-  EXPECT_EQ(FILE_PATH_LITERAL("--b"), cl.argv()[5]);
-}
-
-} // namespace base
diff --git a/base/component_export_unittest.cc b/base/component_export_unittest.cc
deleted file mode 100644
index e994353..0000000
--- a/base/component_export_unittest.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/component_export.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-using ComponentExportTest = testing::Test;
-
-#define IS_TEST_COMPONENT_A_IMPL 1
-#define IS_TEST_COMPONENT_B_IMPL
-#define IS_TEST_COMPONENT_C_IMPL 0
-#define IS_TEST_COMPONENT_D_IMPL 2
-#define IS_TEST_COMPONENT_E_IMPL xyz
-
-TEST(ComponentExportTest, ImportExport) {
-  // Defined as 1. Treat as export.
-  EXPECT_EQ(1, INSIDE_COMPONENT_IMPL(TEST_COMPONENT_A));
-
-  // Defined, but empty. Treat as import.
-  EXPECT_EQ(0, INSIDE_COMPONENT_IMPL(TEST_COMPONENT_B));
-
-  // Defined, but 0. Treat as import.
-  EXPECT_EQ(0, INSIDE_COMPONENT_IMPL(TEST_COMPONENT_C));
-
-  // Defined, but some other arbitrary thing that isn't 1. Treat as import.
-  EXPECT_EQ(0, INSIDE_COMPONENT_IMPL(TEST_COMPONENT_D));
-  EXPECT_EQ(0, INSIDE_COMPONENT_IMPL(TEST_COMPONENT_E));
-
-  // Undefined. Treat as import.
-  EXPECT_EQ(0, INSIDE_COMPONENT_IMPL(TEST_COMPONENT_F));
-
-  // And just for good measure, ensure that the macros evaluate properly in the
-  // context of preprocessor #if blocks.
-#if INSIDE_COMPONENT_IMPL(TEST_COMPONENT_A)
-  EXPECT_TRUE(true);
-#else
-  EXPECT_TRUE(false);
-#endif
-
-#if !INSIDE_COMPONENT_IMPL(TEST_COMPONENT_B)
-  EXPECT_TRUE(true);
-#else
-  EXPECT_TRUE(false);
-#endif
-
-#if !INSIDE_COMPONENT_IMPL(TEST_COMPONENT_C)
-  EXPECT_TRUE(true);
-#else
-  EXPECT_TRUE(false);
-#endif
-
-#if !INSIDE_COMPONENT_IMPL(TEST_COMPONENT_D)
-  EXPECT_TRUE(true);
-#else
-  EXPECT_TRUE(false);
-#endif
-
-#if !INSIDE_COMPONENT_IMPL(TEST_COMPONENT_E)
-  EXPECT_TRUE(true);
-#else
-  EXPECT_TRUE(false);
-#endif
-
-#if !INSIDE_COMPONENT_IMPL(TEST_COMPONENT_F)
-  EXPECT_TRUE(true);
-#else
-  EXPECT_TRUE(false);
-#endif
-}
-
-#undef IS_TEST_COMPONENT_A_IMPL
-#undef IS_TEST_COMPONENT_B_IMPL
-#undef IS_TEST_COMPONENT_C_IMPL
-#undef IS_TEST_COMPONENT_D_IMPL
-#undef IS_TEST_COMPONENT_E_IMPL
-
-}  // namespace
-}  // namespace base
diff --git a/base/containers/adapters_unittest.cc b/base/containers/adapters_unittest.cc
deleted file mode 100644
index 92554b7..0000000
--- a/base/containers/adapters_unittest.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/adapters.h"
-
-#include <vector>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-TEST(AdaptersTest, Reversed) {
-  std::vector<int> v;
-  v.push_back(3);
-  v.push_back(2);
-  v.push_back(1);
-  int j = 0;
-  for (int& i : base::Reversed(v)) {
-    EXPECT_EQ(++j, i);
-    i += 100;
-  }
-  EXPECT_EQ(103, v[0]);
-  EXPECT_EQ(102, v[1]);
-  EXPECT_EQ(101, v[2]);
-}
-
-TEST(AdaptersTest, ReversedArray) {
-  int v[3] = {3, 2, 1};
-  int j = 0;
-  for (int& i : base::Reversed(v)) {
-    EXPECT_EQ(++j, i);
-    i += 100;
-  }
-  EXPECT_EQ(103, v[0]);
-  EXPECT_EQ(102, v[1]);
-  EXPECT_EQ(101, v[2]);
-}
-
-TEST(AdaptersTest, ReversedConst) {
-  std::vector<int> v;
-  v.push_back(3);
-  v.push_back(2);
-  v.push_back(1);
-  const std::vector<int>& cv = v;
-  int j = 0;
-  for (int i : base::Reversed(cv)) {
-    EXPECT_EQ(++j, i);
-  }
-}
-
-}  // namespace
diff --git a/base/containers/circular_deque_unittest.cc b/base/containers/circular_deque_unittest.cc
deleted file mode 100644
index 0c168e0..0000000
--- a/base/containers/circular_deque_unittest.cc
+++ /dev/null
@@ -1,881 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/circular_deque.h"
-
-#include "base/test/copy_only_int.h"
-#include "base/test/move_only_int.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using base::internal::VectorBuffer;
-
-namespace base {
-
-namespace {
-
-circular_deque<int> MakeSequence(size_t max) {
-  circular_deque<int> ret;
-  for (size_t i = 0; i < max; i++)
-    ret.push_back(i);
-  return ret;
-}
-
-// Cycles through the queue, popping items from the back and pushing items
-// at the front to validate behavior across different configurations of the
-// queue in relation to the underlying buffer. The tester closure is run for
-// each cycle.
-template <class QueueT, class Tester>
-void CycleTest(circular_deque<QueueT>& queue, const Tester& tester) {
-  size_t steps = queue.size() * 2;
-  for (size_t i = 0; i < steps; i++) {
-    tester(queue, i);
-    queue.pop_back();
-    queue.push_front(QueueT());
-  }
-}
-
-class DestructorCounter {
- public:
-  DestructorCounter(int* counter) : counter_(counter) {}
-  ~DestructorCounter() { ++(*counter_); }
-
- private:
-  int* counter_;
-};
-
-}  // namespace
-
-TEST(CircularDeque, FillConstructor) {
-  constexpr size_t num_elts = 9;
-
-  std::vector<int> foo(15);
-  EXPECT_EQ(15u, foo.size());
-
-  // Fill with default constructor.
-  {
-    circular_deque<int> buf(num_elts);
-
-    EXPECT_EQ(num_elts, buf.size());
-    EXPECT_EQ(num_elts, static_cast<size_t>(buf.end() - buf.begin()));
-
-    for (size_t i = 0; i < num_elts; i++)
-      EXPECT_EQ(0, buf[i]);
-  }
-
-  // Fill with explicit value.
-  {
-    int value = 199;
-    circular_deque<int> buf(num_elts, value);
-
-    EXPECT_EQ(num_elts, buf.size());
-    EXPECT_EQ(num_elts, static_cast<size_t>(buf.end() - buf.begin()));
-
-    for (size_t i = 0; i < num_elts; i++)
-      EXPECT_EQ(value, buf[i]);
-  }
-}
-
-TEST(CircularDeque, CopyAndRangeConstructor) {
-  int values[] = {1, 2, 3, 4, 5, 6};
-  circular_deque<CopyOnlyInt> first(std::begin(values), std::end(values));
-
-  circular_deque<CopyOnlyInt> second(first);
-  EXPECT_EQ(6u, second.size());
-  for (int i = 0; i < 6; i++)
-    EXPECT_EQ(i + 1, second[i].data());
-}
-
-TEST(CircularDeque, MoveConstructor) {
-  int values[] = {1, 2, 3, 4, 5, 6};
-  circular_deque<MoveOnlyInt> first(std::begin(values), std::end(values));
-
-  circular_deque<MoveOnlyInt> second(std::move(first));
-  EXPECT_TRUE(first.empty());
-  EXPECT_EQ(6u, second.size());
-  for (int i = 0; i < 6; i++)
-    EXPECT_EQ(i + 1, second[i].data());
-}
-
-TEST(CircularDeque, InitializerListConstructor) {
-  circular_deque<int> empty({});
-  ASSERT_TRUE(empty.empty());
-
-  circular_deque<int> first({1, 2, 3, 4, 5, 6});
-  EXPECT_EQ(6u, first.size());
-  for (int i = 0; i < 6; i++)
-    EXPECT_EQ(i + 1, first[i]);
-}
-
-TEST(CircularDeque, Destructor) {
-  int destruct_count = 0;
-
-  // Contiguous buffer.
-  {
-    circular_deque<DestructorCounter> q;
-    q.resize(5, DestructorCounter(&destruct_count));
-
-    EXPECT_EQ(1, destruct_count);  // The temporary in the call to resize().
-    destruct_count = 0;
-  }
-  EXPECT_EQ(5, destruct_count);  // One call for each.
-
-  // Force a wraparound buffer.
-  {
-    circular_deque<DestructorCounter> q;
-    q.reserve(7);
-    q.resize(5, DestructorCounter(&destruct_count));
-
-    // Cycle throught some elements in our buffer to force a wraparound.
-    destruct_count = 0;
-    for (int i = 0; i < 4; i++) {
-      q.emplace_back(&destruct_count);
-      q.pop_front();
-    }
-    EXPECT_EQ(4, destruct_count);  // One for each cycle.
-    destruct_count = 0;
-  }
-  EXPECT_EQ(5, destruct_count);  // One call for each.
-}
-
-TEST(CircularDeque, EqualsCopy) {
-  circular_deque<int> first = {1, 2, 3, 4, 5, 6};
-  circular_deque<int> copy;
-  EXPECT_TRUE(copy.empty());
-  copy = first;
-  EXPECT_EQ(6u, copy.size());
-  for (int i = 0; i < 6; i++) {
-    EXPECT_EQ(i + 1, first[i]);
-    EXPECT_EQ(i + 1, copy[i]);
-    EXPECT_NE(&first[i], &copy[i]);
-  }
-}
-
-TEST(CircularDeque, EqualsMove) {
-  circular_deque<int> first = {1, 2, 3, 4, 5, 6};
-  circular_deque<int> move;
-  EXPECT_TRUE(move.empty());
-  move = std::move(first);
-  EXPECT_TRUE(first.empty());
-  EXPECT_EQ(6u, move.size());
-  for (int i = 0; i < 6; i++)
-    EXPECT_EQ(i + 1, move[i]);
-}
-
-// Tests that self-assignment is a no-op.
-TEST(CircularDeque, EqualsSelf) {
-  circular_deque<int> q = {1, 2, 3, 4, 5, 6};
-  q = *&q;  // The *& defeats Clang's -Wself-assign warning.
-  EXPECT_EQ(6u, q.size());
-  for (int i = 0; i < 6; i++)
-    EXPECT_EQ(i + 1, q[i]);
-}
-
-TEST(CircularDeque, EqualsInitializerList) {
-  circular_deque<int> q;
-  EXPECT_TRUE(q.empty());
-  q = {1, 2, 3, 4, 5, 6};
-  EXPECT_EQ(6u, q.size());
-  for (int i = 0; i < 6; i++)
-    EXPECT_EQ(i + 1, q[i]);
-}
-
-TEST(CircularDeque, AssignCountValue) {
-  circular_deque<int> empty;
-  empty.assign(0, 52);
-  EXPECT_EQ(0u, empty.size());
-
-  circular_deque<int> full;
-  size_t count = 13;
-  int value = 12345;
-  full.assign(count, value);
-  EXPECT_EQ(count, full.size());
-
-  for (size_t i = 0; i < count; i++)
-    EXPECT_EQ(value, full[i]);
-}
-
-TEST(CircularDeque, AssignIterator) {
-  int range[8] = {11, 12, 13, 14, 15, 16, 17, 18};
-
-  circular_deque<int> empty;
-  empty.assign(std::begin(range), std::begin(range));
-  EXPECT_TRUE(empty.empty());
-
-  circular_deque<int> full;
-  full.assign(std::begin(range), std::end(range));
-  EXPECT_EQ(8u, full.size());
-  for (size_t i = 0; i < 8; i++)
-    EXPECT_EQ(range[i], full[i]);
-}
-
-TEST(CircularDeque, AssignInitializerList) {
-  circular_deque<int> empty;
-  empty.assign({});
-  EXPECT_TRUE(empty.empty());
-
-  circular_deque<int> full;
-  full.assign({11, 12, 13, 14, 15, 16, 17, 18});
-  EXPECT_EQ(8u, full.size());
-  for (int i = 0; i < 8; i++)
-    EXPECT_EQ(11 + i, full[i]);
-}
-
-// Tests [] and .at().
-TEST(CircularDeque, At) {
-  circular_deque<int> q = MakeSequence(10);
-  CycleTest(q, [](const circular_deque<int>& q, size_t cycle) {
-    size_t expected_size = 10;
-    EXPECT_EQ(expected_size, q.size());
-
-    // A sequence of 0's.
-    size_t index = 0;
-    size_t num_zeros = std::min(expected_size, cycle);
-    for (size_t i = 0; i < num_zeros; i++, index++) {
-      EXPECT_EQ(0, q[index]);
-      EXPECT_EQ(0, q.at(index));
-    }
-
-    // Followed by a sequence of increasing ints.
-    size_t num_ints = expected_size - num_zeros;
-    for (int i = 0; i < static_cast<int>(num_ints); i++, index++) {
-      EXPECT_EQ(i, q[index]);
-      EXPECT_EQ(i, q.at(index));
-    }
-  });
-}
-
-// This also tests the copy constructor with lots of different types of
-// input configurations.
-TEST(CircularDeque, FrontBackPushPop) {
-  circular_deque<int> q = MakeSequence(10);
-
-  int expected_front = 0;
-  int expected_back = 9;
-
-  // Go in one direction.
-  for (int i = 0; i < 100; i++) {
-    const circular_deque<int> const_q(q);
-
-    EXPECT_EQ(expected_front, q.front());
-    EXPECT_EQ(expected_back, q.back());
-    EXPECT_EQ(expected_front, const_q.front());
-    EXPECT_EQ(expected_back, const_q.back());
-
-    expected_front++;
-    expected_back++;
-
-    q.pop_front();
-    q.push_back(expected_back);
-  }
-
-  // Go back in reverse.
-  for (int i = 0; i < 100; i++) {
-    const circular_deque<int> const_q(q);
-
-    EXPECT_EQ(expected_front, q.front());
-    EXPECT_EQ(expected_back, q.back());
-    EXPECT_EQ(expected_front, const_q.front());
-    EXPECT_EQ(expected_back, const_q.back());
-
-    expected_front--;
-    expected_back--;
-
-    q.pop_back();
-    q.push_front(expected_front);
-  }
-}
-
-TEST(CircularDeque, ReallocateWithSplitBuffer) {
-  // Tests reallocating a deque with an internal buffer that looks like this:
-  //   4   5   x   x   0   1   2   3
-  //       end-^       ^-begin
-  circular_deque<int> q;
-  q.reserve(7);  // Internal buffer is always 1 larger than requested.
-  q.push_back(-1);
-  q.push_back(-1);
-  q.push_back(-1);
-  q.push_back(-1);
-  q.push_back(0);
-  q.pop_front();
-  q.pop_front();
-  q.pop_front();
-  q.pop_front();
-  q.push_back(1);
-  q.push_back(2);
-  q.push_back(3);
-  q.push_back(4);
-  q.push_back(5);
-
-  q.shrink_to_fit();
-  EXPECT_EQ(6u, q.size());
-
-  EXPECT_EQ(0, q[0]);
-  EXPECT_EQ(1, q[1]);
-  EXPECT_EQ(2, q[2]);
-  EXPECT_EQ(3, q[3]);
-  EXPECT_EQ(4, q[4]);
-  EXPECT_EQ(5, q[5]);
-}
-
-TEST(CircularDeque, Swap) {
-  circular_deque<int> a = MakeSequence(10);
-  circular_deque<int> b = MakeSequence(100);
-
-  a.swap(b);
-  EXPECT_EQ(100u, a.size());
-  for (int i = 0; i < 100; i++)
-    EXPECT_EQ(i, a[i]);
-
-  EXPECT_EQ(10u, b.size());
-  for (int i = 0; i < 10; i++)
-    EXPECT_EQ(i, b[i]);
-}
-
-TEST(CircularDeque, Iteration) {
-  circular_deque<int> q = MakeSequence(10);
-
-  int expected_front = 0;
-  int expected_back = 9;
-
-  // This loop causes various combinations of begin and end to be tested.
-  for (int i = 0; i < 30; i++) {
-    // Range-based for loop going forward.
-    int current_expected = expected_front;
-    for (int cur : q) {
-      EXPECT_EQ(current_expected, cur);
-      current_expected++;
-    }
-
-    // Manually test reverse iterators.
-    current_expected = expected_back;
-    for (auto cur = q.crbegin(); cur < q.crend(); cur++) {
-      EXPECT_EQ(current_expected, *cur);
-      current_expected--;
-    }
-
-    expected_front++;
-    expected_back++;
-
-    q.pop_front();
-    q.push_back(expected_back);
-  }
-
-  // Go back in reverse.
-  for (int i = 0; i < 100; i++) {
-    const circular_deque<int> const_q(q);
-
-    EXPECT_EQ(expected_front, q.front());
-    EXPECT_EQ(expected_back, q.back());
-    EXPECT_EQ(expected_front, const_q.front());
-    EXPECT_EQ(expected_back, const_q.back());
-
-    expected_front--;
-    expected_back--;
-
-    q.pop_back();
-    q.push_front(expected_front);
-  }
-}
-
-TEST(CircularDeque, IteratorComparisons) {
-  circular_deque<int> q = MakeSequence(10);
-
-  // This loop causes various combinations of begin and end to be tested.
-  for (int i = 0; i < 30; i++) {
-    EXPECT_LT(q.begin(), q.end());
-    EXPECT_LE(q.begin(), q.end());
-    EXPECT_LE(q.begin(), q.begin());
-
-    EXPECT_GT(q.end(), q.begin());
-    EXPECT_GE(q.end(), q.begin());
-    EXPECT_GE(q.end(), q.end());
-
-    EXPECT_EQ(q.begin(), q.begin());
-    EXPECT_NE(q.begin(), q.end());
-
-    q.push_front(10);
-    q.pop_back();
-  }
-}
-
-TEST(CircularDeque, IteratorIncDec) {
-  circular_deque<int> q;
-
-  // No-op offset computations with no capacity.
-  EXPECT_EQ(q.end(), q.end() + 0);
-  EXPECT_EQ(q.end(), q.end() - 0);
-
-  q = MakeSequence(10);
-
-  // Mutable preincrement, predecrement.
-  {
-    circular_deque<int>::iterator it = q.begin();
-    circular_deque<int>::iterator op_result = ++it;
-    EXPECT_EQ(1, *op_result);
-    EXPECT_EQ(1, *it);
-
-    op_result = --it;
-    EXPECT_EQ(0, *op_result);
-    EXPECT_EQ(0, *it);
-  }
-
-  // Const preincrement, predecrement.
-  {
-    circular_deque<int>::const_iterator it = q.begin();
-    circular_deque<int>::const_iterator op_result = ++it;
-    EXPECT_EQ(1, *op_result);
-    EXPECT_EQ(1, *it);
-
-    op_result = --it;
-    EXPECT_EQ(0, *op_result);
-    EXPECT_EQ(0, *it);
-  }
-
-  // Mutable postincrement, postdecrement.
-  {
-    circular_deque<int>::iterator it = q.begin();
-    circular_deque<int>::iterator op_result = it++;
-    EXPECT_EQ(0, *op_result);
-    EXPECT_EQ(1, *it);
-
-    op_result = it--;
-    EXPECT_EQ(1, *op_result);
-    EXPECT_EQ(0, *it);
-  }
-
-  // Const postincrement, postdecrement.
-  {
-    circular_deque<int>::const_iterator it = q.begin();
-    circular_deque<int>::const_iterator op_result = it++;
-    EXPECT_EQ(0, *op_result);
-    EXPECT_EQ(1, *it);
-
-    op_result = it--;
-    EXPECT_EQ(1, *op_result);
-    EXPECT_EQ(0, *it);
-  }
-}
-
-TEST(CircularDeque, IteratorIntegerOps) {
-  circular_deque<int> q = MakeSequence(10);
-
-  int expected_front = 0;
-  int expected_back = 9;
-
-  for (int i = 0; i < 30; i++) {
-    EXPECT_EQ(0, q.begin() - q.begin());
-    EXPECT_EQ(0, q.end() - q.end());
-    EXPECT_EQ(q.size(), static_cast<size_t>(q.end() - q.begin()));
-
-    // +=
-    circular_deque<int>::iterator eight = q.begin();
-    eight += 8;
-    EXPECT_EQ(8, eight - q.begin());
-    EXPECT_EQ(expected_front + 8, *eight);
-
-    // -=
-    eight -= 8;
-    EXPECT_EQ(q.begin(), eight);
-
-    // +
-    eight = eight + 8;
-    EXPECT_EQ(8, eight - q.begin());
-
-    // -
-    eight = eight - 8;
-    EXPECT_EQ(q.begin(), eight);
-
-    expected_front++;
-    expected_back++;
-
-    q.pop_front();
-    q.push_back(expected_back);
-  }
-}
-
-TEST(CircularDeque, IteratorArrayAccess) {
-  circular_deque<int> q = MakeSequence(10);
-
-  circular_deque<int>::iterator begin = q.begin();
-  EXPECT_EQ(0, begin[0]);
-  EXPECT_EQ(9, begin[9]);
-
-  circular_deque<int>::iterator end = q.end();
-  EXPECT_EQ(0, end[-10]);
-  EXPECT_EQ(9, end[-1]);
-
-  begin[0] = 100;
-  EXPECT_EQ(100, end[-10]);
-}
-
-TEST(CircularDeque, ReverseIterator) {
-  circular_deque<int> q;
-  q.push_back(4);
-  q.push_back(3);
-  q.push_back(2);
-  q.push_back(1);
-
-  circular_deque<int>::reverse_iterator iter = q.rbegin();
-  EXPECT_EQ(1, *iter);
-  iter++;
-  EXPECT_EQ(2, *iter);
-  ++iter;
-  EXPECT_EQ(3, *iter);
-  iter++;
-  EXPECT_EQ(4, *iter);
-  ++iter;
-  EXPECT_EQ(q.rend(), iter);
-}
-
-TEST(CircularDeque, CapacityReserveShrink) {
-  circular_deque<int> q;
-
-  // A default constructed queue should have no capacity since it should waste
-  // no space.
-  EXPECT_TRUE(q.empty());
-  EXPECT_EQ(0u, q.size());
-  EXPECT_EQ(0u, q.capacity());
-
-  size_t new_capacity = 100;
-  q.reserve(new_capacity);
-  EXPECT_EQ(new_capacity, q.capacity());
-
-  // Adding that many items should not cause a resize.
-  for (size_t i = 0; i < new_capacity; i++)
-    q.push_back(i);
-  EXPECT_EQ(new_capacity, q.size());
-  EXPECT_EQ(new_capacity, q.capacity());
-
-  // Shrink to fit to a smaller size.
-  size_t capacity_2 = new_capacity / 2;
-  q.resize(capacity_2);
-  q.shrink_to_fit();
-  EXPECT_EQ(capacity_2, q.size());
-  EXPECT_EQ(capacity_2, q.capacity());
-}
-
-TEST(CircularDeque, CapacityAutoShrink) {
-  size_t big_size = 1000u;
-  circular_deque<int> q;
-  q.resize(big_size);
-
-  size_t big_capacity = q.capacity();
-
-  // Delete 3/4 of the items.
-  for (size_t i = 0; i < big_size / 4 * 3; i++)
-    q.pop_back();
-
-  // The capacity should have shrunk by deleting that many items.
-  size_t medium_capacity = q.capacity();
-  EXPECT_GT(big_capacity, medium_capacity);
-
-  // Using resize to shrink should keep some extra capacity.
-  q.resize(1);
-  EXPECT_LT(1u, q.capacity());
-
-  q.resize(0);
-  EXPECT_LT(0u, q.capacity());
-
-  // Using clear() should delete everything.
-  q.clear();
-  EXPECT_EQ(0u, q.capacity());
-}
-
-TEST(CircularDeque, ClearAndEmpty) {
-  circular_deque<int> q;
-  EXPECT_TRUE(q.empty());
-
-  q.resize(10);
-  EXPECT_EQ(10u, q.size());
-  EXPECT_FALSE(q.empty());
-
-  q.clear();
-  EXPECT_EQ(0u, q.size());
-  EXPECT_TRUE(q.empty());
-
-  // clear() also should reset the capacity.
-  EXPECT_EQ(0u, q.capacity());
-}
-
-TEST(CircularDeque, Resize) {
-  circular_deque<int> q;
-
-  // Resize with default constructor.
-  size_t first_size = 10;
-  q.resize(first_size);
-  EXPECT_EQ(first_size, q.size());
-  for (size_t i = 0; i < first_size; i++)
-    EXPECT_EQ(0, q[i]);
-
-  // Resize with different value.
-  size_t second_expand = 10;
-  q.resize(first_size + second_expand, 3);
-  EXPECT_EQ(first_size + second_expand, q.size());
-  for (size_t i = 0; i < first_size; i++)
-    EXPECT_EQ(0, q[i]);
-  for (size_t i = 0; i < second_expand; i++)
-    EXPECT_EQ(3, q[i + first_size]);
-
-  // Erase from the end and add to the beginning so resize is forced to cross
-  // a circular buffer wrap boundary.
-  q.shrink_to_fit();
-  for (int i = 0; i < 5; i++) {
-    q.pop_back();
-    q.push_front(6);
-  }
-  q.resize(10);
-
-  EXPECT_EQ(6, q[0]);
-  EXPECT_EQ(6, q[1]);
-  EXPECT_EQ(6, q[2]);
-  EXPECT_EQ(6, q[3]);
-  EXPECT_EQ(6, q[4]);
-  EXPECT_EQ(0, q[5]);
-  EXPECT_EQ(0, q[6]);
-  EXPECT_EQ(0, q[7]);
-  EXPECT_EQ(0, q[8]);
-  EXPECT_EQ(0, q[9]);
-}
-
-// Tests destructor behavior of resize.
-TEST(CircularDeque, ResizeDelete) {
-  int counter = 0;
-  circular_deque<DestructorCounter> q;
-  q.resize(10, DestructorCounter(&counter));
-  // The one temporary when calling resize() should be deleted, that's it.
-  EXPECT_EQ(1, counter);
-
-  // The loops below assume the capacity will be set by resize().
-  EXPECT_EQ(10u, q.capacity());
-
-  // Delete some via resize(). This is done so that the wasted items are
-  // still greater than the size() so that auto-shrinking is not triggered
-  // (which will mess up our destructor counting).
-  counter = 0;
-  q.resize(8, DestructorCounter(&counter));
-  // 2 deleted ones + the one temporary in the resize() call.
-  EXPECT_EQ(3, counter);
-
-  // Cycle through some items so two items will cross the boundary in the
-  // 11-item buffer (one more than the capacity).
-  //   Before: x x x x x x x x . . .
-  //   After:  x . . . x x x x x x x
-  counter = 0;
-  for (int i = 0; i < 4; i++) {
-    q.emplace_back(&counter);
-    q.pop_front();
-  }
-  EXPECT_EQ(4, counter);  // Loop should have deleted 7 items.
-
-  // Delete two items with resize, these should be on either side of the
-  // buffer wrap point.
-  counter = 0;
-  q.resize(6, DestructorCounter(&counter));
-  // 2 deleted ones + the one temporary in the resize() call.
-  EXPECT_EQ(3, counter);
-}
-
-TEST(CircularDeque, InsertEraseSingle) {
-  circular_deque<int> q;
-  q.push_back(1);
-  q.push_back(2);
-
-  // Insert at the beginning.
-  auto result = q.insert(q.begin(), 0);
-  EXPECT_EQ(q.begin(), result);
-  EXPECT_EQ(3u, q.size());
-  EXPECT_EQ(0, q[0]);
-  EXPECT_EQ(1, q[1]);
-  EXPECT_EQ(2, q[2]);
-
-  // Erase at the beginning.
-  result = q.erase(q.begin());
-  EXPECT_EQ(q.begin(), result);
-  EXPECT_EQ(2u, q.size());
-  EXPECT_EQ(1, q[0]);
-  EXPECT_EQ(2, q[1]);
-
-  // Insert at the end.
-  result = q.insert(q.end(), 3);
-  EXPECT_EQ(q.end() - 1, result);
-  EXPECT_EQ(1, q[0]);
-  EXPECT_EQ(2, q[1]);
-  EXPECT_EQ(3, q[2]);
-
-  // Erase at the end.
-  result = q.erase(q.end() - 1);
-  EXPECT_EQ(q.end(), result);
-  EXPECT_EQ(1, q[0]);
-  EXPECT_EQ(2, q[1]);
-
-  // Insert in the middle.
-  result = q.insert(q.begin() + 1, 10);
-  EXPECT_EQ(q.begin() + 1, result);
-  EXPECT_EQ(1, q[0]);
-  EXPECT_EQ(10, q[1]);
-  EXPECT_EQ(2, q[2]);
-
-  // Erase in the middle.
-  result = q.erase(q.begin() + 1);
-  EXPECT_EQ(q.begin() + 1, result);
-  EXPECT_EQ(1, q[0]);
-  EXPECT_EQ(2, q[1]);
-}
-
-TEST(CircularDeque, InsertFill) {
-  circular_deque<int> q;
-
-  // Fill when empty.
-  q.insert(q.begin(), 2, 1);
-
-  // 0's at the beginning.
-  q.insert(q.begin(), 2, 0);
-
-  // 50's in the middle (now at offset 3).
-  q.insert(q.begin() + 3, 2, 50);
-
-  // 200's at the end.
-  q.insert(q.end(), 2, 200);
-
-  ASSERT_EQ(8u, q.size());
-  EXPECT_EQ(0, q[0]);
-  EXPECT_EQ(0, q[1]);
-  EXPECT_EQ(1, q[2]);
-  EXPECT_EQ(50, q[3]);
-  EXPECT_EQ(50, q[4]);
-  EXPECT_EQ(1, q[5]);
-  EXPECT_EQ(200, q[6]);
-  EXPECT_EQ(200, q[7]);
-}
-
-TEST(CircularDeque, InsertEraseRange) {
-  circular_deque<int> q;
-
-  // Erase nothing from an empty deque should work.
-  q.erase(q.begin(), q.end());
-
-  // Loop index used below to shift the used items in the buffer.
-  for (int i = 0; i < 10; i++) {
-    circular_deque<int> source;
-
-    // Fill empty range.
-    q.insert(q.begin(), source.begin(), source.end());
-
-    // Have some stuff to insert.
-    source.push_back(1);
-    source.push_back(2);
-
-    q.insert(q.begin(), source.begin(), source.end());
-
-    // Shift the used items in the buffer by i which will place the two used
-    // elements in different places in the buffer each time through this loop.
-    for (int shift_i = 0; shift_i < i; shift_i++) {
-      q.push_back(0);
-      q.pop_front();
-    }
-
-    // Set the two items to notable values so we can check for them later.
-    ASSERT_EQ(2u, q.size());
-    q[0] = 100;
-    q[1] = 101;
-
-    // Insert at the beginning, middle (now at offset 3), and end.
-    q.insert(q.begin(), source.begin(), source.end());
-    q.insert(q.begin() + 3, source.begin(), source.end());
-    q.insert(q.end(), source.begin(), source.end());
-
-    ASSERT_EQ(8u, q.size());
-    EXPECT_EQ(1, q[0]);
-    EXPECT_EQ(2, q[1]);
-    EXPECT_EQ(100, q[2]);  // First inserted one.
-    EXPECT_EQ(1, q[3]);
-    EXPECT_EQ(2, q[4]);
-    EXPECT_EQ(101, q[5]);  // First inserted second one.
-    EXPECT_EQ(1, q[6]);
-    EXPECT_EQ(2, q[7]);
-
-    // Now erase the inserted ranges. Try each subsection also with no items
-    // being erased, which should be a no-op.
-    auto result = q.erase(q.begin(), q.begin());  // No-op.
-    EXPECT_EQ(q.begin(), result);
-    result = q.erase(q.begin(), q.begin() + 2);
-    EXPECT_EQ(q.begin(), result);
-
-    result = q.erase(q.begin() + 1, q.begin() + 1);  // No-op.
-    EXPECT_EQ(q.begin() + 1, result);
-    result = q.erase(q.begin() + 1, q.begin() + 3);
-    EXPECT_EQ(q.begin() + 1, result);
-
-    result = q.erase(q.end() - 2, q.end() - 2);  // No-op.
-    EXPECT_EQ(q.end() - 2, result);
-    result = q.erase(q.end() - 2, q.end());
-    EXPECT_EQ(q.end(), result);
-
-    ASSERT_EQ(2u, q.size());
-    EXPECT_EQ(100, q[0]);
-    EXPECT_EQ(101, q[1]);
-
-    // Erase everything.
-    result = q.erase(q.begin(), q.end());
-    EXPECT_EQ(q.end(), result);
-    EXPECT_TRUE(q.empty());
-  }
-}
-
-TEST(CircularDeque, EmplaceMoveOnly) {
-  int values[] = {1, 3};
-  circular_deque<MoveOnlyInt> q(std::begin(values), std::end(values));
-
-  q.emplace(q.begin(), MoveOnlyInt(0));
-  q.emplace(q.begin() + 2, MoveOnlyInt(2));
-  q.emplace(q.end(), MoveOnlyInt(4));
-
-  ASSERT_EQ(5u, q.size());
-  EXPECT_EQ(0, q[0].data());
-  EXPECT_EQ(1, q[1].data());
-  EXPECT_EQ(2, q[2].data());
-  EXPECT_EQ(3, q[3].data());
-  EXPECT_EQ(4, q[4].data());
-}
-
-TEST(CircularDeque, EmplaceFrontBackReturnsReference) {
-  circular_deque<int> q;
-  q.reserve(2);
-
-  int& front = q.emplace_front(1);
-  int& back = q.emplace_back(2);
-  ASSERT_EQ(2u, q.size());
-  EXPECT_EQ(1, q[0]);
-  EXPECT_EQ(2, q[1]);
-
-  EXPECT_EQ(&front, &q.front());
-  EXPECT_EQ(&back, &q.back());
-
-  front = 3;
-  back = 4;
-
-  ASSERT_EQ(2u, q.size());
-  EXPECT_EQ(3, q[0]);
-  EXPECT_EQ(4, q[1]);
-
-  EXPECT_EQ(&front, &q.front());
-  EXPECT_EQ(&back, &q.back());
-}
-
-/*
-This test should assert in a debug build. It tries to dereference an iterator
-after mutating the container. Uncomment to double-check that this works.
-TEST(CircularDeque, UseIteratorAfterMutate) {
-  circular_deque<int> q;
-  q.push_back(0);
-
-  auto old_begin = q.begin();
-  EXPECT_EQ(0, *old_begin);
-
-  q.push_back(1);
-  EXPECT_EQ(0, *old_begin);  // Should DCHECK.
-}
-*/
-
-}  // namespace base
diff --git a/base/containers/flat_map_unittest.cc b/base/containers/flat_map_unittest.cc
deleted file mode 100644
index 87958bd..0000000
--- a/base/containers/flat_map_unittest.cc
+++ /dev/null
@@ -1,369 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/flat_map.h"
-
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/test/move_only_int.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-// A flat_map is basically a interface to flat_tree. So several basic
-// operations are tested to make sure things are set up properly, but the bulk
-// of the tests are in flat_tree_unittests.cc.
-
-using ::testing::ElementsAre;
-
-namespace base {
-
-TEST(FlatMap, IncompleteType) {
-  struct A {
-    using Map = flat_map<A, A>;
-    int data;
-    Map set_with_incomplete_type;
-    Map::iterator it;
-    Map::const_iterator cit;
-
-    // We do not declare operator< because clang complains that it's unused.
-  };
-
-  A a;
-}
-
-TEST(FlatMap, RangeConstructor) {
-  flat_map<int, int>::value_type input_vals[] = {
-      {1, 1}, {1, 2}, {1, 3}, {2, 1}, {2, 2}, {2, 3}, {3, 1}, {3, 2}, {3, 3}};
-
-  flat_map<int, int> first(std::begin(input_vals), std::end(input_vals));
-  EXPECT_THAT(first, ElementsAre(std::make_pair(1, 1), std::make_pair(2, 1),
-                                 std::make_pair(3, 1)));
-
-  flat_map<int, int> last(std::begin(input_vals), std::end(input_vals),
-                          KEEP_LAST_OF_DUPES);
-  EXPECT_THAT(last, ElementsAre(std::make_pair(1, 3), std::make_pair(2, 3),
-                                std::make_pair(3, 3)));
-}
-
-TEST(FlatMap, MoveConstructor) {
-  using pair = std::pair<MoveOnlyInt, MoveOnlyInt>;
-
-  flat_map<MoveOnlyInt, MoveOnlyInt> original;
-  original.insert(pair(MoveOnlyInt(1), MoveOnlyInt(1)));
-  original.insert(pair(MoveOnlyInt(2), MoveOnlyInt(2)));
-  original.insert(pair(MoveOnlyInt(3), MoveOnlyInt(3)));
-  original.insert(pair(MoveOnlyInt(4), MoveOnlyInt(4)));
-
-  flat_map<MoveOnlyInt, MoveOnlyInt> moved(std::move(original));
-
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(1)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(2)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(3)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(4)));
-}
-
-TEST(FlatMap, VectorConstructor) {
-  using IntPair = std::pair<int, int>;
-  using IntMap = flat_map<int, int>;
-  {
-    std::vector<IntPair> vect{{1, 1}, {1, 2}, {2, 1}};
-    IntMap map(std::move(vect));
-    EXPECT_THAT(map, ElementsAre(IntPair(1, 1), IntPair(2, 1)));
-  }
-  {
-    std::vector<IntPair> vect{{1, 1}, {1, 2}, {2, 1}};
-    IntMap map(std::move(vect), KEEP_LAST_OF_DUPES);
-    EXPECT_THAT(map, ElementsAre(IntPair(1, 2), IntPair(2, 1)));
-  }
-}
-
-TEST(FlatMap, InitializerListConstructor) {
-  {
-    flat_map<int, int> cont(
-        {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}, {1, 2}, {10, 10}, {8, 8}});
-    EXPECT_THAT(cont, ElementsAre(std::make_pair(1, 1), std::make_pair(2, 2),
-                                  std::make_pair(3, 3), std::make_pair(4, 4),
-                                  std::make_pair(5, 5), std::make_pair(8, 8),
-                                  std::make_pair(10, 10)));
-  }
-  {
-    flat_map<int, int> cont(
-        {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}, {1, 2}, {10, 10}, {8, 8}},
-        KEEP_LAST_OF_DUPES);
-    EXPECT_THAT(cont, ElementsAre(std::make_pair(1, 2), std::make_pair(2, 2),
-                                  std::make_pair(3, 3), std::make_pair(4, 4),
-                                  std::make_pair(5, 5), std::make_pair(8, 8),
-                                  std::make_pair(10, 10)));
-  }
-}
-
-TEST(FlatMap, InitializerListAssignment) {
-  flat_map<int, int> cont;
-  cont = {{1, 1}, {2, 2}};
-  EXPECT_THAT(cont, ElementsAre(std::make_pair(1, 1), std::make_pair(2, 2)));
-}
-
-TEST(FlatMap, InsertFindSize) {
-  base::flat_map<int, int> s;
-  s.insert(std::make_pair(1, 1));
-  s.insert(std::make_pair(1, 1));
-  s.insert(std::make_pair(2, 2));
-
-  EXPECT_EQ(2u, s.size());
-  EXPECT_EQ(std::make_pair(1, 1), *s.find(1));
-  EXPECT_EQ(std::make_pair(2, 2), *s.find(2));
-  EXPECT_EQ(s.end(), s.find(7));
-}
-
-TEST(FlatMap, CopySwap) {
-  base::flat_map<int, int> original;
-  original.insert({1, 1});
-  original.insert({2, 2});
-  EXPECT_THAT(original,
-              ElementsAre(std::make_pair(1, 1), std::make_pair(2, 2)));
-
-  base::flat_map<int, int> copy(original);
-  EXPECT_THAT(copy, ElementsAre(std::make_pair(1, 1), std::make_pair(2, 2)));
-
-  copy.erase(copy.begin());
-  copy.insert({10, 10});
-  EXPECT_THAT(copy, ElementsAre(std::make_pair(2, 2), std::make_pair(10, 10)));
-
-  original.swap(copy);
-  EXPECT_THAT(original,
-              ElementsAre(std::make_pair(2, 2), std::make_pair(10, 10)));
-  EXPECT_THAT(copy, ElementsAre(std::make_pair(1, 1), std::make_pair(2, 2)));
-}
-
-// operator[](const Key&)
-TEST(FlatMap, SubscriptConstKey) {
-  base::flat_map<std::string, int> m;
-
-  // Default construct elements that don't exist yet.
-  int& s = m["a"];
-  EXPECT_EQ(0, s);
-  EXPECT_EQ(1u, m.size());
-
-  // The returned mapped reference should refer into the map.
-  s = 22;
-  EXPECT_EQ(22, m["a"]);
-
-  // Overwrite existing elements.
-  m["a"] = 44;
-  EXPECT_EQ(44, m["a"]);
-}
-
-// operator[](Key&&)
-TEST(FlatMap, SubscriptMoveOnlyKey) {
-  base::flat_map<MoveOnlyInt, int> m;
-
-  // Default construct elements that don't exist yet.
-  int& s = m[MoveOnlyInt(1)];
-  EXPECT_EQ(0, s);
-  EXPECT_EQ(1u, m.size());
-
-  // The returned mapped reference should refer into the map.
-  s = 22;
-  EXPECT_EQ(22, m[MoveOnlyInt(1)]);
-
-  // Overwrite existing elements.
-  m[MoveOnlyInt(1)] = 44;
-  EXPECT_EQ(44, m[MoveOnlyInt(1)]);
-}
-
-// insert_or_assign(K&&, M&&)
-TEST(FlatMap, InsertOrAssignMoveOnlyKey) {
-  base::flat_map<MoveOnlyInt, MoveOnlyInt> m;
-
-  // Initial insertion should return an iterator to the element and set the
-  // second pair member to |true|. The inserted key and value should be moved
-  // from.
-  MoveOnlyInt key(1);
-  MoveOnlyInt val(22);
-  auto result = m.insert_or_assign(std::move(key), std::move(val));
-  EXPECT_EQ(1, result.first->first.data());
-  EXPECT_EQ(22, result.first->second.data());
-  EXPECT_TRUE(result.second);
-  EXPECT_EQ(1u, m.size());
-  EXPECT_EQ(0, key.data());  // moved from
-  EXPECT_EQ(0, val.data());  // moved from
-
-  // Second call with same key should result in an assignment, overwriting the
-  // old value. Assignment should be indicated by setting the second pair member
-  // to |false|. Only the inserted value should be moved from, the key should be
-  // left intact.
-  key = MoveOnlyInt(1);
-  val = MoveOnlyInt(44);
-  result = m.insert_or_assign(std::move(key), std::move(val));
-  EXPECT_EQ(1, result.first->first.data());
-  EXPECT_EQ(44, result.first->second.data());
-  EXPECT_FALSE(result.second);
-  EXPECT_EQ(1u, m.size());
-  EXPECT_EQ(1, key.data());  // not moved from
-  EXPECT_EQ(0, val.data());  // moved from
-
-  // Check that random insertion results in sorted range.
-  base::flat_map<MoveOnlyInt, int> map;
-  for (int i : {3, 1, 5, 6, 8, 7, 0, 9, 4, 2}) {
-    map.insert_or_assign(MoveOnlyInt(i), i);
-    EXPECT_TRUE(std::is_sorted(map.begin(), map.end()));
-  }
-}
-
-// insert_or_assign(const_iterator hint, K&&, M&&)
-TEST(FlatMap, InsertOrAssignMoveOnlyKeyWithHint) {
-  base::flat_map<MoveOnlyInt, MoveOnlyInt> m;
-
-  // Initial insertion should return an iterator to the element. The inserted
-  // key and value should be moved from.
-  MoveOnlyInt key(1);
-  MoveOnlyInt val(22);
-  auto result = m.insert_or_assign(m.end(), std::move(key), std::move(val));
-  EXPECT_EQ(1, result->first.data());
-  EXPECT_EQ(22, result->second.data());
-  EXPECT_EQ(1u, m.size());
-  EXPECT_EQ(0, key.data());  // moved from
-  EXPECT_EQ(0, val.data());  // moved from
-
-  // Second call with same key should result in an assignment, overwriting the
-  // old value. Only the inserted value should be moved from, the key should be
-  // left intact.
-  key = MoveOnlyInt(1);
-  val = MoveOnlyInt(44);
-  result = m.insert_or_assign(m.end(), std::move(key), std::move(val));
-  EXPECT_EQ(1, result->first.data());
-  EXPECT_EQ(44, result->second.data());
-  EXPECT_EQ(1u, m.size());
-  EXPECT_EQ(1, key.data());  // not moved from
-  EXPECT_EQ(0, val.data());  // moved from
-
-  // Check that random insertion results in sorted range.
-  base::flat_map<MoveOnlyInt, int> map;
-  for (int i : {3, 1, 5, 6, 8, 7, 0, 9, 4, 2}) {
-    map.insert_or_assign(map.end(), MoveOnlyInt(i), i);
-    EXPECT_TRUE(std::is_sorted(map.begin(), map.end()));
-  }
-}
-
-// try_emplace(K&&, Args&&...)
-TEST(FlatMap, TryEmplaceMoveOnlyKey) {
-  base::flat_map<MoveOnlyInt, std::pair<MoveOnlyInt, MoveOnlyInt>> m;
-
-  // Trying to emplace into an empty map should succeed. Insertion should return
-  // an iterator to the element and set the second pair member to |true|. The
-  // inserted key and value should be moved from.
-  MoveOnlyInt key(1);
-  MoveOnlyInt val1(22);
-  MoveOnlyInt val2(44);
-  // Test piecewise construction of mapped_type.
-  auto result = m.try_emplace(std::move(key), std::move(val1), std::move(val2));
-  EXPECT_EQ(1, result.first->first.data());
-  EXPECT_EQ(22, result.first->second.first.data());
-  EXPECT_EQ(44, result.first->second.second.data());
-  EXPECT_TRUE(result.second);
-  EXPECT_EQ(1u, m.size());
-  EXPECT_EQ(0, key.data());   // moved from
-  EXPECT_EQ(0, val1.data());  // moved from
-  EXPECT_EQ(0, val2.data());  // moved from
-
-  // Second call with same key should result in a no-op, returning an iterator
-  // to the existing element and returning false as the second pair member.
-  // Key and values that were attempted to be inserted should be left intact.
-  key = MoveOnlyInt(1);
-  auto paired_val = std::make_pair(MoveOnlyInt(33), MoveOnlyInt(55));
-  // Test construction of mapped_type from pair.
-  result = m.try_emplace(std::move(key), std::move(paired_val));
-  EXPECT_EQ(1, result.first->first.data());
-  EXPECT_EQ(22, result.first->second.first.data());
-  EXPECT_EQ(44, result.first->second.second.data());
-  EXPECT_FALSE(result.second);
-  EXPECT_EQ(1u, m.size());
-  EXPECT_EQ(1, key.data());                 // not moved from
-  EXPECT_EQ(33, paired_val.first.data());   // not moved from
-  EXPECT_EQ(55, paired_val.second.data());  // not moved from
-
-  // Check that random insertion results in sorted range.
-  base::flat_map<MoveOnlyInt, int> map;
-  for (int i : {3, 1, 5, 6, 8, 7, 0, 9, 4, 2}) {
-    map.try_emplace(MoveOnlyInt(i), i);
-    EXPECT_TRUE(std::is_sorted(map.begin(), map.end()));
-  }
-}
-
-// try_emplace(const_iterator hint, K&&, Args&&...)
-TEST(FlatMap, TryEmplaceMoveOnlyKeyWithHint) {
-  base::flat_map<MoveOnlyInt, std::pair<MoveOnlyInt, MoveOnlyInt>> m;
-
-  // Trying to emplace into an empty map should succeed. Insertion should return
-  // an iterator to the element. The inserted key and value should be moved
-  // from.
-  MoveOnlyInt key(1);
-  MoveOnlyInt val1(22);
-  MoveOnlyInt val2(44);
-  // Test piecewise construction of mapped_type.
-  auto result =
-      m.try_emplace(m.end(), std::move(key), std::move(val1), std::move(val2));
-  EXPECT_EQ(1, result->first.data());
-  EXPECT_EQ(22, result->second.first.data());
-  EXPECT_EQ(44, result->second.second.data());
-  EXPECT_EQ(1u, m.size());
-  EXPECT_EQ(0, key.data());   // moved from
-  EXPECT_EQ(0, val1.data());  // moved from
-  EXPECT_EQ(0, val2.data());  // moved from
-
-  // Second call with same key should result in a no-op, returning an iterator
-  // to the existing element. Key and values that were attempted to be inserted
-  // should be left intact.
-  key = MoveOnlyInt(1);
-  val1 = MoveOnlyInt(33);
-  val2 = MoveOnlyInt(55);
-  auto paired_val = std::make_pair(MoveOnlyInt(33), MoveOnlyInt(55));
-  // Test construction of mapped_type from pair.
-  result = m.try_emplace(m.end(), std::move(key), std::move(paired_val));
-  EXPECT_EQ(1, result->first.data());
-  EXPECT_EQ(22, result->second.first.data());
-  EXPECT_EQ(44, result->second.second.data());
-  EXPECT_EQ(1u, m.size());
-  EXPECT_EQ(1, key.data());                 // not moved from
-  EXPECT_EQ(33, paired_val.first.data());   // not moved from
-  EXPECT_EQ(55, paired_val.second.data());  // not moved from
-
-  // Check that random insertion results in sorted range.
-  base::flat_map<MoveOnlyInt, int> map;
-  for (int i : {3, 1, 5, 6, 8, 7, 0, 9, 4, 2}) {
-    map.try_emplace(map.end(), MoveOnlyInt(i), i);
-    EXPECT_TRUE(std::is_sorted(map.begin(), map.end()));
-  }
-}
-
-TEST(FlatMap, UsingTransparentCompare) {
-  using ExplicitInt = base::MoveOnlyInt;
-  base::flat_map<ExplicitInt, int> m;
-  const auto& m1 = m;
-  int x = 0;
-
-  // Check if we can use lookup functions without converting to key_type.
-  // Correctness is checked in flat_tree tests.
-  m.count(x);
-  m1.count(x);
-  m.find(x);
-  m1.find(x);
-  m.equal_range(x);
-  m1.equal_range(x);
-  m.lower_bound(x);
-  m1.lower_bound(x);
-  m.upper_bound(x);
-  m1.upper_bound(x);
-  m.erase(x);
-
-  // Check if we broke overload resolution.
-  m.emplace(ExplicitInt(0), 0);
-  m.emplace(ExplicitInt(1), 0);
-  m.erase(m.begin());
-  m.erase(m.cbegin());
-}
-
-}  // namespace base
diff --git a/base/containers/flat_set_unittest.cc b/base/containers/flat_set_unittest.cc
deleted file mode 100644
index 4596975..0000000
--- a/base/containers/flat_set_unittest.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/flat_set.h"
-
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/test/move_only_int.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-// A flat_set is basically a interface to flat_tree. So several basic
-// operations are tested to make sure things are set up properly, but the bulk
-// of the tests are in flat_tree_unittests.cc.
-
-using ::testing::ElementsAre;
-
-namespace base {
-
-TEST(FlatSet, IncompleteType) {
-  struct A {
-    using Set = flat_set<A>;
-    int data;
-    Set set_with_incomplete_type;
-    Set::iterator it;
-    Set::const_iterator cit;
-
-    // We do not declare operator< because clang complains that it's unused.
-  };
-
-  A a;
-}
-
-TEST(FlatSet, RangeConstructor) {
-  flat_set<int>::value_type input_vals[] = {1, 1, 1, 2, 2, 2, 3, 3, 3};
-
-  flat_set<int> cont(std::begin(input_vals), std::end(input_vals),
-                     base::KEEP_FIRST_OF_DUPES);
-  EXPECT_THAT(cont, ElementsAre(1, 2, 3));
-}
-
-TEST(FlatSet, MoveConstructor) {
-  int input_range[] = {1, 2, 3, 4};
-
-  flat_set<MoveOnlyInt> original(std::begin(input_range), std::end(input_range),
-                                 base::KEEP_FIRST_OF_DUPES);
-  flat_set<MoveOnlyInt> moved(std::move(original));
-
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(1)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(2)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(3)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(4)));
-}
-
-TEST(FlatSet, InitializerListConstructor) {
-  flat_set<int> cont({1, 2, 3, 4, 5, 6, 10, 8}, KEEP_FIRST_OF_DUPES);
-  EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
-}
-
-TEST(FlatSet, InsertFindSize) {
-  base::flat_set<int> s;
-  s.insert(1);
-  s.insert(1);
-  s.insert(2);
-
-  EXPECT_EQ(2u, s.size());
-  EXPECT_EQ(1, *s.find(1));
-  EXPECT_EQ(2, *s.find(2));
-  EXPECT_EQ(s.end(), s.find(7));
-}
-
-TEST(FlatSet, CopySwap) {
-  base::flat_set<int> original;
-  original.insert(1);
-  original.insert(2);
-  EXPECT_THAT(original, ElementsAre(1, 2));
-
-  base::flat_set<int> copy(original);
-  EXPECT_THAT(copy, ElementsAre(1, 2));
-
-  copy.erase(copy.begin());
-  copy.insert(10);
-  EXPECT_THAT(copy, ElementsAre(2, 10));
-
-  original.swap(copy);
-  EXPECT_THAT(original, ElementsAre(2, 10));
-  EXPECT_THAT(copy, ElementsAre(1, 2));
-}
-
-TEST(FlatSet, UsingTransparentCompare) {
-  using ExplicitInt = base::MoveOnlyInt;
-  base::flat_set<ExplicitInt> s;
-  const auto& s1 = s;
-  int x = 0;
-
-  // Check if we can use lookup functions without converting to key_type.
-  // Correctness is checked in flat_tree tests.
-  s.count(x);
-  s1.count(x);
-  s.find(x);
-  s1.find(x);
-  s.equal_range(x);
-  s1.equal_range(x);
-  s.lower_bound(x);
-  s1.lower_bound(x);
-  s.upper_bound(x);
-  s1.upper_bound(x);
-  s.erase(x);
-
-  // Check if we broke overload resolution.
-  s.emplace(0);
-  s.emplace(1);
-  s.erase(s.begin());
-  s.erase(s.cbegin());
-}
-
-}  // namespace base
diff --git a/base/containers/flat_tree_unittest.cc b/base/containers/flat_tree_unittest.cc
deleted file mode 100644
index 5b788d5..0000000
--- a/base/containers/flat_tree_unittest.cc
+++ /dev/null
@@ -1,1385 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/flat_tree.h"
-
-// Following tests are ported and extended tests from libcpp for std::set.
-// They can be found here:
-// https://github.com/llvm-mirror/libcxx/tree/master/test/std/containers/associative/set
-//
-// Not ported tests:
-// * No tests with PrivateConstructor and std::less<> changed to std::less<T>
-//   These tests have to do with C++14 std::less<>
-//   http://en.cppreference.com/w/cpp/utility/functional/less_void
-//   and add support for templated versions of lookup functions.
-//   Because we use same implementation, we figured that it's OK just to check
-//   compilation and this is what we do in flat_set_unittest/flat_map_unittest.
-// * No tests for max_size()
-//   Has to do with allocator support.
-// * No tests with DefaultOnly.
-//   Standard containers allocate each element in the separate node on the heap
-//   and then manipulate these nodes. Flat containers store their elements in
-//   contiguous memory and move them around, type is required to be movable.
-// * No tests for N3644.
-//   This proposal suggests that all default constructed iterators compare
-//   equal. Currently we use std::vector iterators and they don't implement
-//   this.
-// * No tests with min_allocator and no tests counting allocations.
-//   Flat sets currently don't support allocators.
-
-#include <forward_list>
-#include <functional>
-#include <iterator>
-#include <list>
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/template_util.h"
-#include "base/test/move_only_int.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-namespace {
-
-template <class It>
-class InputIterator {
- public:
-  using iterator_category = std::input_iterator_tag;
-  using value_type = typename std::iterator_traits<It>::value_type;
-  using difference_type = typename std::iterator_traits<It>::difference_type;
-  using pointer = It;
-  using reference = typename std::iterator_traits<It>::reference;
-
-  InputIterator() : it_() {}
-  explicit InputIterator(It it) : it_(it) {}
-
-  reference operator*() const { return *it_; }
-  pointer operator->() const { return it_; }
-
-  InputIterator& operator++() {
-    ++it_;
-    return *this;
-  }
-  InputIterator operator++(int) {
-    InputIterator tmp(*this);
-    ++(*this);
-    return tmp;
-  }
-
-  friend bool operator==(const InputIterator& lhs, const InputIterator& rhs) {
-    return lhs.it_ == rhs.it_;
-  }
-  friend bool operator!=(const InputIterator& lhs, const InputIterator& rhs) {
-    return !(lhs == rhs);
-  }
-
- private:
-  It it_;
-};
-
-template <typename It>
-InputIterator<It> MakeInputIterator(It it) {
-  return InputIterator<It>(it);
-}
-
-class Emplaceable {
- public:
-  Emplaceable() : Emplaceable(0, 0.0) {}
-  Emplaceable(int i, double d) : int_(i), double_(d) {}
-  Emplaceable(Emplaceable&& other) : int_(other.int_), double_(other.double_) {
-    other.int_ = 0;
-    other.double_ = 0.0;
-  }
-
-  Emplaceable& operator=(Emplaceable&& other) {
-    int_ = other.int_;
-    other.int_ = 0;
-    double_ = other.double_;
-    other.double_ = 0.0;
-    return *this;
-  }
-
-  friend bool operator==(const Emplaceable& lhs, const Emplaceable& rhs) {
-    return std::tie(lhs.int_, lhs.double_) == std::tie(rhs.int_, rhs.double_);
-  }
-
-  friend bool operator<(const Emplaceable& lhs, const Emplaceable& rhs) {
-    return std::tie(lhs.int_, lhs.double_) < std::tie(rhs.int_, rhs.double_);
-  }
-
- private:
-  int int_;
-  double double_;
-
-  DISALLOW_COPY_AND_ASSIGN(Emplaceable);
-};
-
-struct TemplateConstructor {
-  template <typename T>
-  TemplateConstructor(const T&) {}
-
-  friend bool operator<(const TemplateConstructor&,
-                        const TemplateConstructor&) {
-    return false;
-  }
-};
-
-class NonDefaultConstructibleCompare {
- public:
-  explicit NonDefaultConstructibleCompare(int) {}
-
-  template <typename T>
-  bool operator()(const T& lhs, const T& rhs) const {
-    return std::less<T>()(lhs, rhs);
-  }
-};
-
-template <class PairType>
-struct LessByFirst {
-  bool operator()(const PairType& lhs, const PairType& rhs) const {
-    return lhs.first < rhs.first;
-  }
-};
-
-// Common test trees.
-using IntTree =
-    flat_tree<int, int, GetKeyFromValueIdentity<int>, std::less<int>>;
-using IntPair = std::pair<int, int>;
-using IntPairTree = flat_tree<IntPair,
-                              IntPair,
-                              GetKeyFromValueIdentity<IntPair>,
-                              LessByFirst<IntPair>>;
-using MoveOnlyTree = flat_tree<MoveOnlyInt,
-                               MoveOnlyInt,
-                               GetKeyFromValueIdentity<MoveOnlyInt>,
-                               std::less<MoveOnlyInt>>;
-using EmplaceableTree = flat_tree<Emplaceable,
-                                  Emplaceable,
-                                  GetKeyFromValueIdentity<Emplaceable>,
-                                  std::less<Emplaceable>>;
-using ReversedTree =
-    flat_tree<int, int, GetKeyFromValueIdentity<int>, std::greater<int>>;
-
-using TreeWithStrangeCompare = flat_tree<int,
-                                         int,
-                                         GetKeyFromValueIdentity<int>,
-                                         NonDefaultConstructibleCompare>;
-
-using ::testing::ElementsAre;
-
-}  // namespace
-
-TEST(FlatTree, IsMultipass) {
-  static_assert(!is_multipass<std::istream_iterator<int>>(),
-                "InputIterator is not multipass");
-  static_assert(!is_multipass<std::ostream_iterator<int>>(),
-                "OutputIterator is not multipass");
-
-  static_assert(is_multipass<std::forward_list<int>::iterator>(),
-                "ForwardIterator is multipass");
-  static_assert(is_multipass<std::list<int>::iterator>(),
-                "BidirectionalIterator is multipass");
-  static_assert(is_multipass<std::vector<int>::iterator>(),
-                "RandomAccessIterator is multipass");
-}
-
-TEST(FlatTree, LastUnique) {
-  using Pair = std::pair<int, int>;
-  using Vect = std::vector<Pair>;
-
-  auto cmp = [](const Pair& lhs, const Pair& rhs) {
-    return lhs.first == rhs.first;
-  };
-
-  // Empty case.
-  Vect empty;
-  EXPECT_EQ(empty.end(), LastUnique(empty.begin(), empty.end(), cmp));
-
-  // Single element.
-  Vect one;
-  one.push_back(Pair(1, 1));
-  EXPECT_EQ(one.end(), LastUnique(one.begin(), one.end(), cmp));
-  ASSERT_EQ(1u, one.size());
-  EXPECT_THAT(one, ElementsAre(Pair(1, 1)));
-
-  // Two elements, already unique.
-  Vect two_u;
-  two_u.push_back(Pair(1, 1));
-  two_u.push_back(Pair(2, 2));
-  EXPECT_EQ(two_u.end(), LastUnique(two_u.begin(), two_u.end(), cmp));
-  EXPECT_THAT(two_u, ElementsAre(Pair(1, 1), Pair(2, 2)));
-
-  // Two elements, dupes.
-  Vect two_d;
-  two_d.push_back(Pair(1, 1));
-  two_d.push_back(Pair(1, 2));
-  auto last = LastUnique(two_d.begin(), two_d.end(), cmp);
-  EXPECT_EQ(two_d.begin() + 1, last);
-  two_d.erase(last, two_d.end());
-  EXPECT_THAT(two_d, ElementsAre(Pair(1, 2)));
-
-  // Non-dupes, dupes, non-dupes.
-  Vect ndn;
-  ndn.push_back(Pair(1, 1));
-  ndn.push_back(Pair(2, 1));
-  ndn.push_back(Pair(2, 2));
-  ndn.push_back(Pair(2, 3));
-  ndn.push_back(Pair(3, 1));
-  last = LastUnique(ndn.begin(), ndn.end(), cmp);
-  EXPECT_EQ(ndn.begin() + 3, last);
-  ndn.erase(last, ndn.end());
-  EXPECT_THAT(ndn, ElementsAre(Pair(1, 1), Pair(2, 3), Pair(3, 1)));
-
-  // Dupes, non-dupes, dupes.
-  Vect dnd;
-  dnd.push_back(Pair(1, 1));
-  dnd.push_back(Pair(1, 2));
-  dnd.push_back(Pair(1, 3));
-  dnd.push_back(Pair(2, 1));
-  dnd.push_back(Pair(3, 1));
-  dnd.push_back(Pair(3, 2));
-  dnd.push_back(Pair(3, 3));
-  last = LastUnique(dnd.begin(), dnd.end(), cmp);
-  EXPECT_EQ(dnd.begin() + 3, last);
-  dnd.erase(last, dnd.end());
-  EXPECT_THAT(dnd, ElementsAre(Pair(1, 3), Pair(2, 1), Pair(3, 3)));
-}
-
-// ----------------------------------------------------------------------------
-// Class.
-
-// Check that flat_tree and its iterators can be instantiated with an
-// incomplete type.
-
-TEST(FlatTree, IncompleteType) {
-  struct A {
-    using Tree = flat_tree<A, A, GetKeyFromValueIdentity<A>, std::less<A>>;
-    int data;
-    Tree set_with_incomplete_type;
-    Tree::iterator it;
-    Tree::const_iterator cit;
-
-    // We do not declare operator< because clang complains that it's unused.
-  };
-
-  A a;
-}
-
-TEST(FlatTree, Stability) {
-  using Pair = std::pair<int, int>;
-
-  using Tree =
-      flat_tree<Pair, Pair, GetKeyFromValueIdentity<Pair>, LessByFirst<Pair>>;
-
-  // Constructors are stable.
-  Tree cont({{0, 0}, {1, 0}, {0, 1}, {2, 0}, {0, 2}, {1, 1}});
-
-  auto AllOfSecondsAreZero = [&cont] {
-    return std::all_of(cont.begin(), cont.end(),
-                       [](const Pair& elem) { return elem.second == 0; });
-  };
-
-  EXPECT_TRUE(AllOfSecondsAreZero()) << "constructor should be stable";
-
-  // Should not replace existing.
-  cont.insert(Pair(0, 2));
-  cont.insert(Pair(1, 2));
-  cont.insert(Pair(2, 2));
-
-  EXPECT_TRUE(AllOfSecondsAreZero()) << "insert should be stable";
-
-  cont.insert(Pair(3, 0));
-  cont.insert(Pair(3, 2));
-
-  EXPECT_TRUE(AllOfSecondsAreZero()) << "insert should be stable";
-}
-
-// ----------------------------------------------------------------------------
-// Types.
-
-// key_type
-// key_compare
-// value_type
-// value_compare
-// pointer
-// const_pointer
-// reference
-// const_reference
-// size_type
-// difference_type
-// iterator
-// const_iterator
-// reverse_iterator
-// const_reverse_iterator
-
-TEST(FlatTree, Types) {
-  // These are guaranteed to be portable.
-  static_assert((std::is_same<int, IntTree::key_type>::value), "");
-  static_assert((std::is_same<int, IntTree::value_type>::value), "");
-  static_assert((std::is_same<std::less<int>, IntTree::key_compare>::value),
-                "");
-  static_assert((std::is_same<int&, IntTree::reference>::value), "");
-  static_assert((std::is_same<const int&, IntTree::const_reference>::value),
-                "");
-  static_assert((std::is_same<int*, IntTree::pointer>::value), "");
-  static_assert((std::is_same<const int*, IntTree::const_pointer>::value), "");
-}
-
-// ----------------------------------------------------------------------------
-// Lifetime.
-
-// flat_tree()
-// flat_tree(const Compare& comp)
-
-TEST(FlatTree, DefaultConstructor) {
-  {
-    IntTree cont;
-    EXPECT_THAT(cont, ElementsAre());
-  }
-
-  {
-    TreeWithStrangeCompare cont(NonDefaultConstructibleCompare(0));
-    EXPECT_THAT(cont, ElementsAre());
-  }
-}
-
-// flat_tree(InputIterator first,
-//           InputIterator last,
-//           FlatContainerDupes dupe_handling,
-//           const Compare& comp = Compare())
-
-TEST(FlatTree, RangeConstructor) {
-  {
-    IntPair input_vals[] = {{1, 1}, {1, 2}, {2, 1}, {2, 2}, {1, 3},
-                            {2, 3}, {3, 1}, {3, 2}, {3, 3}};
-
-    IntPairTree first_of(MakeInputIterator(std::begin(input_vals)),
-                         MakeInputIterator(std::end(input_vals)));
-    EXPECT_THAT(first_of,
-                ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1)));
-
-    IntPairTree last_of(MakeInputIterator(std::begin(input_vals)),
-                        MakeInputIterator(std::end(input_vals)),
-                        KEEP_LAST_OF_DUPES);
-    EXPECT_THAT(last_of,
-                ElementsAre(IntPair(1, 3), IntPair(2, 3), IntPair(3, 3)));
-  }
-  {
-    TreeWithStrangeCompare::value_type input_vals[] = {1, 1, 1, 2, 2,
-                                                       2, 3, 3, 3};
-
-    TreeWithStrangeCompare cont(MakeInputIterator(std::begin(input_vals)),
-                                MakeInputIterator(std::end(input_vals)),
-                                KEEP_FIRST_OF_DUPES,
-                                NonDefaultConstructibleCompare(0));
-    EXPECT_THAT(cont, ElementsAre(1, 2, 3));
-  }
-}
-
-// flat_tree(const flat_tree& x)
-
-TEST(FlatTree, CopyConstructor) {
-  IntTree original({1, 2, 3, 4});
-  IntTree copied(original);
-
-  EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4));
-
-  EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4));
-  EXPECT_THAT(original, ElementsAre(1, 2, 3, 4));
-  EXPECT_EQ(original, copied);
-}
-
-// flat_tree(flat_tree&& x)
-
-TEST(FlatTree, MoveConstructor) {
-  int input_range[] = {1, 2, 3, 4};
-
-  MoveOnlyTree original(std::begin(input_range), std::end(input_range));
-  MoveOnlyTree moved(std::move(original));
-
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(1)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(2)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(3)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(4)));
-}
-
-// flat_tree(std::vector<value_type>, FlatContainerDupes dupe_handling)
-
-TEST(FlatTree, VectorConstructor) {
-  using Pair = std::pair<int, MoveOnlyInt>;
-
-  // Construct an unsorted vector with a duplicate item in it. Sorted by the
-  // first item, the second allows us to test for stability. Using a move
-  // only type to ensure the vector is not copied.
-  std::vector<Pair> storage;
-  storage.push_back(Pair(2, MoveOnlyInt(0)));
-  storage.push_back(Pair(1, MoveOnlyInt(0)));
-  storage.push_back(Pair(2, MoveOnlyInt(1)));
-
-  using Tree =
-      flat_tree<Pair, Pair, GetKeyFromValueIdentity<Pair>, LessByFirst<Pair>>;
-  Tree tree(std::move(storage));
-
-  // The list should be two items long, with only the first "2" saved.
-  ASSERT_EQ(2u, tree.size());
-  const Pair& zeroth = *tree.begin();
-  ASSERT_EQ(1, zeroth.first);
-  ASSERT_EQ(0, zeroth.second.data());
-
-  const Pair& first = *(tree.begin() + 1);
-  ASSERT_EQ(2, first.first);
-  ASSERT_EQ(0, first.second.data());
-
-  // Test KEEP_LAST_OF_DUPES with a simple vector constructor.
-  std::vector<IntPair> int_storage{{1, 1}, {1, 2}, {2, 1}};
-  IntPairTree int_tree(std::move(int_storage), KEEP_LAST_OF_DUPES);
-  EXPECT_THAT(int_tree, ElementsAre(IntPair(1, 2), IntPair(2, 1)));
-}
-
-// flat_tree(std::initializer_list<value_type> ilist,
-//           FlatContainerDupes dupe_handling,
-//           const Compare& comp = Compare())
-
-TEST(FlatTree, InitializerListConstructor) {
-  {
-    IntTree cont({1, 2, 3, 4, 5, 6, 10, 8});
-    EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
-  }
-  {
-    IntTree cont({1, 2, 3, 4, 5, 6, 10, 8});
-    EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
-  }
-  {
-    TreeWithStrangeCompare cont({1, 2, 3, 4, 5, 6, 10, 8}, KEEP_FIRST_OF_DUPES,
-                                NonDefaultConstructibleCompare(0));
-    EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
-  }
-  {
-    IntPairTree first_of({{1, 1}, {2, 1}, {1, 2}});
-    EXPECT_THAT(first_of, ElementsAre(IntPair(1, 1), IntPair(2, 1)));
-  }
-  {
-    IntPairTree last_of({{1, 1}, {2, 1}, {1, 2}}, KEEP_LAST_OF_DUPES);
-    EXPECT_THAT(last_of, ElementsAre(IntPair(1, 2), IntPair(2, 1)));
-  }
-}
-
-// ----------------------------------------------------------------------------
-// Assignments.
-
-// flat_tree& operator=(const flat_tree&)
-
-TEST(FlatTree, CopyAssignable) {
-  IntTree original({1, 2, 3, 4});
-  IntTree copied;
-  copied = original;
-
-  EXPECT_THAT(copied, ElementsAre(1, 2, 3, 4));
-  EXPECT_THAT(original, ElementsAre(1, 2, 3, 4));
-  EXPECT_EQ(original, copied);
-}
-
-// flat_tree& operator=(flat_tree&&)
-
-TEST(FlatTree, MoveAssignable) {
-  int input_range[] = {1, 2, 3, 4};
-
-  MoveOnlyTree original(std::begin(input_range), std::end(input_range));
-  MoveOnlyTree moved;
-  moved = std::move(original);
-
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(1)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(2)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(3)));
-  EXPECT_EQ(1U, moved.count(MoveOnlyInt(4)));
-}
-
-// flat_tree& operator=(std::initializer_list<value_type> ilist)
-
-TEST(FlatTree, InitializerListAssignable) {
-  IntTree cont({0});
-  cont = {1, 2, 3, 4, 5, 6, 10, 8};
-
-  EXPECT_EQ(0U, cont.count(0));
-  EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 8, 10));
-}
-
-// --------------------------------------------------------------------------
-// Memory management.
-
-// void reserve(size_type new_capacity)
-
-TEST(FlatTree, Reserve) {
-  IntTree cont({1, 2, 3});
-
-  cont.reserve(5);
-  EXPECT_LE(5U, cont.capacity());
-}
-
-// size_type capacity() const
-
-TEST(FlatTree, Capacity) {
-  IntTree cont({1, 2, 3});
-
-  EXPECT_LE(cont.size(), cont.capacity());
-  cont.reserve(5);
-  EXPECT_LE(cont.size(), cont.capacity());
-}
-
-// void shrink_to_fit()
-
-TEST(FlatTree, ShrinkToFit) {
-  IntTree cont({1, 2, 3});
-
-  IntTree::size_type capacity_before = cont.capacity();
-  cont.shrink_to_fit();
-  EXPECT_GE(capacity_before, cont.capacity());
-}
-
-// ----------------------------------------------------------------------------
-// Size management.
-
-// void clear()
-
-TEST(FlatTree, Clear) {
-  IntTree cont({1, 2, 3, 4, 5, 6, 7, 8});
-  cont.clear();
-  EXPECT_THAT(cont, ElementsAre());
-}
-
-// size_type size() const
-
-TEST(FlatTree, Size) {
-  IntTree cont;
-
-  EXPECT_EQ(0U, cont.size());
-  cont.insert(2);
-  EXPECT_EQ(1U, cont.size());
-  cont.insert(1);
-  EXPECT_EQ(2U, cont.size());
-  cont.insert(3);
-  EXPECT_EQ(3U, cont.size());
-  cont.erase(cont.begin());
-  EXPECT_EQ(2U, cont.size());
-  cont.erase(cont.begin());
-  EXPECT_EQ(1U, cont.size());
-  cont.erase(cont.begin());
-  EXPECT_EQ(0U, cont.size());
-}
-
-// bool empty() const
-
-TEST(FlatTree, Empty) {
-  IntTree cont;
-
-  EXPECT_TRUE(cont.empty());
-  cont.insert(1);
-  EXPECT_FALSE(cont.empty());
-  cont.clear();
-  EXPECT_TRUE(cont.empty());
-}
-
-// ----------------------------------------------------------------------------
-// Iterators.
-
-// iterator begin()
-// const_iterator begin() const
-// iterator end()
-// const_iterator end() const
-//
-// reverse_iterator rbegin()
-// const_reverse_iterator rbegin() const
-// reverse_iterator rend()
-// const_reverse_iterator rend() const
-//
-// const_iterator cbegin() const
-// const_iterator cend() const
-// const_reverse_iterator crbegin() const
-// const_reverse_iterator crend() const
-
-TEST(FlatTree, Iterators) {
-  IntTree cont({1, 2, 3, 4, 5, 6, 7, 8});
-
-  auto size = static_cast<IntTree::difference_type>(cont.size());
-
-  EXPECT_EQ(size, std::distance(cont.begin(), cont.end()));
-  EXPECT_EQ(size, std::distance(cont.cbegin(), cont.cend()));
-  EXPECT_EQ(size, std::distance(cont.rbegin(), cont.rend()));
-  EXPECT_EQ(size, std::distance(cont.crbegin(), cont.crend()));
-
-  {
-    IntTree::iterator it = cont.begin();
-    IntTree::const_iterator c_it = cont.cbegin();
-    EXPECT_EQ(it, c_it);
-    for (int j = 1; it != cont.end(); ++it, ++c_it, ++j) {
-      EXPECT_EQ(j, *it);
-      EXPECT_EQ(j, *c_it);
-    }
-  }
-  {
-    IntTree::reverse_iterator rit = cont.rbegin();
-    IntTree::const_reverse_iterator c_rit = cont.crbegin();
-    EXPECT_EQ(rit, c_rit);
-    for (int j = static_cast<int>(size); rit != cont.rend();
-         ++rit, ++c_rit, --j) {
-      EXPECT_EQ(j, *rit);
-      EXPECT_EQ(j, *c_rit);
-    }
-  }
-}
-
-// ----------------------------------------------------------------------------
-// Insert operations.
-
-// pair<iterator, bool> insert(const value_type& val)
-
-TEST(FlatTree, InsertLValue) {
-  IntTree cont;
-
-  int value = 2;
-  std::pair<IntTree::iterator, bool> result = cont.insert(value);
-  EXPECT_TRUE(result.second);
-  EXPECT_EQ(cont.begin(), result.first);
-  EXPECT_EQ(1U, cont.size());
-  EXPECT_EQ(2, *result.first);
-
-  value = 1;
-  result = cont.insert(value);
-  EXPECT_TRUE(result.second);
-  EXPECT_EQ(cont.begin(), result.first);
-  EXPECT_EQ(2U, cont.size());
-  EXPECT_EQ(1, *result.first);
-
-  value = 3;
-  result = cont.insert(value);
-  EXPECT_TRUE(result.second);
-  EXPECT_EQ(std::prev(cont.end()), result.first);
-  EXPECT_EQ(3U, cont.size());
-  EXPECT_EQ(3, *result.first);
-
-  value = 3;
-  result = cont.insert(value);
-  EXPECT_FALSE(result.second);
-  EXPECT_EQ(std::prev(cont.end()), result.first);
-  EXPECT_EQ(3U, cont.size());
-  EXPECT_EQ(3, *result.first);
-}
-
-// pair<iterator, bool> insert(value_type&& val)
-
-TEST(FlatTree, InsertRValue) {
-  MoveOnlyTree cont;
-
-  std::pair<MoveOnlyTree::iterator, bool> result = cont.insert(MoveOnlyInt(2));
-  EXPECT_TRUE(result.second);
-  EXPECT_EQ(cont.begin(), result.first);
-  EXPECT_EQ(1U, cont.size());
-  EXPECT_EQ(2, result.first->data());
-
-  result = cont.insert(MoveOnlyInt(1));
-  EXPECT_TRUE(result.second);
-  EXPECT_EQ(cont.begin(), result.first);
-  EXPECT_EQ(2U, cont.size());
-  EXPECT_EQ(1, result.first->data());
-
-  result = cont.insert(MoveOnlyInt(3));
-  EXPECT_TRUE(result.second);
-  EXPECT_EQ(std::prev(cont.end()), result.first);
-  EXPECT_EQ(3U, cont.size());
-  EXPECT_EQ(3, result.first->data());
-
-  result = cont.insert(MoveOnlyInt(3));
-  EXPECT_FALSE(result.second);
-  EXPECT_EQ(std::prev(cont.end()), result.first);
-  EXPECT_EQ(3U, cont.size());
-  EXPECT_EQ(3, result.first->data());
-}
-
-// iterator insert(const_iterator position_hint, const value_type& val)
-
-TEST(FlatTree, InsertPositionLValue) {
-  IntTree cont;
-
-  IntTree::iterator result = cont.insert(cont.cend(), 2);
-  EXPECT_EQ(cont.begin(), result);
-  EXPECT_EQ(1U, cont.size());
-  EXPECT_EQ(2, *result);
-
-  result = cont.insert(cont.cend(), 1);
-  EXPECT_EQ(cont.begin(), result);
-  EXPECT_EQ(2U, cont.size());
-  EXPECT_EQ(1, *result);
-
-  result = cont.insert(cont.cend(), 3);
-  EXPECT_EQ(std::prev(cont.end()), result);
-  EXPECT_EQ(3U, cont.size());
-  EXPECT_EQ(3, *result);
-
-  result = cont.insert(cont.cend(), 3);
-  EXPECT_EQ(std::prev(cont.end()), result);
-  EXPECT_EQ(3U, cont.size());
-  EXPECT_EQ(3, *result);
-}
-
-// iterator insert(const_iterator position_hint, value_type&& val)
-
-TEST(FlatTree, InsertPositionRValue) {
-  MoveOnlyTree cont;
-
-  MoveOnlyTree::iterator result = cont.insert(cont.cend(), MoveOnlyInt(2));
-  EXPECT_EQ(cont.begin(), result);
-  EXPECT_EQ(1U, cont.size());
-  EXPECT_EQ(2, result->data());
-
-  result = cont.insert(cont.cend(), MoveOnlyInt(1));
-  EXPECT_EQ(cont.begin(), result);
-  EXPECT_EQ(2U, cont.size());
-  EXPECT_EQ(1, result->data());
-
-  result = cont.insert(cont.cend(), MoveOnlyInt(3));
-  EXPECT_EQ(std::prev(cont.end()), result);
-  EXPECT_EQ(3U, cont.size());
-  EXPECT_EQ(3, result->data());
-
-  result = cont.insert(cont.cend(), MoveOnlyInt(3));
-  EXPECT_EQ(std::prev(cont.end()), result);
-  EXPECT_EQ(3U, cont.size());
-  EXPECT_EQ(3, result->data());
-}
-
-// template <class InputIterator>
-//   void insert(InputIterator first, InputIterator last);
-
-TEST(FlatTree, InsertIterIter) {
-  struct GetKeyFromIntIntPair {
-    const int& operator()(const std::pair<int, int>& p) const {
-      return p.first;
-    }
-  };
-
-  using IntIntMap =
-      flat_tree<int, IntPair, GetKeyFromIntIntPair, std::less<int>>;
-
-  {
-    IntIntMap cont;
-    IntPair int_pairs[] = {{3, 1}, {1, 1}, {4, 1}, {2, 1}};
-    cont.insert(std::begin(int_pairs), std::end(int_pairs));
-    EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
-                                  IntPair(4, 1)));
-  }
-
-  {
-    IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
-    std::vector<IntPair> int_pairs;
-    cont.insert(std::begin(int_pairs), std::end(int_pairs));
-    EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
-                                  IntPair(4, 1)));
-  }
-
-  {
-    IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
-    IntPair int_pairs[] = {{1, 1}};
-    cont.insert(std::begin(int_pairs), std::end(int_pairs));
-    EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
-                                  IntPair(4, 1)));
-  }
-
-  {
-    IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
-    IntPair int_pairs[] = {{1, 2}};
-    cont.insert(std::begin(int_pairs), std::end(int_pairs), KEEP_LAST_OF_DUPES);
-    EXPECT_THAT(cont, ElementsAre(IntPair(1, 2), IntPair(2, 1), IntPair(3, 1),
-                                  IntPair(4, 1)));
-  }
-
-  {
-    IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
-    IntPair int_pairs[] = {{5, 1}};
-    cont.insert(std::begin(int_pairs), std::end(int_pairs));
-    EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
-                                  IntPair(4, 1), IntPair(5, 1)));
-  }
-
-  {
-    IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
-    IntPair int_pairs[] = {{5, 1}};
-    cont.insert(std::begin(int_pairs), std::end(int_pairs), KEEP_LAST_OF_DUPES);
-    EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
-                                  IntPair(4, 1), IntPair(5, 1)));
-  }
-
-  {
-    IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
-    IntPair int_pairs[] = {{3, 2}, {1, 2}, {4, 2}, {2, 2}};
-    cont.insert(std::begin(int_pairs), std::end(int_pairs));
-    EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
-                                  IntPair(4, 1)));
-  }
-
-  {
-    IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
-    IntPair int_pairs[] = {{3, 2}, {1, 2}, {4, 2}, {2, 2}};
-    cont.insert(std::begin(int_pairs), std::end(int_pairs), KEEP_LAST_OF_DUPES);
-    EXPECT_THAT(cont, ElementsAre(IntPair(1, 2), IntPair(2, 2), IntPair(3, 2),
-                                  IntPair(4, 2)));
-  }
-
-  {
-    IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
-    IntPair int_pairs[] = {{3, 2}, {1, 2}, {4, 2}, {2, 2}, {7, 2}, {6, 2},
-                           {8, 2}, {5, 2}, {5, 3}, {6, 3}, {7, 3}, {8, 3}};
-    cont.insert(std::begin(int_pairs), std::end(int_pairs));
-    EXPECT_THAT(cont, ElementsAre(IntPair(1, 1), IntPair(2, 1), IntPair(3, 1),
-                                  IntPair(4, 1), IntPair(5, 2), IntPair(6, 2),
-                                  IntPair(7, 2), IntPair(8, 2)));
-  }
-
-  {
-    IntIntMap cont({{1, 1}, {2, 1}, {3, 1}, {4, 1}});
-    IntPair int_pairs[] = {{3, 2}, {1, 2}, {4, 2}, {2, 2}, {7, 2}, {6, 2},
-                           {8, 2}, {5, 2}, {5, 3}, {6, 3}, {7, 3}, {8, 3}};
-    cont.insert(std::begin(int_pairs), std::end(int_pairs), KEEP_LAST_OF_DUPES);
-    EXPECT_THAT(cont, ElementsAre(IntPair(1, 2), IntPair(2, 2), IntPair(3, 2),
-                                  IntPair(4, 2), IntPair(5, 3), IntPair(6, 3),
-                                  IntPair(7, 3), IntPair(8, 3)));
-  }
-}
-
-// template <class... Args>
-// pair<iterator, bool> emplace(Args&&... args)
-
-TEST(FlatTree, Emplace) {
-  {
-    EmplaceableTree cont;
-
-    std::pair<EmplaceableTree::iterator, bool> result = cont.emplace();
-    EXPECT_TRUE(result.second);
-    EXPECT_EQ(cont.begin(), result.first);
-    EXPECT_EQ(1U, cont.size());
-    EXPECT_EQ(Emplaceable(), *cont.begin());
-
-    result = cont.emplace(2, 3.5);
-    EXPECT_TRUE(result.second);
-    EXPECT_EQ(std::next(cont.begin()), result.first);
-    EXPECT_EQ(2U, cont.size());
-    EXPECT_EQ(Emplaceable(2, 3.5), *result.first);
-
-    result = cont.emplace(2, 3.5);
-    EXPECT_FALSE(result.second);
-    EXPECT_EQ(std::next(cont.begin()), result.first);
-    EXPECT_EQ(2U, cont.size());
-    EXPECT_EQ(Emplaceable(2, 3.5), *result.first);
-  }
-  {
-    IntTree cont;
-
-    std::pair<IntTree::iterator, bool> result = cont.emplace(2);
-    EXPECT_TRUE(result.second);
-    EXPECT_EQ(cont.begin(), result.first);
-    EXPECT_EQ(1U, cont.size());
-    EXPECT_EQ(2, *result.first);
-  }
-}
-
-// template <class... Args>
-// iterator emplace_hint(const_iterator position_hint, Args&&... args)
-
-TEST(FlatTree, EmplacePosition) {
-  {
-    EmplaceableTree cont;
-
-    EmplaceableTree::iterator result = cont.emplace_hint(cont.cend());
-    EXPECT_EQ(cont.begin(), result);
-    EXPECT_EQ(1U, cont.size());
-    EXPECT_EQ(Emplaceable(), *cont.begin());
-
-    result = cont.emplace_hint(cont.cend(), 2, 3.5);
-    EXPECT_EQ(std::next(cont.begin()), result);
-    EXPECT_EQ(2U, cont.size());
-    EXPECT_EQ(Emplaceable(2, 3.5), *result);
-
-    result = cont.emplace_hint(cont.cbegin(), 2, 3.5);
-    EXPECT_EQ(std::next(cont.begin()), result);
-    EXPECT_EQ(2U, cont.size());
-    EXPECT_EQ(Emplaceable(2, 3.5), *result);
-  }
-  {
-    IntTree cont;
-
-    IntTree::iterator result = cont.emplace_hint(cont.cend(), 2);
-    EXPECT_EQ(cont.begin(), result);
-    EXPECT_EQ(1U, cont.size());
-    EXPECT_EQ(2, *result);
-  }
-}
-
-// ----------------------------------------------------------------------------
-// Erase operations.
-
-// iterator erase(const_iterator position_hint)
-
-TEST(FlatTree, ErasePosition) {
-  {
-    IntTree cont({1, 2, 3, 4, 5, 6, 7, 8});
-
-    IntTree::iterator it = cont.erase(std::next(cont.cbegin(), 3));
-    EXPECT_EQ(std::next(cont.begin(), 3), it);
-    EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8));
-
-    it = cont.erase(std::next(cont.cbegin(), 0));
-    EXPECT_EQ(cont.begin(), it);
-    EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7, 8));
-
-    it = cont.erase(std::next(cont.cbegin(), 5));
-    EXPECT_EQ(cont.end(), it);
-    EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7));
-
-    it = cont.erase(std::next(cont.cbegin(), 1));
-    EXPECT_EQ(std::next(cont.begin()), it);
-    EXPECT_THAT(cont, ElementsAre(2, 5, 6, 7));
-
-    it = cont.erase(std::next(cont.cbegin(), 2));
-    EXPECT_EQ(std::next(cont.begin(), 2), it);
-    EXPECT_THAT(cont, ElementsAre(2, 5, 7));
-
-    it = cont.erase(std::next(cont.cbegin(), 2));
-    EXPECT_EQ(std::next(cont.begin(), 2), it);
-    EXPECT_THAT(cont, ElementsAre(2, 5));
-
-    it = cont.erase(std::next(cont.cbegin(), 0));
-    EXPECT_EQ(std::next(cont.begin(), 0), it);
-    EXPECT_THAT(cont, ElementsAre(5));
-
-    it = cont.erase(cont.cbegin());
-    EXPECT_EQ(cont.begin(), it);
-    EXPECT_EQ(cont.end(), it);
-  }
-  //  This is LWG #2059.
-  //  There is a potential ambiguity between erase with an iterator and erase
-  //  with a key, if key has a templated constructor.
-  {
-    using T = TemplateConstructor;
-
-    flat_tree<T, T, GetKeyFromValueIdentity<T>, std::less<>> cont;
-    T v(0);
-
-    auto it = cont.find(v);
-    if (it != cont.end())
-      cont.erase(it);
-  }
-}
-
-// iterator erase(const_iterator first, const_iterator last)
-
-TEST(FlatTree, EraseRange) {
-  IntTree cont({1, 2, 3, 4, 5, 6, 7, 8});
-
-  IntTree::iterator it =
-      cont.erase(std::next(cont.cbegin(), 5), std::next(cont.cbegin(), 5));
-  EXPECT_EQ(std::next(cont.begin(), 5), it);
-  EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 7, 8));
-
-  it = cont.erase(std::next(cont.cbegin(), 3), std::next(cont.cbegin(), 4));
-  EXPECT_EQ(std::next(cont.begin(), 3), it);
-  EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8));
-
-  it = cont.erase(std::next(cont.cbegin(), 2), std::next(cont.cbegin(), 5));
-  EXPECT_EQ(std::next(cont.begin(), 2), it);
-  EXPECT_THAT(cont, ElementsAre(1, 2, 7, 8));
-
-  it = cont.erase(std::next(cont.cbegin(), 0), std::next(cont.cbegin(), 2));
-  EXPECT_EQ(std::next(cont.begin(), 0), it);
-  EXPECT_THAT(cont, ElementsAre(7, 8));
-
-  it = cont.erase(cont.cbegin(), cont.cend());
-  EXPECT_EQ(cont.begin(), it);
-  EXPECT_EQ(cont.end(), it);
-}
-
-// size_type erase(const key_type& key)
-
-TEST(FlatTree, EraseKey) {
-  IntTree cont({1, 2, 3, 4, 5, 6, 7, 8});
-
-  EXPECT_EQ(0U, cont.erase(9));
-  EXPECT_THAT(cont, ElementsAre(1, 2, 3, 4, 5, 6, 7, 8));
-
-  EXPECT_EQ(1U, cont.erase(4));
-  EXPECT_THAT(cont, ElementsAre(1, 2, 3, 5, 6, 7, 8));
-
-  EXPECT_EQ(1U, cont.erase(1));
-  EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7, 8));
-
-  EXPECT_EQ(1U, cont.erase(8));
-  EXPECT_THAT(cont, ElementsAre(2, 3, 5, 6, 7));
-
-  EXPECT_EQ(1U, cont.erase(3));
-  EXPECT_THAT(cont, ElementsAre(2, 5, 6, 7));
-
-  EXPECT_EQ(1U, cont.erase(6));
-  EXPECT_THAT(cont, ElementsAre(2, 5, 7));
-
-  EXPECT_EQ(1U, cont.erase(7));
-  EXPECT_THAT(cont, ElementsAre(2, 5));
-
-  EXPECT_EQ(1U, cont.erase(2));
-  EXPECT_THAT(cont, ElementsAre(5));
-
-  EXPECT_EQ(1U, cont.erase(5));
-  EXPECT_THAT(cont, ElementsAre());
-}
-
-// ----------------------------------------------------------------------------
-// Comparators.
-
-// key_compare key_comp() const
-
-TEST(FlatTree, KeyComp) {
-  ReversedTree cont({1, 2, 3, 4, 5});
-
-  EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.key_comp()));
-  int new_elements[] = {6, 7, 8, 9, 10};
-  std::copy(std::begin(new_elements), std::end(new_elements),
-            std::inserter(cont, cont.end()));
-  EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.key_comp()));
-}
-
-// value_compare value_comp() const
-
-TEST(FlatTree, ValueComp) {
-  ReversedTree cont({1, 2, 3, 4, 5});
-
-  EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.value_comp()));
-  int new_elements[] = {6, 7, 8, 9, 10};
-  std::copy(std::begin(new_elements), std::end(new_elements),
-            std::inserter(cont, cont.end()));
-  EXPECT_TRUE(std::is_sorted(cont.begin(), cont.end(), cont.value_comp()));
-}
-
-// ----------------------------------------------------------------------------
-// Search operations.
-
-// size_type count(const key_type& key) const
-
-TEST(FlatTree, Count) {
-  const IntTree cont({5, 6, 7, 8, 9, 10, 11, 12});
-
-  EXPECT_EQ(1U, cont.count(5));
-  EXPECT_EQ(1U, cont.count(6));
-  EXPECT_EQ(1U, cont.count(7));
-  EXPECT_EQ(1U, cont.count(8));
-  EXPECT_EQ(1U, cont.count(9));
-  EXPECT_EQ(1U, cont.count(10));
-  EXPECT_EQ(1U, cont.count(11));
-  EXPECT_EQ(1U, cont.count(12));
-  EXPECT_EQ(0U, cont.count(4));
-}
-
-// iterator find(const key_type& key)
-// const_iterator find(const key_type& key) const
-
-TEST(FlatTree, Find) {
-  {
-    IntTree cont({5, 6, 7, 8, 9, 10, 11, 12});
-
-    EXPECT_EQ(cont.begin(), cont.find(5));
-    EXPECT_EQ(std::next(cont.begin()), cont.find(6));
-    EXPECT_EQ(std::next(cont.begin(), 2), cont.find(7));
-    EXPECT_EQ(std::next(cont.begin(), 3), cont.find(8));
-    EXPECT_EQ(std::next(cont.begin(), 4), cont.find(9));
-    EXPECT_EQ(std::next(cont.begin(), 5), cont.find(10));
-    EXPECT_EQ(std::next(cont.begin(), 6), cont.find(11));
-    EXPECT_EQ(std::next(cont.begin(), 7), cont.find(12));
-    EXPECT_EQ(std::next(cont.begin(), 8), cont.find(4));
-  }
-  {
-    const IntTree cont({5, 6, 7, 8, 9, 10, 11, 12});
-
-    EXPECT_EQ(cont.begin(), cont.find(5));
-    EXPECT_EQ(std::next(cont.begin()), cont.find(6));
-    EXPECT_EQ(std::next(cont.begin(), 2), cont.find(7));
-    EXPECT_EQ(std::next(cont.begin(), 3), cont.find(8));
-    EXPECT_EQ(std::next(cont.begin(), 4), cont.find(9));
-    EXPECT_EQ(std::next(cont.begin(), 5), cont.find(10));
-    EXPECT_EQ(std::next(cont.begin(), 6), cont.find(11));
-    EXPECT_EQ(std::next(cont.begin(), 7), cont.find(12));
-    EXPECT_EQ(std::next(cont.begin(), 8), cont.find(4));
-  }
-}
-
-// pair<iterator, iterator> equal_range(const key_type& key)
-// pair<const_iterator, const_iterator> equal_range(const key_type& key) const
-
-TEST(FlatTree, EqualRange) {
-  {
-    IntTree cont({5, 7, 9, 11, 13, 15, 17, 19});
-
-    std::pair<IntTree::iterator, IntTree::iterator> result =
-        cont.equal_range(5);
-    EXPECT_EQ(std::next(cont.begin(), 0), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 1), result.second);
-    result = cont.equal_range(7);
-    EXPECT_EQ(std::next(cont.begin(), 1), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 2), result.second);
-    result = cont.equal_range(9);
-    EXPECT_EQ(std::next(cont.begin(), 2), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 3), result.second);
-    result = cont.equal_range(11);
-    EXPECT_EQ(std::next(cont.begin(), 3), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 4), result.second);
-    result = cont.equal_range(13);
-    EXPECT_EQ(std::next(cont.begin(), 4), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 5), result.second);
-    result = cont.equal_range(15);
-    EXPECT_EQ(std::next(cont.begin(), 5), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 6), result.second);
-    result = cont.equal_range(17);
-    EXPECT_EQ(std::next(cont.begin(), 6), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 7), result.second);
-    result = cont.equal_range(19);
-    EXPECT_EQ(std::next(cont.begin(), 7), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 8), result.second);
-    result = cont.equal_range(4);
-    EXPECT_EQ(std::next(cont.begin(), 0), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 0), result.second);
-    result = cont.equal_range(6);
-    EXPECT_EQ(std::next(cont.begin(), 1), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 1), result.second);
-    result = cont.equal_range(8);
-    EXPECT_EQ(std::next(cont.begin(), 2), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 2), result.second);
-    result = cont.equal_range(10);
-    EXPECT_EQ(std::next(cont.begin(), 3), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 3), result.second);
-    result = cont.equal_range(12);
-    EXPECT_EQ(std::next(cont.begin(), 4), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 4), result.second);
-    result = cont.equal_range(14);
-    EXPECT_EQ(std::next(cont.begin(), 5), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 5), result.second);
-    result = cont.equal_range(16);
-    EXPECT_EQ(std::next(cont.begin(), 6), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 6), result.second);
-    result = cont.equal_range(18);
-    EXPECT_EQ(std::next(cont.begin(), 7), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 7), result.second);
-    result = cont.equal_range(20);
-    EXPECT_EQ(std::next(cont.begin(), 8), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 8), result.second);
-  }
-  {
-    const IntTree cont({5, 7, 9, 11, 13, 15, 17, 19});
-
-    std::pair<IntTree::const_iterator, IntTree::const_iterator> result =
-        cont.equal_range(5);
-    EXPECT_EQ(std::next(cont.begin(), 0), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 1), result.second);
-    result = cont.equal_range(7);
-    EXPECT_EQ(std::next(cont.begin(), 1), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 2), result.second);
-    result = cont.equal_range(9);
-    EXPECT_EQ(std::next(cont.begin(), 2), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 3), result.second);
-    result = cont.equal_range(11);
-    EXPECT_EQ(std::next(cont.begin(), 3), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 4), result.second);
-    result = cont.equal_range(13);
-    EXPECT_EQ(std::next(cont.begin(), 4), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 5), result.second);
-    result = cont.equal_range(15);
-    EXPECT_EQ(std::next(cont.begin(), 5), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 6), result.second);
-    result = cont.equal_range(17);
-    EXPECT_EQ(std::next(cont.begin(), 6), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 7), result.second);
-    result = cont.equal_range(19);
-    EXPECT_EQ(std::next(cont.begin(), 7), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 8), result.second);
-    result = cont.equal_range(4);
-    EXPECT_EQ(std::next(cont.begin(), 0), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 0), result.second);
-    result = cont.equal_range(6);
-    EXPECT_EQ(std::next(cont.begin(), 1), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 1), result.second);
-    result = cont.equal_range(8);
-    EXPECT_EQ(std::next(cont.begin(), 2), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 2), result.second);
-    result = cont.equal_range(10);
-    EXPECT_EQ(std::next(cont.begin(), 3), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 3), result.second);
-    result = cont.equal_range(12);
-    EXPECT_EQ(std::next(cont.begin(), 4), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 4), result.second);
-    result = cont.equal_range(14);
-    EXPECT_EQ(std::next(cont.begin(), 5), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 5), result.second);
-    result = cont.equal_range(16);
-    EXPECT_EQ(std::next(cont.begin(), 6), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 6), result.second);
-    result = cont.equal_range(18);
-    EXPECT_EQ(std::next(cont.begin(), 7), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 7), result.second);
-    result = cont.equal_range(20);
-    EXPECT_EQ(std::next(cont.begin(), 8), result.first);
-    EXPECT_EQ(std::next(cont.begin(), 8), result.second);
-  }
-}
-
-//       iterator lower_bound(const key_type& key);
-// const_iterator lower_bound(const key_type& key) const;
-
-TEST(FlatTree, LowerBound) {
-  {
-    IntTree cont({5, 7, 9, 11, 13, 15, 17, 19});
-
-    EXPECT_EQ(cont.begin(), cont.lower_bound(5));
-    EXPECT_EQ(std::next(cont.begin()), cont.lower_bound(7));
-    EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(9));
-    EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(11));
-    EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(13));
-    EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(15));
-    EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(17));
-    EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(19));
-    EXPECT_EQ(std::next(cont.begin(), 0), cont.lower_bound(4));
-    EXPECT_EQ(std::next(cont.begin(), 1), cont.lower_bound(6));
-    EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(8));
-    EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(10));
-    EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(12));
-    EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(14));
-    EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(16));
-    EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(18));
-    EXPECT_EQ(std::next(cont.begin(), 8), cont.lower_bound(20));
-  }
-  {
-    const IntTree cont({5, 7, 9, 11, 13, 15, 17, 19});
-
-    EXPECT_EQ(cont.begin(), cont.lower_bound(5));
-    EXPECT_EQ(std::next(cont.begin()), cont.lower_bound(7));
-    EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(9));
-    EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(11));
-    EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(13));
-    EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(15));
-    EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(17));
-    EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(19));
-    EXPECT_EQ(std::next(cont.begin(), 0), cont.lower_bound(4));
-    EXPECT_EQ(std::next(cont.begin(), 1), cont.lower_bound(6));
-    EXPECT_EQ(std::next(cont.begin(), 2), cont.lower_bound(8));
-    EXPECT_EQ(std::next(cont.begin(), 3), cont.lower_bound(10));
-    EXPECT_EQ(std::next(cont.begin(), 4), cont.lower_bound(12));
-    EXPECT_EQ(std::next(cont.begin(), 5), cont.lower_bound(14));
-    EXPECT_EQ(std::next(cont.begin(), 6), cont.lower_bound(16));
-    EXPECT_EQ(std::next(cont.begin(), 7), cont.lower_bound(18));
-    EXPECT_EQ(std::next(cont.begin(), 8), cont.lower_bound(20));
-  }
-}
-
-// iterator upper_bound(const key_type& key)
-// const_iterator upper_bound(const key_type& key) const
-
-TEST(FlatTree, UpperBound) {
-  {
-    IntTree cont({5, 7, 9, 11, 13, 15, 17, 19});
-
-    EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(5));
-    EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(7));
-    EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(9));
-    EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(11));
-    EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(13));
-    EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(15));
-    EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(17));
-    EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(19));
-    EXPECT_EQ(std::next(cont.begin(), 0), cont.upper_bound(4));
-    EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(6));
-    EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(8));
-    EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(10));
-    EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(12));
-    EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(14));
-    EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(16));
-    EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(18));
-    EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(20));
-  }
-  {
-    const IntTree cont({5, 7, 9, 11, 13, 15, 17, 19});
-
-    EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(5));
-    EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(7));
-    EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(9));
-    EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(11));
-    EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(13));
-    EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(15));
-    EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(17));
-    EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(19));
-    EXPECT_EQ(std::next(cont.begin(), 0), cont.upper_bound(4));
-    EXPECT_EQ(std::next(cont.begin(), 1), cont.upper_bound(6));
-    EXPECT_EQ(std::next(cont.begin(), 2), cont.upper_bound(8));
-    EXPECT_EQ(std::next(cont.begin(), 3), cont.upper_bound(10));
-    EXPECT_EQ(std::next(cont.begin(), 4), cont.upper_bound(12));
-    EXPECT_EQ(std::next(cont.begin(), 5), cont.upper_bound(14));
-    EXPECT_EQ(std::next(cont.begin(), 6), cont.upper_bound(16));
-    EXPECT_EQ(std::next(cont.begin(), 7), cont.upper_bound(18));
-    EXPECT_EQ(std::next(cont.begin(), 8), cont.upper_bound(20));
-  }
-}
-
-// ----------------------------------------------------------------------------
-// General operations.
-
-// void swap(flat_tree& other)
-// void swap(flat_tree& lhs, flat_tree& rhs)
-
-TEST(FlatTreeOurs, Swap) {
-  IntTree x({1, 2, 3});
-  IntTree y({4});
-  swap(x, y);
-  EXPECT_THAT(x, ElementsAre(4));
-  EXPECT_THAT(y, ElementsAre(1, 2, 3));
-
-  y.swap(x);
-  EXPECT_THAT(x, ElementsAre(1, 2, 3));
-  EXPECT_THAT(y, ElementsAre(4));
-}
-
-// bool operator==(const flat_tree& lhs, const flat_tree& rhs)
-// bool operator!=(const flat_tree& lhs, const flat_tree& rhs)
-// bool operator<(const flat_tree& lhs, const flat_tree& rhs)
-// bool operator>(const flat_tree& lhs, const flat_tree& rhs)
-// bool operator<=(const flat_tree& lhs, const flat_tree& rhs)
-// bool operator>=(const flat_tree& lhs, const flat_tree& rhs)
-
-TEST(FlatTree, Comparison) {
-  // Provided comparator does not participate in comparison.
-  ReversedTree biggest({3});
-  ReversedTree smallest({1});
-  ReversedTree middle({1, 2});
-
-  EXPECT_EQ(biggest, biggest);
-  EXPECT_NE(biggest, smallest);
-  EXPECT_LT(smallest, middle);
-  EXPECT_LE(smallest, middle);
-  EXPECT_LE(middle, middle);
-  EXPECT_GT(biggest, middle);
-  EXPECT_GE(biggest, middle);
-  EXPECT_GE(biggest, biggest);
-}
-
-TEST(FlatSet, EraseIf) {
-  IntTree x;
-  EraseIf(x, [](int) { return false; });
-  EXPECT_THAT(x, ElementsAre());
-
-  x = {1, 2, 3};
-  EraseIf(x, [](int elem) { return !(elem & 1); });
-  EXPECT_THAT(x, ElementsAre(1, 3));
-
-  x = {1, 2, 3, 4};
-  EraseIf(x, [](int elem) { return elem & 1; });
-  EXPECT_THAT(x, ElementsAre(2, 4));
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/containers/hash_tables_unittest.cc b/base/containers/hash_tables_unittest.cc
deleted file mode 100644
index 6072e5d..0000000
--- a/base/containers/hash_tables_unittest.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/hash_tables.h"
-
-#include <stdint.h>
-#include <string>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-class HashPairTest : public testing::Test {
-};
-
-#define INSERT_PAIR_TEST(Type, value1, value2) \
-  { \
-    Type pair(value1, value2); \
-    base::hash_map<Type, int> map; \
-    map[pair] = 1; \
-  }
-
-// Verify that a hash_map can be constructed for pairs of integers of various
-// sizes.
-TEST_F(HashPairTest, IntegerPairs) {
-  typedef std::pair<int16_t, int16_t> Int16Int16Pair;
-  typedef std::pair<int16_t, int32_t> Int16Int32Pair;
-  typedef std::pair<int16_t, int64_t> Int16Int64Pair;
-
-  INSERT_PAIR_TEST(Int16Int16Pair, 4, 6);
-  INSERT_PAIR_TEST(Int16Int32Pair, 9, (1 << 29) + 378128932);
-  INSERT_PAIR_TEST(Int16Int64Pair, 10,
-                   (INT64_C(1) << 60) + INT64_C(78931732321));
-
-  typedef std::pair<int32_t, int16_t> Int32Int16Pair;
-  typedef std::pair<int32_t, int32_t> Int32Int32Pair;
-  typedef std::pair<int32_t, int64_t> Int32Int64Pair;
-
-  INSERT_PAIR_TEST(Int32Int16Pair, 4, 6);
-  INSERT_PAIR_TEST(Int32Int32Pair, 9, (1 << 29) + 378128932);
-  INSERT_PAIR_TEST(Int32Int64Pair, 10,
-                   (INT64_C(1) << 60) + INT64_C(78931732321));
-
-  typedef std::pair<int64_t, int16_t> Int64Int16Pair;
-  typedef std::pair<int64_t, int32_t> Int64Int32Pair;
-  typedef std::pair<int64_t, int64_t> Int64Int64Pair;
-
-  INSERT_PAIR_TEST(Int64Int16Pair, 4, 6);
-  INSERT_PAIR_TEST(Int64Int32Pair, 9, (1 << 29) + 378128932);
-  INSERT_PAIR_TEST(Int64Int64Pair, 10,
-                   (INT64_C(1) << 60) + INT64_C(78931732321));
-}
-
-// Verify that base::hash_set<const char*> compares by pointer value, not as C
-// strings.
-TEST(HashTableTest, CharPointers) {
-  std::string str1("hello");
-  std::string str2("hello");
-  base::hash_set<const char*> set;
-
-  set.insert(str1.c_str());
-  EXPECT_EQ(1u, set.count(str1.c_str()));
-  EXPECT_EQ(0u, set.count(str2.c_str()));
-}
-
-}  // namespace
diff --git a/base/containers/id_map_unittest.cc b/base/containers/id_map_unittest.cc
deleted file mode 100644
index 346b69f..0000000
--- a/base/containers/id_map_unittest.cc
+++ /dev/null
@@ -1,399 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/id_map.h"
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/test/gtest_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class TestObject {
-};
-
-class DestructorCounter {
- public:
-  explicit DestructorCounter(int* counter) : counter_(counter) {}
-  ~DestructorCounter() { ++(*counter_); }
-
- private:
-  int* counter_;
-};
-
-}  // namespace
-
-TEST(IDMapTest, Basic) {
-  IDMap<TestObject*> map;
-  EXPECT_TRUE(map.IsEmpty());
-  EXPECT_EQ(0U, map.size());
-
-  TestObject obj1;
-  TestObject obj2;
-
-  int32_t id1 = map.Add(&obj1);
-  EXPECT_FALSE(map.IsEmpty());
-  EXPECT_EQ(1U, map.size());
-  EXPECT_EQ(&obj1, map.Lookup(id1));
-
-  int32_t id2 = map.Add(&obj2);
-  EXPECT_FALSE(map.IsEmpty());
-  EXPECT_EQ(2U, map.size());
-
-  EXPECT_EQ(&obj1, map.Lookup(id1));
-  EXPECT_EQ(&obj2, map.Lookup(id2));
-
-  map.Remove(id1);
-  EXPECT_FALSE(map.IsEmpty());
-  EXPECT_EQ(1U, map.size());
-
-  map.Remove(id2);
-  EXPECT_TRUE(map.IsEmpty());
-  EXPECT_EQ(0U, map.size());
-
-  map.AddWithID(&obj1, 1);
-  map.AddWithID(&obj2, 2);
-  EXPECT_EQ(&obj1, map.Lookup(1));
-  EXPECT_EQ(&obj2, map.Lookup(2));
-
-  EXPECT_EQ(&obj2, map.Replace(2, &obj1));
-  EXPECT_EQ(&obj1, map.Lookup(2));
-
-  EXPECT_EQ(0, map.iteration_depth());
-}
-
-TEST(IDMapTest, IteratorRemainsValidWhenRemovingCurrentElement) {
-  IDMap<TestObject*> map;
-
-  TestObject obj1;
-  TestObject obj2;
-  TestObject obj3;
-
-  map.Add(&obj1);
-  map.Add(&obj2);
-  map.Add(&obj3);
-
-  {
-    IDMap<TestObject*>::const_iterator iter(&map);
-
-    EXPECT_EQ(1, map.iteration_depth());
-
-    while (!iter.IsAtEnd()) {
-      map.Remove(iter.GetCurrentKey());
-      iter.Advance();
-    }
-
-    // Test that while an iterator is still in scope, we get the map emptiness
-    // right (http://crbug.com/35571).
-    EXPECT_TRUE(map.IsEmpty());
-    EXPECT_EQ(0U, map.size());
-  }
-
-  EXPECT_TRUE(map.IsEmpty());
-  EXPECT_EQ(0U, map.size());
-
-  EXPECT_EQ(0, map.iteration_depth());
-}
-
-TEST(IDMapTest, IteratorRemainsValidWhenRemovingOtherElements) {
-  IDMap<TestObject*> map;
-
-  const int kCount = 5;
-  TestObject obj[kCount];
-
-  for (int i = 0; i < kCount; i++)
-    map.Add(&obj[i]);
-
-  // IDMap has no predictable iteration order.
-  int32_t ids_in_iteration_order[kCount];
-  const TestObject* objs_in_iteration_order[kCount];
-  int counter = 0;
-  for (IDMap<TestObject*>::const_iterator iter(&map); !iter.IsAtEnd();
-       iter.Advance()) {
-    ids_in_iteration_order[counter] = iter.GetCurrentKey();
-    objs_in_iteration_order[counter] = iter.GetCurrentValue();
-    counter++;
-  }
-
-  counter = 0;
-  for (IDMap<TestObject*>::const_iterator iter(&map); !iter.IsAtEnd();
-       iter.Advance()) {
-    EXPECT_EQ(1, map.iteration_depth());
-
-    switch (counter) {
-      case 0:
-        EXPECT_EQ(ids_in_iteration_order[0], iter.GetCurrentKey());
-        EXPECT_EQ(objs_in_iteration_order[0], iter.GetCurrentValue());
-        map.Remove(ids_in_iteration_order[1]);
-        break;
-      case 1:
-        EXPECT_EQ(ids_in_iteration_order[2], iter.GetCurrentKey());
-        EXPECT_EQ(objs_in_iteration_order[2], iter.GetCurrentValue());
-        map.Remove(ids_in_iteration_order[3]);
-        break;
-      case 2:
-        EXPECT_EQ(ids_in_iteration_order[4], iter.GetCurrentKey());
-        EXPECT_EQ(objs_in_iteration_order[4], iter.GetCurrentValue());
-        map.Remove(ids_in_iteration_order[0]);
-        break;
-      default:
-        FAIL() << "should not have that many elements";
-        break;
-    }
-
-    counter++;
-  }
-
-  EXPECT_EQ(0, map.iteration_depth());
-}
-
-TEST(IDMapTest, CopyIterator) {
-  IDMap<TestObject*> map;
-
-  TestObject obj1;
-  TestObject obj2;
-  TestObject obj3;
-
-  map.Add(&obj1);
-  map.Add(&obj2);
-  map.Add(&obj3);
-
-  EXPECT_EQ(0, map.iteration_depth());
-
-  {
-    IDMap<TestObject*>::const_iterator iter1(&map);
-    EXPECT_EQ(1, map.iteration_depth());
-
-    // Make sure that copying the iterator correctly increments
-    // map's iteration depth.
-    IDMap<TestObject*>::const_iterator iter2(iter1);
-    EXPECT_EQ(2, map.iteration_depth());
-  }
-
-  // Make sure after destroying all iterators the map's iteration depth
-  // returns to initial state.
-  EXPECT_EQ(0, map.iteration_depth());
-}
-
-TEST(IDMapTest, AssignIterator) {
-  IDMap<TestObject*> map;
-
-  TestObject obj1;
-  TestObject obj2;
-  TestObject obj3;
-
-  map.Add(&obj1);
-  map.Add(&obj2);
-  map.Add(&obj3);
-
-  EXPECT_EQ(0, map.iteration_depth());
-
-  {
-    IDMap<TestObject*>::const_iterator iter1(&map);
-    EXPECT_EQ(1, map.iteration_depth());
-
-    IDMap<TestObject*>::const_iterator iter2(&map);
-    EXPECT_EQ(2, map.iteration_depth());
-
-    // Make sure that assigning the iterator correctly updates
-    // map's iteration depth (-1 for destruction, +1 for assignment).
-    EXPECT_EQ(2, map.iteration_depth());
-  }
-
-  // Make sure after destroying all iterators the map's iteration depth
-  // returns to initial state.
-  EXPECT_EQ(0, map.iteration_depth());
-}
-
-TEST(IDMapTest, IteratorRemainsValidWhenClearing) {
-  IDMap<TestObject*> map;
-
-  const int kCount = 5;
-  TestObject obj[kCount];
-
-  for (int i = 0; i < kCount; i++)
-    map.Add(&obj[i]);
-
-  // IDMap has no predictable iteration order.
-  int32_t ids_in_iteration_order[kCount];
-  const TestObject* objs_in_iteration_order[kCount];
-  int counter = 0;
-  for (IDMap<TestObject*>::const_iterator iter(&map); !iter.IsAtEnd();
-       iter.Advance()) {
-    ids_in_iteration_order[counter] = iter.GetCurrentKey();
-    objs_in_iteration_order[counter] = iter.GetCurrentValue();
-    counter++;
-  }
-
-  counter = 0;
-  for (IDMap<TestObject*>::const_iterator iter(&map); !iter.IsAtEnd();
-       iter.Advance()) {
-    switch (counter) {
-      case 0:
-        EXPECT_EQ(ids_in_iteration_order[0], iter.GetCurrentKey());
-        EXPECT_EQ(objs_in_iteration_order[0], iter.GetCurrentValue());
-        break;
-      case 1:
-        EXPECT_EQ(ids_in_iteration_order[1], iter.GetCurrentKey());
-        EXPECT_EQ(objs_in_iteration_order[1], iter.GetCurrentValue());
-        map.Clear();
-        EXPECT_TRUE(map.IsEmpty());
-        EXPECT_EQ(0U, map.size());
-        break;
-      default:
-        FAIL() << "should not have that many elements";
-        break;
-    }
-    counter++;
-  }
-
-  EXPECT_TRUE(map.IsEmpty());
-  EXPECT_EQ(0U, map.size());
-}
-
-TEST(IDMapTest, OwningPointersDeletesThemOnRemove) {
-  const int kCount = 3;
-
-  int external_del_count = 0;
-  DestructorCounter* external_obj[kCount];
-  int map_external_ids[kCount];
-
-  int owned_del_count = 0;
-  int map_owned_ids[kCount];
-
-  IDMap<DestructorCounter*> map_external;
-  IDMap<std::unique_ptr<DestructorCounter>> map_owned;
-
-  for (int i = 0; i < kCount; ++i) {
-    external_obj[i] = new DestructorCounter(&external_del_count);
-    map_external_ids[i] = map_external.Add(external_obj[i]);
-
-    map_owned_ids[i] =
-        map_owned.Add(std::make_unique<DestructorCounter>(&owned_del_count));
-  }
-
-  for (int i = 0; i < kCount; ++i) {
-    EXPECT_EQ(external_del_count, 0);
-    EXPECT_EQ(owned_del_count, i);
-
-    map_external.Remove(map_external_ids[i]);
-    map_owned.Remove(map_owned_ids[i]);
-  }
-
-  for (int i = 0; i < kCount; ++i) {
-    delete external_obj[i];
-  }
-
-  EXPECT_EQ(external_del_count, kCount);
-  EXPECT_EQ(owned_del_count, kCount);
-}
-
-TEST(IDMapTest, OwningPointersDeletesThemOnClear) {
-  const int kCount = 3;
-
-  int external_del_count = 0;
-  DestructorCounter* external_obj[kCount];
-
-  int owned_del_count = 0;
-
-  IDMap<DestructorCounter*> map_external;
-  IDMap<std::unique_ptr<DestructorCounter>> map_owned;
-
-  for (int i = 0; i < kCount; ++i) {
-    external_obj[i] = new DestructorCounter(&external_del_count);
-    map_external.Add(external_obj[i]);
-
-    map_owned.Add(std::make_unique<DestructorCounter>(&owned_del_count));
-  }
-
-  EXPECT_EQ(external_del_count, 0);
-  EXPECT_EQ(owned_del_count, 0);
-
-  map_external.Clear();
-  map_owned.Clear();
-
-  EXPECT_EQ(external_del_count, 0);
-  EXPECT_EQ(owned_del_count, kCount);
-
-  for (int i = 0; i < kCount; ++i) {
-    delete external_obj[i];
-  }
-
-  EXPECT_EQ(external_del_count, kCount);
-  EXPECT_EQ(owned_del_count, kCount);
-}
-
-TEST(IDMapTest, OwningPointersDeletesThemOnDestruct) {
-  const int kCount = 3;
-
-  int external_del_count = 0;
-  DestructorCounter* external_obj[kCount];
-
-  int owned_del_count = 0;
-
-  {
-    IDMap<DestructorCounter*> map_external;
-    IDMap<std::unique_ptr<DestructorCounter>> map_owned;
-
-    for (int i = 0; i < kCount; ++i) {
-      external_obj[i] = new DestructorCounter(&external_del_count);
-      map_external.Add(external_obj[i]);
-
-      map_owned.Add(std::make_unique<DestructorCounter>(&owned_del_count));
-    }
-  }
-
-  EXPECT_EQ(external_del_count, 0);
-
-  for (int i = 0; i < kCount; ++i) {
-    delete external_obj[i];
-  }
-
-  EXPECT_EQ(external_del_count, kCount);
-  EXPECT_EQ(owned_del_count, kCount);
-}
-
-TEST(IDMapTest, Int64KeyType) {
-  IDMap<TestObject*, int64_t> map;
-  TestObject obj1;
-  const int64_t kId1 = 999999999999999999;
-
-  map.AddWithID(&obj1, kId1);
-  EXPECT_EQ(&obj1, map.Lookup(kId1));
-
-  IDMap<TestObject*, int64_t>::const_iterator iter(&map);
-  ASSERT_FALSE(iter.IsAtEnd());
-  EXPECT_EQ(kId1, iter.GetCurrentKey());
-  EXPECT_EQ(&obj1, iter.GetCurrentValue());
-  iter.Advance();
-  ASSERT_TRUE(iter.IsAtEnd());
-
-  map.Remove(kId1);
-  EXPECT_TRUE(map.IsEmpty());
-}
-
-TEST(IDMapTest, RemovedValueHandling) {
-  TestObject obj;
-  IDMap<TestObject*> map;
-  int key = map.Add(&obj);
-
-  IDMap<TestObject*>::iterator itr(&map);
-  map.Clear();
-  EXPECT_DCHECK_DEATH(map.Remove(key));
-  EXPECT_DCHECK_DEATH(map.Replace(key, &obj));
-  EXPECT_FALSE(map.Lookup(key));
-  EXPECT_FALSE(itr.IsAtEnd());
-  EXPECT_FALSE(itr.GetCurrentValue());
-
-  EXPECT_TRUE(map.IsEmpty());
-  map.AddWithID(&obj, key);
-  EXPECT_EQ(1u, map.size());
-}
-
-}  // namespace base
diff --git a/base/containers/linked_list_unittest.cc b/base/containers/linked_list_unittest.cc
deleted file mode 100644
index 8e547ba..0000000
--- a/base/containers/linked_list_unittest.cc
+++ /dev/null
@@ -1,349 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/linked_list.h"
-#include "base/macros.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-class Node : public LinkNode<Node> {
- public:
-  explicit Node(int id) : id_(id) {}
-
-  int id() const { return id_; }
-
- private:
-  int id_;
-};
-
-class MultipleInheritanceNodeBase {
- public:
-  MultipleInheritanceNodeBase() : field_taking_up_space_(0) {}
-  int field_taking_up_space_;
-};
-
-class MultipleInheritanceNode : public MultipleInheritanceNodeBase,
-                                public LinkNode<MultipleInheritanceNode> {
- public:
-  MultipleInheritanceNode() = default;
-};
-
-class MovableNode : public LinkNode<MovableNode> {
- public:
-  explicit MovableNode(int id) : id_(id) {}
-
-  MovableNode(MovableNode&&) = default;
-
-  int id() const { return id_; }
-
- private:
-  int id_;
-};
-
-// Checks that when iterating |list| (either from head to tail, or from
-// tail to head, as determined by |forward|), we get back |node_ids|,
-// which is an array of size |num_nodes|.
-void ExpectListContentsForDirection(const LinkedList<Node>& list,
-  int num_nodes, const int* node_ids, bool forward) {
-  int i = 0;
-  for (const LinkNode<Node>* node = (forward ? list.head() : list.tail());
-       node != list.end();
-       node = (forward ? node->next() : node->previous())) {
-    ASSERT_LT(i, num_nodes);
-    int index_of_id = forward ? i : num_nodes - i - 1;
-    EXPECT_EQ(node_ids[index_of_id], node->value()->id());
-    ++i;
-  }
-  EXPECT_EQ(num_nodes, i);
-}
-
-void ExpectListContents(const LinkedList<Node>& list,
-                        int num_nodes,
-                        const int* node_ids) {
-  {
-    SCOPED_TRACE("Iterating forward (from head to tail)");
-    ExpectListContentsForDirection(list, num_nodes, node_ids, true);
-  }
-  {
-    SCOPED_TRACE("Iterating backward (from tail to head)");
-    ExpectListContentsForDirection(list, num_nodes, node_ids, false);
-  }
-}
-
-TEST(LinkedList, Empty) {
-  LinkedList<Node> list;
-  EXPECT_EQ(list.end(), list.head());
-  EXPECT_EQ(list.end(), list.tail());
-  ExpectListContents(list, 0, nullptr);
-}
-
-TEST(LinkedList, Append) {
-  LinkedList<Node> list;
-  ExpectListContents(list, 0, nullptr);
-
-  Node n1(1);
-  list.Append(&n1);
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n1, list.tail());
-  {
-    const int expected[] = {1};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-
-  Node n2(2);
-  list.Append(&n2);
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n2, list.tail());
-  {
-    const int expected[] = {1, 2};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-
-  Node n3(3);
-  list.Append(&n3);
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n3, list.tail());
-  {
-    const int expected[] = {1, 2, 3};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-}
-
-TEST(LinkedList, RemoveFromList) {
-  LinkedList<Node> list;
-
-  Node n1(1);
-  Node n2(2);
-  Node n3(3);
-  Node n4(4);
-  Node n5(5);
-
-  list.Append(&n1);
-  list.Append(&n2);
-  list.Append(&n3);
-  list.Append(&n4);
-  list.Append(&n5);
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n5, list.tail());
-  {
-    const int expected[] = {1, 2, 3, 4, 5};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-
-  // Remove from the middle.
-  n3.RemoveFromList();
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n5, list.tail());
-  {
-    const int expected[] = {1, 2, 4, 5};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-
-  // Remove from the tail.
-  n5.RemoveFromList();
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n4, list.tail());
-  {
-    const int expected[] = {1, 2, 4};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-
-  // Remove from the head.
-  n1.RemoveFromList();
-
-  EXPECT_EQ(&n2, list.head());
-  EXPECT_EQ(&n4, list.tail());
-  {
-    const int expected[] = {2, 4};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-
-  // Empty the list.
-  n2.RemoveFromList();
-  n4.RemoveFromList();
-
-  ExpectListContents(list, 0, nullptr);
-  EXPECT_EQ(list.end(), list.head());
-  EXPECT_EQ(list.end(), list.tail());
-
-  // Fill the list once again.
-  list.Append(&n1);
-  list.Append(&n2);
-  list.Append(&n3);
-  list.Append(&n4);
-  list.Append(&n5);
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n5, list.tail());
-  {
-    const int expected[] = {1, 2, 3, 4, 5};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-}
-
-TEST(LinkedList, InsertBefore) {
-  LinkedList<Node> list;
-
-  Node n1(1);
-  Node n2(2);
-  Node n3(3);
-  Node n4(4);
-
-  list.Append(&n1);
-  list.Append(&n2);
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n2, list.tail());
-  {
-    const int expected[] = {1, 2};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-
-  n3.InsertBefore(&n2);
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n2, list.tail());
-  {
-    const int expected[] = {1, 3, 2};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-
-  n4.InsertBefore(&n1);
-
-  EXPECT_EQ(&n4, list.head());
-  EXPECT_EQ(&n2, list.tail());
-  {
-    const int expected[] = {4, 1, 3, 2};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-}
-
-TEST(LinkedList, InsertAfter) {
-  LinkedList<Node> list;
-
-  Node n1(1);
-  Node n2(2);
-  Node n3(3);
-  Node n4(4);
-
-  list.Append(&n1);
-  list.Append(&n2);
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n2, list.tail());
-  {
-    const int expected[] = {1, 2};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-
-  n3.InsertAfter(&n2);
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n3, list.tail());
-  {
-    const int expected[] = {1, 2, 3};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-
-  n4.InsertAfter(&n1);
-
-  EXPECT_EQ(&n1, list.head());
-  EXPECT_EQ(&n3, list.tail());
-  {
-    const int expected[] = {1, 4, 2, 3};
-    ExpectListContents(list, arraysize(expected), expected);
-  }
-}
-
-TEST(LinkedList, MultipleInheritanceNode) {
-  MultipleInheritanceNode node;
-  EXPECT_EQ(&node, node.value());
-}
-
-TEST(LinkedList, EmptyListIsEmpty) {
-  LinkedList<Node> list;
-  EXPECT_TRUE(list.empty());
-}
-
-TEST(LinkedList, NonEmptyListIsNotEmpty) {
-  LinkedList<Node> list;
-
-  Node n(1);
-  list.Append(&n);
-
-  EXPECT_FALSE(list.empty());
-}
-
-TEST(LinkedList, EmptiedListIsEmptyAgain) {
-  LinkedList<Node> list;
-
-  Node n(1);
-  list.Append(&n);
-  n.RemoveFromList();
-
-  EXPECT_TRUE(list.empty());
-}
-
-TEST(LinkedList, NodesCanBeReused) {
-  LinkedList<Node> list1;
-  LinkedList<Node> list2;
-
-  Node n(1);
-  list1.Append(&n);
-  n.RemoveFromList();
-  list2.Append(&n);
-
-  EXPECT_EQ(list2.head()->value(), &n);
-}
-
-TEST(LinkedList, RemovedNodeHasNullNextPrevious) {
-  LinkedList<Node> list;
-
-  Node n(1);
-  list.Append(&n);
-  n.RemoveFromList();
-
-  EXPECT_EQ(nullptr, n.next());
-  EXPECT_EQ(nullptr, n.previous());
-}
-
-TEST(LinkedList, NodeMoveConstructor) {
-  LinkedList<MovableNode> list;
-
-  MovableNode n1(1);
-  MovableNode n2(2);
-  MovableNode n3(3);
-
-  list.Append(&n1);
-  list.Append(&n2);
-  list.Append(&n3);
-
-  EXPECT_EQ(&n1, n2.previous());
-  EXPECT_EQ(&n2, n1.next());
-  EXPECT_EQ(&n3, n2.next());
-  EXPECT_EQ(&n2, n3.previous());
-  EXPECT_EQ(2, n2.id());
-
-  MovableNode n2_new(std::move(n2));
-
-  EXPECT_EQ(nullptr, n2.next());
-  EXPECT_EQ(nullptr, n2.previous());
-
-  EXPECT_EQ(&n1, n2_new.previous());
-  EXPECT_EQ(&n2_new, n1.next());
-  EXPECT_EQ(&n3, n2_new.next());
-  EXPECT_EQ(&n2_new, n3.previous());
-  EXPECT_EQ(2, n2_new.id());
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/containers/mru_cache_unittest.cc b/base/containers/mru_cache_unittest.cc
deleted file mode 100644
index 28e6f0d..0000000
--- a/base/containers/mru_cache_unittest.cc
+++ /dev/null
@@ -1,394 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/mru_cache.h"
-
-#include <cstddef>
-#include <memory>
-
-#include "base/memory/ptr_util.h"
-#include "base/trace_event/memory_usage_estimator.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-int cached_item_live_count = 0;
-
-struct CachedItem {
-  CachedItem() : value(0) {
-    cached_item_live_count++;
-  }
-
-  explicit CachedItem(int new_value) : value(new_value) {
-    cached_item_live_count++;
-  }
-
-  explicit CachedItem(const CachedItem& other) : value(other.value) {
-    cached_item_live_count++;
-  }
-
-  ~CachedItem() {
-    cached_item_live_count--;
-  }
-
-  int value;
-};
-
-}  // namespace
-
-TEST(MRUCacheTest, Basic) {
-  typedef base::MRUCache<int, CachedItem> Cache;
-  Cache cache(Cache::NO_AUTO_EVICT);
-
-  // Check failure conditions
-  {
-    CachedItem test_item;
-    EXPECT_TRUE(cache.Get(0) == cache.end());
-    EXPECT_TRUE(cache.Peek(0) == cache.end());
-  }
-
-  static const int kItem1Key = 5;
-  CachedItem item1(10);
-  Cache::iterator inserted_item = cache.Put(kItem1Key, item1);
-  EXPECT_EQ(1U, cache.size());
-
-  // Check that item1 was properly inserted.
-  {
-    Cache::iterator found = cache.Get(kItem1Key);
-    EXPECT_TRUE(inserted_item == cache.begin());
-    EXPECT_TRUE(found != cache.end());
-
-    found = cache.Peek(kItem1Key);
-    EXPECT_TRUE(found != cache.end());
-
-    EXPECT_EQ(kItem1Key, found->first);
-    EXPECT_EQ(item1.value, found->second.value);
-  }
-
-  static const int kItem2Key = 7;
-  CachedItem item2(12);
-  cache.Put(kItem2Key, item2);
-  EXPECT_EQ(2U, cache.size());
-
-  // Check that item1 is the oldest since item2 was added afterwards.
-  {
-    Cache::reverse_iterator oldest = cache.rbegin();
-    ASSERT_TRUE(oldest != cache.rend());
-    EXPECT_EQ(kItem1Key, oldest->first);
-    EXPECT_EQ(item1.value, oldest->second.value);
-  }
-
-  // Check that item1 is still accessible by key.
-  {
-    Cache::iterator test_item = cache.Get(kItem1Key);
-    ASSERT_TRUE(test_item != cache.end());
-    EXPECT_EQ(kItem1Key, test_item->first);
-    EXPECT_EQ(item1.value, test_item->second.value);
-  }
-
-  // Check that retrieving item1 pushed item2 to oldest.
-  {
-    Cache::reverse_iterator oldest = cache.rbegin();
-    ASSERT_TRUE(oldest != cache.rend());
-    EXPECT_EQ(kItem2Key, oldest->first);
-    EXPECT_EQ(item2.value, oldest->second.value);
-  }
-
-  // Remove the oldest item and check that item1 is now the only member.
-  {
-    Cache::reverse_iterator next = cache.Erase(cache.rbegin());
-
-    EXPECT_EQ(1U, cache.size());
-
-    EXPECT_TRUE(next == cache.rbegin());
-    EXPECT_EQ(kItem1Key, next->first);
-    EXPECT_EQ(item1.value, next->second.value);
-
-    cache.Erase(cache.begin());
-    EXPECT_EQ(0U, cache.size());
-  }
-
-  // Check that Clear() works properly.
-  cache.Put(kItem1Key, item1);
-  cache.Put(kItem2Key, item2);
-  EXPECT_EQ(2U, cache.size());
-  cache.Clear();
-  EXPECT_EQ(0U, cache.size());
-}
-
-TEST(MRUCacheTest, GetVsPeek) {
-  typedef base::MRUCache<int, CachedItem> Cache;
-  Cache cache(Cache::NO_AUTO_EVICT);
-
-  static const int kItem1Key = 1;
-  CachedItem item1(10);
-  cache.Put(kItem1Key, item1);
-
-  static const int kItem2Key = 2;
-  CachedItem item2(20);
-  cache.Put(kItem2Key, item2);
-
-  // This should do nothing since the size is bigger than the number of items.
-  cache.ShrinkToSize(100);
-
-  // Check that item1 starts out as oldest
-  {
-    Cache::reverse_iterator iter = cache.rbegin();
-    ASSERT_TRUE(iter != cache.rend());
-    EXPECT_EQ(kItem1Key, iter->first);
-    EXPECT_EQ(item1.value, iter->second.value);
-  }
-
-  // Check that Peek doesn't change ordering
-  {
-    Cache::iterator peekiter = cache.Peek(kItem1Key);
-    ASSERT_TRUE(peekiter != cache.end());
-
-    Cache::reverse_iterator iter = cache.rbegin();
-    ASSERT_TRUE(iter != cache.rend());
-    EXPECT_EQ(kItem1Key, iter->first);
-    EXPECT_EQ(item1.value, iter->second.value);
-  }
-}
-
-TEST(MRUCacheTest, KeyReplacement) {
-  typedef base::MRUCache<int, CachedItem> Cache;
-  Cache cache(Cache::NO_AUTO_EVICT);
-
-  static const int kItem1Key = 1;
-  CachedItem item1(10);
-  cache.Put(kItem1Key, item1);
-
-  static const int kItem2Key = 2;
-  CachedItem item2(20);
-  cache.Put(kItem2Key, item2);
-
-  static const int kItem3Key = 3;
-  CachedItem item3(30);
-  cache.Put(kItem3Key, item3);
-
-  static const int kItem4Key = 4;
-  CachedItem item4(40);
-  cache.Put(kItem4Key, item4);
-
-  CachedItem item5(50);
-  cache.Put(kItem3Key, item5);
-
-  EXPECT_EQ(4U, cache.size());
-  for (int i = 0; i < 3; ++i) {
-    Cache::reverse_iterator iter = cache.rbegin();
-    ASSERT_TRUE(iter != cache.rend());
-  }
-
-  // Make it so only the most important element is there.
-  cache.ShrinkToSize(1);
-
-  Cache::iterator iter = cache.begin();
-  EXPECT_EQ(kItem3Key, iter->first);
-  EXPECT_EQ(item5.value, iter->second.value);
-}
-
-// Make sure that the owning version release its pointers properly.
-TEST(MRUCacheTest, Owning) {
-  using Cache = base::MRUCache<int, std::unique_ptr<CachedItem>>;
-  Cache cache(Cache::NO_AUTO_EVICT);
-
-  int initial_count = cached_item_live_count;
-
-  // First insert and item and then overwrite it.
-  static const int kItem1Key = 1;
-  cache.Put(kItem1Key, WrapUnique(new CachedItem(20)));
-  cache.Put(kItem1Key, WrapUnique(new CachedItem(22)));
-
-  // There should still be one item, and one extra live item.
-  Cache::iterator iter = cache.Get(kItem1Key);
-  EXPECT_EQ(1U, cache.size());
-  EXPECT_TRUE(iter != cache.end());
-  EXPECT_EQ(initial_count + 1, cached_item_live_count);
-
-  // Now remove it.
-  cache.Erase(cache.begin());
-  EXPECT_EQ(initial_count, cached_item_live_count);
-
-  // Now try another cache that goes out of scope to make sure its pointers
-  // go away.
-  {
-    Cache cache2(Cache::NO_AUTO_EVICT);
-    cache2.Put(1, WrapUnique(new CachedItem(20)));
-    cache2.Put(2, WrapUnique(new CachedItem(20)));
-  }
-
-  // There should be no objects leaked.
-  EXPECT_EQ(initial_count, cached_item_live_count);
-
-  // Check that Clear() also frees things correctly.
-  {
-    Cache cache2(Cache::NO_AUTO_EVICT);
-    cache2.Put(1, WrapUnique(new CachedItem(20)));
-    cache2.Put(2, WrapUnique(new CachedItem(20)));
-    EXPECT_EQ(initial_count + 2, cached_item_live_count);
-    cache2.Clear();
-    EXPECT_EQ(initial_count, cached_item_live_count);
-  }
-}
-
-TEST(MRUCacheTest, AutoEvict) {
-  using Cache = base::MRUCache<int, std::unique_ptr<CachedItem>>;
-  static const Cache::size_type kMaxSize = 3;
-
-  int initial_count = cached_item_live_count;
-
-  {
-    Cache cache(kMaxSize);
-
-    static const int kItem1Key = 1, kItem2Key = 2, kItem3Key = 3, kItem4Key = 4;
-    cache.Put(kItem1Key, std::make_unique<CachedItem>(20));
-    cache.Put(kItem2Key, std::make_unique<CachedItem>(21));
-    cache.Put(kItem3Key, std::make_unique<CachedItem>(22));
-    cache.Put(kItem4Key, std::make_unique<CachedItem>(23));
-
-    // The cache should only have kMaxSize items in it even though we inserted
-    // more.
-    EXPECT_EQ(kMaxSize, cache.size());
-  }
-
-  // There should be no objects leaked.
-  EXPECT_EQ(initial_count, cached_item_live_count);
-}
-
-TEST(MRUCacheTest, HashingMRUCache) {
-  // Very simple test to make sure that the hashing cache works correctly.
-  typedef base::HashingMRUCache<std::string, CachedItem> Cache;
-  Cache cache(Cache::NO_AUTO_EVICT);
-
-  CachedItem one(1);
-  cache.Put("First", one);
-
-  CachedItem two(2);
-  cache.Put("Second", two);
-
-  EXPECT_EQ(one.value, cache.Get("First")->second.value);
-  EXPECT_EQ(two.value, cache.Get("Second")->second.value);
-  cache.ShrinkToSize(1);
-  EXPECT_EQ(two.value, cache.Get("Second")->second.value);
-  EXPECT_TRUE(cache.Get("First") == cache.end());
-}
-
-TEST(MRUCacheTest, Swap) {
-  typedef base::MRUCache<int, CachedItem> Cache;
-  Cache cache1(Cache::NO_AUTO_EVICT);
-
-  // Insert two items into cache1.
-  static const int kItem1Key = 1;
-  CachedItem item1(2);
-  Cache::iterator inserted_item = cache1.Put(kItem1Key, item1);
-  EXPECT_EQ(1U, cache1.size());
-
-  static const int kItem2Key = 3;
-  CachedItem item2(4);
-  cache1.Put(kItem2Key, item2);
-  EXPECT_EQ(2U, cache1.size());
-
-  // Verify cache1's elements.
-  {
-    Cache::iterator iter = cache1.begin();
-    ASSERT_TRUE(iter != cache1.end());
-    EXPECT_EQ(kItem2Key, iter->first);
-    EXPECT_EQ(item2.value, iter->second.value);
-
-    ++iter;
-    ASSERT_TRUE(iter != cache1.end());
-    EXPECT_EQ(kItem1Key, iter->first);
-    EXPECT_EQ(item1.value, iter->second.value);
-  }
-
-  // Create another cache2.
-  Cache cache2(Cache::NO_AUTO_EVICT);
-
-  // Insert three items into cache2.
-  static const int kItem3Key = 5;
-  CachedItem item3(6);
-  inserted_item = cache2.Put(kItem3Key, item3);
-  EXPECT_EQ(1U, cache2.size());
-
-  static const int kItem4Key = 7;
-  CachedItem item4(8);
-  cache2.Put(kItem4Key, item4);
-  EXPECT_EQ(2U, cache2.size());
-
-  static const int kItem5Key = 9;
-  CachedItem item5(10);
-  cache2.Put(kItem5Key, item5);
-  EXPECT_EQ(3U, cache2.size());
-
-  // Verify cache2's elements.
-  {
-    Cache::iterator iter = cache2.begin();
-    ASSERT_TRUE(iter != cache2.end());
-    EXPECT_EQ(kItem5Key, iter->first);
-    EXPECT_EQ(item5.value, iter->second.value);
-
-    ++iter;
-    ASSERT_TRUE(iter != cache2.end());
-    EXPECT_EQ(kItem4Key, iter->first);
-    EXPECT_EQ(item4.value, iter->second.value);
-
-    ++iter;
-    ASSERT_TRUE(iter != cache2.end());
-    EXPECT_EQ(kItem3Key, iter->first);
-    EXPECT_EQ(item3.value, iter->second.value);
-  }
-
-  // Swap cache1 and cache2 and verify cache2 has cache1's elements and cache1
-  // has cache2's elements.
-  cache2.Swap(cache1);
-
-  EXPECT_EQ(3U, cache1.size());
-  EXPECT_EQ(2U, cache2.size());
-
-  // Verify cache1's elements.
-  {
-    Cache::iterator iter = cache1.begin();
-    ASSERT_TRUE(iter != cache1.end());
-    EXPECT_EQ(kItem5Key, iter->first);
-    EXPECT_EQ(item5.value, iter->second.value);
-
-    ++iter;
-    ASSERT_TRUE(iter != cache1.end());
-    EXPECT_EQ(kItem4Key, iter->first);
-    EXPECT_EQ(item4.value, iter->second.value);
-
-    ++iter;
-    ASSERT_TRUE(iter != cache1.end());
-    EXPECT_EQ(kItem3Key, iter->first);
-    EXPECT_EQ(item3.value, iter->second.value);
-  }
-
-  // Verify cache2's elements.
-  {
-    Cache::iterator iter = cache2.begin();
-    ASSERT_TRUE(iter != cache2.end());
-    EXPECT_EQ(kItem2Key, iter->first);
-    EXPECT_EQ(item2.value, iter->second.value);
-
-    ++iter;
-    ASSERT_TRUE(iter != cache2.end());
-    EXPECT_EQ(kItem1Key, iter->first);
-    EXPECT_EQ(item1.value, iter->second.value);
-  }
-}
-
-TEST(MRUCacheTest, EstimateMemory) {
-  base::MRUCache<std::string, int> cache(10);
-
-  const std::string key(100u, 'a');
-  cache.Put(key, 1);
-
-  EXPECT_GT(trace_event::EstimateMemoryUsage(cache),
-            trace_event::EstimateMemoryUsage(key));
-}
-
-}  // namespace base
diff --git a/base/containers/small_map_unittest.cc b/base/containers/small_map_unittest.cc
deleted file mode 100644
index 6561851..0000000
--- a/base/containers/small_map_unittest.cc
+++ /dev/null
@@ -1,603 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/small_map.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <functional>
-#include <map>
-#include <unordered_map>
-
-#include "base/logging.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(SmallMap, General) {
-  small_map<std::unordered_map<int, int>> m;
-
-  EXPECT_TRUE(m.empty());
-
-  m[0] = 5;
-
-  EXPECT_FALSE(m.empty());
-  EXPECT_EQ(m.size(), 1u);
-
-  m[9] = 2;
-
-  EXPECT_FALSE(m.empty());
-  EXPECT_EQ(m.size(), 2u);
-
-  EXPECT_EQ(m[9], 2);
-  EXPECT_EQ(m[0], 5);
-  EXPECT_FALSE(m.UsingFullMap());
-
-  small_map<std::unordered_map<int, int>>::iterator iter(m.begin());
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, 0);
-  EXPECT_EQ(iter->second, 5);
-  ++iter;
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ((*iter).first, 9);
-  EXPECT_EQ((*iter).second, 2);
-  ++iter;
-  EXPECT_TRUE(iter == m.end());
-
-  m[8] = 23;
-  m[1234] = 90;
-  m[-5] = 6;
-
-  EXPECT_EQ(m[   9],  2);
-  EXPECT_EQ(m[   0],  5);
-  EXPECT_EQ(m[1234], 90);
-  EXPECT_EQ(m[   8], 23);
-  EXPECT_EQ(m[  -5],  6);
-  EXPECT_EQ(m.size(), 5u);
-  EXPECT_FALSE(m.empty());
-  EXPECT_TRUE(m.UsingFullMap());
-
-  iter = m.begin();
-  for (int i = 0; i < 5; i++) {
-    EXPECT_TRUE(iter != m.end());
-    ++iter;
-  }
-  EXPECT_TRUE(iter == m.end());
-
-  const small_map<std::unordered_map<int, int>>& ref = m;
-  EXPECT_TRUE(ref.find(1234) != m.end());
-  EXPECT_TRUE(ref.find(5678) == m.end());
-}
-
-TEST(SmallMap, PostFixIteratorIncrement) {
-  small_map<std::unordered_map<int, int>> m;
-  m[0] = 5;
-  m[2] = 3;
-
-  {
-    small_map<std::unordered_map<int, int>>::iterator iter(m.begin());
-    small_map<std::unordered_map<int, int>>::iterator last(iter++);
-    ++last;
-    EXPECT_TRUE(last == iter);
-  }
-
-  {
-    small_map<std::unordered_map<int, int>>::const_iterator iter(m.begin());
-    small_map<std::unordered_map<int, int>>::const_iterator last(iter++);
-    ++last;
-    EXPECT_TRUE(last == iter);
-  }
-}
-
-// Based on the General testcase.
-TEST(SmallMap, CopyConstructor) {
-  small_map<std::unordered_map<int, int>> src;
-
-  {
-    small_map<std::unordered_map<int, int>> m(src);
-    EXPECT_TRUE(m.empty());
-  }
-
-  src[0] = 5;
-
-  {
-    small_map<std::unordered_map<int, int>> m(src);
-    EXPECT_FALSE(m.empty());
-    EXPECT_EQ(m.size(), 1u);
-  }
-
-  src[9] = 2;
-
-  {
-    small_map<std::unordered_map<int, int>> m(src);
-    EXPECT_FALSE(m.empty());
-    EXPECT_EQ(m.size(), 2u);
-
-    EXPECT_EQ(m[9], 2);
-    EXPECT_EQ(m[0], 5);
-    EXPECT_FALSE(m.UsingFullMap());
-  }
-
-  src[8] = 23;
-  src[1234] = 90;
-  src[-5] = 6;
-
-  {
-    small_map<std::unordered_map<int, int>> m(src);
-    EXPECT_EQ(m[   9],  2);
-    EXPECT_EQ(m[   0],  5);
-    EXPECT_EQ(m[1234], 90);
-    EXPECT_EQ(m[   8], 23);
-    EXPECT_EQ(m[  -5],  6);
-    EXPECT_EQ(m.size(), 5u);
-    EXPECT_FALSE(m.empty());
-    EXPECT_TRUE(m.UsingFullMap());
-  }
-}
-
-template <class inner>
-static bool SmallMapIsSubset(small_map<inner> const& a,
-                             small_map<inner> const& b) {
-  typename small_map<inner>::const_iterator it;
-  for (it = a.begin(); it != a.end(); ++it) {
-    typename small_map<inner>::const_iterator it_in_b = b.find(it->first);
-    if (it_in_b == b.end() || it_in_b->second != it->second)
-      return false;
-  }
-  return true;
-}
-
-template <class inner>
-static bool SmallMapEqual(small_map<inner> const& a,
-                          small_map<inner> const& b) {
-  return SmallMapIsSubset(a, b) && SmallMapIsSubset(b, a);
-}
-
-TEST(SmallMap, AssignmentOperator) {
-  small_map<std::unordered_map<int, int>> src_small;
-  small_map<std::unordered_map<int, int>> src_large;
-
-  src_small[1] = 20;
-  src_small[2] = 21;
-  src_small[3] = 22;
-  EXPECT_FALSE(src_small.UsingFullMap());
-
-  src_large[1] = 20;
-  src_large[2] = 21;
-  src_large[3] = 22;
-  src_large[5] = 23;
-  src_large[6] = 24;
-  src_large[7] = 25;
-  EXPECT_TRUE(src_large.UsingFullMap());
-
-  // Assignments to empty.
-  small_map<std::unordered_map<int, int>> dest_small;
-  dest_small = src_small;
-  EXPECT_TRUE(SmallMapEqual(dest_small, src_small));
-  EXPECT_EQ(dest_small.UsingFullMap(),
-            src_small.UsingFullMap());
-
-  small_map<std::unordered_map<int, int>> dest_large;
-  dest_large = src_large;
-  EXPECT_TRUE(SmallMapEqual(dest_large, src_large));
-  EXPECT_EQ(dest_large.UsingFullMap(),
-            src_large.UsingFullMap());
-
-  // Assignments which assign from full to small, and vice versa.
-  dest_small = src_large;
-  EXPECT_TRUE(SmallMapEqual(dest_small, src_large));
-  EXPECT_EQ(dest_small.UsingFullMap(),
-            src_large.UsingFullMap());
-
-  dest_large = src_small;
-  EXPECT_TRUE(SmallMapEqual(dest_large, src_small));
-  EXPECT_EQ(dest_large.UsingFullMap(),
-            src_small.UsingFullMap());
-
-  // Double check that SmallMapEqual works:
-  dest_large[42] = 666;
-  EXPECT_FALSE(SmallMapEqual(dest_large, src_small));
-}
-
-TEST(SmallMap, Insert) {
-  small_map<std::unordered_map<int, int>> sm;
-
-  // loop through the transition from small map to map.
-  for (int i = 1; i <= 10; ++i) {
-    VLOG(1) << "Iteration " << i;
-    // insert an element
-    std::pair<small_map<std::unordered_map<int, int>>::iterator, bool> ret;
-    ret = sm.insert(std::make_pair(i, 100*i));
-    EXPECT_TRUE(ret.second);
-    EXPECT_TRUE(ret.first == sm.find(i));
-    EXPECT_EQ(ret.first->first, i);
-    EXPECT_EQ(ret.first->second, 100*i);
-
-    // try to insert it again with different value, fails, but we still get an
-    // iterator back with the original value.
-    ret = sm.insert(std::make_pair(i, -i));
-    EXPECT_FALSE(ret.second);
-    EXPECT_TRUE(ret.first == sm.find(i));
-    EXPECT_EQ(ret.first->first, i);
-    EXPECT_EQ(ret.first->second, 100*i);
-
-    // check the state of the map.
-    for (int j = 1; j <= i; ++j) {
-      small_map<std::unordered_map<int, int>>::iterator it = sm.find(j);
-      EXPECT_TRUE(it != sm.end());
-      EXPECT_EQ(it->first, j);
-      EXPECT_EQ(it->second, j * 100);
-    }
-    EXPECT_EQ(sm.size(), static_cast<size_t>(i));
-    EXPECT_FALSE(sm.empty());
-  }
-}
-
-TEST(SmallMap, InsertRange) {
-  // loop through the transition from small map to map.
-  for (int elements = 0; elements <= 10; ++elements) {
-    VLOG(1) << "Elements " << elements;
-    std::unordered_map<int, int> normal_map;
-    for (int i = 1; i <= elements; ++i) {
-      normal_map.insert(std::make_pair(i, 100*i));
-    }
-
-    small_map<std::unordered_map<int, int>> sm;
-    sm.insert(normal_map.begin(), normal_map.end());
-    EXPECT_EQ(normal_map.size(), sm.size());
-    for (int i = 1; i <= elements; ++i) {
-      VLOG(1) << "Iteration " << i;
-      EXPECT_TRUE(sm.find(i) != sm.end());
-      EXPECT_EQ(sm.find(i)->first, i);
-      EXPECT_EQ(sm.find(i)->second, 100*i);
-    }
-  }
-}
-
-TEST(SmallMap, Erase) {
-  small_map<std::unordered_map<std::string, int>> m;
-  small_map<std::unordered_map<std::string, int>>::iterator iter;
-
-  m["monday"] = 1;
-  m["tuesday"] = 2;
-  m["wednesday"] = 3;
-
-  EXPECT_EQ(m["monday"   ], 1);
-  EXPECT_EQ(m["tuesday"  ], 2);
-  EXPECT_EQ(m["wednesday"], 3);
-  EXPECT_EQ(m.count("tuesday"), 1u);
-  EXPECT_FALSE(m.UsingFullMap());
-
-  iter = m.begin();
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, "monday");
-  EXPECT_EQ(iter->second, 1);
-  ++iter;
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, "tuesday");
-  EXPECT_EQ(iter->second, 2);
-  ++iter;
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, "wednesday");
-  EXPECT_EQ(iter->second, 3);
-  ++iter;
-  EXPECT_TRUE(iter == m.end());
-
-  EXPECT_EQ(m.erase("tuesday"), 1u);
-
-  EXPECT_EQ(m["monday"   ], 1);
-  EXPECT_EQ(m["wednesday"], 3);
-  EXPECT_EQ(m.count("tuesday"), 0u);
-  EXPECT_EQ(m.erase("tuesday"), 0u);
-
-  iter = m.begin();
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, "monday");
-  EXPECT_EQ(iter->second, 1);
-  ++iter;
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, "wednesday");
-  EXPECT_EQ(iter->second, 3);
-  ++iter;
-  EXPECT_TRUE(iter == m.end());
-
-  m["thursday"] = 4;
-  m["friday"] = 5;
-  EXPECT_EQ(m.size(), 4u);
-  EXPECT_FALSE(m.empty());
-  EXPECT_FALSE(m.UsingFullMap());
-
-  m["saturday"] = 6;
-  EXPECT_TRUE(m.UsingFullMap());
-
-  EXPECT_EQ(m.count("friday"), 1u);
-  EXPECT_EQ(m.erase("friday"), 1u);
-  EXPECT_TRUE(m.UsingFullMap());
-  EXPECT_EQ(m.count("friday"), 0u);
-  EXPECT_EQ(m.erase("friday"), 0u);
-
-  EXPECT_EQ(m.size(), 4u);
-  EXPECT_FALSE(m.empty());
-  EXPECT_EQ(m.erase("monday"), 1u);
-  EXPECT_EQ(m.size(), 3u);
-  EXPECT_FALSE(m.empty());
-
-  m.clear();
-  EXPECT_FALSE(m.UsingFullMap());
-  EXPECT_EQ(m.size(), 0u);
-  EXPECT_TRUE(m.empty());
-}
-
-TEST(SmallMap, EraseReturnsIteratorFollowingRemovedElement) {
-  small_map<std::unordered_map<std::string, int>> m;
-  small_map<std::unordered_map<std::string, int>>::iterator iter;
-
-  m["a"] = 0;
-  m["b"] = 1;
-  m["c"] = 2;
-
-  // Erase first item.
-  auto following_iter = m.erase(m.begin());
-  EXPECT_EQ(m.begin(), following_iter);
-  EXPECT_EQ(2u, m.size());
-  EXPECT_EQ(m.count("a"), 0u);
-  EXPECT_EQ(m.count("b"), 1u);
-  EXPECT_EQ(m.count("c"), 1u);
-
-  // Iterate to last item and erase it.
-  ++following_iter;
-  following_iter = m.erase(following_iter);
-  ASSERT_EQ(1u, m.size());
-  EXPECT_EQ(m.end(), following_iter);
-  EXPECT_EQ(m.count("b"), 0u);
-  EXPECT_EQ(m.count("c"), 1u);
-
-  // Erase remaining item.
-  following_iter = m.erase(m.begin());
-  EXPECT_TRUE(m.empty());
-  EXPECT_EQ(m.end(), following_iter);
-}
-
-TEST(SmallMap, NonHashMap) {
-  small_map<std::map<int, int>, 4, std::equal_to<int>> m;
-  EXPECT_TRUE(m.empty());
-
-  m[9] = 2;
-  m[0] = 5;
-
-  EXPECT_EQ(m[9], 2);
-  EXPECT_EQ(m[0], 5);
-  EXPECT_EQ(m.size(), 2u);
-  EXPECT_FALSE(m.empty());
-  EXPECT_FALSE(m.UsingFullMap());
-
-  small_map<std::map<int, int>, 4, std::equal_to<int>>::iterator iter(
-      m.begin());
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, 9);
-  EXPECT_EQ(iter->second, 2);
-  ++iter;
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, 0);
-  EXPECT_EQ(iter->second, 5);
-  ++iter;
-  EXPECT_TRUE(iter == m.end());
-  --iter;
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, 0);
-  EXPECT_EQ(iter->second, 5);
-
-  m[8] = 23;
-  m[1234] = 90;
-  m[-5] = 6;
-
-  EXPECT_EQ(m[   9],  2);
-  EXPECT_EQ(m[   0],  5);
-  EXPECT_EQ(m[1234], 90);
-  EXPECT_EQ(m[   8], 23);
-  EXPECT_EQ(m[  -5],  6);
-  EXPECT_EQ(m.size(), 5u);
-  EXPECT_FALSE(m.empty());
-  EXPECT_TRUE(m.UsingFullMap());
-
-  iter = m.begin();
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, -5);
-  EXPECT_EQ(iter->second, 6);
-  ++iter;
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, 0);
-  EXPECT_EQ(iter->second, 5);
-  ++iter;
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, 8);
-  EXPECT_EQ(iter->second, 23);
-  ++iter;
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, 9);
-  EXPECT_EQ(iter->second, 2);
-  ++iter;
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, 1234);
-  EXPECT_EQ(iter->second, 90);
-  ++iter;
-  EXPECT_TRUE(iter == m.end());
-  --iter;
-  ASSERT_TRUE(iter != m.end());
-  EXPECT_EQ(iter->first, 1234);
-  EXPECT_EQ(iter->second, 90);
-}
-
-TEST(SmallMap, DefaultEqualKeyWorks) {
-  // If these tests compile, they pass. The EXPECT calls are only there to avoid
-  // unused variable warnings.
-  small_map<std::unordered_map<int, int>> hm;
-  EXPECT_EQ(0u, hm.size());
-  small_map<std::map<int, int>> m;
-  EXPECT_EQ(0u, m.size());
-}
-
-namespace {
-
-class unordered_map_add_item : public std::unordered_map<int, int> {
- public:
-  unordered_map_add_item() = default;
-  explicit unordered_map_add_item(const std::pair<int, int>& item) {
-    insert(item);
-  }
-};
-
-void InitMap(unordered_map_add_item* map_ctor) {
-  new (map_ctor) unordered_map_add_item(std::make_pair(0, 0));
-}
-
-class unordered_map_add_item_initializer {
- public:
-  explicit unordered_map_add_item_initializer(int item_to_add)
-      : item_(item_to_add) {}
-  unordered_map_add_item_initializer() : item_(0) {}
-  void operator()(unordered_map_add_item* map_ctor) const {
-    new (map_ctor) unordered_map_add_item(std::make_pair(item_, item_));
-  }
-
-  int item_;
-};
-
-}  // anonymous namespace
-
-TEST(SmallMap, SubclassInitializationWithFunctionPointer) {
-  small_map<unordered_map_add_item, 4, std::equal_to<int>,
-            void (&)(unordered_map_add_item*)>
-      m(InitMap);
-
-  EXPECT_TRUE(m.empty());
-
-  m[1] = 1;
-  m[2] = 2;
-  m[3] = 3;
-  m[4] = 4;
-
-  EXPECT_EQ(4u, m.size());
-  EXPECT_EQ(0u, m.count(0));
-
-  m[5] = 5;
-  EXPECT_EQ(6u, m.size());
-  // Our function adds an extra item when we convert to a map.
-  EXPECT_EQ(1u, m.count(0));
-}
-
-TEST(SmallMap, SubclassInitializationWithFunctionObject) {
-  small_map<unordered_map_add_item, 4, std::equal_to<int>,
-            unordered_map_add_item_initializer>
-      m(unordered_map_add_item_initializer(-1));
-
-  EXPECT_TRUE(m.empty());
-
-  m[1] = 1;
-  m[2] = 2;
-  m[3] = 3;
-  m[4] = 4;
-
-  EXPECT_EQ(4u, m.size());
-  EXPECT_EQ(0u, m.count(-1));
-
-  m[5] = 5;
-  EXPECT_EQ(6u, m.size());
-  // Our functor adds an extra item when we convert to a map.
-  EXPECT_EQ(1u, m.count(-1));
-}
-
-namespace {
-
-// This class acts as a basic implementation of a move-only type. The canonical
-// example of such a type is scoped_ptr/unique_ptr.
-template <typename V>
-class MoveOnlyType {
- public:
-  MoveOnlyType() : value_(0) {}
-  explicit MoveOnlyType(V value) : value_(value) {}
-
-  MoveOnlyType(MoveOnlyType&& other) {
-    *this = std::move(other);
-  }
-
-  MoveOnlyType& operator=(MoveOnlyType&& other) {
-    value_ = other.value_;
-    other.value_ = 0;
-    return *this;
-  }
-
-  MoveOnlyType(const MoveOnlyType&) = delete;
-  MoveOnlyType& operator=(const MoveOnlyType&) = delete;
-
-  V value() const { return value_; }
-
- private:
-  V value_;
-};
-
-}  // namespace
-
-TEST(SmallMap, MoveOnlyValueType) {
-  small_map<std::map<int, MoveOnlyType<int>>, 2> m;
-
-  m[0] = MoveOnlyType<int>(1);
-  m[1] = MoveOnlyType<int>(2);
-  m.erase(m.begin());
-
-  // small_map will move m[1] to an earlier index in the internal array.
-  EXPECT_EQ(m.size(), 1u);
-  EXPECT_EQ(m[1].value(), 2);
-
-  m[0] = MoveOnlyType<int>(1);
-  // small_map must move the values from the array into the internal std::map.
-  m[2] = MoveOnlyType<int>(3);
-
-  EXPECT_EQ(m.size(), 3u);
-  EXPECT_EQ(m[0].value(), 1);
-  EXPECT_EQ(m[1].value(), 2);
-  EXPECT_EQ(m[2].value(), 3);
-
-  m.erase(m.begin());
-
-  // small_map should also let internal std::map erase with a move-only type.
-  EXPECT_EQ(m.size(), 2u);
-  EXPECT_EQ(m[1].value(), 2);
-  EXPECT_EQ(m[2].value(), 3);
-}
-
-TEST(SmallMap, Emplace) {
-  small_map<std::map<size_t, MoveOnlyType<size_t>>> sm;
-
-  // loop through the transition from small map to map.
-  for (size_t i = 1; i <= 10; ++i) {
-    // insert an element
-    auto ret = sm.emplace(i, MoveOnlyType<size_t>(100 * i));
-    EXPECT_TRUE(ret.second);
-    EXPECT_TRUE(ret.first == sm.find(i));
-    EXPECT_EQ(ret.first->first, i);
-    EXPECT_EQ(ret.first->second.value(), 100 * i);
-
-    // try to insert it again with different value, fails, but we still get an
-    // iterator back with the original value.
-    ret = sm.emplace(i, MoveOnlyType<size_t>(i));
-    EXPECT_FALSE(ret.second);
-    EXPECT_TRUE(ret.first == sm.find(i));
-    EXPECT_EQ(ret.first->first, i);
-    EXPECT_EQ(ret.first->second.value(), 100 * i);
-
-    // check the state of the map.
-    for (size_t j = 1; j <= i; ++j) {
-      const auto it = sm.find(j);
-      EXPECT_TRUE(it != sm.end());
-      EXPECT_EQ(it->first, j);
-      EXPECT_EQ(it->second.value(), j * 100);
-    }
-    EXPECT_EQ(sm.size(), i);
-    EXPECT_FALSE(sm.empty());
-  }
-}
-
-}  // namespace base
diff --git a/base/containers/span_unittest.cc b/base/containers/span_unittest.cc
deleted file mode 100644
index de5e401..0000000
--- a/base/containers/span_unittest.cc
+++ /dev/null
@@ -1,1170 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/span.h"
-
-#include <stdint.h>
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::ElementsAre;
-using ::testing::Eq;
-using ::testing::Pointwise;
-
-namespace base {
-
-TEST(SpanTest, DefaultConstructor) {
-  span<int> dynamic_span;
-  EXPECT_EQ(nullptr, dynamic_span.data());
-  EXPECT_EQ(0u, dynamic_span.size());
-
-  constexpr span<int, 0> static_span;
-  static_assert(nullptr == static_span.data(), "");
-  static_assert(0u == static_span.size(), "");
-}
-
-TEST(SpanTest, ConstructFromDataAndSize) {
-  constexpr span<int> empty_span(nullptr, 0);
-  EXPECT_TRUE(empty_span.empty());
-  EXPECT_EQ(nullptr, empty_span.data());
-
-  std::vector<int> vector = {1, 1, 2, 3, 5, 8};
-
-  span<int> dynamic_span(vector.data(), vector.size());
-  EXPECT_EQ(vector.data(), dynamic_span.data());
-  EXPECT_EQ(vector.size(), dynamic_span.size());
-
-  for (size_t i = 0; i < dynamic_span.size(); ++i)
-    EXPECT_EQ(vector[i], dynamic_span[i]);
-
-  span<int, 6> static_span(vector.data(), vector.size());
-  EXPECT_EQ(vector.data(), static_span.data());
-  EXPECT_EQ(vector.size(), static_span.size());
-
-  for (size_t i = 0; i < static_span.size(); ++i)
-    EXPECT_EQ(vector[i], static_span[i]);
-}
-
-TEST(SpanTest, ConstructFromPointerPair) {
-  constexpr span<int> empty_span(nullptr, nullptr);
-  EXPECT_TRUE(empty_span.empty());
-  EXPECT_EQ(nullptr, empty_span.data());
-
-  std::vector<int> vector = {1, 1, 2, 3, 5, 8};
-
-  span<int> dynamic_span(vector.data(), vector.data() + vector.size() / 2);
-  EXPECT_EQ(vector.data(), dynamic_span.data());
-  EXPECT_EQ(vector.size() / 2, dynamic_span.size());
-
-  for (size_t i = 0; i < dynamic_span.size(); ++i)
-    EXPECT_EQ(vector[i], dynamic_span[i]);
-
-  span<int, 3> static_span(vector.data(), vector.data() + vector.size() / 2);
-  EXPECT_EQ(vector.data(), static_span.data());
-  EXPECT_EQ(vector.size() / 2, static_span.size());
-
-  for (size_t i = 0; i < static_span.size(); ++i)
-    EXPECT_EQ(vector[i], static_span[i]);
-}
-
-TEST(SpanTest, ConstructFromConstexprArray) {
-  static constexpr int kArray[] = {5, 4, 3, 2, 1};
-
-  constexpr span<const int> dynamic_span(kArray);
-  static_assert(kArray == dynamic_span.data(), "");
-  static_assert(base::size(kArray) == dynamic_span.size(), "");
-
-  static_assert(kArray[0] == dynamic_span[0], "");
-  static_assert(kArray[1] == dynamic_span[1], "");
-  static_assert(kArray[2] == dynamic_span[2], "");
-  static_assert(kArray[3] == dynamic_span[3], "");
-  static_assert(kArray[4] == dynamic_span[4], "");
-
-  constexpr span<const int, base::size(kArray)> static_span(kArray);
-  static_assert(kArray == static_span.data(), "");
-  static_assert(base::size(kArray) == static_span.size(), "");
-
-  static_assert(kArray[0] == static_span[0], "");
-  static_assert(kArray[1] == static_span[1], "");
-  static_assert(kArray[2] == static_span[2], "");
-  static_assert(kArray[3] == static_span[3], "");
-  static_assert(kArray[4] == static_span[4], "");
-}
-
-TEST(SpanTest, ConstructFromArray) {
-  int array[] = {5, 4, 3, 2, 1};
-
-  span<const int> const_span(array);
-  EXPECT_EQ(array, const_span.data());
-  EXPECT_EQ(arraysize(array), const_span.size());
-  for (size_t i = 0; i < const_span.size(); ++i)
-    EXPECT_EQ(array[i], const_span[i]);
-
-  span<int> dynamic_span(array);
-  EXPECT_EQ(array, dynamic_span.data());
-  EXPECT_EQ(base::size(array), dynamic_span.size());
-  for (size_t i = 0; i < dynamic_span.size(); ++i)
-    EXPECT_EQ(array[i], dynamic_span[i]);
-
-  span<int, base::size(array)> static_span(array);
-  EXPECT_EQ(array, static_span.data());
-  EXPECT_EQ(base::size(array), static_span.size());
-  for (size_t i = 0; i < static_span.size(); ++i)
-    EXPECT_EQ(array[i], static_span[i]);
-}
-
-TEST(SpanTest, ConstructFromStdArray) {
-  // Note: Constructing a constexpr span from a constexpr std::array does not
-  // work prior to C++17 due to non-constexpr std::array::data.
-  std::array<int, 5> array = {{5, 4, 3, 2, 1}};
-
-  span<const int> const_span(array);
-  EXPECT_EQ(array.data(), const_span.data());
-  EXPECT_EQ(array.size(), const_span.size());
-  for (size_t i = 0; i < const_span.size(); ++i)
-    EXPECT_EQ(array[i], const_span[i]);
-
-  span<int> dynamic_span(array);
-  EXPECT_EQ(array.data(), dynamic_span.data());
-  EXPECT_EQ(array.size(), dynamic_span.size());
-  for (size_t i = 0; i < dynamic_span.size(); ++i)
-    EXPECT_EQ(array[i], dynamic_span[i]);
-
-  span<int, base::size(array)> static_span(array);
-  EXPECT_EQ(array.data(), static_span.data());
-  EXPECT_EQ(array.size(), static_span.size());
-  for (size_t i = 0; i < static_span.size(); ++i)
-    EXPECT_EQ(array[i], static_span[i]);
-}
-
-TEST(SpanTest, ConstructFromInitializerList) {
-  std::initializer_list<int> il = {1, 1, 2, 3, 5, 8};
-
-  span<const int> const_span(il);
-  EXPECT_EQ(il.begin(), const_span.data());
-  EXPECT_EQ(il.size(), const_span.size());
-
-  for (size_t i = 0; i < const_span.size(); ++i)
-    EXPECT_EQ(il.begin()[i], const_span[i]);
-
-  span<const int, 6> static_span(il);
-  EXPECT_EQ(il.begin(), static_span.data());
-  EXPECT_EQ(il.size(), static_span.size());
-
-  for (size_t i = 0; i < static_span.size(); ++i)
-    EXPECT_EQ(il.begin()[i], static_span[i]);
-}
-
-TEST(SpanTest, ConstructFromStdString) {
-  std::string str = "foobar";
-
-  span<const char> const_span(str);
-  EXPECT_EQ(str.data(), const_span.data());
-  EXPECT_EQ(str.size(), const_span.size());
-
-  for (size_t i = 0; i < const_span.size(); ++i)
-    EXPECT_EQ(str[i], const_span[i]);
-
-  span<char> dynamic_span(str);
-  EXPECT_EQ(str.data(), dynamic_span.data());
-  EXPECT_EQ(str.size(), dynamic_span.size());
-
-  for (size_t i = 0; i < dynamic_span.size(); ++i)
-    EXPECT_EQ(str[i], dynamic_span[i]);
-
-  span<char, 6> static_span(str);
-  EXPECT_EQ(str.data(), static_span.data());
-  EXPECT_EQ(str.size(), static_span.size());
-
-  for (size_t i = 0; i < static_span.size(); ++i)
-    EXPECT_EQ(str[i], static_span[i]);
-}
-
-TEST(SpanTest, ConstructFromConstContainer) {
-  const std::vector<int> vector = {1, 1, 2, 3, 5, 8};
-
-  span<const int> const_span(vector);
-  EXPECT_EQ(vector.data(), const_span.data());
-  EXPECT_EQ(vector.size(), const_span.size());
-
-  for (size_t i = 0; i < const_span.size(); ++i)
-    EXPECT_EQ(vector[i], const_span[i]);
-
-  span<const int, 6> static_span(vector);
-  EXPECT_EQ(vector.data(), static_span.data());
-  EXPECT_EQ(vector.size(), static_span.size());
-
-  for (size_t i = 0; i < static_span.size(); ++i)
-    EXPECT_EQ(vector[i], static_span[i]);
-}
-
-TEST(SpanTest, ConstructFromContainer) {
-  std::vector<int> vector = {1, 1, 2, 3, 5, 8};
-
-  span<const int> const_span(vector);
-  EXPECT_EQ(vector.data(), const_span.data());
-  EXPECT_EQ(vector.size(), const_span.size());
-
-  for (size_t i = 0; i < const_span.size(); ++i)
-    EXPECT_EQ(vector[i], const_span[i]);
-
-  span<int> dynamic_span(vector);
-  EXPECT_EQ(vector.data(), dynamic_span.data());
-  EXPECT_EQ(vector.size(), dynamic_span.size());
-
-  for (size_t i = 0; i < dynamic_span.size(); ++i)
-    EXPECT_EQ(vector[i], dynamic_span[i]);
-
-  span<int, 6> static_span(vector);
-  EXPECT_EQ(vector.data(), static_span.data());
-  EXPECT_EQ(vector.size(), static_span.size());
-
-  for (size_t i = 0; i < static_span.size(); ++i)
-    EXPECT_EQ(vector[i], static_span[i]);
-}
-
-TEST(SpanTest, ConvertNonConstIntegralToConst) {
-  std::vector<int> vector = {1, 1, 2, 3, 5, 8};
-
-  span<int> int_span(vector.data(), vector.size());
-  span<const int> const_span(int_span);
-  EXPECT_THAT(const_span, Pointwise(Eq(), int_span));
-
-  span<int, 6> static_int_span(vector.data(), vector.size());
-  span<const int, 6> static_const_span(static_int_span);
-  EXPECT_THAT(static_const_span, Pointwise(Eq(), static_int_span));
-}
-
-TEST(SpanTest, ConvertNonConstPointerToConst) {
-  auto a = std::make_unique<int>(11);
-  auto b = std::make_unique<int>(22);
-  auto c = std::make_unique<int>(33);
-  std::vector<int*> vector = {a.get(), b.get(), c.get()};
-
-  span<int*> non_const_pointer_span(vector);
-  EXPECT_THAT(non_const_pointer_span, Pointwise(Eq(), vector));
-  span<int* const> const_pointer_span(non_const_pointer_span);
-  EXPECT_THAT(const_pointer_span, Pointwise(Eq(), non_const_pointer_span));
-  // Note: no test for conversion from span<int> to span<const int*>, since that
-  // would imply a conversion from int** to const int**, which is unsafe.
-  //
-  // Note: no test for conversion from span<int*> to span<const int* const>,
-  // due to CWG Defect 330:
-  // http://open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#330
-
-  span<int*, 3> static_non_const_pointer_span(vector);
-  EXPECT_THAT(static_non_const_pointer_span, Pointwise(Eq(), vector));
-  span<int* const, 3> static_const_pointer_span(static_non_const_pointer_span);
-  EXPECT_THAT(static_const_pointer_span,
-              Pointwise(Eq(), static_non_const_pointer_span));
-}
-
-TEST(SpanTest, ConvertBetweenEquivalentTypes) {
-  std::vector<int32_t> vector = {2, 4, 8, 16, 32};
-
-  span<int32_t> int32_t_span(vector);
-  span<int> converted_span(int32_t_span);
-  EXPECT_EQ(int32_t_span, converted_span);
-
-  span<int32_t, 5> static_int32_t_span(vector);
-  span<int, 5> static_converted_span(static_int32_t_span);
-  EXPECT_EQ(static_int32_t_span, static_converted_span);
-}
-
-TEST(SpanTest, TemplatedFirst) {
-  static constexpr int array[] = {1, 2, 3};
-  constexpr span<const int, 3> span(array);
-
-  {
-    constexpr auto subspan = span.first<0>();
-    static_assert(span.data() == subspan.data(), "");
-    static_assert(0u == subspan.size(), "");
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    constexpr auto subspan = span.first<1>();
-    static_assert(span.data() == subspan.data(), "");
-    static_assert(1u == subspan.size(), "");
-    static_assert(1u == decltype(subspan)::extent, "");
-    static_assert(1 == subspan[0], "");
-  }
-
-  {
-    constexpr auto subspan = span.first<2>();
-    static_assert(span.data() == subspan.data(), "");
-    static_assert(2u == subspan.size(), "");
-    static_assert(2u == decltype(subspan)::extent, "");
-    static_assert(1 == subspan[0], "");
-    static_assert(2 == subspan[1], "");
-  }
-
-  {
-    constexpr auto subspan = span.first<3>();
-    static_assert(span.data() == subspan.data(), "");
-    static_assert(3u == subspan.size(), "");
-    static_assert(3u == decltype(subspan)::extent, "");
-    static_assert(1 == subspan[0], "");
-    static_assert(2 == subspan[1], "");
-    static_assert(3 == subspan[2], "");
-  }
-}
-
-TEST(SpanTest, TemplatedLast) {
-  static constexpr int array[] = {1, 2, 3};
-  constexpr span<const int, 3> span(array);
-
-  {
-    constexpr auto subspan = span.last<0>();
-    static_assert(span.data() + 3 == subspan.data(), "");
-    static_assert(0u == subspan.size(), "");
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    constexpr auto subspan = span.last<1>();
-    static_assert(span.data() + 2 == subspan.data(), "");
-    static_assert(1u == subspan.size(), "");
-    static_assert(1u == decltype(subspan)::extent, "");
-    static_assert(3 == subspan[0], "");
-  }
-
-  {
-    constexpr auto subspan = span.last<2>();
-    static_assert(span.data() + 1 == subspan.data(), "");
-    static_assert(2u == subspan.size(), "");
-    static_assert(2u == decltype(subspan)::extent, "");
-    static_assert(2 == subspan[0], "");
-    static_assert(3 == subspan[1], "");
-  }
-
-  {
-    constexpr auto subspan = span.last<3>();
-    static_assert(span.data() == subspan.data(), "");
-    static_assert(3u == subspan.size(), "");
-    static_assert(3u == decltype(subspan)::extent, "");
-    static_assert(1 == subspan[0], "");
-    static_assert(2 == subspan[1], "");
-    static_assert(3 == subspan[2], "");
-  }
-}
-
-TEST(SpanTest, TemplatedSubspan) {
-  static constexpr int array[] = {1, 2, 3};
-  constexpr span<const int, 3> span(array);
-
-  {
-    constexpr auto subspan = span.subspan<0>();
-    static_assert(span.data() == subspan.data(), "");
-    static_assert(3u == subspan.size(), "");
-    static_assert(3u == decltype(subspan)::extent, "");
-    static_assert(1 == subspan[0], "");
-    static_assert(2 == subspan[1], "");
-    static_assert(3 == subspan[2], "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<1>();
-    static_assert(span.data() + 1 == subspan.data(), "");
-    static_assert(2u == subspan.size(), "");
-    static_assert(2u == decltype(subspan)::extent, "");
-    static_assert(2 == subspan[0], "");
-    static_assert(3 == subspan[1], "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<2>();
-    static_assert(span.data() + 2 == subspan.data(), "");
-    static_assert(1u == subspan.size(), "");
-    static_assert(1u == decltype(subspan)::extent, "");
-    static_assert(3 == subspan[0], "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<3>();
-    static_assert(span.data() + 3 == subspan.data(), "");
-    static_assert(0u == subspan.size(), "");
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<0, 0>();
-    static_assert(span.data() == subspan.data(), "");
-    static_assert(0u == subspan.size(), "");
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<1, 0>();
-    static_assert(span.data() + 1 == subspan.data(), "");
-    static_assert(0u == subspan.size(), "");
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<2, 0>();
-    static_assert(span.data() + 2 == subspan.data(), "");
-    static_assert(0u == subspan.size(), "");
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<0, 1>();
-    static_assert(span.data() == subspan.data(), "");
-    static_assert(1u == subspan.size(), "");
-    static_assert(1u == decltype(subspan)::extent, "");
-    static_assert(1 == subspan[0], "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<1, 1>();
-    static_assert(span.data() + 1 == subspan.data(), "");
-    static_assert(1u == subspan.size(), "");
-    static_assert(1u == decltype(subspan)::extent, "");
-    static_assert(2 == subspan[0], "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<2, 1>();
-    static_assert(span.data() + 2 == subspan.data(), "");
-    static_assert(1u == subspan.size(), "");
-    static_assert(1u == decltype(subspan)::extent, "");
-    static_assert(3 == subspan[0], "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<0, 2>();
-    static_assert(span.data() == subspan.data(), "");
-    static_assert(2u == subspan.size(), "");
-    static_assert(2u == decltype(subspan)::extent, "");
-    static_assert(1 == subspan[0], "");
-    static_assert(2 == subspan[1], "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<1, 2>();
-    static_assert(span.data() + 1 == subspan.data(), "");
-    static_assert(2u == subspan.size(), "");
-    static_assert(2u == decltype(subspan)::extent, "");
-    static_assert(2 == subspan[0], "");
-    static_assert(3 == subspan[1], "");
-  }
-
-  {
-    constexpr auto subspan = span.subspan<0, 3>();
-    static_assert(span.data() == subspan.data(), "");
-    static_assert(3u == subspan.size(), "");
-    static_assert(3u == decltype(subspan)::extent, "");
-    static_assert(1 == subspan[0], "");
-    static_assert(2 == subspan[1], "");
-    static_assert(3 == subspan[2], "");
-  }
-}
-
-TEST(SpanTest, TemplatedFirstOnDynamicSpan) {
-  int array[] = {1, 2, 3};
-  span<const int> span(array);
-
-  {
-    auto subspan = span.first<0>();
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    auto subspan = span.first<1>();
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    static_assert(1u == decltype(subspan)::extent, "");
-    EXPECT_EQ(1, subspan[0]);
-  }
-
-  {
-    auto subspan = span.first<2>();
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(2u, subspan.size());
-    static_assert(2u == decltype(subspan)::extent, "");
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-  }
-
-  {
-    auto subspan = span.first<3>();
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(3u, subspan.size());
-    static_assert(3u == decltype(subspan)::extent, "");
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-    EXPECT_EQ(3, subspan[2]);
-  }
-}
-
-TEST(SpanTest, TemplatedLastOnDynamicSpan) {
-  int array[] = {1, 2, 3};
-  span<int> span(array);
-
-  {
-    auto subspan = span.last<0>();
-    EXPECT_EQ(span.data() + 3, subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    auto subspan = span.last<1>();
-    EXPECT_EQ(span.data() + 2, subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    static_assert(1u == decltype(subspan)::extent, "");
-    EXPECT_EQ(3, subspan[0]);
-  }
-
-  {
-    auto subspan = span.last<2>();
-    EXPECT_EQ(span.data() + 1, subspan.data());
-    EXPECT_EQ(2u, subspan.size());
-    static_assert(2u == decltype(subspan)::extent, "");
-    EXPECT_EQ(2, subspan[0]);
-    EXPECT_EQ(3, subspan[1]);
-  }
-
-  {
-    auto subspan = span.last<3>();
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(3u, subspan.size());
-    static_assert(3u == decltype(subspan)::extent, "");
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-    EXPECT_EQ(3, subspan[2]);
-  }
-}
-
-TEST(SpanTest, TemplatedSubspanFromDynamicSpan) {
-  int array[] = {1, 2, 3};
-  span<int, 3> span(array);
-
-  {
-    auto subspan = span.subspan<0>();
-    EXPECT_EQ(span.data(), subspan.data());
-    static_assert(3u == decltype(subspan)::extent, "");
-    EXPECT_EQ(3u, subspan.size());
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-    EXPECT_EQ(3, subspan[2]);
-  }
-
-  {
-    auto subspan = span.subspan<1>();
-    EXPECT_EQ(span.data() + 1, subspan.data());
-    EXPECT_EQ(2u, subspan.size());
-    static_assert(2u == decltype(subspan)::extent, "");
-    EXPECT_EQ(2, subspan[0]);
-    EXPECT_EQ(3, subspan[1]);
-  }
-
-  {
-    auto subspan = span.subspan<2>();
-    EXPECT_EQ(span.data() + 2, subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    static_assert(1u == decltype(subspan)::extent, "");
-    EXPECT_EQ(3, subspan[0]);
-  }
-
-  {
-    auto subspan = span.subspan<3>();
-    EXPECT_EQ(span.data() + 3, subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    auto subspan = span.subspan<0, 0>();
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    auto subspan = span.subspan<1, 0>();
-    EXPECT_EQ(span.data() + 1, subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    auto subspan = span.subspan<2, 0>();
-    EXPECT_EQ(span.data() + 2, subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-    static_assert(0u == decltype(subspan)::extent, "");
-  }
-
-  {
-    auto subspan = span.subspan<0, 1>();
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    static_assert(1u == decltype(subspan)::extent, "");
-    EXPECT_EQ(1, subspan[0]);
-  }
-
-  {
-    auto subspan = span.subspan<1, 1>();
-    EXPECT_EQ(span.data() + 1, subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    static_assert(1u == decltype(subspan)::extent, "");
-    EXPECT_EQ(2, subspan[0]);
-  }
-
-  {
-    auto subspan = span.subspan<2, 1>();
-    EXPECT_EQ(span.data() + 2, subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    static_assert(1u == decltype(subspan)::extent, "");
-    EXPECT_EQ(3, subspan[0]);
-  }
-
-  {
-    auto subspan = span.subspan<0, 2>();
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(2u, subspan.size());
-    static_assert(2u == decltype(subspan)::extent, "");
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-  }
-
-  {
-    auto subspan = span.subspan<1, 2>();
-    EXPECT_EQ(span.data() + 1, subspan.data());
-    EXPECT_EQ(2u, subspan.size());
-    static_assert(2u == decltype(subspan)::extent, "");
-    EXPECT_EQ(2, subspan[0]);
-    EXPECT_EQ(3, subspan[1]);
-  }
-
-  {
-    auto subspan = span.subspan<0, 3>();
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(3u, subspan.size());
-    static_assert(3u == decltype(subspan)::extent, "");
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-    EXPECT_EQ(3, subspan[2]);
-  }
-}
-
-TEST(SpanTest, First) {
-  int array[] = {1, 2, 3};
-  span<int> span(array);
-
-  {
-    auto subspan = span.first(0);
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-  }
-
-  {
-    auto subspan = span.first(1);
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    EXPECT_EQ(1, subspan[0]);
-  }
-
-  {
-    auto subspan = span.first(2);
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(2u, subspan.size());
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-  }
-
-  {
-    auto subspan = span.first(3);
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(3u, subspan.size());
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-    EXPECT_EQ(3, subspan[2]);
-  }
-}
-
-TEST(SpanTest, Last) {
-  int array[] = {1, 2, 3};
-  span<int> span(array);
-
-  {
-    auto subspan = span.last(0);
-    EXPECT_EQ(span.data() + 3, subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-  }
-
-  {
-    auto subspan = span.last(1);
-    EXPECT_EQ(span.data() + 2, subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    EXPECT_EQ(3, subspan[0]);
-  }
-
-  {
-    auto subspan = span.last(2);
-    EXPECT_EQ(span.data() + 1, subspan.data());
-    EXPECT_EQ(2u, subspan.size());
-    EXPECT_EQ(2, subspan[0]);
-    EXPECT_EQ(3, subspan[1]);
-  }
-
-  {
-    auto subspan = span.last(3);
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(3u, subspan.size());
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-    EXPECT_EQ(3, subspan[2]);
-  }
-}
-
-TEST(SpanTest, Subspan) {
-  int array[] = {1, 2, 3};
-  span<int> span(array);
-
-  {
-    auto subspan = span.subspan(0);
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(3u, subspan.size());
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-    EXPECT_EQ(3, subspan[2]);
-  }
-
-  {
-    auto subspan = span.subspan(1);
-    EXPECT_EQ(span.data() + 1, subspan.data());
-    EXPECT_EQ(2u, subspan.size());
-    EXPECT_EQ(2, subspan[0]);
-    EXPECT_EQ(3, subspan[1]);
-  }
-
-  {
-    auto subspan = span.subspan(2);
-    EXPECT_EQ(span.data() + 2, subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    EXPECT_EQ(3, subspan[0]);
-  }
-
-  {
-    auto subspan = span.subspan(3);
-    EXPECT_EQ(span.data() + 3, subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-  }
-
-  {
-    auto subspan = span.subspan(0, 0);
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-  }
-
-  {
-    auto subspan = span.subspan(1, 0);
-    EXPECT_EQ(span.data() + 1, subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-  }
-
-  {
-    auto subspan = span.subspan(2, 0);
-    EXPECT_EQ(span.data() + 2, subspan.data());
-    EXPECT_EQ(0u, subspan.size());
-  }
-
-  {
-    auto subspan = span.subspan(0, 1);
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    EXPECT_EQ(1, subspan[0]);
-  }
-
-  {
-    auto subspan = span.subspan(1, 1);
-    EXPECT_EQ(span.data() + 1, subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    EXPECT_EQ(2, subspan[0]);
-  }
-
-  {
-    auto subspan = span.subspan(2, 1);
-    EXPECT_EQ(span.data() + 2, subspan.data());
-    EXPECT_EQ(1u, subspan.size());
-    EXPECT_EQ(3, subspan[0]);
-  }
-
-  {
-    auto subspan = span.subspan(0, 2);
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(2u, subspan.size());
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-  }
-
-  {
-    auto subspan = span.subspan(1, 2);
-    EXPECT_EQ(span.data() + 1, subspan.data());
-    EXPECT_EQ(2u, subspan.size());
-    EXPECT_EQ(2, subspan[0]);
-    EXPECT_EQ(3, subspan[1]);
-  }
-
-  {
-    auto subspan = span.subspan(0, 3);
-    EXPECT_EQ(span.data(), subspan.data());
-    EXPECT_EQ(span.size(), subspan.size());
-    EXPECT_EQ(1, subspan[0]);
-    EXPECT_EQ(2, subspan[1]);
-    EXPECT_EQ(3, subspan[2]);
-  }
-}
-
-TEST(SpanTest, Size) {
-  {
-    span<int> span;
-    EXPECT_EQ(0u, span.size());
-  }
-
-  {
-    int array[] = {1, 2, 3};
-    span<int> span(array);
-    EXPECT_EQ(3u, span.size());
-  }
-}
-
-TEST(SpanTest, SizeBytes) {
-  {
-    span<int> span;
-    EXPECT_EQ(0u, span.size_bytes());
-  }
-
-  {
-    int array[] = {1, 2, 3};
-    span<int> span(array);
-    EXPECT_EQ(3u * sizeof(int), span.size_bytes());
-  }
-}
-
-TEST(SpanTest, Empty) {
-  {
-    span<int> span;
-    EXPECT_TRUE(span.empty());
-  }
-
-  {
-    int array[] = {1, 2, 3};
-    span<int> span(array);
-    EXPECT_FALSE(span.empty());
-  }
-}
-
-TEST(SpanTest, OperatorAt) {
-  static constexpr int kArray[] = {1, 6, 1, 8, 0};
-  constexpr span<const int> span(kArray);
-
-  static_assert(kArray[0] == span[0], "span[0] does not equal kArray[0]");
-  static_assert(kArray[1] == span[1], "span[1] does not equal kArray[1]");
-  static_assert(kArray[2] == span[2], "span[2] does not equal kArray[2]");
-  static_assert(kArray[3] == span[3], "span[3] does not equal kArray[3]");
-  static_assert(kArray[4] == span[4], "span[4] does not equal kArray[4]");
-
-  static_assert(kArray[0] == span(0), "span(0) does not equal kArray[0]");
-  static_assert(kArray[1] == span(1), "span(1) does not equal kArray[1]");
-  static_assert(kArray[2] == span(2), "span(2) does not equal kArray[2]");
-  static_assert(kArray[3] == span(3), "span(3) does not equal kArray[3]");
-  static_assert(kArray[4] == span(4), "span(4) does not equal kArray[4]");
-}
-
-TEST(SpanTest, Iterator) {
-  static constexpr int kArray[] = {1, 6, 1, 8, 0};
-  constexpr span<const int> span(kArray);
-
-  std::vector<int> results;
-  for (int i : span)
-    results.emplace_back(i);
-  EXPECT_THAT(results, ElementsAre(1, 6, 1, 8, 0));
-}
-
-TEST(SpanTest, ReverseIterator) {
-  static constexpr int kArray[] = {1, 6, 1, 8, 0};
-  constexpr span<const int> span(kArray);
-
-  EXPECT_TRUE(std::equal(std::rbegin(kArray), std::rend(kArray), span.rbegin(),
-                         span.rend()));
-  EXPECT_TRUE(std::equal(std::crbegin(kArray), std::crend(kArray),
-                         span.crbegin(), span.crend()));
-}
-
-TEST(SpanTest, Equality) {
-  static constexpr int kArray1[] = {3, 1, 4, 1, 5};
-  static constexpr int kArray2[] = {3, 1, 4, 1, 5};
-  constexpr span<const int> span1(kArray1);
-  constexpr span<const int, 5> span2(kArray2);
-
-  EXPECT_EQ(span1, span2);
-
-  static constexpr int kArray3[] = {2, 7, 1, 8, 3};
-  constexpr span<const int> span3(kArray3);
-
-  EXPECT_FALSE(span1 == span3);
-
-  static double kArray4[] = {2.0, 7.0, 1.0, 8.0, 3.0};
-  span<double, 5> span4(kArray4);
-
-  EXPECT_EQ(span3, span4);
-}
-
-TEST(SpanTest, Inequality) {
-  static constexpr int kArray1[] = {2, 3, 5, 7, 11};
-  static constexpr int kArray2[] = {1, 4, 6, 8, 9};
-  constexpr span<const int> span1(kArray1);
-  constexpr span<const int, 5> span2(kArray2);
-
-  EXPECT_NE(span1, span2);
-
-  static constexpr int kArray3[] = {2, 3, 5, 7, 11};
-  constexpr span<const int> span3(kArray3);
-
-  EXPECT_FALSE(span1 != span3);
-
-  static double kArray4[] = {1.0, 4.0, 6.0, 8.0, 9.0};
-  span<double, 5> span4(kArray4);
-
-  EXPECT_NE(span3, span4);
-}
-
-TEST(SpanTest, LessThan) {
-  static constexpr int kArray1[] = {2, 3, 5, 7, 11};
-  static constexpr int kArray2[] = {2, 3, 5, 7, 11, 13};
-  constexpr span<const int> span1(kArray1);
-  constexpr span<const int, 6> span2(kArray2);
-
-  EXPECT_LT(span1, span2);
-
-  static constexpr int kArray3[] = {2, 3, 5, 7, 11};
-  constexpr span<const int> span3(kArray3);
-
-  EXPECT_FALSE(span1 < span3);
-
-  static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0, 13.0};
-  span<double, 6> span4(kArray4);
-
-  EXPECT_LT(span3, span4);
-}
-
-TEST(SpanTest, LessEqual) {
-  static constexpr int kArray1[] = {2, 3, 5, 7, 11};
-  static constexpr int kArray2[] = {2, 3, 5, 7, 11, 13};
-  constexpr span<const int> span1(kArray1);
-  constexpr span<const int, 6> span2(kArray2);
-
-  EXPECT_LE(span1, span1);
-  EXPECT_LE(span1, span2);
-
-  static constexpr int kArray3[] = {2, 3, 5, 7, 10};
-  constexpr span<const int> span3(kArray3);
-
-  EXPECT_FALSE(span1 <= span3);
-
-  static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0, 13.0};
-  span<double, 6> span4(kArray4);
-
-  EXPECT_LE(span3, span4);
-}
-
-TEST(SpanTest, GreaterThan) {
-  static constexpr int kArray1[] = {2, 3, 5, 7, 11, 13};
-  static constexpr int kArray2[] = {2, 3, 5, 7, 11};
-  constexpr span<const int> span1(kArray1);
-  constexpr span<const int, 5> span2(kArray2);
-
-  EXPECT_GT(span1, span2);
-
-  static constexpr int kArray3[] = {2, 3, 5, 7, 11, 13};
-  constexpr span<const int> span3(kArray3);
-
-  EXPECT_FALSE(span1 > span3);
-
-  static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0};
-  span<double, 5> span4(kArray4);
-
-  EXPECT_GT(span3, span4);
-}
-
-TEST(SpanTest, GreaterEqual) {
-  static constexpr int kArray1[] = {2, 3, 5, 7, 11, 13};
-  static constexpr int kArray2[] = {2, 3, 5, 7, 11};
-  constexpr span<const int> span1(kArray1);
-  constexpr span<const int, 5> span2(kArray2);
-
-  EXPECT_GE(span1, span1);
-  EXPECT_GE(span1, span2);
-
-  static constexpr int kArray3[] = {2, 3, 5, 7, 12};
-  constexpr span<const int> span3(kArray3);
-
-  EXPECT_FALSE(span1 >= span3);
-
-  static double kArray4[] = {2.0, 3.0, 5.0, 7.0, 11.0};
-  span<double, 5> span4(kArray4);
-
-  EXPECT_GE(span3, span4);
-}
-
-TEST(SpanTest, AsBytes) {
-  {
-    constexpr int kArray[] = {2, 3, 5, 7, 11, 13};
-    span<const uint8_t, sizeof(kArray)> bytes_span =
-        as_bytes(make_span(kArray));
-    EXPECT_EQ(reinterpret_cast<const uint8_t*>(kArray), bytes_span.data());
-    EXPECT_EQ(sizeof(kArray), bytes_span.size());
-    EXPECT_EQ(bytes_span.size(), bytes_span.size_bytes());
-  }
-
-  {
-    std::vector<int> vec = {1, 1, 2, 3, 5, 8};
-    span<int> mutable_span(vec);
-    span<const uint8_t> bytes_span = as_bytes(mutable_span);
-    EXPECT_EQ(reinterpret_cast<const uint8_t*>(vec.data()), bytes_span.data());
-    EXPECT_EQ(sizeof(int) * vec.size(), bytes_span.size());
-    EXPECT_EQ(bytes_span.size(), bytes_span.size_bytes());
-  }
-}
-
-TEST(SpanTest, AsWritableBytes) {
-  std::vector<int> vec = {1, 1, 2, 3, 5, 8};
-  span<int> mutable_span(vec);
-  span<uint8_t> writable_bytes_span = as_writable_bytes(mutable_span);
-  EXPECT_EQ(reinterpret_cast<uint8_t*>(vec.data()), writable_bytes_span.data());
-  EXPECT_EQ(sizeof(int) * vec.size(), writable_bytes_span.size());
-  EXPECT_EQ(writable_bytes_span.size(), writable_bytes_span.size_bytes());
-
-  // Set the first entry of vec to zero while writing through the span.
-  std::fill(writable_bytes_span.data(),
-            writable_bytes_span.data() + sizeof(int), 0);
-  EXPECT_EQ(0, vec[0]);
-}
-
-TEST(SpanTest, MakeSpanFromDataAndSize) {
-  int* nullint = nullptr;
-  auto empty_span = make_span(nullint, 0);
-  EXPECT_TRUE(empty_span.empty());
-  EXPECT_EQ(nullptr, empty_span.data());
-
-  std::vector<int> vector = {1, 1, 2, 3, 5, 8};
-  span<int> span(vector.data(), vector.size());
-  auto made_span = make_span(vector.data(), vector.size());
-  EXPECT_EQ(span, made_span);
-  static_assert(decltype(made_span)::extent == dynamic_extent, "");
-}
-
-TEST(SpanTest, MakeSpanFromPointerPair) {
-  int* nullint = nullptr;
-  auto empty_span = make_span(nullint, nullint);
-  EXPECT_TRUE(empty_span.empty());
-  EXPECT_EQ(nullptr, empty_span.data());
-
-  std::vector<int> vector = {1, 1, 2, 3, 5, 8};
-  span<int> span(vector.data(), vector.size());
-  auto made_span = make_span(vector.data(), vector.data() + vector.size());
-  EXPECT_EQ(span, made_span);
-  static_assert(decltype(made_span)::extent == dynamic_extent, "");
-}
-
-TEST(SpanTest, MakeSpanFromConstexprArray) {
-  static constexpr int kArray[] = {1, 2, 3, 4, 5};
-  constexpr span<const int> span(kArray);
-  EXPECT_EQ(span, make_span(kArray));
-  static_assert(decltype(make_span(kArray))::extent == 5, "");
-}
-
-TEST(SpanTest, MakeSpanFromStdArray) {
-  const std::array<int, 5> kArray = {{1, 2, 3, 4, 5}};
-  span<const int> span(kArray);
-  EXPECT_EQ(span, make_span(kArray));
-  static_assert(decltype(make_span(kArray))::extent == 5, "");
-}
-
-TEST(SpanTest, MakeSpanFromConstContainer) {
-  const std::vector<int> vector = {-1, -2, -3, -4, -5};
-  span<const int> span(vector);
-  EXPECT_EQ(span, make_span(vector));
-  static_assert(decltype(make_span(vector))::extent == dynamic_extent, "");
-}
-
-TEST(SpanTest, MakeSpanFromContainer) {
-  std::vector<int> vector = {-1, -2, -3, -4, -5};
-  span<int> span(vector);
-  EXPECT_EQ(span, make_span(vector));
-  static_assert(decltype(make_span(vector))::extent == dynamic_extent, "");
-}
-
-TEST(SpanTest, MakeSpanFromDynamicSpan) {
-  static constexpr int kArray[] = {1, 2, 3, 4, 5};
-  constexpr span<const int> span(kArray);
-  static_assert(std::is_same<decltype(span)::element_type,
-                             decltype(make_span(span))::element_type>::value,
-                "make_span(span) should have the same element_type as span");
-
-  static_assert(span.data() == make_span(span).data(),
-                "make_span(span) should have the same data() as span");
-
-  static_assert(span.size() == make_span(span).size(),
-                "make_span(span) should have the same size() as span");
-
-  static_assert(decltype(make_span(span))::extent == decltype(span)::extent,
-                "make_span(span) should have the same extent as span");
-}
-
-TEST(SpanTest, MakeSpanFromStaticSpan) {
-  static constexpr int kArray[] = {1, 2, 3, 4, 5};
-  constexpr span<const int, 5> span(kArray);
-  static_assert(std::is_same<decltype(span)::element_type,
-                             decltype(make_span(span))::element_type>::value,
-                "make_span(span) should have the same element_type as span");
-
-  static_assert(span.data() == make_span(span).data(),
-                "make_span(span) should have the same data() as span");
-
-  static_assert(span.size() == make_span(span).size(),
-                "make_span(span) should have the same size() as span");
-
-  static_assert(decltype(make_span(span))::extent == decltype(span)::extent,
-                "make_span(span) should have the same extent as span");
-}
-
-TEST(SpanTest, EnsureConstexprGoodness) {
-  static constexpr int kArray[] = {5, 4, 3, 2, 1};
-  constexpr span<const int> constexpr_span(kArray);
-  const size_t size = 2;
-
-  const size_t start = 1;
-  constexpr span<const int> subspan =
-      constexpr_span.subspan(start, start + size);
-  for (size_t i = 0; i < subspan.size(); ++i)
-    EXPECT_EQ(kArray[start + i], subspan[i]);
-
-  constexpr span<const int> firsts = constexpr_span.first(size);
-  for (size_t i = 0; i < firsts.size(); ++i)
-    EXPECT_EQ(kArray[i], firsts[i]);
-
-  constexpr span<const int> lasts = constexpr_span.last(size);
-  for (size_t i = 0; i < lasts.size(); ++i) {
-    const size_t j = (arraysize(kArray) - size) + i;
-    EXPECT_EQ(kArray[j], lasts[i]);
-  }
-
-  constexpr int item = constexpr_span[size];
-  EXPECT_EQ(kArray[size], item);
-}
-
-}  // namespace base
diff --git a/base/containers/span_unittest.nc b/base/containers/span_unittest.nc
deleted file mode 100644
index 0d2af89..0000000
--- a/base/containers/span_unittest.nc
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a "No Compile Test" suite.
-// http://dev.chromium.org/developers/testing/no-compile-tests
-
-#include "base/containers/span.h"
-
-#include <array>
-#include <set>
-#include <vector>
-
-namespace base {
-
-class Base {
-};
-
-class Derived : Base {
-};
-
-#if defined(NCTEST_DEFAULT_SPAN_WITH_NON_ZERO_STATIC_EXTENT_DISALLOWED)  // [r"fatal error: static_assert failed \"Invalid Extent\""]
-
-// A default constructed span must have an extent of 0 or dynamic_extent.
-void WontCompile() {
-  span<int, 1> span;
-}
-
-#elif defined(NCTEST_SPAN_FROM_ARRAY_WITH_NON_MATCHING_STATIC_EXTENT_DISALLOWED) // [r"fatal error: no matching constructor for initialization of 'span<int, 1>'"]
-
-// A span with static extent constructed from an array must match the size of
-// the array.
-void WontCompile() {
-  int array[] = {1, 2, 3};
-  span<int, 1> span(array);
-}
-
-#elif defined(NCTEST_SPAN_FROM_STD_ARRAY_WITH_NON_MATCHING_STATIC_EXTENT_DISALLOWED) // [r"fatal error: no matching constructor for initialization of 'span<int, 2>'"]
-
-// A span with static extent constructed from std::array must match the size of
-// the array.
-void WontCompile() {
-  std::array<int, 3> array = {1, 2, 3};
-  span<int, 2> span(array);
-}
-
-#elif defined(NCTEST_SPAN_FROM_CONST_STD_ARRAY_WITH_NON_MATCHING_STATIC_EXTENT_DISALLOWED) // [r"fatal error: no matching constructor for initialization of 'span<const int, 2>'"]
-
-// A span with static extent constructed from std::array must match the size of
-// the array.
-void WontCompile() {
-  const std::array<int, 3> array = {1, 2, 3};
-  span<const int, 2> span(array);
-}
-
-#elif defined(NCTEST_SPAN_FROM_OTHER_SPAN_WITH_MISMATCHING_EXTENT_DISALLOWED) // [r"fatal error: no matching constructor for initialization of 'span<int, 4>'"]
-
-// A span with static extent constructed from another span must match the
-// extent.
-void WontCompile() {
-  std::array<int, 3> array = {1, 2, 3};
-  span<int, 3> span3(array);
-  span<int, 4> span4(span3);
-}
-
-#elif defined(NCTEST_DYNAMIC_SPAN_TO_STATIC_SPAN_DISALLOWED)  // [r"fatal error: no matching constructor for initialization of 'span<int, 3>'"]
-
-// Converting a dynamic span to a static span should not be allowed.
-void WontCompile() {
-  span<int> dynamic_span;
-  span<int, 3> static_span(dynamic_span);
-}
-
-#elif defined(NCTEST_DERIVED_TO_BASE_CONVERSION_DISALLOWED)  // [r"fatal error: no matching constructor for initialization of 'span<base::Base \*>'"]
-
-// Internally, this is represented as a pointer to pointers to Derived. An
-// implicit conversion to a pointer to pointers to Base must not be allowed.
-// If it were allowed, then something like this would be possible.
-//   Cat** cats = GetCats();
-//   Animals** animals = cats;
-//   animals[0] = new Dog();  // Uhoh!
-void WontCompile() {
-  span<Derived*> derived_span;
-  span<Base*> base_span(derived_span);
-}
-
-#elif defined(NCTEST_PTR_TO_CONSTPTR_CONVERSION_DISALLOWED)  // [r"fatal error: no matching constructor for initialization of 'span<const int \*>'"]
-
-// Similarly, converting a span<int*> to span<const int*> requires internally
-// converting T** to const T**. This is also disallowed, as it would allow code
-// to violate the contract of const.
-void WontCompile() {
-  span<int*> non_const_span;
-  span<const int*> const_span(non_const_span);
-}
-
-#elif defined(NCTEST_CONST_CONTAINER_TO_MUTABLE_CONVERSION_DISALLOWED)  // [r"fatal error: no matching constructor for initialization of 'span<int>'"]
-
-// A const container should not be convertible to a mutable span.
-void WontCompile() {
-  const std::vector<int> v = {1, 2, 3};
-  span<int> span(v);
-}
-
-#elif defined(NCTEST_STD_SET_CONVERSION_DISALLOWED)  // [r"fatal error: no matching constructor for initialization of 'span<int>'"]
-
-// A std::set() should not satisfy the requirements for conversion to a span.
-void WontCompile() {
-  std::set<int> set;
-  span<int> span(set);
-}
-
-#elif defined(NCTEST_STATIC_FRONT_WITH_EXCEEDING_COUNT_DISALLOWED)  // [r"fatal error: static_assert failed \"Count must not exceed Extent\""]
-
-// Static first called on a span with static extent must not exceed the size.
-void WontCompile() {
-  std::array<int, 3> array = {1, 2, 3};
-  span<int, 3> span(array);
-  auto first = span.first<4>();
-}
-
-#elif defined(NCTEST_STATIC_LAST_WITH_EXCEEDING_COUNT_DISALLOWED)  // [r"fatal error: static_assert failed \"Count must not exceed Extent\""]
-
-// Static last called on a span with static extent must not exceed the size.
-void WontCompile() {
-  std::array<int, 3> array = {1, 2, 3};
-  span<int, 3> span(array);
-  auto last = span.last<4>();
-}
-
-#elif defined(NCTEST_STATIC_SUBSPAN_WITH_EXCEEDING_OFFSET_DISALLOWED)  // [r"fatal error: static_assert failed \"Offset must not exceed Extent\""]
-
-// Static subspan called on a span with static extent must not exceed the size.
-void WontCompile() {
-  std::array<int, 3> array = {1, 2, 3};
-  span<int, 3> span(array);
-  auto subspan = span.subspan<4>();
-}
-
-#elif defined(NCTEST_STATIC_SUBSPAN_WITH_EXCEEDING_COUNT_DISALLOWED)  // [r"fatal error: static_assert failed \"Count must not exceed Extent - Offset\""]
-
-// Static subspan called on a span with static extent must not exceed the size.
-void WontCompile() {
-  std::array<int, 3> array = {1, 2, 3};
-  span<int, 3> span(array);
-  auto subspan = span.subspan<0, 4>();
-}
-
-#elif defined(NCTEST_AS_WRITABLE_BYTES_WITH_CONST_CONTAINER_DISALLOWED)  // [r"fatal error: no matching function for call to 'as_writable_bytes'"]
-
-// as_writable_bytes should not be possible for a const container.
-void WontCompile() {
-  const std::vector<int> v = {1, 2, 3};
-  span<uint8_t> bytes = as_writable_bytes(make_span(v));
-}
-
-#elif defined(NCTEST_MAKE_SPAN_FROM_SET_CONVERSION_DISALLOWED)  // [r"fatal error: no matching function for call to 'make_span'"]
-
-// A std::set() should not satisfy the requirements for conversion to a span.
-void WontCompile() {
-  std::set<int> set;
-  auto span = make_span(set);
-}
-
-#endif
-
-}  // namespace base
diff --git a/base/containers/stack_container_unittest.cc b/base/containers/stack_container_unittest.cc
deleted file mode 100644
index 8c039ad..0000000
--- a/base/containers/stack_container_unittest.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/stack_container.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-
-#include "base/memory/ref_counted.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class Dummy : public base::RefCounted<Dummy> {
- public:
-  explicit Dummy(int* alive) : alive_(alive) {
-    ++*alive_;
-  }
-
- private:
-  friend class base::RefCounted<Dummy>;
-
-  ~Dummy() {
-    --*alive_;
-  }
-
-  int* const alive_;
-};
-
-}  // namespace
-
-TEST(StackContainer, Vector) {
-  const int stack_size = 3;
-  StackVector<int, stack_size> vect;
-  const int* stack_buffer = &vect.stack_data().stack_buffer()[0];
-
-  // The initial |stack_size| elements should appear in the stack buffer.
-  EXPECT_EQ(static_cast<size_t>(stack_size), vect.container().capacity());
-  for (int i = 0; i < stack_size; i++) {
-    vect.container().push_back(i);
-    EXPECT_EQ(stack_buffer, &vect.container()[0]);
-    EXPECT_TRUE(vect.stack_data().used_stack_buffer_);
-  }
-
-  // Adding more elements should push the array onto the heap.
-  for (int i = 0; i < stack_size; i++) {
-    vect.container().push_back(i + stack_size);
-    EXPECT_NE(stack_buffer, &vect.container()[0]);
-    EXPECT_FALSE(vect.stack_data().used_stack_buffer_);
-  }
-
-  // The array should still be in order.
-  for (int i = 0; i < stack_size * 2; i++)
-    EXPECT_EQ(i, vect.container()[i]);
-
-  // Resize to smaller. Our STL implementation won't reallocate in this case,
-  // otherwise it might use our stack buffer. We reserve right after the resize
-  // to guarantee it isn't using the stack buffer, even though it doesn't have
-  // much data.
-  vect.container().resize(stack_size);
-  vect.container().reserve(stack_size * 2);
-  EXPECT_FALSE(vect.stack_data().used_stack_buffer_);
-
-  // Copying the small vector to another should use the same allocator and use
-  // the now-unused stack buffer. GENERALLY CALLERS SHOULD NOT DO THIS since
-  // they have to get the template types just right and it can cause errors.
-  std::vector<int, StackAllocator<int, stack_size> > other(vect.container());
-  EXPECT_EQ(stack_buffer, &other.front());
-  EXPECT_TRUE(vect.stack_data().used_stack_buffer_);
-  for (int i = 0; i < stack_size; i++)
-    EXPECT_EQ(i, other[i]);
-}
-
-TEST(StackContainer, VectorDoubleDelete) {
-  // Regression testing for double-delete.
-  typedef StackVector<scoped_refptr<Dummy>, 2> Vector;
-  typedef Vector::ContainerType Container;
-  Vector vect;
-
-  int alive = 0;
-  scoped_refptr<Dummy> dummy(new Dummy(&alive));
-  EXPECT_EQ(alive, 1);
-
-  vect->push_back(dummy);
-  EXPECT_EQ(alive, 1);
-
-  Dummy* dummy_unref = dummy.get();
-  dummy = nullptr;
-  EXPECT_EQ(alive, 1);
-
-  Container::iterator itr = std::find(vect->begin(), vect->end(), dummy_unref);
-  EXPECT_EQ(itr->get(), dummy_unref);
-  vect->erase(itr);
-  EXPECT_EQ(alive, 0);
-
-  // Shouldn't crash at exit.
-}
-
-namespace {
-
-template <size_t alignment>
-class AlignedData {
- public:
-  AlignedData() { memset(data_, 0, alignment); }
-  ~AlignedData() = default;
-  alignas(alignment) char data_[alignment];
-};
-
-}  // anonymous namespace
-
-#define EXPECT_ALIGNED(ptr, align) \
-    EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(ptr) & (align - 1))
-
-TEST(StackContainer, BufferAlignment) {
-  StackVector<wchar_t, 16> text;
-  text->push_back(L'A');
-  EXPECT_ALIGNED(&text[0], alignof(wchar_t));
-
-  StackVector<double, 1> doubles;
-  doubles->push_back(0.0);
-  EXPECT_ALIGNED(&doubles[0], alignof(double));
-
-  StackVector<AlignedData<16>, 1> aligned16;
-  aligned16->push_back(AlignedData<16>());
-  EXPECT_ALIGNED(&aligned16[0], 16);
-
-#if !defined(__GNUC__) || defined(ARCH_CPU_X86_FAMILY)
-  // It seems that non-X86 gcc doesn't respect greater than 16 byte alignment.
-  // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33721 for details.
-  // TODO(sbc):re-enable this if GCC starts respecting higher alignments.
-  StackVector<AlignedData<256>, 1> aligned256;
-  aligned256->push_back(AlignedData<256>());
-  EXPECT_ALIGNED(&aligned256[0], 256);
-#endif
-}
-
-template class StackVector<int, 2>;
-template class StackVector<scoped_refptr<Dummy>, 2>;
-
-}  // namespace base
diff --git a/base/containers/unique_ptr_adapters_unittest.cc b/base/containers/unique_ptr_adapters_unittest.cc
deleted file mode 100644
index 5b8f1fc..0000000
--- a/base/containers/unique_ptr_adapters_unittest.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/unique_ptr_adapters.h"
-
-#include <memory>
-#include <vector>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-class Foo {
- public:
-  Foo() { instance_count++; }
-  ~Foo() { instance_count--; }
-  static int instance_count;
-};
-
-int Foo::instance_count = 0;
-
-TEST(UniquePtrComparatorTest, Basic) {
-  std::set<std::unique_ptr<Foo>, UniquePtrComparator> set;
-  Foo* foo1 = new Foo();
-  Foo* foo2 = new Foo();
-  Foo* foo3 = new Foo();
-  EXPECT_EQ(3, Foo::instance_count);
-
-  set.emplace(foo1);
-  set.emplace(foo2);
-
-  auto it1 = set.find(foo1);
-  EXPECT_TRUE(it1 != set.end());
-  EXPECT_EQ(foo1, it1->get());
-
-  {
-    auto it2 = set.find(foo2);
-    EXPECT_TRUE(it2 != set.end());
-    EXPECT_EQ(foo2, it2->get());
-  }
-
-  EXPECT_TRUE(set.find(foo3) == set.end());
-
-  set.erase(it1);
-  EXPECT_EQ(2, Foo::instance_count);
-
-  EXPECT_TRUE(set.find(foo1) == set.end());
-
-  {
-    auto it2 = set.find(foo2);
-    EXPECT_TRUE(it2 != set.end());
-    EXPECT_EQ(foo2, it2->get());
-  }
-
-  set.clear();
-  EXPECT_EQ(1, Foo::instance_count);
-
-  EXPECT_TRUE(set.find(foo1) == set.end());
-  EXPECT_TRUE(set.find(foo2) == set.end());
-  EXPECT_TRUE(set.find(foo3) == set.end());
-
-  delete foo3;
-  EXPECT_EQ(0, Foo::instance_count);
-}
-
-TEST(UniquePtrMatcherTest, Basic) {
-  std::vector<std::unique_ptr<Foo>> v;
-  auto foo_ptr1 = std::make_unique<Foo>();
-  Foo* foo1 = foo_ptr1.get();
-  v.push_back(std::move(foo_ptr1));
-  auto foo_ptr2 = std::make_unique<Foo>();
-  Foo* foo2 = foo_ptr2.get();
-  v.push_back(std::move(foo_ptr2));
-
-  {
-    auto iter = std::find_if(v.begin(), v.end(), UniquePtrMatcher<Foo>(foo1));
-    ASSERT_TRUE(iter != v.end());
-    EXPECT_EQ(foo1, iter->get());
-  }
-
-  {
-    auto iter = std::find_if(v.begin(), v.end(), UniquePtrMatcher<Foo>(foo2));
-    ASSERT_TRUE(iter != v.end());
-    EXPECT_EQ(foo2, iter->get());
-  }
-
-  {
-    auto iter = std::find_if(v.begin(), v.end(), MatchesUniquePtr(foo2));
-    ASSERT_TRUE(iter != v.end());
-    EXPECT_EQ(foo2, iter->get());
-  }
-}
-
-class TestDeleter {
- public:
-  void operator()(Foo* foo) { delete foo; }
-};
-
-TEST(UniquePtrMatcherTest, Deleter) {
-  using UniqueFoo = std::unique_ptr<Foo, TestDeleter>;
-  std::vector<UniqueFoo> v;
-  UniqueFoo foo_ptr1(new Foo);
-  Foo* foo1 = foo_ptr1.get();
-  v.push_back(std::move(foo_ptr1));
-  UniqueFoo foo_ptr2(new Foo);
-  Foo* foo2 = foo_ptr2.get();
-  v.push_back(std::move(foo_ptr2));
-
-  {
-    auto iter = std::find_if(v.begin(), v.end(),
-                             UniquePtrMatcher<Foo, TestDeleter>(foo1));
-    ASSERT_TRUE(iter != v.end());
-    EXPECT_EQ(foo1, iter->get());
-  }
-
-  {
-    auto iter = std::find_if(v.begin(), v.end(),
-                             UniquePtrMatcher<Foo, TestDeleter>(foo2));
-    ASSERT_TRUE(iter != v.end());
-    EXPECT_EQ(foo2, iter->get());
-  }
-
-  {
-    auto iter = std::find_if(v.begin(), v.end(),
-                             MatchesUniquePtr<Foo, TestDeleter>(foo2));
-    ASSERT_TRUE(iter != v.end());
-    EXPECT_EQ(foo2, iter->get());
-  }
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/containers/vector_buffer_unittest.cc b/base/containers/vector_buffer_unittest.cc
deleted file mode 100644
index 6d49505..0000000
--- a/base/containers/vector_buffer_unittest.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/containers/vector_buffer.h"
-
-#include "base/test/copy_only_int.h"
-#include "base/test/move_only_int.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-TEST(VectorBuffer, DeletePOD) {
-  constexpr int size = 10;
-  VectorBuffer<int> buffer(size);
-  for (int i = 0; i < size; i++)
-    buffer.begin()[i] = i + 1;
-
-  buffer.DestructRange(buffer.begin(), buffer.end());
-
-  // Delete should do nothing.
-  for (int i = 0; i < size; i++)
-    EXPECT_EQ(i + 1, buffer.begin()[i]);
-}
-
-TEST(VectorBuffer, DeleteMoveOnly) {
-  constexpr int size = 10;
-  VectorBuffer<MoveOnlyInt> buffer(size);
-  for (int i = 0; i < size; i++)
-    new (buffer.begin() + i) MoveOnlyInt(i + 1);
-
-  buffer.DestructRange(buffer.begin(), buffer.end());
-
-  // Delete should have reset all of the values to 0.
-  for (int i = 0; i < size; i++)
-    EXPECT_EQ(0, buffer.begin()[i].data());
-}
-
-TEST(VectorBuffer, PODMove) {
-  constexpr int size = 10;
-  VectorBuffer<int> dest(size);
-
-  VectorBuffer<int> original(size);
-  for (int i = 0; i < size; i++)
-    original.begin()[i] = i + 1;
-
-  original.MoveRange(original.begin(), original.end(), dest.begin());
-  for (int i = 0; i < size; i++)
-    EXPECT_EQ(i + 1, dest.begin()[i]);
-}
-
-TEST(VectorBuffer, MovableMove) {
-  constexpr int size = 10;
-  VectorBuffer<MoveOnlyInt> dest(size);
-
-  VectorBuffer<MoveOnlyInt> original(size);
-  for (int i = 0; i < size; i++)
-    new (original.begin() + i) MoveOnlyInt(i + 1);
-
-  original.MoveRange(original.begin(), original.end(), dest.begin());
-
-  // Moving from a MoveOnlyInt resets to 0.
-  for (int i = 0; i < size; i++) {
-    EXPECT_EQ(0, original.begin()[i].data());
-    EXPECT_EQ(i + 1, dest.begin()[i].data());
-  }
-}
-
-TEST(VectorBuffer, CopyToMove) {
-  constexpr int size = 10;
-  VectorBuffer<CopyOnlyInt> dest(size);
-
-  VectorBuffer<CopyOnlyInt> original(size);
-  for (int i = 0; i < size; i++)
-    new (original.begin() + i) CopyOnlyInt(i + 1);
-
-  original.MoveRange(original.begin(), original.end(), dest.begin());
-
-  // The original should have been destructed, which should reset the value to
-  // 0. Technically this dereferences the destructed object.
-  for (int i = 0; i < size; i++) {
-    EXPECT_EQ(0, original.begin()[i].data());
-    EXPECT_EQ(i + 1, dest.begin()[i].data());
-  }
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/cpu_unittest.cc b/base/cpu_unittest.cc
deleted file mode 100644
index bfdb1cd..0000000
--- a/base/cpu_unittest.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/cpu.h"
-#include "base/stl_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if _MSC_VER >= 1700
-// C4752: found Intel(R) Advanced Vector Extensions; consider using /arch:AVX.
-#pragma warning(disable: 4752)
-#endif
-
-// Tests whether we can run extended instructions represented by the CPU
-// information. This test actually executes some extended instructions (such as
-// MMX, SSE, etc.) supported by the CPU and sees we can run them without
-// "undefined instruction" exceptions. That is, this test succeeds when this
-// test finishes without a crash.
-TEST(CPU, RunExtendedInstructions) {
-#if defined(ARCH_CPU_X86_FAMILY)
-  // Retrieve the CPU information.
-  base::CPU cpu;
-
-  ASSERT_TRUE(cpu.has_mmx());
-  ASSERT_TRUE(cpu.has_sse());
-  ASSERT_TRUE(cpu.has_sse2());
-
-// GCC and clang instruction test.
-#if defined(COMPILER_GCC)
-  // Execute an MMX instruction.
-  __asm__ __volatile__("emms\n" : : : "mm0");
-
-  // Execute an SSE instruction.
-  __asm__ __volatile__("xorps %%xmm0, %%xmm0\n" : : : "xmm0");
-
-  // Execute an SSE 2 instruction.
-  __asm__ __volatile__("psrldq $0, %%xmm0\n" : : : "xmm0");
-
-  if (cpu.has_sse3()) {
-    // Execute an SSE 3 instruction.
-    __asm__ __volatile__("addsubpd %%xmm0, %%xmm0\n" : : : "xmm0");
-  }
-
-  if (cpu.has_ssse3()) {
-    // Execute a Supplimental SSE 3 instruction.
-    __asm__ __volatile__("psignb %%xmm0, %%xmm0\n" : : : "xmm0");
-  }
-
-  if (cpu.has_sse41()) {
-    // Execute an SSE 4.1 instruction.
-    __asm__ __volatile__("pmuldq %%xmm0, %%xmm0\n" : : : "xmm0");
-  }
-
-  if (cpu.has_sse42()) {
-    // Execute an SSE 4.2 instruction.
-    __asm__ __volatile__("crc32 %%eax, %%eax\n" : : : "eax");
-  }
-
-  if (cpu.has_popcnt()) {
-    // Execute a POPCNT instruction.
-    __asm__ __volatile__("popcnt %%eax, %%eax\n" : : : "eax");
-  }
-
-  if (cpu.has_avx()) {
-    // Execute an AVX instruction.
-    __asm__ __volatile__("vzeroupper\n" : : : "xmm0");
-  }
-
-  if (cpu.has_avx2()) {
-    // Execute an AVX 2 instruction.
-    __asm__ __volatile__("vpunpcklbw %%ymm0, %%ymm0, %%ymm0\n" : : : "xmm0");
-  }
-
-// Visual C 32 bit and ClangCL 32/64 bit test.
-#elif defined(COMPILER_MSVC) && (defined(ARCH_CPU_32_BITS) || \
-      (defined(ARCH_CPU_64_BITS) && defined(__clang__)))
-
-  // Execute an MMX instruction.
-  __asm emms;
-
-  // Execute an SSE instruction.
-  __asm xorps xmm0, xmm0;
-
-  // Execute an SSE 2 instruction.
-  __asm psrldq xmm0, 0;
-
-  if (cpu.has_sse3()) {
-    // Execute an SSE 3 instruction.
-    __asm addsubpd xmm0, xmm0;
-  }
-
-  if (cpu.has_ssse3()) {
-    // Execute a Supplimental SSE 3 instruction.
-    __asm psignb xmm0, xmm0;
-  }
-
-  if (cpu.has_sse41()) {
-    // Execute an SSE 4.1 instruction.
-    __asm pmuldq xmm0, xmm0;
-  }
-
-  if (cpu.has_sse42()) {
-    // Execute an SSE 4.2 instruction.
-    __asm crc32 eax, eax;
-  }
-
-  if (cpu.has_popcnt()) {
-    // Execute a POPCNT instruction.
-    __asm popcnt eax, eax;
-  }
-
-// Visual C 2012 required for AVX.
-#if _MSC_VER >= 1700
-  if (cpu.has_avx()) {
-    // Execute an AVX instruction.
-    __asm vzeroupper;
-  }
-
-  if (cpu.has_avx2()) {
-    // Execute an AVX 2 instruction.
-    __asm vpunpcklbw ymm0, ymm0, ymm0
-  }
-#endif  // _MSC_VER >= 1700
-#endif  // defined(COMPILER_GCC)
-#endif  // defined(ARCH_CPU_X86_FAMILY)
-}
-
-// For https://crbug.com/249713
-TEST(CPU, BrandAndVendorContainsNoNUL) {
-  base::CPU cpu;
-  EXPECT_FALSE(base::ContainsValue(cpu.cpu_brand(), '\0'));
-  EXPECT_FALSE(base::ContainsValue(cpu.vendor_name(), '\0'));
-}
diff --git a/base/debug/activity_analyzer_unittest.cc b/base/debug/activity_analyzer_unittest.cc
deleted file mode 100644
index e08b43a..0000000
--- a/base/debug/activity_analyzer_unittest.cc
+++ /dev/null
@@ -1,546 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/debug/activity_analyzer.h"
-
-#include <atomic>
-#include <memory>
-
-#include "base/auto_reset.h"
-#include "base/bind.h"
-#include "base/debug/activity_tracker.h"
-#include "base/files/file.h"
-#include "base/files/file_util.h"
-#include "base/files/memory_mapped_file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/memory/ptr_util.h"
-#include "base/pending_task.h"
-#include "base/process/process.h"
-#include "base/stl_util.h"
-#include "base/synchronization/condition_variable.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/spin_wait.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace debug {
-
-namespace {
-
-class TestActivityTracker : public ThreadActivityTracker {
- public:
-  TestActivityTracker(std::unique_ptr<char[]> memory, size_t mem_size)
-      : ThreadActivityTracker(memset(memory.get(), 0, mem_size), mem_size),
-        mem_segment_(std::move(memory)) {}
-
-  ~TestActivityTracker() override = default;
-
- private:
-  std::unique_ptr<char[]> mem_segment_;
-};
-
-}  // namespace
-
-
-class ActivityAnalyzerTest : public testing::Test {
- public:
-  const int kMemorySize = 1 << 20;  // 1MiB
-  const int kStackSize  = 1 << 10;  // 1KiB
-
-  ActivityAnalyzerTest() = default;
-
-  ~ActivityAnalyzerTest() override {
-    GlobalActivityTracker* global_tracker = GlobalActivityTracker::Get();
-    if (global_tracker) {
-      global_tracker->ReleaseTrackerForCurrentThreadForTesting();
-      delete global_tracker;
-    }
-  }
-
-  std::unique_ptr<ThreadActivityTracker> CreateActivityTracker() {
-    std::unique_ptr<char[]> memory(new char[kStackSize]);
-    return std::make_unique<TestActivityTracker>(std::move(memory), kStackSize);
-  }
-
-  template <typename Function>
-  void AsOtherProcess(int64_t pid, Function function) {
-    std::unique_ptr<GlobalActivityTracker> old_global =
-        GlobalActivityTracker::ReleaseForTesting();
-    ASSERT_TRUE(old_global);
-
-    PersistentMemoryAllocator* old_allocator = old_global->allocator();
-    std::unique_ptr<PersistentMemoryAllocator> new_allocator(
-        std::make_unique<PersistentMemoryAllocator>(
-            const_cast<void*>(old_allocator->data()), old_allocator->size(), 0,
-            0, "", false));
-    GlobalActivityTracker::CreateWithAllocator(std::move(new_allocator), 3,
-                                               pid);
-
-    function();
-
-    GlobalActivityTracker::ReleaseForTesting();
-    GlobalActivityTracker::SetForTesting(std::move(old_global));
-  }
-
-  static void DoNothing() {}
-};
-
-TEST_F(ActivityAnalyzerTest, ThreadAnalyzerConstruction) {
-  std::unique_ptr<ThreadActivityTracker> tracker = CreateActivityTracker();
-  {
-    ThreadActivityAnalyzer analyzer(*tracker);
-    EXPECT_TRUE(analyzer.IsValid());
-    EXPECT_EQ(PlatformThread::GetName(), analyzer.GetThreadName());
-  }
-
-  // TODO(bcwhite): More tests once Analyzer does more.
-}
-
-
-// GlobalActivityAnalyzer tests below.
-
-namespace {
-
-class SimpleActivityThread : public SimpleThread {
- public:
-  SimpleActivityThread(const std::string& name,
-                       const void* source,
-                       Activity::Type activity,
-                       const ActivityData& data)
-      : SimpleThread(name, Options()),
-        source_(source),
-        activity_(activity),
-        data_(data),
-        ready_(false),
-        exit_(false),
-        exit_condition_(&lock_) {}
-
-  ~SimpleActivityThread() override = default;
-
-  void Run() override {
-    ThreadActivityTracker::ActivityId id =
-        GlobalActivityTracker::Get()
-            ->GetOrCreateTrackerForCurrentThread()
-            ->PushActivity(source_, activity_, data_);
-
-    {
-      AutoLock auto_lock(lock_);
-      ready_.store(true, std::memory_order_release);
-      while (!exit_.load(std::memory_order_relaxed))
-        exit_condition_.Wait();
-    }
-
-    GlobalActivityTracker::Get()->GetTrackerForCurrentThread()->PopActivity(id);
-  }
-
-  void Exit() {
-    AutoLock auto_lock(lock_);
-    exit_.store(true, std::memory_order_relaxed);
-    exit_condition_.Signal();
-  }
-
-  void WaitReady() {
-    SPIN_FOR_1_SECOND_OR_UNTIL_TRUE(ready_.load(std::memory_order_acquire));
-  }
-
- private:
-  const void* source_;
-  Activity::Type activity_;
-  ActivityData data_;
-
-  std::atomic<bool> ready_;
-  std::atomic<bool> exit_;
-  Lock lock_;
-  ConditionVariable exit_condition_;
-
-  DISALLOW_COPY_AND_ASSIGN(SimpleActivityThread);
-};
-
-}  // namespace
-
-TEST_F(ActivityAnalyzerTest, GlobalAnalyzerConstruction) {
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
-  GlobalActivityTracker::Get()->process_data().SetString("foo", "bar");
-
-  PersistentMemoryAllocator* allocator =
-      GlobalActivityTracker::Get()->allocator();
-  GlobalActivityAnalyzer analyzer(std::make_unique<PersistentMemoryAllocator>(
-      const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true));
-
-  // The only thread at this point is the test thread of this process.
-  const int64_t pid = analyzer.GetFirstProcess();
-  ASSERT_NE(0, pid);
-  ThreadActivityAnalyzer* ta1 = analyzer.GetFirstAnalyzer(pid);
-  ASSERT_TRUE(ta1);
-  EXPECT_FALSE(analyzer.GetNextAnalyzer());
-  ThreadActivityAnalyzer::ThreadKey tk1 = ta1->GetThreadKey();
-  EXPECT_EQ(ta1, analyzer.GetAnalyzerForThread(tk1));
-  EXPECT_EQ(0, analyzer.GetNextProcess());
-
-  // Create a second thread that will do something.
-  SimpleActivityThread t2("t2", nullptr, Activity::ACT_TASK,
-                          ActivityData::ForTask(11));
-  t2.Start();
-  t2.WaitReady();
-
-  // Now there should be two. Calling GetFirstProcess invalidates any
-  // previously returned analyzer pointers.
-  ASSERT_EQ(pid, analyzer.GetFirstProcess());
-  EXPECT_TRUE(analyzer.GetFirstAnalyzer(pid));
-  EXPECT_TRUE(analyzer.GetNextAnalyzer());
-  EXPECT_FALSE(analyzer.GetNextAnalyzer());
-  EXPECT_EQ(0, analyzer.GetNextProcess());
-
-  // Let thread exit.
-  t2.Exit();
-  t2.Join();
-
-  // Now there should be only one again.
-  ASSERT_EQ(pid, analyzer.GetFirstProcess());
-  ThreadActivityAnalyzer* ta2 = analyzer.GetFirstAnalyzer(pid);
-  ASSERT_TRUE(ta2);
-  EXPECT_FALSE(analyzer.GetNextAnalyzer());
-  ThreadActivityAnalyzer::ThreadKey tk2 = ta2->GetThreadKey();
-  EXPECT_EQ(ta2, analyzer.GetAnalyzerForThread(tk2));
-  EXPECT_EQ(tk1, tk2);
-  EXPECT_EQ(0, analyzer.GetNextProcess());
-
-  // Verify that there is process data.
-  const ActivityUserData::Snapshot& data_snapshot =
-      analyzer.GetProcessDataSnapshot(pid);
-  ASSERT_LE(1U, data_snapshot.size());
-  EXPECT_EQ("bar", data_snapshot.at("foo").GetString());
-}
-
-TEST_F(ActivityAnalyzerTest, GlobalAnalyzerFromSharedMemory) {
-  SharedMemoryHandle handle1;
-  SharedMemoryHandle handle2;
-
-  {
-    std::unique_ptr<SharedMemory> shmem(new SharedMemory());
-    ASSERT_TRUE(shmem->CreateAndMapAnonymous(kMemorySize));
-    handle1 = shmem->handle().Duplicate();
-    ASSERT_TRUE(handle1.IsValid());
-    handle2 = shmem->handle().Duplicate();
-    ASSERT_TRUE(handle2.IsValid());
-  }
-
-  GlobalActivityTracker::CreateWithSharedMemoryHandle(handle1, kMemorySize, 0,
-                                                      "", 3);
-  GlobalActivityTracker::Get()->process_data().SetString("foo", "bar");
-
-  std::unique_ptr<GlobalActivityAnalyzer> analyzer =
-      GlobalActivityAnalyzer::CreateWithSharedMemoryHandle(handle2,
-                                                           kMemorySize);
-
-  const int64_t pid = analyzer->GetFirstProcess();
-  ASSERT_NE(0, pid);
-  const ActivityUserData::Snapshot& data_snapshot =
-      analyzer->GetProcessDataSnapshot(pid);
-  ASSERT_LE(1U, data_snapshot.size());
-  EXPECT_EQ("bar", data_snapshot.at("foo").GetString());
-}
-
-TEST_F(ActivityAnalyzerTest, UserDataSnapshotTest) {
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
-  ThreadActivityAnalyzer::Snapshot tracker_snapshot;
-
-  const char string1a[] = "string1a";
-  const char string1b[] = "string1b";
-  const char string2a[] = "string2a";
-  const char string2b[] = "string2b";
-
-  PersistentMemoryAllocator* allocator =
-      GlobalActivityTracker::Get()->allocator();
-  GlobalActivityAnalyzer global_analyzer(
-      std::make_unique<PersistentMemoryAllocator>(
-          const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "",
-          true));
-
-  ThreadActivityTracker* tracker =
-      GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
-
-  {
-    ScopedActivity activity1(1, 11, 111);
-    ActivityUserData& user_data1 = activity1.user_data();
-    user_data1.Set("raw1", "foo1", 4);
-    user_data1.SetString("string1", "bar1");
-    user_data1.SetChar("char1", '1');
-    user_data1.SetInt("int1", -1111);
-    user_data1.SetUint("uint1", 1111);
-    user_data1.SetBool("bool1", true);
-    user_data1.SetReference("ref1", string1a, sizeof(string1a));
-    user_data1.SetStringReference("sref1", string1b);
-
-    {
-      ScopedActivity activity2(2, 22, 222);
-      ActivityUserData& user_data2 = activity2.user_data();
-      user_data2.Set("raw2", "foo2", 4);
-      user_data2.SetString("string2", "bar2");
-      user_data2.SetChar("char2", '2');
-      user_data2.SetInt("int2", -2222);
-      user_data2.SetUint("uint2", 2222);
-      user_data2.SetBool("bool2", false);
-      user_data2.SetReference("ref2", string2a, sizeof(string2a));
-      user_data2.SetStringReference("sref2", string2b);
-
-      ASSERT_TRUE(tracker->CreateSnapshot(&tracker_snapshot));
-      ASSERT_EQ(2U, tracker_snapshot.activity_stack.size());
-
-      ThreadActivityAnalyzer analyzer(*tracker);
-      analyzer.AddGlobalInformation(&global_analyzer);
-      const ThreadActivityAnalyzer::Snapshot& analyzer_snapshot =
-          analyzer.activity_snapshot();
-      ASSERT_EQ(2U, analyzer_snapshot.user_data_stack.size());
-      const ActivityUserData::Snapshot& user_data =
-          analyzer_snapshot.user_data_stack.at(1);
-      EXPECT_EQ(8U, user_data.size());
-      ASSERT_TRUE(ContainsKey(user_data, "raw2"));
-      EXPECT_EQ("foo2", user_data.at("raw2").Get().as_string());
-      ASSERT_TRUE(ContainsKey(user_data, "string2"));
-      EXPECT_EQ("bar2", user_data.at("string2").GetString().as_string());
-      ASSERT_TRUE(ContainsKey(user_data, "char2"));
-      EXPECT_EQ('2', user_data.at("char2").GetChar());
-      ASSERT_TRUE(ContainsKey(user_data, "int2"));
-      EXPECT_EQ(-2222, user_data.at("int2").GetInt());
-      ASSERT_TRUE(ContainsKey(user_data, "uint2"));
-      EXPECT_EQ(2222U, user_data.at("uint2").GetUint());
-      ASSERT_TRUE(ContainsKey(user_data, "bool2"));
-      EXPECT_FALSE(user_data.at("bool2").GetBool());
-      ASSERT_TRUE(ContainsKey(user_data, "ref2"));
-      EXPECT_EQ(string2a, user_data.at("ref2").GetReference().data());
-      EXPECT_EQ(sizeof(string2a), user_data.at("ref2").GetReference().size());
-      ASSERT_TRUE(ContainsKey(user_data, "sref2"));
-      EXPECT_EQ(string2b, user_data.at("sref2").GetStringReference().data());
-      EXPECT_EQ(strlen(string2b),
-                user_data.at("sref2").GetStringReference().size());
-    }
-
-    ASSERT_TRUE(tracker->CreateSnapshot(&tracker_snapshot));
-    ASSERT_EQ(1U, tracker_snapshot.activity_stack.size());
-
-    ThreadActivityAnalyzer analyzer(*tracker);
-    analyzer.AddGlobalInformation(&global_analyzer);
-    const ThreadActivityAnalyzer::Snapshot& analyzer_snapshot =
-        analyzer.activity_snapshot();
-    ASSERT_EQ(1U, analyzer_snapshot.user_data_stack.size());
-    const ActivityUserData::Snapshot& user_data =
-        analyzer_snapshot.user_data_stack.at(0);
-    EXPECT_EQ(8U, user_data.size());
-    EXPECT_EQ("foo1", user_data.at("raw1").Get().as_string());
-    EXPECT_EQ("bar1", user_data.at("string1").GetString().as_string());
-    EXPECT_EQ('1', user_data.at("char1").GetChar());
-    EXPECT_EQ(-1111, user_data.at("int1").GetInt());
-    EXPECT_EQ(1111U, user_data.at("uint1").GetUint());
-    EXPECT_TRUE(user_data.at("bool1").GetBool());
-    EXPECT_EQ(string1a, user_data.at("ref1").GetReference().data());
-    EXPECT_EQ(sizeof(string1a), user_data.at("ref1").GetReference().size());
-    EXPECT_EQ(string1b, user_data.at("sref1").GetStringReference().data());
-    EXPECT_EQ(strlen(string1b),
-              user_data.at("sref1").GetStringReference().size());
-  }
-
-  ASSERT_TRUE(tracker->CreateSnapshot(&tracker_snapshot));
-  ASSERT_EQ(0U, tracker_snapshot.activity_stack.size());
-}
-
-TEST_F(ActivityAnalyzerTest, GlobalUserDataTest) {
-  const int64_t pid = GetCurrentProcId();
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
-
-  const char string1[] = "foo";
-  const char string2[] = "bar";
-
-  PersistentMemoryAllocator* allocator =
-      GlobalActivityTracker::Get()->allocator();
-  GlobalActivityAnalyzer global_analyzer(
-      std::make_unique<PersistentMemoryAllocator>(
-          const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "",
-          true));
-
-  ActivityUserData& process_data = GlobalActivityTracker::Get()->process_data();
-  ASSERT_NE(0U, process_data.id());
-  process_data.Set("raw", "foo", 3);
-  process_data.SetString("string", "bar");
-  process_data.SetChar("char", '9');
-  process_data.SetInt("int", -9999);
-  process_data.SetUint("uint", 9999);
-  process_data.SetBool("bool", true);
-  process_data.SetReference("ref", string1, sizeof(string1));
-  process_data.SetStringReference("sref", string2);
-
-  int64_t first_pid = global_analyzer.GetFirstProcess();
-  DCHECK_EQ(pid, first_pid);
-  const ActivityUserData::Snapshot& snapshot =
-      global_analyzer.GetProcessDataSnapshot(pid);
-  ASSERT_TRUE(ContainsKey(snapshot, "raw"));
-  EXPECT_EQ("foo", snapshot.at("raw").Get().as_string());
-  ASSERT_TRUE(ContainsKey(snapshot, "string"));
-  EXPECT_EQ("bar", snapshot.at("string").GetString().as_string());
-  ASSERT_TRUE(ContainsKey(snapshot, "char"));
-  EXPECT_EQ('9', snapshot.at("char").GetChar());
-  ASSERT_TRUE(ContainsKey(snapshot, "int"));
-  EXPECT_EQ(-9999, snapshot.at("int").GetInt());
-  ASSERT_TRUE(ContainsKey(snapshot, "uint"));
-  EXPECT_EQ(9999U, snapshot.at("uint").GetUint());
-  ASSERT_TRUE(ContainsKey(snapshot, "bool"));
-  EXPECT_TRUE(snapshot.at("bool").GetBool());
-  ASSERT_TRUE(ContainsKey(snapshot, "ref"));
-  EXPECT_EQ(string1, snapshot.at("ref").GetReference().data());
-  EXPECT_EQ(sizeof(string1), snapshot.at("ref").GetReference().size());
-  ASSERT_TRUE(ContainsKey(snapshot, "sref"));
-  EXPECT_EQ(string2, snapshot.at("sref").GetStringReference().data());
-  EXPECT_EQ(strlen(string2), snapshot.at("sref").GetStringReference().size());
-}
-
-TEST_F(ActivityAnalyzerTest, GlobalModulesTest) {
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
-  GlobalActivityTracker* global = GlobalActivityTracker::Get();
-
-  PersistentMemoryAllocator* allocator = global->allocator();
-  GlobalActivityAnalyzer global_analyzer(
-      std::make_unique<PersistentMemoryAllocator>(
-          const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "",
-          true));
-
-  GlobalActivityTracker::ModuleInfo info1;
-  info1.is_loaded = true;
-  info1.address = 0x12345678;
-  info1.load_time = 1111;
-  info1.size = 0xABCDEF;
-  info1.timestamp = 111;
-  info1.age = 11;
-  info1.identifier[0] = 1;
-  info1.file = "anything";
-  info1.debug_file = "elsewhere";
-
-  global->RecordModuleInfo(info1);
-  std::vector<GlobalActivityTracker::ModuleInfo> modules1;
-  modules1 = global_analyzer.GetModules(global_analyzer.GetFirstProcess());
-  ASSERT_EQ(1U, modules1.size());
-  GlobalActivityTracker::ModuleInfo& stored1a = modules1[0];
-  EXPECT_EQ(info1.is_loaded, stored1a.is_loaded);
-  EXPECT_EQ(info1.address, stored1a.address);
-  EXPECT_NE(info1.load_time, stored1a.load_time);
-  EXPECT_EQ(info1.size, stored1a.size);
-  EXPECT_EQ(info1.timestamp, stored1a.timestamp);
-  EXPECT_EQ(info1.age, stored1a.age);
-  EXPECT_EQ(info1.identifier[0], stored1a.identifier[0]);
-  EXPECT_EQ(info1.file, stored1a.file);
-  EXPECT_EQ(info1.debug_file, stored1a.debug_file);
-
-  info1.is_loaded = false;
-  global->RecordModuleInfo(info1);
-  modules1 = global_analyzer.GetModules(global_analyzer.GetFirstProcess());
-  ASSERT_EQ(1U, modules1.size());
-  GlobalActivityTracker::ModuleInfo& stored1b = modules1[0];
-  EXPECT_EQ(info1.is_loaded, stored1b.is_loaded);
-  EXPECT_EQ(info1.address, stored1b.address);
-  EXPECT_NE(info1.load_time, stored1b.load_time);
-  EXPECT_EQ(info1.size, stored1b.size);
-  EXPECT_EQ(info1.timestamp, stored1b.timestamp);
-  EXPECT_EQ(info1.age, stored1b.age);
-  EXPECT_EQ(info1.identifier[0], stored1b.identifier[0]);
-  EXPECT_EQ(info1.file, stored1b.file);
-  EXPECT_EQ(info1.debug_file, stored1b.debug_file);
-
-  GlobalActivityTracker::ModuleInfo info2;
-  info2.is_loaded = true;
-  info2.address = 0x87654321;
-  info2.load_time = 2222;
-  info2.size = 0xFEDCBA;
-  info2.timestamp = 222;
-  info2.age = 22;
-  info2.identifier[0] = 2;
-  info2.file = "nothing";
-  info2.debug_file = "farewell";
-
-  global->RecordModuleInfo(info2);
-  std::vector<GlobalActivityTracker::ModuleInfo> modules2;
-  modules2 = global_analyzer.GetModules(global_analyzer.GetFirstProcess());
-  ASSERT_EQ(2U, modules2.size());
-  GlobalActivityTracker::ModuleInfo& stored2 = modules2[1];
-  EXPECT_EQ(info2.is_loaded, stored2.is_loaded);
-  EXPECT_EQ(info2.address, stored2.address);
-  EXPECT_NE(info2.load_time, stored2.load_time);
-  EXPECT_EQ(info2.size, stored2.size);
-  EXPECT_EQ(info2.timestamp, stored2.timestamp);
-  EXPECT_EQ(info2.age, stored2.age);
-  EXPECT_EQ(info2.identifier[0], stored2.identifier[0]);
-  EXPECT_EQ(info2.file, stored2.file);
-  EXPECT_EQ(info2.debug_file, stored2.debug_file);
-}
-
-TEST_F(ActivityAnalyzerTest, GlobalLogMessages) {
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
-
-  PersistentMemoryAllocator* allocator =
-      GlobalActivityTracker::Get()->allocator();
-  GlobalActivityAnalyzer analyzer(std::make_unique<PersistentMemoryAllocator>(
-      const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true));
-
-  GlobalActivityTracker::Get()->RecordLogMessage("hello world");
-  GlobalActivityTracker::Get()->RecordLogMessage("foo bar");
-
-  std::vector<std::string> messages = analyzer.GetLogMessages();
-  ASSERT_EQ(2U, messages.size());
-  EXPECT_EQ("hello world", messages[0]);
-  EXPECT_EQ("foo bar", messages[1]);
-}
-
-TEST_F(ActivityAnalyzerTest, GlobalMultiProcess) {
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 1001);
-  GlobalActivityTracker* global = GlobalActivityTracker::Get();
-  PersistentMemoryAllocator* allocator = global->allocator();
-  EXPECT_EQ(1001, global->process_id());
-
-  int64_t process_id;
-  int64_t create_stamp;
-  ActivityUserData::GetOwningProcessId(
-      GlobalActivityTracker::Get()->process_data().GetBaseAddress(),
-      &process_id, &create_stamp);
-  ASSERT_EQ(1001, process_id);
-
-  GlobalActivityTracker::Get()->process_data().SetInt("pid",
-                                                      global->process_id());
-
-  GlobalActivityAnalyzer analyzer(std::make_unique<PersistentMemoryAllocator>(
-      const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true));
-
-  AsOtherProcess(2002, [&global]() {
-    ASSERT_NE(global, GlobalActivityTracker::Get());
-    EXPECT_EQ(2002, GlobalActivityTracker::Get()->process_id());
-
-    int64_t process_id;
-    int64_t create_stamp;
-    ActivityUserData::GetOwningProcessId(
-        GlobalActivityTracker::Get()->process_data().GetBaseAddress(),
-        &process_id, &create_stamp);
-    ASSERT_EQ(2002, process_id);
-
-    GlobalActivityTracker::Get()->process_data().SetInt(
-        "pid", GlobalActivityTracker::Get()->process_id());
-  });
-  ASSERT_EQ(global, GlobalActivityTracker::Get());
-  EXPECT_EQ(1001, GlobalActivityTracker::Get()->process_id());
-
-  const int64_t pid1 = analyzer.GetFirstProcess();
-  ASSERT_EQ(1001, pid1);
-  const int64_t pid2 = analyzer.GetNextProcess();
-  ASSERT_EQ(2002, pid2);
-  EXPECT_EQ(0, analyzer.GetNextProcess());
-
-  const ActivityUserData::Snapshot& pdata1 =
-      analyzer.GetProcessDataSnapshot(pid1);
-  const ActivityUserData::Snapshot& pdata2 =
-      analyzer.GetProcessDataSnapshot(pid2);
-  EXPECT_EQ(1001, pdata1.at("pid").GetInt());
-  EXPECT_EQ(2002, pdata2.at("pid").GetInt());
-}
-
-}  // namespace debug
-}  // namespace base
diff --git a/base/debug/activity_tracker_unittest.cc b/base/debug/activity_tracker_unittest.cc
deleted file mode 100644
index e2b61a9..0000000
--- a/base/debug/activity_tracker_unittest.cc
+++ /dev/null
@@ -1,585 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/debug/activity_tracker.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/files/file.h"
-#include "base/files/file_util.h"
-#include "base/files/memory_mapped_file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/memory/ptr_util.h"
-#include "base/pending_task.h"
-#include "base/rand_util.h"
-#include "base/synchronization/condition_variable.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/spin_wait.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace debug {
-
-namespace {
-
-class TestActivityTracker : public ThreadActivityTracker {
- public:
-  TestActivityTracker(std::unique_ptr<char[]> memory, size_t mem_size)
-      : ThreadActivityTracker(memset(memory.get(), 0, mem_size), mem_size),
-        mem_segment_(std::move(memory)) {}
-
-  ~TestActivityTracker() override = default;
-
- private:
-  std::unique_ptr<char[]> mem_segment_;
-};
-
-}  // namespace
-
-
-class ActivityTrackerTest : public testing::Test {
- public:
-  const int kMemorySize = 1 << 20;  // 1MiB
-  const int kStackSize  = 1 << 10;  // 1KiB
-
-  using ActivityId = ThreadActivityTracker::ActivityId;
-
-  ActivityTrackerTest() = default;
-
-  ~ActivityTrackerTest() override {
-    GlobalActivityTracker* global_tracker = GlobalActivityTracker::Get();
-    if (global_tracker) {
-      global_tracker->ReleaseTrackerForCurrentThreadForTesting();
-      delete global_tracker;
-    }
-  }
-
-  std::unique_ptr<ThreadActivityTracker> CreateActivityTracker() {
-    std::unique_ptr<char[]> memory(new char[kStackSize]);
-    return std::make_unique<TestActivityTracker>(std::move(memory), kStackSize);
-  }
-
-  size_t GetGlobalActiveTrackerCount() {
-    GlobalActivityTracker* global_tracker = GlobalActivityTracker::Get();
-    if (!global_tracker)
-      return 0;
-    return global_tracker->thread_tracker_count_.load(
-        std::memory_order_relaxed);
-  }
-
-  size_t GetGlobalInactiveTrackerCount() {
-    GlobalActivityTracker* global_tracker = GlobalActivityTracker::Get();
-    if (!global_tracker)
-      return 0;
-    AutoLock autolock(global_tracker->thread_tracker_allocator_lock_);
-    return global_tracker->thread_tracker_allocator_.cache_used();
-  }
-
-  size_t GetGlobalUserDataMemoryCacheUsed() {
-    return GlobalActivityTracker::Get()->user_data_allocator_.cache_used();
-  }
-
-  void HandleProcessExit(int64_t id,
-                         int64_t stamp,
-                         int code,
-                         GlobalActivityTracker::ProcessPhase phase,
-                         std::string&& command,
-                         ActivityUserData::Snapshot&& data) {
-    exit_id_ = id;
-    exit_stamp_ = stamp;
-    exit_code_ = code;
-    exit_phase_ = phase;
-    exit_command_ = std::move(command);
-    exit_data_ = std::move(data);
-  }
-
-  int64_t exit_id_ = 0;
-  int64_t exit_stamp_;
-  int exit_code_;
-  GlobalActivityTracker::ProcessPhase exit_phase_;
-  std::string exit_command_;
-  ActivityUserData::Snapshot exit_data_;
-};
-
-TEST_F(ActivityTrackerTest, UserDataTest) {
-  char buffer[256];
-  memset(buffer, 0, sizeof(buffer));
-  ActivityUserData data(buffer, sizeof(buffer));
-  size_t space = sizeof(buffer) - sizeof(ActivityUserData::MemoryHeader);
-  ASSERT_EQ(space, data.available_);
-
-  data.SetInt("foo", 1);
-  space -= 24;
-  ASSERT_EQ(space, data.available_);
-
-  data.SetUint("b", 1U);  // Small names fit beside header in a word.
-  space -= 16;
-  ASSERT_EQ(space, data.available_);
-
-  data.Set("c", buffer, 10);
-  space -= 24;
-  ASSERT_EQ(space, data.available_);
-
-  data.SetString("dear john", "it's been fun");
-  space -= 32;
-  ASSERT_EQ(space, data.available_);
-
-  data.Set("c", buffer, 20);
-  ASSERT_EQ(space, data.available_);
-
-  data.SetString("dear john", "but we're done together");
-  ASSERT_EQ(space, data.available_);
-
-  data.SetString("dear john", "bye");
-  ASSERT_EQ(space, data.available_);
-
-  data.SetChar("d", 'x');
-  space -= 8;
-  ASSERT_EQ(space, data.available_);
-
-  data.SetBool("ee", true);
-  space -= 16;
-  ASSERT_EQ(space, data.available_);
-
-  data.SetString("f", "");
-  space -= 8;
-  ASSERT_EQ(space, data.available_);
-}
-
-TEST_F(ActivityTrackerTest, PushPopTest) {
-  std::unique_ptr<ThreadActivityTracker> tracker = CreateActivityTracker();
-  ThreadActivityTracker::Snapshot snapshot;
-
-  ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-  ASSERT_EQ(0U, snapshot.activity_stack_depth);
-  ASSERT_EQ(0U, snapshot.activity_stack.size());
-
-  char origin1;
-  ActivityId id1 = tracker->PushActivity(&origin1, Activity::ACT_TASK,
-                                         ActivityData::ForTask(11));
-  ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-  ASSERT_EQ(1U, snapshot.activity_stack_depth);
-  ASSERT_EQ(1U, snapshot.activity_stack.size());
-  EXPECT_NE(0, snapshot.activity_stack[0].time_internal);
-  EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type);
-  EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin1),
-            snapshot.activity_stack[0].origin_address);
-  EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id);
-
-  char origin2;
-  char lock2;
-  ActivityId id2 = tracker->PushActivity(&origin2, Activity::ACT_LOCK,
-                                         ActivityData::ForLock(&lock2));
-  ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-  ASSERT_EQ(2U, snapshot.activity_stack_depth);
-  ASSERT_EQ(2U, snapshot.activity_stack.size());
-  EXPECT_LE(snapshot.activity_stack[0].time_internal,
-            snapshot.activity_stack[1].time_internal);
-  EXPECT_EQ(Activity::ACT_LOCK, snapshot.activity_stack[1].activity_type);
-  EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin2),
-            snapshot.activity_stack[1].origin_address);
-  EXPECT_EQ(reinterpret_cast<uintptr_t>(&lock2),
-            snapshot.activity_stack[1].data.lock.lock_address);
-
-  tracker->PopActivity(id2);
-  ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-  ASSERT_EQ(1U, snapshot.activity_stack_depth);
-  ASSERT_EQ(1U, snapshot.activity_stack.size());
-  EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type);
-  EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin1),
-            snapshot.activity_stack[0].origin_address);
-  EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id);
-
-  tracker->PopActivity(id1);
-  ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-  ASSERT_EQ(0U, snapshot.activity_stack_depth);
-  ASSERT_EQ(0U, snapshot.activity_stack.size());
-}
-
-TEST_F(ActivityTrackerTest, ScopedTaskTest) {
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
-
-  ThreadActivityTracker* tracker =
-      GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
-  ThreadActivityTracker::Snapshot snapshot;
-  ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed());
-
-  ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-  ASSERT_EQ(0U, snapshot.activity_stack_depth);
-  ASSERT_EQ(0U, snapshot.activity_stack.size());
-
-  {
-    PendingTask task1(FROM_HERE, DoNothing());
-    ScopedTaskRunActivity activity1(task1);
-    ActivityUserData& user_data1 = activity1.user_data();
-    (void)user_data1;  // Tell compiler it's been used.
-
-    ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-    ASSERT_EQ(1U, snapshot.activity_stack_depth);
-    ASSERT_EQ(1U, snapshot.activity_stack.size());
-    EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type);
-
-    {
-      PendingTask task2(FROM_HERE, DoNothing());
-      ScopedTaskRunActivity activity2(task2);
-      ActivityUserData& user_data2 = activity2.user_data();
-      (void)user_data2;  // Tell compiler it's been used.
-
-      ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-      ASSERT_EQ(2U, snapshot.activity_stack_depth);
-      ASSERT_EQ(2U, snapshot.activity_stack.size());
-      EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[1].activity_type);
-    }
-
-    ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-    ASSERT_EQ(1U, snapshot.activity_stack_depth);
-    ASSERT_EQ(1U, snapshot.activity_stack.size());
-    EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type);
-  }
-
-  ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-  ASSERT_EQ(0U, snapshot.activity_stack_depth);
-  ASSERT_EQ(0U, snapshot.activity_stack.size());
-  ASSERT_EQ(2U, GetGlobalUserDataMemoryCacheUsed());
-}
-
-namespace {
-
-class SimpleLockThread : public SimpleThread {
- public:
-  SimpleLockThread(const std::string& name, Lock* lock)
-      : SimpleThread(name, Options()),
-        lock_(lock),
-        data_changed_(false),
-        is_running_(false) {}
-
-  ~SimpleLockThread() override = default;
-
-  void Run() override {
-    ThreadActivityTracker* tracker =
-        GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
-    uint32_t pre_version = tracker->GetDataVersionForTesting();
-
-    is_running_.store(true, std::memory_order_relaxed);
-    lock_->Acquire();
-    data_changed_ = tracker->GetDataVersionForTesting() != pre_version;
-    lock_->Release();
-    is_running_.store(false, std::memory_order_relaxed);
-  }
-
-  bool IsRunning() { return is_running_.load(std::memory_order_relaxed); }
-
-  bool WasDataChanged() { return data_changed_; };
-
- private:
-  Lock* lock_;
-  bool data_changed_;
-  std::atomic<bool> is_running_;
-
-  DISALLOW_COPY_AND_ASSIGN(SimpleLockThread);
-};
-
-}  // namespace
-
-TEST_F(ActivityTrackerTest, LockTest) {
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
-
-  ThreadActivityTracker* tracker =
-      GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
-  ThreadActivityTracker::Snapshot snapshot;
-  ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed());
-
-  Lock lock;
-  uint32_t pre_version = tracker->GetDataVersionForTesting();
-
-  // Check no activity when only "trying" a lock.
-  EXPECT_TRUE(lock.Try());
-  EXPECT_EQ(pre_version, tracker->GetDataVersionForTesting());
-  lock.Release();
-  EXPECT_EQ(pre_version, tracker->GetDataVersionForTesting());
-
-  // Check no activity when acquiring a free lock.
-  SimpleLockThread t1("locker1", &lock);
-  t1.Start();
-  t1.Join();
-  EXPECT_FALSE(t1.WasDataChanged());
-
-  // Check that activity is recorded when acquring a busy lock.
-  SimpleLockThread t2("locker2", &lock);
-  lock.Acquire();
-  t2.Start();
-  while (!t2.IsRunning())
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(10));
-  // t2 can't join until the lock is released but have to give time for t2 to
-  // actually block on the lock before releasing it or the results will not
-  // be correct.
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(200));
-  lock.Release();
-  // Now the results will be valid.
-  t2.Join();
-  EXPECT_TRUE(t2.WasDataChanged());
-}
-
-TEST_F(ActivityTrackerTest, ExceptionTest) {
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
-  GlobalActivityTracker* global = GlobalActivityTracker::Get();
-
-  ThreadActivityTracker* tracker =
-      GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
-  ThreadActivityTracker::Snapshot snapshot;
-  ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed());
-
-  ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-  ASSERT_EQ(0U, snapshot.last_exception.activity_type);
-
-  char origin;
-  global->RecordException(&origin, 42);
-
-  ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
-  EXPECT_EQ(Activity::ACT_EXCEPTION, snapshot.last_exception.activity_type);
-  EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin),
-            snapshot.last_exception.origin_address);
-  EXPECT_EQ(42U, snapshot.last_exception.data.exception.code);
-}
-
-TEST_F(ActivityTrackerTest, CreateWithFileTest) {
-  const char temp_name[] = "CreateWithFileTest";
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath temp_file = temp_dir.GetPath().AppendASCII(temp_name);
-  const size_t temp_size = 64 << 10;  // 64 KiB
-
-  // Create a global tracker on a new file.
-  ASSERT_FALSE(PathExists(temp_file));
-  GlobalActivityTracker::CreateWithFile(temp_file, temp_size, 0, "foo", 3);
-  GlobalActivityTracker* global = GlobalActivityTracker::Get();
-  EXPECT_EQ(std::string("foo"), global->allocator()->Name());
-  global->ReleaseTrackerForCurrentThreadForTesting();
-  delete global;
-
-  // Create a global tracker over an existing file, replacing it. If the
-  // replacement doesn't work, the name will remain as it was first created.
-  ASSERT_TRUE(PathExists(temp_file));
-  GlobalActivityTracker::CreateWithFile(temp_file, temp_size, 0, "bar", 3);
-  global = GlobalActivityTracker::Get();
-  EXPECT_EQ(std::string("bar"), global->allocator()->Name());
-  global->ReleaseTrackerForCurrentThreadForTesting();
-  delete global;
-}
-
-
-// GlobalActivityTracker tests below.
-
-TEST_F(ActivityTrackerTest, BasicTest) {
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
-  GlobalActivityTracker* global = GlobalActivityTracker::Get();
-
-  // Ensure the data repositories have backing store, indicated by non-zero ID.
-  EXPECT_NE(0U, global->process_data().id());
-}
-
-namespace {
-
-class SimpleActivityThread : public SimpleThread {
- public:
-  SimpleActivityThread(const std::string& name,
-                       const void* origin,
-                       Activity::Type activity,
-                       const ActivityData& data)
-      : SimpleThread(name, Options()),
-        origin_(origin),
-        activity_(activity),
-        data_(data),
-        ready_(false),
-        exit_(false),
-        exit_condition_(&lock_) {}
-
-  ~SimpleActivityThread() override = default;
-
-  void Run() override {
-    ThreadActivityTracker::ActivityId id =
-        GlobalActivityTracker::Get()
-            ->GetOrCreateTrackerForCurrentThread()
-            ->PushActivity(origin_, activity_, data_);
-
-    {
-      AutoLock auto_lock(lock_);
-      ready_.store(true, std::memory_order_release);
-      while (!exit_.load(std::memory_order_relaxed))
-        exit_condition_.Wait();
-    }
-
-    GlobalActivityTracker::Get()->GetTrackerForCurrentThread()->PopActivity(id);
-  }
-
-  void Exit() {
-    AutoLock auto_lock(lock_);
-    exit_.store(true, std::memory_order_relaxed);
-    exit_condition_.Signal();
-  }
-
-  void WaitReady() {
-    SPIN_FOR_1_SECOND_OR_UNTIL_TRUE(ready_.load(std::memory_order_acquire));
-  }
-
- private:
-  const void* origin_;
-  Activity::Type activity_;
-  ActivityData data_;
-
-  std::atomic<bool> ready_;
-  std::atomic<bool> exit_;
-  Lock lock_;
-  ConditionVariable exit_condition_;
-
-  DISALLOW_COPY_AND_ASSIGN(SimpleActivityThread);
-};
-
-}  // namespace
-
-TEST_F(ActivityTrackerTest, ThreadDeathTest) {
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
-  GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
-  const size_t starting_active = GetGlobalActiveTrackerCount();
-  const size_t starting_inactive = GetGlobalInactiveTrackerCount();
-
-  SimpleActivityThread t1("t1", nullptr, Activity::ACT_TASK,
-                          ActivityData::ForTask(11));
-  t1.Start();
-  t1.WaitReady();
-  EXPECT_EQ(starting_active + 1, GetGlobalActiveTrackerCount());
-  EXPECT_EQ(starting_inactive, GetGlobalInactiveTrackerCount());
-
-  t1.Exit();
-  t1.Join();
-  EXPECT_EQ(starting_active, GetGlobalActiveTrackerCount());
-  EXPECT_EQ(starting_inactive + 1, GetGlobalInactiveTrackerCount());
-
-  // Start another thread and ensure it re-uses the existing memory.
-
-  SimpleActivityThread t2("t2", nullptr, Activity::ACT_TASK,
-                          ActivityData::ForTask(22));
-  t2.Start();
-  t2.WaitReady();
-  EXPECT_EQ(starting_active + 1, GetGlobalActiveTrackerCount());
-  EXPECT_EQ(starting_inactive, GetGlobalInactiveTrackerCount());
-
-  t2.Exit();
-  t2.Join();
-  EXPECT_EQ(starting_active, GetGlobalActiveTrackerCount());
-  EXPECT_EQ(starting_inactive + 1, GetGlobalInactiveTrackerCount());
-}
-
-TEST_F(ActivityTrackerTest, ProcessDeathTest) {
-  // This doesn't actually create and destroy a process. Instead, it uses for-
-  // testing interfaces to simulate data created by other processes.
-  const int64_t other_process_id = GetCurrentProcId() + 1;
-
-  GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
-  GlobalActivityTracker* global = GlobalActivityTracker::Get();
-  ThreadActivityTracker* thread = global->GetOrCreateTrackerForCurrentThread();
-
-  // Get callbacks for process exit.
-  global->SetProcessExitCallback(
-      Bind(&ActivityTrackerTest::HandleProcessExit, Unretained(this)));
-
-  // Pretend than another process has started.
-  global->RecordProcessLaunch(other_process_id, FILE_PATH_LITERAL("foo --bar"));
-
-  // Do some activities.
-  PendingTask task(FROM_HERE, DoNothing());
-  ScopedTaskRunActivity activity(task);
-  ActivityUserData& user_data = activity.user_data();
-  ASSERT_NE(0U, user_data.id());
-
-  // Get the memory-allocator references to that data.
-  PersistentMemoryAllocator::Reference proc_data_ref =
-      global->allocator()->GetAsReference(
-          global->process_data().GetBaseAddress(),
-          GlobalActivityTracker::kTypeIdProcessDataRecord);
-  ASSERT_TRUE(proc_data_ref);
-  PersistentMemoryAllocator::Reference tracker_ref =
-      global->allocator()->GetAsReference(
-          thread->GetBaseAddress(),
-          GlobalActivityTracker::kTypeIdActivityTracker);
-  ASSERT_TRUE(tracker_ref);
-  PersistentMemoryAllocator::Reference user_data_ref =
-      global->allocator()->GetAsReference(
-          user_data.GetBaseAddress(),
-          GlobalActivityTracker::kTypeIdUserDataRecord);
-  ASSERT_TRUE(user_data_ref);
-
-  // Make a copy of the thread-tracker state so it can be restored later.
-  const size_t tracker_size = global->allocator()->GetAllocSize(tracker_ref);
-  std::unique_ptr<char[]> tracker_copy(new char[tracker_size]);
-  memcpy(tracker_copy.get(), thread->GetBaseAddress(), tracker_size);
-
-  // Change the objects to appear to be owned by another process. Use a "past"
-  // time so that exit-time is always later than create-time.
-  const int64_t past_stamp = Time::Now().ToInternalValue() - 1;
-  int64_t owning_id;
-  int64_t stamp;
-  ASSERT_TRUE(ActivityUserData::GetOwningProcessId(
-      global->process_data().GetBaseAddress(), &owning_id, &stamp));
-  EXPECT_NE(other_process_id, owning_id);
-  ASSERT_TRUE(ThreadActivityTracker::GetOwningProcessId(
-      thread->GetBaseAddress(), &owning_id, &stamp));
-  EXPECT_NE(other_process_id, owning_id);
-  ASSERT_TRUE(ActivityUserData::GetOwningProcessId(user_data.GetBaseAddress(),
-                                                   &owning_id, &stamp));
-  EXPECT_NE(other_process_id, owning_id);
-  global->process_data().SetOwningProcessIdForTesting(other_process_id,
-                                                      past_stamp);
-  thread->SetOwningProcessIdForTesting(other_process_id, past_stamp);
-  user_data.SetOwningProcessIdForTesting(other_process_id, past_stamp);
-  ASSERT_TRUE(ActivityUserData::GetOwningProcessId(
-      global->process_data().GetBaseAddress(), &owning_id, &stamp));
-  EXPECT_EQ(other_process_id, owning_id);
-  ASSERT_TRUE(ThreadActivityTracker::GetOwningProcessId(
-      thread->GetBaseAddress(), &owning_id, &stamp));
-  EXPECT_EQ(other_process_id, owning_id);
-  ASSERT_TRUE(ActivityUserData::GetOwningProcessId(user_data.GetBaseAddress(),
-                                                   &owning_id, &stamp));
-  EXPECT_EQ(other_process_id, owning_id);
-
-  // Check that process exit will perform callback and free the allocations.
-  ASSERT_EQ(0, exit_id_);
-  ASSERT_EQ(GlobalActivityTracker::kTypeIdProcessDataRecord,
-            global->allocator()->GetType(proc_data_ref));
-  ASSERT_EQ(GlobalActivityTracker::kTypeIdActivityTracker,
-            global->allocator()->GetType(tracker_ref));
-  ASSERT_EQ(GlobalActivityTracker::kTypeIdUserDataRecord,
-            global->allocator()->GetType(user_data_ref));
-  global->RecordProcessExit(other_process_id, 0);
-  EXPECT_EQ(other_process_id, exit_id_);
-  EXPECT_EQ("foo --bar", exit_command_);
-  EXPECT_EQ(GlobalActivityTracker::kTypeIdProcessDataRecordFree,
-            global->allocator()->GetType(proc_data_ref));
-  EXPECT_EQ(GlobalActivityTracker::kTypeIdActivityTrackerFree,
-            global->allocator()->GetType(tracker_ref));
-  EXPECT_EQ(GlobalActivityTracker::kTypeIdUserDataRecordFree,
-            global->allocator()->GetType(user_data_ref));
-
-  // Restore memory contents and types so things don't crash when doing real
-  // process clean-up.
-  memcpy(const_cast<void*>(thread->GetBaseAddress()), tracker_copy.get(),
-         tracker_size);
-  global->allocator()->ChangeType(
-      proc_data_ref, GlobalActivityTracker::kTypeIdProcessDataRecord,
-      GlobalActivityTracker::kTypeIdUserDataRecordFree, false);
-  global->allocator()->ChangeType(
-      tracker_ref, GlobalActivityTracker::kTypeIdActivityTracker,
-      GlobalActivityTracker::kTypeIdActivityTrackerFree, false);
-  global->allocator()->ChangeType(
-      user_data_ref, GlobalActivityTracker::kTypeIdUserDataRecord,
-      GlobalActivityTracker::kTypeIdUserDataRecordFree, false);
-}
-
-}  // namespace debug
-}  // namespace base
diff --git a/base/debug/alias_unittest.cc b/base/debug/alias_unittest.cc
deleted file mode 100644
index 66682f1..0000000
--- a/base/debug/alias_unittest.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <string>
-
-#include "base/debug/alias.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-TEST(DebugAlias, Test) {
-  std::unique_ptr<std::string> input =
-      std::make_unique<std::string>("string contents");
-
-  // Verify the contents get copied + the new local variable has the right type.
-  DEBUG_ALIAS_FOR_CSTR(copy1, input->c_str(), 100 /* > input->size() */);
-  static_assert(sizeof(copy1) == 100,
-                "Verification that copy1 has expected size");
-  EXPECT_STREQ("string contents", copy1);
-
-  // Verify that the copy is properly null-terminated even when it is smaller
-  // than the input string.
-  DEBUG_ALIAS_FOR_CSTR(copy2, input->c_str(), 3 /* < input->size() */);
-  static_assert(sizeof(copy2) == 3,
-                "Verification that copy2 has expected size");
-  EXPECT_STREQ("st", copy2);
-  EXPECT_EQ('\0', copy2[2]);
-}
diff --git a/base/debug/crash_logging_unittest.cc b/base/debug/crash_logging_unittest.cc
deleted file mode 100644
index c10d36e..0000000
--- a/base/debug/crash_logging_unittest.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/debug/crash_logging.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-TEST(CrashLoggingTest, UninitializedCrashKeyStringSupport) {
-  auto* crash_key = base::debug::AllocateCrashKeyString(
-      "test", base::debug::CrashKeySize::Size32);
-  EXPECT_FALSE(crash_key);
-
-  base::debug::SetCrashKeyString(crash_key, "value");
-
-  base::debug::ClearCrashKeyString(crash_key);
-}
diff --git a/base/debug/debugger_unittest.cc b/base/debug/debugger_unittest.cc
deleted file mode 100644
index 23ea83d..0000000
--- a/base/debug/debugger_unittest.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/debug/debugger.h"
-
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-#if defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
-void CrashWithBreakDebugger() {
-  base::debug::SetSuppressDebugUI(false);
-  base::debug::BreakDebugger();
-
-#if defined(OS_WIN)
-  // This should not be executed.
-  _exit(125);
-#endif
-}
-#endif  // defined(GTEST_HAS_DEATH_TEST)
-
-}  // namespace
-
-// Death tests misbehave on Android.
-#if defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
-
-TEST(Debugger, CrashAtBreakpoint) {
-  EXPECT_DEATH(CrashWithBreakDebugger(), "");
-}
-
-#if defined(OS_WIN)
-TEST(Debugger, DoesntExecuteBeyondBreakpoint) {
-  EXPECT_EXIT(CrashWithBreakDebugger(),
-              ::testing::ExitedWithCode(0x80000003), "");
-}
-#endif  // defined(OS_WIN)
-
-#else  // defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
-TEST(Debugger, NoTest) {
-}
-#endif  // defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
diff --git a/base/debug/elf_reader_linux_unittest.cc b/base/debug/elf_reader_linux_unittest.cc
deleted file mode 100644
index 88ed502..0000000
--- a/base/debug/elf_reader_linux_unittest.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/debug/elf_reader_linux.h"
-
-#include <dlfcn.h>
-
-#include "base/files/memory_mapped_file.h"
-#include "base/strings/string_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-extern char __executable_start;
-
-namespace base {
-namespace debug {
-
-// The linker flag --build-id is passed only on official builds. Clang does not
-// enable it by default and we do not have build id section in non-official
-// builds.
-#if defined(OFFICIAL_BUILD)
-TEST(ElfReaderTest, ReadElfBuildId) {
-  Optional<std::string> build_id = ReadElfBuildId(&__executable_start);
-  ASSERT_TRUE(build_id);
-  const size_t kGuidBytes = 20;
-  EXPECT_EQ(2 * kGuidBytes, build_id.value().size());
-  for (char c : *build_id) {
-    EXPECT_TRUE(IsHexDigit(c));
-    EXPECT_FALSE(IsAsciiLower(c));
-  }
-}
-#endif
-
-TEST(ElfReaderTest, ReadElfLibraryName) {
-#if defined(OS_ANDROID)
-  // On Android the library loader memory maps the full so file.
-  const char kLibraryName[] = "lib_base_unittests__library";
-  const void* addr = &__executable_start;
-#else
-  // On Linux the executable does not contain soname and is not mapped till
-  // dynamic segment. So, use malloc wrapper so file on which the test already
-  // depends on.
-  const char kLibraryName[] = MALLOC_WRAPPER_LIB;
-  // Find any symbol in the loaded file.
-  void* handle = dlopen(kLibraryName, RTLD_NOW | RTLD_LOCAL);
-  const void* init_addr = dlsym(handle, "_init");
-  // Use this symbol to get full path to the loaded library.
-  Dl_info info;
-  int res = dladdr(init_addr, &info);
-  ASSERT_NE(0, res);
-  std::string filename(info.dli_fname);
-  EXPECT_FALSE(filename.empty());
-  EXPECT_NE(std::string::npos, filename.find(kLibraryName));
-
-  // Memory map the so file and use it to test reading so name.
-  MemoryMappedFile file;
-  file.Initialize(FilePath(filename));
-  const void* addr = file.data();
-#endif
-
-  auto name = ReadElfLibraryName(addr);
-  ASSERT_TRUE(name);
-  EXPECT_NE(std::string::npos, name->find(kLibraryName))
-      << "Library name " << *name << " doesn't contain expected "
-      << kLibraryName;
-}
-
-}  // namespace debug
-}  // namespace base
diff --git a/base/debug/leak_tracker_unittest.cc b/base/debug/leak_tracker_unittest.cc
deleted file mode 100644
index b9ecdcf..0000000
--- a/base/debug/leak_tracker_unittest.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/debug/leak_tracker.h"
-
-#include <memory>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace debug {
-
-namespace {
-
-class ClassA {
- private:
-  LeakTracker<ClassA> leak_tracker_;
-};
-
-class ClassB {
- private:
-  LeakTracker<ClassB> leak_tracker_;
-};
-
-#ifndef ENABLE_LEAK_TRACKER
-
-// If leak tracking is disabled, we should do nothing.
-TEST(LeakTrackerTest, NotEnabled) {
-  EXPECT_EQ(-1, LeakTracker<ClassA>::NumLiveInstances());
-  EXPECT_EQ(-1, LeakTracker<ClassB>::NumLiveInstances());
-
-  // Use unique_ptr so compiler doesn't complain about unused variables.
-  std::unique_ptr<ClassA> a1(new ClassA);
-  std::unique_ptr<ClassB> b1(new ClassB);
-  std::unique_ptr<ClassB> b2(new ClassB);
-
-  EXPECT_EQ(-1, LeakTracker<ClassA>::NumLiveInstances());
-  EXPECT_EQ(-1, LeakTracker<ClassB>::NumLiveInstances());
-}
-
-#else
-
-TEST(LeakTrackerTest, Basic) {
-  {
-    ClassA a1;
-
-    EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
-    EXPECT_EQ(0, LeakTracker<ClassB>::NumLiveInstances());
-
-    ClassB b1;
-    ClassB b2;
-
-    EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
-    EXPECT_EQ(2, LeakTracker<ClassB>::NumLiveInstances());
-
-    std::unique_ptr<ClassA> a2(new ClassA);
-
-    EXPECT_EQ(2, LeakTracker<ClassA>::NumLiveInstances());
-    EXPECT_EQ(2, LeakTracker<ClassB>::NumLiveInstances());
-
-    a2.reset();
-
-    EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
-    EXPECT_EQ(2, LeakTracker<ClassB>::NumLiveInstances());
-  }
-
-  EXPECT_EQ(0, LeakTracker<ClassA>::NumLiveInstances());
-  EXPECT_EQ(0, LeakTracker<ClassB>::NumLiveInstances());
-}
-
-// Try some orderings of create/remove to hit different cases in the linked-list
-// assembly.
-TEST(LeakTrackerTest, LinkedList) {
-  EXPECT_EQ(0, LeakTracker<ClassB>::NumLiveInstances());
-
-  std::unique_ptr<ClassA> a1(new ClassA);
-  std::unique_ptr<ClassA> a2(new ClassA);
-  std::unique_ptr<ClassA> a3(new ClassA);
-  std::unique_ptr<ClassA> a4(new ClassA);
-
-  EXPECT_EQ(4, LeakTracker<ClassA>::NumLiveInstances());
-
-  // Remove the head of the list (a1).
-  a1.reset();
-  EXPECT_EQ(3, LeakTracker<ClassA>::NumLiveInstances());
-
-  // Remove the tail of the list (a4).
-  a4.reset();
-  EXPECT_EQ(2, LeakTracker<ClassA>::NumLiveInstances());
-
-  // Append to the new tail of the list (a3).
-  std::unique_ptr<ClassA> a5(new ClassA);
-  EXPECT_EQ(3, LeakTracker<ClassA>::NumLiveInstances());
-
-  a2.reset();
-  a3.reset();
-
-  EXPECT_EQ(1, LeakTracker<ClassA>::NumLiveInstances());
-
-  a5.reset();
-  EXPECT_EQ(0, LeakTracker<ClassA>::NumLiveInstances());
-}
-
-TEST(LeakTrackerTest, NoOpCheckForLeaks) {
-  // There are no live instances of ClassA, so this should do nothing.
-  LeakTracker<ClassA>::CheckForLeaks();
-}
-
-#endif  // ENABLE_LEAK_TRACKER
-
-}  // namespace
-
-}  // namespace debug
-}  // namespace base
diff --git a/base/debug/proc_maps_linux_unittest.cc b/base/debug/proc_maps_linux_unittest.cc
deleted file mode 100644
index d291507..0000000
--- a/base/debug/proc_maps_linux_unittest.cc
+++ /dev/null
@@ -1,328 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/debug/proc_maps_linux.h"
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/path_service.h"
-#include "base/strings/stringprintf.h"
-#include "base/threading/platform_thread.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace debug {
-
-TEST(ProcMapsTest, Empty) {
-  std::vector<MappedMemoryRegion> regions;
-  EXPECT_TRUE(ParseProcMaps("", &regions));
-  EXPECT_EQ(0u, regions.size());
-}
-
-TEST(ProcMapsTest, NoSpaces) {
-  static const char kNoSpaces[] =
-      "00400000-0040b000 r-xp 00002200 fc:00 794418 /bin/cat\n";
-
-  std::vector<MappedMemoryRegion> regions;
-  ASSERT_TRUE(ParseProcMaps(kNoSpaces, &regions));
-  ASSERT_EQ(1u, regions.size());
-
-  EXPECT_EQ(0x00400000u, regions[0].start);
-  EXPECT_EQ(0x0040b000u, regions[0].end);
-  EXPECT_EQ(0x00002200u, regions[0].offset);
-  EXPECT_EQ("/bin/cat", regions[0].path);
-}
-
-TEST(ProcMapsTest, Spaces) {
-  static const char kSpaces[] =
-      "00400000-0040b000 r-xp 00002200 fc:00 794418 /bin/space cat\n";
-
-  std::vector<MappedMemoryRegion> regions;
-  ASSERT_TRUE(ParseProcMaps(kSpaces, &regions));
-  ASSERT_EQ(1u, regions.size());
-
-  EXPECT_EQ(0x00400000u, regions[0].start);
-  EXPECT_EQ(0x0040b000u, regions[0].end);
-  EXPECT_EQ(0x00002200u, regions[0].offset);
-  EXPECT_EQ("/bin/space cat", regions[0].path);
-}
-
-TEST(ProcMapsTest, NoNewline) {
-  static const char kNoSpaces[] =
-      "00400000-0040b000 r-xp 00002200 fc:00 794418 /bin/cat";
-
-  std::vector<MappedMemoryRegion> regions;
-  ASSERT_FALSE(ParseProcMaps(kNoSpaces, &regions));
-}
-
-TEST(ProcMapsTest, NoPath) {
-  static const char kNoPath[] =
-      "00400000-0040b000 rw-p 00000000 00:00 0 \n";
-
-  std::vector<MappedMemoryRegion> regions;
-  ASSERT_TRUE(ParseProcMaps(kNoPath, &regions));
-  ASSERT_EQ(1u, regions.size());
-
-  EXPECT_EQ(0x00400000u, regions[0].start);
-  EXPECT_EQ(0x0040b000u, regions[0].end);
-  EXPECT_EQ(0x00000000u, regions[0].offset);
-  EXPECT_EQ("", regions[0].path);
-}
-
-TEST(ProcMapsTest, Heap) {
-  static const char kHeap[] =
-      "022ac000-022cd000 rw-p 00000000 00:00 0 [heap]\n";
-
-  std::vector<MappedMemoryRegion> regions;
-  ASSERT_TRUE(ParseProcMaps(kHeap, &regions));
-  ASSERT_EQ(1u, regions.size());
-
-  EXPECT_EQ(0x022ac000u, regions[0].start);
-  EXPECT_EQ(0x022cd000u, regions[0].end);
-  EXPECT_EQ(0x00000000u, regions[0].offset);
-  EXPECT_EQ("[heap]", regions[0].path);
-}
-
-#if defined(ARCH_CPU_32_BITS)
-TEST(ProcMapsTest, Stack32) {
-  static const char kStack[] =
-      "beb04000-beb25000 rw-p 00000000 00:00 0 [stack]\n";
-
-  std::vector<MappedMemoryRegion> regions;
-  ASSERT_TRUE(ParseProcMaps(kStack, &regions));
-  ASSERT_EQ(1u, regions.size());
-
-  EXPECT_EQ(0xbeb04000u, regions[0].start);
-  EXPECT_EQ(0xbeb25000u, regions[0].end);
-  EXPECT_EQ(0x00000000u, regions[0].offset);
-  EXPECT_EQ("[stack]", regions[0].path);
-}
-#elif defined(ARCH_CPU_64_BITS)
-TEST(ProcMapsTest, Stack64) {
-  static const char kStack[] =
-      "7fff69c5b000-7fff69c7d000 rw-p 00000000 00:00 0 [stack]\n";
-
-  std::vector<MappedMemoryRegion> regions;
-  ASSERT_TRUE(ParseProcMaps(kStack, &regions));
-  ASSERT_EQ(1u, regions.size());
-
-  EXPECT_EQ(0x7fff69c5b000u, regions[0].start);
-  EXPECT_EQ(0x7fff69c7d000u, regions[0].end);
-  EXPECT_EQ(0x00000000u, regions[0].offset);
-  EXPECT_EQ("[stack]", regions[0].path);
-}
-#endif
-
-TEST(ProcMapsTest, Multiple) {
-  static const char kMultiple[] =
-      "00400000-0040b000 r-xp 00000000 fc:00 794418 /bin/cat\n"
-      "0060a000-0060b000 r--p 0000a000 fc:00 794418 /bin/cat\n"
-      "0060b000-0060c000 rw-p 0000b000 fc:00 794418 /bin/cat\n";
-
-  std::vector<MappedMemoryRegion> regions;
-  ASSERT_TRUE(ParseProcMaps(kMultiple, &regions));
-  ASSERT_EQ(3u, regions.size());
-
-  EXPECT_EQ(0x00400000u, regions[0].start);
-  EXPECT_EQ(0x0040b000u, regions[0].end);
-  EXPECT_EQ(0x00000000u, regions[0].offset);
-  EXPECT_EQ("/bin/cat", regions[0].path);
-
-  EXPECT_EQ(0x0060a000u, regions[1].start);
-  EXPECT_EQ(0x0060b000u, regions[1].end);
-  EXPECT_EQ(0x0000a000u, regions[1].offset);
-  EXPECT_EQ("/bin/cat", regions[1].path);
-
-  EXPECT_EQ(0x0060b000u, regions[2].start);
-  EXPECT_EQ(0x0060c000u, regions[2].end);
-  EXPECT_EQ(0x0000b000u, regions[2].offset);
-  EXPECT_EQ("/bin/cat", regions[2].path);
-}
-
-TEST(ProcMapsTest, Permissions) {
-  static struct {
-    const char* input;
-    uint8_t permissions;
-  } kTestCases[] = {
-    {"00400000-0040b000 ---s 00000000 fc:00 794418 /bin/cat\n", 0},
-    {"00400000-0040b000 ---S 00000000 fc:00 794418 /bin/cat\n", 0},
-    {"00400000-0040b000 r--s 00000000 fc:00 794418 /bin/cat\n",
-     MappedMemoryRegion::READ},
-    {"00400000-0040b000 -w-s 00000000 fc:00 794418 /bin/cat\n",
-     MappedMemoryRegion::WRITE},
-    {"00400000-0040b000 --xs 00000000 fc:00 794418 /bin/cat\n",
-     MappedMemoryRegion::EXECUTE},
-    {"00400000-0040b000 rwxs 00000000 fc:00 794418 /bin/cat\n",
-     MappedMemoryRegion::READ | MappedMemoryRegion::WRITE |
-         MappedMemoryRegion::EXECUTE},
-    {"00400000-0040b000 ---p 00000000 fc:00 794418 /bin/cat\n",
-     MappedMemoryRegion::PRIVATE},
-    {"00400000-0040b000 r--p 00000000 fc:00 794418 /bin/cat\n",
-     MappedMemoryRegion::READ | MappedMemoryRegion::PRIVATE},
-    {"00400000-0040b000 -w-p 00000000 fc:00 794418 /bin/cat\n",
-     MappedMemoryRegion::WRITE | MappedMemoryRegion::PRIVATE},
-    {"00400000-0040b000 --xp 00000000 fc:00 794418 /bin/cat\n",
-     MappedMemoryRegion::EXECUTE | MappedMemoryRegion::PRIVATE},
-    {"00400000-0040b000 rwxp 00000000 fc:00 794418 /bin/cat\n",
-     MappedMemoryRegion::READ | MappedMemoryRegion::WRITE |
-         MappedMemoryRegion::EXECUTE | MappedMemoryRegion::PRIVATE},
-  };
-
-  for (size_t i = 0; i < arraysize(kTestCases); ++i) {
-    SCOPED_TRACE(
-        base::StringPrintf("kTestCases[%zu] = %s", i, kTestCases[i].input));
-
-    std::vector<MappedMemoryRegion> regions;
-    EXPECT_TRUE(ParseProcMaps(kTestCases[i].input, &regions));
-    EXPECT_EQ(1u, regions.size());
-    if (regions.empty())
-      continue;
-    EXPECT_EQ(kTestCases[i].permissions, regions[0].permissions);
-  }
-}
-
-#if defined(ADDRESS_SANITIZER)
-// AddressSanitizer may move local variables to a dedicated "fake stack" which
-// is outside the stack region listed in /proc/self/maps. We disable ASan
-// instrumentation for this function to force the variable to be local.
-__attribute__((no_sanitize_address))
-#endif
-void CheckProcMapsRegions(const std::vector<MappedMemoryRegion> &regions) {
-  // We should be able to find both the current executable as well as the stack
-  // mapped into memory. Use the address of |exe_path| as a way of finding the
-  // stack.
-  FilePath exe_path;
-  EXPECT_TRUE(PathService::Get(FILE_EXE, &exe_path));
-  uintptr_t address = reinterpret_cast<uintptr_t>(&exe_path);
-  bool found_exe = false;
-  bool found_stack = false;
-  bool found_address = false;
-
-  for (size_t i = 0; i < regions.size(); ++i) {
-    if (regions[i].path == exe_path.value()) {
-      // It's OK to find the executable mapped multiple times as there'll be
-      // multiple sections (e.g., text, data).
-      found_exe = true;
-    }
-
-    if (regions[i].path == "[stack]") {
-// On Android the test is run on a background thread, since [stack] is for
-// the main thread, we cannot test this.
-#if !defined(OS_ANDROID)
-      EXPECT_GE(address, regions[i].start);
-      EXPECT_LT(address, regions[i].end);
-#endif
-      EXPECT_TRUE(regions[i].permissions & MappedMemoryRegion::READ);
-      EXPECT_TRUE(regions[i].permissions & MappedMemoryRegion::WRITE);
-      EXPECT_FALSE(regions[i].permissions & MappedMemoryRegion::EXECUTE);
-      EXPECT_TRUE(regions[i].permissions & MappedMemoryRegion::PRIVATE);
-      EXPECT_FALSE(found_stack) << "Found duplicate stacks";
-      found_stack = true;
-    }
-
-    if (address >= regions[i].start && address < regions[i].end) {
-      EXPECT_FALSE(found_address) << "Found same address in multiple regions";
-      found_address = true;
-    }
-  }
-
-  EXPECT_TRUE(found_exe);
-  EXPECT_TRUE(found_stack);
-  EXPECT_TRUE(found_address);
-}
-
-TEST(ProcMapsTest, ReadProcMaps) {
-  std::string proc_maps;
-  ASSERT_TRUE(ReadProcMaps(&proc_maps));
-
-  std::vector<MappedMemoryRegion> regions;
-  ASSERT_TRUE(ParseProcMaps(proc_maps, &regions));
-  ASSERT_FALSE(regions.empty());
-
-  CheckProcMapsRegions(regions);
-}
-
-TEST(ProcMapsTest, ReadProcMapsNonEmptyString) {
-  std::string old_string("I forgot to clear the string");
-  std::string proc_maps(old_string);
-  ASSERT_TRUE(ReadProcMaps(&proc_maps));
-  EXPECT_EQ(std::string::npos, proc_maps.find(old_string));
-}
-
-TEST(ProcMapsTest, MissingFields) {
-  static const char* const kTestCases[] = {
-    "00400000\n",                               // Missing end + beyond.
-    "00400000-0040b000\n",                      // Missing perms + beyond.
-    "00400000-0040b000 r-xp\n",                 // Missing offset + beyond.
-    "00400000-0040b000 r-xp 00000000\n",        // Missing device + beyond.
-    "00400000-0040b000 r-xp 00000000 fc:00\n",  // Missing inode + beyond.
-    "00400000-0040b000 00000000 fc:00 794418 /bin/cat\n",  // Missing perms.
-    "00400000-0040b000 r-xp fc:00 794418 /bin/cat\n",      // Missing offset.
-    "00400000-0040b000 r-xp 00000000 fc:00 /bin/cat\n",    // Missing inode.
-    "00400000 r-xp 00000000 fc:00 794418 /bin/cat\n",      // Missing end.
-    "-0040b000 r-xp 00000000 fc:00 794418 /bin/cat\n",     // Missing start.
-    "00400000-0040b000 r-xp 00000000 794418 /bin/cat\n",   // Missing device.
-  };
-
-  for (size_t i = 0; i < arraysize(kTestCases); ++i) {
-    SCOPED_TRACE(base::StringPrintf("kTestCases[%zu] = %s", i, kTestCases[i]));
-    std::vector<MappedMemoryRegion> regions;
-    EXPECT_FALSE(ParseProcMaps(kTestCases[i], &regions));
-  }
-}
-
-TEST(ProcMapsTest, InvalidInput) {
-  static const char* const kTestCases[] = {
-    "thisisal-0040b000 rwxp 00000000 fc:00 794418 /bin/cat\n",
-    "0040000d-linvalid rwxp 00000000 fc:00 794418 /bin/cat\n",
-    "00400000-0040b000 inpu 00000000 fc:00 794418 /bin/cat\n",
-    "00400000-0040b000 rwxp tforproc fc:00 794418 /bin/cat\n",
-    "00400000-0040b000 rwxp 00000000 ma:ps 794418 /bin/cat\n",
-    "00400000-0040b000 rwxp 00000000 fc:00 parse! /bin/cat\n",
-  };
-
-  for (size_t i = 0; i < arraysize(kTestCases); ++i) {
-    SCOPED_TRACE(base::StringPrintf("kTestCases[%zu] = %s", i, kTestCases[i]));
-    std::vector<MappedMemoryRegion> regions;
-    EXPECT_FALSE(ParseProcMaps(kTestCases[i], &regions));
-  }
-}
-
-TEST(ProcMapsTest, ParseProcMapsEmptyString) {
-  std::vector<MappedMemoryRegion> regions;
-  EXPECT_TRUE(ParseProcMaps("", &regions));
-  EXPECT_EQ(0ULL, regions.size());
-}
-
-// Testing a couple of remotely possible weird things in the input:
-// - Line ending with \r\n or \n\r.
-// - File name contains quotes.
-// - File name has whitespaces.
-TEST(ProcMapsTest, ParseProcMapsWeirdCorrectInput) {
-  std::vector<MappedMemoryRegion> regions;
-  const std::string kContents =
-    "00400000-0040b000 r-xp 00000000 fc:00 2106562 "
-      "               /bin/cat\r\n"
-    "7f53b7dad000-7f53b7f62000 r-xp 00000000 fc:00 263011 "
-      "       /lib/x86_64-linux-gnu/libc-2.15.so\n\r"
-    "7f53b816d000-7f53b818f000 r-xp 00000000 fc:00 264284 "
-      "        /lib/x86_64-linux-gnu/ld-2.15.so\n"
-    "7fff9c7ff000-7fff9c800000 r-xp 00000000 00:00 0 "
-      "               \"vd so\"\n"
-    "ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 "
-      "               [vsys call]\n";
-  EXPECT_TRUE(ParseProcMaps(kContents, &regions));
-  EXPECT_EQ(5ULL, regions.size());
-  EXPECT_EQ("/bin/cat", regions[0].path);
-  EXPECT_EQ("/lib/x86_64-linux-gnu/libc-2.15.so", regions[1].path);
-  EXPECT_EQ("/lib/x86_64-linux-gnu/ld-2.15.so", regions[2].path);
-  EXPECT_EQ("\"vd so\"", regions[3].path);
-  EXPECT_EQ("[vsys call]", regions[4].path);
-}
-
-}  // namespace debug
-}  // namespace base
diff --git a/base/debug/stack_trace_unittest.cc b/base/debug/stack_trace_unittest.cc
deleted file mode 100644
index 6d37c40..0000000
--- a/base/debug/stack_trace_unittest.cc
+++ /dev/null
@@ -1,258 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include <limits>
-#include <sstream>
-#include <string>
-
-#include "base/debug/stack_trace.h"
-#include "base/logging.h"
-#include "base/process/kill.h"
-#include "base/process/process_handle.h"
-#include "base/test/test_timeouts.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-
-#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_IOS)
-#include "base/test/multiprocess_test.h"
-#endif
-
-namespace base {
-namespace debug {
-
-#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_IOS)
-typedef MultiProcessTest StackTraceTest;
-#else
-typedef testing::Test StackTraceTest;
-#endif
-
-// Note: On Linux, this test currently only fully works on Debug builds.
-// See comments in the #ifdef soup if you intend to change this.
-#if defined(OS_WIN)
-// Always fails on Windows: crbug.com/32070
-#define MAYBE_OutputToStream DISABLED_OutputToStream
-#else
-#define MAYBE_OutputToStream OutputToStream
-#endif
-#if !defined(__UCLIBC__) && !defined(_AIX)
-TEST_F(StackTraceTest, MAYBE_OutputToStream) {
-  StackTrace trace;
-
-  // Dump the trace into a string.
-  std::ostringstream os;
-  trace.OutputToStream(&os);
-  std::string backtrace_message = os.str();
-
-  // ToString() should produce the same output.
-  EXPECT_EQ(backtrace_message, trace.ToString());
-
-#if defined(OS_POSIX) && !defined(OS_MACOSX) && NDEBUG
-  // Stack traces require an extra data table that bloats our binaries,
-  // so they're turned off for release builds.  We stop the test here,
-  // at least letting us verify that the calls don't crash.
-  return;
-#endif  // defined(OS_POSIX) && !defined(OS_MACOSX) && NDEBUG
-
-  size_t frames_found = 0;
-  trace.Addresses(&frames_found);
-  ASSERT_GE(frames_found, 5u) <<
-      "No stack frames found.  Skipping rest of test.";
-
-  // Check if the output has symbol initialization warning.  If it does, fail.
-  ASSERT_EQ(backtrace_message.find("Dumping unresolved backtrace"),
-            std::string::npos) <<
-      "Unable to resolve symbols.  Skipping rest of test.";
-
-#if defined(OS_MACOSX)
-#if 0
-  // Disabled due to -fvisibility=hidden in build config.
-
-  // Symbol resolution via the backtrace_symbol function does not work well
-  // in OS X.
-  // See this thread:
-  //
-  //    http://lists.apple.com/archives/darwin-dev/2009/Mar/msg00111.html
-  //
-  // Just check instead that we find our way back to the "start" symbol
-  // which should be the first symbol in the trace.
-  //
-  // TODO(port): Find a more reliable way to resolve symbols.
-
-  // Expect to at least find main.
-  EXPECT_TRUE(backtrace_message.find("start") != std::string::npos)
-      << "Expected to find start in backtrace:\n"
-      << backtrace_message;
-
-#endif
-#elif defined(USE_SYMBOLIZE)
-  // This branch is for gcc-compiled code, but not Mac due to the
-  // above #if.
-  // Expect a demangled symbol.
-  EXPECT_TRUE(backtrace_message.find("testing::Test::Run()") !=
-              std::string::npos)
-      << "Expected a demangled symbol in backtrace:\n"
-      << backtrace_message;
-
-#elif 0
-  // This is the fall-through case; it used to cover Windows.
-  // But it's disabled because of varying buildbot configs;
-  // some lack symbols.
-
-  // Expect to at least find main.
-  EXPECT_TRUE(backtrace_message.find("main") != std::string::npos)
-      << "Expected to find main in backtrace:\n"
-      << backtrace_message;
-
-#if defined(OS_WIN)
-// MSVC doesn't allow the use of C99's __func__ within C++, so we fake it with
-// MSVC's __FUNCTION__ macro.
-#define __func__ __FUNCTION__
-#endif
-
-  // Expect to find this function as well.
-  // Note: This will fail if not linked with -rdynamic (aka -export_dynamic)
-  EXPECT_TRUE(backtrace_message.find(__func__) != std::string::npos)
-      << "Expected to find " << __func__ << " in backtrace:\n"
-      << backtrace_message;
-
-#endif  // define(OS_MACOSX)
-}
-
-#if !defined(OFFICIAL_BUILD) && !defined(NO_UNWIND_TABLES)
-// Disabled in Official builds, where Link-Time Optimization can result in two
-// or fewer stack frames being available, causing the test to fail.
-TEST_F(StackTraceTest, TruncatedTrace) {
-  StackTrace trace;
-
-  size_t count = 0;
-  trace.Addresses(&count);
-  ASSERT_LT(2u, count);
-
-  StackTrace truncated(2);
-  truncated.Addresses(&count);
-  EXPECT_EQ(2u, count);
-}
-#endif  // !defined(OFFICIAL_BUILD)
-
-// The test is used for manual testing, e.g., to see the raw output.
-TEST_F(StackTraceTest, DebugOutputToStream) {
-  StackTrace trace;
-  std::ostringstream os;
-  trace.OutputToStream(&os);
-  VLOG(1) << os.str();
-}
-
-// The test is used for manual testing, e.g., to see the raw output.
-TEST_F(StackTraceTest, DebugPrintBacktrace) {
-  StackTrace().Print();
-}
-#endif  // !defined(__UCLIBC__)
-
-#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
-#if !defined(OS_IOS)
-static char* newArray() {
-  // Clang warns about the mismatched new[]/delete if they occur in the same
-  // function.
-  return new char[10];
-}
-
-MULTIPROCESS_TEST_MAIN(MismatchedMallocChildProcess) {
-  char* pointer = newArray();
-  delete pointer;
-  return 2;
-}
-
-// Regression test for StackDumpingSignalHandler async-signal unsafety.
-// Combined with tcmalloc's debugallocation, that signal handler
-// and e.g. mismatched new[]/delete would cause a hang because
-// of re-entering malloc.
-TEST_F(StackTraceTest, AsyncSignalUnsafeSignalHandlerHang) {
-  Process child = SpawnChild("MismatchedMallocChildProcess");
-  ASSERT_TRUE(child.IsValid());
-  int exit_code;
-  ASSERT_TRUE(
-      child.WaitForExitWithTimeout(TestTimeouts::action_timeout(), &exit_code));
-}
-#endif  // !defined(OS_IOS)
-
-namespace {
-
-std::string itoa_r_wrapper(intptr_t i, size_t sz, int base, size_t padding) {
-  char buffer[1024];
-  CHECK_LE(sz, sizeof(buffer));
-
-  char* result = internal::itoa_r(i, buffer, sz, base, padding);
-  EXPECT_TRUE(result);
-  return std::string(buffer);
-}
-
-}  // namespace
-
-TEST_F(StackTraceTest, itoa_r) {
-  EXPECT_EQ("0", itoa_r_wrapper(0, 128, 10, 0));
-  EXPECT_EQ("-1", itoa_r_wrapper(-1, 128, 10, 0));
-
-  // Test edge cases.
-  if (sizeof(intptr_t) == 4) {
-    EXPECT_EQ("ffffffff", itoa_r_wrapper(-1, 128, 16, 0));
-    EXPECT_EQ("-2147483648",
-              itoa_r_wrapper(std::numeric_limits<intptr_t>::min(), 128, 10, 0));
-    EXPECT_EQ("2147483647",
-              itoa_r_wrapper(std::numeric_limits<intptr_t>::max(), 128, 10, 0));
-
-    EXPECT_EQ("80000000",
-              itoa_r_wrapper(std::numeric_limits<intptr_t>::min(), 128, 16, 0));
-    EXPECT_EQ("7fffffff",
-              itoa_r_wrapper(std::numeric_limits<intptr_t>::max(), 128, 16, 0));
-  } else if (sizeof(intptr_t) == 8) {
-    EXPECT_EQ("ffffffffffffffff", itoa_r_wrapper(-1, 128, 16, 0));
-    EXPECT_EQ("-9223372036854775808",
-              itoa_r_wrapper(std::numeric_limits<intptr_t>::min(), 128, 10, 0));
-    EXPECT_EQ("9223372036854775807",
-              itoa_r_wrapper(std::numeric_limits<intptr_t>::max(), 128, 10, 0));
-
-    EXPECT_EQ("8000000000000000",
-              itoa_r_wrapper(std::numeric_limits<intptr_t>::min(), 128, 16, 0));
-    EXPECT_EQ("7fffffffffffffff",
-              itoa_r_wrapper(std::numeric_limits<intptr_t>::max(), 128, 16, 0));
-  } else {
-    ADD_FAILURE() << "Missing test case for your size of intptr_t ("
-                  << sizeof(intptr_t) << ")";
-  }
-
-  // Test hex output.
-  EXPECT_EQ("688", itoa_r_wrapper(0x688, 128, 16, 0));
-  EXPECT_EQ("deadbeef", itoa_r_wrapper(0xdeadbeef, 128, 16, 0));
-
-  // Check that itoa_r respects passed buffer size limit.
-  char buffer[1024];
-  EXPECT_TRUE(internal::itoa_r(0xdeadbeef, buffer, 10, 16, 0));
-  EXPECT_TRUE(internal::itoa_r(0xdeadbeef, buffer, 9, 16, 0));
-  EXPECT_FALSE(internal::itoa_r(0xdeadbeef, buffer, 8, 16, 0));
-  EXPECT_FALSE(internal::itoa_r(0xdeadbeef, buffer, 7, 16, 0));
-  EXPECT_TRUE(internal::itoa_r(0xbeef, buffer, 5, 16, 4));
-  EXPECT_FALSE(internal::itoa_r(0xbeef, buffer, 5, 16, 5));
-  EXPECT_FALSE(internal::itoa_r(0xbeef, buffer, 5, 16, 6));
-
-  // Test padding.
-  EXPECT_EQ("1", itoa_r_wrapper(1, 128, 10, 0));
-  EXPECT_EQ("1", itoa_r_wrapper(1, 128, 10, 1));
-  EXPECT_EQ("01", itoa_r_wrapper(1, 128, 10, 2));
-  EXPECT_EQ("001", itoa_r_wrapper(1, 128, 10, 3));
-  EXPECT_EQ("0001", itoa_r_wrapper(1, 128, 10, 4));
-  EXPECT_EQ("00001", itoa_r_wrapper(1, 128, 10, 5));
-  EXPECT_EQ("688", itoa_r_wrapper(0x688, 128, 16, 0));
-  EXPECT_EQ("688", itoa_r_wrapper(0x688, 128, 16, 1));
-  EXPECT_EQ("688", itoa_r_wrapper(0x688, 128, 16, 2));
-  EXPECT_EQ("688", itoa_r_wrapper(0x688, 128, 16, 3));
-  EXPECT_EQ("0688", itoa_r_wrapper(0x688, 128, 16, 4));
-  EXPECT_EQ("00688", itoa_r_wrapper(0x688, 128, 16, 5));
-}
-#endif  // defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
-
-}  // namespace debug
-}  // namespace base
diff --git a/base/debug/task_annotator_unittest.cc b/base/debug/task_annotator_unittest.cc
deleted file mode 100644
index 51a5d32..0000000
--- a/base/debug/task_annotator_unittest.cc
+++ /dev/null
@@ -1,371 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/debug/task_annotator.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/pending_task.h"
-#include "base/run_loop.h"
-#include "base/strings/stringprintf.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace debug {
-namespace {
-
-void TestTask(int* result) {
-  *result = 123;
-}
-
-}  // namespace
-
-TEST(TaskAnnotatorTest, QueueAndRunTask) {
-  int result = 0;
-  PendingTask pending_task(FROM_HERE, BindOnce(&TestTask, &result));
-
-  TaskAnnotator annotator;
-  annotator.DidQueueTask("TaskAnnotatorTest::Queue", pending_task);
-  EXPECT_EQ(0, result);
-  annotator.RunTask("TaskAnnotatorTest::Queue", &pending_task);
-  EXPECT_EQ(123, result);
-}
-
-// Test task annotator integration in base APIs and ensuing support for
-// backtraces. Tasks posted across multiple threads in this test fixture should
-// be synchronized as BeforeRunTask() and VerifyTraceAndPost() assume tasks are
-// observed in lock steps, one at a time.
-class TaskAnnotatorBacktraceIntegrationTest
-    : public ::testing::Test,
-      public TaskAnnotator::ObserverForTesting {
- public:
-  using ExpectedTrace = std::vector<const void*>;
-
-  TaskAnnotatorBacktraceIntegrationTest() = default;
-
-  ~TaskAnnotatorBacktraceIntegrationTest() override = default;
-
-  // TaskAnnotator::ObserverForTesting:
-  void BeforeRunTask(const PendingTask* pending_task) override {
-    AutoLock auto_lock(on_before_run_task_lock_);
-    last_posted_from_ = pending_task->posted_from;
-    last_task_backtrace_ = pending_task->task_backtrace;
-  }
-
-  void SetUp() override { TaskAnnotator::RegisterObserverForTesting(this); }
-
-  void TearDown() override { TaskAnnotator::ClearObserverForTesting(); }
-
-  void VerifyTraceAndPost(const scoped_refptr<SequencedTaskRunner>& task_runner,
-                          const Location& posted_from,
-                          const Location& next_from_here,
-                          const ExpectedTrace& expected_trace,
-                          OnceClosure task) {
-    SCOPED_TRACE(StringPrintf("Callback Depth: %zu", expected_trace.size()));
-
-    EXPECT_EQ(posted_from, last_posted_from_);
-    for (size_t i = 0; i < last_task_backtrace_.size(); i++) {
-      SCOPED_TRACE(StringPrintf("Trace frame: %zu", i));
-      if (i < expected_trace.size())
-        EXPECT_EQ(expected_trace[i], last_task_backtrace_[i]);
-      else
-        EXPECT_EQ(nullptr, last_task_backtrace_[i]);
-    }
-
-    task_runner->PostTask(next_from_here, std::move(task));
-  }
-
-  // Same as VerifyTraceAndPost() with the exception that it also posts a task
-  // that will prevent |task| from running until |wait_before_next_task| is
-  // signaled.
-  void VerifyTraceAndPostWithBlocker(
-      const scoped_refptr<SequencedTaskRunner>& task_runner,
-      const Location& posted_from,
-      const Location& next_from_here,
-      const ExpectedTrace& expected_trace,
-      OnceClosure task,
-      WaitableEvent* wait_before_next_task) {
-    DCHECK(wait_before_next_task);
-
-    // Need to lock to ensure the upcoming VerifyTraceAndPost() runs before the
-    // BeforeRunTask() hook for the posted WaitableEvent::Wait(). Otherwise the
-    // upcoming VerifyTraceAndPost() will race to read the state saved in the
-    // BeforeRunTask() hook preceding the current task.
-    AutoLock auto_lock(on_before_run_task_lock_);
-    task_runner->PostTask(
-        FROM_HERE,
-        BindOnce(&WaitableEvent::Wait, Unretained(wait_before_next_task)));
-    VerifyTraceAndPost(task_runner, posted_from, next_from_here, expected_trace,
-                       std::move(task));
-  }
-
- protected:
-  static void RunTwo(OnceClosure c1, OnceClosure c2) {
-    std::move(c1).Run();
-    std::move(c2).Run();
-  }
-
- private:
-  // While calls to VerifyTraceAndPost() are strictly ordered in tests below
-  // (and hence non-racy), some helper methods (e.g. Wait/Signal) do racily call
-  // into BeforeRunTask(). This Lock ensures these unobserved writes are not
-  // racing. Locking isn't required on read per the VerifyTraceAndPost()
-  // themselves being ordered.
-  Lock on_before_run_task_lock_;
-
-  Location last_posted_from_ = {};
-  std::array<const void*, 4> last_task_backtrace_ = {};
-
-  DISALLOW_COPY_AND_ASSIGN(TaskAnnotatorBacktraceIntegrationTest);
-};
-
-// Ensure the task backtrace populates correctly.
-TEST_F(TaskAnnotatorBacktraceIntegrationTest, SingleThreadedSimple) {
-  MessageLoop loop;
-  const Location location0 = FROM_HERE;
-  const Location location1 = FROM_HERE;
-  const Location location2 = FROM_HERE;
-  const Location location3 = FROM_HERE;
-  const Location location4 = FROM_HERE;
-  const Location location5 = FROM_HERE;
-
-  RunLoop run_loop;
-
-  // Task 5 has tasks 4/3/2/1 as parents (task 0 isn't visible as only the
-  // last 4 parents are kept).
-  OnceClosure task5 = BindOnce(
-      &TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-      Unretained(this), loop.task_runner(), location5, FROM_HERE,
-      ExpectedTrace({location4.program_counter(), location3.program_counter(),
-                     location2.program_counter(), location1.program_counter()}),
-      run_loop.QuitClosure());
-
-  // Task i=4/3/2/1/0 have tasks [0,i) as parents.
-  OnceClosure task4 = BindOnce(
-      &TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-      Unretained(this), loop.task_runner(), location4, location5,
-      ExpectedTrace({location3.program_counter(), location2.program_counter(),
-                     location1.program_counter(), location0.program_counter()}),
-      std::move(task5));
-  OnceClosure task3 = BindOnce(
-      &TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-      Unretained(this), loop.task_runner(), location3, location4,
-      ExpectedTrace({location2.program_counter(), location1.program_counter(),
-                     location0.program_counter()}),
-      std::move(task4));
-  OnceClosure task2 = BindOnce(
-      &TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-      Unretained(this), loop.task_runner(), location2, location3,
-      ExpectedTrace({location1.program_counter(), location0.program_counter()}),
-      std::move(task3));
-  OnceClosure task1 =
-      BindOnce(&TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-               Unretained(this), loop.task_runner(), location1, location2,
-               ExpectedTrace({location0.program_counter()}), std::move(task2));
-  OnceClosure task0 =
-      BindOnce(&TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-               Unretained(this), loop.task_runner(), location0, location1,
-               ExpectedTrace({}), std::move(task1));
-
-  loop.task_runner()->PostTask(location0, std::move(task0));
-
-  run_loop.Run();
-}
-
-// Ensure it works when posting tasks across multiple threads managed by //base.
-TEST_F(TaskAnnotatorBacktraceIntegrationTest, MultipleThreads) {
-  test::ScopedTaskEnvironment scoped_task_environment;
-
-  // Use diverse task runners (a MessageLoop on the main thread, a TaskScheduler
-  // based SequencedTaskRunner, and a TaskScheduler based
-  // SingleThreadTaskRunner) to verify that TaskAnnotator can capture backtraces
-  // for PostTasks back-and-forth between these.
-  auto main_thread_a = ThreadTaskRunnerHandle::Get();
-  auto task_runner_b = CreateSingleThreadTaskRunnerWithTraits({});
-  auto task_runner_c = CreateSequencedTaskRunnerWithTraits(
-      {base::MayBlock(), base::WithBaseSyncPrimitives()});
-
-  const Location& location_a0 = FROM_HERE;
-  const Location& location_a1 = FROM_HERE;
-  const Location& location_a2 = FROM_HERE;
-  const Location& location_a3 = FROM_HERE;
-
-  const Location& location_b0 = FROM_HERE;
-  const Location& location_b1 = FROM_HERE;
-
-  const Location& location_c0 = FROM_HERE;
-
-  RunLoop run_loop;
-
-  // All tasks below happen in lock step by nature of being posted by the
-  // previous one (plus the synchronous nature of RunTwo()) with the exception
-  // of the follow-up local task to |task_b0_local|. This WaitableEvent ensures
-  // it completes before |task_c0| runs to avoid racy invocations of
-  // BeforeRunTask()+VerifyTraceAndPost().
-  WaitableEvent lock_step(WaitableEvent::ResetPolicy::AUTOMATIC,
-                          WaitableEvent::InitialState::NOT_SIGNALED);
-
-  // Here is the execution order generated below:
-  //  A: TA0 -> TA1 \                                    TA2
-  //  B:            TB0L \ + TB0F \  Signal \           /
-  //                      ---------\--/      \         /
-  //                                \         \       /
-  //  C:                            Wait........ TC0 /
-
-  // On task runner c, post a task back to main thread that verifies its trace
-  // and terminates after one more self-post.
-  OnceClosure task_a2 = BindOnce(
-      &TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-      Unretained(this), main_thread_a, location_a2, location_a3,
-      ExpectedTrace(
-          {location_c0.program_counter(), location_b0.program_counter(),
-           location_a1.program_counter(), location_a0.program_counter()}),
-      run_loop.QuitClosure());
-  OnceClosure task_c0 =
-      BindOnce(&TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-               Unretained(this), main_thread_a, location_c0, location_a2,
-               ExpectedTrace({location_b0.program_counter(),
-                              location_a1.program_counter(),
-                              location_a0.program_counter()}),
-               std::move(task_a2));
-
-  // On task runner b run two tasks that conceptually come from the same
-  // location (managed via RunTwo().) One will post back to task runner b and
-  // another will post to task runner c to test spawning multiple tasks on
-  // different message loops. The task posted to task runner c will not get
-  // location b1 whereas the one posted back to task runner b will.
-  OnceClosure task_b0_fork = BindOnce(
-      &TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPostWithBlocker,
-      Unretained(this), task_runner_c, location_b0, location_c0,
-      ExpectedTrace(
-          {location_a1.program_counter(), location_a0.program_counter()}),
-      std::move(task_c0), &lock_step);
-  OnceClosure task_b0_local =
-      BindOnce(&TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-               Unretained(this), task_runner_b, location_b0, location_b1,
-               ExpectedTrace({location_a1.program_counter(),
-                              location_a0.program_counter()}),
-               BindOnce(&WaitableEvent::Signal, Unretained(&lock_step)));
-
-  OnceClosure task_a1 =
-      BindOnce(&TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-               Unretained(this), task_runner_b, location_a1, location_b0,
-               ExpectedTrace({location_a0.program_counter()}),
-               BindOnce(&TaskAnnotatorBacktraceIntegrationTest::RunTwo,
-                        std::move(task_b0_local), std::move(task_b0_fork)));
-  OnceClosure task_a0 =
-      BindOnce(&TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-               Unretained(this), main_thread_a, location_a0, location_a1,
-               ExpectedTrace({}), std::move(task_a1));
-
-  main_thread_a->PostTask(location_a0, std::move(task_a0));
-
-  run_loop.Run();
-}
-
-// Ensure nesting doesn't break the chain.
-TEST_F(TaskAnnotatorBacktraceIntegrationTest, SingleThreadedNested) {
-  MessageLoop loop;
-  const Location location0 = FROM_HERE;
-  const Location location1 = FROM_HERE;
-  const Location location2 = FROM_HERE;
-  const Location location3 = FROM_HERE;
-  const Location location4 = FROM_HERE;
-  const Location location5 = FROM_HERE;
-
-  RunLoop run_loop;
-
-  // Task execution below looks like this, w.r.t. to RunLoop depths:
-  // 1 : T0 \ + NRL1 \                                 ---------> T4 -> T5
-  // 2 :     ---------> T1 \ -> NRL2 \ ----> T2 -> T3 / + Quit /
-  // 3 :                    ---------> DN /
-
-  // NRL1 tests that tasks that occur at a different nesting depth than their
-  // parent have a sane backtrace nonetheless (both ways).
-
-  // NRL2 tests that posting T2 right after exiting the RunLoop (from the same
-  // task) results in NRL2 being its parent (and not the DoNothing() task that
-  // just ran -- which would have been the case if the "current task" wasn't
-  // restored properly when returning from a task within a task).
-
-  // In other words, this is regression test for a bug in the previous
-  // implementation. In the current implementation, replacing
-  //   tls_for_current_pending_task->Set(previous_pending_task);
-  // by
-  //   tls_for_current_pending_task->Set(nullptr);
-  // at the end of TaskAnnotator::RunTask() makes this test fail.
-
-  RunLoop nested_run_loop1(RunLoop::Type::kNestableTasksAllowed);
-
-  // Expectations are the same as in SingleThreadedSimple test despite the
-  // nested loop starting between tasks 0 and 1 and stopping between tasks 3 and
-  // 4.
-  OnceClosure task5 = BindOnce(
-      &TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-      Unretained(this), loop.task_runner(), location5, FROM_HERE,
-      ExpectedTrace({location4.program_counter(), location3.program_counter(),
-                     location2.program_counter(), location1.program_counter()}),
-      run_loop.QuitClosure());
-  OnceClosure task4 = BindOnce(
-      &TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-      Unretained(this), loop.task_runner(), location4, location5,
-      ExpectedTrace({location3.program_counter(), location2.program_counter(),
-                     location1.program_counter(), location0.program_counter()}),
-      std::move(task5));
-  OnceClosure task3 = BindOnce(
-      &TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-      Unretained(this), loop.task_runner(), location3, location4,
-      ExpectedTrace({location2.program_counter(), location1.program_counter(),
-                     location0.program_counter()}),
-      std::move(task4));
-
-  OnceClosure run_task_3_then_quit_nested_loop1 =
-      BindOnce(&TaskAnnotatorBacktraceIntegrationTest::RunTwo, std::move(task3),
-               nested_run_loop1.QuitClosure());
-
-  OnceClosure task2 = BindOnce(
-      &TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-      Unretained(this), loop.task_runner(), location2, location3,
-      ExpectedTrace({location1.program_counter(), location0.program_counter()}),
-      std::move(run_task_3_then_quit_nested_loop1));
-
-  // Task 1 is custom. It enters another nested RunLoop, has it do work and exit
-  // before posting the next task. This confirms that |task1| is restored as the
-  // current task before posting |task2| after returning from the nested loop.
-  RunLoop nested_run_loop2(RunLoop::Type::kNestableTasksAllowed);
-  OnceClosure task1 = BindOnce(
-      [](RunLoop* nested_run_loop, const Location& location2,
-         OnceClosure task2) {
-        ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, DoNothing());
-        nested_run_loop->RunUntilIdle();
-        ThreadTaskRunnerHandle::Get()->PostTask(location2, std::move(task2));
-      },
-      Unretained(&nested_run_loop2), location2, std::move(task2));
-
-  OnceClosure task0 =
-      BindOnce(&TaskAnnotatorBacktraceIntegrationTest::VerifyTraceAndPost,
-               Unretained(this), loop.task_runner(), location0, location1,
-               ExpectedTrace({}), std::move(task1));
-
-  loop.task_runner()->PostTask(location0, std::move(task0));
-  loop.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&RunLoop::Run, Unretained(&nested_run_loop1)));
-
-  run_loop.Run();
-}
-
-}  // namespace debug
-}  // namespace base
diff --git a/base/debug/thread_heap_usage_tracker_unittest.cc b/base/debug/thread_heap_usage_tracker_unittest.cc
deleted file mode 100644
index fc7fda4..0000000
--- a/base/debug/thread_heap_usage_tracker_unittest.cc
+++ /dev/null
@@ -1,556 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/debug/thread_heap_usage_tracker.h"
-
-#include <map>
-
-#include "base/allocator/allocator_shim.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_MACOSX)
-#include "base/allocator/allocator_interception_mac.h"
-#endif
-
-namespace base {
-namespace debug {
-
-namespace {
-
-class TestingThreadHeapUsageTracker : public ThreadHeapUsageTracker {
- public:
-  using ThreadHeapUsageTracker::DisableHeapTrackingForTesting;
-  using ThreadHeapUsageTracker::EnsureTLSInitialized;
-  using ThreadHeapUsageTracker::GetDispatchForTesting;
-};
-
-// A fixture class that allows testing the AllocatorDispatch associated with
-// the ThreadHeapUsageTracker class in isolation against a mocked
-// underlying
-// heap implementation.
-class ThreadHeapUsageTrackerTest : public testing::Test {
- public:
-  using AllocatorDispatch = base::allocator::AllocatorDispatch;
-
-  static const size_t kAllocationPadding;
-  enum SizeFunctionKind {
-    EXACT_SIZE_FUNCTION,
-    PADDING_SIZE_FUNCTION,
-    ZERO_SIZE_FUNCTION,
-  };
-
-  ThreadHeapUsageTrackerTest() : size_function_kind_(EXACT_SIZE_FUNCTION) {
-    EXPECT_EQ(nullptr, g_self);
-    g_self = this;
-  }
-
-  ~ThreadHeapUsageTrackerTest() override {
-    EXPECT_EQ(this, g_self);
-    g_self = nullptr;
-  }
-
-  void set_size_function_kind(SizeFunctionKind kind) {
-    size_function_kind_ = kind;
-  }
-
-  void SetUp() override {
-    TestingThreadHeapUsageTracker::EnsureTLSInitialized();
-
-    dispatch_under_test_ =
-        TestingThreadHeapUsageTracker::GetDispatchForTesting();
-    ASSERT_EQ(nullptr, dispatch_under_test_->next);
-
-    dispatch_under_test_->next = &g_mock_dispatch;
-  }
-
-  void TearDown() override {
-    ASSERT_EQ(&g_mock_dispatch, dispatch_under_test_->next);
-
-    dispatch_under_test_->next = nullptr;
-  }
-
-  void* MockMalloc(size_t size) {
-    return dispatch_under_test_->alloc_function(dispatch_under_test_, size,
-                                                nullptr);
-  }
-
-  void* MockCalloc(size_t n, size_t size) {
-    return dispatch_under_test_->alloc_zero_initialized_function(
-        dispatch_under_test_, n, size, nullptr);
-  }
-
-  void* MockAllocAligned(size_t alignment, size_t size) {
-    return dispatch_under_test_->alloc_aligned_function(
-        dispatch_under_test_, alignment, size, nullptr);
-  }
-
-  void* MockRealloc(void* address, size_t size) {
-    return dispatch_under_test_->realloc_function(dispatch_under_test_, address,
-                                                  size, nullptr);
-  }
-
-  void MockFree(void* address) {
-    dispatch_under_test_->free_function(dispatch_under_test_, address, nullptr);
-  }
-
-  size_t MockGetSizeEstimate(void* address) {
-    return dispatch_under_test_->get_size_estimate_function(
-        dispatch_under_test_, address, nullptr);
-  }
-
- private:
-  void RecordAlloc(void* address, size_t size) {
-    if (address != nullptr)
-      allocation_size_map_[address] = size;
-  }
-
-  void DeleteAlloc(void* address) {
-    if (address != nullptr)
-      EXPECT_EQ(1U, allocation_size_map_.erase(address));
-  }
-
-  size_t GetSizeEstimate(void* address) {
-    auto it = allocation_size_map_.find(address);
-    if (it == allocation_size_map_.end())
-      return 0;
-
-    size_t ret = it->second;
-    switch (size_function_kind_) {
-      case EXACT_SIZE_FUNCTION:
-        break;
-      case PADDING_SIZE_FUNCTION:
-        ret += kAllocationPadding;
-        break;
-      case ZERO_SIZE_FUNCTION:
-        ret = 0;
-        break;
-    }
-
-    return ret;
-  }
-
-  static void* OnAllocFn(const AllocatorDispatch* self,
-                         size_t size,
-                         void* context) {
-    EXPECT_EQ(&g_mock_dispatch, self);
-
-    void* ret = malloc(size);
-    g_self->RecordAlloc(ret, size);
-    return ret;
-  }
-
-  static void* OnAllocZeroInitializedFn(const AllocatorDispatch* self,
-                                        size_t n,
-                                        size_t size,
-                                        void* context) {
-    EXPECT_EQ(&g_mock_dispatch, self);
-
-    void* ret = calloc(n, size);
-    g_self->RecordAlloc(ret, n * size);
-    return ret;
-  }
-
-  static void* OnAllocAlignedFn(const AllocatorDispatch* self,
-                                size_t alignment,
-                                size_t size,
-                                void* context) {
-    EXPECT_EQ(&g_mock_dispatch, self);
-
-    // This is a cheat as it doesn't return aligned allocations. This has the
-    // advantage of working for all platforms for this test.
-    void* ret = malloc(size);
-    g_self->RecordAlloc(ret, size);
-    return ret;
-  }
-
-  static void* OnReallocFn(const AllocatorDispatch* self,
-                           void* address,
-                           size_t size,
-                           void* context) {
-    EXPECT_EQ(&g_mock_dispatch, self);
-
-    g_self->DeleteAlloc(address);
-    void* ret = realloc(address, size);
-    g_self->RecordAlloc(ret, size);
-    return ret;
-  }
-
-  static void OnFreeFn(const AllocatorDispatch* self,
-                       void* address,
-                       void* context) {
-    EXPECT_EQ(&g_mock_dispatch, self);
-
-    g_self->DeleteAlloc(address);
-    free(address);
-  }
-
-  static size_t OnGetSizeEstimateFn(const AllocatorDispatch* self,
-                                    void* address,
-                                    void* context) {
-    EXPECT_EQ(&g_mock_dispatch, self);
-
-    return g_self->GetSizeEstimate(address);
-  }
-
-  using AllocationSizeMap = std::map<void*, size_t>;
-
-  SizeFunctionKind size_function_kind_;
-  AllocationSizeMap allocation_size_map_;
-  AllocatorDispatch* dispatch_under_test_;
-
-  static base::allocator::AllocatorDispatch g_mock_dispatch;
-  static ThreadHeapUsageTrackerTest* g_self;
-};
-
-const size_t ThreadHeapUsageTrackerTest::kAllocationPadding = 23;
-
-ThreadHeapUsageTrackerTest* ThreadHeapUsageTrackerTest::g_self = nullptr;
-
-base::allocator::AllocatorDispatch ThreadHeapUsageTrackerTest::g_mock_dispatch =
-    {
-        &ThreadHeapUsageTrackerTest::OnAllocFn,  // alloc_function
-        &ThreadHeapUsageTrackerTest::
-            OnAllocZeroInitializedFn,  // alloc_zero_initialized_function
-        &ThreadHeapUsageTrackerTest::
-            OnAllocAlignedFn,                      // alloc_aligned_function
-        &ThreadHeapUsageTrackerTest::OnReallocFn,  // realloc_function
-        &ThreadHeapUsageTrackerTest::OnFreeFn,     // free_function
-        &ThreadHeapUsageTrackerTest::
-            OnGetSizeEstimateFn,  // get_size_estimate_function
-        nullptr,                  // batch_malloc
-        nullptr,                  // batch_free
-        nullptr,                  // free_definite_size_function
-        nullptr,                  // next
-};
-
-}  // namespace
-
-TEST_F(ThreadHeapUsageTrackerTest, SimpleUsageWithExactSizeFunction) {
-  set_size_function_kind(EXACT_SIZE_FUNCTION);
-
-  ThreadHeapUsageTracker usage_tracker;
-  usage_tracker.Start();
-
-  ThreadHeapUsage u1 = ThreadHeapUsageTracker::GetUsageSnapshot();
-
-  EXPECT_EQ(0U, u1.alloc_ops);
-  EXPECT_EQ(0U, u1.alloc_bytes);
-  EXPECT_EQ(0U, u1.alloc_overhead_bytes);
-  EXPECT_EQ(0U, u1.free_ops);
-  EXPECT_EQ(0U, u1.free_bytes);
-  EXPECT_EQ(0U, u1.max_allocated_bytes);
-
-  const size_t kAllocSize = 1029U;
-  void* ptr = MockMalloc(kAllocSize);
-  MockFree(ptr);
-
-  usage_tracker.Stop(false);
-  ThreadHeapUsage u2 = usage_tracker.usage();
-
-  EXPECT_EQ(1U, u2.alloc_ops);
-  EXPECT_EQ(kAllocSize, u2.alloc_bytes);
-  EXPECT_EQ(0U, u2.alloc_overhead_bytes);
-  EXPECT_EQ(1U, u2.free_ops);
-  EXPECT_EQ(kAllocSize, u2.free_bytes);
-  EXPECT_EQ(kAllocSize, u2.max_allocated_bytes);
-}
-
-TEST_F(ThreadHeapUsageTrackerTest, SimpleUsageWithPaddingSizeFunction) {
-  set_size_function_kind(PADDING_SIZE_FUNCTION);
-
-  ThreadHeapUsageTracker usage_tracker;
-  usage_tracker.Start();
-
-  ThreadHeapUsage u1 = ThreadHeapUsageTracker::GetUsageSnapshot();
-
-  EXPECT_EQ(0U, u1.alloc_ops);
-  EXPECT_EQ(0U, u1.alloc_bytes);
-  EXPECT_EQ(0U, u1.alloc_overhead_bytes);
-  EXPECT_EQ(0U, u1.free_ops);
-  EXPECT_EQ(0U, u1.free_bytes);
-  EXPECT_EQ(0U, u1.max_allocated_bytes);
-
-  const size_t kAllocSize = 1029U;
-  void* ptr = MockMalloc(kAllocSize);
-  MockFree(ptr);
-
-  usage_tracker.Stop(false);
-  ThreadHeapUsage u2 = usage_tracker.usage();
-
-  EXPECT_EQ(1U, u2.alloc_ops);
-  EXPECT_EQ(kAllocSize + kAllocationPadding, u2.alloc_bytes);
-  EXPECT_EQ(kAllocationPadding, u2.alloc_overhead_bytes);
-  EXPECT_EQ(1U, u2.free_ops);
-  EXPECT_EQ(kAllocSize + kAllocationPadding, u2.free_bytes);
-  EXPECT_EQ(kAllocSize + kAllocationPadding, u2.max_allocated_bytes);
-}
-
-TEST_F(ThreadHeapUsageTrackerTest, SimpleUsageWithZeroSizeFunction) {
-  set_size_function_kind(ZERO_SIZE_FUNCTION);
-
-  ThreadHeapUsageTracker usage_tracker;
-  usage_tracker.Start();
-
-  ThreadHeapUsage u1 = ThreadHeapUsageTracker::GetUsageSnapshot();
-  EXPECT_EQ(0U, u1.alloc_ops);
-  EXPECT_EQ(0U, u1.alloc_bytes);
-  EXPECT_EQ(0U, u1.alloc_overhead_bytes);
-  EXPECT_EQ(0U, u1.free_ops);
-  EXPECT_EQ(0U, u1.free_bytes);
-  EXPECT_EQ(0U, u1.max_allocated_bytes);
-
-  const size_t kAllocSize = 1029U;
-  void* ptr = MockMalloc(kAllocSize);
-  MockFree(ptr);
-
-  usage_tracker.Stop(false);
-  ThreadHeapUsage u2 = usage_tracker.usage();
-
-  // With a get-size function that returns zero, there's no way to get the size
-  // of an allocation that's being freed, hence the shim can't tally freed bytes
-  // nor the high-watermark allocated bytes.
-  EXPECT_EQ(1U, u2.alloc_ops);
-  EXPECT_EQ(kAllocSize, u2.alloc_bytes);
-  EXPECT_EQ(0U, u2.alloc_overhead_bytes);
-  EXPECT_EQ(1U, u2.free_ops);
-  EXPECT_EQ(0U, u2.free_bytes);
-  EXPECT_EQ(0U, u2.max_allocated_bytes);
-}
-
-TEST_F(ThreadHeapUsageTrackerTest, ReallocCorrectlyTallied) {
-  const size_t kAllocSize = 237U;
-
-  {
-    ThreadHeapUsageTracker usage_tracker;
-    usage_tracker.Start();
-
-    // Reallocating nullptr should count as a single alloc.
-    void* ptr = MockRealloc(nullptr, kAllocSize);
-    ThreadHeapUsage usage = ThreadHeapUsageTracker::GetUsageSnapshot();
-    EXPECT_EQ(1U, usage.alloc_ops);
-    EXPECT_EQ(kAllocSize, usage.alloc_bytes);
-    EXPECT_EQ(0U, usage.alloc_overhead_bytes);
-    EXPECT_EQ(0U, usage.free_ops);
-    EXPECT_EQ(0U, usage.free_bytes);
-    EXPECT_EQ(kAllocSize, usage.max_allocated_bytes);
-
-    // Reallocating a valid pointer to a zero size should count as a single
-    // free.
-    ptr = MockRealloc(ptr, 0U);
-
-    usage_tracker.Stop(false);
-    EXPECT_EQ(1U, usage_tracker.usage().alloc_ops);
-    EXPECT_EQ(kAllocSize, usage_tracker.usage().alloc_bytes);
-    EXPECT_EQ(0U, usage_tracker.usage().alloc_overhead_bytes);
-    EXPECT_EQ(1U, usage_tracker.usage().free_ops);
-    EXPECT_EQ(kAllocSize, usage_tracker.usage().free_bytes);
-    EXPECT_EQ(kAllocSize, usage_tracker.usage().max_allocated_bytes);
-
-    // Realloc to zero size may or may not return a nullptr - make sure to
-    // free the zero-size alloc in the latter case.
-    if (ptr != nullptr)
-      MockFree(ptr);
-  }
-
-  {
-    ThreadHeapUsageTracker usage_tracker;
-    usage_tracker.Start();
-
-    void* ptr = MockMalloc(kAllocSize);
-    ThreadHeapUsage usage = ThreadHeapUsageTracker::GetUsageSnapshot();
-    EXPECT_EQ(1U, usage.alloc_ops);
-
-    // Now try reallocating a valid pointer to a larger size, this should count
-    // as one free and one alloc.
-    const size_t kLargerAllocSize = kAllocSize + 928U;
-    ptr = MockRealloc(ptr, kLargerAllocSize);
-
-    usage_tracker.Stop(false);
-    EXPECT_EQ(2U, usage_tracker.usage().alloc_ops);
-    EXPECT_EQ(kAllocSize + kLargerAllocSize, usage_tracker.usage().alloc_bytes);
-    EXPECT_EQ(0U, usage_tracker.usage().alloc_overhead_bytes);
-    EXPECT_EQ(1U, usage_tracker.usage().free_ops);
-    EXPECT_EQ(kAllocSize, usage_tracker.usage().free_bytes);
-    EXPECT_EQ(kLargerAllocSize, usage_tracker.usage().max_allocated_bytes);
-
-    MockFree(ptr);
-  }
-}
-
-TEST_F(ThreadHeapUsageTrackerTest, NestedMaxWorks) {
-  ThreadHeapUsageTracker usage_tracker;
-  usage_tracker.Start();
-
-  const size_t kOuterAllocSize = 1029U;
-  void* ptr = MockMalloc(kOuterAllocSize);
-  MockFree(ptr);
-
-  EXPECT_EQ(kOuterAllocSize,
-            ThreadHeapUsageTracker::GetUsageSnapshot().max_allocated_bytes);
-
-  {
-    ThreadHeapUsageTracker inner_usage_tracker;
-    inner_usage_tracker.Start();
-
-    const size_t kInnerAllocSize = 673U;
-    ptr = MockMalloc(kInnerAllocSize);
-    MockFree(ptr);
-
-    inner_usage_tracker.Stop(false);
-
-    EXPECT_EQ(kInnerAllocSize, inner_usage_tracker.usage().max_allocated_bytes);
-  }
-
-  // The greater, outer allocation size should have been restored.
-  EXPECT_EQ(kOuterAllocSize,
-            ThreadHeapUsageTracker::GetUsageSnapshot().max_allocated_bytes);
-
-  const size_t kLargerInnerAllocSize = kOuterAllocSize + 673U;
-  {
-    ThreadHeapUsageTracker inner_usage_tracker;
-    inner_usage_tracker.Start();
-
-    ptr = MockMalloc(kLargerInnerAllocSize);
-    MockFree(ptr);
-
-    inner_usage_tracker.Stop(false);
-    EXPECT_EQ(kLargerInnerAllocSize,
-              inner_usage_tracker.usage().max_allocated_bytes);
-  }
-
-  // The greater, inner allocation size should have been preserved.
-  EXPECT_EQ(kLargerInnerAllocSize,
-            ThreadHeapUsageTracker::GetUsageSnapshot().max_allocated_bytes);
-
-  // Now try the case with an outstanding net alloc size when entering the
-  // inner scope.
-  void* outer_ptr = MockMalloc(kOuterAllocSize);
-  EXPECT_EQ(kLargerInnerAllocSize,
-            ThreadHeapUsageTracker::GetUsageSnapshot().max_allocated_bytes);
-  {
-    ThreadHeapUsageTracker inner_usage_tracker;
-    inner_usage_tracker.Start();
-
-    ptr = MockMalloc(kLargerInnerAllocSize);
-    MockFree(ptr);
-
-    inner_usage_tracker.Stop(false);
-    EXPECT_EQ(kLargerInnerAllocSize,
-              inner_usage_tracker.usage().max_allocated_bytes);
-  }
-
-  // While the inner scope saw only the inner net outstanding allocation size,
-  // the outer scope saw both outstanding at the same time.
-  EXPECT_EQ(kOuterAllocSize + kLargerInnerAllocSize,
-            ThreadHeapUsageTracker::GetUsageSnapshot().max_allocated_bytes);
-
-  MockFree(outer_ptr);
-
-  // Test a net-negative scope.
-  ptr = MockMalloc(kLargerInnerAllocSize);
-  {
-    ThreadHeapUsageTracker inner_usage_tracker;
-    inner_usage_tracker.Start();
-
-    MockFree(ptr);
-
-    const size_t kInnerAllocSize = 1;
-    ptr = MockMalloc(kInnerAllocSize);
-
-    inner_usage_tracker.Stop(false);
-    // Since the scope is still net-negative, the max is clamped at zero.
-    EXPECT_EQ(0U, inner_usage_tracker.usage().max_allocated_bytes);
-  }
-
-  MockFree(ptr);
-}
-
-TEST_F(ThreadHeapUsageTrackerTest, NoStopImpliesInclusive) {
-  ThreadHeapUsageTracker usage_tracker;
-  usage_tracker.Start();
-
-  const size_t kOuterAllocSize = 1029U;
-  void* ptr = MockMalloc(kOuterAllocSize);
-  MockFree(ptr);
-
-  ThreadHeapUsage usage = ThreadHeapUsageTracker::GetUsageSnapshot();
-  EXPECT_EQ(kOuterAllocSize, usage.max_allocated_bytes);
-
-  const size_t kInnerLargerAllocSize = kOuterAllocSize + 673U;
-
-  {
-    ThreadHeapUsageTracker inner_usage_tracker;
-    inner_usage_tracker.Start();
-
-    // Make a larger allocation than the outer scope.
-    ptr = MockMalloc(kInnerLargerAllocSize);
-    MockFree(ptr);
-
-    // inner_usage_tracker goes out of scope without a Stop().
-  }
-
-  ThreadHeapUsage current = ThreadHeapUsageTracker::GetUsageSnapshot();
-  EXPECT_EQ(usage.alloc_ops + 1, current.alloc_ops);
-  EXPECT_EQ(usage.alloc_bytes + kInnerLargerAllocSize, current.alloc_bytes);
-  EXPECT_EQ(usage.free_ops + 1, current.free_ops);
-  EXPECT_EQ(usage.free_bytes + kInnerLargerAllocSize, current.free_bytes);
-  EXPECT_EQ(kInnerLargerAllocSize, current.max_allocated_bytes);
-}
-
-TEST_F(ThreadHeapUsageTrackerTest, ExclusiveScopesWork) {
-  ThreadHeapUsageTracker usage_tracker;
-  usage_tracker.Start();
-
-  const size_t kOuterAllocSize = 1029U;
-  void* ptr = MockMalloc(kOuterAllocSize);
-  MockFree(ptr);
-
-  ThreadHeapUsage usage = ThreadHeapUsageTracker::GetUsageSnapshot();
-  EXPECT_EQ(kOuterAllocSize, usage.max_allocated_bytes);
-
-  {
-    ThreadHeapUsageTracker inner_usage_tracker;
-    inner_usage_tracker.Start();
-
-    // Make a larger allocation than the outer scope.
-    ptr = MockMalloc(kOuterAllocSize + 673U);
-    MockFree(ptr);
-
-    // This tracker is exlusive, all activity should be private to this scope.
-    inner_usage_tracker.Stop(true);
-  }
-
-  ThreadHeapUsage current = ThreadHeapUsageTracker::GetUsageSnapshot();
-  EXPECT_EQ(usage.alloc_ops, current.alloc_ops);
-  EXPECT_EQ(usage.alloc_bytes, current.alloc_bytes);
-  EXPECT_EQ(usage.alloc_overhead_bytes, current.alloc_overhead_bytes);
-  EXPECT_EQ(usage.free_ops, current.free_ops);
-  EXPECT_EQ(usage.free_bytes, current.free_bytes);
-  EXPECT_EQ(usage.max_allocated_bytes, current.max_allocated_bytes);
-}
-
-TEST_F(ThreadHeapUsageTrackerTest, AllShimFunctionsAreProvided) {
-  const size_t kAllocSize = 100;
-  void* alloc = MockMalloc(kAllocSize);
-  size_t estimate = MockGetSizeEstimate(alloc);
-  ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize);
-  MockFree(alloc);
-
-  alloc = MockCalloc(kAllocSize, 1);
-  estimate = MockGetSizeEstimate(alloc);
-  ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize);
-  MockFree(alloc);
-
-  alloc = MockAllocAligned(1, kAllocSize);
-  estimate = MockGetSizeEstimate(alloc);
-  ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize);
-
-  alloc = MockRealloc(alloc, kAllocSize);
-  estimate = MockGetSizeEstimate(alloc);
-  ASSERT_TRUE(estimate == 0 || estimate >= kAllocSize);
-  MockFree(alloc);
-}
-
-}  // namespace debug
-}  // namespace base
diff --git a/base/deferred_sequenced_task_runner_unittest.cc b/base/deferred_sequenced_task_runner_unittest.cc
deleted file mode 100644
index 5cb220f..0000000
--- a/base/deferred_sequenced_task_runner_unittest.cc
+++ /dev/null
@@ -1,214 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/deferred_sequenced_task_runner.h"
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback_forward.h"
-#include "base/location.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-class DeferredSequencedTaskRunnerTest : public testing::Test {
- public:
-  class ExecuteTaskOnDestructor : public RefCounted<ExecuteTaskOnDestructor> {
-   public:
-    ExecuteTaskOnDestructor(
-        DeferredSequencedTaskRunnerTest* executor,
-        int task_id)
-        : executor_(executor),
-          task_id_(task_id) {
-    }
-  private:
-   friend class RefCounted<ExecuteTaskOnDestructor>;
-   virtual ~ExecuteTaskOnDestructor() { executor_->ExecuteTask(task_id_); }
-   DeferredSequencedTaskRunnerTest* executor_;
-   int task_id_;
-  };
-
-  void ExecuteTask(int task_id) {
-    AutoLock lock(lock_);
-    executed_task_ids_.push_back(task_id);
-  }
-
-  void PostExecuteTask(int task_id) {
-    runner_->PostTask(FROM_HERE,
-                      BindOnce(&DeferredSequencedTaskRunnerTest::ExecuteTask,
-                               Unretained(this), task_id));
-  }
-
-  void StartRunner() {
-    runner_->Start();
-  }
-
-  void DoNothing(ExecuteTaskOnDestructor* object) {
-  }
-
- protected:
-  DeferredSequencedTaskRunnerTest()
-      : loop_(),
-        runner_(new DeferredSequencedTaskRunner(loop_.task_runner())) {}
-
-  MessageLoop loop_;
-  scoped_refptr<DeferredSequencedTaskRunner> runner_;
-  mutable Lock lock_;
-  std::vector<int> executed_task_ids_;
-};
-
-TEST_F(DeferredSequencedTaskRunnerTest, Stopped) {
-  PostExecuteTask(1);
-  RunLoop().RunUntilIdle();
-  EXPECT_THAT(executed_task_ids_, testing::ElementsAre());
-}
-
-TEST_F(DeferredSequencedTaskRunnerTest, Start) {
-  StartRunner();
-  PostExecuteTask(1);
-  RunLoop().RunUntilIdle();
-  EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1));
-}
-
-TEST_F(DeferredSequencedTaskRunnerTest, StartWithMultipleElements) {
-  StartRunner();
-  for (int i = 1; i < 5; ++i)
-    PostExecuteTask(i);
-
-  RunLoop().RunUntilIdle();
-  EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4));
-}
-
-TEST_F(DeferredSequencedTaskRunnerTest, DeferredStart) {
-  PostExecuteTask(1);
-  RunLoop().RunUntilIdle();
-  EXPECT_THAT(executed_task_ids_, testing::ElementsAre());
-
-  StartRunner();
-  RunLoop().RunUntilIdle();
-  EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1));
-
-  PostExecuteTask(2);
-  RunLoop().RunUntilIdle();
-  EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2));
-}
-
-TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleElements) {
-  for (int i = 1; i < 5; ++i)
-    PostExecuteTask(i);
-  RunLoop().RunUntilIdle();
-  EXPECT_THAT(executed_task_ids_, testing::ElementsAre());
-
-  StartRunner();
-  for (int i = 5; i < 9; ++i)
-    PostExecuteTask(i);
-  RunLoop().RunUntilIdle();
-  EXPECT_THAT(executed_task_ids_, testing::ElementsAre(1, 2, 3, 4, 5, 6, 7, 8));
-}
-
-TEST_F(DeferredSequencedTaskRunnerTest, DeferredStartWithMultipleThreads) {
-  {
-    Thread thread1("DeferredSequencedTaskRunnerTestThread1");
-    Thread thread2("DeferredSequencedTaskRunnerTestThread2");
-    thread1.Start();
-    thread2.Start();
-    for (int i = 0; i < 5; ++i) {
-      thread1.task_runner()->PostTask(
-          FROM_HERE, BindOnce(&DeferredSequencedTaskRunnerTest::PostExecuteTask,
-                              Unretained(this), 2 * i));
-      thread2.task_runner()->PostTask(
-          FROM_HERE, BindOnce(&DeferredSequencedTaskRunnerTest::PostExecuteTask,
-                              Unretained(this), 2 * i + 1));
-      if (i == 2) {
-        thread1.task_runner()->PostTask(
-            FROM_HERE, BindOnce(&DeferredSequencedTaskRunnerTest::StartRunner,
-                                Unretained(this)));
-      }
-    }
-  }
-
-  RunLoop().RunUntilIdle();
-  EXPECT_THAT(executed_task_ids_,
-      testing::WhenSorted(testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)));
-}
-
-TEST_F(DeferredSequencedTaskRunnerTest, ObjectDestructionOrder) {
-  {
-    Thread thread("DeferredSequencedTaskRunnerTestThread");
-    thread.Start();
-    runner_ = new DeferredSequencedTaskRunner(thread.task_runner());
-    for (int i = 0; i < 5; ++i) {
-      {
-        // Use a block to ensure that no reference to |short_lived_object|
-        // is kept on the main thread after it is posted to |runner_|.
-        scoped_refptr<ExecuteTaskOnDestructor> short_lived_object =
-            new ExecuteTaskOnDestructor(this, 2 * i);
-        runner_->PostTask(
-            FROM_HERE,
-            BindOnce(&DeferredSequencedTaskRunnerTest::DoNothing,
-                     Unretained(this), RetainedRef(short_lived_object)));
-      }
-      // |short_lived_object| with id |2 * i| should be destroyed before the
-      // task |2 * i + 1| is executed.
-      PostExecuteTask(2 * i + 1);
-    }
-    StartRunner();
-  }
-
-  // All |short_lived_object| with id |2 * i| are destroyed before the task
-  // |2 * i + 1| is executed.
-  EXPECT_THAT(executed_task_ids_,
-              testing::ElementsAre(0, 1, 2, 3, 4, 5, 6, 7, 8, 9));
-}
-
-void GetRunsTasksInCurrentSequence(bool* result,
-                                   scoped_refptr<SequencedTaskRunner> runner,
-                                   OnceClosure quit) {
-  *result = runner->RunsTasksInCurrentSequence();
-  std::move(quit).Run();
-}
-
-TEST_F(DeferredSequencedTaskRunnerTest, RunsTasksInCurrentSequence) {
-  scoped_refptr<DeferredSequencedTaskRunner> runner =
-      MakeRefCounted<DeferredSequencedTaskRunner>();
-  EXPECT_TRUE(runner->RunsTasksInCurrentSequence());
-
-  Thread thread1("DeferredSequencedTaskRunnerTestThread1");
-  thread1.Start();
-  bool runs_task_in_current_thread = true;
-  base::RunLoop run_loop;
-  thread1.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(&GetRunsTasksInCurrentSequence, &runs_task_in_current_thread,
-               runner, run_loop.QuitClosure()));
-  run_loop.Run();
-  EXPECT_FALSE(runs_task_in_current_thread);
-}
-
-TEST_F(DeferredSequencedTaskRunnerTest, StartWithTaskRunner) {
-  scoped_refptr<DeferredSequencedTaskRunner> runner =
-      MakeRefCounted<DeferredSequencedTaskRunner>();
-  bool run_called = false;
-  base::RunLoop run_loop;
-  runner->PostTask(FROM_HERE,
-                   BindOnce(
-                       [](bool* run_called, base::Closure quit_closure) {
-                         *run_called = true;
-                         std::move(quit_closure).Run();
-                       },
-                       &run_called, run_loop.QuitClosure()));
-  runner->StartWithTaskRunner(loop_.task_runner());
-  run_loop.Run();
-  EXPECT_TRUE(run_called);
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/environment_unittest.cc b/base/environment_unittest.cc
deleted file mode 100644
index 79800ad..0000000
--- a/base/environment_unittest.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/environment.h"
-
-#include <memory>
-
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-typedef PlatformTest EnvironmentTest;
-
-namespace base {
-
-namespace {
-
-constexpr char kValidEnvironmentVariable[] = "PATH";
-
-}  // namespace
-
-TEST_F(EnvironmentTest, GetVar) {
-  std::unique_ptr<Environment> env(Environment::Create());
-  std::string env_value;
-  EXPECT_TRUE(env->GetVar(kValidEnvironmentVariable, &env_value));
-  EXPECT_NE(env_value, "");
-}
-
-TEST_F(EnvironmentTest, GetVarReverse) {
-  std::unique_ptr<Environment> env(Environment::Create());
-  const char kFooUpper[] = "FOO";
-  const char kFooLower[] = "foo";
-
-  // Set a variable in UPPER case.
-  EXPECT_TRUE(env->SetVar(kFooUpper, kFooLower));
-
-  // And then try to get this variable passing the lower case.
-  std::string env_value;
-  EXPECT_TRUE(env->GetVar(kFooLower, &env_value));
-
-  EXPECT_STREQ(env_value.c_str(), kFooLower);
-
-  EXPECT_TRUE(env->UnSetVar(kFooUpper));
-
-  const char kBar[] = "bar";
-  // Now do the opposite, set the variable in the lower case.
-  EXPECT_TRUE(env->SetVar(kFooLower, kBar));
-
-  // And then try to get this variable passing the UPPER case.
-  EXPECT_TRUE(env->GetVar(kFooUpper, &env_value));
-
-  EXPECT_STREQ(env_value.c_str(), kBar);
-
-  EXPECT_TRUE(env->UnSetVar(kFooLower));
-}
-
-TEST_F(EnvironmentTest, HasVar) {
-  std::unique_ptr<Environment> env(Environment::Create());
-  EXPECT_TRUE(env->HasVar(kValidEnvironmentVariable));
-}
-
-TEST_F(EnvironmentTest, SetVar) {
-  std::unique_ptr<Environment> env(Environment::Create());
-
-  const char kFooUpper[] = "FOO";
-  const char kFooLower[] = "foo";
-  EXPECT_TRUE(env->SetVar(kFooUpper, kFooLower));
-
-  // Now verify that the environment has the new variable.
-  EXPECT_TRUE(env->HasVar(kFooUpper));
-
-  std::string var_value;
-  EXPECT_TRUE(env->GetVar(kFooUpper, &var_value));
-  EXPECT_EQ(var_value, kFooLower);
-}
-
-TEST_F(EnvironmentTest, UnSetVar) {
-  std::unique_ptr<Environment> env(Environment::Create());
-
-  const char kFooUpper[] = "FOO";
-  const char kFooLower[] = "foo";
-  // First set some environment variable.
-  EXPECT_TRUE(env->SetVar(kFooUpper, kFooLower));
-
-  // Now verify that the environment has the new variable.
-  EXPECT_TRUE(env->HasVar(kFooUpper));
-
-  // Finally verify that the environment variable was erased.
-  EXPECT_TRUE(env->UnSetVar(kFooUpper));
-
-  // And check that the variable has been unset.
-  EXPECT_FALSE(env->HasVar(kFooUpper));
-}
-
-#if defined(OS_WIN)
-
-TEST_F(EnvironmentTest, AlterEnvironment) {
-  const wchar_t empty[] = L"\0";
-  const wchar_t a2[] = L"A=2\0";
-  EnvironmentMap changes;
-  string16 e;
-
-  e = AlterEnvironment(empty, changes);
-  EXPECT_EQ(0, e[0]);
-
-  changes[L"A"] = L"1";
-  e = AlterEnvironment(empty, changes);
-  EXPECT_EQ(string16(L"A=1\0\0", 5), e);
-
-  changes.clear();
-  changes[L"A"] = string16();
-  e = AlterEnvironment(empty, changes);
-  EXPECT_EQ(string16(L"\0\0", 2), e);
-
-  changes.clear();
-  e = AlterEnvironment(a2, changes);
-  EXPECT_EQ(string16(L"A=2\0\0", 5), e);
-
-  changes.clear();
-  changes[L"A"] = L"1";
-  e = AlterEnvironment(a2, changes);
-  EXPECT_EQ(string16(L"A=1\0\0", 5), e);
-
-  changes.clear();
-  changes[L"A"] = string16();
-  e = AlterEnvironment(a2, changes);
-  EXPECT_EQ(string16(L"\0\0", 2), e);
-}
-
-#else
-
-TEST_F(EnvironmentTest, AlterEnvironment) {
-  const char* const empty[] = {nullptr};
-  const char* const a2[] = {"A=2", nullptr};
-  EnvironmentMap changes;
-  std::unique_ptr<char* []> e;
-
-  e = AlterEnvironment(empty, changes);
-  EXPECT_TRUE(e[0] == nullptr);
-
-  changes["A"] = "1";
-  e = AlterEnvironment(empty, changes);
-  EXPECT_EQ(std::string("A=1"), e[0]);
-  EXPECT_TRUE(e[1] == nullptr);
-
-  changes.clear();
-  changes["A"] = std::string();
-  e = AlterEnvironment(empty, changes);
-  EXPECT_TRUE(e[0] == nullptr);
-
-  changes.clear();
-  e = AlterEnvironment(a2, changes);
-  EXPECT_EQ(std::string("A=2"), e[0]);
-  EXPECT_TRUE(e[1] == nullptr);
-
-  changes.clear();
-  changes["A"] = "1";
-  e = AlterEnvironment(a2, changes);
-  EXPECT_EQ(std::string("A=1"), e[0]);
-  EXPECT_TRUE(e[1] == nullptr);
-
-  changes.clear();
-  changes["A"] = std::string();
-  e = AlterEnvironment(a2, changes);
-  EXPECT_TRUE(e[0] == nullptr);
-}
-
-#endif
-
-}  // namespace base
diff --git a/base/feature_list_unittest.cc b/base/feature_list_unittest.cc
deleted file mode 100644
index 164997a..0000000
--- a/base/feature_list_unittest.cc
+++ /dev/null
@@ -1,542 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/feature_list.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <utility>
-
-#include "base/format_macros.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/metrics/field_trial.h"
-#include "base/metrics/persistent_memory_allocator.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-constexpr char kFeatureOnByDefaultName[] = "OnByDefault";
-struct Feature kFeatureOnByDefault {
-  kFeatureOnByDefaultName, FEATURE_ENABLED_BY_DEFAULT
-};
-
-constexpr char kFeatureOffByDefaultName[] = "OffByDefault";
-struct Feature kFeatureOffByDefault {
-  kFeatureOffByDefaultName, FEATURE_DISABLED_BY_DEFAULT
-};
-
-std::string SortFeatureListString(const std::string& feature_list) {
-  std::vector<base::StringPiece> features =
-      FeatureList::SplitFeatureListString(feature_list);
-  std::sort(features.begin(), features.end());
-  return JoinString(features, ",");
-}
-
-}  // namespace
-
-class FeatureListTest : public testing::Test {
- public:
-  FeatureListTest() : feature_list_(nullptr) {
-    RegisterFeatureListInstance(WrapUnique(new FeatureList));
-  }
-  ~FeatureListTest() override { ClearFeatureListInstance(); }
-
-  void RegisterFeatureListInstance(std::unique_ptr<FeatureList> feature_list) {
-    FeatureList::ClearInstanceForTesting();
-    feature_list_ = feature_list.get();
-    FeatureList::SetInstance(std::move(feature_list));
-  }
-  void ClearFeatureListInstance() {
-    FeatureList::ClearInstanceForTesting();
-    feature_list_ = nullptr;
-  }
-
-  FeatureList* feature_list() { return feature_list_; }
-
- private:
-  // Weak. Owned by the FeatureList::SetInstance().
-  FeatureList* feature_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(FeatureListTest);
-};
-
-TEST_F(FeatureListTest, DefaultStates) {
-  EXPECT_TRUE(FeatureList::IsEnabled(kFeatureOnByDefault));
-  EXPECT_FALSE(FeatureList::IsEnabled(kFeatureOffByDefault));
-}
-
-TEST_F(FeatureListTest, InitializeFromCommandLine) {
-  struct {
-    const char* enable_features;
-    const char* disable_features;
-    bool expected_feature_on_state;
-    bool expected_feature_off_state;
-  } test_cases[] = {
-      {"", "", true, false},
-      {"OffByDefault", "", true, true},
-      {"OffByDefault", "OnByDefault", false, true},
-      {"OnByDefault,OffByDefault", "", true, true},
-      {"", "OnByDefault,OffByDefault", false, false},
-      // In the case an entry is both, disable takes precedence.
-      {"OnByDefault", "OnByDefault,OffByDefault", false, false},
-  };
-
-  for (size_t i = 0; i < arraysize(test_cases); ++i) {
-    const auto& test_case = test_cases[i];
-    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: [%s] [%s]", i,
-                                    test_case.enable_features,
-                                    test_case.disable_features));
-
-    ClearFeatureListInstance();
-    std::unique_ptr<FeatureList> feature_list(new FeatureList);
-    feature_list->InitializeFromCommandLine(test_case.enable_features,
-                                            test_case.disable_features);
-    RegisterFeatureListInstance(std::move(feature_list));
-
-    EXPECT_EQ(test_case.expected_feature_on_state,
-              FeatureList::IsEnabled(kFeatureOnByDefault))
-        << i;
-    EXPECT_EQ(test_case.expected_feature_off_state,
-              FeatureList::IsEnabled(kFeatureOffByDefault))
-        << i;
-  }
-}
-
-TEST_F(FeatureListTest, CheckFeatureIdentity) {
-  // Tests that CheckFeatureIdentity() correctly detects when two different
-  // structs with the same feature name are passed to it.
-
-  // Call it twice for each feature at the top of the file, since the first call
-  // makes it remember the entry and the second call will verify it.
-  EXPECT_TRUE(feature_list()->CheckFeatureIdentity(kFeatureOnByDefault));
-  EXPECT_TRUE(feature_list()->CheckFeatureIdentity(kFeatureOnByDefault));
-  EXPECT_TRUE(feature_list()->CheckFeatureIdentity(kFeatureOffByDefault));
-  EXPECT_TRUE(feature_list()->CheckFeatureIdentity(kFeatureOffByDefault));
-
-  // Now, call it with a distinct struct for |kFeatureOnByDefaultName|, which
-  // should return false.
-  struct Feature kFeatureOnByDefault2 {
-    kFeatureOnByDefaultName, FEATURE_ENABLED_BY_DEFAULT
-  };
-  EXPECT_FALSE(feature_list()->CheckFeatureIdentity(kFeatureOnByDefault2));
-}
-
-TEST_F(FeatureListTest, FieldTrialOverrides) {
-  struct {
-    FeatureList::OverrideState trial1_state;
-    FeatureList::OverrideState trial2_state;
-  } test_cases[] = {
-      {FeatureList::OVERRIDE_DISABLE_FEATURE,
-       FeatureList::OVERRIDE_DISABLE_FEATURE},
-      {FeatureList::OVERRIDE_DISABLE_FEATURE,
-       FeatureList::OVERRIDE_ENABLE_FEATURE},
-      {FeatureList::OVERRIDE_ENABLE_FEATURE,
-       FeatureList::OVERRIDE_DISABLE_FEATURE},
-      {FeatureList::OVERRIDE_ENABLE_FEATURE,
-       FeatureList::OVERRIDE_ENABLE_FEATURE},
-  };
-
-  FieldTrial::ActiveGroup active_group;
-  for (size_t i = 0; i < arraysize(test_cases); ++i) {
-    const auto& test_case = test_cases[i];
-    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]", i));
-
-    ClearFeatureListInstance();
-
-    FieldTrialList field_trial_list(nullptr);
-    std::unique_ptr<FeatureList> feature_list(new FeatureList);
-
-    FieldTrial* trial1 = FieldTrialList::CreateFieldTrial("TrialExample1", "A");
-    FieldTrial* trial2 = FieldTrialList::CreateFieldTrial("TrialExample2", "B");
-    feature_list->RegisterFieldTrialOverride(kFeatureOnByDefaultName,
-                                             test_case.trial1_state, trial1);
-    feature_list->RegisterFieldTrialOverride(kFeatureOffByDefaultName,
-                                             test_case.trial2_state, trial2);
-    RegisterFeatureListInstance(std::move(feature_list));
-
-    // Initially, neither trial should be active.
-    EXPECT_FALSE(FieldTrialList::IsTrialActive(trial1->trial_name()));
-    EXPECT_FALSE(FieldTrialList::IsTrialActive(trial2->trial_name()));
-
-    const bool expected_enabled_1 =
-        (test_case.trial1_state == FeatureList::OVERRIDE_ENABLE_FEATURE);
-    EXPECT_EQ(expected_enabled_1, FeatureList::IsEnabled(kFeatureOnByDefault));
-    // The above should have activated |trial1|.
-    EXPECT_TRUE(FieldTrialList::IsTrialActive(trial1->trial_name()));
-    EXPECT_FALSE(FieldTrialList::IsTrialActive(trial2->trial_name()));
-
-    const bool expected_enabled_2 =
-        (test_case.trial2_state == FeatureList::OVERRIDE_ENABLE_FEATURE);
-    EXPECT_EQ(expected_enabled_2, FeatureList::IsEnabled(kFeatureOffByDefault));
-    // The above should have activated |trial2|.
-    EXPECT_TRUE(FieldTrialList::IsTrialActive(trial1->trial_name()));
-    EXPECT_TRUE(FieldTrialList::IsTrialActive(trial2->trial_name()));
-  }
-}
-
-TEST_F(FeatureListTest, FieldTrialAssociateUseDefault) {
-  FieldTrialList field_trial_list(nullptr);
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-
-  FieldTrial* trial1 = FieldTrialList::CreateFieldTrial("TrialExample1", "A");
-  FieldTrial* trial2 = FieldTrialList::CreateFieldTrial("TrialExample2", "B");
-  feature_list->RegisterFieldTrialOverride(
-      kFeatureOnByDefaultName, FeatureList::OVERRIDE_USE_DEFAULT, trial1);
-  feature_list->RegisterFieldTrialOverride(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_USE_DEFAULT, trial2);
-  RegisterFeatureListInstance(std::move(feature_list));
-
-  // Initially, neither trial should be active.
-  EXPECT_FALSE(FieldTrialList::IsTrialActive(trial1->trial_name()));
-  EXPECT_FALSE(FieldTrialList::IsTrialActive(trial2->trial_name()));
-
-  // Check the feature enabled state is its default.
-  EXPECT_TRUE(FeatureList::IsEnabled(kFeatureOnByDefault));
-  // The above should have activated |trial1|.
-  EXPECT_TRUE(FieldTrialList::IsTrialActive(trial1->trial_name()));
-  EXPECT_FALSE(FieldTrialList::IsTrialActive(trial2->trial_name()));
-
-  // Check the feature enabled state is its default.
-  EXPECT_FALSE(FeatureList::IsEnabled(kFeatureOffByDefault));
-  // The above should have activated |trial2|.
-  EXPECT_TRUE(FieldTrialList::IsTrialActive(trial1->trial_name()));
-  EXPECT_TRUE(FieldTrialList::IsTrialActive(trial2->trial_name()));
-}
-
-TEST_F(FeatureListTest, CommandLineTakesPrecedenceOverFieldTrial) {
-  ClearFeatureListInstance();
-
-  FieldTrialList field_trial_list(nullptr);
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-
-  // The feature is explicitly enabled on the command-line.
-  feature_list->InitializeFromCommandLine(kFeatureOffByDefaultName, "");
-
-  // But the FieldTrial would set the feature to disabled.
-  FieldTrial* trial = FieldTrialList::CreateFieldTrial("TrialExample2", "A");
-  feature_list->RegisterFieldTrialOverride(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE, trial);
-  RegisterFeatureListInstance(std::move(feature_list));
-
-  EXPECT_FALSE(FieldTrialList::IsTrialActive(trial->trial_name()));
-  // Command-line should take precedence.
-  EXPECT_TRUE(FeatureList::IsEnabled(kFeatureOffByDefault));
-  // Since the feature is on due to the command-line, and not as a result of the
-  // field trial, the field trial should not be activated (since the Associate*
-  // API wasn't used.)
-  EXPECT_FALSE(FieldTrialList::IsTrialActive(trial->trial_name()));
-}
-
-TEST_F(FeatureListTest, IsFeatureOverriddenFromCommandLine) {
-  ClearFeatureListInstance();
-
-  FieldTrialList field_trial_list(nullptr);
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-
-  // No features are overridden from the command line yet
-  EXPECT_FALSE(feature_list->IsFeatureOverriddenFromCommandLine(
-      kFeatureOnByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE));
-  EXPECT_FALSE(feature_list->IsFeatureOverriddenFromCommandLine(
-      kFeatureOnByDefaultName, FeatureList::OVERRIDE_ENABLE_FEATURE));
-  EXPECT_FALSE(feature_list->IsFeatureOverriddenFromCommandLine(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE));
-  EXPECT_FALSE(feature_list->IsFeatureOverriddenFromCommandLine(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_ENABLE_FEATURE));
-
-  // Now, enable |kFeatureOffByDefaultName| via the command-line.
-  feature_list->InitializeFromCommandLine(kFeatureOffByDefaultName, "");
-
-  // It should now be overridden for the enabled group.
-  EXPECT_FALSE(feature_list->IsFeatureOverriddenFromCommandLine(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE));
-  EXPECT_TRUE(feature_list->IsFeatureOverriddenFromCommandLine(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_ENABLE_FEATURE));
-
-  // Register a field trial to associate with the feature and ensure that the
-  // results are still the same.
-  feature_list->AssociateReportingFieldTrial(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_ENABLE_FEATURE,
-      FieldTrialList::CreateFieldTrial("Trial1", "A"));
-  EXPECT_FALSE(feature_list->IsFeatureOverriddenFromCommandLine(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE));
-  EXPECT_TRUE(feature_list->IsFeatureOverriddenFromCommandLine(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_ENABLE_FEATURE));
-
-  // Now, register a field trial to override |kFeatureOnByDefaultName| state
-  // and check that the function still returns false for that feature.
-  feature_list->RegisterFieldTrialOverride(
-      kFeatureOnByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE,
-      FieldTrialList::CreateFieldTrial("Trial2", "A"));
-  EXPECT_FALSE(feature_list->IsFeatureOverriddenFromCommandLine(
-      kFeatureOnByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE));
-  EXPECT_FALSE(feature_list->IsFeatureOverriddenFromCommandLine(
-      kFeatureOnByDefaultName, FeatureList::OVERRIDE_ENABLE_FEATURE));
-  RegisterFeatureListInstance(std::move(feature_list));
-
-  // Check the expected feature states for good measure.
-  EXPECT_TRUE(FeatureList::IsEnabled(kFeatureOffByDefault));
-  EXPECT_FALSE(FeatureList::IsEnabled(kFeatureOnByDefault));
-}
-
-TEST_F(FeatureListTest, AssociateReportingFieldTrial) {
-  struct {
-    const char* enable_features;
-    const char* disable_features;
-    bool expected_enable_trial_created;
-    bool expected_disable_trial_created;
-  } test_cases[] = {
-      // If no enable/disable flags are specified, no trials should be created.
-      {"", "", false, false},
-      // Enabling the feature should result in the enable trial created.
-      {kFeatureOffByDefaultName, "", true, false},
-      // Disabling the feature should result in the disable trial created.
-      {"", kFeatureOffByDefaultName, false, true},
-  };
-
-  const char kTrialName[] = "ForcingTrial";
-  const char kForcedOnGroupName[] = "ForcedOn";
-  const char kForcedOffGroupName[] = "ForcedOff";
-
-  for (size_t i = 0; i < arraysize(test_cases); ++i) {
-    const auto& test_case = test_cases[i];
-    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: [%s] [%s]", i,
-                                    test_case.enable_features,
-                                    test_case.disable_features));
-
-    ClearFeatureListInstance();
-
-    FieldTrialList field_trial_list(nullptr);
-    std::unique_ptr<FeatureList> feature_list(new FeatureList);
-    feature_list->InitializeFromCommandLine(test_case.enable_features,
-                                            test_case.disable_features);
-
-    FieldTrial* enable_trial = nullptr;
-    if (feature_list->IsFeatureOverriddenFromCommandLine(
-            kFeatureOffByDefaultName, FeatureList::OVERRIDE_ENABLE_FEATURE)) {
-      enable_trial = base::FieldTrialList::CreateFieldTrial(kTrialName,
-                                                            kForcedOnGroupName);
-      feature_list->AssociateReportingFieldTrial(
-          kFeatureOffByDefaultName, FeatureList::OVERRIDE_ENABLE_FEATURE,
-          enable_trial);
-    }
-    FieldTrial* disable_trial = nullptr;
-    if (feature_list->IsFeatureOverriddenFromCommandLine(
-            kFeatureOffByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE)) {
-      disable_trial = base::FieldTrialList::CreateFieldTrial(
-          kTrialName, kForcedOffGroupName);
-      feature_list->AssociateReportingFieldTrial(
-          kFeatureOffByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE,
-          disable_trial);
-    }
-    EXPECT_EQ(test_case.expected_enable_trial_created, enable_trial != nullptr);
-    EXPECT_EQ(test_case.expected_disable_trial_created,
-              disable_trial != nullptr);
-    RegisterFeatureListInstance(std::move(feature_list));
-
-    EXPECT_FALSE(FieldTrialList::IsTrialActive(kTrialName));
-    if (disable_trial) {
-      EXPECT_FALSE(FeatureList::IsEnabled(kFeatureOffByDefault));
-      EXPECT_TRUE(FieldTrialList::IsTrialActive(kTrialName));
-      EXPECT_EQ(kForcedOffGroupName, disable_trial->group_name());
-    } else if (enable_trial) {
-      EXPECT_TRUE(FeatureList::IsEnabled(kFeatureOffByDefault));
-      EXPECT_TRUE(FieldTrialList::IsTrialActive(kTrialName));
-      EXPECT_EQ(kForcedOnGroupName, enable_trial->group_name());
-    }
-  }
-}
-
-TEST_F(FeatureListTest, GetFeatureOverrides) {
-  ClearFeatureListInstance();
-  FieldTrialList field_trial_list(nullptr);
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-  feature_list->InitializeFromCommandLine("A,X", "D");
-
-  FieldTrial* trial = FieldTrialList::CreateFieldTrial("Trial", "Group");
-  feature_list->RegisterFieldTrialOverride(kFeatureOffByDefaultName,
-                                           FeatureList::OVERRIDE_ENABLE_FEATURE,
-                                           trial);
-
-  RegisterFeatureListInstance(std::move(feature_list));
-
-  std::string enable_features;
-  std::string disable_features;
-  FeatureList::GetInstance()->GetFeatureOverrides(&enable_features,
-                                                  &disable_features);
-  EXPECT_EQ("A,OffByDefault<Trial,X", SortFeatureListString(enable_features));
-  EXPECT_EQ("D", SortFeatureListString(disable_features));
-
-  FeatureList::GetInstance()->GetCommandLineFeatureOverrides(&enable_features,
-                                                             &disable_features);
-  EXPECT_EQ("A,X", SortFeatureListString(enable_features));
-  EXPECT_EQ("D", SortFeatureListString(disable_features));
-}
-
-TEST_F(FeatureListTest, GetFeatureOverrides_UseDefault) {
-  ClearFeatureListInstance();
-  FieldTrialList field_trial_list(nullptr);
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-  feature_list->InitializeFromCommandLine("A,X", "D");
-
-  FieldTrial* trial = FieldTrialList::CreateFieldTrial("Trial", "Group");
-  feature_list->RegisterFieldTrialOverride(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_USE_DEFAULT, trial);
-
-  RegisterFeatureListInstance(std::move(feature_list));
-
-  std::string enable_features;
-  std::string disable_features;
-  FeatureList::GetInstance()->GetFeatureOverrides(&enable_features,
-                                                  &disable_features);
-  EXPECT_EQ("*OffByDefault<Trial,A,X", SortFeatureListString(enable_features));
-  EXPECT_EQ("D", SortFeatureListString(disable_features));
-}
-
-TEST_F(FeatureListTest, GetFieldTrial) {
-  ClearFeatureListInstance();
-  FieldTrialList field_trial_list(nullptr);
-  FieldTrial* trial = FieldTrialList::CreateFieldTrial("Trial", "Group");
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-  feature_list->RegisterFieldTrialOverride(
-      kFeatureOnByDefaultName, FeatureList::OVERRIDE_USE_DEFAULT, trial);
-  RegisterFeatureListInstance(std::move(feature_list));
-
-  EXPECT_EQ(trial, FeatureList::GetFieldTrial(kFeatureOnByDefault));
-  EXPECT_EQ(nullptr, FeatureList::GetFieldTrial(kFeatureOffByDefault));
-}
-
-TEST_F(FeatureListTest, InitializeFromCommandLine_WithFieldTrials) {
-  ClearFeatureListInstance();
-  FieldTrialList field_trial_list(nullptr);
-  FieldTrialList::CreateFieldTrial("Trial", "Group");
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-  feature_list->InitializeFromCommandLine("A,OffByDefault<Trial,X", "D");
-  RegisterFeatureListInstance(std::move(feature_list));
-
-  EXPECT_FALSE(FieldTrialList::IsTrialActive("Trial"));
-  EXPECT_TRUE(FeatureList::IsEnabled(kFeatureOffByDefault));
-  EXPECT_TRUE(FieldTrialList::IsTrialActive("Trial"));
-}
-
-TEST_F(FeatureListTest, InitializeFromCommandLine_UseDefault) {
-  ClearFeatureListInstance();
-  FieldTrialList field_trial_list(nullptr);
-  FieldTrialList::CreateFieldTrial("T1", "Group");
-  FieldTrialList::CreateFieldTrial("T2", "Group");
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-  feature_list->InitializeFromCommandLine(
-      "A,*OffByDefault<T1,*OnByDefault<T2,X", "D");
-  RegisterFeatureListInstance(std::move(feature_list));
-
-  EXPECT_FALSE(FieldTrialList::IsTrialActive("T1"));
-  EXPECT_FALSE(FeatureList::IsEnabled(kFeatureOffByDefault));
-  EXPECT_TRUE(FieldTrialList::IsTrialActive("T1"));
-
-  EXPECT_FALSE(FieldTrialList::IsTrialActive("T2"));
-  EXPECT_TRUE(FeatureList::IsEnabled(kFeatureOnByDefault));
-  EXPECT_TRUE(FieldTrialList::IsTrialActive("T2"));
-}
-
-TEST_F(FeatureListTest, InitializeInstance) {
-  ClearFeatureListInstance();
-
-  std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
-  FeatureList::SetInstance(std::move(feature_list));
-  EXPECT_TRUE(FeatureList::IsEnabled(kFeatureOnByDefault));
-  EXPECT_FALSE(FeatureList::IsEnabled(kFeatureOffByDefault));
-
-  // Initialize from command line if we haven't yet.
-  FeatureList::InitializeInstance("", kFeatureOnByDefaultName);
-  EXPECT_FALSE(FeatureList::IsEnabled(kFeatureOnByDefault));
-  EXPECT_FALSE(FeatureList::IsEnabled(kFeatureOffByDefault));
-
-  // Do not initialize from commandline if we have already.
-  FeatureList::InitializeInstance(kFeatureOffByDefaultName, "");
-  EXPECT_FALSE(FeatureList::IsEnabled(kFeatureOnByDefault));
-  EXPECT_FALSE(FeatureList::IsEnabled(kFeatureOffByDefault));
-}
-
-TEST_F(FeatureListTest, UninitializedInstance_IsEnabledReturnsFalse) {
-  ClearFeatureListInstance();
-  // This test case simulates the calling pattern found in code which does not
-  // explicitly initialize the features list.
-  // All IsEnabled() calls should return the default value in this scenario.
-  EXPECT_EQ(nullptr, FeatureList::GetInstance());
-  EXPECT_TRUE(FeatureList::IsEnabled(kFeatureOnByDefault));
-  EXPECT_EQ(nullptr, FeatureList::GetInstance());
-  EXPECT_FALSE(FeatureList::IsEnabled(kFeatureOffByDefault));
-}
-
-TEST_F(FeatureListTest, StoreAndRetrieveFeaturesFromSharedMemory) {
-  std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
-
-  // Create some overrides.
-  feature_list->RegisterOverride(kFeatureOffByDefaultName,
-                                 FeatureList::OVERRIDE_ENABLE_FEATURE, nullptr);
-  feature_list->RegisterOverride(
-      kFeatureOnByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE, nullptr);
-  feature_list->FinalizeInitialization();
-
-  // Create an allocator and store the overrides.
-  std::unique_ptr<SharedMemory> shm(new SharedMemory());
-  shm->CreateAndMapAnonymous(4 << 10);
-  SharedPersistentMemoryAllocator allocator(std::move(shm), 1, "", false);
-  feature_list->AddFeaturesToAllocator(&allocator);
-
-  std::unique_ptr<base::FeatureList> feature_list2(new base::FeatureList);
-
-  // Check that the new feature list is empty.
-  EXPECT_FALSE(feature_list2->IsFeatureOverriddenFromCommandLine(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_ENABLE_FEATURE));
-  EXPECT_FALSE(feature_list2->IsFeatureOverriddenFromCommandLine(
-      kFeatureOnByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE));
-
-  feature_list2->InitializeFromSharedMemory(&allocator);
-  // Check that the new feature list now has 2 overrides.
-  EXPECT_TRUE(feature_list2->IsFeatureOverriddenFromCommandLine(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_ENABLE_FEATURE));
-  EXPECT_TRUE(feature_list2->IsFeatureOverriddenFromCommandLine(
-      kFeatureOnByDefaultName, FeatureList::OVERRIDE_DISABLE_FEATURE));
-}
-
-TEST_F(FeatureListTest, StoreAndRetrieveAssociatedFeaturesFromSharedMemory) {
-  FieldTrialList field_trial_list(nullptr);
-  std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
-
-  // Create some overrides.
-  FieldTrial* trial1 = FieldTrialList::CreateFieldTrial("TrialExample1", "A");
-  FieldTrial* trial2 = FieldTrialList::CreateFieldTrial("TrialExample2", "B");
-  feature_list->RegisterFieldTrialOverride(
-      kFeatureOnByDefaultName, FeatureList::OVERRIDE_USE_DEFAULT, trial1);
-  feature_list->RegisterFieldTrialOverride(
-      kFeatureOffByDefaultName, FeatureList::OVERRIDE_USE_DEFAULT, trial2);
-  feature_list->FinalizeInitialization();
-
-  // Create an allocator and store the overrides.
-  std::unique_ptr<SharedMemory> shm(new SharedMemory());
-  shm->CreateAndMapAnonymous(4 << 10);
-  SharedPersistentMemoryAllocator allocator(std::move(shm), 1, "", false);
-  feature_list->AddFeaturesToAllocator(&allocator);
-
-  std::unique_ptr<base::FeatureList> feature_list2(new base::FeatureList);
-  feature_list2->InitializeFromSharedMemory(&allocator);
-  feature_list2->FinalizeInitialization();
-
-  // Check that the field trials are still associated.
-  FieldTrial* associated_trial1 =
-      feature_list2->GetAssociatedFieldTrial(kFeatureOnByDefault);
-  FieldTrial* associated_trial2 =
-      feature_list2->GetAssociatedFieldTrial(kFeatureOffByDefault);
-  EXPECT_EQ(associated_trial1, trial1);
-  EXPECT_EQ(associated_trial2, trial2);
-}
-
-}  // namespace base
diff --git a/base/file_version_info_win_unittest.cc b/base/file_version_info_win_unittest.cc
deleted file mode 100644
index a4acc4c..0000000
--- a/base/file_version_info_win_unittest.cc
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/file_version_info_win.h"
-
-#include <windows.h>
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/file_version_info.h"
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/path_service.h"
-#include "base/scoped_native_library.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using base::FilePath;
-
-namespace {
-
-FilePath GetTestDataPath() {
-  FilePath path;
-  base::PathService::Get(base::DIR_SOURCE_ROOT, &path);
-  path = path.AppendASCII("base");
-  path = path.AppendASCII("test");
-  path = path.AppendASCII("data");
-  path = path.AppendASCII("file_version_info_unittest");
-  return path;
-}
-
-class FileVersionInfoFactory {
- public:
-  explicit FileVersionInfoFactory(const FilePath& path) : path_(path) {}
-
-  std::unique_ptr<FileVersionInfo> Create() const {
-    return base::WrapUnique(FileVersionInfo::CreateFileVersionInfo(path_));
-  }
-
- private:
-  const FilePath path_;
-
-  DISALLOW_COPY_AND_ASSIGN(FileVersionInfoFactory);
-};
-
-class FileVersionInfoForModuleFactory {
- public:
-  explicit FileVersionInfoForModuleFactory(const FilePath& path)
-      // Load the library with LOAD_LIBRARY_AS_IMAGE_RESOURCE since it shouldn't
-      // be executed.
-      : library_(::LoadLibraryEx(path.value().c_str(),
-                                 nullptr,
-                                 LOAD_LIBRARY_AS_IMAGE_RESOURCE)) {
-    EXPECT_TRUE(library_.is_valid());
-  }
-
-  std::unique_ptr<FileVersionInfo> Create() const {
-    return base::WrapUnique(
-        FileVersionInfo::CreateFileVersionInfoForModule(library_.get()));
-  }
-
- private:
-  const base::ScopedNativeLibrary library_;
-
-  DISALLOW_COPY_AND_ASSIGN(FileVersionInfoForModuleFactory);
-};
-
-template <typename T>
-class FileVersionInfoTest : public testing::Test {};
-
-using FileVersionInfoFactories =
-    ::testing::Types<FileVersionInfoFactory, FileVersionInfoForModuleFactory>;
-
-}  // namespace
-
-TYPED_TEST_CASE(FileVersionInfoTest, FileVersionInfoFactories);
-
-TYPED_TEST(FileVersionInfoTest, HardCodedProperties) {
-  const wchar_t kDLLName[] = {L"FileVersionInfoTest1.dll"};
-
-  const wchar_t* const kExpectedValues[15] = {
-      // FileVersionInfoTest.dll
-      L"Goooooogle",                                  // company_name
-      L"Google",                                      // company_short_name
-      L"This is the product name",                    // product_name
-      L"This is the product short name",              // product_short_name
-      L"The Internal Name",                           // internal_name
-      L"4.3.2.1",                                     // product_version
-      L"Private build property",                      // private_build
-      L"Special build property",                      // special_build
-      L"This is a particularly interesting comment",  // comments
-      L"This is the original filename",               // original_filename
-      L"This is my file description",                 // file_description
-      L"1.2.3.4",                                     // file_version
-      L"This is the legal copyright",                 // legal_copyright
-      L"This is the legal trademarks",                // legal_trademarks
-      L"This is the last change",                     // last_change
-  };
-
-  FilePath dll_path = GetTestDataPath();
-  dll_path = dll_path.Append(kDLLName);
-
-  TypeParam factory(dll_path);
-  std::unique_ptr<FileVersionInfo> version_info(factory.Create());
-  ASSERT_TRUE(version_info);
-
-  int j = 0;
-  EXPECT_EQ(kExpectedValues[j++], version_info->company_name());
-  EXPECT_EQ(kExpectedValues[j++], version_info->company_short_name());
-  EXPECT_EQ(kExpectedValues[j++], version_info->product_name());
-  EXPECT_EQ(kExpectedValues[j++], version_info->product_short_name());
-  EXPECT_EQ(kExpectedValues[j++], version_info->internal_name());
-  EXPECT_EQ(kExpectedValues[j++], version_info->product_version());
-  EXPECT_EQ(kExpectedValues[j++], version_info->private_build());
-  EXPECT_EQ(kExpectedValues[j++], version_info->special_build());
-  EXPECT_EQ(kExpectedValues[j++], version_info->comments());
-  EXPECT_EQ(kExpectedValues[j++], version_info->original_filename());
-  EXPECT_EQ(kExpectedValues[j++], version_info->file_description());
-  EXPECT_EQ(kExpectedValues[j++], version_info->file_version());
-  EXPECT_EQ(kExpectedValues[j++], version_info->legal_copyright());
-  EXPECT_EQ(kExpectedValues[j++], version_info->legal_trademarks());
-  EXPECT_EQ(kExpectedValues[j++], version_info->last_change());
-}
-
-TYPED_TEST(FileVersionInfoTest, IsOfficialBuild) {
-  constexpr struct {
-    const wchar_t* const dll_name;
-    const bool is_official_build;
-  } kTestItems[]{
-      {L"FileVersionInfoTest1.dll", true}, {L"FileVersionInfoTest2.dll", false},
-  };
-
-  for (const auto& test_item : kTestItems) {
-    const FilePath dll_path = GetTestDataPath().Append(test_item.dll_name);
-
-    TypeParam factory(dll_path);
-    std::unique_ptr<FileVersionInfo> version_info(factory.Create());
-    ASSERT_TRUE(version_info);
-
-    EXPECT_EQ(test_item.is_official_build, version_info->is_official_build());
-  }
-}
-
-TYPED_TEST(FileVersionInfoTest, CustomProperties) {
-  FilePath dll_path = GetTestDataPath();
-  dll_path = dll_path.AppendASCII("FileVersionInfoTest1.dll");
-
-  TypeParam factory(dll_path);
-  std::unique_ptr<FileVersionInfo> version_info(factory.Create());
-  ASSERT_TRUE(version_info);
-
-  // Test few existing properties.
-  std::wstring str;
-  FileVersionInfoWin* version_info_win =
-      static_cast<FileVersionInfoWin*>(version_info.get());
-  EXPECT_TRUE(version_info_win->GetValue(L"Custom prop 1", &str));
-  EXPECT_EQ(L"Un", str);
-  EXPECT_EQ(L"Un", version_info_win->GetStringValue(L"Custom prop 1"));
-
-  EXPECT_TRUE(version_info_win->GetValue(L"Custom prop 2", &str));
-  EXPECT_EQ(L"Deux", str);
-  EXPECT_EQ(L"Deux", version_info_win->GetStringValue(L"Custom prop 2"));
-
-  EXPECT_TRUE(version_info_win->GetValue(L"Custom prop 3", &str));
-  EXPECT_EQ(L"1600 Amphitheatre Parkway Mountain View, CA 94043", str);
-  EXPECT_EQ(L"1600 Amphitheatre Parkway Mountain View, CA 94043",
-            version_info_win->GetStringValue(L"Custom prop 3"));
-
-  // Test an non-existing property.
-  EXPECT_FALSE(version_info_win->GetValue(L"Unknown property", &str));
-  EXPECT_EQ(L"", version_info_win->GetStringValue(L"Unknown property"));
-}
diff --git a/base/files/dir_reader_posix_unittest.cc b/base/files/dir_reader_posix_unittest.cc
deleted file mode 100644
index f82619b..0000000
--- a/base/files/dir_reader_posix_unittest.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/dir_reader_posix.h"
-
-#include <fcntl.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_ANDROID)
-#include "base/os_compat_android.h"
-#endif
-
-namespace base {
-
-TEST(DirReaderPosixUnittest, Read) {
-  static const unsigned kNumFiles = 100;
-
-  if (DirReaderPosix::IsFallback())
-    return;
-
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  const char* dir = temp_dir.GetPath().value().c_str();
-  ASSERT_TRUE(dir);
-
-  char wdbuf[PATH_MAX];
-  PCHECK(getcwd(wdbuf, PATH_MAX));
-
-  PCHECK(chdir(dir) == 0);
-
-  for (unsigned i = 0; i < kNumFiles; i++) {
-    char buf[16];
-    snprintf(buf, sizeof(buf), "%d", i);
-    const int fd = open(buf, O_CREAT | O_RDONLY | O_EXCL, 0600);
-    PCHECK(fd >= 0);
-    PCHECK(close(fd) == 0);
-  }
-
-  std::set<unsigned> seen;
-
-  DirReaderPosix reader(dir);
-  EXPECT_TRUE(reader.IsValid());
-
-  if (!reader.IsValid())
-    return;
-
-  bool seen_dot = false, seen_dotdot = false;
-
-  for (; reader.Next(); ) {
-    if (strcmp(reader.name(), ".") == 0) {
-      seen_dot = true;
-      continue;
-    }
-    if (strcmp(reader.name(), "..") == 0) {
-      seen_dotdot = true;
-      continue;
-    }
-
-    SCOPED_TRACE(testing::Message() << "reader.name(): " << reader.name());
-
-    char *endptr;
-    const unsigned long value = strtoul(reader.name(), &endptr, 10);
-
-    EXPECT_FALSE(*endptr);
-    EXPECT_LT(value, kNumFiles);
-    EXPECT_EQ(0u, seen.count(value));
-    seen.insert(value);
-  }
-
-  for (unsigned i = 0; i < kNumFiles; i++) {
-    char buf[16];
-    snprintf(buf, sizeof(buf), "%d", i);
-    PCHECK(unlink(buf) == 0);
-  }
-
-  PCHECK(rmdir(dir) == 0);
-
-  PCHECK(chdir(wdbuf) == 0);
-
-  EXPECT_TRUE(seen_dot);
-  EXPECT_TRUE(seen_dotdot);
-  EXPECT_EQ(kNumFiles, seen.size());
-}
-
-}  // namespace base
diff --git a/base/files/file_descriptor_watcher_posix_unittest.cc b/base/files/file_descriptor_watcher_posix_unittest.cc
deleted file mode 100644
index 8fc57ce..0000000
--- a/base/files/file_descriptor_watcher_posix_unittest.cc
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file_descriptor_watcher_posix.h"
-
-#include <unistd.h>
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/files/file_util.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/run_loop.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_checker_impl.h"
-#include "build_config.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class Mock {
- public:
-  Mock() = default;
-
-  MOCK_METHOD0(ReadableCallback, void());
-  MOCK_METHOD0(WritableCallback, void());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(Mock);
-};
-
-enum class FileDescriptorWatcherTestType {
-  MESSAGE_LOOP_FOR_IO_ON_MAIN_THREAD,
-  MESSAGE_LOOP_FOR_IO_ON_OTHER_THREAD,
-};
-
-class FileDescriptorWatcherTest
-    : public testing::TestWithParam<FileDescriptorWatcherTestType> {
- public:
-  FileDescriptorWatcherTest()
-      : message_loop_(GetParam() == FileDescriptorWatcherTestType::
-                                        MESSAGE_LOOP_FOR_IO_ON_MAIN_THREAD
-                          ? new MessageLoopForIO
-                          : new MessageLoop),
-        other_thread_("FileDescriptorWatcherTest_OtherThread") {}
-  ~FileDescriptorWatcherTest() override = default;
-
-  void SetUp() override {
-    ASSERT_EQ(0, pipe(pipe_fds_));
-
-    MessageLoop* message_loop_for_io;
-    if (GetParam() ==
-        FileDescriptorWatcherTestType::MESSAGE_LOOP_FOR_IO_ON_OTHER_THREAD) {
-      Thread::Options options;
-      options.message_loop_type = MessageLoop::TYPE_IO;
-      ASSERT_TRUE(other_thread_.StartWithOptions(options));
-      message_loop_for_io = other_thread_.message_loop();
-    } else {
-      message_loop_for_io = message_loop_.get();
-    }
-
-    ASSERT_TRUE(message_loop_for_io->IsType(MessageLoop::TYPE_IO));
-    file_descriptor_watcher_ = std::make_unique<FileDescriptorWatcher>(
-        static_cast<MessageLoopForIO*>(message_loop_for_io));
-  }
-
-  void TearDown() override {
-    if (GetParam() ==
-            FileDescriptorWatcherTestType::MESSAGE_LOOP_FOR_IO_ON_MAIN_THREAD &&
-        message_loop_) {
-      // Allow the delete task posted by the Controller's destructor to run.
-      base::RunLoop().RunUntilIdle();
-    }
-
-    // Ensure that OtherThread is done processing before closing fds.
-    other_thread_.Stop();
-
-    EXPECT_EQ(0, IGNORE_EINTR(close(pipe_fds_[0])));
-    EXPECT_EQ(0, IGNORE_EINTR(close(pipe_fds_[1])));
-  }
-
- protected:
-  int read_file_descriptor() const { return pipe_fds_[0]; }
-  int write_file_descriptor() const { return pipe_fds_[1]; }
-
-  // Waits for a short delay and run pending tasks.
-  void WaitAndRunPendingTasks() {
-    PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-    RunLoop().RunUntilIdle();
-  }
-
-  // Registers ReadableCallback() to be called on |mock_| when
-  // read_file_descriptor() is readable without blocking.
-  std::unique_ptr<FileDescriptorWatcher::Controller> WatchReadable() {
-    std::unique_ptr<FileDescriptorWatcher::Controller> controller =
-        FileDescriptorWatcher::WatchReadable(
-            read_file_descriptor(),
-            Bind(&Mock::ReadableCallback, Unretained(&mock_)));
-    EXPECT_TRUE(controller);
-
-    // Unless read_file_descriptor() was readable before the callback was
-    // registered, this shouldn't do anything.
-    WaitAndRunPendingTasks();
-
-    return controller;
-  }
-
-  // Registers WritableCallback() to be called on |mock_| when
-  // write_file_descriptor() is writable without blocking.
-  std::unique_ptr<FileDescriptorWatcher::Controller> WatchWritable() {
-    std::unique_ptr<FileDescriptorWatcher::Controller> controller =
-        FileDescriptorWatcher::WatchWritable(
-            write_file_descriptor(),
-            Bind(&Mock::WritableCallback, Unretained(&mock_)));
-    EXPECT_TRUE(controller);
-    return controller;
-  }
-
-  void WriteByte() {
-    constexpr char kByte = '!';
-    ASSERT_TRUE(
-        WriteFileDescriptor(write_file_descriptor(), &kByte, sizeof(kByte)));
-  }
-
-  void ReadByte() {
-    // This is always called as part of the WatchReadable() callback, which
-    // should run on the main thread.
-    EXPECT_TRUE(thread_checker_.CalledOnValidThread());
-
-    char buffer;
-    ASSERT_TRUE(ReadFromFD(read_file_descriptor(), &buffer, sizeof(buffer)));
-  }
-
-  // Mock on wich callbacks are invoked.
-  testing::StrictMock<Mock> mock_;
-
-  // MessageLoop bound to the main thread.
-  std::unique_ptr<MessageLoop> message_loop_;
-
-  // Thread running a MessageLoopForIO. Used when the test type is
-  // MESSAGE_LOOP_FOR_IO_ON_OTHER_THREAD.
-  Thread other_thread_;
-
- private:
-  // Determines which MessageLoopForIO is used to watch file descriptors for
-  // which callbacks are registered on the main thread.
-  std::unique_ptr<FileDescriptorWatcher> file_descriptor_watcher_;
-
-  // Watched file descriptors.
-  int pipe_fds_[2];
-
-  // Used to verify that callbacks run on the thread on which they are
-  // registered.
-  ThreadCheckerImpl thread_checker_;
-
-  DISALLOW_COPY_AND_ASSIGN(FileDescriptorWatcherTest);
-};
-
-}  // namespace
-
-TEST_P(FileDescriptorWatcherTest, WatchWritable) {
-  auto controller = WatchWritable();
-
-  // The write end of a newly created pipe is immediately writable.
-  RunLoop run_loop;
-  EXPECT_CALL(mock_, WritableCallback())
-      .WillOnce(testing::Invoke(&run_loop, &RunLoop::Quit));
-  run_loop.Run();
-}
-
-TEST_P(FileDescriptorWatcherTest, WatchReadableOneByte) {
-  auto controller = WatchReadable();
-
-  // Write 1 byte to the pipe, making it readable without blocking. Expect one
-  // call to ReadableCallback() which will read 1 byte from the pipe.
-  WriteByte();
-  RunLoop run_loop;
-  EXPECT_CALL(mock_, ReadableCallback())
-      .WillOnce(testing::Invoke([this, &run_loop]() {
-        ReadByte();
-        run_loop.Quit();
-      }));
-  run_loop.Run();
-  testing::Mock::VerifyAndClear(&mock_);
-
-  // No more call to ReadableCallback() is expected.
-  WaitAndRunPendingTasks();
-}
-
-TEST_P(FileDescriptorWatcherTest, WatchReadableTwoBytes) {
-  auto controller = WatchReadable();
-
-  // Write 2 bytes to the pipe. Expect two calls to ReadableCallback() which
-  // will each read 1 byte from the pipe.
-  WriteByte();
-  WriteByte();
-  RunLoop run_loop;
-  EXPECT_CALL(mock_, ReadableCallback())
-      .WillOnce(testing::Invoke([this]() { ReadByte(); }))
-      .WillOnce(testing::Invoke([this, &run_loop]() {
-        ReadByte();
-        run_loop.Quit();
-      }));
-  run_loop.Run();
-  testing::Mock::VerifyAndClear(&mock_);
-
-  // No more call to ReadableCallback() is expected.
-  WaitAndRunPendingTasks();
-}
-
-TEST_P(FileDescriptorWatcherTest, WatchReadableByteWrittenFromCallback) {
-  auto controller = WatchReadable();
-
-  // Write 1 byte to the pipe. Expect one call to ReadableCallback() from which
-  // 1 byte is read and 1 byte is written to the pipe. Then, expect another call
-  // to ReadableCallback() from which the remaining byte is read from the pipe.
-  WriteByte();
-  RunLoop run_loop;
-  EXPECT_CALL(mock_, ReadableCallback())
-      .WillOnce(testing::Invoke([this]() {
-        ReadByte();
-        WriteByte();
-      }))
-      .WillOnce(testing::Invoke([this, &run_loop]() {
-        ReadByte();
-        run_loop.Quit();
-      }));
-  run_loop.Run();
-  testing::Mock::VerifyAndClear(&mock_);
-
-  // No more call to ReadableCallback() is expected.
-  WaitAndRunPendingTasks();
-}
-
-TEST_P(FileDescriptorWatcherTest, DeleteControllerFromCallback) {
-  auto controller = WatchReadable();
-
-  // Write 1 byte to the pipe. Expect one call to ReadableCallback() from which
-  // |controller| is deleted.
-  WriteByte();
-  RunLoop run_loop;
-  EXPECT_CALL(mock_, ReadableCallback())
-      .WillOnce(testing::Invoke([&run_loop, &controller]() {
-        controller = nullptr;
-        run_loop.Quit();
-      }));
-  run_loop.Run();
-  testing::Mock::VerifyAndClear(&mock_);
-
-  // Since |controller| has been deleted, no call to ReadableCallback() is
-  // expected even though the pipe is still readable without blocking.
-  WaitAndRunPendingTasks();
-}
-
-TEST_P(FileDescriptorWatcherTest,
-       DeleteControllerBeforeFileDescriptorReadable) {
-  auto controller = WatchReadable();
-
-  // Cancel the watch.
-  controller = nullptr;
-
-  // Write 1 byte to the pipe to make it readable without blocking.
-  WriteByte();
-
-  // No call to ReadableCallback() is expected.
-  WaitAndRunPendingTasks();
-}
-
-TEST_P(FileDescriptorWatcherTest, DeleteControllerAfterFileDescriptorReadable) {
-  auto controller = WatchReadable();
-
-  // Write 1 byte to the pipe to make it readable without blocking.
-  WriteByte();
-
-  // Cancel the watch.
-  controller = nullptr;
-
-  // No call to ReadableCallback() is expected.
-  WaitAndRunPendingTasks();
-}
-
-TEST_P(FileDescriptorWatcherTest, DeleteControllerAfterDeleteMessageLoopForIO) {
-  auto controller = WatchReadable();
-
-  // Delete the MessageLoopForIO.
-  if (GetParam() ==
-      FileDescriptorWatcherTestType::MESSAGE_LOOP_FOR_IO_ON_MAIN_THREAD) {
-    message_loop_ = nullptr;
-  } else {
-    other_thread_.Stop();
-  }
-
-  // Deleting |controller| shouldn't crash even though that causes a task to be
-  // posted to the MessageLoopForIO thread.
-  controller = nullptr;
-}
-
-INSTANTIATE_TEST_CASE_P(
-    MessageLoopForIOOnMainThread,
-    FileDescriptorWatcherTest,
-    ::testing::Values(
-        FileDescriptorWatcherTestType::MESSAGE_LOOP_FOR_IO_ON_MAIN_THREAD));
-INSTANTIATE_TEST_CASE_P(
-    MessageLoopForIOOnOtherThread,
-    FileDescriptorWatcherTest,
-    ::testing::Values(
-        FileDescriptorWatcherTestType::MESSAGE_LOOP_FOR_IO_ON_OTHER_THREAD));
-
-}  // namespace base
diff --git a/base/files/file_enumerator_unittest.cc b/base/files/file_enumerator_unittest.cc
deleted file mode 100644
index 11df075..0000000
--- a/base/files/file_enumerator_unittest.cc
+++ /dev/null
@@ -1,312 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file_enumerator.h"
-
-#include <utility>
-#include <vector>
-
-#include "base/containers/circular_deque.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using testing::ElementsAre;
-using testing::IsEmpty;
-using testing::UnorderedElementsAre;
-
-namespace base {
-namespace {
-
-const FilePath::StringType kEmptyPattern;
-
-const std::vector<FileEnumerator::FolderSearchPolicy> kFolderSearchPolicies{
-    FileEnumerator::FolderSearchPolicy::MATCH_ONLY,
-    FileEnumerator::FolderSearchPolicy::ALL};
-
-circular_deque<FilePath> RunEnumerator(
-    const FilePath& root_path,
-    bool recursive,
-    int file_type,
-    const FilePath::StringType& pattern,
-    FileEnumerator::FolderSearchPolicy folder_search_policy) {
-  circular_deque<FilePath> rv;
-  FileEnumerator enumerator(root_path, recursive, file_type, pattern,
-                            folder_search_policy);
-  for (auto file = enumerator.Next(); !file.empty(); file = enumerator.Next())
-    rv.emplace_back(std::move(file));
-  return rv;
-}
-
-bool CreateDummyFile(const FilePath& path) {
-  return WriteFile(path, "42", sizeof("42")) == sizeof("42");
-}
-
-}  // namespace
-
-TEST(FileEnumerator, NotExistingPath) {
-  const FilePath path = FilePath::FromUTF8Unsafe("some_not_existing_path");
-  ASSERT_FALSE(PathExists(path));
-
-  for (auto policy : kFolderSearchPolicies) {
-    const auto files = RunEnumerator(
-        path, true, FileEnumerator::FILES & FileEnumerator::DIRECTORIES,
-        FILE_PATH_LITERAL(""), policy);
-    EXPECT_THAT(files, IsEmpty());
-  }
-}
-
-TEST(FileEnumerator, EmptyFolder) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  for (auto policy : kFolderSearchPolicies) {
-    const auto files =
-        RunEnumerator(temp_dir.GetPath(), true,
-                      FileEnumerator::FILES & FileEnumerator::DIRECTORIES,
-                      kEmptyPattern, policy);
-    EXPECT_THAT(files, IsEmpty());
-  }
-}
-
-TEST(FileEnumerator, SingleFileInFolderForFileSearch) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath& path = temp_dir.GetPath();
-  const FilePath file = path.AppendASCII("test.txt");
-  ASSERT_TRUE(CreateDummyFile(file));
-
-  for (auto policy : kFolderSearchPolicies) {
-    const auto files = RunEnumerator(
-        temp_dir.GetPath(), true, FileEnumerator::FILES, kEmptyPattern, policy);
-    EXPECT_THAT(files, ElementsAre(file));
-  }
-}
-
-TEST(FileEnumerator, SingleFileInFolderForDirSearch) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath& path = temp_dir.GetPath();
-  ASSERT_TRUE(CreateDummyFile(path.AppendASCII("test.txt")));
-
-  for (auto policy : kFolderSearchPolicies) {
-    const auto files = RunEnumerator(path, true, FileEnumerator::DIRECTORIES,
-                                     kEmptyPattern, policy);
-    EXPECT_THAT(files, IsEmpty());
-  }
-}
-
-TEST(FileEnumerator, SingleFileInFolderWithFiltering) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath& path = temp_dir.GetPath();
-  const FilePath file = path.AppendASCII("test.txt");
-  ASSERT_TRUE(CreateDummyFile(file));
-
-  for (auto policy : kFolderSearchPolicies) {
-    auto files = RunEnumerator(path, true, FileEnumerator::FILES,
-                               FILE_PATH_LITERAL("*.txt"), policy);
-    EXPECT_THAT(files, ElementsAre(file));
-
-    files = RunEnumerator(path, true, FileEnumerator::FILES,
-                          FILE_PATH_LITERAL("*.pdf"), policy);
-    EXPECT_THAT(files, IsEmpty());
-  }
-}
-
-TEST(FileEnumerator, TwoFilesInFolder) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath& path = temp_dir.GetPath();
-  const FilePath foo_txt = path.AppendASCII("foo.txt");
-  const FilePath bar_txt = path.AppendASCII("bar.txt");
-  ASSERT_TRUE(CreateDummyFile(foo_txt));
-  ASSERT_TRUE(CreateDummyFile(bar_txt));
-
-  for (auto policy : kFolderSearchPolicies) {
-    auto files = RunEnumerator(path, true, FileEnumerator::FILES,
-                               FILE_PATH_LITERAL("*.txt"), policy);
-    EXPECT_THAT(files, UnorderedElementsAre(foo_txt, bar_txt));
-
-    files = RunEnumerator(path, true, FileEnumerator::FILES,
-                          FILE_PATH_LITERAL("foo*"), policy);
-    EXPECT_THAT(files, ElementsAre(foo_txt));
-
-    files = RunEnumerator(path, true, FileEnumerator::FILES,
-                          FILE_PATH_LITERAL("*.pdf"), policy);
-    EXPECT_THAT(files, IsEmpty());
-
-    files =
-        RunEnumerator(path, true, FileEnumerator::FILES, kEmptyPattern, policy);
-    EXPECT_THAT(files, UnorderedElementsAre(foo_txt, bar_txt));
-  }
-}
-
-TEST(FileEnumerator, SingleFolderInFolderForFileSearch) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath& path = temp_dir.GetPath();
-
-  ScopedTempDir temp_subdir;
-  ASSERT_TRUE(temp_subdir.CreateUniqueTempDirUnderPath(path));
-
-  for (auto policy : kFolderSearchPolicies) {
-    const auto files =
-        RunEnumerator(path, true, FileEnumerator::FILES, kEmptyPattern, policy);
-    EXPECT_THAT(files, IsEmpty());
-  }
-}
-
-TEST(FileEnumerator, SingleFolderInFolderForDirSearch) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath& path = temp_dir.GetPath();
-
-  ScopedTempDir temp_subdir;
-  ASSERT_TRUE(temp_subdir.CreateUniqueTempDirUnderPath(path));
-
-  for (auto policy : kFolderSearchPolicies) {
-    const auto files = RunEnumerator(path, true, FileEnumerator::DIRECTORIES,
-                                     kEmptyPattern, policy);
-    EXPECT_THAT(files, ElementsAre(temp_subdir.GetPath()));
-  }
-}
-
-TEST(FileEnumerator, TwoFoldersInFolder) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath& path = temp_dir.GetPath();
-
-  const FilePath subdir_foo = path.AppendASCII("foo");
-  const FilePath subdir_bar = path.AppendASCII("bar");
-  ASSERT_TRUE(CreateDirectory(subdir_foo));
-  ASSERT_TRUE(CreateDirectory(subdir_bar));
-
-  for (auto policy : kFolderSearchPolicies) {
-    auto files = RunEnumerator(path, true, FileEnumerator::DIRECTORIES,
-                               kEmptyPattern, policy);
-    EXPECT_THAT(files, UnorderedElementsAre(subdir_foo, subdir_bar));
-
-    files = RunEnumerator(path, true, FileEnumerator::DIRECTORIES,
-                          FILE_PATH_LITERAL("foo"), policy);
-    EXPECT_THAT(files, ElementsAre(subdir_foo));
-  }
-}
-
-TEST(FileEnumerator, FolderAndFileInFolder) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath& path = temp_dir.GetPath();
-
-  ScopedTempDir temp_subdir;
-  ASSERT_TRUE(temp_subdir.CreateUniqueTempDirUnderPath(path));
-  const FilePath file = path.AppendASCII("test.txt");
-  ASSERT_TRUE(CreateDummyFile(file));
-
-  for (auto policy : kFolderSearchPolicies) {
-    auto files =
-        RunEnumerator(path, true, FileEnumerator::FILES, kEmptyPattern, policy);
-    EXPECT_THAT(files, ElementsAre(file));
-
-    files = RunEnumerator(path, true, FileEnumerator::DIRECTORIES,
-                          kEmptyPattern, policy);
-    EXPECT_THAT(files, ElementsAre(temp_subdir.GetPath()));
-
-    files = RunEnumerator(path, true,
-                          FileEnumerator::FILES | FileEnumerator::DIRECTORIES,
-                          kEmptyPattern, policy);
-    EXPECT_THAT(files, UnorderedElementsAre(file, temp_subdir.GetPath()));
-  }
-}
-
-TEST(FileEnumerator, FilesInParentFolderAlwaysFirst) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath& path = temp_dir.GetPath();
-
-  ScopedTempDir temp_subdir;
-  ASSERT_TRUE(temp_subdir.CreateUniqueTempDirUnderPath(path));
-  const FilePath foo_txt = path.AppendASCII("foo.txt");
-  const FilePath bar_txt = temp_subdir.GetPath().AppendASCII("bar.txt");
-  ASSERT_TRUE(CreateDummyFile(foo_txt));
-  ASSERT_TRUE(CreateDummyFile(bar_txt));
-
-  for (auto policy : kFolderSearchPolicies) {
-    const auto files =
-        RunEnumerator(path, true, FileEnumerator::FILES, kEmptyPattern, policy);
-    EXPECT_THAT(files, ElementsAre(foo_txt, bar_txt));
-  }
-}
-
-TEST(FileEnumerator, FileInSubfolder) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath subdir = temp_dir.GetPath().AppendASCII("subdir");
-  ASSERT_TRUE(CreateDirectory(subdir));
-
-  const FilePath file = subdir.AppendASCII("test.txt");
-  ASSERT_TRUE(CreateDummyFile(file));
-
-  for (auto policy : kFolderSearchPolicies) {
-    auto files = RunEnumerator(temp_dir.GetPath(), true, FileEnumerator::FILES,
-                               kEmptyPattern, policy);
-    EXPECT_THAT(files, ElementsAre(file));
-
-    files = RunEnumerator(temp_dir.GetPath(), false, FileEnumerator::FILES,
-                          kEmptyPattern, policy);
-    EXPECT_THAT(files, IsEmpty());
-  }
-}
-
-TEST(FileEnumerator, FilesInSubfoldersWithFiltering) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath test_txt = temp_dir.GetPath().AppendASCII("test.txt");
-  const FilePath subdir_foo = temp_dir.GetPath().AppendASCII("foo_subdir");
-  const FilePath subdir_bar = temp_dir.GetPath().AppendASCII("bar_subdir");
-  const FilePath foo_test = subdir_foo.AppendASCII("test.txt");
-  const FilePath foo_foo = subdir_foo.AppendASCII("foo.txt");
-  const FilePath foo_bar = subdir_foo.AppendASCII("bar.txt");
-  const FilePath bar_test = subdir_bar.AppendASCII("test.txt");
-  const FilePath bar_foo = subdir_bar.AppendASCII("foo.txt");
-  const FilePath bar_bar = subdir_bar.AppendASCII("bar.txt");
-  ASSERT_TRUE(CreateDummyFile(test_txt));
-  ASSERT_TRUE(CreateDirectory(subdir_foo));
-  ASSERT_TRUE(CreateDirectory(subdir_bar));
-  ASSERT_TRUE(CreateDummyFile(foo_test));
-  ASSERT_TRUE(CreateDummyFile(foo_foo));
-  ASSERT_TRUE(CreateDummyFile(foo_bar));
-  ASSERT_TRUE(CreateDummyFile(bar_test));
-  ASSERT_TRUE(CreateDummyFile(bar_foo));
-  ASSERT_TRUE(CreateDummyFile(bar_bar));
-
-  auto files =
-      RunEnumerator(temp_dir.GetPath(), true,
-                    FileEnumerator::FILES | FileEnumerator::DIRECTORIES,
-                    FILE_PATH_LITERAL("foo*"),
-                    FileEnumerator::FolderSearchPolicy::MATCH_ONLY);
-  EXPECT_THAT(files,
-              UnorderedElementsAre(subdir_foo, foo_test, foo_foo, foo_bar));
-
-  files = RunEnumerator(temp_dir.GetPath(), true,
-                        FileEnumerator::FILES | FileEnumerator::DIRECTORIES,
-                        FILE_PATH_LITERAL("foo*"),
-                        FileEnumerator::FolderSearchPolicy::ALL);
-  EXPECT_THAT(files, UnorderedElementsAre(subdir_foo, foo_foo, bar_foo));
-}
-
-}  // namespace base
diff --git a/base/files/file_locking_unittest.cc b/base/files/file_locking_unittest.cc
deleted file mode 100644
index bfe62ce..0000000
--- a/base/files/file_locking_unittest.cc
+++ /dev/null
@@ -1,232 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/command_line.h"
-#include "base/files/file.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/macros.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-
-using base::File;
-using base::FilePath;
-
-namespace {
-
-// Flag for the parent to share a temp dir to the child.
-const char kTempDirFlag[] = "temp-dir";
-
-// Flags to control how the subprocess unlocks the file.
-const char kFileUnlock[] = "file-unlock";
-const char kCloseUnlock[] = "close-unlock";
-const char kExitUnlock[] = "exit-unlock";
-
-// File to lock in temp dir.
-const char kLockFile[] = "lockfile";
-
-// Constants for various requests and responses, used as |signal_file| parameter
-// to signal/wait helpers.
-const char kSignalLockFileLocked[] = "locked.signal";
-const char kSignalLockFileClose[] = "close.signal";
-const char kSignalLockFileClosed[] = "closed.signal";
-const char kSignalLockFileUnlock[] = "unlock.signal";
-const char kSignalLockFileUnlocked[] = "unlocked.signal";
-const char kSignalExit[] = "exit.signal";
-
-// Signal an event by creating a file which didn't previously exist.
-bool SignalEvent(const FilePath& signal_dir, const char* signal_file) {
-  File file(signal_dir.AppendASCII(signal_file),
-            File::FLAG_CREATE | File::FLAG_WRITE);
-  return file.IsValid();
-}
-
-// Check whether an event was signaled.
-bool CheckEvent(const FilePath& signal_dir, const char* signal_file) {
-  File file(signal_dir.AppendASCII(signal_file),
-            File::FLAG_OPEN | File::FLAG_READ);
-  return file.IsValid();
-}
-
-// Busy-wait for an event to be signaled, returning false for timeout.
-bool WaitForEventWithTimeout(const FilePath& signal_dir,
-                             const char* signal_file,
-                             const base::TimeDelta& timeout) {
-  const base::Time finish_by = base::Time::Now() + timeout;
-  while (!CheckEvent(signal_dir, signal_file)) {
-    if (base::Time::Now() > finish_by)
-      return false;
-    base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
-  }
-  return true;
-}
-
-// Wait forever for the event to be signaled (should never return false).
-bool WaitForEvent(const FilePath& signal_dir, const char* signal_file) {
-  return WaitForEventWithTimeout(signal_dir, signal_file,
-                                 base::TimeDelta::Max());
-}
-
-// Keep these in sync so StartChild*() can refer to correct test main.
-#define ChildMain ChildLockUnlock
-#define ChildMainString "ChildLockUnlock"
-
-// Subprocess to test getting a file lock then releasing it.  |kTempDirFlag|
-// must pass in an existing temporary directory for the lockfile and signal
-// files.  One of the following flags must be passed to determine how to unlock
-// the lock file:
-// - |kFileUnlock| calls Unlock() to unlock.
-// - |kCloseUnlock| calls Close() while the lock is held.
-// - |kExitUnlock| exits while the lock is held.
-MULTIPROCESS_TEST_MAIN(ChildMain) {
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  const FilePath temp_path = command_line->GetSwitchValuePath(kTempDirFlag);
-  CHECK(base::DirectoryExists(temp_path));
-
-  // Immediately lock the file.
-  File file(temp_path.AppendASCII(kLockFile),
-            File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE);
-  CHECK(file.IsValid());
-  CHECK_EQ(File::FILE_OK, file.Lock());
-  CHECK(SignalEvent(temp_path, kSignalLockFileLocked));
-
-  if (command_line->HasSwitch(kFileUnlock)) {
-    // Wait for signal to unlock, then unlock the file.
-    CHECK(WaitForEvent(temp_path, kSignalLockFileUnlock));
-    CHECK_EQ(File::FILE_OK, file.Unlock());
-    CHECK(SignalEvent(temp_path, kSignalLockFileUnlocked));
-  } else if (command_line->HasSwitch(kCloseUnlock)) {
-    // Wait for the signal to close, then close the file.
-    CHECK(WaitForEvent(temp_path, kSignalLockFileClose));
-    file.Close();
-    CHECK(!file.IsValid());
-    CHECK(SignalEvent(temp_path, kSignalLockFileClosed));
-  } else {
-    CHECK(command_line->HasSwitch(kExitUnlock));
-  }
-
-  // Wait for signal to exit, so that unlock or close can be distinguished from
-  // exit.
-  CHECK(WaitForEvent(temp_path, kSignalExit));
-  return 0;
-}
-
-}  // namespace
-
-class FileLockingTest : public testing::Test {
- public:
-  FileLockingTest() = default;
-
- protected:
-  void SetUp() override {
-    testing::Test::SetUp();
-
-    // Setup the temp dir and the lock file.
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-    lock_file_.Initialize(
-        temp_dir_.GetPath().AppendASCII(kLockFile),
-        File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE);
-    ASSERT_TRUE(lock_file_.IsValid());
-  }
-
-  bool SignalEvent(const char* signal_file) {
-    return ::SignalEvent(temp_dir_.GetPath(), signal_file);
-  }
-
-  bool WaitForEventOrTimeout(const char* signal_file) {
-    return ::WaitForEventWithTimeout(temp_dir_.GetPath(), signal_file,
-                                     TestTimeouts::action_timeout());
-  }
-
-  // Start a child process set to use the specified unlock action, and wait for
-  // it to lock the file.
-  void StartChildAndSignalLock(const char* unlock_action) {
-    // Create a temporary dir and spin up a ChildLockExit subprocess against it.
-    const FilePath temp_path = temp_dir_.GetPath();
-    base::CommandLine child_command_line(
-        base::GetMultiProcessTestChildBaseCommandLine());
-    child_command_line.AppendSwitchPath(kTempDirFlag, temp_path);
-    child_command_line.AppendSwitch(unlock_action);
-    lock_child_ = base::SpawnMultiProcessTestChild(
-        ChildMainString, child_command_line, base::LaunchOptions());
-    ASSERT_TRUE(lock_child_.IsValid());
-
-    // Wait for the child to lock the file.
-    ASSERT_TRUE(WaitForEventOrTimeout(kSignalLockFileLocked));
-  }
-
-  // Signal the child to exit cleanly.
-  void ExitChildCleanly() {
-    ASSERT_TRUE(SignalEvent(kSignalExit));
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        lock_child_, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-
-  base::ScopedTempDir temp_dir_;
-  base::File lock_file_;
-  base::Process lock_child_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FileLockingTest);
-};
-
-// Test that locks are released by Unlock().
-TEST_F(FileLockingTest, LockAndUnlock) {
-  StartChildAndSignalLock(kFileUnlock);
-
-  ASSERT_NE(File::FILE_OK, lock_file_.Lock());
-  ASSERT_TRUE(SignalEvent(kSignalLockFileUnlock));
-  ASSERT_TRUE(WaitForEventOrTimeout(kSignalLockFileUnlocked));
-  ASSERT_EQ(File::FILE_OK, lock_file_.Lock());
-  ASSERT_EQ(File::FILE_OK, lock_file_.Unlock());
-
-  ExitChildCleanly();
-}
-
-// Test that locks are released on Close().
-TEST_F(FileLockingTest, UnlockOnClose) {
-  StartChildAndSignalLock(kCloseUnlock);
-
-  ASSERT_NE(File::FILE_OK, lock_file_.Lock());
-  ASSERT_TRUE(SignalEvent(kSignalLockFileClose));
-  ASSERT_TRUE(WaitForEventOrTimeout(kSignalLockFileClosed));
-  ASSERT_EQ(File::FILE_OK, lock_file_.Lock());
-  ASSERT_EQ(File::FILE_OK, lock_file_.Unlock());
-
-  ExitChildCleanly();
-}
-
-// Test that locks are released on exit.
-TEST_F(FileLockingTest, UnlockOnExit) {
-  StartChildAndSignalLock(kExitUnlock);
-
-  ASSERT_NE(File::FILE_OK, lock_file_.Lock());
-  ExitChildCleanly();
-  ASSERT_EQ(File::FILE_OK, lock_file_.Lock());
-  ASSERT_EQ(File::FILE_OK, lock_file_.Unlock());
-}
-
-// Test that killing the process releases the lock.  This should cover crashing.
-// Flaky on Android (http://crbug.com/747518)
-#if defined(OS_ANDROID)
-#define MAYBE_UnlockOnTerminate DISABLED_UnlockOnTerminate
-#else
-#define MAYBE_UnlockOnTerminate UnlockOnTerminate
-#endif
-TEST_F(FileLockingTest, MAYBE_UnlockOnTerminate) {
-  // The child will wait for an exit which never arrives.
-  StartChildAndSignalLock(kExitUnlock);
-
-  ASSERT_NE(File::FILE_OK, lock_file_.Lock());
-  ASSERT_TRUE(TerminateMultiProcessTestChild(lock_child_, 0, true));
-  ASSERT_EQ(File::FILE_OK, lock_file_.Lock());
-  ASSERT_EQ(File::FILE_OK, lock_file_.Unlock());
-}
diff --git a/base/files/file_path_unittest.cc b/base/files/file_path_unittest.cc
deleted file mode 100644
index d0fd00e..0000000
--- a/base/files/file_path_unittest.cc
+++ /dev/null
@@ -1,1319 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include <sstream>
-
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-#include "base/test/scoped_locale.h"
-#endif
-
-// This macro helps avoid wrapped lines in the test structs.
-#define FPL(x) FILE_PATH_LITERAL(x)
-
-// This macro constructs strings which can contain NULs.
-#define FPS(x) FilePath::StringType(FPL(x), arraysize(FPL(x)) - 1)
-
-namespace base {
-
-struct UnaryTestData {
-  const FilePath::CharType* input;
-  const FilePath::CharType* expected;
-};
-
-struct UnaryBooleanTestData {
-  const FilePath::CharType* input;
-  bool expected;
-};
-
-struct BinaryTestData {
-  const FilePath::CharType* inputs[2];
-  const FilePath::CharType* expected;
-};
-
-struct BinaryBooleanTestData {
-  const FilePath::CharType* inputs[2];
-  bool expected;
-};
-
-struct BinaryIntTestData {
-  const FilePath::CharType* inputs[2];
-  int expected;
-};
-
-struct UTF8TestData {
-  const FilePath::CharType* native;
-  const char* utf8;
-};
-
-// file_util winds up using autoreleased objects on the Mac, so this needs
-// to be a PlatformTest
-typedef PlatformTest FilePathTest;
-
-TEST_F(FilePathTest, DirName) {
-  const struct UnaryTestData cases[] = {
-    { FPL(""),              FPL(".") },
-    { FPL("aa"),            FPL(".") },
-    { FPL("/aa/bb"),        FPL("/aa") },
-    { FPL("/aa/bb/"),       FPL("/aa") },
-    { FPL("/aa/bb//"),      FPL("/aa") },
-    { FPL("/aa/bb/ccc"),    FPL("/aa/bb") },
-    { FPL("/aa"),           FPL("/") },
-    { FPL("/aa/"),          FPL("/") },
-    { FPL("/"),             FPL("/") },
-    { FPL("//"),            FPL("//") },
-    { FPL("///"),           FPL("/") },
-    { FPL("aa/"),           FPL(".") },
-    { FPL("aa/bb"),         FPL("aa") },
-    { FPL("aa/bb/"),        FPL("aa") },
-    { FPL("aa/bb//"),       FPL("aa") },
-    { FPL("aa//bb//"),      FPL("aa") },
-    { FPL("aa//bb/"),       FPL("aa") },
-    { FPL("aa//bb"),        FPL("aa") },
-    { FPL("//aa/bb"),       FPL("//aa") },
-    { FPL("//aa/"),         FPL("//") },
-    { FPL("//aa"),          FPL("//") },
-    { FPL("0:"),            FPL(".") },
-    { FPL("@:"),            FPL(".") },
-    { FPL("[:"),            FPL(".") },
-    { FPL("`:"),            FPL(".") },
-    { FPL("{:"),            FPL(".") },
-    { FPL("\xB3:"),         FPL(".") },
-    { FPL("\xC5:"),         FPL(".") },
-    { FPL("/aa/../bb/cc"),  FPL("/aa/../bb")},
-#if defined(OS_WIN)
-    { FPL("\x0143:"),       FPL(".") },
-#endif  // OS_WIN
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { FPL("c:"),            FPL("c:") },
-    { FPL("C:"),            FPL("C:") },
-    { FPL("A:"),            FPL("A:") },
-    { FPL("Z:"),            FPL("Z:") },
-    { FPL("a:"),            FPL("a:") },
-    { FPL("z:"),            FPL("z:") },
-    { FPL("c:aa"),          FPL("c:") },
-    { FPL("c:/"),           FPL("c:/") },
-    { FPL("c://"),          FPL("c://") },
-    { FPL("c:///"),         FPL("c:/") },
-    { FPL("c:/aa"),         FPL("c:/") },
-    { FPL("c:/aa/"),        FPL("c:/") },
-    { FPL("c:/aa/bb"),      FPL("c:/aa") },
-    { FPL("c:aa/bb"),       FPL("c:aa") },
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { FPL("\\aa\\bb"),      FPL("\\aa") },
-    { FPL("\\aa\\bb\\"),    FPL("\\aa") },
-    { FPL("\\aa\\bb\\\\"),  FPL("\\aa") },
-    { FPL("\\aa\\bb\\ccc"), FPL("\\aa\\bb") },
-    { FPL("\\aa"),          FPL("\\") },
-    { FPL("\\aa\\"),        FPL("\\") },
-    { FPL("\\"),            FPL("\\") },
-    { FPL("\\\\"),          FPL("\\\\") },
-    { FPL("\\\\\\"),        FPL("\\") },
-    { FPL("aa\\"),          FPL(".") },
-    { FPL("aa\\bb"),        FPL("aa") },
-    { FPL("aa\\bb\\"),      FPL("aa") },
-    { FPL("aa\\bb\\\\"),    FPL("aa") },
-    { FPL("aa\\\\bb\\\\"),  FPL("aa") },
-    { FPL("aa\\\\bb\\"),    FPL("aa") },
-    { FPL("aa\\\\bb"),      FPL("aa") },
-    { FPL("\\\\aa\\bb"),    FPL("\\\\aa") },
-    { FPL("\\\\aa\\"),      FPL("\\\\") },
-    { FPL("\\\\aa"),        FPL("\\\\") },
-    { FPL("aa\\..\\bb\\c"), FPL("aa\\..\\bb")},
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { FPL("c:\\"),          FPL("c:\\") },
-    { FPL("c:\\\\"),        FPL("c:\\\\") },
-    { FPL("c:\\\\\\"),      FPL("c:\\") },
-    { FPL("c:\\aa"),        FPL("c:\\") },
-    { FPL("c:\\aa\\"),      FPL("c:\\") },
-    { FPL("c:\\aa\\bb"),    FPL("c:\\aa") },
-    { FPL("c:aa\\bb"),      FPL("c:aa") },
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#endif  // FILE_PATH_USES_WIN_SEPARATORS
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath input(cases[i].input);
-    FilePath observed = input.DirName();
-    EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
-              "i: " << i << ", input: " << input.value();
-  }
-}
-
-TEST_F(FilePathTest, BaseName) {
-  const struct UnaryTestData cases[] = {
-    { FPL(""),              FPL("") },
-    { FPL("aa"),            FPL("aa") },
-    { FPL("/aa/bb"),        FPL("bb") },
-    { FPL("/aa/bb/"),       FPL("bb") },
-    { FPL("/aa/bb//"),      FPL("bb") },
-    { FPL("/aa/bb/ccc"),    FPL("ccc") },
-    { FPL("/aa"),           FPL("aa") },
-    { FPL("/"),             FPL("/") },
-    { FPL("//"),            FPL("//") },
-    { FPL("///"),           FPL("/") },
-    { FPL("aa/"),           FPL("aa") },
-    { FPL("aa/bb"),         FPL("bb") },
-    { FPL("aa/bb/"),        FPL("bb") },
-    { FPL("aa/bb//"),       FPL("bb") },
-    { FPL("aa//bb//"),      FPL("bb") },
-    { FPL("aa//bb/"),       FPL("bb") },
-    { FPL("aa//bb"),        FPL("bb") },
-    { FPL("//aa/bb"),       FPL("bb") },
-    { FPL("//aa/"),         FPL("aa") },
-    { FPL("//aa"),          FPL("aa") },
-    { FPL("0:"),            FPL("0:") },
-    { FPL("@:"),            FPL("@:") },
-    { FPL("[:"),            FPL("[:") },
-    { FPL("`:"),            FPL("`:") },
-    { FPL("{:"),            FPL("{:") },
-    { FPL("\xB3:"),         FPL("\xB3:") },
-    { FPL("\xC5:"),         FPL("\xC5:") },
-#if defined(OS_WIN)
-    { FPL("\x0143:"),       FPL("\x0143:") },
-#endif  // OS_WIN
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { FPL("c:"),            FPL("") },
-    { FPL("C:"),            FPL("") },
-    { FPL("A:"),            FPL("") },
-    { FPL("Z:"),            FPL("") },
-    { FPL("a:"),            FPL("") },
-    { FPL("z:"),            FPL("") },
-    { FPL("c:aa"),          FPL("aa") },
-    { FPL("c:/"),           FPL("/") },
-    { FPL("c://"),          FPL("//") },
-    { FPL("c:///"),         FPL("/") },
-    { FPL("c:/aa"),         FPL("aa") },
-    { FPL("c:/aa/"),        FPL("aa") },
-    { FPL("c:/aa/bb"),      FPL("bb") },
-    { FPL("c:aa/bb"),       FPL("bb") },
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { FPL("\\aa\\bb"),      FPL("bb") },
-    { FPL("\\aa\\bb\\"),    FPL("bb") },
-    { FPL("\\aa\\bb\\\\"),  FPL("bb") },
-    { FPL("\\aa\\bb\\ccc"), FPL("ccc") },
-    { FPL("\\aa"),          FPL("aa") },
-    { FPL("\\"),            FPL("\\") },
-    { FPL("\\\\"),          FPL("\\\\") },
-    { FPL("\\\\\\"),        FPL("\\") },
-    { FPL("aa\\"),          FPL("aa") },
-    { FPL("aa\\bb"),        FPL("bb") },
-    { FPL("aa\\bb\\"),      FPL("bb") },
-    { FPL("aa\\bb\\\\"),    FPL("bb") },
-    { FPL("aa\\\\bb\\\\"),  FPL("bb") },
-    { FPL("aa\\\\bb\\"),    FPL("bb") },
-    { FPL("aa\\\\bb"),      FPL("bb") },
-    { FPL("\\\\aa\\bb"),    FPL("bb") },
-    { FPL("\\\\aa\\"),      FPL("aa") },
-    { FPL("\\\\aa"),        FPL("aa") },
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { FPL("c:\\"),          FPL("\\") },
-    { FPL("c:\\\\"),        FPL("\\\\") },
-    { FPL("c:\\\\\\"),      FPL("\\") },
-    { FPL("c:\\aa"),        FPL("aa") },
-    { FPL("c:\\aa\\"),      FPL("aa") },
-    { FPL("c:\\aa\\bb"),    FPL("bb") },
-    { FPL("c:aa\\bb"),      FPL("bb") },
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#endif  // FILE_PATH_USES_WIN_SEPARATORS
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath input(cases[i].input);
-    FilePath observed = input.BaseName();
-    EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
-              "i: " << i << ", input: " << input.value();
-  }
-}
-
-TEST_F(FilePathTest, Append) {
-  const struct BinaryTestData cases[] = {
-    { { FPL(""),           FPL("cc") }, FPL("cc") },
-    { { FPL("."),          FPL("ff") }, FPL("ff") },
-    { { FPL("."),          FPL("") },   FPL(".") },
-    { { FPL("/"),          FPL("cc") }, FPL("/cc") },
-    { { FPL("/aa"),        FPL("") },   FPL("/aa") },
-    { { FPL("/aa/"),       FPL("") },   FPL("/aa") },
-    { { FPL("//aa"),       FPL("") },   FPL("//aa") },
-    { { FPL("//aa/"),      FPL("") },   FPL("//aa") },
-    { { FPL("//"),         FPL("aa") }, FPL("//aa") },
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { { FPL("c:"),         FPL("a") },  FPL("c:a") },
-    { { FPL("c:"),         FPL("") },   FPL("c:") },
-    { { FPL("c:/"),        FPL("a") },  FPL("c:/a") },
-    { { FPL("c://"),       FPL("a") },  FPL("c://a") },
-    { { FPL("c:///"),      FPL("a") },  FPL("c:/a") },
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    // Append introduces the default separator character, so these test cases
-    // need to be defined with different expected results on platforms that use
-    // different default separator characters.
-    { { FPL("\\"),         FPL("cc") }, FPL("\\cc") },
-    { { FPL("\\aa"),       FPL("") },   FPL("\\aa") },
-    { { FPL("\\aa\\"),     FPL("") },   FPL("\\aa") },
-    { { FPL("\\\\aa"),     FPL("") },   FPL("\\\\aa") },
-    { { FPL("\\\\aa\\"),   FPL("") },   FPL("\\\\aa") },
-    { { FPL("\\\\"),       FPL("aa") }, FPL("\\\\aa") },
-    { { FPL("/aa/bb"),     FPL("cc") }, FPL("/aa/bb\\cc") },
-    { { FPL("/aa/bb/"),    FPL("cc") }, FPL("/aa/bb\\cc") },
-    { { FPL("aa/bb/"),     FPL("cc") }, FPL("aa/bb\\cc") },
-    { { FPL("aa/bb"),      FPL("cc") }, FPL("aa/bb\\cc") },
-    { { FPL("a/b"),        FPL("c") },  FPL("a/b\\c") },
-    { { FPL("a/b/"),       FPL("c") },  FPL("a/b\\c") },
-    { { FPL("//aa"),       FPL("bb") }, FPL("//aa\\bb") },
-    { { FPL("//aa/"),      FPL("bb") }, FPL("//aa\\bb") },
-    { { FPL("\\aa\\bb"),   FPL("cc") }, FPL("\\aa\\bb\\cc") },
-    { { FPL("\\aa\\bb\\"), FPL("cc") }, FPL("\\aa\\bb\\cc") },
-    { { FPL("aa\\bb\\"),   FPL("cc") }, FPL("aa\\bb\\cc") },
-    { { FPL("aa\\bb"),     FPL("cc") }, FPL("aa\\bb\\cc") },
-    { { FPL("a\\b"),       FPL("c") },  FPL("a\\b\\c") },
-    { { FPL("a\\b\\"),     FPL("c") },  FPL("a\\b\\c") },
-    { { FPL("\\\\aa"),     FPL("bb") }, FPL("\\\\aa\\bb") },
-    { { FPL("\\\\aa\\"),   FPL("bb") }, FPL("\\\\aa\\bb") },
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { { FPL("c:\\"),       FPL("a") },  FPL("c:\\a") },
-    { { FPL("c:\\\\"),     FPL("a") },  FPL("c:\\\\a") },
-    { { FPL("c:\\\\\\"),   FPL("a") },  FPL("c:\\a") },
-    { { FPL("c:\\"),       FPL("") },   FPL("c:\\") },
-    { { FPL("c:\\a"),      FPL("b") },  FPL("c:\\a\\b") },
-    { { FPL("c:\\a\\"),    FPL("b") },  FPL("c:\\a\\b") },
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#else  // FILE_PATH_USES_WIN_SEPARATORS
-    { { FPL("/aa/bb"),     FPL("cc") }, FPL("/aa/bb/cc") },
-    { { FPL("/aa/bb/"),    FPL("cc") }, FPL("/aa/bb/cc") },
-    { { FPL("aa/bb/"),     FPL("cc") }, FPL("aa/bb/cc") },
-    { { FPL("aa/bb"),      FPL("cc") }, FPL("aa/bb/cc") },
-    { { FPL("a/b"),        FPL("c") },  FPL("a/b/c") },
-    { { FPL("a/b/"),       FPL("c") },  FPL("a/b/c") },
-    { { FPL("//aa"),       FPL("bb") }, FPL("//aa/bb") },
-    { { FPL("//aa/"),      FPL("bb") }, FPL("//aa/bb") },
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { { FPL("c:/"),        FPL("a") },  FPL("c:/a") },
-    { { FPL("c:/"),        FPL("") },   FPL("c:/") },
-    { { FPL("c:/a"),       FPL("b") },  FPL("c:/a/b") },
-    { { FPL("c:/a/"),      FPL("b") },  FPL("c:/a/b") },
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#endif  // FILE_PATH_USES_WIN_SEPARATORS
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath root(cases[i].inputs[0]);
-    FilePath::StringType leaf(cases[i].inputs[1]);
-    FilePath observed_str = root.Append(leaf);
-    EXPECT_EQ(FilePath::StringType(cases[i].expected), observed_str.value()) <<
-              "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
-    FilePath observed_path = root.Append(FilePath(leaf));
-    EXPECT_EQ(FilePath::StringType(cases[i].expected), observed_path.value()) <<
-              "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
-
-    // TODO(erikkay): It would be nice to have a unicode test append value to
-    // handle the case when AppendASCII is passed UTF8
-#if defined(OS_WIN)
-    std::string ascii = WideToUTF8(leaf);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-    std::string ascii = leaf;
-#endif
-    observed_str = root.AppendASCII(ascii);
-    EXPECT_EQ(FilePath::StringType(cases[i].expected), observed_str.value()) <<
-              "i: " << i << ", root: " << root.value() << ", leaf: " << leaf;
-  }
-}
-
-TEST_F(FilePathTest, StripTrailingSeparators) {
-  const struct UnaryTestData cases[] = {
-    { FPL(""),              FPL("") },
-    { FPL("/"),             FPL("/") },
-    { FPL("//"),            FPL("//") },
-    { FPL("///"),           FPL("/") },
-    { FPL("////"),          FPL("/") },
-    { FPL("a/"),            FPL("a") },
-    { FPL("a//"),           FPL("a") },
-    { FPL("a///"),          FPL("a") },
-    { FPL("a////"),         FPL("a") },
-    { FPL("/a"),            FPL("/a") },
-    { FPL("/a/"),           FPL("/a") },
-    { FPL("/a//"),          FPL("/a") },
-    { FPL("/a///"),         FPL("/a") },
-    { FPL("/a////"),        FPL("/a") },
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { FPL("c:"),            FPL("c:") },
-    { FPL("c:/"),           FPL("c:/") },
-    { FPL("c://"),          FPL("c://") },
-    { FPL("c:///"),         FPL("c:/") },
-    { FPL("c:////"),        FPL("c:/") },
-    { FPL("c:/a"),          FPL("c:/a") },
-    { FPL("c:/a/"),         FPL("c:/a") },
-    { FPL("c:/a//"),        FPL("c:/a") },
-    { FPL("c:/a///"),       FPL("c:/a") },
-    { FPL("c:/a////"),      FPL("c:/a") },
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { FPL("\\"),            FPL("\\") },
-    { FPL("\\\\"),          FPL("\\\\") },
-    { FPL("\\\\\\"),        FPL("\\") },
-    { FPL("\\\\\\\\"),      FPL("\\") },
-    { FPL("a\\"),           FPL("a") },
-    { FPL("a\\\\"),         FPL("a") },
-    { FPL("a\\\\\\"),       FPL("a") },
-    { FPL("a\\\\\\\\"),     FPL("a") },
-    { FPL("\\a"),           FPL("\\a") },
-    { FPL("\\a\\"),         FPL("\\a") },
-    { FPL("\\a\\\\"),       FPL("\\a") },
-    { FPL("\\a\\\\\\"),     FPL("\\a") },
-    { FPL("\\a\\\\\\\\"),   FPL("\\a") },
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { FPL("c:\\"),          FPL("c:\\") },
-    { FPL("c:\\\\"),        FPL("c:\\\\") },
-    { FPL("c:\\\\\\"),      FPL("c:\\") },
-    { FPL("c:\\\\\\\\"),    FPL("c:\\") },
-    { FPL("c:\\a"),         FPL("c:\\a") },
-    { FPL("c:\\a\\"),       FPL("c:\\a") },
-    { FPL("c:\\a\\\\"),     FPL("c:\\a") },
-    { FPL("c:\\a\\\\\\"),   FPL("c:\\a") },
-    { FPL("c:\\a\\\\\\\\"), FPL("c:\\a") },
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#endif  // FILE_PATH_USES_WIN_SEPARATORS
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath input(cases[i].input);
-    FilePath observed = input.StripTrailingSeparators();
-    EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
-              "i: " << i << ", input: " << input.value();
-  }
-}
-
-TEST_F(FilePathTest, IsAbsolute) {
-  const struct UnaryBooleanTestData cases[] = {
-    { FPL(""),       false },
-    { FPL("a"),      false },
-    { FPL("c:"),     false },
-    { FPL("c:a"),    false },
-    { FPL("a/b"),    false },
-    { FPL("//"),     true },
-    { FPL("//a"),    true },
-    { FPL("c:a/b"),  false },
-    { FPL("?:/a"),   false },
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { FPL("/"),      false },
-    { FPL("/a"),     false },
-    { FPL("/."),     false },
-    { FPL("/.."),    false },
-    { FPL("c:/"),    true },
-    { FPL("c:/a"),   true },
-    { FPL("c:/."),   true },
-    { FPL("c:/.."),  true },
-    { FPL("C:/a"),   true },
-    { FPL("d:/a"),   true },
-#else  // FILE_PATH_USES_DRIVE_LETTERS
-    { FPL("/"),      true },
-    { FPL("/a"),     true },
-    { FPL("/."),     true },
-    { FPL("/.."),    true },
-    { FPL("c:/"),    false },
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { FPL("a\\b"),   false },
-    { FPL("\\\\"),   true },
-    { FPL("\\\\a"),  true },
-    { FPL("a\\b"),   false },
-    { FPL("\\\\"),   true },
-    { FPL("//a"),    true },
-    { FPL("c:a\\b"), false },
-    { FPL("?:\\a"),  false },
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { FPL("\\"),     false },
-    { FPL("\\a"),    false },
-    { FPL("\\."),    false },
-    { FPL("\\.."),   false },
-    { FPL("c:\\"),   true },
-    { FPL("c:\\"),   true },
-    { FPL("c:\\a"),  true },
-    { FPL("c:\\."),  true },
-    { FPL("c:\\.."), true },
-    { FPL("C:\\a"),  true },
-    { FPL("d:\\a"),  true },
-#else  // FILE_PATH_USES_DRIVE_LETTERS
-    { FPL("\\"),     true },
-    { FPL("\\a"),    true },
-    { FPL("\\."),    true },
-    { FPL("\\.."),   true },
-    { FPL("c:\\"),   false },
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#endif  // FILE_PATH_USES_WIN_SEPARATORS
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath input(cases[i].input);
-    bool observed = input.IsAbsolute();
-    EXPECT_EQ(cases[i].expected, observed) <<
-              "i: " << i << ", input: " << input.value();
-  }
-}
-
-TEST_F(FilePathTest, PathComponentsTest) {
-  const struct UnaryTestData cases[] = {
-    { FPL("//foo/bar/baz/"),          FPL("|//|foo|bar|baz")},
-    { FPL("///"),                     FPL("|/")},
-    { FPL("/foo//bar//baz/"),         FPL("|/|foo|bar|baz")},
-    { FPL("/foo/bar/baz/"),           FPL("|/|foo|bar|baz")},
-    { FPL("/foo/bar/baz//"),          FPL("|/|foo|bar|baz")},
-    { FPL("/foo/bar/baz///"),         FPL("|/|foo|bar|baz")},
-    { FPL("/foo/bar/baz"),            FPL("|/|foo|bar|baz")},
-    { FPL("/foo/bar.bot/baz.txt"),    FPL("|/|foo|bar.bot|baz.txt")},
-    { FPL("//foo//bar/baz"),          FPL("|//|foo|bar|baz")},
-    { FPL("/"),                       FPL("|/")},
-    { FPL("foo"),                     FPL("|foo")},
-    { FPL(""),                        FPL("")},
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { FPL("e:/foo"),                  FPL("|e:|/|foo")},
-    { FPL("e:/"),                     FPL("|e:|/")},
-    { FPL("e:"),                      FPL("|e:")},
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { FPL("../foo"),                  FPL("|..|foo")},
-    { FPL("./foo"),                   FPL("|foo")},
-    { FPL("../foo/bar/"),             FPL("|..|foo|bar") },
-    { FPL("\\\\foo\\bar\\baz\\"),     FPL("|\\\\|foo|bar|baz")},
-    { FPL("\\\\\\"),                  FPL("|\\")},
-    { FPL("\\foo\\\\bar\\\\baz\\"),   FPL("|\\|foo|bar|baz")},
-    { FPL("\\foo\\bar\\baz\\"),       FPL("|\\|foo|bar|baz")},
-    { FPL("\\foo\\bar\\baz\\\\"),     FPL("|\\|foo|bar|baz")},
-    { FPL("\\foo\\bar\\baz\\\\\\"),   FPL("|\\|foo|bar|baz")},
-    { FPL("\\foo\\bar\\baz"),         FPL("|\\|foo|bar|baz")},
-    { FPL("\\foo\\bar/baz\\\\\\"),    FPL("|\\|foo|bar|baz")},
-    { FPL("/foo\\bar\\baz"),          FPL("|/|foo|bar|baz")},
-    { FPL("\\foo\\bar.bot\\baz.txt"), FPL("|\\|foo|bar.bot|baz.txt")},
-    { FPL("\\\\foo\\\\bar\\baz"),     FPL("|\\\\|foo|bar|baz")},
-    { FPL("\\"),                      FPL("|\\")},
-#endif  // FILE_PATH_USES_WIN_SEPARATORS
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath input(cases[i].input);
-    std::vector<FilePath::StringType> comps;
-    input.GetComponents(&comps);
-
-    FilePath::StringType observed;
-    for (size_t j = 0; j < comps.size(); ++j) {
-      observed.append(FILE_PATH_LITERAL("|"), 1);
-      observed.append(comps[j]);
-    }
-    EXPECT_EQ(FilePath::StringType(cases[i].expected), observed) <<
-              "i: " << i << ", input: " << input.value();
-  }
-}
-
-TEST_F(FilePathTest, IsParentTest) {
-  const struct BinaryBooleanTestData cases[] = {
-    { { FPL("/"),             FPL("/foo/bar/baz") },      true},
-    { { FPL("/foo/bar"),      FPL("/foo/bar/baz") },      true},
-    { { FPL("/foo/bar/"),     FPL("/foo/bar/baz") },      true},
-    { { FPL("//foo/bar/"),    FPL("//foo/bar/baz") },     true},
-    { { FPL("/foo/bar"),      FPL("/foo2/bar/baz") },     false},
-    { { FPL("/foo/bar.txt"),  FPL("/foo/bar/baz") },      false},
-    { { FPL("/foo/bar"),      FPL("/foo/bar2/baz") },     false},
-    { { FPL("/foo/bar"),      FPL("/foo/bar") },          false},
-    { { FPL("/foo/bar/baz"),  FPL("/foo/bar") },          false},
-    { { FPL("foo/bar"),       FPL("foo/bar/baz") },       true},
-    { { FPL("foo/bar"),       FPL("foo2/bar/baz") },      false},
-    { { FPL("foo/bar"),       FPL("foo/bar2/baz") },      false},
-    { { FPL(""),              FPL("foo") },               false},
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { { FPL("c:/foo/bar"),    FPL("c:/foo/bar/baz") },    true},
-    { { FPL("E:/foo/bar"),    FPL("e:/foo/bar/baz") },    true},
-    { { FPL("f:/foo/bar"),    FPL("F:/foo/bar/baz") },    true},
-    { { FPL("E:/Foo/bar"),    FPL("e:/foo/bar/baz") },    false},
-    { { FPL("f:/foo/bar"),    FPL("F:/foo/Bar/baz") },    false},
-    { { FPL("c:/"),           FPL("c:/foo/bar/baz") },    true},
-    { { FPL("c:"),            FPL("c:/foo/bar/baz") },    true},
-    { { FPL("c:/foo/bar"),    FPL("d:/foo/bar/baz") },    false},
-    { { FPL("c:/foo/bar"),    FPL("D:/foo/bar/baz") },    false},
-    { { FPL("C:/foo/bar"),    FPL("d:/foo/bar/baz") },    false},
-    { { FPL("c:/foo/bar"),    FPL("c:/foo2/bar/baz") },   false},
-    { { FPL("e:/foo/bar"),    FPL("E:/foo2/bar/baz") },   false},
-    { { FPL("F:/foo/bar"),    FPL("f:/foo2/bar/baz") },   false},
-    { { FPL("c:/foo/bar"),    FPL("c:/foo/bar2/baz") },   false},
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { { FPL("\\foo\\bar"),    FPL("\\foo\\bar\\baz") },   true},
-    { { FPL("\\foo/bar"),     FPL("\\foo\\bar\\baz") },   true},
-    { { FPL("\\foo/bar"),     FPL("\\foo/bar/baz") },     true},
-    { { FPL("\\"),            FPL("\\foo\\bar\\baz") },   true},
-    { { FPL(""),              FPL("\\foo\\bar\\baz") },   false},
-    { { FPL("\\foo\\bar"),    FPL("\\foo2\\bar\\baz") },  false},
-    { { FPL("\\foo\\bar"),    FPL("\\foo\\bar2\\baz") },  false},
-#endif  // FILE_PATH_USES_WIN_SEPARATORS
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath parent(cases[i].inputs[0]);
-    FilePath child(cases[i].inputs[1]);
-
-    EXPECT_EQ(parent.IsParent(child), cases[i].expected) <<
-        "i: " << i << ", parent: " << parent.value() << ", child: " <<
-        child.value();
-  }
-}
-
-TEST_F(FilePathTest, AppendRelativePathTest) {
-  const struct BinaryTestData cases[] = {
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { { FPL("/"),             FPL("/foo/bar/baz") },      FPL("foo\\bar\\baz")},
-#else  // FILE_PATH_USES_WIN_SEPARATORS
-    { { FPL("/"),             FPL("/foo/bar/baz") },      FPL("foo/bar/baz")},
-#endif  // FILE_PATH_USES_WIN_SEPARATORS
-    { { FPL("/foo/bar"),      FPL("/foo/bar/baz") },      FPL("baz")},
-    { { FPL("/foo/bar/"),     FPL("/foo/bar/baz") },      FPL("baz")},
-    { { FPL("//foo/bar/"),    FPL("//foo/bar/baz") },     FPL("baz")},
-    { { FPL("/foo/bar"),      FPL("/foo2/bar/baz") },     FPL("")},
-    { { FPL("/foo/bar.txt"),  FPL("/foo/bar/baz") },      FPL("")},
-    { { FPL("/foo/bar"),      FPL("/foo/bar2/baz") },     FPL("")},
-    { { FPL("/foo/bar"),      FPL("/foo/bar") },          FPL("")},
-    { { FPL("/foo/bar/baz"),  FPL("/foo/bar") },          FPL("")},
-    { { FPL("foo/bar"),       FPL("foo/bar/baz") },       FPL("baz")},
-    { { FPL("foo/bar"),       FPL("foo2/bar/baz") },      FPL("")},
-    { { FPL("foo/bar"),       FPL("foo/bar2/baz") },      FPL("")},
-    { { FPL(""),              FPL("foo") },               FPL("")},
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { { FPL("c:/foo/bar"),    FPL("c:/foo/bar/baz") },    FPL("baz")},
-    { { FPL("E:/foo/bar"),    FPL("e:/foo/bar/baz") },    FPL("baz")},
-    { { FPL("f:/foo/bar"),    FPL("F:/foo/bar/baz") },    FPL("baz")},
-    { { FPL("E:/Foo/bar"),    FPL("e:/foo/bar/baz") },    FPL("")},
-    { { FPL("f:/foo/bar"),    FPL("F:/foo/Bar/baz") },    FPL("")},
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { { FPL("c:/"),           FPL("c:/foo/bar/baz") },    FPL("foo\\bar\\baz")},
-    // TODO(akalin): Figure out how to handle the corner case in the
-    // commented-out test case below.  Appending to an empty path gives
-    // /foo\bar\baz but appending to a nonempty path "blah" gives
-    // blah\foo\bar\baz.
-    // { { FPL("c:"),            FPL("c:/foo/bar/baz") }, FPL("foo\\bar\\baz")},
-#endif  // FILE_PATH_USES_WIN_SEPARATORS
-    { { FPL("c:/foo/bar"),    FPL("d:/foo/bar/baz") },    FPL("")},
-    { { FPL("c:/foo/bar"),    FPL("D:/foo/bar/baz") },    FPL("")},
-    { { FPL("C:/foo/bar"),    FPL("d:/foo/bar/baz") },    FPL("")},
-    { { FPL("c:/foo/bar"),    FPL("c:/foo2/bar/baz") },   FPL("")},
-    { { FPL("e:/foo/bar"),    FPL("E:/foo2/bar/baz") },   FPL("")},
-    { { FPL("F:/foo/bar"),    FPL("f:/foo2/bar/baz") },   FPL("")},
-    { { FPL("c:/foo/bar"),    FPL("c:/foo/bar2/baz") },   FPL("")},
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { { FPL("\\foo\\bar"),    FPL("\\foo\\bar\\baz") },   FPL("baz")},
-    { { FPL("\\foo/bar"),     FPL("\\foo\\bar\\baz") },   FPL("baz")},
-    { { FPL("\\foo/bar"),     FPL("\\foo/bar/baz") },     FPL("baz")},
-    { { FPL("\\"),            FPL("\\foo\\bar\\baz") },   FPL("foo\\bar\\baz")},
-    { { FPL(""),              FPL("\\foo\\bar\\baz") },   FPL("")},
-    { { FPL("\\foo\\bar"),    FPL("\\foo2\\bar\\baz") },  FPL("")},
-    { { FPL("\\foo\\bar"),    FPL("\\foo\\bar2\\baz") },  FPL("")},
-#endif  // FILE_PATH_USES_WIN_SEPARATORS
-  };
-
-  const FilePath base(FPL("blah"));
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath parent(cases[i].inputs[0]);
-    FilePath child(cases[i].inputs[1]);
-    {
-      FilePath result;
-      bool success = parent.AppendRelativePath(child, &result);
-      EXPECT_EQ(cases[i].expected[0] != '\0', success) <<
-        "i: " << i << ", parent: " << parent.value() << ", child: " <<
-        child.value();
-      EXPECT_STREQ(cases[i].expected, result.value().c_str()) <<
-        "i: " << i << ", parent: " << parent.value() << ", child: " <<
-        child.value();
-    }
-    {
-      FilePath result(base);
-      bool success = parent.AppendRelativePath(child, &result);
-      EXPECT_EQ(cases[i].expected[0] != '\0', success) <<
-        "i: " << i << ", parent: " << parent.value() << ", child: " <<
-        child.value();
-      EXPECT_EQ(base.Append(cases[i].expected).value(), result.value()) <<
-        "i: " << i << ", parent: " << parent.value() << ", child: " <<
-        child.value();
-    }
-  }
-}
-
-TEST_F(FilePathTest, EqualityTest) {
-  const struct BinaryBooleanTestData cases[] = {
-    { { FPL("/foo/bar/baz"),  FPL("/foo/bar/baz") },      true},
-    { { FPL("/foo/bar"),      FPL("/foo/bar/baz") },      false},
-    { { FPL("/foo/bar/baz"),  FPL("/foo/bar") },          false},
-    { { FPL("//foo/bar/"),    FPL("//foo/bar/") },        true},
-    { { FPL("/foo/bar"),      FPL("/foo2/bar") },         false},
-    { { FPL("/foo/bar.txt"),  FPL("/foo/bar") },          false},
-    { { FPL("foo/bar"),       FPL("foo/bar") },           true},
-    { { FPL("foo/bar"),       FPL("foo/bar/baz") },       false},
-    { { FPL(""),              FPL("foo") },               false},
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { { FPL("c:/foo/bar"),    FPL("c:/foo/bar") },        true},
-    { { FPL("E:/foo/bar"),    FPL("e:/foo/bar") },        true},
-    { { FPL("f:/foo/bar"),    FPL("F:/foo/bar") },        true},
-    { { FPL("E:/Foo/bar"),    FPL("e:/foo/bar") },        false},
-    { { FPL("f:/foo/bar"),    FPL("F:/foo/Bar") },        false},
-    { { FPL("c:/"),           FPL("c:/") },               true},
-    { { FPL("c:"),            FPL("c:") },                true},
-    { { FPL("c:/foo/bar"),    FPL("d:/foo/bar") },        false},
-    { { FPL("c:/foo/bar"),    FPL("D:/foo/bar") },        false},
-    { { FPL("C:/foo/bar"),    FPL("d:/foo/bar") },        false},
-    { { FPL("c:/foo/bar"),    FPL("c:/foo2/bar") },       false},
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { { FPL("\\foo\\bar"),    FPL("\\foo\\bar") },        true},
-    { { FPL("\\foo/bar"),     FPL("\\foo/bar") },         true},
-    { { FPL("\\foo/bar"),     FPL("\\foo\\bar") },        false},
-    { { FPL("\\"),            FPL("\\") },                true},
-    { { FPL("\\"),            FPL("/") },                 false},
-    { { FPL(""),              FPL("\\") },                false},
-    { { FPL("\\foo\\bar"),    FPL("\\foo2\\bar") },       false},
-    { { FPL("\\foo\\bar"),    FPL("\\foo\\bar2") },       false},
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { { FPL("c:\\foo\\bar"),    FPL("c:\\foo\\bar") },    true},
-    { { FPL("E:\\foo\\bar"),    FPL("e:\\foo\\bar") },    true},
-    { { FPL("f:\\foo\\bar"),    FPL("F:\\foo/bar") },     false},
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#endif  // FILE_PATH_USES_WIN_SEPARATORS
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath a(cases[i].inputs[0]);
-    FilePath b(cases[i].inputs[1]);
-
-    EXPECT_EQ(a == b, cases[i].expected) <<
-      "equality i: " << i << ", a: " << a.value() << ", b: " <<
-      b.value();
-  }
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath a(cases[i].inputs[0]);
-    FilePath b(cases[i].inputs[1]);
-
-    EXPECT_EQ(a != b, !cases[i].expected) <<
-      "inequality i: " << i << ", a: " << a.value() << ", b: " <<
-      b.value();
-  }
-}
-
-TEST_F(FilePathTest, Extension) {
-  FilePath base_dir(FILE_PATH_LITERAL("base_dir"));
-
-  FilePath jpg = base_dir.Append(FILE_PATH_LITERAL("foo.jpg"));
-  EXPECT_EQ(FILE_PATH_LITERAL(".jpg"), jpg.Extension());
-  EXPECT_EQ(FILE_PATH_LITERAL(".jpg"), jpg.FinalExtension());
-
-  FilePath base = jpg.BaseName().RemoveExtension();
-  EXPECT_EQ(FILE_PATH_LITERAL("foo"), base.value());
-
-  FilePath path_no_ext = base_dir.Append(base);
-  EXPECT_EQ(path_no_ext.value(), jpg.RemoveExtension().value());
-
-  EXPECT_EQ(path_no_ext.value(), path_no_ext.RemoveExtension().value());
-  EXPECT_EQ(FILE_PATH_LITERAL(""), path_no_ext.Extension());
-  EXPECT_EQ(FILE_PATH_LITERAL(""), path_no_ext.FinalExtension());
-}
-
-TEST_F(FilePathTest, Extension2) {
-  const struct UnaryTestData cases[] = {
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { FPL("C:\\a\\b\\c.ext"),        FPL(".ext") },
-    { FPL("C:\\a\\b\\c."),           FPL(".") },
-    { FPL("C:\\a\\b\\c"),            FPL("") },
-    { FPL("C:\\a\\b\\"),             FPL("") },
-    { FPL("C:\\a\\b.\\"),            FPL(".") },
-    { FPL("C:\\a\\b\\c.ext1.ext2"),  FPL(".ext2") },
-    { FPL("C:\\foo.bar\\\\\\"),      FPL(".bar") },
-    { FPL("C:\\foo.bar\\.."),        FPL("") },
-    { FPL("C:\\foo.bar\\..\\\\"),    FPL("") },
-#endif
-    { FPL("/foo/bar/baz.ext"),       FPL(".ext") },
-    { FPL("/foo/bar/baz."),          FPL(".") },
-    { FPL("/foo/bar/baz.."),         FPL(".") },
-    { FPL("/foo/bar/baz"),           FPL("") },
-    { FPL("/foo/bar/"),              FPL("") },
-    { FPL("/foo/bar./"),             FPL(".") },
-    { FPL("/foo/bar/baz.ext1.ext2"), FPL(".ext2") },
-    { FPL("/subversion-1.6.12.zip"), FPL(".zip") },
-    { FPL("/foo.12345.gz"),          FPL(".gz") },
-    { FPL("/foo..gz"),               FPL(".gz") },
-    { FPL("."),                      FPL("") },
-    { FPL(".."),                     FPL("") },
-    { FPL("./foo"),                  FPL("") },
-    { FPL("./foo.ext"),              FPL(".ext") },
-    { FPL("/foo.ext1/bar.ext2"),     FPL(".ext2") },
-    { FPL("/foo.bar////"),           FPL(".bar") },
-    { FPL("/foo.bar/.."),            FPL("") },
-    { FPL("/foo.bar/..////"),        FPL("") },
-    { FPL("/foo.1234.luser.js"),     FPL(".js") },
-    { FPL("/user.js"),               FPL(".js") },
-  };
-  const struct UnaryTestData double_extension_cases[] = {
-    { FPL("/foo.tar.gz"),            FPL(".tar.gz") },
-    { FPL("/foo.tar.Z"),             FPL(".tar.Z") },
-    { FPL("/foo.tar.bz2"),           FPL(".tar.bz2") },
-    { FPL("/foo.1234.gz"),           FPL(".1234.gz") },
-    { FPL("/foo.1234.tar.gz"),       FPL(".tar.gz") },
-    { FPL("/foo.tar.tar.gz"),        FPL(".tar.gz") },
-    { FPL("/foo.tar.gz.gz"),         FPL(".gz.gz") },
-    { FPL("/foo.1234.user.js"),      FPL(".user.js") },
-    { FPL("foo.user.js"),            FPL(".user.js") },
-    { FPL("/foo.tar.bz"),            FPL(".tar.bz") },
-  };
-  for (unsigned int i = 0; i < arraysize(cases); ++i) {
-    FilePath path(cases[i].input);
-    FilePath::StringType extension = path.Extension();
-    FilePath::StringType final_extension = path.FinalExtension();
-    EXPECT_STREQ(cases[i].expected, extension.c_str())
-        << "i: " << i << ", path: " << path.value();
-    EXPECT_STREQ(cases[i].expected, final_extension.c_str())
-        << "i: " << i << ", path: " << path.value();
-  }
-  for (unsigned int i = 0; i < arraysize(double_extension_cases); ++i) {
-    FilePath path(double_extension_cases[i].input);
-    FilePath::StringType extension = path.Extension();
-    EXPECT_STREQ(double_extension_cases[i].expected, extension.c_str())
-        << "i: " << i << ", path: " << path.value();
-  }
-}
-
-TEST_F(FilePathTest, InsertBeforeExtension) {
-  const struct BinaryTestData cases[] = {
-    { { FPL(""),                FPL("") },        FPL("") },
-    { { FPL(""),                FPL("txt") },     FPL("") },
-    { { FPL("."),               FPL("txt") },     FPL("") },
-    { { FPL(".."),              FPL("txt") },     FPL("") },
-    { { FPL("foo.dll"),         FPL("txt") },     FPL("footxt.dll") },
-    { { FPL("."),               FPL("") },        FPL(".") },
-    { { FPL("foo.dll"),         FPL(".txt") },    FPL("foo.txt.dll") },
-    { { FPL("foo"),             FPL("txt") },     FPL("footxt") },
-    { { FPL("foo"),             FPL(".txt") },    FPL("foo.txt") },
-    { { FPL("foo.baz.dll"),     FPL("txt") },     FPL("foo.baztxt.dll") },
-    { { FPL("foo.baz.dll"),     FPL(".txt") },    FPL("foo.baz.txt.dll") },
-    { { FPL("foo.dll"),         FPL("") },        FPL("foo.dll") },
-    { { FPL("foo.dll"),         FPL(".") },       FPL("foo..dll") },
-    { { FPL("foo"),             FPL("") },        FPL("foo") },
-    { { FPL("foo"),             FPL(".") },       FPL("foo.") },
-    { { FPL("foo.baz.dll"),     FPL("") },        FPL("foo.baz.dll") },
-    { { FPL("foo.baz.dll"),     FPL(".") },       FPL("foo.baz..dll") },
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { { FPL("\\"),              FPL("") },        FPL("\\") },
-    { { FPL("\\"),              FPL("txt") },     FPL("\\txt") },
-    { { FPL("\\."),             FPL("txt") },     FPL("") },
-    { { FPL("\\.."),            FPL("txt") },     FPL("") },
-    { { FPL("\\."),             FPL("") },        FPL("\\.") },
-    { { FPL("C:\\bar\\foo.dll"), FPL("txt") },
-        FPL("C:\\bar\\footxt.dll") },
-    { { FPL("C:\\bar.baz\\foodll"), FPL("txt") },
-        FPL("C:\\bar.baz\\foodlltxt") },
-    { { FPL("C:\\bar.baz\\foo.dll"), FPL("txt") },
-        FPL("C:\\bar.baz\\footxt.dll") },
-    { { FPL("C:\\bar.baz\\foo.dll.exe"), FPL("txt") },
-        FPL("C:\\bar.baz\\foo.dlltxt.exe") },
-    { { FPL("C:\\bar.baz\\foo"), FPL("") },
-        FPL("C:\\bar.baz\\foo") },
-    { { FPL("C:\\bar.baz\\foo.exe"), FPL("") },
-        FPL("C:\\bar.baz\\foo.exe") },
-    { { FPL("C:\\bar.baz\\foo.dll.exe"), FPL("") },
-        FPL("C:\\bar.baz\\foo.dll.exe") },
-    { { FPL("C:\\bar\\baz\\foo.exe"), FPL(" (1)") },
-        FPL("C:\\bar\\baz\\foo (1).exe") },
-    { { FPL("C:\\foo.baz\\\\"), FPL(" (1)") },    FPL("C:\\foo (1).baz") },
-    { { FPL("C:\\foo.baz\\..\\"), FPL(" (1)") },  FPL("") },
-#endif
-    { { FPL("/"),               FPL("") },        FPL("/") },
-    { { FPL("/"),               FPL("txt") },     FPL("/txt") },
-    { { FPL("/."),              FPL("txt") },     FPL("") },
-    { { FPL("/.."),             FPL("txt") },     FPL("") },
-    { { FPL("/."),              FPL("") },        FPL("/.") },
-    { { FPL("/bar/foo.dll"),    FPL("txt") },     FPL("/bar/footxt.dll") },
-    { { FPL("/bar.baz/foodll"), FPL("txt") },     FPL("/bar.baz/foodlltxt") },
-    { { FPL("/bar.baz/foo.dll"), FPL("txt") },    FPL("/bar.baz/footxt.dll") },
-    { { FPL("/bar.baz/foo.dll.exe"), FPL("txt") },
-        FPL("/bar.baz/foo.dlltxt.exe") },
-    { { FPL("/bar.baz/foo"),    FPL("") },        FPL("/bar.baz/foo") },
-    { { FPL("/bar.baz/foo.exe"), FPL("") },       FPL("/bar.baz/foo.exe") },
-    { { FPL("/bar.baz/foo.dll.exe"), FPL("") },   FPL("/bar.baz/foo.dll.exe") },
-    { { FPL("/bar/baz/foo.exe"), FPL(" (1)") },   FPL("/bar/baz/foo (1).exe") },
-    { { FPL("/bar/baz/..////"), FPL(" (1)") },    FPL("") },
-  };
-  for (unsigned int i = 0; i < arraysize(cases); ++i) {
-    FilePath path(cases[i].inputs[0]);
-    FilePath result = path.InsertBeforeExtension(cases[i].inputs[1]);
-    EXPECT_EQ(cases[i].expected, result.value()) << "i: " << i <<
-        ", path: " << path.value() << ", insert: " << cases[i].inputs[1];
-  }
-}
-
-TEST_F(FilePathTest, RemoveExtension) {
-  const struct UnaryTestData cases[] = {
-    { FPL(""),                    FPL("") },
-    { FPL("."),                   FPL(".") },
-    { FPL(".."),                  FPL("..") },
-    { FPL("foo.dll"),             FPL("foo") },
-    { FPL("./foo.dll"),           FPL("./foo") },
-    { FPL("foo..dll"),            FPL("foo.") },
-    { FPL("foo"),                 FPL("foo") },
-    { FPL("foo."),                FPL("foo") },
-    { FPL("foo.."),               FPL("foo.") },
-    { FPL("foo.baz.dll"),         FPL("foo.baz") },
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { FPL("C:\\foo.bar\\foo"),    FPL("C:\\foo.bar\\foo") },
-    { FPL("C:\\foo.bar\\..\\\\"), FPL("C:\\foo.bar\\..\\\\") },
-#endif
-    { FPL("/foo.bar/foo"),        FPL("/foo.bar/foo") },
-    { FPL("/foo.bar/..////"),     FPL("/foo.bar/..////") },
-  };
-  for (unsigned int i = 0; i < arraysize(cases); ++i) {
-    FilePath path(cases[i].input);
-    FilePath removed = path.RemoveExtension();
-    FilePath removed_final = path.RemoveFinalExtension();
-    EXPECT_EQ(cases[i].expected, removed.value()) << "i: " << i <<
-        ", path: " << path.value();
-    EXPECT_EQ(cases[i].expected, removed_final.value()) << "i: " << i <<
-        ", path: " << path.value();
-  }
-  {
-    FilePath path(FPL("foo.tar.gz"));
-    FilePath removed = path.RemoveExtension();
-    FilePath removed_final = path.RemoveFinalExtension();
-    EXPECT_EQ(FPL("foo"), removed.value()) << ", path: " << path.value();
-    EXPECT_EQ(FPL("foo.tar"), removed_final.value()) << ", path: "
-                                                     << path.value();
-  }
-}
-
-TEST_F(FilePathTest, ReplaceExtension) {
-  const struct BinaryTestData cases[] = {
-    { { FPL(""),              FPL("") },      FPL("") },
-    { { FPL(""),              FPL("txt") },   FPL("") },
-    { { FPL("."),             FPL("txt") },   FPL("") },
-    { { FPL(".."),            FPL("txt") },   FPL("") },
-    { { FPL("."),             FPL("") },      FPL("") },
-    { { FPL("foo.dll"),       FPL("txt") },   FPL("foo.txt") },
-    { { FPL("./foo.dll"),     FPL("txt") },   FPL("./foo.txt") },
-    { { FPL("foo..dll"),      FPL("txt") },   FPL("foo..txt") },
-    { { FPL("foo.dll"),       FPL(".txt") },  FPL("foo.txt") },
-    { { FPL("foo"),           FPL("txt") },   FPL("foo.txt") },
-    { { FPL("foo."),          FPL("txt") },   FPL("foo.txt") },
-    { { FPL("foo.."),         FPL("txt") },   FPL("foo..txt") },
-    { { FPL("foo"),           FPL(".txt") },  FPL("foo.txt") },
-    { { FPL("foo.baz.dll"),   FPL("txt") },   FPL("foo.baz.txt") },
-    { { FPL("foo.baz.dll"),   FPL(".txt") },  FPL("foo.baz.txt") },
-    { { FPL("foo.dll"),       FPL("") },      FPL("foo") },
-    { { FPL("foo.dll"),       FPL(".") },     FPL("foo") },
-    { { FPL("foo"),           FPL("") },      FPL("foo") },
-    { { FPL("foo"),           FPL(".") },     FPL("foo") },
-    { { FPL("foo.baz.dll"),   FPL("") },      FPL("foo.baz") },
-    { { FPL("foo.baz.dll"),   FPL(".") },     FPL("foo.baz") },
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { { FPL("C:\\foo.bar\\foo"),    FPL("baz") }, FPL("C:\\foo.bar\\foo.baz") },
-    { { FPL("C:\\foo.bar\\..\\\\"), FPL("baz") }, FPL("") },
-#endif
-    { { FPL("/foo.bar/foo"),        FPL("baz") }, FPL("/foo.bar/foo.baz") },
-    { { FPL("/foo.bar/..////"),     FPL("baz") }, FPL("") },
-  };
-  for (unsigned int i = 0; i < arraysize(cases); ++i) {
-    FilePath path(cases[i].inputs[0]);
-    FilePath replaced = path.ReplaceExtension(cases[i].inputs[1]);
-    EXPECT_EQ(cases[i].expected, replaced.value()) << "i: " << i <<
-        ", path: " << path.value() << ", replace: " << cases[i].inputs[1];
-  }
-}
-
-TEST_F(FilePathTest, AddExtension) {
-  const struct BinaryTestData cases[] = {
-    { { FPL(""),              FPL("") },      FPL("") },
-    { { FPL(""),              FPL("txt") },   FPL("") },
-    { { FPL("."),             FPL("txt") },   FPL("") },
-    { { FPL(".."),            FPL("txt") },   FPL("") },
-    { { FPL("."),             FPL("") },      FPL("") },
-    { { FPL("foo.dll"),       FPL("txt") },   FPL("foo.dll.txt") },
-    { { FPL("./foo.dll"),     FPL("txt") },   FPL("./foo.dll.txt") },
-    { { FPL("foo..dll"),      FPL("txt") },   FPL("foo..dll.txt") },
-    { { FPL("foo.dll"),       FPL(".txt") },  FPL("foo.dll.txt") },
-    { { FPL("foo"),           FPL("txt") },   FPL("foo.txt") },
-    { { FPL("foo."),          FPL("txt") },   FPL("foo.txt") },
-    { { FPL("foo.."),         FPL("txt") },   FPL("foo..txt") },
-    { { FPL("foo"),           FPL(".txt") },  FPL("foo.txt") },
-    { { FPL("foo.baz.dll"),   FPL("txt") },   FPL("foo.baz.dll.txt") },
-    { { FPL("foo.baz.dll"),   FPL(".txt") },  FPL("foo.baz.dll.txt") },
-    { { FPL("foo.dll"),       FPL("") },      FPL("foo.dll") },
-    { { FPL("foo.dll"),       FPL(".") },     FPL("foo.dll") },
-    { { FPL("foo"),           FPL("") },      FPL("foo") },
-    { { FPL("foo"),           FPL(".") },     FPL("foo") },
-    { { FPL("foo.baz.dll"),   FPL("") },      FPL("foo.baz.dll") },
-    { { FPL("foo.baz.dll"),   FPL(".") },     FPL("foo.baz.dll") },
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { { FPL("C:\\foo.bar\\foo"),    FPL("baz") }, FPL("C:\\foo.bar\\foo.baz") },
-    { { FPL("C:\\foo.bar\\..\\\\"), FPL("baz") }, FPL("") },
-#endif
-    { { FPL("/foo.bar/foo"),        FPL("baz") }, FPL("/foo.bar/foo.baz") },
-    { { FPL("/foo.bar/..////"),     FPL("baz") }, FPL("") },
-  };
-  for (unsigned int i = 0; i < arraysize(cases); ++i) {
-    FilePath path(cases[i].inputs[0]);
-    FilePath added = path.AddExtension(cases[i].inputs[1]);
-    EXPECT_EQ(cases[i].expected, added.value()) << "i: " << i <<
-        ", path: " << path.value() << ", add: " << cases[i].inputs[1];
-  }
-}
-
-TEST_F(FilePathTest, MatchesExtension) {
-  const struct BinaryBooleanTestData cases[] = {
-    { { FPL("foo"),                     FPL("") },                    true},
-    { { FPL("foo"),                     FPL(".") },                   false},
-    { { FPL("foo."),                    FPL("") },                    false},
-    { { FPL("foo."),                    FPL(".") },                   true},
-    { { FPL("foo.txt"),                 FPL(".dll") },                false},
-    { { FPL("foo.txt"),                 FPL(".txt") },                true},
-    { { FPL("foo.txt.dll"),             FPL(".txt") },                false},
-    { { FPL("foo.txt.dll"),             FPL(".dll") },                true},
-    { { FPL("foo.TXT"),                 FPL(".txt") },                true},
-    { { FPL("foo.txt"),                 FPL(".TXT") },                true},
-    { { FPL("foo.tXt"),                 FPL(".txt") },                true},
-    { { FPL("foo.txt"),                 FPL(".tXt") },                true},
-    { { FPL("foo.tXt"),                 FPL(".TXT") },                true},
-    { { FPL("foo.tXt"),                 FPL(".tXt") },                true},
-#if defined(FILE_PATH_USES_DRIVE_LETTERS)
-    { { FPL("c:/foo.txt.dll"),          FPL(".txt") },                false},
-    { { FPL("c:/foo.txt"),              FPL(".txt") },                true},
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-    { { FPL("c:\\bar\\foo.txt.dll"),    FPL(".txt") },                false},
-    { { FPL("c:\\bar\\foo.txt"),        FPL(".txt") },                true},
-#endif  // FILE_PATH_USES_DRIVE_LETTERS
-    { { FPL("/bar/foo.txt.dll"),        FPL(".txt") },                false},
-    { { FPL("/bar/foo.txt"),            FPL(".txt") },                true},
-#if defined(OS_WIN) || defined(OS_MACOSX)
-    // Umlauts A, O, U: direct comparison, and upper case vs. lower case
-    { { FPL("foo.\u00E4\u00F6\u00FC"),  FPL(".\u00E4\u00F6\u00FC") }, true},
-    { { FPL("foo.\u00C4\u00D6\u00DC"),  FPL(".\u00E4\u00F6\u00FC") }, true},
-    // C with circumflex: direct comparison, and upper case vs. lower case
-    { { FPL("foo.\u0109"),              FPL(".\u0109") },             true},
-    { { FPL("foo.\u0108"),              FPL(".\u0109") },             true},
-#endif
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath path(cases[i].inputs[0]);
-    FilePath::StringType ext(cases[i].inputs[1]);
-
-    EXPECT_EQ(cases[i].expected, path.MatchesExtension(ext)) <<
-        "i: " << i << ", path: " << path.value() << ", ext: " << ext;
-  }
-}
-
-TEST_F(FilePathTest, CompareIgnoreCase) {
-  const struct BinaryIntTestData cases[] = {
-    { { FPL("foo"),                          FPL("foo") },                  0},
-    { { FPL("FOO"),                          FPL("foo") },                  0},
-    { { FPL("foo.ext"),                      FPL("foo.ext") },              0},
-    { { FPL("FOO.EXT"),                      FPL("foo.ext") },              0},
-    { { FPL("Foo.Ext"),                      FPL("foo.ext") },              0},
-    { { FPL("foO"),                          FPL("foo") },                  0},
-    { { FPL("foo"),                          FPL("foO") },                  0},
-    { { FPL("fOo"),                          FPL("foo") },                  0},
-    { { FPL("foo"),                          FPL("fOo") },                  0},
-    { { FPL("bar"),                          FPL("foo") },                 -1},
-    { { FPL("foo"),                          FPL("bar") },                  1},
-    { { FPL("BAR"),                          FPL("foo") },                 -1},
-    { { FPL("FOO"),                          FPL("bar") },                  1},
-    { { FPL("bar"),                          FPL("FOO") },                 -1},
-    { { FPL("foo"),                          FPL("BAR") },                  1},
-    { { FPL("BAR"),                          FPL("FOO") },                 -1},
-    { { FPL("FOO"),                          FPL("BAR") },                  1},
-    // German "Eszett" (lower case and the new-fangled upper case)
-    // Note that uc(<lowercase eszett>) => "SS", NOT <uppercase eszett>!
-    // However, neither Windows nor Mac OSX converts these.
-    // (or even have glyphs for <uppercase eszett>)
-    { { FPL("\u00DF"),                       FPL("\u00DF") },               0},
-    { { FPL("\u1E9E"),                       FPL("\u1E9E") },               0},
-    { { FPL("\u00DF"),                       FPL("\u1E9E") },              -1},
-    { { FPL("SS"),                           FPL("\u00DF") },              -1},
-    { { FPL("SS"),                           FPL("\u1E9E") },              -1},
-#if defined(OS_WIN) || defined(OS_MACOSX)
-    // Umlauts A, O, U: direct comparison, and upper case vs. lower case
-    { { FPL("\u00E4\u00F6\u00FC"),           FPL("\u00E4\u00F6\u00FC") },   0},
-    { { FPL("\u00C4\u00D6\u00DC"),           FPL("\u00E4\u00F6\u00FC") },   0},
-    // C with circumflex: direct comparison, and upper case vs. lower case
-    { { FPL("\u0109"),                       FPL("\u0109") },               0},
-    { { FPL("\u0108"),                       FPL("\u0109") },               0},
-    // Cyrillic letter SHA: direct comparison, and upper case vs. lower case
-    { { FPL("\u0428"),                       FPL("\u0428") },               0},
-    { { FPL("\u0428"),                       FPL("\u0448") },               0},
-    // Greek letter DELTA: direct comparison, and upper case vs. lower case
-    { { FPL("\u0394"),                       FPL("\u0394") },               0},
-    { { FPL("\u0394"),                       FPL("\u03B4") },               0},
-    // Japanese full-width A: direct comparison, and upper case vs. lower case
-    // Note that full-width and standard characters are considered different.
-    { { FPL("\uFF21"),                       FPL("\uFF21") },               0},
-    { { FPL("\uFF21"),                       FPL("\uFF41") },               0},
-    { { FPL("A"),                            FPL("\uFF21") },              -1},
-    { { FPL("A"),                            FPL("\uFF41") },              -1},
-    { { FPL("a"),                            FPL("\uFF21") },              -1},
-    { { FPL("a"),                            FPL("\uFF41") },              -1},
-#endif
-#if defined(OS_MACOSX)
-    // Codepoints > 0x1000
-    // Georgian letter DON: direct comparison, and upper case vs. lower case
-    { { FPL("\u10A3"),                       FPL("\u10A3") },               0},
-    { { FPL("\u10A3"),                       FPL("\u10D3") },               0},
-    // Combining characters vs. pre-composed characters, upper and lower case
-    { { FPL("k\u0301u\u032Do\u0304\u0301n"), FPL("\u1E31\u1E77\u1E53n") },  0},
-    { { FPL("k\u0301u\u032Do\u0304\u0301n"), FPL("kuon") },                 1},
-    { { FPL("kuon"), FPL("k\u0301u\u032Do\u0304\u0301n") },                -1},
-    { { FPL("K\u0301U\u032DO\u0304\u0301N"), FPL("KUON") },                 1},
-    { { FPL("KUON"), FPL("K\u0301U\u032DO\u0304\u0301N") },                -1},
-    { { FPL("k\u0301u\u032Do\u0304\u0301n"), FPL("KUON") },                 1},
-    { { FPL("K\u0301U\u032DO\u0304\u0301N"), FPL("\u1E31\u1E77\u1E53n") },  0},
-    { { FPL("k\u0301u\u032Do\u0304\u0301n"), FPL("\u1E30\u1E76\u1E52n") },  0},
-    { { FPL("k\u0301u\u032Do\u0304\u0302n"), FPL("\u1E30\u1E76\u1E52n") },  1},
-#endif
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath::StringType s1(cases[i].inputs[0]);
-    FilePath::StringType s2(cases[i].inputs[1]);
-    int result = FilePath::CompareIgnoreCase(s1, s2);
-    EXPECT_EQ(cases[i].expected, result) <<
-        "i: " << i << ", s1: " << s1 << ", s2: " << s2;
-  }
-}
-
-TEST_F(FilePathTest, ReferencesParent) {
-  const struct UnaryBooleanTestData cases[] = {
-    { FPL("."),        false },
-    { FPL(".."),       true },
-    { FPL(".. "),      true },
-    { FPL(" .."),      true },
-    { FPL("..."),      true },
-    { FPL("a.."),      false },
-    { FPL("..a"),      false },
-    { FPL("../"),      true },
-    { FPL("/.."),      true },
-    { FPL("/../"),     true },
-    { FPL("/a../"),    false },
-    { FPL("/..a/"),    false },
-    { FPL("//.."),     true },
-    { FPL("..//"),     true },
-    { FPL("//..//"),   true },
-    { FPL("a//..//c"), true },
-    { FPL("../b/c"),   true },
-    { FPL("/../b/c"),  true },
-    { FPL("a/b/.."),   true },
-    { FPL("a/b/../"),  true },
-    { FPL("a/../c"),   true },
-    { FPL("a/b/c"),    false },
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath input(cases[i].input);
-    bool observed = input.ReferencesParent();
-    EXPECT_EQ(cases[i].expected, observed) <<
-              "i: " << i << ", input: " << input.value();
-  }
-}
-
-TEST_F(FilePathTest, FromUTF8Unsafe_And_AsUTF8Unsafe) {
-  const struct UTF8TestData cases[] = {
-    { FPL("foo.txt"), "foo.txt" },
-    // "aeo" with accents. Use http://0xcc.net/jsescape/ to decode them.
-    { FPL("\u00E0\u00E8\u00F2.txt"), "\xC3\xA0\xC3\xA8\xC3\xB2.txt" },
-    // Full-width "ABC".
-    { FPL("\uFF21\uFF22\uFF23.txt"),
-      "\xEF\xBC\xA1\xEF\xBC\xA2\xEF\xBC\xA3.txt" },
-  };
-
-#if !defined(SYSTEM_NATIVE_UTF8) && defined(OS_LINUX)
-  ScopedLocale locale("en_US.UTF-8");
-#endif
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    // Test FromUTF8Unsafe() works.
-    FilePath from_utf8 = FilePath::FromUTF8Unsafe(cases[i].utf8);
-    EXPECT_EQ(cases[i].native, from_utf8.value())
-        << "i: " << i << ", input: " << cases[i].native;
-    // Test AsUTF8Unsafe() works.
-    FilePath from_native = FilePath(cases[i].native);
-    EXPECT_EQ(cases[i].utf8, from_native.AsUTF8Unsafe())
-        << "i: " << i << ", input: " << cases[i].native;
-    // Test the two file paths are identical.
-    EXPECT_EQ(from_utf8.value(), from_native.value());
-  }
-}
-
-TEST_F(FilePathTest, ConstructWithNUL) {
-  // Assert FPS() works.
-  ASSERT_EQ(3U, FPS("a\0b").length());
-
-  // Test constructor strips '\0'
-  FilePath path(FPS("a\0b"));
-  EXPECT_EQ(1U, path.value().length());
-  EXPECT_EQ(FPL("a"), path.value());
-}
-
-TEST_F(FilePathTest, AppendWithNUL) {
-  // Assert FPS() works.
-  ASSERT_EQ(3U, FPS("b\0b").length());
-
-  // Test Append() strips '\0'
-  FilePath path(FPL("a"));
-  path = path.Append(FPS("b\0b"));
-  EXPECT_EQ(3U, path.value().length());
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-  EXPECT_EQ(FPL("a\\b"), path.value());
-#else
-  EXPECT_EQ(FPL("a/b"), path.value());
-#endif
-}
-
-TEST_F(FilePathTest, ReferencesParentWithNUL) {
-  // Assert FPS() works.
-  ASSERT_EQ(3U, FPS("..\0").length());
-
-  // Test ReferencesParent() doesn't break with "..\0"
-  FilePath path(FPS("..\0"));
-  EXPECT_TRUE(path.ReferencesParent());
-}
-
-#if defined(FILE_PATH_USES_WIN_SEPARATORS)
-TEST_F(FilePathTest, NormalizePathSeparators) {
-  const struct UnaryTestData cases[] = {
-    { FPL("foo/bar"), FPL("foo\\bar") },
-    { FPL("foo/bar\\betz"), FPL("foo\\bar\\betz") },
-    { FPL("foo\\bar"), FPL("foo\\bar") },
-    { FPL("foo\\bar/betz"), FPL("foo\\bar\\betz") },
-    { FPL("foo"), FPL("foo") },
-    // Trailing slashes don't automatically get stripped.  That's what
-    // StripTrailingSeparators() is for.
-    { FPL("foo\\"), FPL("foo\\") },
-    { FPL("foo/"), FPL("foo\\") },
-    { FPL("foo/bar\\"), FPL("foo\\bar\\") },
-    { FPL("foo\\bar/"), FPL("foo\\bar\\") },
-    { FPL("foo/bar/"), FPL("foo\\bar\\") },
-    { FPL("foo\\bar\\"), FPL("foo\\bar\\") },
-    { FPL("\\foo/bar"), FPL("\\foo\\bar") },
-    { FPL("/foo\\bar"), FPL("\\foo\\bar") },
-    { FPL("c:/foo/bar/"), FPL("c:\\foo\\bar\\") },
-    { FPL("/foo/bar/"), FPL("\\foo\\bar\\") },
-    { FPL("\\foo\\bar\\"), FPL("\\foo\\bar\\") },
-    { FPL("c:\\foo/bar"), FPL("c:\\foo\\bar") },
-    { FPL("//foo\\bar\\"), FPL("\\\\foo\\bar\\") },
-    { FPL("\\\\foo\\bar\\"), FPL("\\\\foo\\bar\\") },
-    { FPL("//foo\\bar\\"), FPL("\\\\foo\\bar\\") },
-    // This method does not normalize the number of path separators.
-    { FPL("foo\\\\bar"), FPL("foo\\\\bar") },
-    { FPL("foo//bar"), FPL("foo\\\\bar") },
-    { FPL("foo/\\bar"), FPL("foo\\\\bar") },
-    { FPL("foo\\/bar"), FPL("foo\\\\bar") },
-    { FPL("///foo\\\\bar"), FPL("\\\\\\foo\\\\bar") },
-    { FPL("foo//bar///"), FPL("foo\\\\bar\\\\\\") },
-    { FPL("foo/\\bar/\\"), FPL("foo\\\\bar\\\\") },
-    { FPL("/\\foo\\/bar"), FPL("\\\\foo\\\\bar") },
-  };
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath input(cases[i].input);
-    FilePath observed = input.NormalizePathSeparators();
-    EXPECT_EQ(FilePath::StringType(cases[i].expected), observed.value()) <<
-              "i: " << i << ", input: " << input.value();
-  }
-}
-#endif
-
-TEST_F(FilePathTest, EndsWithSeparator) {
-  const UnaryBooleanTestData cases[] = {
-    { FPL(""), false },
-    { FPL("/"), true },
-    { FPL("foo/"), true },
-    { FPL("bar"), false },
-    { FPL("/foo/bar"), false },
-  };
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath input = FilePath(cases[i].input).NormalizePathSeparators();
-    EXPECT_EQ(cases[i].expected, input.EndsWithSeparator());
-  }
-}
-
-TEST_F(FilePathTest, AsEndingWithSeparator) {
-  const UnaryTestData cases[] = {
-    { FPL(""), FPL("") },
-    { FPL("/"), FPL("/") },
-    { FPL("foo"), FPL("foo/") },
-    { FPL("foo/"), FPL("foo/") }
-  };
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath input = FilePath(cases[i].input).NormalizePathSeparators();
-    FilePath expected = FilePath(cases[i].expected).NormalizePathSeparators();
-    EXPECT_EQ(expected.value(), input.AsEndingWithSeparator().value());
-  }
-}
-
-#if defined(OS_ANDROID)
-TEST_F(FilePathTest, ContentUriTest) {
-  const struct UnaryBooleanTestData cases[] = {
-    { FPL("content://foo.bar"),    true },
-    { FPL("content://foo.bar/"),   true },
-    { FPL("content://foo/bar"),    true },
-    { FPL("CoNTenT://foo.bar"),    true },
-    { FPL("content://"),           true },
-    { FPL("content:///foo.bar"),   true },
-    { FPL("content://3foo/bar"),   true },
-    { FPL("content://_foo/bar"),   true },
-    { FPL(".. "),                  false },
-    { FPL("foo.bar"),              false },
-    { FPL("content:foo.bar"),      false },
-    { FPL("content:/foo.ba"),      false },
-    { FPL("content:/dir/foo.bar"), false },
-    { FPL("content: //foo.bar"),   false },
-    { FPL("content%2a%2f%2f"),     false },
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath input(cases[i].input);
-    bool observed = input.IsContentUri();
-    EXPECT_EQ(cases[i].expected, observed) <<
-              "i: " << i << ", input: " << input.value();
-  }
-}
-#endif
-
-// Test the operator<<(ostream, FilePath).
-TEST_F(FilePathTest, PrintToOstream) {
-  std::stringstream ss;
-  FilePath fp(FPL("foo"));
-  ss << fp;
-  EXPECT_EQ("foo", ss.str());
-}
-
-// Test GetHFSDecomposedForm should return empty result for invalid UTF-8
-// strings.
-#if defined(OS_MACOSX)
-TEST_F(FilePathTest, GetHFSDecomposedFormWithInvalidInput) {
-  const FilePath::CharType* cases[] = {
-    FPL("\xc3\x28"),
-    FPL("\xe2\x82\x28"),
-    FPL("\xe2\x28\xa1"),
-    FPL("\xf0\x28\x8c\xbc"),
-    FPL("\xf0\x28\x8c\x28"),
-  };
-  for (auto* invalid_input : cases) {
-    FilePath::StringType observed = FilePath::GetHFSDecomposedForm(
-        invalid_input);
-    EXPECT_TRUE(observed.empty());
-  }
-}
-#endif
-
-}  // namespace base
diff --git a/base/files/file_path_watcher_unittest.cc b/base/files/file_path_watcher_unittest.cc
deleted file mode 100644
index 9e3d94d..0000000
--- a/base/files/file_path_watcher_unittest.cc
+++ /dev/null
@@ -1,873 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file_path_watcher.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#include <aclapi.h>
-#elif defined(OS_POSIX)
-#include <sys/stat.h>
-#endif
-
-#include <set>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/compiler_specific.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/stl_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/test_file_util.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_ANDROID)
-#include "base/android/path_utils.h"
-#endif  // defined(OS_ANDROID)
-
-#if defined(OS_POSIX)
-#include "base/files/file_descriptor_watcher_posix.h"
-#endif  // defined(OS_POSIX)
-
-namespace base {
-
-namespace {
-
-class TestDelegate;
-
-// Aggregates notifications from the test delegates and breaks the message loop
-// the test thread is waiting on once they all came in.
-class NotificationCollector
-    : public base::RefCountedThreadSafe<NotificationCollector> {
- public:
-  NotificationCollector() : task_runner_(base::ThreadTaskRunnerHandle::Get()) {}
-
-  // Called from the file thread by the delegates.
-  void OnChange(TestDelegate* delegate) {
-    task_runner_->PostTask(
-        FROM_HERE, base::BindOnce(&NotificationCollector::RecordChange, this,
-                                  base::Unretained(delegate)));
-  }
-
-  void Register(TestDelegate* delegate) {
-    delegates_.insert(delegate);
-  }
-
-  void Reset() {
-    signaled_.clear();
-  }
-
-  bool Success() {
-    return signaled_ == delegates_;
-  }
-
- private:
-  friend class base::RefCountedThreadSafe<NotificationCollector>;
-  ~NotificationCollector() = default;
-
-  void RecordChange(TestDelegate* delegate) {
-    // Warning: |delegate| is Unretained. Do not dereference.
-    ASSERT_TRUE(task_runner_->BelongsToCurrentThread());
-    ASSERT_TRUE(delegates_.count(delegate));
-    signaled_.insert(delegate);
-
-    // Check whether all delegates have been signaled.
-    if (signaled_ == delegates_)
-      task_runner_->PostTask(FROM_HERE,
-                             RunLoop::QuitCurrentWhenIdleClosureDeprecated());
-  }
-
-  // Set of registered delegates.
-  std::set<TestDelegate*> delegates_;
-
-  // Set of signaled delegates.
-  std::set<TestDelegate*> signaled_;
-
-  // The loop we should break after all delegates signaled.
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-};
-
-class TestDelegateBase : public SupportsWeakPtr<TestDelegateBase> {
- public:
-  TestDelegateBase() = default;
-  virtual ~TestDelegateBase() = default;
-
-  virtual void OnFileChanged(const FilePath& path, bool error) = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestDelegateBase);
-};
-
-// A mock class for testing. Gmock is not appropriate because it is not
-// thread-safe for setting expectations. Thus the test code cannot safely
-// reset expectations while the file watcher is running.
-// Instead, TestDelegate gets the notifications from FilePathWatcher and uses
-// NotificationCollector to aggregate the results.
-class TestDelegate : public TestDelegateBase {
- public:
-  explicit TestDelegate(NotificationCollector* collector)
-      : collector_(collector) {
-    collector_->Register(this);
-  }
-  ~TestDelegate() override = default;
-
-  void OnFileChanged(const FilePath& path, bool error) override {
-    if (error)
-      ADD_FAILURE() << "Error " << path.value();
-    else
-      collector_->OnChange(this);
-  }
-
- private:
-  scoped_refptr<NotificationCollector> collector_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestDelegate);
-};
-
-class FilePathWatcherTest : public testing::Test {
- public:
-  FilePathWatcherTest()
-#if defined(OS_POSIX)
-      : file_descriptor_watcher_(&loop_)
-#endif
-  {
-  }
-
-  ~FilePathWatcherTest() override = default;
-
- protected:
-  void SetUp() override {
-#if defined(OS_ANDROID)
-    // Watching files is only permitted when all parent directories are
-    // accessible, which is not the case for the default temp directory
-    // on Android which is under /data/data.  Use /sdcard instead.
-    // TODO(pauljensen): Remove this when crbug.com/475568 is fixed.
-    FilePath parent_dir;
-    ASSERT_TRUE(android::GetExternalStorageDirectory(&parent_dir));
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDirUnderPath(parent_dir));
-#else   // defined(OS_ANDROID)
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-#endif  // defined(OS_ANDROID)
-    collector_ = new NotificationCollector();
-  }
-
-  void TearDown() override { RunLoop().RunUntilIdle(); }
-
-  FilePath test_file() {
-    return temp_dir_.GetPath().AppendASCII("FilePathWatcherTest");
-  }
-
-  FilePath test_link() {
-    return temp_dir_.GetPath().AppendASCII("FilePathWatcherTest.lnk");
-  }
-
-  // Write |content| to |file|. Returns true on success.
-  bool WriteFile(const FilePath& file, const std::string& content) {
-    int write_size = ::base::WriteFile(file, content.c_str(), content.length());
-    return write_size == static_cast<int>(content.length());
-  }
-
-  bool SetupWatch(const FilePath& target,
-                  FilePathWatcher* watcher,
-                  TestDelegateBase* delegate,
-                  bool recursive_watch) WARN_UNUSED_RESULT;
-
-  bool WaitForEvents() WARN_UNUSED_RESULT {
-    collector_->Reset();
-
-    RunLoop run_loop;
-    // Make sure we timeout if we don't get notified.
-    ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, run_loop.QuitWhenIdleClosure(),
-        TestTimeouts::action_timeout());
-    run_loop.Run();
-    return collector_->Success();
-  }
-
-  NotificationCollector* collector() { return collector_.get(); }
-
-  MessageLoopForIO loop_;
-#if defined(OS_POSIX)
-  FileDescriptorWatcher file_descriptor_watcher_;
-#endif
-
-  ScopedTempDir temp_dir_;
-  scoped_refptr<NotificationCollector> collector_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(FilePathWatcherTest);
-};
-
-bool FilePathWatcherTest::SetupWatch(const FilePath& target,
-                                     FilePathWatcher* watcher,
-                                     TestDelegateBase* delegate,
-                                     bool recursive_watch) {
-  return watcher->Watch(
-      target, recursive_watch,
-      base::Bind(&TestDelegateBase::OnFileChanged, delegate->AsWeakPtr()));
-}
-
-// Basic test: Create the file and verify that we notice.
-TEST_F(FilePathWatcherTest, NewFile) {
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false));
-
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Verify that modifying the file is caught.
-TEST_F(FilePathWatcherTest, ModifiedFile) {
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false));
-
-  // Now make sure we get notified if the file is modified.
-  ASSERT_TRUE(WriteFile(test_file(), "new content"));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Verify that moving the file into place is caught.
-TEST_F(FilePathWatcherTest, MovedFile) {
-  FilePath source_file(temp_dir_.GetPath().AppendASCII("source"));
-  ASSERT_TRUE(WriteFile(source_file, "content"));
-
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false));
-
-  // Now make sure we get notified if the file is modified.
-  ASSERT_TRUE(base::Move(source_file, test_file()));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-TEST_F(FilePathWatcherTest, DeletedFile) {
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false));
-
-  // Now make sure we get notified if the file is deleted.
-  base::DeleteFile(test_file(), false);
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Used by the DeleteDuringNotify test below.
-// Deletes the FilePathWatcher when it's notified.
-class Deleter : public TestDelegateBase {
- public:
-  Deleter(FilePathWatcher* watcher, MessageLoop* loop)
-      : watcher_(watcher),
-        loop_(loop) {
-  }
-  ~Deleter() override = default;
-
-  void OnFileChanged(const FilePath&, bool) override {
-    watcher_.reset();
-    loop_->task_runner()->PostTask(
-        FROM_HERE, RunLoop::QuitCurrentWhenIdleClosureDeprecated());
-  }
-
-  FilePathWatcher* watcher() const { return watcher_.get(); }
-
- private:
-  std::unique_ptr<FilePathWatcher> watcher_;
-  MessageLoop* loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(Deleter);
-};
-
-// Verify that deleting a watcher during the callback doesn't crash.
-TEST_F(FilePathWatcherTest, DeleteDuringNotify) {
-  FilePathWatcher* watcher = new FilePathWatcher;
-  // Takes ownership of watcher.
-  std::unique_ptr<Deleter> deleter(new Deleter(watcher, &loop_));
-  ASSERT_TRUE(SetupWatch(test_file(), watcher, deleter.get(), false));
-
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-  ASSERT_TRUE(WaitForEvents());
-
-  // We win if we haven't crashed yet.
-  // Might as well double-check it got deleted, too.
-  ASSERT_TRUE(deleter->watcher() == nullptr);
-}
-
-// Verify that deleting the watcher works even if there is a pending
-// notification.
-// Flaky on MacOS (and ARM linux): http://crbug.com/85930
-TEST_F(FilePathWatcherTest, DISABLED_DestroyWithPendingNotification) {
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  FilePathWatcher watcher;
-  ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false));
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-}
-
-TEST_F(FilePathWatcherTest, MultipleWatchersSingleFile) {
-  FilePathWatcher watcher1, watcher2;
-  std::unique_ptr<TestDelegate> delegate1(new TestDelegate(collector()));
-  std::unique_ptr<TestDelegate> delegate2(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(test_file(), &watcher1, delegate1.get(), false));
-  ASSERT_TRUE(SetupWatch(test_file(), &watcher2, delegate2.get(), false));
-
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Verify that watching a file whose parent directory doesn't exist yet works if
-// the directory and file are created eventually.
-TEST_F(FilePathWatcherTest, NonExistentDirectory) {
-  FilePathWatcher watcher;
-  FilePath dir(temp_dir_.GetPath().AppendASCII("dir"));
-  FilePath file(dir.AppendASCII("file"));
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get(), false));
-
-  ASSERT_TRUE(base::CreateDirectory(dir));
-
-  ASSERT_TRUE(WriteFile(file, "content"));
-
-  VLOG(1) << "Waiting for file creation";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(WriteFile(file, "content v2"));
-  VLOG(1) << "Waiting for file change";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(base::DeleteFile(file, false));
-  VLOG(1) << "Waiting for file deletion";
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Exercises watch reconfiguration for the case that directories on the path
-// are rapidly created.
-TEST_F(FilePathWatcherTest, DirectoryChain) {
-  FilePath path(temp_dir_.GetPath());
-  std::vector<std::string> dir_names;
-  for (int i = 0; i < 20; i++) {
-    std::string dir(base::StringPrintf("d%d", i));
-    dir_names.push_back(dir);
-    path = path.AppendASCII(dir);
-  }
-
-  FilePathWatcher watcher;
-  FilePath file(path.AppendASCII("file"));
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get(), false));
-
-  FilePath sub_path(temp_dir_.GetPath());
-  for (std::vector<std::string>::const_iterator d(dir_names.begin());
-       d != dir_names.end(); ++d) {
-    sub_path = sub_path.AppendASCII(*d);
-    ASSERT_TRUE(base::CreateDirectory(sub_path));
-  }
-  VLOG(1) << "Create File";
-  ASSERT_TRUE(WriteFile(file, "content"));
-  VLOG(1) << "Waiting for file creation";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(WriteFile(file, "content v2"));
-  VLOG(1) << "Waiting for file modification";
-  ASSERT_TRUE(WaitForEvents());
-}
-
-#if defined(OS_MACOSX)
-// http://crbug.com/85930
-#define DisappearingDirectory DISABLED_DisappearingDirectory
-#endif
-TEST_F(FilePathWatcherTest, DisappearingDirectory) {
-  FilePathWatcher watcher;
-  FilePath dir(temp_dir_.GetPath().AppendASCII("dir"));
-  FilePath file(dir.AppendASCII("file"));
-  ASSERT_TRUE(base::CreateDirectory(dir));
-  ASSERT_TRUE(WriteFile(file, "content"));
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get(), false));
-
-  ASSERT_TRUE(base::DeleteFile(dir, true));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Tests that a file that is deleted and reappears is tracked correctly.
-TEST_F(FilePathWatcherTest, DeleteAndRecreate) {
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false));
-
-  ASSERT_TRUE(base::DeleteFile(test_file(), false));
-  VLOG(1) << "Waiting for file deletion";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-  VLOG(1) << "Waiting for file creation";
-  ASSERT_TRUE(WaitForEvents());
-}
-
-TEST_F(FilePathWatcherTest, WatchDirectory) {
-  FilePathWatcher watcher;
-  FilePath dir(temp_dir_.GetPath().AppendASCII("dir"));
-  FilePath file1(dir.AppendASCII("file1"));
-  FilePath file2(dir.AppendASCII("file2"));
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(dir, &watcher, delegate.get(), false));
-
-  ASSERT_TRUE(base::CreateDirectory(dir));
-  VLOG(1) << "Waiting for directory creation";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(WriteFile(file1, "content"));
-  VLOG(1) << "Waiting for file1 creation";
-  ASSERT_TRUE(WaitForEvents());
-
-#if !defined(OS_MACOSX)
-  // Mac implementation does not detect files modified in a directory.
-  ASSERT_TRUE(WriteFile(file1, "content v2"));
-  VLOG(1) << "Waiting for file1 modification";
-  ASSERT_TRUE(WaitForEvents());
-#endif  // !OS_MACOSX
-
-  ASSERT_TRUE(base::DeleteFile(file1, false));
-  VLOG(1) << "Waiting for file1 deletion";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(WriteFile(file2, "content"));
-  VLOG(1) << "Waiting for file2 creation";
-  ASSERT_TRUE(WaitForEvents());
-}
-
-TEST_F(FilePathWatcherTest, MoveParent) {
-  FilePathWatcher file_watcher;
-  FilePathWatcher subdir_watcher;
-  FilePath dir(temp_dir_.GetPath().AppendASCII("dir"));
-  FilePath dest(temp_dir_.GetPath().AppendASCII("dest"));
-  FilePath subdir(dir.AppendASCII("subdir"));
-  FilePath file(subdir.AppendASCII("file"));
-  std::unique_ptr<TestDelegate> file_delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(file, &file_watcher, file_delegate.get(), false));
-  std::unique_ptr<TestDelegate> subdir_delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(subdir, &subdir_watcher, subdir_delegate.get(),
-                         false));
-
-  // Setup a directory hierarchy.
-  ASSERT_TRUE(base::CreateDirectory(subdir));
-  ASSERT_TRUE(WriteFile(file, "content"));
-  VLOG(1) << "Waiting for file creation";
-  ASSERT_TRUE(WaitForEvents());
-
-  // Move the parent directory.
-  base::Move(dir, dest);
-  VLOG(1) << "Waiting for directory move";
-  ASSERT_TRUE(WaitForEvents());
-}
-
-TEST_F(FilePathWatcherTest, RecursiveWatch) {
-  FilePathWatcher watcher;
-  FilePath dir(temp_dir_.GetPath().AppendASCII("dir"));
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  bool setup_result = SetupWatch(dir, &watcher, delegate.get(), true);
-  if (!FilePathWatcher::RecursiveWatchAvailable()) {
-    ASSERT_FALSE(setup_result);
-    return;
-  }
-  ASSERT_TRUE(setup_result);
-
-  // Main directory("dir") creation.
-  ASSERT_TRUE(base::CreateDirectory(dir));
-  ASSERT_TRUE(WaitForEvents());
-
-  // Create "$dir/file1".
-  FilePath file1(dir.AppendASCII("file1"));
-  ASSERT_TRUE(WriteFile(file1, "content"));
-  ASSERT_TRUE(WaitForEvents());
-
-  // Create "$dir/subdir".
-  FilePath subdir(dir.AppendASCII("subdir"));
-  ASSERT_TRUE(base::CreateDirectory(subdir));
-  ASSERT_TRUE(WaitForEvents());
-
-  // Create "$dir/subdir/subdir_file1".
-  FilePath subdir_file1(subdir.AppendASCII("subdir_file1"));
-  ASSERT_TRUE(WriteFile(subdir_file1, "content"));
-  ASSERT_TRUE(WaitForEvents());
-
-  // Create "$dir/subdir/subdir_child_dir".
-  FilePath subdir_child_dir(subdir.AppendASCII("subdir_child_dir"));
-  ASSERT_TRUE(base::CreateDirectory(subdir_child_dir));
-  ASSERT_TRUE(WaitForEvents());
-
-  // Create "$dir/subdir/subdir_child_dir/child_dir_file1".
-  FilePath child_dir_file1(subdir_child_dir.AppendASCII("child_dir_file1"));
-  ASSERT_TRUE(WriteFile(child_dir_file1, "content v2"));
-  ASSERT_TRUE(WaitForEvents());
-
-  // Write into "$dir/subdir/subdir_child_dir/child_dir_file1".
-  ASSERT_TRUE(WriteFile(child_dir_file1, "content"));
-  ASSERT_TRUE(WaitForEvents());
-
-// Apps cannot change file attributes on Android in /sdcard as /sdcard uses the
-// "fuse" file system, while /data uses "ext4".  Running these tests in /data
-// would be preferable and allow testing file attributes and symlinks.
-// TODO(pauljensen): Re-enable when crbug.com/475568 is fixed and SetUp() places
-// the |temp_dir_| in /data.
-#if !defined(OS_ANDROID)
-  // Modify "$dir/subdir/subdir_child_dir/child_dir_file1" attributes.
-  ASSERT_TRUE(base::MakeFileUnreadable(child_dir_file1));
-  ASSERT_TRUE(WaitForEvents());
-#endif
-
-  // Delete "$dir/subdir/subdir_file1".
-  ASSERT_TRUE(base::DeleteFile(subdir_file1, false));
-  ASSERT_TRUE(WaitForEvents());
-
-  // Delete "$dir/subdir/subdir_child_dir/child_dir_file1".
-  ASSERT_TRUE(base::DeleteFile(child_dir_file1, false));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
-// Apps cannot create symlinks on Android in /sdcard as /sdcard uses the
-// "fuse" file system, while /data uses "ext4".  Running these tests in /data
-// would be preferable and allow testing file attributes and symlinks.
-// TODO(pauljensen): Re-enable when crbug.com/475568 is fixed and SetUp() places
-// the |temp_dir_| in /data.
-//
-// This test is disabled on Fuchsia since it doesn't support symlinking.
-TEST_F(FilePathWatcherTest, RecursiveWithSymLink) {
-  if (!FilePathWatcher::RecursiveWatchAvailable())
-    return;
-
-  FilePathWatcher watcher;
-  FilePath test_dir(temp_dir_.GetPath().AppendASCII("test_dir"));
-  ASSERT_TRUE(base::CreateDirectory(test_dir));
-  FilePath symlink(test_dir.AppendASCII("symlink"));
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(symlink, &watcher, delegate.get(), true));
-
-  // Link creation.
-  FilePath target1(temp_dir_.GetPath().AppendASCII("target1"));
-  ASSERT_TRUE(base::CreateSymbolicLink(target1, symlink));
-  ASSERT_TRUE(WaitForEvents());
-
-  // Target1 creation.
-  ASSERT_TRUE(base::CreateDirectory(target1));
-  ASSERT_TRUE(WaitForEvents());
-
-  // Create a file in target1.
-  FilePath target1_file(target1.AppendASCII("file"));
-  ASSERT_TRUE(WriteFile(target1_file, "content"));
-  ASSERT_TRUE(WaitForEvents());
-
-  // Link change.
-  FilePath target2(temp_dir_.GetPath().AppendASCII("target2"));
-  ASSERT_TRUE(base::CreateDirectory(target2));
-  ASSERT_TRUE(base::DeleteFile(symlink, false));
-  ASSERT_TRUE(base::CreateSymbolicLink(target2, symlink));
-  ASSERT_TRUE(WaitForEvents());
-
-  // Create a file in target2.
-  FilePath target2_file(target2.AppendASCII("file"));
-  ASSERT_TRUE(WriteFile(target2_file, "content"));
-  ASSERT_TRUE(WaitForEvents());
-}
-#endif  // defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
-
-TEST_F(FilePathWatcherTest, MoveChild) {
-  FilePathWatcher file_watcher;
-  FilePathWatcher subdir_watcher;
-  FilePath source_dir(temp_dir_.GetPath().AppendASCII("source"));
-  FilePath source_subdir(source_dir.AppendASCII("subdir"));
-  FilePath source_file(source_subdir.AppendASCII("file"));
-  FilePath dest_dir(temp_dir_.GetPath().AppendASCII("dest"));
-  FilePath dest_subdir(dest_dir.AppendASCII("subdir"));
-  FilePath dest_file(dest_subdir.AppendASCII("file"));
-
-  // Setup a directory hierarchy.
-  ASSERT_TRUE(base::CreateDirectory(source_subdir));
-  ASSERT_TRUE(WriteFile(source_file, "content"));
-
-  std::unique_ptr<TestDelegate> file_delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(dest_file, &file_watcher, file_delegate.get(), false));
-  std::unique_ptr<TestDelegate> subdir_delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(dest_subdir, &subdir_watcher, subdir_delegate.get(),
-                         false));
-
-  // Move the directory into place, s.t. the watched file appears.
-  ASSERT_TRUE(base::Move(source_dir, dest_dir));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Verify that changing attributes on a file is caught
-#if defined(OS_ANDROID)
-// Apps cannot change file attributes on Android in /sdcard as /sdcard uses the
-// "fuse" file system, while /data uses "ext4".  Running these tests in /data
-// would be preferable and allow testing file attributes and symlinks.
-// TODO(pauljensen): Re-enable when crbug.com/475568 is fixed and SetUp() places
-// the |temp_dir_| in /data.
-#define FileAttributesChanged DISABLED_FileAttributesChanged
-#endif  // defined(OS_ANDROID
-TEST_F(FilePathWatcherTest, FileAttributesChanged) {
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false));
-
-  // Now make sure we get notified if the file is modified.
-  ASSERT_TRUE(base::MakeFileUnreadable(test_file()));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-#if defined(OS_LINUX)
-
-// Verify that creating a symlink is caught.
-TEST_F(FilePathWatcherTest, CreateLink) {
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  // Note that we are watching the symlink
-  ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false));
-
-  // Now make sure we get notified if the link is created.
-  // Note that test_file() doesn't have to exist.
-  ASSERT_TRUE(CreateSymbolicLink(test_file(), test_link()));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Verify that deleting a symlink is caught.
-TEST_F(FilePathWatcherTest, DeleteLink) {
-  // Unfortunately this test case only works if the link target exists.
-  // TODO(craig) fix this as part of crbug.com/91561.
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-  ASSERT_TRUE(CreateSymbolicLink(test_file(), test_link()));
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false));
-
-  // Now make sure we get notified if the link is deleted.
-  ASSERT_TRUE(base::DeleteFile(test_link(), false));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Verify that modifying a target file that a link is pointing to
-// when we are watching the link is caught.
-TEST_F(FilePathWatcherTest, ModifiedLinkedFile) {
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-  ASSERT_TRUE(CreateSymbolicLink(test_file(), test_link()));
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  // Note that we are watching the symlink.
-  ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false));
-
-  // Now make sure we get notified if the file is modified.
-  ASSERT_TRUE(WriteFile(test_file(), "new content"));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Verify that creating a target file that a link is pointing to
-// when we are watching the link is caught.
-TEST_F(FilePathWatcherTest, CreateTargetLinkedFile) {
-  ASSERT_TRUE(CreateSymbolicLink(test_file(), test_link()));
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  // Note that we are watching the symlink.
-  ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false));
-
-  // Now make sure we get notified if the target file is created.
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Verify that deleting a target file that a link is pointing to
-// when we are watching the link is caught.
-TEST_F(FilePathWatcherTest, DeleteTargetLinkedFile) {
-  ASSERT_TRUE(WriteFile(test_file(), "content"));
-  ASSERT_TRUE(CreateSymbolicLink(test_file(), test_link()));
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  // Note that we are watching the symlink.
-  ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false));
-
-  // Now make sure we get notified if the target file is deleted.
-  ASSERT_TRUE(base::DeleteFile(test_file(), false));
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Verify that watching a file whose parent directory is a link that
-// doesn't exist yet works if the symlink is created eventually.
-TEST_F(FilePathWatcherTest, LinkedDirectoryPart1) {
-  FilePathWatcher watcher;
-  FilePath dir(temp_dir_.GetPath().AppendASCII("dir"));
-  FilePath link_dir(temp_dir_.GetPath().AppendASCII("dir.lnk"));
-  FilePath file(dir.AppendASCII("file"));
-  FilePath linkfile(link_dir.AppendASCII("file"));
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  // dir/file should exist.
-  ASSERT_TRUE(base::CreateDirectory(dir));
-  ASSERT_TRUE(WriteFile(file, "content"));
-  // Note that we are watching dir.lnk/file which doesn't exist yet.
-  ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get(), false));
-
-  ASSERT_TRUE(CreateSymbolicLink(dir, link_dir));
-  VLOG(1) << "Waiting for link creation";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(WriteFile(file, "content v2"));
-  VLOG(1) << "Waiting for file change";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(base::DeleteFile(file, false));
-  VLOG(1) << "Waiting for file deletion";
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Verify that watching a file whose parent directory is a
-// dangling symlink works if the directory is created eventually.
-TEST_F(FilePathWatcherTest, LinkedDirectoryPart2) {
-  FilePathWatcher watcher;
-  FilePath dir(temp_dir_.GetPath().AppendASCII("dir"));
-  FilePath link_dir(temp_dir_.GetPath().AppendASCII("dir.lnk"));
-  FilePath file(dir.AppendASCII("file"));
-  FilePath linkfile(link_dir.AppendASCII("file"));
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  // Now create the link from dir.lnk pointing to dir but
-  // neither dir nor dir/file exist yet.
-  ASSERT_TRUE(CreateSymbolicLink(dir, link_dir));
-  // Note that we are watching dir.lnk/file.
-  ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get(), false));
-
-  ASSERT_TRUE(base::CreateDirectory(dir));
-  ASSERT_TRUE(WriteFile(file, "content"));
-  VLOG(1) << "Waiting for dir/file creation";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(WriteFile(file, "content v2"));
-  VLOG(1) << "Waiting for file change";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(base::DeleteFile(file, false));
-  VLOG(1) << "Waiting for file deletion";
-  ASSERT_TRUE(WaitForEvents());
-}
-
-// Verify that watching a file with a symlink on the path
-// to the file works.
-TEST_F(FilePathWatcherTest, LinkedDirectoryPart3) {
-  FilePathWatcher watcher;
-  FilePath dir(temp_dir_.GetPath().AppendASCII("dir"));
-  FilePath link_dir(temp_dir_.GetPath().AppendASCII("dir.lnk"));
-  FilePath file(dir.AppendASCII("file"));
-  FilePath linkfile(link_dir.AppendASCII("file"));
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(base::CreateDirectory(dir));
-  ASSERT_TRUE(CreateSymbolicLink(dir, link_dir));
-  // Note that we are watching dir.lnk/file but the file doesn't exist yet.
-  ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get(), false));
-
-  ASSERT_TRUE(WriteFile(file, "content"));
-  VLOG(1) << "Waiting for file creation";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(WriteFile(file, "content v2"));
-  VLOG(1) << "Waiting for file change";
-  ASSERT_TRUE(WaitForEvents());
-
-  ASSERT_TRUE(base::DeleteFile(file, false));
-  VLOG(1) << "Waiting for file deletion";
-  ASSERT_TRUE(WaitForEvents());
-}
-
-#endif  // OS_LINUX
-
-enum Permission {
-  Read,
-  Write,
-  Execute
-};
-
-#if defined(OS_MACOSX)
-bool ChangeFilePermissions(const FilePath& path, Permission perm, bool allow) {
-  struct stat stat_buf;
-
-  if (stat(path.value().c_str(), &stat_buf) != 0)
-    return false;
-
-  mode_t mode = 0;
-  switch (perm) {
-    case Read:
-      mode = S_IRUSR | S_IRGRP | S_IROTH;
-      break;
-    case Write:
-      mode = S_IWUSR | S_IWGRP | S_IWOTH;
-      break;
-    case Execute:
-      mode = S_IXUSR | S_IXGRP | S_IXOTH;
-      break;
-    default:
-      ADD_FAILURE() << "unknown perm " << perm;
-      return false;
-  }
-  if (allow) {
-    stat_buf.st_mode |= mode;
-  } else {
-    stat_buf.st_mode &= ~mode;
-  }
-  return chmod(path.value().c_str(), stat_buf.st_mode) == 0;
-}
-#endif  // defined(OS_MACOSX)
-
-#if defined(OS_MACOSX)
-// Linux implementation of FilePathWatcher doesn't catch attribute changes.
-// http://crbug.com/78043
-// Windows implementation of FilePathWatcher catches attribute changes that
-// don't affect the path being watched.
-// http://crbug.com/78045
-
-// Verify that changing attributes on a directory works.
-TEST_F(FilePathWatcherTest, DirAttributesChanged) {
-  FilePath test_dir1(
-      temp_dir_.GetPath().AppendASCII("DirAttributesChangedDir1"));
-  FilePath test_dir2(test_dir1.AppendASCII("DirAttributesChangedDir2"));
-  FilePath test_file(test_dir2.AppendASCII("DirAttributesChangedFile"));
-  // Setup a directory hierarchy.
-  ASSERT_TRUE(base::CreateDirectory(test_dir1));
-  ASSERT_TRUE(base::CreateDirectory(test_dir2));
-  ASSERT_TRUE(WriteFile(test_file, "content"));
-
-  FilePathWatcher watcher;
-  std::unique_ptr<TestDelegate> delegate(new TestDelegate(collector()));
-  ASSERT_TRUE(SetupWatch(test_file, &watcher, delegate.get(), false));
-
-  // We should not get notified in this case as it hasn't affected our ability
-  // to access the file.
-  ASSERT_TRUE(ChangeFilePermissions(test_dir1, Read, false));
-  loop_.task_runner()->PostDelayedTask(
-      FROM_HERE, RunLoop::QuitCurrentWhenIdleClosureDeprecated(),
-      TestTimeouts::tiny_timeout());
-  ASSERT_FALSE(WaitForEvents());
-  ASSERT_TRUE(ChangeFilePermissions(test_dir1, Read, true));
-
-  // We should get notified in this case because filepathwatcher can no
-  // longer access the file
-  ASSERT_TRUE(ChangeFilePermissions(test_dir1, Execute, false));
-  ASSERT_TRUE(WaitForEvents());
-  ASSERT_TRUE(ChangeFilePermissions(test_dir1, Execute, true));
-}
-
-#endif  // OS_MACOSX
-}  // namespace
-
-}  // namespace base
diff --git a/base/files/file_proxy_unittest.cc b/base/files/file_proxy_unittest.cc
deleted file mode 100644
index 73a0497..0000000
--- a/base/files/file_proxy_unittest.cc
+++ /dev/null
@@ -1,399 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file_proxy.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/files/file.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_restrictions.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-class FileProxyTest : public testing::Test {
- public:
-  FileProxyTest()
-      : file_thread_("FileProxyTestFileThread"),
-        error_(File::FILE_OK),
-        bytes_written_(-1),
-        weak_factory_(this) {}
-
-  void SetUp() override {
-    ASSERT_TRUE(dir_.CreateUniqueTempDir());
-    ASSERT_TRUE(file_thread_.Start());
-  }
-
-  void DidFinish(File::Error error) {
-    error_ = error;
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-  }
-
-  void DidCreateOrOpen(File::Error error) {
-    error_ = error;
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-  }
-
-  void DidCreateTemporary(File::Error error,
-                          const FilePath& path) {
-    error_ = error;
-    path_ = path;
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-  }
-
-  void DidGetFileInfo(File::Error error,
-                      const File::Info& file_info) {
-    error_ = error;
-    file_info_ = file_info;
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-  }
-
-  void DidRead(File::Error error,
-               const char* data,
-               int bytes_read) {
-    error_ = error;
-    buffer_.resize(bytes_read);
-    memcpy(&buffer_[0], data, bytes_read);
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-  }
-
-  void DidWrite(File::Error error,
-                int bytes_written) {
-    error_ = error;
-    bytes_written_ = bytes_written;
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-  }
-
- protected:
-  void CreateProxy(uint32_t flags, FileProxy* proxy) {
-    proxy->CreateOrOpen(
-        TestPath(), flags,
-        BindOnce(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr()));
-    RunLoop().Run();
-    EXPECT_TRUE(proxy->IsValid());
-  }
-
-  TaskRunner* file_task_runner() const {
-    return file_thread_.task_runner().get();
-  }
-  const FilePath& TestDirPath() const { return dir_.GetPath(); }
-  const FilePath TestPath() const { return dir_.GetPath().AppendASCII("test"); }
-
-  ScopedTempDir dir_;
-  MessageLoopForIO message_loop_;
-  Thread file_thread_;
-
-  File::Error error_;
-  FilePath path_;
-  File::Info file_info_;
-  std::vector<char> buffer_;
-  int bytes_written_;
-  WeakPtrFactory<FileProxyTest> weak_factory_;
-};
-
-TEST_F(FileProxyTest, CreateOrOpen_Create) {
-  FileProxy proxy(file_task_runner());
-  proxy.CreateOrOpen(
-      TestPath(), File::FLAG_CREATE | File::FLAG_READ,
-      BindOnce(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr()));
-  RunLoop().Run();
-
-  EXPECT_EQ(File::FILE_OK, error_);
-  EXPECT_TRUE(proxy.IsValid());
-  EXPECT_TRUE(proxy.created());
-  EXPECT_TRUE(PathExists(TestPath()));
-}
-
-TEST_F(FileProxyTest, CreateOrOpen_Open) {
-  // Creates a file.
-  base::WriteFile(TestPath(), nullptr, 0);
-  ASSERT_TRUE(PathExists(TestPath()));
-
-  // Opens the created file.
-  FileProxy proxy(file_task_runner());
-  proxy.CreateOrOpen(
-      TestPath(), File::FLAG_OPEN | File::FLAG_READ,
-      BindOnce(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr()));
-  RunLoop().Run();
-
-  EXPECT_EQ(File::FILE_OK, error_);
-  EXPECT_TRUE(proxy.IsValid());
-  EXPECT_FALSE(proxy.created());
-}
-
-TEST_F(FileProxyTest, CreateOrOpen_OpenNonExistent) {
-  FileProxy proxy(file_task_runner());
-  proxy.CreateOrOpen(
-      TestPath(), File::FLAG_OPEN | File::FLAG_READ,
-      BindOnce(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr()));
-  RunLoop().Run();
-  EXPECT_EQ(File::FILE_ERROR_NOT_FOUND, error_);
-  EXPECT_FALSE(proxy.IsValid());
-  EXPECT_FALSE(proxy.created());
-  EXPECT_FALSE(PathExists(TestPath()));
-}
-
-TEST_F(FileProxyTest, CreateOrOpen_AbandonedCreate) {
-  bool prev = ThreadRestrictions::SetIOAllowed(false);
-  {
-    FileProxy proxy(file_task_runner());
-    proxy.CreateOrOpen(
-        TestPath(), File::FLAG_CREATE | File::FLAG_READ,
-        BindOnce(&FileProxyTest::DidCreateOrOpen, weak_factory_.GetWeakPtr()));
-  }
-  RunLoop().Run();
-  ThreadRestrictions::SetIOAllowed(prev);
-
-  EXPECT_TRUE(PathExists(TestPath()));
-}
-
-TEST_F(FileProxyTest, Close) {
-  // Creates a file.
-  FileProxy proxy(file_task_runner());
-  CreateProxy(File::FLAG_CREATE | File::FLAG_WRITE, &proxy);
-
-#if defined(OS_WIN)
-  // This fails on Windows if the file is not closed.
-  EXPECT_FALSE(base::Move(TestPath(), TestDirPath().AppendASCII("new")));
-#endif
-
-  proxy.Close(BindOnce(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr()));
-  RunLoop().Run();
-  EXPECT_EQ(File::FILE_OK, error_);
-  EXPECT_FALSE(proxy.IsValid());
-
-  // Now it should pass on all platforms.
-  EXPECT_TRUE(base::Move(TestPath(), TestDirPath().AppendASCII("new")));
-}
-
-TEST_F(FileProxyTest, CreateTemporary) {
-  {
-    FileProxy proxy(file_task_runner());
-    proxy.CreateTemporary(0 /* additional_file_flags */,
-                          BindOnce(&FileProxyTest::DidCreateTemporary,
-                                   weak_factory_.GetWeakPtr()));
-    RunLoop().Run();
-
-    EXPECT_TRUE(proxy.IsValid());
-    EXPECT_EQ(File::FILE_OK, error_);
-    EXPECT_TRUE(PathExists(path_));
-
-    // The file should be writable.
-    proxy.Write(0, "test", 4,
-                BindOnce(&FileProxyTest::DidWrite, weak_factory_.GetWeakPtr()));
-    RunLoop().Run();
-    EXPECT_EQ(File::FILE_OK, error_);
-    EXPECT_EQ(4, bytes_written_);
-  }
-
-  // Make sure the written data can be read from the returned path.
-  std::string data;
-  EXPECT_TRUE(ReadFileToString(path_, &data));
-  EXPECT_EQ("test", data);
-
-  // Make sure we can & do delete the created file to prevent leaks on the bots.
-  EXPECT_TRUE(base::DeleteFile(path_, false));
-}
-
-TEST_F(FileProxyTest, SetAndTake) {
-  File file(TestPath(), File::FLAG_CREATE | File::FLAG_READ);
-  ASSERT_TRUE(file.IsValid());
-  FileProxy proxy(file_task_runner());
-  EXPECT_FALSE(proxy.IsValid());
-  proxy.SetFile(std::move(file));
-  EXPECT_TRUE(proxy.IsValid());
-  EXPECT_FALSE(file.IsValid());
-
-  file = proxy.TakeFile();
-  EXPECT_FALSE(proxy.IsValid());
-  EXPECT_TRUE(file.IsValid());
-}
-
-TEST_F(FileProxyTest, DuplicateFile) {
-  FileProxy proxy(file_task_runner());
-  CreateProxy(File::FLAG_CREATE | File::FLAG_WRITE, &proxy);
-  ASSERT_TRUE(proxy.IsValid());
-
-  base::File duplicate = proxy.DuplicateFile();
-  EXPECT_TRUE(proxy.IsValid());
-  EXPECT_TRUE(duplicate.IsValid());
-
-  FileProxy invalid_proxy(file_task_runner());
-  ASSERT_FALSE(invalid_proxy.IsValid());
-
-  base::File invalid_duplicate = invalid_proxy.DuplicateFile();
-  EXPECT_FALSE(invalid_proxy.IsValid());
-  EXPECT_FALSE(invalid_duplicate.IsValid());
-}
-
-TEST_F(FileProxyTest, GetInfo) {
-  // Setup.
-  ASSERT_EQ(4, base::WriteFile(TestPath(), "test", 4));
-  File::Info expected_info;
-  GetFileInfo(TestPath(), &expected_info);
-
-  // Run.
-  FileProxy proxy(file_task_runner());
-  CreateProxy(File::FLAG_OPEN | File::FLAG_READ, &proxy);
-  proxy.GetInfo(
-      BindOnce(&FileProxyTest::DidGetFileInfo, weak_factory_.GetWeakPtr()));
-  RunLoop().Run();
-
-  // Verify.
-  EXPECT_EQ(File::FILE_OK, error_);
-  EXPECT_EQ(expected_info.size, file_info_.size);
-  EXPECT_EQ(expected_info.is_directory, file_info_.is_directory);
-  EXPECT_EQ(expected_info.is_symbolic_link, file_info_.is_symbolic_link);
-  EXPECT_EQ(expected_info.last_modified, file_info_.last_modified);
-  EXPECT_EQ(expected_info.creation_time, file_info_.creation_time);
-}
-
-TEST_F(FileProxyTest, Read) {
-  // Setup.
-  const char expected_data[] = "bleh";
-  int expected_bytes = arraysize(expected_data);
-  ASSERT_EQ(expected_bytes,
-            base::WriteFile(TestPath(), expected_data, expected_bytes));
-
-  // Run.
-  FileProxy proxy(file_task_runner());
-  CreateProxy(File::FLAG_OPEN | File::FLAG_READ, &proxy);
-
-  proxy.Read(0, 128,
-             BindOnce(&FileProxyTest::DidRead, weak_factory_.GetWeakPtr()));
-  RunLoop().Run();
-
-  // Verify.
-  EXPECT_EQ(File::FILE_OK, error_);
-  EXPECT_EQ(expected_bytes, static_cast<int>(buffer_.size()));
-  for (size_t i = 0; i < buffer_.size(); ++i) {
-    EXPECT_EQ(expected_data[i], buffer_[i]);
-  }
-}
-
-TEST_F(FileProxyTest, WriteAndFlush) {
-  FileProxy proxy(file_task_runner());
-  CreateProxy(File::FLAG_CREATE | File::FLAG_WRITE, &proxy);
-
-  const char data[] = "foo!";
-  int data_bytes = arraysize(data);
-  proxy.Write(0, data, data_bytes,
-              BindOnce(&FileProxyTest::DidWrite, weak_factory_.GetWeakPtr()));
-  RunLoop().Run();
-  EXPECT_EQ(File::FILE_OK, error_);
-  EXPECT_EQ(data_bytes, bytes_written_);
-
-  // Flush the written data.  (So that the following read should always
-  // succeed.  On some platforms it may work with or without this flush.)
-  proxy.Flush(BindOnce(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr()));
-  RunLoop().Run();
-  EXPECT_EQ(File::FILE_OK, error_);
-
-  // Verify the written data.
-  char buffer[10];
-  EXPECT_EQ(data_bytes, base::ReadFile(TestPath(), buffer, data_bytes));
-  for (int i = 0; i < data_bytes; ++i) {
-    EXPECT_EQ(data[i], buffer[i]);
-  }
-}
-
-#if defined(OS_ANDROID)
-// Flaky on Android, see http://crbug.com/489602
-#define MAYBE_SetTimes DISABLED_SetTimes
-#else
-#define MAYBE_SetTimes SetTimes
-#endif
-TEST_F(FileProxyTest, MAYBE_SetTimes) {
-  FileProxy proxy(file_task_runner());
-  CreateProxy(
-      File::FLAG_CREATE | File::FLAG_WRITE | File::FLAG_WRITE_ATTRIBUTES,
-      &proxy);
-
-  Time last_accessed_time = Time::Now() - TimeDelta::FromDays(12345);
-  Time last_modified_time = Time::Now() - TimeDelta::FromHours(98765);
-
-  proxy.SetTimes(
-      last_accessed_time, last_modified_time,
-      BindOnce(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr()));
-  RunLoop().Run();
-  EXPECT_EQ(File::FILE_OK, error_);
-
-  File::Info info;
-  GetFileInfo(TestPath(), &info);
-
-  // The returned values may only have the seconds precision, so we cast
-  // the double values to int here.
-  EXPECT_EQ(static_cast<int>(last_modified_time.ToDoubleT()),
-            static_cast<int>(info.last_modified.ToDoubleT()));
-  EXPECT_EQ(static_cast<int>(last_accessed_time.ToDoubleT()),
-            static_cast<int>(info.last_accessed.ToDoubleT()));
-}
-
-TEST_F(FileProxyTest, SetLength_Shrink) {
-  // Setup.
-  const char kTestData[] = "0123456789";
-  ASSERT_EQ(10, base::WriteFile(TestPath(), kTestData, 10));
-  File::Info info;
-  GetFileInfo(TestPath(), &info);
-  ASSERT_EQ(10, info.size);
-
-  // Run.
-  FileProxy proxy(file_task_runner());
-  CreateProxy(File::FLAG_OPEN | File::FLAG_WRITE, &proxy);
-  proxy.SetLength(
-      7, BindOnce(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr()));
-  RunLoop().Run();
-
-  // Verify.
-  GetFileInfo(TestPath(), &info);
-  ASSERT_EQ(7, info.size);
-
-  char buffer[7];
-  EXPECT_EQ(7, base::ReadFile(TestPath(), buffer, 7));
-  int i = 0;
-  for (; i < 7; ++i)
-    EXPECT_EQ(kTestData[i], buffer[i]);
-}
-
-TEST_F(FileProxyTest, SetLength_Expand) {
-  // Setup.
-  const char kTestData[] = "9876543210";
-  ASSERT_EQ(10, base::WriteFile(TestPath(), kTestData, 10));
-  File::Info info;
-  GetFileInfo(TestPath(), &info);
-  ASSERT_EQ(10, info.size);
-
-  // Run.
-  FileProxy proxy(file_task_runner());
-  CreateProxy(File::FLAG_OPEN | File::FLAG_WRITE, &proxy);
-  proxy.SetLength(
-      53, BindOnce(&FileProxyTest::DidFinish, weak_factory_.GetWeakPtr()));
-  RunLoop().Run();
-
-  // Verify.
-  GetFileInfo(TestPath(), &info);
-  ASSERT_EQ(53, info.size);
-
-  char buffer[53];
-  EXPECT_EQ(53, base::ReadFile(TestPath(), buffer, 53));
-  int i = 0;
-  for (; i < 10; ++i)
-    EXPECT_EQ(kTestData[i], buffer[i]);
-  for (; i < 53; ++i)
-    EXPECT_EQ(0, buffer[i]);
-}
-
-}  // namespace base
diff --git a/base/files/file_unittest.cc b/base/files/file_unittest.cc
deleted file mode 100644
index b9992ad..0000000
--- a/base/files/file_unittest.cc
+++ /dev/null
@@ -1,721 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file.h"
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/files/file_util.h"
-#include "base/files/memory_mapped_file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using base::File;
-using base::FilePath;
-
-TEST(FileTest, Create) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("create_file_1");
-
-  {
-    // Don't create a File at all.
-    File file;
-    EXPECT_FALSE(file.IsValid());
-    EXPECT_EQ(base::File::FILE_ERROR_FAILED, file.error_details());
-
-    File file2(base::File::FILE_ERROR_TOO_MANY_OPENED);
-    EXPECT_FALSE(file2.IsValid());
-    EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED, file2.error_details());
-  }
-
-  {
-    // Open a file that doesn't exist.
-    File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
-    EXPECT_FALSE(file.IsValid());
-    EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, file.error_details());
-    EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, base::File::GetLastFileError());
-  }
-
-  {
-    // Open or create a file.
-    File file(file_path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ);
-    EXPECT_TRUE(file.IsValid());
-    EXPECT_TRUE(file.created());
-    EXPECT_EQ(base::File::FILE_OK, file.error_details());
-  }
-
-  {
-    // Open an existing file.
-    File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
-    EXPECT_TRUE(file.IsValid());
-    EXPECT_FALSE(file.created());
-    EXPECT_EQ(base::File::FILE_OK, file.error_details());
-
-    // This time verify closing the file.
-    file.Close();
-    EXPECT_FALSE(file.IsValid());
-  }
-
-  {
-    // Open an existing file through Initialize
-    File file;
-    file.Initialize(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
-    EXPECT_TRUE(file.IsValid());
-    EXPECT_FALSE(file.created());
-    EXPECT_EQ(base::File::FILE_OK, file.error_details());
-
-    // This time verify closing the file.
-    file.Close();
-    EXPECT_FALSE(file.IsValid());
-  }
-
-  {
-    // Create a file that exists.
-    File file(file_path, base::File::FLAG_CREATE | base::File::FLAG_READ);
-    EXPECT_FALSE(file.IsValid());
-    EXPECT_FALSE(file.created());
-    EXPECT_EQ(base::File::FILE_ERROR_EXISTS, file.error_details());
-    EXPECT_EQ(base::File::FILE_ERROR_EXISTS, base::File::GetLastFileError());
-  }
-
-  {
-    // Create or overwrite a file.
-    File file(file_path,
-              base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-    EXPECT_TRUE(file.IsValid());
-    EXPECT_TRUE(file.created());
-    EXPECT_EQ(base::File::FILE_OK, file.error_details());
-  }
-
-  {
-    // Create a delete-on-close file.
-    file_path = temp_dir.GetPath().AppendASCII("create_file_2");
-    File file(file_path,
-              base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
-                  base::File::FLAG_DELETE_ON_CLOSE);
-    EXPECT_TRUE(file.IsValid());
-    EXPECT_TRUE(file.created());
-    EXPECT_EQ(base::File::FILE_OK, file.error_details());
-  }
-
-  EXPECT_FALSE(base::PathExists(file_path));
-}
-
-TEST(FileTest, SelfSwap) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("create_file_1");
-  File file(file_path,
-            base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_DELETE_ON_CLOSE);
-  std::swap(file, file);
-  EXPECT_TRUE(file.IsValid());
-}
-
-TEST(FileTest, Async) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("create_file");
-
-  {
-    File file(file_path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_ASYNC);
-    EXPECT_TRUE(file.IsValid());
-    EXPECT_TRUE(file.async());
-  }
-
-  {
-    File file(file_path, base::File::FLAG_OPEN_ALWAYS);
-    EXPECT_TRUE(file.IsValid());
-    EXPECT_FALSE(file.async());
-  }
-}
-
-TEST(FileTest, DeleteOpenFile) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("create_file_1");
-
-  // Create a file.
-  File file(file_path,
-            base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
-                base::File::FLAG_SHARE_DELETE);
-  EXPECT_TRUE(file.IsValid());
-  EXPECT_TRUE(file.created());
-  EXPECT_EQ(base::File::FILE_OK, file.error_details());
-
-  // Open an existing file and mark it as delete on close.
-  File same_file(file_path,
-                 base::File::FLAG_OPEN | base::File::FLAG_DELETE_ON_CLOSE |
-                     base::File::FLAG_READ);
-  EXPECT_TRUE(file.IsValid());
-  EXPECT_FALSE(same_file.created());
-  EXPECT_EQ(base::File::FILE_OK, same_file.error_details());
-
-  // Close both handles and check that the file is gone.
-  file.Close();
-  same_file.Close();
-  EXPECT_FALSE(base::PathExists(file_path));
-}
-
-TEST(FileTest, ReadWrite) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("read_write_file");
-  File file(file_path,
-            base::File::FLAG_CREATE | base::File::FLAG_READ |
-                base::File::FLAG_WRITE);
-  ASSERT_TRUE(file.IsValid());
-
-  char data_to_write[] = "test";
-  const int kTestDataSize = 4;
-
-  // Write 0 bytes to the file.
-  int bytes_written = file.Write(0, data_to_write, 0);
-  EXPECT_EQ(0, bytes_written);
-
-  // Write 0 bytes, with buf=nullptr.
-  bytes_written = file.Write(0, nullptr, 0);
-  EXPECT_EQ(0, bytes_written);
-
-  // Write "test" to the file.
-  bytes_written = file.Write(0, data_to_write, kTestDataSize);
-  EXPECT_EQ(kTestDataSize, bytes_written);
-
-  // Read from EOF.
-  char data_read_1[32];
-  int bytes_read = file.Read(kTestDataSize, data_read_1, kTestDataSize);
-  EXPECT_EQ(0, bytes_read);
-
-  // Read from somewhere in the middle of the file.
-  const int kPartialReadOffset = 1;
-  bytes_read = file.Read(kPartialReadOffset, data_read_1, kTestDataSize);
-  EXPECT_EQ(kTestDataSize - kPartialReadOffset, bytes_read);
-  for (int i = 0; i < bytes_read; i++)
-    EXPECT_EQ(data_to_write[i + kPartialReadOffset], data_read_1[i]);
-
-  // Read 0 bytes.
-  bytes_read = file.Read(0, data_read_1, 0);
-  EXPECT_EQ(0, bytes_read);
-
-  // Read the entire file.
-  bytes_read = file.Read(0, data_read_1, kTestDataSize);
-  EXPECT_EQ(kTestDataSize, bytes_read);
-  for (int i = 0; i < bytes_read; i++)
-    EXPECT_EQ(data_to_write[i], data_read_1[i]);
-
-  // Read again, but using the trivial native wrapper.
-  bytes_read = file.ReadNoBestEffort(0, data_read_1, kTestDataSize);
-  EXPECT_LE(bytes_read, kTestDataSize);
-  for (int i = 0; i < bytes_read; i++)
-    EXPECT_EQ(data_to_write[i], data_read_1[i]);
-
-  // Write past the end of the file.
-  const int kOffsetBeyondEndOfFile = 10;
-  const int kPartialWriteLength = 2;
-  bytes_written = file.Write(kOffsetBeyondEndOfFile,
-                             data_to_write, kPartialWriteLength);
-  EXPECT_EQ(kPartialWriteLength, bytes_written);
-
-  // Make sure the file was extended.
-  int64_t file_size = 0;
-  EXPECT_TRUE(GetFileSize(file_path, &file_size));
-  EXPECT_EQ(kOffsetBeyondEndOfFile + kPartialWriteLength, file_size);
-
-  // Make sure the file was zero-padded.
-  char data_read_2[32];
-  bytes_read = file.Read(0, data_read_2, static_cast<int>(file_size));
-  EXPECT_EQ(file_size, bytes_read);
-  for (int i = 0; i < kTestDataSize; i++)
-    EXPECT_EQ(data_to_write[i], data_read_2[i]);
-  for (int i = kTestDataSize; i < kOffsetBeyondEndOfFile; i++)
-    EXPECT_EQ(0, data_read_2[i]);
-  for (int i = kOffsetBeyondEndOfFile; i < file_size; i++)
-    EXPECT_EQ(data_to_write[i - kOffsetBeyondEndOfFile], data_read_2[i]);
-}
-
-TEST(FileTest, GetLastFileError) {
-#if defined(OS_WIN)
-  ::SetLastError(ERROR_ACCESS_DENIED);
-#else
-  errno = EACCES;
-#endif
-  EXPECT_EQ(File::FILE_ERROR_ACCESS_DENIED, File::GetLastFileError());
-
-  base::ScopedTempDir temp_dir;
-  EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  FilePath nonexistent_path(temp_dir.GetPath().AppendASCII("nonexistent"));
-  File file(nonexistent_path, File::FLAG_OPEN | File::FLAG_READ);
-  File::Error last_error = File::GetLastFileError();
-  EXPECT_FALSE(file.IsValid());
-  EXPECT_EQ(File::FILE_ERROR_NOT_FOUND, file.error_details());
-  EXPECT_EQ(File::FILE_ERROR_NOT_FOUND, last_error);
-}
-
-TEST(FileTest, Append) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("append_file");
-  File file(file_path, base::File::FLAG_CREATE | base::File::FLAG_APPEND);
-  ASSERT_TRUE(file.IsValid());
-
-  char data_to_write[] = "test";
-  const int kTestDataSize = 4;
-
-  // Write 0 bytes to the file.
-  int bytes_written = file.Write(0, data_to_write, 0);
-  EXPECT_EQ(0, bytes_written);
-
-  // Write 0 bytes, with buf=nullptr.
-  bytes_written = file.Write(0, nullptr, 0);
-  EXPECT_EQ(0, bytes_written);
-
-  // Write "test" to the file.
-  bytes_written = file.Write(0, data_to_write, kTestDataSize);
-  EXPECT_EQ(kTestDataSize, bytes_written);
-
-  file.Close();
-  File file2(file_path,
-             base::File::FLAG_OPEN | base::File::FLAG_READ |
-                 base::File::FLAG_APPEND);
-  ASSERT_TRUE(file2.IsValid());
-
-  // Test passing the file around.
-  file = std::move(file2);
-  EXPECT_FALSE(file2.IsValid());
-  ASSERT_TRUE(file.IsValid());
-
-  char append_data_to_write[] = "78";
-  const int kAppendDataSize = 2;
-
-  // Append "78" to the file.
-  bytes_written = file.Write(0, append_data_to_write, kAppendDataSize);
-  EXPECT_EQ(kAppendDataSize, bytes_written);
-
-  // Read the entire file.
-  char data_read_1[32];
-  int bytes_read = file.Read(0, data_read_1,
-                             kTestDataSize + kAppendDataSize);
-  EXPECT_EQ(kTestDataSize + kAppendDataSize, bytes_read);
-  for (int i = 0; i < kTestDataSize; i++)
-    EXPECT_EQ(data_to_write[i], data_read_1[i]);
-  for (int i = 0; i < kAppendDataSize; i++)
-    EXPECT_EQ(append_data_to_write[i], data_read_1[kTestDataSize + i]);
-}
-
-
-TEST(FileTest, Length) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("truncate_file");
-  File file(file_path,
-            base::File::FLAG_CREATE | base::File::FLAG_READ |
-                base::File::FLAG_WRITE);
-  ASSERT_TRUE(file.IsValid());
-  EXPECT_EQ(0, file.GetLength());
-
-  // Write "test" to the file.
-  char data_to_write[] = "test";
-  int kTestDataSize = 4;
-  int bytes_written = file.Write(0, data_to_write, kTestDataSize);
-  EXPECT_EQ(kTestDataSize, bytes_written);
-
-  // Extend the file.
-  const int kExtendedFileLength = 10;
-  int64_t file_size = 0;
-  EXPECT_TRUE(file.SetLength(kExtendedFileLength));
-  EXPECT_EQ(kExtendedFileLength, file.GetLength());
-  EXPECT_TRUE(GetFileSize(file_path, &file_size));
-  EXPECT_EQ(kExtendedFileLength, file_size);
-
-  // Make sure the file was zero-padded.
-  char data_read[32];
-  int bytes_read = file.Read(0, data_read, static_cast<int>(file_size));
-  EXPECT_EQ(file_size, bytes_read);
-  for (int i = 0; i < kTestDataSize; i++)
-    EXPECT_EQ(data_to_write[i], data_read[i]);
-  for (int i = kTestDataSize; i < file_size; i++)
-    EXPECT_EQ(0, data_read[i]);
-
-  // Truncate the file.
-  const int kTruncatedFileLength = 2;
-  EXPECT_TRUE(file.SetLength(kTruncatedFileLength));
-  EXPECT_EQ(kTruncatedFileLength, file.GetLength());
-  EXPECT_TRUE(GetFileSize(file_path, &file_size));
-  EXPECT_EQ(kTruncatedFileLength, file_size);
-
-  // Make sure the file was truncated.
-  bytes_read = file.Read(0, data_read, kTestDataSize);
-  EXPECT_EQ(file_size, bytes_read);
-  for (int i = 0; i < file_size; i++)
-    EXPECT_EQ(data_to_write[i], data_read[i]);
-
-  // Close the file and reopen with base::File::FLAG_CREATE_ALWAYS, and make
-  // sure the file is empty (old file was overridden).
-  file.Close();
-  file.Initialize(file_path,
-                  base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-  EXPECT_EQ(0, file.GetLength());
-}
-
-// Flakily fails: http://crbug.com/86494
-#if defined(OS_ANDROID)
-TEST(FileTest, TouchGetInfo) {
-#else
-TEST(FileTest, DISABLED_TouchGetInfo) {
-#endif
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  File file(temp_dir.GetPath().AppendASCII("touch_get_info_file"),
-            base::File::FLAG_CREATE | base::File::FLAG_WRITE |
-                base::File::FLAG_WRITE_ATTRIBUTES);
-  ASSERT_TRUE(file.IsValid());
-
-  // Get info for a newly created file.
-  base::File::Info info;
-  EXPECT_TRUE(file.GetInfo(&info));
-
-  // Add 2 seconds to account for possible rounding errors on
-  // filesystems that use a 1s or 2s timestamp granularity.
-  base::Time now = base::Time::Now() + base::TimeDelta::FromSeconds(2);
-  EXPECT_EQ(0, info.size);
-  EXPECT_FALSE(info.is_directory);
-  EXPECT_FALSE(info.is_symbolic_link);
-  EXPECT_LE(info.last_accessed.ToInternalValue(), now.ToInternalValue());
-  EXPECT_LE(info.last_modified.ToInternalValue(), now.ToInternalValue());
-  EXPECT_LE(info.creation_time.ToInternalValue(), now.ToInternalValue());
-  base::Time creation_time = info.creation_time;
-
-  // Write "test" to the file.
-  char data[] = "test";
-  const int kTestDataSize = 4;
-  int bytes_written = file.Write(0, data, kTestDataSize);
-  EXPECT_EQ(kTestDataSize, bytes_written);
-
-  // Change the last_accessed and last_modified dates.
-  // It's best to add values that are multiples of 2 (in seconds)
-  // to the current last_accessed and last_modified times, because
-  // FATxx uses a 2s timestamp granularity.
-  base::Time new_last_accessed =
-      info.last_accessed + base::TimeDelta::FromSeconds(234);
-  base::Time new_last_modified =
-      info.last_modified + base::TimeDelta::FromMinutes(567);
-
-  EXPECT_TRUE(file.SetTimes(new_last_accessed, new_last_modified));
-
-  // Make sure the file info was updated accordingly.
-  EXPECT_TRUE(file.GetInfo(&info));
-  EXPECT_EQ(info.size, kTestDataSize);
-  EXPECT_FALSE(info.is_directory);
-  EXPECT_FALSE(info.is_symbolic_link);
-
-  // ext2/ext3 and HPS/HPS+ seem to have a timestamp granularity of 1s.
-#if defined(OS_POSIX)
-  EXPECT_EQ(info.last_accessed.ToTimeVal().tv_sec,
-            new_last_accessed.ToTimeVal().tv_sec);
-  EXPECT_EQ(info.last_modified.ToTimeVal().tv_sec,
-            new_last_modified.ToTimeVal().tv_sec);
-#else
-  EXPECT_EQ(info.last_accessed.ToInternalValue(),
-            new_last_accessed.ToInternalValue());
-  EXPECT_EQ(info.last_modified.ToInternalValue(),
-            new_last_modified.ToInternalValue());
-#endif
-
-  EXPECT_EQ(info.creation_time.ToInternalValue(),
-            creation_time.ToInternalValue());
-}
-
-TEST(FileTest, ReadAtCurrentPosition) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path =
-      temp_dir.GetPath().AppendASCII("read_at_current_position");
-  File file(file_path,
-            base::File::FLAG_CREATE | base::File::FLAG_READ |
-                base::File::FLAG_WRITE);
-  EXPECT_TRUE(file.IsValid());
-
-  const char kData[] = "test";
-  const int kDataSize = sizeof(kData) - 1;
-  EXPECT_EQ(kDataSize, file.Write(0, kData, kDataSize));
-
-  EXPECT_EQ(0, file.Seek(base::File::FROM_BEGIN, 0));
-
-  char buffer[kDataSize];
-  int first_chunk_size = kDataSize / 2;
-  EXPECT_EQ(first_chunk_size, file.ReadAtCurrentPos(buffer, first_chunk_size));
-  EXPECT_EQ(kDataSize - first_chunk_size,
-            file.ReadAtCurrentPos(buffer + first_chunk_size,
-                                  kDataSize - first_chunk_size));
-  EXPECT_EQ(std::string(buffer, buffer + kDataSize), std::string(kData));
-}
-
-TEST(FileTest, WriteAtCurrentPosition) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path =
-      temp_dir.GetPath().AppendASCII("write_at_current_position");
-  File file(file_path,
-            base::File::FLAG_CREATE | base::File::FLAG_READ |
-                base::File::FLAG_WRITE);
-  EXPECT_TRUE(file.IsValid());
-
-  const char kData[] = "test";
-  const int kDataSize = sizeof(kData) - 1;
-
-  int first_chunk_size = kDataSize / 2;
-  EXPECT_EQ(first_chunk_size, file.WriteAtCurrentPos(kData, first_chunk_size));
-  EXPECT_EQ(kDataSize - first_chunk_size,
-            file.WriteAtCurrentPos(kData + first_chunk_size,
-                                   kDataSize - first_chunk_size));
-
-  char buffer[kDataSize];
-  EXPECT_EQ(kDataSize, file.Read(0, buffer, kDataSize));
-  EXPECT_EQ(std::string(buffer, buffer + kDataSize), std::string(kData));
-}
-
-TEST(FileTest, Seek) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("seek_file");
-  File file(file_path,
-            base::File::FLAG_CREATE | base::File::FLAG_READ |
-                base::File::FLAG_WRITE);
-  ASSERT_TRUE(file.IsValid());
-
-  const int64_t kOffset = 10;
-  EXPECT_EQ(kOffset, file.Seek(base::File::FROM_BEGIN, kOffset));
-  EXPECT_EQ(2 * kOffset, file.Seek(base::File::FROM_CURRENT, kOffset));
-  EXPECT_EQ(kOffset, file.Seek(base::File::FROM_CURRENT, -kOffset));
-  EXPECT_TRUE(file.SetLength(kOffset * 2));
-  EXPECT_EQ(kOffset, file.Seek(base::File::FROM_END, -kOffset));
-}
-
-TEST(FileTest, Duplicate) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("file");
-  File file(file_path,(base::File::FLAG_CREATE |
-                       base::File::FLAG_READ |
-                       base::File::FLAG_WRITE));
-  ASSERT_TRUE(file.IsValid());
-
-  File file2(file.Duplicate());
-  ASSERT_TRUE(file2.IsValid());
-
-  // Write through one handle, close it, read through the other.
-  static const char kData[] = "now is a good time.";
-  static const int kDataLen = sizeof(kData) - 1;
-
-  ASSERT_EQ(0, file.Seek(base::File::FROM_CURRENT, 0));
-  ASSERT_EQ(0, file2.Seek(base::File::FROM_CURRENT, 0));
-  ASSERT_EQ(kDataLen, file.WriteAtCurrentPos(kData, kDataLen));
-  ASSERT_EQ(kDataLen, file.Seek(base::File::FROM_CURRENT, 0));
-  ASSERT_EQ(kDataLen, file2.Seek(base::File::FROM_CURRENT, 0));
-  file.Close();
-  char buf[kDataLen];
-  ASSERT_EQ(kDataLen, file2.Read(0, &buf[0], kDataLen));
-  ASSERT_EQ(std::string(kData, kDataLen), std::string(&buf[0], kDataLen));
-}
-
-TEST(FileTest, DuplicateDeleteOnClose) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("file");
-  File file(file_path,(base::File::FLAG_CREATE |
-                       base::File::FLAG_READ |
-                       base::File::FLAG_WRITE |
-                       base::File::FLAG_DELETE_ON_CLOSE));
-  ASSERT_TRUE(file.IsValid());
-  File file2(file.Duplicate());
-  ASSERT_TRUE(file2.IsValid());
-  file.Close();
-  file2.Close();
-  ASSERT_FALSE(base::PathExists(file_path));
-}
-
-#if defined(OS_WIN)
-TEST(FileTest, GetInfoForDirectory) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath empty_dir =
-      temp_dir.GetPath().Append(FILE_PATH_LITERAL("gpfi_test"));
-  ASSERT_TRUE(CreateDirectory(empty_dir));
-
-  base::File dir(
-      ::CreateFile(empty_dir.value().c_str(),
-                   GENERIC_READ | GENERIC_WRITE,
-                   FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
-                   NULL,
-                   OPEN_EXISTING,
-                   FILE_FLAG_BACKUP_SEMANTICS,  // Needed to open a directory.
-                   NULL));
-  ASSERT_TRUE(dir.IsValid());
-
-  base::File::Info info;
-  EXPECT_TRUE(dir.GetInfo(&info));
-  EXPECT_TRUE(info.is_directory);
-  EXPECT_FALSE(info.is_symbolic_link);
-  EXPECT_EQ(0, info.size);
-}
-
-TEST(FileTest, DeleteNoop) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("file");
-
-  // Creating and closing a file with DELETE perms should do nothing special.
-  File file(file_path,
-            (base::File::FLAG_CREATE | base::File::FLAG_READ |
-             base::File::FLAG_WRITE | base::File::FLAG_CAN_DELETE_ON_CLOSE));
-  ASSERT_TRUE(file.IsValid());
-  file.Close();
-  ASSERT_TRUE(base::PathExists(file_path));
-}
-
-TEST(FileTest, Delete) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("file");
-
-  // Creating a file with DELETE and then marking for delete on close should
-  // delete it.
-  File file(file_path,
-            (base::File::FLAG_CREATE | base::File::FLAG_READ |
-             base::File::FLAG_WRITE | base::File::FLAG_CAN_DELETE_ON_CLOSE));
-  ASSERT_TRUE(file.IsValid());
-  ASSERT_TRUE(file.DeleteOnClose(true));
-  file.Close();
-  ASSERT_FALSE(base::PathExists(file_path));
-}
-
-TEST(FileTest, DeleteThenRevoke) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("file");
-
-  // Creating a file with DELETE, marking it for delete, then clearing delete on
-  // close should not delete it.
-  File file(file_path,
-            (base::File::FLAG_CREATE | base::File::FLAG_READ |
-             base::File::FLAG_WRITE | base::File::FLAG_CAN_DELETE_ON_CLOSE));
-  ASSERT_TRUE(file.IsValid());
-  ASSERT_TRUE(file.DeleteOnClose(true));
-  ASSERT_TRUE(file.DeleteOnClose(false));
-  file.Close();
-  ASSERT_TRUE(base::PathExists(file_path));
-}
-
-TEST(FileTest, IrrevokableDeleteOnClose) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("file");
-
-  // DELETE_ON_CLOSE cannot be revoked by this opener.
-  File file(
-      file_path,
-      (base::File::FLAG_CREATE | base::File::FLAG_READ |
-       base::File::FLAG_WRITE | base::File::FLAG_DELETE_ON_CLOSE |
-       base::File::FLAG_SHARE_DELETE | base::File::FLAG_CAN_DELETE_ON_CLOSE));
-  ASSERT_TRUE(file.IsValid());
-  // https://msdn.microsoft.com/library/windows/desktop/aa364221.aspx says that
-  // setting the dispositon has no effect if the handle was opened with
-  // FLAG_DELETE_ON_CLOSE. Do not make the test's success dependent on whether
-  // or not SetFileInformationByHandle indicates success or failure. (It happens
-  // to indicate success on Windows 10.)
-  file.DeleteOnClose(false);
-  file.Close();
-  ASSERT_FALSE(base::PathExists(file_path));
-}
-
-TEST(FileTest, IrrevokableDeleteOnCloseOther) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("file");
-
-  // DELETE_ON_CLOSE cannot be revoked by another opener.
-  File file(
-      file_path,
-      (base::File::FLAG_CREATE | base::File::FLAG_READ |
-       base::File::FLAG_WRITE | base::File::FLAG_DELETE_ON_CLOSE |
-       base::File::FLAG_SHARE_DELETE | base::File::FLAG_CAN_DELETE_ON_CLOSE));
-  ASSERT_TRUE(file.IsValid());
-
-  File file2(
-      file_path,
-      (base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE |
-       base::File::FLAG_SHARE_DELETE | base::File::FLAG_CAN_DELETE_ON_CLOSE));
-  ASSERT_TRUE(file2.IsValid());
-
-  file2.DeleteOnClose(false);
-  file2.Close();
-  ASSERT_TRUE(base::PathExists(file_path));
-  file.Close();
-  ASSERT_FALSE(base::PathExists(file_path));
-}
-
-TEST(FileTest, DeleteWithoutPermission) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("file");
-
-  // It should not be possible to mark a file for deletion when it was not
-  // created/opened with DELETE.
-  File file(file_path, (base::File::FLAG_CREATE | base::File::FLAG_READ |
-                        base::File::FLAG_WRITE));
-  ASSERT_TRUE(file.IsValid());
-  ASSERT_FALSE(file.DeleteOnClose(true));
-  file.Close();
-  ASSERT_TRUE(base::PathExists(file_path));
-}
-
-TEST(FileTest, UnsharedDeleteOnClose) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("file");
-
-  // Opening with DELETE_ON_CLOSE when a previous opener hasn't enabled sharing
-  // will fail.
-  File file(file_path, (base::File::FLAG_CREATE | base::File::FLAG_READ |
-                        base::File::FLAG_WRITE));
-  ASSERT_TRUE(file.IsValid());
-  File file2(
-      file_path,
-      (base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE |
-       base::File::FLAG_DELETE_ON_CLOSE | base::File::FLAG_SHARE_DELETE));
-  ASSERT_FALSE(file2.IsValid());
-
-  file.Close();
-  ASSERT_TRUE(base::PathExists(file_path));
-}
-
-TEST(FileTest, NoDeleteOnCloseWithMappedFile) {
-  base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("file");
-
-  // Mapping a file into memory blocks DeleteOnClose.
-  File file(file_path,
-            (base::File::FLAG_CREATE | base::File::FLAG_READ |
-             base::File::FLAG_WRITE | base::File::FLAG_CAN_DELETE_ON_CLOSE));
-  ASSERT_TRUE(file.IsValid());
-  ASSERT_EQ(5, file.WriteAtCurrentPos("12345", 5));
-
-  {
-    base::MemoryMappedFile mapping;
-    ASSERT_TRUE(mapping.Initialize(file.Duplicate()));
-    ASSERT_EQ(5U, mapping.length());
-
-    EXPECT_FALSE(file.DeleteOnClose(true));
-  }
-
-  file.Close();
-  ASSERT_TRUE(base::PathExists(file_path));
-}
-#endif  // defined(OS_WIN)
diff --git a/base/files/file_util_unittest.cc b/base/files/file_util_unittest.cc
deleted file mode 100644
index b4de085..0000000
--- a/base/files/file_util_unittest.cc
+++ /dev/null
@@ -1,3683 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <fstream>
-#include <initializer_list>
-#include <memory>
-#include <set>
-#include <utility>
-#include <vector>
-
-#include "base/base_paths.h"
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback_helpers.h"
-#include "base/command_line.h"
-#include "base/environment.h"
-#include "base/files/file.h"
-#include "base/files/file_enumerator.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/macros.h"
-#include "base/path_service.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/scoped_environment_variable_override.h"
-#include "base/test/test_file_util.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-#include "testing/platform_test.h"
-
-#if defined(OS_WIN)
-#include <shellapi.h>
-#include <shlobj.h>
-#include <tchar.h>
-#include <windows.h>
-#include <winioctl.h>
-#include "base/strings/string_number_conversions.h"
-#include "base/win/scoped_handle.h"
-#include "base/win/win_util.h"
-#endif
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-#if defined(OS_LINUX)
-#include <linux/fs.h>
-#endif
-
-#if defined(OS_ANDROID)
-#include "base/android/content_uri_utils.h"
-#endif
-
-// This macro helps avoid wrapped lines in the test structs.
-#define FPL(x) FILE_PATH_LITERAL(x)
-
-namespace base {
-
-namespace {
-
-const size_t kLargeFileSize = (1 << 16) + 3;
-
-// To test that NormalizeFilePath() deals with NTFS reparse points correctly,
-// we need functions to create and delete reparse points.
-#if defined(OS_WIN)
-typedef struct _REPARSE_DATA_BUFFER {
-  ULONG  ReparseTag;
-  USHORT  ReparseDataLength;
-  USHORT  Reserved;
-  union {
-    struct {
-      USHORT SubstituteNameOffset;
-      USHORT SubstituteNameLength;
-      USHORT PrintNameOffset;
-      USHORT PrintNameLength;
-      ULONG Flags;
-      WCHAR PathBuffer[1];
-    } SymbolicLinkReparseBuffer;
-    struct {
-      USHORT SubstituteNameOffset;
-      USHORT SubstituteNameLength;
-      USHORT PrintNameOffset;
-      USHORT PrintNameLength;
-      WCHAR PathBuffer[1];
-    } MountPointReparseBuffer;
-    struct {
-      UCHAR DataBuffer[1];
-    } GenericReparseBuffer;
-  };
-} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
-
-// Sets a reparse point. |source| will now point to |target|. Returns true if
-// the call succeeds, false otherwise.
-bool SetReparsePoint(HANDLE source, const FilePath& target_path) {
-  std::wstring kPathPrefix = L"\\??\\";
-  std::wstring target_str;
-  // The juction will not work if the target path does not start with \??\ .
-  if (kPathPrefix != target_path.value().substr(0, kPathPrefix.size()))
-    target_str += kPathPrefix;
-  target_str += target_path.value();
-  const wchar_t* target = target_str.c_str();
-  USHORT size_target = static_cast<USHORT>(wcslen(target)) * sizeof(target[0]);
-  char buffer[2000] = {0};
-  DWORD returned;
-
-  REPARSE_DATA_BUFFER* data = reinterpret_cast<REPARSE_DATA_BUFFER*>(buffer);
-
-  data->ReparseTag = 0xa0000003;
-  memcpy(data->MountPointReparseBuffer.PathBuffer, target, size_target + 2);
-
-  data->MountPointReparseBuffer.SubstituteNameLength = size_target;
-  data->MountPointReparseBuffer.PrintNameOffset = size_target + 2;
-  data->ReparseDataLength = size_target + 4 + 8;
-
-  int data_size = data->ReparseDataLength + 8;
-
-  if (!DeviceIoControl(source, FSCTL_SET_REPARSE_POINT, &buffer, data_size,
-                       NULL, 0, &returned, NULL)) {
-    return false;
-  }
-  return true;
-}
-
-// Delete the reparse point referenced by |source|. Returns true if the call
-// succeeds, false otherwise.
-bool DeleteReparsePoint(HANDLE source) {
-  DWORD returned;
-  REPARSE_DATA_BUFFER data = {0};
-  data.ReparseTag = 0xa0000003;
-  if (!DeviceIoControl(source, FSCTL_DELETE_REPARSE_POINT, &data, 8, NULL, 0,
-                       &returned, NULL)) {
-    return false;
-  }
-  return true;
-}
-
-// Manages a reparse point for a test.
-class ReparsePoint {
- public:
-  // Creates a reparse point from |source| (an empty directory) to |target|.
-  ReparsePoint(const FilePath& source, const FilePath& target) {
-    dir_.Set(
-      ::CreateFile(source.value().c_str(),
-                   GENERIC_READ | GENERIC_WRITE,
-                   FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
-                   NULL,
-                   OPEN_EXISTING,
-                   FILE_FLAG_BACKUP_SEMANTICS,  // Needed to open a directory.
-                   NULL));
-    created_ = dir_.IsValid() && SetReparsePoint(dir_.Get(), target);
-  }
-
-  ~ReparsePoint() {
-    if (created_)
-      DeleteReparsePoint(dir_.Get());
-  }
-
-  bool IsValid() { return created_; }
-
- private:
-  win::ScopedHandle dir_;
-  bool created_;
-  DISALLOW_COPY_AND_ASSIGN(ReparsePoint);
-};
-
-#endif
-
-// Fuchsia doesn't support file permissions.
-#if !defined(OS_FUCHSIA)
-#if defined(OS_POSIX)
-// Provide a simple way to change the permissions bits on |path| in tests.
-// ASSERT failures will return, but not stop the test.  Caller should wrap
-// calls to this function in ASSERT_NO_FATAL_FAILURE().
-void ChangePosixFilePermissions(const FilePath& path,
-                                int mode_bits_to_set,
-                                int mode_bits_to_clear) {
-  ASSERT_FALSE(mode_bits_to_set & mode_bits_to_clear)
-      << "Can't set and clear the same bits.";
-
-  int mode = 0;
-  ASSERT_TRUE(GetPosixFilePermissions(path, &mode));
-  mode |= mode_bits_to_set;
-  mode &= ~mode_bits_to_clear;
-  ASSERT_TRUE(SetPosixFilePermissions(path, mode));
-}
-#endif  // defined(OS_POSIX)
-
-// Sets the source file to read-only.
-void SetReadOnly(const FilePath& path, bool read_only) {
-#if defined(OS_WIN)
-  // On Windows, it involves setting/removing the 'readonly' bit.
-  DWORD attrs = GetFileAttributes(path.value().c_str());
-  ASSERT_NE(INVALID_FILE_ATTRIBUTES, attrs);
-  ASSERT_TRUE(SetFileAttributes(
-      path.value().c_str(), read_only ? (attrs | FILE_ATTRIBUTE_READONLY)
-                                      : (attrs & ~FILE_ATTRIBUTE_READONLY)));
-
-  DWORD expected =
-      read_only
-          ? ((attrs & (FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_DIRECTORY)) |
-             FILE_ATTRIBUTE_READONLY)
-          : (attrs & (FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_DIRECTORY));
-
-  // Ignore FILE_ATTRIBUTE_NOT_CONTENT_INDEXED if present.
-  attrs = GetFileAttributes(path.value().c_str()) &
-          ~FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
-  ASSERT_EQ(expected, attrs);
-#else
-  // On all other platforms, it involves removing/setting the write bit.
-  mode_t mode = read_only ? S_IRUSR : (S_IRUSR | S_IWUSR);
-  EXPECT_TRUE(SetPosixFilePermissions(
-      path, DirectoryExists(path) ? (mode | S_IXUSR) : mode));
-#endif  // defined(OS_WIN)
-}
-
-bool IsReadOnly(const FilePath& path) {
-#if defined(OS_WIN)
-  DWORD attrs = GetFileAttributes(path.value().c_str());
-  EXPECT_NE(INVALID_FILE_ATTRIBUTES, attrs);
-  return attrs & FILE_ATTRIBUTE_READONLY;
-#else
-  int mode = 0;
-  EXPECT_TRUE(GetPosixFilePermissions(path, &mode));
-  return !(mode & S_IWUSR);
-#endif  // defined(OS_WIN)
-}
-
-#endif  // defined(OS_FUCHSIA)
-
-const wchar_t bogus_content[] = L"I'm cannon fodder.";
-
-const int FILES_AND_DIRECTORIES =
-    FileEnumerator::FILES | FileEnumerator::DIRECTORIES;
-
-// file_util winds up using autoreleased objects on the Mac, so this needs
-// to be a PlatformTest
-class FileUtilTest : public PlatformTest {
- protected:
-  void SetUp() override {
-    PlatformTest::SetUp();
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-  }
-
-  ScopedTempDir temp_dir_;
-};
-
-// Collects all the results from the given file enumerator, and provides an
-// interface to query whether a given file is present.
-class FindResultCollector {
- public:
-  explicit FindResultCollector(FileEnumerator* enumerator) {
-    FilePath cur_file;
-    while (!(cur_file = enumerator->Next()).value().empty()) {
-      FilePath::StringType path = cur_file.value();
-      // The file should not be returned twice.
-      EXPECT_TRUE(files_.end() == files_.find(path))
-          << "Same file returned twice";
-
-      // Save for later.
-      files_.insert(path);
-    }
-  }
-
-  // Returns true if the enumerator found the file.
-  bool HasFile(const FilePath& file) const {
-    return files_.find(file.value()) != files_.end();
-  }
-
-  int size() {
-    return static_cast<int>(files_.size());
-  }
-
- private:
-  std::set<FilePath::StringType> files_;
-};
-
-// Simple function to dump some text into a new file.
-void CreateTextFile(const FilePath& filename,
-                    const std::wstring& contents) {
-  std::wofstream file;
-  file.open(filename.value().c_str());
-  ASSERT_TRUE(file.is_open());
-  file << contents;
-  file.close();
-}
-
-// Simple function to take out some text from a file.
-std::wstring ReadTextFile(const FilePath& filename) {
-  wchar_t contents[64];
-  std::wifstream file;
-  file.open(filename.value().c_str());
-  EXPECT_TRUE(file.is_open());
-  file.getline(contents, arraysize(contents));
-  file.close();
-  return std::wstring(contents);
-}
-
-// Sets |is_inheritable| to indicate whether or not |stream| is set up to be
-// inerhited into child processes (i.e., HANDLE_FLAG_INHERIT is set on the
-// underlying handle on Windows, or FD_CLOEXEC is not set on the underlying file
-// descriptor on POSIX). Calls to this function must be wrapped with
-// ASSERT_NO_FATAL_FAILURE to properly abort tests in case of fatal failure.
-void GetIsInheritable(FILE* stream, bool* is_inheritable) {
-#if defined(OS_WIN)
-  HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(stream)));
-  ASSERT_NE(INVALID_HANDLE_VALUE, handle);
-
-  DWORD info = 0;
-  ASSERT_EQ(TRUE, ::GetHandleInformation(handle, &info));
-  *is_inheritable = ((info & HANDLE_FLAG_INHERIT) != 0);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  int fd = fileno(stream);
-  ASSERT_NE(-1, fd);
-  int flags = fcntl(fd, F_GETFD, 0);
-  ASSERT_NE(-1, flags);
-  *is_inheritable = ((flags & FD_CLOEXEC) == 0);
-#else
-#error Not implemented
-#endif
-}
-
-TEST_F(FileUtilTest, FileAndDirectorySize) {
-  // Create three files of 20, 30 and 3 chars (utf8). ComputeDirectorySize
-  // should return 53 bytes.
-  FilePath file_01 = temp_dir_.GetPath().Append(FPL("The file 01.txt"));
-  CreateTextFile(file_01, L"12345678901234567890");
-  int64_t size_f1 = 0;
-  ASSERT_TRUE(GetFileSize(file_01, &size_f1));
-  EXPECT_EQ(20ll, size_f1);
-
-  FilePath subdir_path = temp_dir_.GetPath().Append(FPL("Level2"));
-  CreateDirectory(subdir_path);
-
-  FilePath file_02 = subdir_path.Append(FPL("The file 02.txt"));
-  CreateTextFile(file_02, L"123456789012345678901234567890");
-  int64_t size_f2 = 0;
-  ASSERT_TRUE(GetFileSize(file_02, &size_f2));
-  EXPECT_EQ(30ll, size_f2);
-
-  FilePath subsubdir_path = subdir_path.Append(FPL("Level3"));
-  CreateDirectory(subsubdir_path);
-
-  FilePath file_03 = subsubdir_path.Append(FPL("The file 03.txt"));
-  CreateTextFile(file_03, L"123");
-
-  int64_t computed_size = ComputeDirectorySize(temp_dir_.GetPath());
-  EXPECT_EQ(size_f1 + size_f2 + 3, computed_size);
-}
-
-TEST_F(FileUtilTest, NormalizeFilePathBasic) {
-  // Create a directory under the test dir.  Because we create it,
-  // we know it is not a link.
-  FilePath file_a_path = temp_dir_.GetPath().Append(FPL("file_a"));
-  FilePath dir_path = temp_dir_.GetPath().Append(FPL("dir"));
-  FilePath file_b_path = dir_path.Append(FPL("file_b"));
-  CreateDirectory(dir_path);
-
-  FilePath normalized_file_a_path, normalized_file_b_path;
-  ASSERT_FALSE(PathExists(file_a_path));
-  ASSERT_FALSE(NormalizeFilePath(file_a_path, &normalized_file_a_path))
-    << "NormalizeFilePath() should fail on nonexistent paths.";
-
-  CreateTextFile(file_a_path, bogus_content);
-  ASSERT_TRUE(PathExists(file_a_path));
-  ASSERT_TRUE(NormalizeFilePath(file_a_path, &normalized_file_a_path));
-
-  CreateTextFile(file_b_path, bogus_content);
-  ASSERT_TRUE(PathExists(file_b_path));
-  ASSERT_TRUE(NormalizeFilePath(file_b_path, &normalized_file_b_path));
-
-  // Beacuse this test created |dir_path|, we know it is not a link
-  // or junction.  So, the real path of the directory holding file a
-  // must be the parent of the path holding file b.
-  ASSERT_TRUE(normalized_file_a_path.DirName()
-      .IsParent(normalized_file_b_path.DirName()));
-}
-
-#if defined(OS_WIN)
-
-TEST_F(FileUtilTest, NormalizeFilePathReparsePoints) {
-  // Build the following directory structure:
-  //
-  // temp_dir
-  // |-> base_a
-  // |   |-> sub_a
-  // |       |-> file.txt
-  // |       |-> long_name___... (Very long name.)
-  // |           |-> sub_long
-  // |              |-> deep.txt
-  // |-> base_b
-  //     |-> to_sub_a (reparse point to temp_dir\base_a\sub_a)
-  //     |-> to_base_b (reparse point to temp_dir\base_b)
-  //     |-> to_sub_long (reparse point to temp_dir\sub_a\long_name_\sub_long)
-
-  FilePath base_a = temp_dir_.GetPath().Append(FPL("base_a"));
-#if defined(OS_WIN)
-  // TEMP can have a lower case drive letter.
-  string16 temp_base_a = base_a.value();
-  ASSERT_FALSE(temp_base_a.empty());
-  *temp_base_a.begin() = ToUpperASCII(*temp_base_a.begin());
-  base_a = FilePath(temp_base_a);
-#endif
-  ASSERT_TRUE(CreateDirectory(base_a));
-
-  FilePath sub_a = base_a.Append(FPL("sub_a"));
-  ASSERT_TRUE(CreateDirectory(sub_a));
-
-  FilePath file_txt = sub_a.Append(FPL("file.txt"));
-  CreateTextFile(file_txt, bogus_content);
-
-  // Want a directory whose name is long enough to make the path to the file
-  // inside just under MAX_PATH chars.  This will be used to test that when
-  // a junction expands to a path over MAX_PATH chars in length,
-  // NormalizeFilePath() fails without crashing.
-  FilePath sub_long_rel(FPL("sub_long"));
-  FilePath deep_txt(FPL("deep.txt"));
-
-  int target_length = MAX_PATH;
-  target_length -= (sub_a.value().length() + 1);  // +1 for the sepperator '\'.
-  target_length -= (sub_long_rel.Append(deep_txt).value().length() + 1);
-  // Without making the path a bit shorter, CreateDirectory() fails.
-  // the resulting path is still long enough to hit the failing case in
-  // NormalizePath().
-  const int kCreateDirLimit = 4;
-  target_length -= kCreateDirLimit;
-  FilePath::StringType long_name_str = FPL("long_name_");
-  long_name_str.resize(target_length, '_');
-
-  FilePath long_name = sub_a.Append(FilePath(long_name_str));
-  FilePath deep_file = long_name.Append(sub_long_rel).Append(deep_txt);
-  ASSERT_EQ(static_cast<size_t>(MAX_PATH - kCreateDirLimit),
-            deep_file.value().length());
-
-  FilePath sub_long = deep_file.DirName();
-  ASSERT_TRUE(CreateDirectory(sub_long));
-  CreateTextFile(deep_file, bogus_content);
-
-  FilePath base_b = temp_dir_.GetPath().Append(FPL("base_b"));
-  ASSERT_TRUE(CreateDirectory(base_b));
-
-  FilePath to_sub_a = base_b.Append(FPL("to_sub_a"));
-  ASSERT_TRUE(CreateDirectory(to_sub_a));
-  FilePath normalized_path;
-  {
-    ReparsePoint reparse_to_sub_a(to_sub_a, sub_a);
-    ASSERT_TRUE(reparse_to_sub_a.IsValid());
-
-    FilePath to_base_b = base_b.Append(FPL("to_base_b"));
-    ASSERT_TRUE(CreateDirectory(to_base_b));
-    ReparsePoint reparse_to_base_b(to_base_b, base_b);
-    ASSERT_TRUE(reparse_to_base_b.IsValid());
-
-    FilePath to_sub_long = base_b.Append(FPL("to_sub_long"));
-    ASSERT_TRUE(CreateDirectory(to_sub_long));
-    ReparsePoint reparse_to_sub_long(to_sub_long, sub_long);
-    ASSERT_TRUE(reparse_to_sub_long.IsValid());
-
-    // Normalize a junction free path: base_a\sub_a\file.txt .
-    ASSERT_TRUE(NormalizeFilePath(file_txt, &normalized_path));
-    ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
-
-    // Check that the path base_b\to_sub_a\file.txt can be normalized to exclude
-    // the junction to_sub_a.
-    ASSERT_TRUE(NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
-                                             &normalized_path));
-    ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
-
-    // Check that the path base_b\to_base_b\to_base_b\to_sub_a\file.txt can be
-    // normalized to exclude junctions to_base_b and to_sub_a .
-    ASSERT_TRUE(NormalizeFilePath(base_b.Append(FPL("to_base_b"))
-                                                   .Append(FPL("to_base_b"))
-                                                   .Append(FPL("to_sub_a"))
-                                                   .Append(FPL("file.txt")),
-                                             &normalized_path));
-    ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
-
-    // A long enough path will cause NormalizeFilePath() to fail.  Make a long
-    // path using to_base_b many times, and check that paths long enough to fail
-    // do not cause a crash.
-    FilePath long_path = base_b;
-    const int kLengthLimit = MAX_PATH + 200;
-    while (long_path.value().length() <= kLengthLimit) {
-      long_path = long_path.Append(FPL("to_base_b"));
-    }
-    long_path = long_path.Append(FPL("to_sub_a"))
-                         .Append(FPL("file.txt"));
-
-    ASSERT_FALSE(NormalizeFilePath(long_path, &normalized_path));
-
-    // Normalizing the junction to deep.txt should fail, because the expanded
-    // path to deep.txt is longer than MAX_PATH.
-    ASSERT_FALSE(NormalizeFilePath(to_sub_long.Append(deep_txt),
-                                              &normalized_path));
-
-    // Delete the reparse points, and see that NormalizeFilePath() fails
-    // to traverse them.
-  }
-
-  ASSERT_FALSE(NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
-                                            &normalized_path));
-}
-
-TEST_F(FileUtilTest, DevicePathToDriveLetter) {
-  // Get a drive letter.
-  string16 real_drive_letter =
-      ToUpperASCII(temp_dir_.GetPath().value().substr(0, 2));
-  if (!isalpha(real_drive_letter[0]) || ':' != real_drive_letter[1]) {
-    LOG(ERROR) << "Can't get a drive letter to test with.";
-    return;
-  }
-
-  // Get the NT style path to that drive.
-  wchar_t device_path[MAX_PATH] = {'\0'};
-  ASSERT_TRUE(
-      ::QueryDosDevice(real_drive_letter.c_str(), device_path, MAX_PATH));
-  FilePath actual_device_path(device_path);
-  FilePath win32_path;
-
-  // Run DevicePathToDriveLetterPath() on the NT style path we got from
-  // QueryDosDevice().  Expect the drive letter we started with.
-  ASSERT_TRUE(DevicePathToDriveLetterPath(actual_device_path, &win32_path));
-  ASSERT_EQ(real_drive_letter, win32_path.value());
-
-  // Add some directories to the path.  Expect those extra path componenets
-  // to be preserved.
-  FilePath kRelativePath(FPL("dir1\\dir2\\file.txt"));
-  ASSERT_TRUE(DevicePathToDriveLetterPath(
-      actual_device_path.Append(kRelativePath),
-      &win32_path));
-  EXPECT_EQ(FilePath(real_drive_letter + L"\\").Append(kRelativePath).value(),
-            win32_path.value());
-
-  // Deform the real path so that it is invalid by removing the last four
-  // characters.  The way windows names devices that are hard disks
-  // (\Device\HardDiskVolume${NUMBER}) guarantees that the string is longer
-  // than three characters.  The only way the truncated string could be a
-  // real drive is if more than 10^3 disks are mounted:
-  // \Device\HardDiskVolume10000 would be truncated to \Device\HardDiskVolume1
-  // Check that DevicePathToDriveLetterPath fails.
-  int path_length = actual_device_path.value().length();
-  int new_length = path_length - 4;
-  ASSERT_LT(0, new_length);
-  FilePath prefix_of_real_device_path(
-      actual_device_path.value().substr(0, new_length));
-  ASSERT_FALSE(DevicePathToDriveLetterPath(prefix_of_real_device_path,
-                                           &win32_path));
-
-  ASSERT_FALSE(DevicePathToDriveLetterPath(
-      prefix_of_real_device_path.Append(kRelativePath),
-      &win32_path));
-
-  // Deform the real path so that it is invalid by adding some characters. For
-  // example, if C: maps to \Device\HardDiskVolume8, then we simulate a
-  // request for the drive letter whose native path is
-  // \Device\HardDiskVolume812345 .  We assume such a device does not exist,
-  // because drives are numbered in order and mounting 112345 hard disks will
-  // never happen.
-  const FilePath::StringType kExtraChars = FPL("12345");
-
-  FilePath real_device_path_plus_numbers(
-      actual_device_path.value() + kExtraChars);
-
-  ASSERT_FALSE(DevicePathToDriveLetterPath(
-      real_device_path_plus_numbers,
-      &win32_path));
-
-  ASSERT_FALSE(DevicePathToDriveLetterPath(
-      real_device_path_plus_numbers.Append(kRelativePath),
-      &win32_path));
-}
-
-TEST_F(FileUtilTest, CreateTemporaryFileInDirLongPathTest) {
-  // Test that CreateTemporaryFileInDir() creates a path and returns a long path
-  // if it is available. This test requires that:
-  // - the filesystem at |temp_dir_| supports long filenames.
-  // - the account has FILE_LIST_DIRECTORY permission for all ancestor
-  //   directories of |temp_dir_|.
-  const FilePath::CharType kLongDirName[] = FPL("A long path");
-  const FilePath::CharType kTestSubDirName[] = FPL("test");
-  FilePath long_test_dir = temp_dir_.GetPath().Append(kLongDirName);
-  ASSERT_TRUE(CreateDirectory(long_test_dir));
-
-  // kLongDirName is not a 8.3 component. So GetShortName() should give us a
-  // different short name.
-  WCHAR path_buffer[MAX_PATH];
-  DWORD path_buffer_length = GetShortPathName(long_test_dir.value().c_str(),
-                                              path_buffer, MAX_PATH);
-  ASSERT_LT(path_buffer_length, DWORD(MAX_PATH));
-  ASSERT_NE(DWORD(0), path_buffer_length);
-  FilePath short_test_dir(path_buffer);
-  ASSERT_STRNE(kLongDirName, short_test_dir.BaseName().value().c_str());
-
-  FilePath temp_file;
-  ASSERT_TRUE(CreateTemporaryFileInDir(short_test_dir, &temp_file));
-  EXPECT_STREQ(kLongDirName, temp_file.DirName().BaseName().value().c_str());
-  EXPECT_TRUE(PathExists(temp_file));
-
-  // Create a subdirectory of |long_test_dir| and make |long_test_dir|
-  // unreadable. We should still be able to create a temp file in the
-  // subdirectory, but we won't be able to determine the long path for it. This
-  // mimics the environment that some users run where their user profiles reside
-  // in a location where the don't have full access to the higher level
-  // directories. (Note that this assumption is true for NTFS, but not for some
-  // network file systems. E.g. AFS).
-  FilePath access_test_dir = long_test_dir.Append(kTestSubDirName);
-  ASSERT_TRUE(CreateDirectory(access_test_dir));
-  FilePermissionRestorer long_test_dir_restorer(long_test_dir);
-  ASSERT_TRUE(MakeFileUnreadable(long_test_dir));
-
-  // Use the short form of the directory to create a temporary filename.
-  ASSERT_TRUE(CreateTemporaryFileInDir(
-      short_test_dir.Append(kTestSubDirName), &temp_file));
-  EXPECT_TRUE(PathExists(temp_file));
-  EXPECT_TRUE(short_test_dir.IsParent(temp_file.DirName()));
-
-  // Check that the long path can't be determined for |temp_file|.
-  path_buffer_length = GetLongPathName(temp_file.value().c_str(),
-                                       path_buffer, MAX_PATH);
-  EXPECT_EQ(DWORD(0), path_buffer_length);
-}
-
-#endif  // defined(OS_WIN)
-
-#if defined(OS_POSIX)
-
-TEST_F(FileUtilTest, CreateAndReadSymlinks) {
-  FilePath link_from = temp_dir_.GetPath().Append(FPL("from_file"));
-  FilePath link_to = temp_dir_.GetPath().Append(FPL("to_file"));
-  CreateTextFile(link_to, bogus_content);
-
-  ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
-    << "Failed to create file symlink.";
-
-  // If we created the link properly, we should be able to read the contents
-  // through it.
-  EXPECT_EQ(bogus_content, ReadTextFile(link_from));
-
-  FilePath result;
-  ASSERT_TRUE(ReadSymbolicLink(link_from, &result));
-  EXPECT_EQ(link_to.value(), result.value());
-
-  // Link to a directory.
-  link_from = temp_dir_.GetPath().Append(FPL("from_dir"));
-  link_to = temp_dir_.GetPath().Append(FPL("to_dir"));
-  ASSERT_TRUE(CreateDirectory(link_to));
-  ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
-    << "Failed to create directory symlink.";
-
-  // Test failures.
-  EXPECT_FALSE(CreateSymbolicLink(link_to, link_to));
-  EXPECT_FALSE(ReadSymbolicLink(link_to, &result));
-  FilePath missing = temp_dir_.GetPath().Append(FPL("missing"));
-  EXPECT_FALSE(ReadSymbolicLink(missing, &result));
-}
-
-// The following test of NormalizeFilePath() require that we create a symlink.
-// This can not be done on Windows before Vista.  On Vista, creating a symlink
-// requires privilege "SeCreateSymbolicLinkPrivilege".
-// TODO(skerner): Investigate the possibility of giving base_unittests the
-// privileges required to create a symlink.
-TEST_F(FileUtilTest, NormalizeFilePathSymlinks) {
-  // Link one file to another.
-  FilePath link_from = temp_dir_.GetPath().Append(FPL("from_file"));
-  FilePath link_to = temp_dir_.GetPath().Append(FPL("to_file"));
-  CreateTextFile(link_to, bogus_content);
-
-  ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
-    << "Failed to create file symlink.";
-
-  // Check that NormalizeFilePath sees the link.
-  FilePath normalized_path;
-  ASSERT_TRUE(NormalizeFilePath(link_from, &normalized_path));
-  EXPECT_NE(link_from, link_to);
-  EXPECT_EQ(link_to.BaseName().value(), normalized_path.BaseName().value());
-  EXPECT_EQ(link_to.BaseName().value(), normalized_path.BaseName().value());
-
-  // Link to a directory.
-  link_from = temp_dir_.GetPath().Append(FPL("from_dir"));
-  link_to = temp_dir_.GetPath().Append(FPL("to_dir"));
-  ASSERT_TRUE(CreateDirectory(link_to));
-  ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
-    << "Failed to create directory symlink.";
-
-  EXPECT_FALSE(NormalizeFilePath(link_from, &normalized_path))
-    << "Links to directories should return false.";
-
-  // Test that a loop in the links causes NormalizeFilePath() to return false.
-  link_from = temp_dir_.GetPath().Append(FPL("link_a"));
-  link_to = temp_dir_.GetPath().Append(FPL("link_b"));
-  ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
-    << "Failed to create loop symlink a.";
-  ASSERT_TRUE(CreateSymbolicLink(link_from, link_to))
-    << "Failed to create loop symlink b.";
-
-  // Infinite loop!
-  EXPECT_FALSE(NormalizeFilePath(link_from, &normalized_path));
-}
-
-TEST_F(FileUtilTest, DeleteSymlinkToExistentFile) {
-  // Create a file.
-  FilePath file_name = temp_dir_.GetPath().Append(FPL("Test DeleteFile 2.txt"));
-  CreateTextFile(file_name, bogus_content);
-  ASSERT_TRUE(PathExists(file_name));
-
-  // Create a symlink to the file.
-  FilePath file_link = temp_dir_.GetPath().Append("file_link_2");
-  ASSERT_TRUE(CreateSymbolicLink(file_name, file_link))
-      << "Failed to create symlink.";
-
-  // Delete the symbolic link.
-  EXPECT_TRUE(DeleteFile(file_link, false));
-
-  // Make sure original file is not deleted.
-  EXPECT_FALSE(PathExists(file_link));
-  EXPECT_TRUE(PathExists(file_name));
-}
-
-TEST_F(FileUtilTest, DeleteSymlinkToNonExistentFile) {
-  // Create a non-existent file path.
-  FilePath non_existent =
-      temp_dir_.GetPath().Append(FPL("Test DeleteFile 3.txt"));
-  EXPECT_FALSE(PathExists(non_existent));
-
-  // Create a symlink to the non-existent file.
-  FilePath file_link = temp_dir_.GetPath().Append("file_link_3");
-  ASSERT_TRUE(CreateSymbolicLink(non_existent, file_link))
-      << "Failed to create symlink.";
-
-  // Make sure the symbolic link is exist.
-  EXPECT_TRUE(IsLink(file_link));
-  EXPECT_FALSE(PathExists(file_link));
-
-  // Delete the symbolic link.
-  EXPECT_TRUE(DeleteFile(file_link, false));
-
-  // Make sure the symbolic link is deleted.
-  EXPECT_FALSE(IsLink(file_link));
-}
-
-TEST_F(FileUtilTest, CopyFileFollowsSymlinks) {
-  FilePath link_from = temp_dir_.GetPath().Append(FPL("from_file"));
-  FilePath link_to = temp_dir_.GetPath().Append(FPL("to_file"));
-  CreateTextFile(link_to, bogus_content);
-
-  ASSERT_TRUE(CreateSymbolicLink(link_to, link_from));
-
-  // If we created the link properly, we should be able to read the contents
-  // through it.
-  EXPECT_EQ(bogus_content, ReadTextFile(link_from));
-
-  FilePath result;
-  ASSERT_TRUE(ReadSymbolicLink(link_from, &result));
-  EXPECT_EQ(link_to.value(), result.value());
-
-  // Create another file and copy it to |link_from|.
-  FilePath src_file = temp_dir_.GetPath().Append(FPL("src.txt"));
-  const std::wstring file_contents(L"Gooooooooooooooooooooogle");
-  CreateTextFile(src_file, file_contents);
-  ASSERT_TRUE(CopyFile(src_file, link_from));
-
-  // Make sure |link_from| is still a symlink, and |link_to| has been written to
-  // by CopyFile().
-  EXPECT_TRUE(IsLink(link_from));
-  EXPECT_EQ(file_contents, ReadTextFile(link_from));
-  EXPECT_EQ(file_contents, ReadTextFile(link_to));
-}
-
-TEST_F(FileUtilTest, ChangeFilePermissionsAndRead) {
-  // Create a file path.
-  FilePath file_name =
-      temp_dir_.GetPath().Append(FPL("Test Readable File.txt"));
-  EXPECT_FALSE(PathExists(file_name));
-
-  static constexpr char kData[] = "hello";
-  static constexpr int kDataSize = sizeof(kData) - 1;
-  char buffer[kDataSize];
-
-  // Write file.
-  EXPECT_EQ(kDataSize, WriteFile(file_name, kData, kDataSize));
-  EXPECT_TRUE(PathExists(file_name));
-
-  // Make sure the file is readable.
-  int32_t mode = 0;
-  EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
-  EXPECT_TRUE(mode & FILE_PERMISSION_READ_BY_USER);
-
-  // Get rid of the read permission.
-  EXPECT_TRUE(SetPosixFilePermissions(file_name, 0u));
-  EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
-  EXPECT_FALSE(mode & FILE_PERMISSION_READ_BY_USER);
-  // Make sure the file can't be read.
-  EXPECT_EQ(-1, ReadFile(file_name, buffer, kDataSize));
-
-  // Give the read permission.
-  EXPECT_TRUE(SetPosixFilePermissions(file_name, FILE_PERMISSION_READ_BY_USER));
-  EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
-  EXPECT_TRUE(mode & FILE_PERMISSION_READ_BY_USER);
-  // Make sure the file can be read.
-  EXPECT_EQ(kDataSize, ReadFile(file_name, buffer, kDataSize));
-
-  // Delete the file.
-  EXPECT_TRUE(DeleteFile(file_name, false));
-  EXPECT_FALSE(PathExists(file_name));
-}
-
-TEST_F(FileUtilTest, ChangeFilePermissionsAndWrite) {
-  // Create a file path.
-  FilePath file_name =
-      temp_dir_.GetPath().Append(FPL("Test Readable File.txt"));
-  EXPECT_FALSE(PathExists(file_name));
-
-  const std::string kData("hello");
-
-  // Write file.
-  EXPECT_EQ(static_cast<int>(kData.length()),
-            WriteFile(file_name, kData.data(), kData.length()));
-  EXPECT_TRUE(PathExists(file_name));
-
-  // Make sure the file is writable.
-  int mode = 0;
-  EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
-  EXPECT_TRUE(mode & FILE_PERMISSION_WRITE_BY_USER);
-  EXPECT_TRUE(PathIsWritable(file_name));
-
-  // Get rid of the write permission.
-  EXPECT_TRUE(SetPosixFilePermissions(file_name, 0u));
-  EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
-  EXPECT_FALSE(mode & FILE_PERMISSION_WRITE_BY_USER);
-  // Make sure the file can't be write.
-  EXPECT_EQ(-1, WriteFile(file_name, kData.data(), kData.length()));
-  EXPECT_FALSE(PathIsWritable(file_name));
-
-  // Give read permission.
-  EXPECT_TRUE(SetPosixFilePermissions(file_name,
-                                      FILE_PERMISSION_WRITE_BY_USER));
-  EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
-  EXPECT_TRUE(mode & FILE_PERMISSION_WRITE_BY_USER);
-  // Make sure the file can be write.
-  EXPECT_EQ(static_cast<int>(kData.length()),
-            WriteFile(file_name, kData.data(), kData.length()));
-  EXPECT_TRUE(PathIsWritable(file_name));
-
-  // Delete the file.
-  EXPECT_TRUE(DeleteFile(file_name, false));
-  EXPECT_FALSE(PathExists(file_name));
-}
-
-TEST_F(FileUtilTest, ChangeDirectoryPermissionsAndEnumerate) {
-  // Create a directory path.
-  FilePath subdir_path = temp_dir_.GetPath().Append(FPL("PermissionTest1"));
-  CreateDirectory(subdir_path);
-  ASSERT_TRUE(PathExists(subdir_path));
-
-  // Create a dummy file to enumerate.
-  FilePath file_name = subdir_path.Append(FPL("Test Readable File.txt"));
-  EXPECT_FALSE(PathExists(file_name));
-  const std::string kData("hello");
-  EXPECT_EQ(static_cast<int>(kData.length()),
-            WriteFile(file_name, kData.data(), kData.length()));
-  EXPECT_TRUE(PathExists(file_name));
-
-  // Make sure the directory has the all permissions.
-  int mode = 0;
-  EXPECT_TRUE(GetPosixFilePermissions(subdir_path, &mode));
-  EXPECT_EQ(FILE_PERMISSION_USER_MASK, mode & FILE_PERMISSION_USER_MASK);
-
-  // Get rid of the permissions from the directory.
-  EXPECT_TRUE(SetPosixFilePermissions(subdir_path, 0u));
-  EXPECT_TRUE(GetPosixFilePermissions(subdir_path, &mode));
-  EXPECT_FALSE(mode & FILE_PERMISSION_USER_MASK);
-
-  // Make sure the file in the directory can't be enumerated.
-  FileEnumerator f1(subdir_path, true, FileEnumerator::FILES);
-  EXPECT_TRUE(PathExists(subdir_path));
-  FindResultCollector c1(&f1);
-  EXPECT_EQ(0, c1.size());
-  EXPECT_FALSE(GetPosixFilePermissions(file_name, &mode));
-
-  // Give the permissions to the directory.
-  EXPECT_TRUE(SetPosixFilePermissions(subdir_path, FILE_PERMISSION_USER_MASK));
-  EXPECT_TRUE(GetPosixFilePermissions(subdir_path, &mode));
-  EXPECT_EQ(FILE_PERMISSION_USER_MASK, mode & FILE_PERMISSION_USER_MASK);
-
-  // Make sure the file in the directory can be enumerated.
-  FileEnumerator f2(subdir_path, true, FileEnumerator::FILES);
-  FindResultCollector c2(&f2);
-  EXPECT_TRUE(c2.HasFile(file_name));
-  EXPECT_EQ(1, c2.size());
-
-  // Delete the file.
-  EXPECT_TRUE(DeleteFile(subdir_path, true));
-  EXPECT_FALSE(PathExists(subdir_path));
-}
-
-TEST_F(FileUtilTest, ExecutableExistsInPath) {
-  // Create two directories that we will put in our PATH
-  const FilePath::CharType kDir1[] = FPL("dir1");
-  const FilePath::CharType kDir2[] = FPL("dir2");
-
-  FilePath dir1 = temp_dir_.GetPath().Append(kDir1);
-  FilePath dir2 = temp_dir_.GetPath().Append(kDir2);
-  ASSERT_TRUE(CreateDirectory(dir1));
-  ASSERT_TRUE(CreateDirectory(dir2));
-
-  test::ScopedEnvironmentVariableOverride scoped_env(
-      "PATH", dir1.value() + ":" + dir2.value());
-  ASSERT_TRUE(scoped_env.IsOverridden());
-
-  const FilePath::CharType kRegularFileName[] = FPL("regular_file");
-  const FilePath::CharType kExeFileName[] = FPL("exe");
-  const FilePath::CharType kDneFileName[] = FPL("does_not_exist");
-
-  const FilePath kExePath = dir1.Append(kExeFileName);
-  const FilePath kRegularFilePath = dir2.Append(kRegularFileName);
-
-  // Write file.
-  const std::string kData("hello");
-  ASSERT_EQ(static_cast<int>(kData.length()),
-            WriteFile(kExePath, kData.data(), kData.length()));
-  ASSERT_TRUE(PathExists(kExePath));
-  ASSERT_EQ(static_cast<int>(kData.length()),
-            WriteFile(kRegularFilePath, kData.data(), kData.length()));
-  ASSERT_TRUE(PathExists(kRegularFilePath));
-
-  ASSERT_TRUE(SetPosixFilePermissions(dir1.Append(kExeFileName),
-                                      FILE_PERMISSION_EXECUTE_BY_USER));
-
-  EXPECT_TRUE(ExecutableExistsInPath(scoped_env.GetEnv(), kExeFileName));
-  EXPECT_FALSE(ExecutableExistsInPath(scoped_env.GetEnv(), kRegularFileName));
-  EXPECT_FALSE(ExecutableExistsInPath(scoped_env.GetEnv(), kDneFileName));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryPermissions) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create some regular files under the directory with various permissions.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
-  CreateTextFile(file_name_from, L"Mordecai");
-  ASSERT_TRUE(PathExists(file_name_from));
-  ASSERT_TRUE(SetPosixFilePermissions(file_name_from, 0755));
-
-  FilePath file2_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Reggy-2.txt"));
-  CreateTextFile(file2_name_from, L"Rigby");
-  ASSERT_TRUE(PathExists(file2_name_from));
-  ASSERT_TRUE(SetPosixFilePermissions(file2_name_from, 0777));
-
-  FilePath file3_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Reggy-3.txt"));
-  CreateTextFile(file3_name_from, L"Benson");
-  ASSERT_TRUE(PathExists(file3_name_from));
-  ASSERT_TRUE(SetPosixFilePermissions(file3_name_from, 0400));
-
-  // Copy the directory recursively.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
-  FilePath file2_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Reggy-2.txt"));
-  FilePath file3_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Reggy-3.txt"));
-
-  ASSERT_FALSE(PathExists(dir_name_to));
-
-  EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, true));
-  ASSERT_TRUE(PathExists(file_name_to));
-  ASSERT_TRUE(PathExists(file2_name_to));
-  ASSERT_TRUE(PathExists(file3_name_to));
-
-  int mode = 0;
-  int expected_mode;
-  ASSERT_TRUE(GetPosixFilePermissions(file_name_to, &mode));
-#if defined(OS_MACOSX)
-  expected_mode = 0755;
-#elif defined(OS_CHROMEOS)
-  expected_mode = 0644;
-#else
-  expected_mode = 0600;
-#endif
-  EXPECT_EQ(expected_mode, mode);
-
-  ASSERT_TRUE(GetPosixFilePermissions(file2_name_to, &mode));
-#if defined(OS_MACOSX)
-  expected_mode = 0755;
-#elif defined(OS_CHROMEOS)
-  expected_mode = 0644;
-#else
-  expected_mode = 0600;
-#endif
-  EXPECT_EQ(expected_mode, mode);
-
-  ASSERT_TRUE(GetPosixFilePermissions(file3_name_to, &mode));
-#if defined(OS_MACOSX)
-  expected_mode = 0600;
-#elif defined(OS_CHROMEOS)
-  expected_mode = 0644;
-#else
-  expected_mode = 0600;
-#endif
-  EXPECT_EQ(expected_mode, mode);
-}
-
-TEST_F(FileUtilTest, CopyDirectoryPermissionsOverExistingFile) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
-  CreateTextFile(file_name_from, L"Mordecai");
-  ASSERT_TRUE(PathExists(file_name_from));
-  ASSERT_TRUE(SetPosixFilePermissions(file_name_from, 0644));
-
-  // Create a directory.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  CreateDirectory(dir_name_to);
-  ASSERT_TRUE(PathExists(dir_name_to));
-
-  // Create a file under the directory with wider permissions.
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
-  CreateTextFile(file_name_to, L"Rigby");
-  ASSERT_TRUE(PathExists(file_name_to));
-  ASSERT_TRUE(SetPosixFilePermissions(file_name_to, 0777));
-
-  // Ensure that when we copy the directory, the file contents are copied
-  // but the permissions on the destination are left alone.
-  EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
-  ASSERT_TRUE(PathExists(file_name_to));
-  ASSERT_EQ(L"Mordecai", ReadTextFile(file_name_to));
-
-  int mode = 0;
-  ASSERT_TRUE(GetPosixFilePermissions(file_name_to, &mode));
-  EXPECT_EQ(0777, mode);
-}
-
-TEST_F(FileUtilTest, CopyDirectoryExclDoesNotOverwrite) {
-  // Create source directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
-  CreateTextFile(file_name_from, L"Mordecai");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Create destination directory.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  CreateDirectory(dir_name_to);
-  ASSERT_TRUE(PathExists(dir_name_to));
-
-  // Create a file under the directory with the same name.
-  FilePath file_name_to = dir_name_to.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
-  CreateTextFile(file_name_to, L"Rigby");
-  ASSERT_TRUE(PathExists(file_name_to));
-
-  // Ensure that copying failed and the file was not overwritten.
-  EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
-  ASSERT_TRUE(PathExists(file_name_to));
-  ASSERT_EQ(L"Rigby", ReadTextFile(file_name_to));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverExistingFile) {
-  // Create source directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a subdirectory.
-  FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
-  CreateDirectory(subdir_name_from);
-  ASSERT_TRUE(PathExists(subdir_name_from));
-
-  // Create destination directory.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  CreateDirectory(dir_name_to);
-  ASSERT_TRUE(PathExists(dir_name_to));
-
-  // Create a regular file under the directory with the same name.
-  FilePath file_name_to = dir_name_to.Append(FILE_PATH_LITERAL("Subsub"));
-  CreateTextFile(file_name_to, L"Rigby");
-  ASSERT_TRUE(PathExists(file_name_to));
-
-  // Ensure that copying failed and the file was not overwritten.
-  EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
-  ASSERT_TRUE(PathExists(file_name_to));
-  ASSERT_EQ(L"Rigby", ReadTextFile(file_name_to));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverExistingDirectory) {
-  // Create source directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a subdirectory.
-  FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
-  CreateDirectory(subdir_name_from);
-  ASSERT_TRUE(PathExists(subdir_name_from));
-
-  // Create destination directory.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  CreateDirectory(dir_name_to);
-  ASSERT_TRUE(PathExists(dir_name_to));
-
-  // Create a subdirectory under the directory with the same name.
-  FilePath subdir_name_to = dir_name_to.Append(FILE_PATH_LITERAL("Subsub"));
-  CreateDirectory(subdir_name_to);
-  ASSERT_TRUE(PathExists(subdir_name_to));
-
-  // Ensure that copying failed and the file was not overwritten.
-  EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
-}
-
-TEST_F(FileUtilTest, CopyFileExecutablePermission) {
-  FilePath src = temp_dir_.GetPath().Append(FPL("src.txt"));
-  const std::wstring file_contents(L"Gooooooooooooooooooooogle");
-  CreateTextFile(src, file_contents);
-
-  ASSERT_TRUE(SetPosixFilePermissions(src, 0755));
-  int mode = 0;
-  ASSERT_TRUE(GetPosixFilePermissions(src, &mode));
-  EXPECT_EQ(0755, mode);
-
-  FilePath dst = temp_dir_.GetPath().Append(FPL("dst.txt"));
-  ASSERT_TRUE(CopyFile(src, dst));
-  EXPECT_EQ(file_contents, ReadTextFile(dst));
-
-  ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
-  int expected_mode;
-#if defined(OS_MACOSX)
-  expected_mode = 0755;
-#elif defined(OS_CHROMEOS)
-  expected_mode = 0644;
-#else
-  expected_mode = 0600;
-#endif
-  EXPECT_EQ(expected_mode, mode);
-  ASSERT_TRUE(DeleteFile(dst, false));
-
-  ASSERT_TRUE(SetPosixFilePermissions(src, 0777));
-  ASSERT_TRUE(GetPosixFilePermissions(src, &mode));
-  EXPECT_EQ(0777, mode);
-
-  ASSERT_TRUE(CopyFile(src, dst));
-  EXPECT_EQ(file_contents, ReadTextFile(dst));
-
-  ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
-#if defined(OS_MACOSX)
-  expected_mode = 0755;
-#elif defined(OS_CHROMEOS)
-  expected_mode = 0644;
-#else
-  expected_mode = 0600;
-#endif
-  EXPECT_EQ(expected_mode, mode);
-  ASSERT_TRUE(DeleteFile(dst, false));
-
-  ASSERT_TRUE(SetPosixFilePermissions(src, 0400));
-  ASSERT_TRUE(GetPosixFilePermissions(src, &mode));
-  EXPECT_EQ(0400, mode);
-
-  ASSERT_TRUE(CopyFile(src, dst));
-  EXPECT_EQ(file_contents, ReadTextFile(dst));
-
-  ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
-#if defined(OS_MACOSX)
-  expected_mode = 0600;
-#elif defined(OS_CHROMEOS)
-  expected_mode = 0644;
-#else
-  expected_mode = 0600;
-#endif
-  EXPECT_EQ(expected_mode, mode);
-
-  // This time, do not delete |dst|. Instead set its permissions to 0777.
-  ASSERT_TRUE(SetPosixFilePermissions(dst, 0777));
-  ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
-  EXPECT_EQ(0777, mode);
-
-  // Overwrite it and check the permissions again.
-  ASSERT_TRUE(CopyFile(src, dst));
-  EXPECT_EQ(file_contents, ReadTextFile(dst));
-  ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
-  EXPECT_EQ(0777, mode);
-}
-
-#endif  // defined(OS_POSIX)
-
-#if !defined(OS_FUCHSIA)
-
-TEST_F(FileUtilTest, CopyFileACL) {
-  // While FileUtilTest.CopyFile asserts the content is correctly copied over,
-  // this test case asserts the access control bits are meeting expectations in
-  // CopyFile().
-  FilePath src = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("src.txt"));
-  const std::wstring file_contents(L"Gooooooooooooooooooooogle");
-  CreateTextFile(src, file_contents);
-
-  // Set the source file to read-only.
-  ASSERT_FALSE(IsReadOnly(src));
-  SetReadOnly(src, true);
-  ASSERT_TRUE(IsReadOnly(src));
-
-  // Copy the file.
-  FilePath dst = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("dst.txt"));
-  ASSERT_TRUE(CopyFile(src, dst));
-  EXPECT_EQ(file_contents, ReadTextFile(dst));
-
-  ASSERT_FALSE(IsReadOnly(dst));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryACL) {
-  // Create source directories.
-  FilePath src = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("src"));
-  FilePath src_subdir = src.Append(FILE_PATH_LITERAL("subdir"));
-  CreateDirectory(src_subdir);
-  ASSERT_TRUE(PathExists(src_subdir));
-
-  // Create a file under the directory.
-  FilePath src_file = src.Append(FILE_PATH_LITERAL("src.txt"));
-  CreateTextFile(src_file, L"Gooooooooooooooooooooogle");
-  SetReadOnly(src_file, true);
-  ASSERT_TRUE(IsReadOnly(src_file));
-
-  // Make directory read-only.
-  SetReadOnly(src_subdir, true);
-  ASSERT_TRUE(IsReadOnly(src_subdir));
-
-  // Copy the directory recursively.
-  FilePath dst = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("dst"));
-  FilePath dst_file = dst.Append(FILE_PATH_LITERAL("src.txt"));
-  EXPECT_TRUE(CopyDirectory(src, dst, true));
-
-  FilePath dst_subdir = dst.Append(FILE_PATH_LITERAL("subdir"));
-  ASSERT_FALSE(IsReadOnly(dst_subdir));
-  ASSERT_FALSE(IsReadOnly(dst_file));
-
-  // Give write permissions to allow deletion.
-  SetReadOnly(src_subdir, false);
-  ASSERT_FALSE(IsReadOnly(src_subdir));
-}
-
-#endif  // !defined(OS_FUCHSIA)
-
-TEST_F(FileUtilTest, DeleteNonExistent) {
-  FilePath non_existent =
-      temp_dir_.GetPath().AppendASCII("bogus_file_dne.foobar");
-  ASSERT_FALSE(PathExists(non_existent));
-
-  EXPECT_TRUE(DeleteFile(non_existent, false));
-  ASSERT_FALSE(PathExists(non_existent));
-  EXPECT_TRUE(DeleteFile(non_existent, true));
-  ASSERT_FALSE(PathExists(non_existent));
-}
-
-TEST_F(FileUtilTest, DeleteNonExistentWithNonExistentParent) {
-  FilePath non_existent = temp_dir_.GetPath().AppendASCII("bogus_topdir");
-  non_existent = non_existent.AppendASCII("bogus_subdir");
-  ASSERT_FALSE(PathExists(non_existent));
-
-  EXPECT_TRUE(DeleteFile(non_existent, false));
-  ASSERT_FALSE(PathExists(non_existent));
-  EXPECT_TRUE(DeleteFile(non_existent, true));
-  ASSERT_FALSE(PathExists(non_existent));
-}
-
-TEST_F(FileUtilTest, DeleteFile) {
-  // Create a file
-  FilePath file_name = temp_dir_.GetPath().Append(FPL("Test DeleteFile 1.txt"));
-  CreateTextFile(file_name, bogus_content);
-  ASSERT_TRUE(PathExists(file_name));
-
-  // Make sure it's deleted
-  EXPECT_TRUE(DeleteFile(file_name, false));
-  EXPECT_FALSE(PathExists(file_name));
-
-  // Test recursive case, create a new file
-  file_name = temp_dir_.GetPath().Append(FPL("Test DeleteFile 2.txt"));
-  CreateTextFile(file_name, bogus_content);
-  ASSERT_TRUE(PathExists(file_name));
-
-  // Make sure it's deleted
-  EXPECT_TRUE(DeleteFile(file_name, true));
-  EXPECT_FALSE(PathExists(file_name));
-}
-
-#if defined(OS_WIN)
-// Tests that the Delete function works for wild cards, especially
-// with the recursion flag.  Also coincidentally tests PathExists.
-// TODO(erikkay): see if anyone's actually using this feature of the API
-TEST_F(FileUtilTest, DeleteWildCard) {
-  // Create a file and a directory
-  FilePath file_name =
-      temp_dir_.GetPath().Append(FPL("Test DeleteWildCard.txt"));
-  CreateTextFile(file_name, bogus_content);
-  ASSERT_TRUE(PathExists(file_name));
-
-  FilePath subdir_path = temp_dir_.GetPath().Append(FPL("DeleteWildCardDir"));
-  CreateDirectory(subdir_path);
-  ASSERT_TRUE(PathExists(subdir_path));
-
-  // Create the wildcard path
-  FilePath directory_contents = temp_dir_.GetPath();
-  directory_contents = directory_contents.Append(FPL("*"));
-
-  // Delete non-recursively and check that only the file is deleted
-  EXPECT_TRUE(DeleteFile(directory_contents, false));
-  EXPECT_FALSE(PathExists(file_name));
-  EXPECT_TRUE(PathExists(subdir_path));
-
-  // Delete recursively and make sure all contents are deleted
-  EXPECT_TRUE(DeleteFile(directory_contents, true));
-  EXPECT_FALSE(PathExists(file_name));
-  EXPECT_FALSE(PathExists(subdir_path));
-}
-
-// TODO(erikkay): see if anyone's actually using this feature of the API
-TEST_F(FileUtilTest, DeleteNonExistantWildCard) {
-  // Create a file and a directory
-  FilePath subdir_path =
-      temp_dir_.GetPath().Append(FPL("DeleteNonExistantWildCard"));
-  CreateDirectory(subdir_path);
-  ASSERT_TRUE(PathExists(subdir_path));
-
-  // Create the wildcard path
-  FilePath directory_contents = subdir_path;
-  directory_contents = directory_contents.Append(FPL("*"));
-
-  // Delete non-recursively and check nothing got deleted
-  EXPECT_TRUE(DeleteFile(directory_contents, false));
-  EXPECT_TRUE(PathExists(subdir_path));
-
-  // Delete recursively and check nothing got deleted
-  EXPECT_TRUE(DeleteFile(directory_contents, true));
-  EXPECT_TRUE(PathExists(subdir_path));
-}
-#endif
-
-// Tests non-recursive Delete() for a directory.
-TEST_F(FileUtilTest, DeleteDirNonRecursive) {
-  // Create a subdirectory and put a file and two directories inside.
-  FilePath test_subdir =
-      temp_dir_.GetPath().Append(FPL("DeleteDirNonRecursive"));
-  CreateDirectory(test_subdir);
-  ASSERT_TRUE(PathExists(test_subdir));
-
-  FilePath file_name = test_subdir.Append(FPL("Test DeleteDir.txt"));
-  CreateTextFile(file_name, bogus_content);
-  ASSERT_TRUE(PathExists(file_name));
-
-  FilePath subdir_path1 = test_subdir.Append(FPL("TestSubDir1"));
-  CreateDirectory(subdir_path1);
-  ASSERT_TRUE(PathExists(subdir_path1));
-
-  FilePath subdir_path2 = test_subdir.Append(FPL("TestSubDir2"));
-  CreateDirectory(subdir_path2);
-  ASSERT_TRUE(PathExists(subdir_path2));
-
-  // Delete non-recursively and check that the empty dir got deleted
-  EXPECT_TRUE(DeleteFile(subdir_path2, false));
-  EXPECT_FALSE(PathExists(subdir_path2));
-
-  // Delete non-recursively and check that nothing got deleted
-  EXPECT_FALSE(DeleteFile(test_subdir, false));
-  EXPECT_TRUE(PathExists(test_subdir));
-  EXPECT_TRUE(PathExists(file_name));
-  EXPECT_TRUE(PathExists(subdir_path1));
-}
-
-// Tests recursive Delete() for a directory.
-TEST_F(FileUtilTest, DeleteDirRecursive) {
-  // Create a subdirectory and put a file and two directories inside.
-  FilePath test_subdir = temp_dir_.GetPath().Append(FPL("DeleteDirRecursive"));
-  CreateDirectory(test_subdir);
-  ASSERT_TRUE(PathExists(test_subdir));
-
-  FilePath file_name = test_subdir.Append(FPL("Test DeleteDirRecursive.txt"));
-  CreateTextFile(file_name, bogus_content);
-  ASSERT_TRUE(PathExists(file_name));
-
-  FilePath subdir_path1 = test_subdir.Append(FPL("TestSubDir1"));
-  CreateDirectory(subdir_path1);
-  ASSERT_TRUE(PathExists(subdir_path1));
-
-  FilePath subdir_path2 = test_subdir.Append(FPL("TestSubDir2"));
-  CreateDirectory(subdir_path2);
-  ASSERT_TRUE(PathExists(subdir_path2));
-
-  // Delete recursively and check that the empty dir got deleted
-  EXPECT_TRUE(DeleteFile(subdir_path2, true));
-  EXPECT_FALSE(PathExists(subdir_path2));
-
-  // Delete recursively and check that everything got deleted
-  EXPECT_TRUE(DeleteFile(test_subdir, true));
-  EXPECT_FALSE(PathExists(file_name));
-  EXPECT_FALSE(PathExists(subdir_path1));
-  EXPECT_FALSE(PathExists(test_subdir));
-}
-
-// Tests recursive Delete() for a directory.
-TEST_F(FileUtilTest, DeleteDirRecursiveWithOpenFile) {
-  // Create a subdirectory and put a file and two directories inside.
-  FilePath test_subdir = temp_dir_.GetPath().Append(FPL("DeleteWithOpenFile"));
-  CreateDirectory(test_subdir);
-  ASSERT_TRUE(PathExists(test_subdir));
-
-  FilePath file_name1 = test_subdir.Append(FPL("Undeletebable File1.txt"));
-  File file1(file_name1,
-             File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE);
-  ASSERT_TRUE(PathExists(file_name1));
-
-  FilePath file_name2 = test_subdir.Append(FPL("Deleteable File2.txt"));
-  CreateTextFile(file_name2, bogus_content);
-  ASSERT_TRUE(PathExists(file_name2));
-
-  FilePath file_name3 = test_subdir.Append(FPL("Undeletebable File3.txt"));
-  File file3(file_name3,
-             File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE);
-  ASSERT_TRUE(PathExists(file_name3));
-
-#if defined(OS_LINUX)
-  // On Windows, holding the file open in sufficient to make it un-deletable.
-  // The POSIX code is verifiable on Linux by creating an "immutable" file but
-  // this is best-effort because it's not supported by all file systems. Both
-  // files will have the same flags so no need to get them individually.
-  int flags;
-  bool file_attrs_supported =
-      ioctl(file1.GetPlatformFile(), FS_IOC_GETFLAGS, &flags) == 0;
-  // Some filesystems (e.g. tmpfs) don't support file attributes.
-  if (file_attrs_supported) {
-    flags |= FS_IMMUTABLE_FL;
-    ioctl(file1.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
-    ioctl(file3.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
-  }
-#endif
-
-  // Delete recursively and check that at least the second file got deleted.
-  // This ensures that un-deletable files don't impact those that can be.
-  DeleteFile(test_subdir, true);
-  EXPECT_FALSE(PathExists(file_name2));
-
-#if defined(OS_LINUX)
-  // Make sure that the test can clean up after itself.
-  if (file_attrs_supported) {
-    flags &= ~FS_IMMUTABLE_FL;
-    ioctl(file1.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
-    ioctl(file3.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
-  }
-#endif
-}
-
-TEST_F(FileUtilTest, MoveFileNew) {
-  // Create a file
-  FilePath file_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // The destination.
-  FilePath file_name_to = temp_dir_.GetPath().Append(
-      FILE_PATH_LITERAL("Move_Test_File_Destination.txt"));
-  ASSERT_FALSE(PathExists(file_name_to));
-
-  EXPECT_TRUE(Move(file_name_from, file_name_to));
-
-  // Check everything has been moved.
-  EXPECT_FALSE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(file_name_to));
-}
-
-TEST_F(FileUtilTest, MoveFileExists) {
-  // Create a file
-  FilePath file_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // The destination name.
-  FilePath file_name_to = temp_dir_.GetPath().Append(
-      FILE_PATH_LITERAL("Move_Test_File_Destination.txt"));
-  CreateTextFile(file_name_to, L"Old file content");
-  ASSERT_TRUE(PathExists(file_name_to));
-
-  EXPECT_TRUE(Move(file_name_from, file_name_to));
-
-  // Check everything has been moved.
-  EXPECT_FALSE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(file_name_to));
-  EXPECT_TRUE(L"Gooooooooooooooooooooogle" == ReadTextFile(file_name_to));
-}
-
-TEST_F(FileUtilTest, MoveFileDirExists) {
-  // Create a file
-  FilePath file_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // The destination directory
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
-  CreateDirectory(dir_name_to);
-  ASSERT_TRUE(PathExists(dir_name_to));
-
-  EXPECT_FALSE(Move(file_name_from, dir_name_to));
-}
-
-
-TEST_F(FileUtilTest, MoveNew) {
-  // Create a directory
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory
-  FilePath txt_file_name(FILE_PATH_LITERAL("Move_Test_File.txt"));
-  FilePath file_name_from = dir_name_from.Append(txt_file_name);
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Move the directory.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_To_Subdir"));
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
-
-  ASSERT_FALSE(PathExists(dir_name_to));
-
-  EXPECT_TRUE(Move(dir_name_from, dir_name_to));
-
-  // Check everything has been moved.
-  EXPECT_FALSE(PathExists(dir_name_from));
-  EXPECT_FALSE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(dir_name_to));
-  EXPECT_TRUE(PathExists(file_name_to));
-
-  // Test path traversal.
-  file_name_from = dir_name_to.Append(txt_file_name);
-  file_name_to = dir_name_to.Append(FILE_PATH_LITERAL(".."));
-  file_name_to = file_name_to.Append(txt_file_name);
-  EXPECT_FALSE(Move(file_name_from, file_name_to));
-  EXPECT_TRUE(PathExists(file_name_from));
-  EXPECT_FALSE(PathExists(file_name_to));
-  EXPECT_TRUE(internal::MoveUnsafe(file_name_from, file_name_to));
-  EXPECT_FALSE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(file_name_to));
-}
-
-TEST_F(FileUtilTest, MoveExist) {
-  // Create a directory
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Move the directory
-  FilePath dir_name_exists =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
-
-  FilePath dir_name_to =
-      dir_name_exists.Append(FILE_PATH_LITERAL("Move_To_Subdir"));
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
-
-  // Create the destination directory.
-  CreateDirectory(dir_name_exists);
-  ASSERT_TRUE(PathExists(dir_name_exists));
-
-  EXPECT_TRUE(Move(dir_name_from, dir_name_to));
-
-  // Check everything has been moved.
-  EXPECT_FALSE(PathExists(dir_name_from));
-  EXPECT_FALSE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(dir_name_to));
-  EXPECT_TRUE(PathExists(file_name_to));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryRecursivelyNew) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Create a subdirectory.
-  FilePath subdir_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
-  CreateDirectory(subdir_name_from);
-  ASSERT_TRUE(PathExists(subdir_name_from));
-
-  // Create a file under the subdirectory.
-  FilePath file_name2_from =
-      subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name2_from));
-
-  // Copy the directory recursively.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  FilePath subdir_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
-  FilePath file_name2_to =
-      subdir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-
-  ASSERT_FALSE(PathExists(dir_name_to));
-
-  EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, true));
-
-  // Check everything has been copied.
-  EXPECT_TRUE(PathExists(dir_name_from));
-  EXPECT_TRUE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(subdir_name_from));
-  EXPECT_TRUE(PathExists(file_name2_from));
-  EXPECT_TRUE(PathExists(dir_name_to));
-  EXPECT_TRUE(PathExists(file_name_to));
-  EXPECT_TRUE(PathExists(subdir_name_to));
-  EXPECT_TRUE(PathExists(file_name2_to));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryRecursivelyExists) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Create a subdirectory.
-  FilePath subdir_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
-  CreateDirectory(subdir_name_from);
-  ASSERT_TRUE(PathExists(subdir_name_from));
-
-  // Create a file under the subdirectory.
-  FilePath file_name2_from =
-      subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name2_from));
-
-  // Copy the directory recursively.
-  FilePath dir_name_exists =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
-
-  FilePath dir_name_to =
-      dir_name_exists.Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  FilePath subdir_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
-  FilePath file_name2_to =
-      subdir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-
-  // Create the destination directory.
-  CreateDirectory(dir_name_exists);
-  ASSERT_TRUE(PathExists(dir_name_exists));
-
-  EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_exists, true));
-
-  // Check everything has been copied.
-  EXPECT_TRUE(PathExists(dir_name_from));
-  EXPECT_TRUE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(subdir_name_from));
-  EXPECT_TRUE(PathExists(file_name2_from));
-  EXPECT_TRUE(PathExists(dir_name_to));
-  EXPECT_TRUE(PathExists(file_name_to));
-  EXPECT_TRUE(PathExists(subdir_name_to));
-  EXPECT_TRUE(PathExists(file_name2_to));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryNew) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Create a subdirectory.
-  FilePath subdir_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
-  CreateDirectory(subdir_name_from);
-  ASSERT_TRUE(PathExists(subdir_name_from));
-
-  // Create a file under the subdirectory.
-  FilePath file_name2_from =
-      subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name2_from));
-
-  // Copy the directory not recursively.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  FilePath subdir_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
-
-  ASSERT_FALSE(PathExists(dir_name_to));
-
-  EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
-
-  // Check everything has been copied.
-  EXPECT_TRUE(PathExists(dir_name_from));
-  EXPECT_TRUE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(subdir_name_from));
-  EXPECT_TRUE(PathExists(file_name2_from));
-  EXPECT_TRUE(PathExists(dir_name_to));
-  EXPECT_TRUE(PathExists(file_name_to));
-  EXPECT_FALSE(PathExists(subdir_name_to));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryExists) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Create a subdirectory.
-  FilePath subdir_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
-  CreateDirectory(subdir_name_from);
-  ASSERT_TRUE(PathExists(subdir_name_from));
-
-  // Create a file under the subdirectory.
-  FilePath file_name2_from =
-      subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name2_from));
-
-  // Copy the directory not recursively.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  FilePath subdir_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
-
-  // Create the destination directory.
-  CreateDirectory(dir_name_to);
-  ASSERT_TRUE(PathExists(dir_name_to));
-
-  EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
-
-  // Check everything has been copied.
-  EXPECT_TRUE(PathExists(dir_name_from));
-  EXPECT_TRUE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(subdir_name_from));
-  EXPECT_TRUE(PathExists(file_name2_from));
-  EXPECT_TRUE(PathExists(dir_name_to));
-  EXPECT_TRUE(PathExists(file_name_to));
-  EXPECT_FALSE(PathExists(subdir_name_to));
-}
-
-TEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToNew) {
-  // Create a file
-  FilePath file_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // The destination name
-  FilePath file_name_to = temp_dir_.GetPath().Append(
-      FILE_PATH_LITERAL("Copy_Test_File_Destination.txt"));
-  ASSERT_FALSE(PathExists(file_name_to));
-
-  EXPECT_TRUE(CopyDirectory(file_name_from, file_name_to, true));
-
-  // Check the has been copied
-  EXPECT_TRUE(PathExists(file_name_to));
-}
-
-TEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToExisting) {
-  // Create a file
-  FilePath file_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // The destination name
-  FilePath file_name_to = temp_dir_.GetPath().Append(
-      FILE_PATH_LITERAL("Copy_Test_File_Destination.txt"));
-  CreateTextFile(file_name_to, L"Old file content");
-  ASSERT_TRUE(PathExists(file_name_to));
-
-  EXPECT_TRUE(CopyDirectory(file_name_from, file_name_to, true));
-
-  // Check the has been copied
-  EXPECT_TRUE(PathExists(file_name_to));
-  EXPECT_TRUE(L"Gooooooooooooooooooooogle" == ReadTextFile(file_name_to));
-}
-
-TEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToExistingDirectory) {
-  // Create a file
-  FilePath file_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // The destination
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
-  CreateDirectory(dir_name_to);
-  ASSERT_TRUE(PathExists(dir_name_to));
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-
-  EXPECT_TRUE(CopyDirectory(file_name_from, dir_name_to, true));
-
-  // Check the has been copied
-  EXPECT_TRUE(PathExists(file_name_to));
-}
-
-TEST_F(FileUtilTest, CopyFileFailureWithCopyDirectoryExcl) {
-  // Create a file
-  FilePath file_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Make a destination file.
-  FilePath file_name_to = temp_dir_.GetPath().Append(
-      FILE_PATH_LITERAL("Copy_Test_File_Destination.txt"));
-  CreateTextFile(file_name_to, L"Old file content");
-  ASSERT_TRUE(PathExists(file_name_to));
-
-  // Overwriting the destination should fail.
-  EXPECT_FALSE(CopyDirectoryExcl(file_name_from, file_name_to, true));
-  EXPECT_EQ(L"Old file content", ReadTextFile(file_name_to));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryWithTrailingSeparators) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Copy the directory recursively.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-
-  // Create from path with trailing separators.
-#if defined(OS_WIN)
-  FilePath from_path =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir\\\\\\"));
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  FilePath from_path =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir///"));
-#endif
-
-  EXPECT_TRUE(CopyDirectory(from_path, dir_name_to, true));
-
-  // Check everything has been copied.
-  EXPECT_TRUE(PathExists(dir_name_from));
-  EXPECT_TRUE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(dir_name_to));
-  EXPECT_TRUE(PathExists(file_name_to));
-}
-
-#if defined(OS_POSIX)
-TEST_F(FileUtilTest, CopyDirectoryWithNonRegularFiles) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_from));
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Create a symbolic link under the directory pointing to that file.
-  FilePath symlink_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Symlink"));
-  ASSERT_TRUE(CreateSymbolicLink(file_name_from, symlink_name_from));
-  ASSERT_TRUE(PathExists(symlink_name_from));
-
-  // Create a fifo under the directory.
-  FilePath fifo_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Fifo"));
-  ASSERT_EQ(0, mkfifo(fifo_name_from.value().c_str(), 0644));
-  ASSERT_TRUE(PathExists(fifo_name_from));
-
-  // Copy the directory.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  FilePath symlink_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Symlink"));
-  FilePath fifo_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Fifo"));
-
-  ASSERT_FALSE(PathExists(dir_name_to));
-
-  EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
-
-  // Check that only directories and regular files are copied.
-  EXPECT_TRUE(PathExists(dir_name_from));
-  EXPECT_TRUE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(symlink_name_from));
-  EXPECT_TRUE(PathExists(fifo_name_from));
-  EXPECT_TRUE(PathExists(dir_name_to));
-  EXPECT_TRUE(PathExists(file_name_to));
-  EXPECT_FALSE(PathExists(symlink_name_to));
-  EXPECT_FALSE(PathExists(fifo_name_to));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryExclFileOverSymlink) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_from));
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Create a destination directory with a symlink of the same name.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_to));
-  ASSERT_TRUE(PathExists(dir_name_to));
-
-  FilePath symlink_target =
-      dir_name_to.Append(FILE_PATH_LITERAL("Symlink_Target.txt"));
-  CreateTextFile(symlink_target, L"asdf");
-  ASSERT_TRUE(PathExists(symlink_target));
-
-  FilePath symlink_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
-  ASSERT_TRUE(PathExists(symlink_name_to));
-
-  // Check that copying fails.
-  EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverSymlink) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_from));
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a subdirectory.
-  FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
-  CreateDirectory(subdir_name_from);
-  ASSERT_TRUE(PathExists(subdir_name_from));
-
-  // Create a destination directory with a symlink of the same name.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_to));
-  ASSERT_TRUE(PathExists(dir_name_to));
-
-  FilePath symlink_target = dir_name_to.Append(FILE_PATH_LITERAL("Subsub"));
-  CreateTextFile(symlink_target, L"asdf");
-  ASSERT_TRUE(PathExists(symlink_target));
-
-  FilePath symlink_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
-  ASSERT_TRUE(PathExists(symlink_name_to));
-
-  // Check that copying fails.
-  EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryExclFileOverDanglingSymlink) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_from));
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Create a destination directory with a dangling symlink of the same name.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_to));
-  ASSERT_TRUE(PathExists(dir_name_to));
-
-  FilePath symlink_target =
-      dir_name_to.Append(FILE_PATH_LITERAL("Symlink_Target.txt"));
-  CreateTextFile(symlink_target, L"asdf");
-  ASSERT_TRUE(PathExists(symlink_target));
-
-  FilePath symlink_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
-  ASSERT_TRUE(PathExists(symlink_name_to));
-  ASSERT_TRUE(DeleteFile(symlink_target, false));
-
-  // Check that copying fails and that no file was created for the symlink's
-  // referent.
-  EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
-  EXPECT_FALSE(PathExists(symlink_target));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverDanglingSymlink) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_from));
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a subdirectory.
-  FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
-  CreateDirectory(subdir_name_from);
-  ASSERT_TRUE(PathExists(subdir_name_from));
-
-  // Create a destination directory with a dangling symlink of the same name.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_to));
-  ASSERT_TRUE(PathExists(dir_name_to));
-
-  FilePath symlink_target =
-      dir_name_to.Append(FILE_PATH_LITERAL("Symlink_Target.txt"));
-  CreateTextFile(symlink_target, L"asdf");
-  ASSERT_TRUE(PathExists(symlink_target));
-
-  FilePath symlink_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
-  ASSERT_TRUE(PathExists(symlink_name_to));
-  ASSERT_TRUE(DeleteFile(symlink_target, false));
-
-  // Check that copying fails and that no directory was created for the
-  // symlink's referent.
-  EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
-  EXPECT_FALSE(PathExists(symlink_target));
-}
-
-TEST_F(FileUtilTest, CopyDirectoryExclFileOverFifo) {
-  // Create a directory.
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_from));
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory.
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Create a destination directory with a fifo of the same name.
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_to));
-  ASSERT_TRUE(PathExists(dir_name_to));
-
-  FilePath fifo_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  ASSERT_EQ(0, mkfifo(fifo_name_to.value().c_str(), 0644));
-  ASSERT_TRUE(PathExists(fifo_name_to));
-
-  // Check that copying fails.
-  EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
-}
-#endif  // defined(OS_POSIX)
-
-TEST_F(FileUtilTest, CopyFile) {
-  // Create a directory
-  FilePath dir_name_from =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
-  ASSERT_TRUE(CreateDirectory(dir_name_from));
-  ASSERT_TRUE(DirectoryExists(dir_name_from));
-
-  // Create a file under the directory
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
-  const std::wstring file_contents(L"Gooooooooooooooooooooogle");
-  CreateTextFile(file_name_from, file_contents);
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Copy the file.
-  FilePath dest_file = dir_name_from.Append(FILE_PATH_LITERAL("DestFile.txt"));
-  ASSERT_TRUE(CopyFile(file_name_from, dest_file));
-
-  // Try to copy the file to another location using '..' in the path.
-  FilePath dest_file2(dir_name_from);
-  dest_file2 = dest_file2.AppendASCII("..");
-  dest_file2 = dest_file2.AppendASCII("DestFile.txt");
-  ASSERT_FALSE(CopyFile(file_name_from, dest_file2));
-
-  FilePath dest_file2_test(dir_name_from);
-  dest_file2_test = dest_file2_test.DirName();
-  dest_file2_test = dest_file2_test.AppendASCII("DestFile.txt");
-
-  // Check expected copy results.
-  EXPECT_TRUE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(dest_file));
-  EXPECT_EQ(file_contents, ReadTextFile(dest_file));
-  EXPECT_FALSE(PathExists(dest_file2_test));
-  EXPECT_FALSE(PathExists(dest_file2));
-
-  // Change |file_name_from| contents.
-  const std::wstring new_file_contents(L"Moogle");
-  CreateTextFile(file_name_from, new_file_contents);
-  ASSERT_TRUE(PathExists(file_name_from));
-  EXPECT_EQ(new_file_contents, ReadTextFile(file_name_from));
-
-  // Overwrite |dest_file|.
-  ASSERT_TRUE(CopyFile(file_name_from, dest_file));
-  EXPECT_TRUE(PathExists(dest_file));
-  EXPECT_EQ(new_file_contents, ReadTextFile(dest_file));
-
-  // Create another directory.
-  FilePath dest_dir = temp_dir_.GetPath().Append(FPL("dest_dir"));
-  ASSERT_TRUE(CreateDirectory(dest_dir));
-  EXPECT_TRUE(DirectoryExists(dest_dir));
-  EXPECT_TRUE(IsDirectoryEmpty(dest_dir));
-
-  // Make sure CopyFile() cannot overwrite a directory.
-  ASSERT_FALSE(CopyFile(file_name_from, dest_dir));
-  EXPECT_TRUE(DirectoryExists(dest_dir));
-  EXPECT_TRUE(IsDirectoryEmpty(dest_dir));
-}
-
-// file_util winds up using autoreleased objects on the Mac, so this needs
-// to be a PlatformTest.
-typedef PlatformTest ReadOnlyFileUtilTest;
-
-TEST_F(ReadOnlyFileUtilTest, ContentsEqual) {
-  FilePath data_dir;
-  ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
-  data_dir = data_dir.AppendASCII("file_util");
-  ASSERT_TRUE(PathExists(data_dir));
-
-  FilePath original_file =
-      data_dir.Append(FILE_PATH_LITERAL("original.txt"));
-  FilePath same_file =
-      data_dir.Append(FILE_PATH_LITERAL("same.txt"));
-  FilePath same_length_file =
-      data_dir.Append(FILE_PATH_LITERAL("same_length.txt"));
-  FilePath different_file =
-      data_dir.Append(FILE_PATH_LITERAL("different.txt"));
-  FilePath different_first_file =
-      data_dir.Append(FILE_PATH_LITERAL("different_first.txt"));
-  FilePath different_last_file =
-      data_dir.Append(FILE_PATH_LITERAL("different_last.txt"));
-  FilePath empty1_file =
-      data_dir.Append(FILE_PATH_LITERAL("empty1.txt"));
-  FilePath empty2_file =
-      data_dir.Append(FILE_PATH_LITERAL("empty2.txt"));
-  FilePath shortened_file =
-      data_dir.Append(FILE_PATH_LITERAL("shortened.txt"));
-  FilePath binary_file =
-      data_dir.Append(FILE_PATH_LITERAL("binary_file.bin"));
-  FilePath binary_file_same =
-      data_dir.Append(FILE_PATH_LITERAL("binary_file_same.bin"));
-  FilePath binary_file_diff =
-      data_dir.Append(FILE_PATH_LITERAL("binary_file_diff.bin"));
-
-  EXPECT_TRUE(ContentsEqual(original_file, original_file));
-  EXPECT_TRUE(ContentsEqual(original_file, same_file));
-  EXPECT_FALSE(ContentsEqual(original_file, same_length_file));
-  EXPECT_FALSE(ContentsEqual(original_file, different_file));
-  EXPECT_FALSE(ContentsEqual(FilePath(FILE_PATH_LITERAL("bogusname")),
-                             FilePath(FILE_PATH_LITERAL("bogusname"))));
-  EXPECT_FALSE(ContentsEqual(original_file, different_first_file));
-  EXPECT_FALSE(ContentsEqual(original_file, different_last_file));
-  EXPECT_TRUE(ContentsEqual(empty1_file, empty2_file));
-  EXPECT_FALSE(ContentsEqual(original_file, shortened_file));
-  EXPECT_FALSE(ContentsEqual(shortened_file, original_file));
-  EXPECT_TRUE(ContentsEqual(binary_file, binary_file_same));
-  EXPECT_FALSE(ContentsEqual(binary_file, binary_file_diff));
-}
-
-TEST_F(ReadOnlyFileUtilTest, TextContentsEqual) {
-  FilePath data_dir;
-  ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
-  data_dir = data_dir.AppendASCII("file_util");
-  ASSERT_TRUE(PathExists(data_dir));
-
-  FilePath original_file =
-      data_dir.Append(FILE_PATH_LITERAL("original.txt"));
-  FilePath same_file =
-      data_dir.Append(FILE_PATH_LITERAL("same.txt"));
-  FilePath crlf_file =
-      data_dir.Append(FILE_PATH_LITERAL("crlf.txt"));
-  FilePath shortened_file =
-      data_dir.Append(FILE_PATH_LITERAL("shortened.txt"));
-  FilePath different_file =
-      data_dir.Append(FILE_PATH_LITERAL("different.txt"));
-  FilePath different_first_file =
-      data_dir.Append(FILE_PATH_LITERAL("different_first.txt"));
-  FilePath different_last_file =
-      data_dir.Append(FILE_PATH_LITERAL("different_last.txt"));
-  FilePath first1_file =
-      data_dir.Append(FILE_PATH_LITERAL("first1.txt"));
-  FilePath first2_file =
-      data_dir.Append(FILE_PATH_LITERAL("first2.txt"));
-  FilePath empty1_file =
-      data_dir.Append(FILE_PATH_LITERAL("empty1.txt"));
-  FilePath empty2_file =
-      data_dir.Append(FILE_PATH_LITERAL("empty2.txt"));
-  FilePath blank_line_file =
-      data_dir.Append(FILE_PATH_LITERAL("blank_line.txt"));
-  FilePath blank_line_crlf_file =
-      data_dir.Append(FILE_PATH_LITERAL("blank_line_crlf.txt"));
-
-  EXPECT_TRUE(TextContentsEqual(original_file, same_file));
-  EXPECT_TRUE(TextContentsEqual(original_file, crlf_file));
-  EXPECT_FALSE(TextContentsEqual(original_file, shortened_file));
-  EXPECT_FALSE(TextContentsEqual(original_file, different_file));
-  EXPECT_FALSE(TextContentsEqual(original_file, different_first_file));
-  EXPECT_FALSE(TextContentsEqual(original_file, different_last_file));
-  EXPECT_FALSE(TextContentsEqual(first1_file, first2_file));
-  EXPECT_TRUE(TextContentsEqual(empty1_file, empty2_file));
-  EXPECT_FALSE(TextContentsEqual(original_file, empty1_file));
-  EXPECT_TRUE(TextContentsEqual(blank_line_file, blank_line_crlf_file));
-}
-
-// We don't need equivalent functionality outside of Windows.
-#if defined(OS_WIN)
-TEST_F(FileUtilTest, CopyAndDeleteDirectoryTest) {
-  // Create a directory
-  FilePath dir_name_from = temp_dir_.GetPath().Append(
-      FILE_PATH_LITERAL("CopyAndDelete_From_Subdir"));
-  CreateDirectory(dir_name_from);
-  ASSERT_TRUE(PathExists(dir_name_from));
-
-  // Create a file under the directory
-  FilePath file_name_from =
-      dir_name_from.Append(FILE_PATH_LITERAL("CopyAndDelete_Test_File.txt"));
-  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
-  ASSERT_TRUE(PathExists(file_name_from));
-
-  // Move the directory by using CopyAndDeleteDirectory
-  FilePath dir_name_to =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("CopyAndDelete_To_Subdir"));
-  FilePath file_name_to =
-      dir_name_to.Append(FILE_PATH_LITERAL("CopyAndDelete_Test_File.txt"));
-
-  ASSERT_FALSE(PathExists(dir_name_to));
-
-  EXPECT_TRUE(internal::CopyAndDeleteDirectory(dir_name_from,
-                                                     dir_name_to));
-
-  // Check everything has been moved.
-  EXPECT_FALSE(PathExists(dir_name_from));
-  EXPECT_FALSE(PathExists(file_name_from));
-  EXPECT_TRUE(PathExists(dir_name_to));
-  EXPECT_TRUE(PathExists(file_name_to));
-}
-
-TEST_F(FileUtilTest, GetTempDirTest) {
-  static const TCHAR* kTmpKey = _T("TMP");
-  static const TCHAR* kTmpValues[] = {
-    _T(""), _T("C:"), _T("C:\\"), _T("C:\\tmp"), _T("C:\\tmp\\")
-  };
-  // Save the original $TMP.
-  size_t original_tmp_size;
-  TCHAR* original_tmp;
-  ASSERT_EQ(0, ::_tdupenv_s(&original_tmp, &original_tmp_size, kTmpKey));
-  // original_tmp may be NULL.
-
-  for (unsigned int i = 0; i < arraysize(kTmpValues); ++i) {
-    FilePath path;
-    ::_tputenv_s(kTmpKey, kTmpValues[i]);
-    GetTempDir(&path);
-    EXPECT_TRUE(path.IsAbsolute()) << "$TMP=" << kTmpValues[i] <<
-        " result=" << path.value();
-  }
-
-  // Restore the original $TMP.
-  if (original_tmp) {
-    ::_tputenv_s(kTmpKey, original_tmp);
-    free(original_tmp);
-  } else {
-    ::_tputenv_s(kTmpKey, _T(""));
-  }
-}
-#endif  // OS_WIN
-
-// Test that files opened by OpenFile are not set up for inheritance into child
-// procs.
-TEST_F(FileUtilTest, OpenFileNoInheritance) {
-  FilePath file_path(temp_dir_.GetPath().Append(FPL("a_file")));
-
-  for (const char* mode : {"wb", "r,ccs=UTF-8"}) {
-    SCOPED_TRACE(mode);
-    ASSERT_NO_FATAL_FAILURE(CreateTextFile(file_path, L"Geepers"));
-    FILE* file = OpenFile(file_path, mode);
-    ASSERT_NE(nullptr, file);
-    {
-      ScopedClosureRunner file_closer(Bind(IgnoreResult(&CloseFile), file));
-      bool is_inheritable = true;
-      ASSERT_NO_FATAL_FAILURE(GetIsInheritable(file, &is_inheritable));
-      EXPECT_FALSE(is_inheritable);
-    }
-    ASSERT_TRUE(DeleteFile(file_path, false));
-  }
-}
-
-TEST_F(FileUtilTest, CreateTemporaryFileTest) {
-  FilePath temp_files[3];
-  for (int i = 0; i < 3; i++) {
-    ASSERT_TRUE(CreateTemporaryFile(&(temp_files[i])));
-    EXPECT_TRUE(PathExists(temp_files[i]));
-    EXPECT_FALSE(DirectoryExists(temp_files[i]));
-  }
-  for (int i = 0; i < 3; i++)
-    EXPECT_FALSE(temp_files[i] == temp_files[(i+1)%3]);
-  for (int i = 0; i < 3; i++)
-    EXPECT_TRUE(DeleteFile(temp_files[i], false));
-}
-
-TEST_F(FileUtilTest, CreateAndOpenTemporaryFileTest) {
-  FilePath names[3];
-  FILE* fps[3];
-  int i;
-
-  // Create; make sure they are open and exist.
-  for (i = 0; i < 3; ++i) {
-    fps[i] = CreateAndOpenTemporaryFile(&(names[i]));
-    ASSERT_TRUE(fps[i]);
-    EXPECT_TRUE(PathExists(names[i]));
-  }
-
-  // Make sure all names are unique.
-  for (i = 0; i < 3; ++i) {
-    EXPECT_FALSE(names[i] == names[(i+1)%3]);
-  }
-
-  // Close and delete.
-  for (i = 0; i < 3; ++i) {
-    EXPECT_TRUE(CloseFile(fps[i]));
-    EXPECT_TRUE(DeleteFile(names[i], false));
-  }
-}
-
-TEST_F(FileUtilTest, FileToFILE) {
-  File file;
-  FILE* stream = FileToFILE(std::move(file), "w");
-  EXPECT_FALSE(stream);
-
-  FilePath file_name = temp_dir_.GetPath().Append(FPL("The file.txt"));
-  file = File(file_name, File::FLAG_CREATE | File::FLAG_WRITE);
-  EXPECT_TRUE(file.IsValid());
-
-  stream = FileToFILE(std::move(file), "w");
-  EXPECT_TRUE(stream);
-  EXPECT_FALSE(file.IsValid());
-  EXPECT_TRUE(CloseFile(stream));
-}
-
-TEST_F(FileUtilTest, CreateNewTempDirectoryTest) {
-  FilePath temp_dir;
-  ASSERT_TRUE(CreateNewTempDirectory(FilePath::StringType(), &temp_dir));
-  EXPECT_TRUE(PathExists(temp_dir));
-  EXPECT_TRUE(DeleteFile(temp_dir, false));
-}
-
-TEST_F(FileUtilTest, CreateNewTemporaryDirInDirTest) {
-  FilePath new_dir;
-  ASSERT_TRUE(CreateTemporaryDirInDir(
-      temp_dir_.GetPath(), FILE_PATH_LITERAL("CreateNewTemporaryDirInDirTest"),
-      &new_dir));
-  EXPECT_TRUE(PathExists(new_dir));
-  EXPECT_TRUE(temp_dir_.GetPath().IsParent(new_dir));
-  EXPECT_TRUE(DeleteFile(new_dir, false));
-}
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-TEST_F(FileUtilTest, GetShmemTempDirTest) {
-  FilePath dir;
-  EXPECT_TRUE(GetShmemTempDir(false, &dir));
-  EXPECT_TRUE(DirectoryExists(dir));
-}
-#endif
-
-TEST_F(FileUtilTest, GetHomeDirTest) {
-#if !defined(OS_ANDROID)  // Not implemented on Android.
-  // We don't actually know what the home directory is supposed to be without
-  // calling some OS functions which would just duplicate the implementation.
-  // So here we just test that it returns something "reasonable".
-  FilePath home = GetHomeDir();
-  ASSERT_FALSE(home.empty());
-  ASSERT_TRUE(home.IsAbsolute());
-#endif
-}
-
-TEST_F(FileUtilTest, CreateDirectoryTest) {
-  FilePath test_root =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("create_directory_test"));
-#if defined(OS_WIN)
-  FilePath test_path =
-      test_root.Append(FILE_PATH_LITERAL("dir\\tree\\likely\\doesnt\\exist\\"));
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  FilePath test_path =
-      test_root.Append(FILE_PATH_LITERAL("dir/tree/likely/doesnt/exist/"));
-#endif
-
-  EXPECT_FALSE(PathExists(test_path));
-  EXPECT_TRUE(CreateDirectory(test_path));
-  EXPECT_TRUE(PathExists(test_path));
-  // CreateDirectory returns true if the DirectoryExists returns true.
-  EXPECT_TRUE(CreateDirectory(test_path));
-
-  // Doesn't work to create it on top of a non-dir
-  test_path = test_path.Append(FILE_PATH_LITERAL("foobar.txt"));
-  EXPECT_FALSE(PathExists(test_path));
-  CreateTextFile(test_path, L"test file");
-  EXPECT_TRUE(PathExists(test_path));
-  EXPECT_FALSE(CreateDirectory(test_path));
-
-  EXPECT_TRUE(DeleteFile(test_root, true));
-  EXPECT_FALSE(PathExists(test_root));
-  EXPECT_FALSE(PathExists(test_path));
-
-  // Verify assumptions made by the Windows implementation:
-  // 1. The current directory always exists.
-  // 2. The root directory always exists.
-  ASSERT_TRUE(DirectoryExists(FilePath(FilePath::kCurrentDirectory)));
-  FilePath top_level = test_root;
-  while (top_level != top_level.DirName()) {
-    top_level = top_level.DirName();
-  }
-  ASSERT_TRUE(DirectoryExists(top_level));
-
-  // Given these assumptions hold, it should be safe to
-  // test that "creating" these directories succeeds.
-  EXPECT_TRUE(CreateDirectory(
-      FilePath(FilePath::kCurrentDirectory)));
-  EXPECT_TRUE(CreateDirectory(top_level));
-
-#if defined(OS_WIN)
-  FilePath invalid_drive(FILE_PATH_LITERAL("o:\\"));
-  FilePath invalid_path =
-      invalid_drive.Append(FILE_PATH_LITERAL("some\\inaccessible\\dir"));
-  if (!PathExists(invalid_drive)) {
-    EXPECT_FALSE(CreateDirectory(invalid_path));
-  }
-#endif
-}
-
-TEST_F(FileUtilTest, DetectDirectoryTest) {
-  // Check a directory
-  FilePath test_root =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("detect_directory_test"));
-  EXPECT_FALSE(PathExists(test_root));
-  EXPECT_TRUE(CreateDirectory(test_root));
-  EXPECT_TRUE(PathExists(test_root));
-  EXPECT_TRUE(DirectoryExists(test_root));
-  // Check a file
-  FilePath test_path =
-      test_root.Append(FILE_PATH_LITERAL("foobar.txt"));
-  EXPECT_FALSE(PathExists(test_path));
-  CreateTextFile(test_path, L"test file");
-  EXPECT_TRUE(PathExists(test_path));
-  EXPECT_FALSE(DirectoryExists(test_path));
-  EXPECT_TRUE(DeleteFile(test_path, false));
-
-  EXPECT_TRUE(DeleteFile(test_root, true));
-}
-
-TEST_F(FileUtilTest, FileEnumeratorTest) {
-  // Test an empty directory.
-  FileEnumerator f0(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
-  EXPECT_EQ(FPL(""), f0.Next().value());
-  EXPECT_EQ(FPL(""), f0.Next().value());
-
-  // Test an empty directory, non-recursively, including "..".
-  FileEnumerator f0_dotdot(
-      temp_dir_.GetPath(), false,
-      FILES_AND_DIRECTORIES | FileEnumerator::INCLUDE_DOT_DOT);
-  EXPECT_EQ(temp_dir_.GetPath().Append(FPL("..")).value(),
-            f0_dotdot.Next().value());
-  EXPECT_EQ(FPL(""), f0_dotdot.Next().value());
-
-  // create the directories
-  FilePath dir1 = temp_dir_.GetPath().Append(FPL("dir1"));
-  EXPECT_TRUE(CreateDirectory(dir1));
-  FilePath dir2 = temp_dir_.GetPath().Append(FPL("dir2"));
-  EXPECT_TRUE(CreateDirectory(dir2));
-  FilePath dir2inner = dir2.Append(FPL("inner"));
-  EXPECT_TRUE(CreateDirectory(dir2inner));
-
-  // create the files
-  FilePath dir2file = dir2.Append(FPL("dir2file.txt"));
-  CreateTextFile(dir2file, std::wstring());
-  FilePath dir2innerfile = dir2inner.Append(FPL("innerfile.txt"));
-  CreateTextFile(dir2innerfile, std::wstring());
-  FilePath file1 = temp_dir_.GetPath().Append(FPL("file1.txt"));
-  CreateTextFile(file1, std::wstring());
-  FilePath file2_rel = dir2.Append(FilePath::kParentDirectory)
-      .Append(FPL("file2.txt"));
-  CreateTextFile(file2_rel, std::wstring());
-  FilePath file2_abs = temp_dir_.GetPath().Append(FPL("file2.txt"));
-
-  // Only enumerate files.
-  FileEnumerator f1(temp_dir_.GetPath(), true, FileEnumerator::FILES);
-  FindResultCollector c1(&f1);
-  EXPECT_TRUE(c1.HasFile(file1));
-  EXPECT_TRUE(c1.HasFile(file2_abs));
-  EXPECT_TRUE(c1.HasFile(dir2file));
-  EXPECT_TRUE(c1.HasFile(dir2innerfile));
-  EXPECT_EQ(4, c1.size());
-
-  // Only enumerate directories.
-  FileEnumerator f2(temp_dir_.GetPath(), true, FileEnumerator::DIRECTORIES);
-  FindResultCollector c2(&f2);
-  EXPECT_TRUE(c2.HasFile(dir1));
-  EXPECT_TRUE(c2.HasFile(dir2));
-  EXPECT_TRUE(c2.HasFile(dir2inner));
-  EXPECT_EQ(3, c2.size());
-
-  // Only enumerate directories non-recursively.
-  FileEnumerator f2_non_recursive(temp_dir_.GetPath(), false,
-                                  FileEnumerator::DIRECTORIES);
-  FindResultCollector c2_non_recursive(&f2_non_recursive);
-  EXPECT_TRUE(c2_non_recursive.HasFile(dir1));
-  EXPECT_TRUE(c2_non_recursive.HasFile(dir2));
-  EXPECT_EQ(2, c2_non_recursive.size());
-
-  // Only enumerate directories, non-recursively, including "..".
-  FileEnumerator f2_dotdot(
-      temp_dir_.GetPath(), false,
-      FileEnumerator::DIRECTORIES | FileEnumerator::INCLUDE_DOT_DOT);
-  FindResultCollector c2_dotdot(&f2_dotdot);
-  EXPECT_TRUE(c2_dotdot.HasFile(dir1));
-  EXPECT_TRUE(c2_dotdot.HasFile(dir2));
-  EXPECT_TRUE(c2_dotdot.HasFile(temp_dir_.GetPath().Append(FPL(".."))));
-  EXPECT_EQ(3, c2_dotdot.size());
-
-  // Enumerate files and directories.
-  FileEnumerator f3(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
-  FindResultCollector c3(&f3);
-  EXPECT_TRUE(c3.HasFile(dir1));
-  EXPECT_TRUE(c3.HasFile(dir2));
-  EXPECT_TRUE(c3.HasFile(file1));
-  EXPECT_TRUE(c3.HasFile(file2_abs));
-  EXPECT_TRUE(c3.HasFile(dir2file));
-  EXPECT_TRUE(c3.HasFile(dir2inner));
-  EXPECT_TRUE(c3.HasFile(dir2innerfile));
-  EXPECT_EQ(7, c3.size());
-
-  // Non-recursive operation.
-  FileEnumerator f4(temp_dir_.GetPath(), false, FILES_AND_DIRECTORIES);
-  FindResultCollector c4(&f4);
-  EXPECT_TRUE(c4.HasFile(dir2));
-  EXPECT_TRUE(c4.HasFile(dir2));
-  EXPECT_TRUE(c4.HasFile(file1));
-  EXPECT_TRUE(c4.HasFile(file2_abs));
-  EXPECT_EQ(4, c4.size());
-
-  // Enumerate with a pattern.
-  FileEnumerator f5(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES,
-                    FPL("dir*"));
-  FindResultCollector c5(&f5);
-  EXPECT_TRUE(c5.HasFile(dir1));
-  EXPECT_TRUE(c5.HasFile(dir2));
-  EXPECT_TRUE(c5.HasFile(dir2file));
-  EXPECT_TRUE(c5.HasFile(dir2inner));
-  EXPECT_TRUE(c5.HasFile(dir2innerfile));
-  EXPECT_EQ(5, c5.size());
-
-#if defined(OS_WIN)
-  {
-    // Make dir1 point to dir2.
-    ReparsePoint reparse_point(dir1, dir2);
-    EXPECT_TRUE(reparse_point.IsValid());
-
-    // There can be a delay for the enumeration code to see the change on
-    // the file system so skip this test for XP.
-    // Enumerate the reparse point.
-    FileEnumerator f6(dir1, true, FILES_AND_DIRECTORIES);
-    FindResultCollector c6(&f6);
-    FilePath inner2 = dir1.Append(FPL("inner"));
-    EXPECT_TRUE(c6.HasFile(inner2));
-    EXPECT_TRUE(c6.HasFile(inner2.Append(FPL("innerfile.txt"))));
-    EXPECT_TRUE(c6.HasFile(dir1.Append(FPL("dir2file.txt"))));
-    EXPECT_EQ(3, c6.size());
-
-    // No changes for non recursive operation.
-    FileEnumerator f7(temp_dir_.GetPath(), false, FILES_AND_DIRECTORIES);
-    FindResultCollector c7(&f7);
-    EXPECT_TRUE(c7.HasFile(dir2));
-    EXPECT_TRUE(c7.HasFile(dir2));
-    EXPECT_TRUE(c7.HasFile(file1));
-    EXPECT_TRUE(c7.HasFile(file2_abs));
-    EXPECT_EQ(4, c7.size());
-
-    // Should not enumerate inside dir1 when using recursion.
-    FileEnumerator f8(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
-    FindResultCollector c8(&f8);
-    EXPECT_TRUE(c8.HasFile(dir1));
-    EXPECT_TRUE(c8.HasFile(dir2));
-    EXPECT_TRUE(c8.HasFile(file1));
-    EXPECT_TRUE(c8.HasFile(file2_abs));
-    EXPECT_TRUE(c8.HasFile(dir2file));
-    EXPECT_TRUE(c8.HasFile(dir2inner));
-    EXPECT_TRUE(c8.HasFile(dir2innerfile));
-    EXPECT_EQ(7, c8.size());
-  }
-#endif
-
-  // Make sure the destructor closes the find handle while in the middle of a
-  // query to allow TearDown to delete the directory.
-  FileEnumerator f9(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
-  EXPECT_FALSE(f9.Next().value().empty());  // Should have found something
-                                            // (we don't care what).
-}
-
-TEST_F(FileUtilTest, AppendToFile) {
-  FilePath data_dir =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("FilePathTest"));
-
-  // Create a fresh, empty copy of this directory.
-  if (PathExists(data_dir)) {
-    ASSERT_TRUE(DeleteFile(data_dir, true));
-  }
-  ASSERT_TRUE(CreateDirectory(data_dir));
-
-  // Create a fresh, empty copy of this directory.
-  if (PathExists(data_dir)) {
-    ASSERT_TRUE(DeleteFile(data_dir, true));
-  }
-  ASSERT_TRUE(CreateDirectory(data_dir));
-  FilePath foobar(data_dir.Append(FILE_PATH_LITERAL("foobar.txt")));
-
-  std::string data("hello");
-  EXPECT_FALSE(AppendToFile(foobar, data.c_str(), data.size()));
-  EXPECT_EQ(static_cast<int>(data.length()),
-            WriteFile(foobar, data.c_str(), data.length()));
-  EXPECT_TRUE(AppendToFile(foobar, data.c_str(), data.size()));
-
-  const std::wstring read_content = ReadTextFile(foobar);
-  EXPECT_EQ(L"hellohello", read_content);
-}
-
-TEST_F(FileUtilTest, ReadFile) {
-  // Create a test file to be read.
-  const std::string kTestData("The quick brown fox jumps over the lazy dog.");
-  FilePath file_path =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileTest"));
-
-  ASSERT_EQ(static_cast<int>(kTestData.size()),
-            WriteFile(file_path, kTestData.data(), kTestData.size()));
-
-  // Make buffers with various size.
-  std::vector<char> small_buffer(kTestData.size() / 2);
-  std::vector<char> exact_buffer(kTestData.size());
-  std::vector<char> large_buffer(kTestData.size() * 2);
-
-  // Read the file with smaller buffer.
-  int bytes_read_small = ReadFile(
-      file_path, &small_buffer[0], static_cast<int>(small_buffer.size()));
-  EXPECT_EQ(static_cast<int>(small_buffer.size()), bytes_read_small);
-  EXPECT_EQ(
-      std::string(kTestData.begin(), kTestData.begin() + small_buffer.size()),
-      std::string(small_buffer.begin(), small_buffer.end()));
-
-  // Read the file with buffer which have exactly same size.
-  int bytes_read_exact = ReadFile(
-      file_path, &exact_buffer[0], static_cast<int>(exact_buffer.size()));
-  EXPECT_EQ(static_cast<int>(kTestData.size()), bytes_read_exact);
-  EXPECT_EQ(kTestData, std::string(exact_buffer.begin(), exact_buffer.end()));
-
-  // Read the file with larger buffer.
-  int bytes_read_large = ReadFile(
-      file_path, &large_buffer[0], static_cast<int>(large_buffer.size()));
-  EXPECT_EQ(static_cast<int>(kTestData.size()), bytes_read_large);
-  EXPECT_EQ(kTestData, std::string(large_buffer.begin(),
-                                   large_buffer.begin() + kTestData.size()));
-
-  // Make sure the return value is -1 if the file doesn't exist.
-  FilePath file_path_not_exist =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileNotExistTest"));
-  EXPECT_EQ(-1,
-            ReadFile(file_path_not_exist,
-                     &exact_buffer[0],
-                     static_cast<int>(exact_buffer.size())));
-}
-
-TEST_F(FileUtilTest, ReadFileToString) {
-  const char kTestData[] = "0123";
-  std::string data;
-
-  FilePath file_path =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
-  FilePath file_path_dangerous =
-      temp_dir_.GetPath()
-          .Append(FILE_PATH_LITERAL(".."))
-          .Append(temp_dir_.GetPath().BaseName())
-          .Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
-
-  // Create test file.
-  ASSERT_EQ(static_cast<int>(strlen(kTestData)),
-            WriteFile(file_path, kTestData, strlen(kTestData)));
-
-  EXPECT_TRUE(ReadFileToString(file_path, &data));
-  EXPECT_EQ(kTestData, data);
-
-  data = "temp";
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 0));
-  EXPECT_EQ(0u, data.length());
-
-  data = "temp";
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 2));
-  EXPECT_EQ("01", data);
-
-  data = "temp";
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 3));
-  EXPECT_EQ("012", data);
-
-  data = "temp";
-  EXPECT_TRUE(ReadFileToStringWithMaxSize(file_path, &data, 4));
-  EXPECT_EQ("0123", data);
-
-  data = "temp";
-  EXPECT_TRUE(ReadFileToStringWithMaxSize(file_path, &data, 6));
-  EXPECT_EQ("0123", data);
-
-  EXPECT_TRUE(ReadFileToStringWithMaxSize(file_path, nullptr, 6));
-
-  EXPECT_TRUE(ReadFileToString(file_path, nullptr));
-
-  data = "temp";
-  EXPECT_FALSE(ReadFileToString(file_path_dangerous, &data));
-  EXPECT_EQ(0u, data.length());
-
-  // Delete test file.
-  EXPECT_TRUE(DeleteFile(file_path, false));
-
-  data = "temp";
-  EXPECT_FALSE(ReadFileToString(file_path, &data));
-  EXPECT_EQ(0u, data.length());
-
-  data = "temp";
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 6));
-  EXPECT_EQ(0u, data.length());
-}
-
-#if !defined(OS_WIN)
-TEST_F(FileUtilTest, ReadFileToStringWithUnknownFileSize) {
-  FilePath file_path("/dev/zero");
-  std::string data = "temp";
-
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 0));
-  EXPECT_EQ(0u, data.length());
-
-  data = "temp";
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 2));
-  EXPECT_EQ(std::string(2, '\0'), data);
-
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, nullptr, 6));
-
-  // Read more than buffer size.
-  data = "temp";
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, kLargeFileSize));
-  EXPECT_EQ(kLargeFileSize, data.length());
-  EXPECT_EQ(std::string(kLargeFileSize, '\0'), data);
-
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, nullptr, kLargeFileSize));
-}
-#endif  // !defined(OS_WIN)
-
-#if !defined(OS_WIN) && !defined(OS_NACL) && !defined(OS_FUCHSIA) && \
-    !defined(OS_IOS)
-#define ChildMain WriteToPipeChildMain
-#define ChildMainString "WriteToPipeChildMain"
-
-MULTIPROCESS_TEST_MAIN(ChildMain) {
-  const char kTestData[] = "0123";
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
-
-  int fd = open(pipe_path.value().c_str(), O_WRONLY);
-  CHECK_NE(-1, fd);
-  size_t written = 0;
-  while (written < strlen(kTestData)) {
-    ssize_t res = write(fd, kTestData + written, strlen(kTestData) - written);
-    if (res == -1)
-      break;
-    written += res;
-  }
-  CHECK_EQ(strlen(kTestData), written);
-  CHECK_EQ(0, close(fd));
-  return 0;
-}
-
-#define MoreThanBufferSizeChildMain WriteToPipeMoreThanBufferSizeChildMain
-#define MoreThanBufferSizeChildMainString \
-  "WriteToPipeMoreThanBufferSizeChildMain"
-
-MULTIPROCESS_TEST_MAIN(MoreThanBufferSizeChildMain) {
-  std::string data(kLargeFileSize, 'c');
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
-
-  int fd = open(pipe_path.value().c_str(), O_WRONLY);
-  CHECK_NE(-1, fd);
-
-  size_t written = 0;
-  while (written < data.size()) {
-    ssize_t res = write(fd, data.c_str() + written, data.size() - written);
-    if (res == -1) {
-      // We are unable to write because reading process has already read
-      // requested number of bytes and closed pipe.
-      break;
-    }
-    written += res;
-  }
-  CHECK_EQ(0, close(fd));
-  return 0;
-}
-
-TEST_F(FileUtilTest, ReadFileToStringWithNamedPipe) {
-  FilePath pipe_path =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("test_pipe"));
-  ASSERT_EQ(0, mkfifo(pipe_path.value().c_str(), 0600));
-
-  base::CommandLine child_command_line(
-      base::GetMultiProcessTestChildBaseCommandLine());
-  child_command_line.AppendSwitchPath("pipe-path", pipe_path);
-
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        ChildMainString, child_command_line, base::LaunchOptions());
-    ASSERT_TRUE(child_process.IsValid());
-
-    std::string data = "temp";
-    EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 2));
-    EXPECT_EQ("01", data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        ChildMainString, child_command_line, base::LaunchOptions());
-    ASSERT_TRUE(child_process.IsValid());
-
-    std::string data = "temp";
-    EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
-    EXPECT_EQ("0123", data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        MoreThanBufferSizeChildMainString, child_command_line,
-        base::LaunchOptions());
-    ASSERT_TRUE(child_process.IsValid());
-
-    std::string data = "temp";
-    EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
-    EXPECT_EQ("cccccc", data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        MoreThanBufferSizeChildMainString, child_command_line,
-        base::LaunchOptions());
-    ASSERT_TRUE(child_process.IsValid());
-
-    std::string data = "temp";
-    EXPECT_FALSE(
-        ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize - 1));
-    EXPECT_EQ(std::string(kLargeFileSize - 1, 'c'), data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        MoreThanBufferSizeChildMainString, child_command_line,
-        base::LaunchOptions());
-    ASSERT_TRUE(child_process.IsValid());
-
-    std::string data = "temp";
-    EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize));
-    EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        MoreThanBufferSizeChildMainString, child_command_line,
-        base::LaunchOptions());
-    ASSERT_TRUE(child_process.IsValid());
-
-    std::string data = "temp";
-    EXPECT_TRUE(
-        ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize * 5));
-    EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-
-  ASSERT_EQ(0, unlink(pipe_path.value().c_str()));
-}
-#endif  // !defined(OS_WIN) && !defined(OS_NACL) && !defined(OS_FUCHSIA) &&
-        // !defined(OS_IOS)
-
-#if defined(OS_WIN)
-#define ChildMain WriteToPipeChildMain
-#define ChildMainString "WriteToPipeChildMain"
-
-MULTIPROCESS_TEST_MAIN(ChildMain) {
-  const char kTestData[] = "0123";
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
-  std::string switch_string = command_line->GetSwitchValueASCII("sync_event");
-  EXPECT_FALSE(switch_string.empty());
-  unsigned int switch_uint = 0;
-  EXPECT_TRUE(StringToUint(switch_string, &switch_uint));
-  win::ScopedHandle sync_event(win::Uint32ToHandle(switch_uint));
-
-  HANDLE ph = CreateNamedPipe(pipe_path.value().c_str(), PIPE_ACCESS_OUTBOUND,
-                              PIPE_WAIT, 1, 0, 0, 0, NULL);
-  EXPECT_NE(ph, INVALID_HANDLE_VALUE);
-  EXPECT_TRUE(SetEvent(sync_event.Get()));
-  EXPECT_TRUE(ConnectNamedPipe(ph, NULL));
-
-  DWORD written;
-  EXPECT_TRUE(::WriteFile(ph, kTestData, strlen(kTestData), &written, NULL));
-  EXPECT_EQ(strlen(kTestData), written);
-  CloseHandle(ph);
-  return 0;
-}
-
-#define MoreThanBufferSizeChildMain WriteToPipeMoreThanBufferSizeChildMain
-#define MoreThanBufferSizeChildMainString \
-  "WriteToPipeMoreThanBufferSizeChildMain"
-
-MULTIPROCESS_TEST_MAIN(MoreThanBufferSizeChildMain) {
-  std::string data(kLargeFileSize, 'c');
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
-  std::string switch_string = command_line->GetSwitchValueASCII("sync_event");
-  EXPECT_FALSE(switch_string.empty());
-  unsigned int switch_uint = 0;
-  EXPECT_TRUE(StringToUint(switch_string, &switch_uint));
-  win::ScopedHandle sync_event(win::Uint32ToHandle(switch_uint));
-
-  HANDLE ph = CreateNamedPipe(pipe_path.value().c_str(), PIPE_ACCESS_OUTBOUND,
-                              PIPE_WAIT, 1, data.size(), data.size(), 0, NULL);
-  EXPECT_NE(ph, INVALID_HANDLE_VALUE);
-  EXPECT_TRUE(SetEvent(sync_event.Get()));
-  EXPECT_TRUE(ConnectNamedPipe(ph, NULL));
-
-  DWORD written;
-  EXPECT_TRUE(::WriteFile(ph, data.c_str(), data.size(), &written, NULL));
-  EXPECT_EQ(data.size(), written);
-  CloseHandle(ph);
-  return 0;
-}
-
-TEST_F(FileUtilTest, ReadFileToStringWithNamedPipe) {
-  FilePath pipe_path(FILE_PATH_LITERAL("\\\\.\\pipe\\test_pipe"));
-  win::ScopedHandle sync_event(CreateEvent(0, false, false, nullptr));
-
-  base::CommandLine child_command_line(
-      base::GetMultiProcessTestChildBaseCommandLine());
-  child_command_line.AppendSwitchPath("pipe-path", pipe_path);
-  child_command_line.AppendSwitchASCII(
-      "sync_event", UintToString(win::HandleToUint32(sync_event.Get())));
-
-  base::LaunchOptions options;
-  options.handles_to_inherit.push_back(sync_event.Get());
-
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        ChildMainString, child_command_line, options);
-    ASSERT_TRUE(child_process.IsValid());
-    // Wait for pipe creation in child process.
-    EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
-
-    std::string data = "temp";
-    EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 2));
-    EXPECT_EQ("01", data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        ChildMainString, child_command_line, options);
-    ASSERT_TRUE(child_process.IsValid());
-    // Wait for pipe creation in child process.
-    EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
-
-    std::string data = "temp";
-    EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
-    EXPECT_EQ("0123", data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        MoreThanBufferSizeChildMainString, child_command_line, options);
-    ASSERT_TRUE(child_process.IsValid());
-    // Wait for pipe creation in child process.
-    EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
-
-    std::string data = "temp";
-    EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
-    EXPECT_EQ("cccccc", data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        MoreThanBufferSizeChildMainString, child_command_line, options);
-    ASSERT_TRUE(child_process.IsValid());
-    // Wait for pipe creation in child process.
-    EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
-
-    std::string data = "temp";
-    EXPECT_FALSE(
-        ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize - 1));
-    EXPECT_EQ(std::string(kLargeFileSize - 1, 'c'), data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        MoreThanBufferSizeChildMainString, child_command_line, options);
-    ASSERT_TRUE(child_process.IsValid());
-    // Wait for pipe creation in child process.
-    EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
-
-    std::string data = "temp";
-    EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize));
-    EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-  {
-    base::Process child_process = base::SpawnMultiProcessTestChild(
-        MoreThanBufferSizeChildMainString, child_command_line, options);
-    ASSERT_TRUE(child_process.IsValid());
-    // Wait for pipe creation in child process.
-    EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
-
-    std::string data = "temp";
-    EXPECT_TRUE(
-        ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize * 5));
-    EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
-
-    int rv = -1;
-    ASSERT_TRUE(WaitForMultiprocessTestChildExit(
-        child_process, TestTimeouts::action_timeout(), &rv));
-    ASSERT_EQ(0, rv);
-  }
-}
-#endif  // defined(OS_WIN)
-
-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_FUCHSIA)
-TEST_F(FileUtilTest, ReadFileToStringWithProcFileSystem) {
-  FilePath file_path("/proc/cpuinfo");
-  std::string data = "temp";
-
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 0));
-  EXPECT_EQ(0u, data.length());
-
-  data = "temp";
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 2));
-#if defined(OS_ANDROID)
-  EXPECT_EQ("Pr", data);
-#else
-  EXPECT_EQ("pr", data);
-#endif
-
-  data = "temp";
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 4));
-#if defined(OS_ANDROID)
-  EXPECT_EQ("Proc", data);
-#else
-  EXPECT_EQ("proc", data);
-#endif
-
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, nullptr, 4));
-}
-#endif  // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_FUCHSIA)
-
-TEST_F(FileUtilTest, ReadFileToStringWithLargeFile) {
-  std::string data(kLargeFileSize, 'c');
-
-  FilePath file_path =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
-
-  // Create test file.
-  ASSERT_EQ(static_cast<int>(kLargeFileSize),
-            WriteFile(file_path, data.c_str(), kLargeFileSize));
-
-  std::string actual_data = "temp";
-  EXPECT_TRUE(ReadFileToString(file_path, &actual_data));
-  EXPECT_EQ(data, actual_data);
-
-  actual_data = "temp";
-  EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &actual_data, 0));
-  EXPECT_EQ(0u, actual_data.length());
-
-  // Read more than buffer size.
-  actual_data = "temp";
-  EXPECT_FALSE(
-      ReadFileToStringWithMaxSize(file_path, &actual_data, kLargeFileSize - 1));
-  EXPECT_EQ(std::string(kLargeFileSize - 1, 'c'), actual_data);
-}
-
-TEST_F(FileUtilTest, TouchFile) {
-  FilePath data_dir =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("FilePathTest"));
-
-  // Create a fresh, empty copy of this directory.
-  if (PathExists(data_dir)) {
-    ASSERT_TRUE(DeleteFile(data_dir, true));
-  }
-  ASSERT_TRUE(CreateDirectory(data_dir));
-
-  FilePath foobar(data_dir.Append(FILE_PATH_LITERAL("foobar.txt")));
-  std::string data("hello");
-  ASSERT_EQ(static_cast<int>(data.length()),
-            WriteFile(foobar, data.c_str(), data.length()));
-
-  Time access_time;
-  // This timestamp is divisible by one day (in local timezone),
-  // to make it work on FAT too.
-  ASSERT_TRUE(Time::FromString("Wed, 16 Nov 1994, 00:00:00",
-                               &access_time));
-
-  Time modification_time;
-  // Note that this timestamp is divisible by two (seconds) - FAT stores
-  // modification times with 2s resolution.
-  ASSERT_TRUE(Time::FromString("Tue, 15 Nov 1994, 12:45:26 GMT",
-              &modification_time));
-
-  ASSERT_TRUE(TouchFile(foobar, access_time, modification_time));
-  File::Info file_info;
-  ASSERT_TRUE(GetFileInfo(foobar, &file_info));
-#if !defined(OS_FUCHSIA)
-  // Access time is not supported on Fuchsia, see https://crbug.com/735233.
-  EXPECT_EQ(access_time.ToInternalValue(),
-            file_info.last_accessed.ToInternalValue());
-#endif
-  EXPECT_EQ(modification_time.ToInternalValue(),
-            file_info.last_modified.ToInternalValue());
-}
-
-TEST_F(FileUtilTest, IsDirectoryEmpty) {
-  FilePath empty_dir =
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("EmptyDir"));
-
-  ASSERT_FALSE(PathExists(empty_dir));
-
-  ASSERT_TRUE(CreateDirectory(empty_dir));
-
-  EXPECT_TRUE(IsDirectoryEmpty(empty_dir));
-
-  FilePath foo(empty_dir.Append(FILE_PATH_LITERAL("foo.txt")));
-  std::string bar("baz");
-  ASSERT_EQ(static_cast<int>(bar.length()),
-            WriteFile(foo, bar.c_str(), bar.length()));
-
-  EXPECT_FALSE(IsDirectoryEmpty(empty_dir));
-}
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-
-TEST_F(FileUtilTest, SetNonBlocking) {
-  const int kInvalidFd = 99999;
-  EXPECT_FALSE(SetNonBlocking(kInvalidFd));
-
-  base::FilePath path;
-  ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &path));
-  path = path.Append(FPL("file_util")).Append(FPL("original.txt"));
-  ScopedFD fd(open(path.value().c_str(), O_RDONLY));
-  ASSERT_GE(fd.get(), 0);
-  EXPECT_TRUE(SetNonBlocking(fd.get()));
-}
-
-TEST_F(FileUtilTest, SetCloseOnExec) {
-  const int kInvalidFd = 99999;
-  EXPECT_FALSE(SetCloseOnExec(kInvalidFd));
-
-  base::FilePath path;
-  ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &path));
-  path = path.Append(FPL("file_util")).Append(FPL("original.txt"));
-  ScopedFD fd(open(path.value().c_str(), O_RDONLY));
-  ASSERT_GE(fd.get(), 0);
-  EXPECT_TRUE(SetCloseOnExec(fd.get()));
-}
-
-#endif
-
-#if defined(OS_POSIX)
-
-// Testing VerifyPathControlledByAdmin() is hard, because there is no
-// way a test can make a file owned by root, or change file paths
-// at the root of the file system.  VerifyPathControlledByAdmin()
-// is implemented as a call to VerifyPathControlledByUser, which gives
-// us the ability to test with paths under the test's temp directory,
-// using a user id we control.
-// Pull tests of VerifyPathControlledByUserTest() into a separate test class
-// with a common SetUp() method.
-class VerifyPathControlledByUserTest : public FileUtilTest {
- protected:
-  void SetUp() override {
-    FileUtilTest::SetUp();
-
-    // Create a basic structure used by each test.
-    // base_dir_
-    //  |-> sub_dir_
-    //       |-> text_file_
-
-    base_dir_ = temp_dir_.GetPath().AppendASCII("base_dir");
-    ASSERT_TRUE(CreateDirectory(base_dir_));
-
-    sub_dir_ = base_dir_.AppendASCII("sub_dir");
-    ASSERT_TRUE(CreateDirectory(sub_dir_));
-
-    text_file_ = sub_dir_.AppendASCII("file.txt");
-    CreateTextFile(text_file_, L"This text file has some text in it.");
-
-    // Get the user and group files are created with from |base_dir_|.
-    struct stat stat_buf;
-    ASSERT_EQ(0, stat(base_dir_.value().c_str(), &stat_buf));
-    uid_ = stat_buf.st_uid;
-    ok_gids_.insert(stat_buf.st_gid);
-    bad_gids_.insert(stat_buf.st_gid + 1);
-
-    ASSERT_EQ(uid_, getuid());  // This process should be the owner.
-
-    // To ensure that umask settings do not cause the initial state
-    // of permissions to be different from what we expect, explicitly
-    // set permissions on the directories we create.
-    // Make all files and directories non-world-writable.
-
-    // Users and group can read, write, traverse
-    int enabled_permissions =
-        FILE_PERMISSION_USER_MASK | FILE_PERMISSION_GROUP_MASK;
-    // Other users can't read, write, traverse
-    int disabled_permissions = FILE_PERMISSION_OTHERS_MASK;
-
-    ASSERT_NO_FATAL_FAILURE(
-        ChangePosixFilePermissions(
-            base_dir_, enabled_permissions, disabled_permissions));
-    ASSERT_NO_FATAL_FAILURE(
-        ChangePosixFilePermissions(
-            sub_dir_, enabled_permissions, disabled_permissions));
-  }
-
-  FilePath base_dir_;
-  FilePath sub_dir_;
-  FilePath text_file_;
-  uid_t uid_;
-
-  std::set<gid_t> ok_gids_;
-  std::set<gid_t> bad_gids_;
-};
-
-TEST_F(VerifyPathControlledByUserTest, BadPaths) {
-  // File does not exist.
-  FilePath does_not_exist = base_dir_.AppendASCII("does")
-                                     .AppendASCII("not")
-                                     .AppendASCII("exist");
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, does_not_exist, uid_, ok_gids_));
-
-  // |base| not a subpath of |path|.
-  EXPECT_FALSE(VerifyPathControlledByUser(sub_dir_, base_dir_, uid_, ok_gids_));
-
-  // An empty base path will fail to be a prefix for any path.
-  FilePath empty;
-  EXPECT_FALSE(VerifyPathControlledByUser(empty, base_dir_, uid_, ok_gids_));
-
-  // Finding that a bad call fails proves nothing unless a good call succeeds.
-  EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
-}
-
-TEST_F(VerifyPathControlledByUserTest, Symlinks) {
-  // Symlinks in the path should cause failure.
-
-  // Symlink to the file at the end of the path.
-  FilePath file_link =  base_dir_.AppendASCII("file_link");
-  ASSERT_TRUE(CreateSymbolicLink(text_file_, file_link))
-      << "Failed to create symlink.";
-
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, file_link, uid_, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(file_link, file_link, uid_, ok_gids_));
-
-  // Symlink from one directory to another within the path.
-  FilePath link_to_sub_dir =  base_dir_.AppendASCII("link_to_sub_dir");
-  ASSERT_TRUE(CreateSymbolicLink(sub_dir_, link_to_sub_dir))
-    << "Failed to create symlink.";
-
-  FilePath file_path_with_link = link_to_sub_dir.AppendASCII("file.txt");
-  ASSERT_TRUE(PathExists(file_path_with_link));
-
-  EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, file_path_with_link, uid_,
-                                          ok_gids_));
-
-  EXPECT_FALSE(VerifyPathControlledByUser(link_to_sub_dir, file_path_with_link,
-                                          uid_, ok_gids_));
-
-  // Symlinks in parents of base path are allowed.
-  EXPECT_TRUE(VerifyPathControlledByUser(file_path_with_link,
-                                         file_path_with_link, uid_, ok_gids_));
-}
-
-TEST_F(VerifyPathControlledByUserTest, OwnershipChecks) {
-  // Get a uid that is not the uid of files we create.
-  uid_t bad_uid = uid_ + 1;
-
-  // Make all files and directories non-world-writable.
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
-
-  // We control these paths.
-  EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
-  EXPECT_TRUE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
-  EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
-
-  // Another user does not control these paths.
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, sub_dir_, bad_uid, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, text_file_, bad_uid, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(sub_dir_, text_file_, bad_uid, ok_gids_));
-
-  // Another group does not control the paths.
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, bad_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, bad_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(sub_dir_, text_file_, uid_, bad_gids_));
-}
-
-TEST_F(VerifyPathControlledByUserTest, GroupWriteTest) {
-  // Make all files and directories writable only by their owner.
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH|S_IWGRP));
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH|S_IWGRP));
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(text_file_, 0u, S_IWOTH|S_IWGRP));
-
-  // Any group is okay because the path is not group-writable.
-  EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
-  EXPECT_TRUE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
-  EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
-
-  EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, bad_gids_));
-  EXPECT_TRUE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, bad_gids_));
-  EXPECT_TRUE(
-      VerifyPathControlledByUser(sub_dir_, text_file_, uid_, bad_gids_));
-
-  // No group is okay, because we don't check the group
-  // if no group can write.
-  std::set<gid_t> no_gids;  // Empty set of gids.
-  EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, no_gids));
-  EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, text_file_, uid_, no_gids));
-  EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, no_gids));
-
-  // Make all files and directories writable by their group.
-  ASSERT_NO_FATAL_FAILURE(ChangePosixFilePermissions(base_dir_, S_IWGRP, 0u));
-  ASSERT_NO_FATAL_FAILURE(ChangePosixFilePermissions(sub_dir_, S_IWGRP, 0u));
-  ASSERT_NO_FATAL_FAILURE(ChangePosixFilePermissions(text_file_, S_IWGRP, 0u));
-
-  // Now |ok_gids_| works, but |bad_gids_| fails.
-  EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
-  EXPECT_TRUE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
-  EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
-
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, bad_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, bad_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(sub_dir_, text_file_, uid_, bad_gids_));
-
-  // Because any group in the group set is allowed,
-  // the union of good and bad gids passes.
-
-  std::set<gid_t> multiple_gids;
-  std::set_union(
-      ok_gids_.begin(), ok_gids_.end(),
-      bad_gids_.begin(), bad_gids_.end(),
-      std::inserter(multiple_gids, multiple_gids.begin()));
-
-  EXPECT_TRUE(
-      VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, multiple_gids));
-  EXPECT_TRUE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, multiple_gids));
-  EXPECT_TRUE(
-      VerifyPathControlledByUser(sub_dir_, text_file_, uid_, multiple_gids));
-}
-
-TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) {
-  // Make all files and directories non-world-writable.
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
-
-  // Initialy, we control all parts of the path.
-  EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
-  EXPECT_TRUE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
-  EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
-
-  // Make base_dir_ world-writable.
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(base_dir_, S_IWOTH, 0u));
-  EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
-  EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
-
-  // Make sub_dir_ world writable.
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(sub_dir_, S_IWOTH, 0u));
-  EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
-
-  // Make text_file_ world writable.
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(text_file_, S_IWOTH, 0u));
-  EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
-
-  // Make sub_dir_ non-world writable.
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
-  EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
-
-  // Make base_dir_ non-world-writable.
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
-  EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
-  EXPECT_FALSE(
-      VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
-
-  // Back to the initial state: Nothing is writable, so every path
-  // should pass.
-  ASSERT_NO_FATAL_FAILURE(
-      ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
-  EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
-  EXPECT_TRUE(
-      VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
-  EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
-}
-
-#endif  // defined(OS_POSIX)
-
-#if defined(OS_ANDROID)
-TEST_F(FileUtilTest, ValidContentUriTest) {
-  // Get the test image path.
-  FilePath data_dir;
-  ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
-  data_dir = data_dir.AppendASCII("file_util");
-  ASSERT_TRUE(PathExists(data_dir));
-  FilePath image_file = data_dir.Append(FILE_PATH_LITERAL("red.png"));
-  int64_t image_size;
-  GetFileSize(image_file, &image_size);
-  ASSERT_GT(image_size, 0);
-
-  // Insert the image into MediaStore. MediaStore will do some conversions, and
-  // return the content URI.
-  FilePath path = InsertImageIntoMediaStore(image_file);
-  EXPECT_TRUE(path.IsContentUri());
-  EXPECT_TRUE(PathExists(path));
-  // The file size may not equal to the input image as MediaStore may convert
-  // the image.
-  int64_t content_uri_size;
-  GetFileSize(path, &content_uri_size);
-  EXPECT_EQ(image_size, content_uri_size);
-
-  // We should be able to read the file.
-  File file = OpenContentUriForRead(path);
-  EXPECT_TRUE(file.IsValid());
-  auto buffer = std::make_unique<char[]>(image_size);
-  EXPECT_TRUE(file.ReadAtCurrentPos(buffer.get(), image_size));
-}
-
-TEST_F(FileUtilTest, NonExistentContentUriTest) {
-  FilePath path("content://foo.bar");
-  EXPECT_TRUE(path.IsContentUri());
-  EXPECT_FALSE(PathExists(path));
-  // Size should be smaller than 0.
-  int64_t size;
-  EXPECT_FALSE(GetFileSize(path, &size));
-
-  // We should not be able to read the file.
-  File file = OpenContentUriForRead(path);
-  EXPECT_FALSE(file.IsValid());
-}
-#endif
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-
-TEST(ScopedFD, ScopedFDDoesClose) {
-  int fds[2];
-  char c = 0;
-  ASSERT_EQ(0, pipe(fds));
-  const int write_end = fds[1];
-  ScopedFD read_end_closer(fds[0]);
-  {
-    ScopedFD write_end_closer(fds[1]);
-  }
-  // This is the only thread. This file descriptor should no longer be valid.
-  int ret = close(write_end);
-  EXPECT_EQ(-1, ret);
-  EXPECT_EQ(EBADF, errno);
-  // Make sure read(2) won't block.
-  ASSERT_EQ(0, fcntl(fds[0], F_SETFL, O_NONBLOCK));
-  // Reading the pipe should EOF.
-  EXPECT_EQ(0, read(fds[0], &c, 1));
-}
-
-#if defined(GTEST_HAS_DEATH_TEST)
-void CloseWithScopedFD(int fd) {
-  ScopedFD fd_closer(fd);
-}
-#endif
-
-TEST(ScopedFD, ScopedFDCrashesOnCloseFailure) {
-  int fds[2];
-  ASSERT_EQ(0, pipe(fds));
-  ScopedFD read_end_closer(fds[0]);
-  EXPECT_EQ(0, IGNORE_EINTR(close(fds[1])));
-#if defined(GTEST_HAS_DEATH_TEST)
-  // This is the only thread. This file descriptor should no longer be valid.
-  // Trying to close it should crash. This is important for security.
-  EXPECT_DEATH(CloseWithScopedFD(fds[1]), "");
-#endif
-}
-
-#endif  // defined(OS_POSIX) || defined(OS_FUCHSIA)
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/files/important_file_writer_unittest.cc b/base/files/important_file_writer_unittest.cc
deleted file mode 100644
index 493fb36..0000000
--- a/base/files/important_file_writer_unittest.cc
+++ /dev/null
@@ -1,351 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/important_file_writer.h"
-
-#include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/test/histogram_tester.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "base/timer/mock_timer.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-std::string GetFileContent(const FilePath& path) {
-  std::string content;
-  if (!ReadFileToString(path, &content)) {
-    NOTREACHED();
-  }
-  return content;
-}
-
-class DataSerializer : public ImportantFileWriter::DataSerializer {
- public:
-  explicit DataSerializer(const std::string& data) : data_(data) {
-  }
-
-  bool SerializeData(std::string* output) override {
-    output->assign(data_);
-    return true;
-  }
-
- private:
-  const std::string data_;
-};
-
-class FailingDataSerializer : public ImportantFileWriter::DataSerializer {
- public:
-  bool SerializeData(std::string* output) override { return false; }
-};
-
-enum WriteCallbackObservationState {
-  NOT_CALLED,
-  CALLED_WITH_ERROR,
-  CALLED_WITH_SUCCESS,
-};
-
-class WriteCallbacksObserver {
- public:
-  WriteCallbacksObserver() = default;
-
-  // Register OnBeforeWrite() and OnAfterWrite() to be called on the next write
-  // of |writer|.
-  void ObserveNextWriteCallbacks(ImportantFileWriter* writer);
-
-  // Returns the |WriteCallbackObservationState| which was observed, then resets
-  // it to |NOT_CALLED|.
-  WriteCallbackObservationState GetAndResetObservationState();
-
- private:
-  void OnBeforeWrite() {
-    EXPECT_FALSE(before_write_called_);
-    before_write_called_ = true;
-  }
-
-  void OnAfterWrite(bool success) {
-    EXPECT_EQ(NOT_CALLED, after_write_observation_state_);
-    after_write_observation_state_ =
-        success ? CALLED_WITH_SUCCESS : CALLED_WITH_ERROR;
-  }
-
-  bool before_write_called_ = false;
-  WriteCallbackObservationState after_write_observation_state_ = NOT_CALLED;
-
-  DISALLOW_COPY_AND_ASSIGN(WriteCallbacksObserver);
-};
-
-void WriteCallbacksObserver::ObserveNextWriteCallbacks(
-    ImportantFileWriter* writer) {
-  writer->RegisterOnNextWriteCallbacks(
-      base::Bind(&WriteCallbacksObserver::OnBeforeWrite,
-                 base::Unretained(this)),
-      base::Bind(&WriteCallbacksObserver::OnAfterWrite,
-                 base::Unretained(this)));
-}
-
-WriteCallbackObservationState
-WriteCallbacksObserver::GetAndResetObservationState() {
-  EXPECT_EQ(after_write_observation_state_ != NOT_CALLED, before_write_called_)
-      << "The before-write callback should always be called before the "
-         "after-write callback";
-
-  WriteCallbackObservationState state = after_write_observation_state_;
-  before_write_called_ = false;
-  after_write_observation_state_ = NOT_CALLED;
-  return state;
-}
-
-}  // namespace
-
-class ImportantFileWriterTest : public testing::Test {
- public:
-  ImportantFileWriterTest() = default;
-  void SetUp() override {
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-    file_ = temp_dir_.GetPath().AppendASCII("test-file");
-  }
-
- protected:
-  WriteCallbacksObserver write_callback_observer_;
-  FilePath file_;
-  MessageLoop loop_;
-
- private:
-  ScopedTempDir temp_dir_;
-};
-
-TEST_F(ImportantFileWriterTest, Basic) {
-  ImportantFileWriter writer(file_, ThreadTaskRunnerHandle::Get());
-  EXPECT_FALSE(PathExists(writer.path()));
-  EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
-  writer.WriteNow(std::make_unique<std::string>("foo"));
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
-  ASSERT_TRUE(PathExists(writer.path()));
-  EXPECT_EQ("foo", GetFileContent(writer.path()));
-}
-
-TEST_F(ImportantFileWriterTest, WriteWithObserver) {
-  ImportantFileWriter writer(file_, ThreadTaskRunnerHandle::Get());
-  EXPECT_FALSE(PathExists(writer.path()));
-  EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
-
-  // Confirm that the observer is invoked.
-  write_callback_observer_.ObserveNextWriteCallbacks(&writer);
-  writer.WriteNow(std::make_unique<std::string>("foo"));
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(CALLED_WITH_SUCCESS,
-            write_callback_observer_.GetAndResetObservationState());
-  ASSERT_TRUE(PathExists(writer.path()));
-  EXPECT_EQ("foo", GetFileContent(writer.path()));
-
-  // Confirm that re-installing the observer works for another write.
-  EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
-  write_callback_observer_.ObserveNextWriteCallbacks(&writer);
-  writer.WriteNow(std::make_unique<std::string>("bar"));
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(CALLED_WITH_SUCCESS,
-            write_callback_observer_.GetAndResetObservationState());
-  ASSERT_TRUE(PathExists(writer.path()));
-  EXPECT_EQ("bar", GetFileContent(writer.path()));
-
-  // Confirm that writing again without re-installing the observer doesn't
-  // result in a notification.
-  EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
-  writer.WriteNow(std::make_unique<std::string>("baz"));
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
-  ASSERT_TRUE(PathExists(writer.path()));
-  EXPECT_EQ("baz", GetFileContent(writer.path()));
-}
-
-TEST_F(ImportantFileWriterTest, FailedWriteWithObserver) {
-  // Use an invalid file path (relative paths are invalid) to get a
-  // FILE_ERROR_ACCESS_DENIED error when trying to write the file.
-  ImportantFileWriter writer(FilePath().AppendASCII("bad/../path"),
-                             ThreadTaskRunnerHandle::Get());
-  EXPECT_FALSE(PathExists(writer.path()));
-  EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
-  write_callback_observer_.ObserveNextWriteCallbacks(&writer);
-  writer.WriteNow(std::make_unique<std::string>("foo"));
-  RunLoop().RunUntilIdle();
-
-  // Confirm that the write observer was invoked with its boolean parameter set
-  // to false.
-  EXPECT_EQ(CALLED_WITH_ERROR,
-            write_callback_observer_.GetAndResetObservationState());
-  EXPECT_FALSE(PathExists(writer.path()));
-}
-
-TEST_F(ImportantFileWriterTest, CallbackRunsOnWriterThread) {
-  base::Thread file_writer_thread("ImportantFileWriter test thread");
-  file_writer_thread.Start();
-  ImportantFileWriter writer(file_, file_writer_thread.task_runner());
-  EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
-
-  // Block execution on |file_writer_thread| to verify that callbacks are
-  // executed on it.
-  base::WaitableEvent wait_helper(
-      base::WaitableEvent::ResetPolicy::MANUAL,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  file_writer_thread.task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&base::WaitableEvent::Wait,
-                                base::Unretained(&wait_helper)));
-
-  write_callback_observer_.ObserveNextWriteCallbacks(&writer);
-  writer.WriteNow(std::make_unique<std::string>("foo"));
-  RunLoop().RunUntilIdle();
-
-  // Expect the callback to not have been executed before the
-  // |file_writer_thread| is unblocked.
-  EXPECT_EQ(NOT_CALLED, write_callback_observer_.GetAndResetObservationState());
-
-  wait_helper.Signal();
-  file_writer_thread.FlushForTesting();
-
-  EXPECT_EQ(CALLED_WITH_SUCCESS,
-            write_callback_observer_.GetAndResetObservationState());
-  ASSERT_TRUE(PathExists(writer.path()));
-  EXPECT_EQ("foo", GetFileContent(writer.path()));
-}
-
-TEST_F(ImportantFileWriterTest, ScheduleWrite) {
-  constexpr TimeDelta kCommitInterval = TimeDelta::FromSeconds(12345);
-  MockTimer timer(true, false);
-  ImportantFileWriter writer(file_, ThreadTaskRunnerHandle::Get(),
-                             kCommitInterval);
-  writer.SetTimerForTesting(&timer);
-  EXPECT_FALSE(writer.HasPendingWrite());
-  DataSerializer serializer("foo");
-  writer.ScheduleWrite(&serializer);
-  EXPECT_TRUE(writer.HasPendingWrite());
-  ASSERT_TRUE(timer.IsRunning());
-  EXPECT_EQ(kCommitInterval, timer.GetCurrentDelay());
-  timer.Fire();
-  EXPECT_FALSE(writer.HasPendingWrite());
-  EXPECT_FALSE(timer.IsRunning());
-  RunLoop().RunUntilIdle();
-  ASSERT_TRUE(PathExists(writer.path()));
-  EXPECT_EQ("foo", GetFileContent(writer.path()));
-}
-
-TEST_F(ImportantFileWriterTest, DoScheduledWrite) {
-  MockTimer timer(true, false);
-  ImportantFileWriter writer(file_, ThreadTaskRunnerHandle::Get());
-  writer.SetTimerForTesting(&timer);
-  EXPECT_FALSE(writer.HasPendingWrite());
-  DataSerializer serializer("foo");
-  writer.ScheduleWrite(&serializer);
-  EXPECT_TRUE(writer.HasPendingWrite());
-  writer.DoScheduledWrite();
-  EXPECT_FALSE(writer.HasPendingWrite());
-  RunLoop().RunUntilIdle();
-  ASSERT_TRUE(PathExists(writer.path()));
-  EXPECT_EQ("foo", GetFileContent(writer.path()));
-}
-
-TEST_F(ImportantFileWriterTest, BatchingWrites) {
-  MockTimer timer(true, false);
-  ImportantFileWriter writer(file_, ThreadTaskRunnerHandle::Get());
-  writer.SetTimerForTesting(&timer);
-  DataSerializer foo("foo"), bar("bar"), baz("baz");
-  writer.ScheduleWrite(&foo);
-  writer.ScheduleWrite(&bar);
-  writer.ScheduleWrite(&baz);
-  ASSERT_TRUE(timer.IsRunning());
-  timer.Fire();
-  RunLoop().RunUntilIdle();
-  ASSERT_TRUE(PathExists(writer.path()));
-  EXPECT_EQ("baz", GetFileContent(writer.path()));
-}
-
-TEST_F(ImportantFileWriterTest, ScheduleWrite_FailToSerialize) {
-  MockTimer timer(true, false);
-  ImportantFileWriter writer(file_, ThreadTaskRunnerHandle::Get());
-  writer.SetTimerForTesting(&timer);
-  EXPECT_FALSE(writer.HasPendingWrite());
-  FailingDataSerializer serializer;
-  writer.ScheduleWrite(&serializer);
-  EXPECT_TRUE(writer.HasPendingWrite());
-  ASSERT_TRUE(timer.IsRunning());
-  timer.Fire();
-  EXPECT_FALSE(writer.HasPendingWrite());
-  RunLoop().RunUntilIdle();
-  EXPECT_FALSE(PathExists(writer.path()));
-}
-
-TEST_F(ImportantFileWriterTest, ScheduleWrite_WriteNow) {
-  MockTimer timer(true, false);
-  ImportantFileWriter writer(file_, ThreadTaskRunnerHandle::Get());
-  writer.SetTimerForTesting(&timer);
-  EXPECT_FALSE(writer.HasPendingWrite());
-  DataSerializer serializer("foo");
-  writer.ScheduleWrite(&serializer);
-  EXPECT_TRUE(writer.HasPendingWrite());
-  writer.WriteNow(std::make_unique<std::string>("bar"));
-  EXPECT_FALSE(writer.HasPendingWrite());
-  EXPECT_FALSE(timer.IsRunning());
-
-  RunLoop().RunUntilIdle();
-  ASSERT_TRUE(PathExists(writer.path()));
-  EXPECT_EQ("bar", GetFileContent(writer.path()));
-}
-
-TEST_F(ImportantFileWriterTest, DoScheduledWrite_FailToSerialize) {
-  MockTimer timer(true, false);
-  ImportantFileWriter writer(file_, ThreadTaskRunnerHandle::Get());
-  writer.SetTimerForTesting(&timer);
-  EXPECT_FALSE(writer.HasPendingWrite());
-  FailingDataSerializer serializer;
-  writer.ScheduleWrite(&serializer);
-  EXPECT_TRUE(writer.HasPendingWrite());
-
-  writer.DoScheduledWrite();
-  EXPECT_FALSE(timer.IsRunning());
-  EXPECT_FALSE(writer.HasPendingWrite());
-  RunLoop().RunUntilIdle();
-  EXPECT_FALSE(PathExists(writer.path()));
-}
-
-TEST_F(ImportantFileWriterTest, WriteFileAtomicallyHistogramSuffixTest) {
-  base::HistogramTester histogram_tester;
-  EXPECT_FALSE(PathExists(file_));
-  EXPECT_TRUE(ImportantFileWriter::WriteFileAtomically(file_, "baz", "test"));
-  EXPECT_TRUE(PathExists(file_));
-  EXPECT_EQ("baz", GetFileContent(file_));
-  histogram_tester.ExpectTotalCount("ImportantFile.FileCreateError", 0);
-  histogram_tester.ExpectTotalCount("ImportantFile.FileCreateError.test", 0);
-
-  FilePath invalid_file_ = FilePath().AppendASCII("bad/../non_existent/path");
-  EXPECT_FALSE(PathExists(invalid_file_));
-  EXPECT_FALSE(
-      ImportantFileWriter::WriteFileAtomically(invalid_file_, nullptr));
-  histogram_tester.ExpectTotalCount("ImportantFile.FileCreateError", 1);
-  histogram_tester.ExpectTotalCount("ImportantFile.FileCreateError.test", 0);
-  EXPECT_FALSE(
-      ImportantFileWriter::WriteFileAtomically(invalid_file_, nullptr, "test"));
-  histogram_tester.ExpectTotalCount("ImportantFile.FileCreateError", 1);
-  histogram_tester.ExpectTotalCount("ImportantFile.FileCreateError.test", 1);
-}
-
-}  // namespace base
diff --git a/base/files/memory_mapped_file_unittest.cc b/base/files/memory_mapped_file_unittest.cc
deleted file mode 100644
index b7acc61..0000000
--- a/base/files/memory_mapped_file_unittest.cc
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/memory_mapped_file.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-namespace base {
-
-namespace {
-
-// Create a temporary buffer and fill it with a watermark sequence.
-std::unique_ptr<uint8_t[]> CreateTestBuffer(size_t size, size_t offset) {
-  std::unique_ptr<uint8_t[]> buf(new uint8_t[size]);
-  for (size_t i = 0; i < size; ++i)
-    buf.get()[i] = static_cast<uint8_t>((offset + i) % 253);
-  return buf;
-}
-
-// Check that the watermark sequence is consistent with the |offset| provided.
-bool CheckBufferContents(const uint8_t* data, size_t size, size_t offset) {
-  std::unique_ptr<uint8_t[]> test_data(CreateTestBuffer(size, offset));
-  return memcmp(test_data.get(), data, size) == 0;
-}
-
-class MemoryMappedFileTest : public PlatformTest {
- protected:
-  void SetUp() override {
-    PlatformTest::SetUp();
-    CreateTemporaryFile(&temp_file_path_);
-  }
-
-  void TearDown() override { EXPECT_TRUE(DeleteFile(temp_file_path_, false)); }
-
-  void CreateTemporaryTestFile(size_t size) {
-    File file(temp_file_path_,
-              File::FLAG_CREATE_ALWAYS | File::FLAG_READ | File::FLAG_WRITE);
-    EXPECT_TRUE(file.IsValid());
-
-    std::unique_ptr<uint8_t[]> test_data(CreateTestBuffer(size, 0));
-    size_t bytes_written =
-        file.Write(0, reinterpret_cast<char*>(test_data.get()), size);
-    EXPECT_EQ(size, bytes_written);
-    file.Close();
-  }
-
-  const FilePath temp_file_path() const { return temp_file_path_; }
-
- private:
-  FilePath temp_file_path_;
-};
-
-TEST_F(MemoryMappedFileTest, MapWholeFileByPath) {
-  const size_t kFileSize = 68 * 1024;
-  CreateTemporaryTestFile(kFileSize);
-  MemoryMappedFile map;
-  map.Initialize(temp_file_path());
-  ASSERT_EQ(kFileSize, map.length());
-  ASSERT_TRUE(map.data() != nullptr);
-  EXPECT_TRUE(map.IsValid());
-  ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0));
-}
-
-TEST_F(MemoryMappedFileTest, MapWholeFileByFD) {
-  const size_t kFileSize = 68 * 1024;
-  CreateTemporaryTestFile(kFileSize);
-  MemoryMappedFile map;
-  map.Initialize(File(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ));
-  ASSERT_EQ(kFileSize, map.length());
-  ASSERT_TRUE(map.data() != nullptr);
-  EXPECT_TRUE(map.IsValid());
-  ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0));
-}
-
-TEST_F(MemoryMappedFileTest, MapSmallFile) {
-  const size_t kFileSize = 127;
-  CreateTemporaryTestFile(kFileSize);
-  MemoryMappedFile map;
-  map.Initialize(temp_file_path());
-  ASSERT_EQ(kFileSize, map.length());
-  ASSERT_TRUE(map.data() != nullptr);
-  EXPECT_TRUE(map.IsValid());
-  ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0));
-}
-
-TEST_F(MemoryMappedFileTest, MapWholeFileUsingRegion) {
-  const size_t kFileSize = 157 * 1024;
-  CreateTemporaryTestFile(kFileSize);
-  MemoryMappedFile map;
-
-  File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
-  map.Initialize(std::move(file), MemoryMappedFile::Region::kWholeFile);
-  ASSERT_EQ(kFileSize, map.length());
-  ASSERT_TRUE(map.data() != nullptr);
-  EXPECT_TRUE(map.IsValid());
-  ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0));
-}
-
-TEST_F(MemoryMappedFileTest, MapPartialRegionAtBeginning) {
-  const size_t kFileSize = 157 * 1024;
-  const size_t kPartialSize = 4 * 1024 + 32;
-  CreateTemporaryTestFile(kFileSize);
-  MemoryMappedFile map;
-
-  File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
-  MemoryMappedFile::Region region = {0, kPartialSize};
-  map.Initialize(std::move(file), region);
-  ASSERT_EQ(kPartialSize, map.length());
-  ASSERT_TRUE(map.data() != nullptr);
-  EXPECT_TRUE(map.IsValid());
-  ASSERT_TRUE(CheckBufferContents(map.data(), kPartialSize, 0));
-}
-
-TEST_F(MemoryMappedFileTest, MapPartialRegionAtEnd) {
-  const size_t kFileSize = 157 * 1024;
-  const size_t kPartialSize = 5 * 1024 - 32;
-  const size_t kOffset = kFileSize - kPartialSize;
-  CreateTemporaryTestFile(kFileSize);
-  MemoryMappedFile map;
-
-  File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
-  MemoryMappedFile::Region region = {kOffset, kPartialSize};
-  map.Initialize(std::move(file), region);
-  ASSERT_EQ(kPartialSize, map.length());
-  ASSERT_TRUE(map.data() != nullptr);
-  EXPECT_TRUE(map.IsValid());
-  ASSERT_TRUE(CheckBufferContents(map.data(), kPartialSize, kOffset));
-}
-
-TEST_F(MemoryMappedFileTest, MapSmallPartialRegionInTheMiddle) {
-  const size_t kFileSize = 157 * 1024;
-  const size_t kOffset = 1024 * 5 + 32;
-  const size_t kPartialSize = 8;
-
-  CreateTemporaryTestFile(kFileSize);
-  MemoryMappedFile map;
-
-  File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
-  MemoryMappedFile::Region region = {kOffset, kPartialSize};
-  map.Initialize(std::move(file), region);
-  ASSERT_EQ(kPartialSize, map.length());
-  ASSERT_TRUE(map.data() != nullptr);
-  EXPECT_TRUE(map.IsValid());
-  ASSERT_TRUE(CheckBufferContents(map.data(), kPartialSize, kOffset));
-}
-
-TEST_F(MemoryMappedFileTest, MapLargePartialRegionInTheMiddle) {
-  const size_t kFileSize = 157 * 1024;
-  const size_t kOffset = 1024 * 5 + 32;
-  const size_t kPartialSize = 16 * 1024 - 32;
-
-  CreateTemporaryTestFile(kFileSize);
-  MemoryMappedFile map;
-
-  File file(temp_file_path(), File::FLAG_OPEN | File::FLAG_READ);
-  MemoryMappedFile::Region region = {kOffset, kPartialSize};
-  map.Initialize(std::move(file), region);
-  ASSERT_EQ(kPartialSize, map.length());
-  ASSERT_TRUE(map.data() != nullptr);
-  EXPECT_TRUE(map.IsValid());
-  ASSERT_TRUE(CheckBufferContents(map.data(), kPartialSize, kOffset));
-}
-
-TEST_F(MemoryMappedFileTest, WriteableFile) {
-  const size_t kFileSize = 127;
-  CreateTemporaryTestFile(kFileSize);
-
-  {
-    MemoryMappedFile map;
-    map.Initialize(temp_file_path(), MemoryMappedFile::READ_WRITE);
-    ASSERT_EQ(kFileSize, map.length());
-    ASSERT_TRUE(map.data() != nullptr);
-    EXPECT_TRUE(map.IsValid());
-    ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0));
-
-    uint8_t* bytes = map.data();
-    bytes[0] = 'B';
-    bytes[1] = 'a';
-    bytes[2] = 'r';
-    bytes[kFileSize - 1] = '!';
-    EXPECT_FALSE(CheckBufferContents(map.data(), kFileSize, 0));
-    EXPECT_TRUE(CheckBufferContents(map.data() + 3, kFileSize - 4, 3));
-  }
-
-  int64_t file_size;
-  ASSERT_TRUE(GetFileSize(temp_file_path(), &file_size));
-  EXPECT_EQ(static_cast<int64_t>(kFileSize), file_size);
-
-  std::string contents;
-  ASSERT_TRUE(ReadFileToString(temp_file_path(), &contents));
-  EXPECT_EQ("Bar", contents.substr(0, 3));
-  EXPECT_EQ("!", contents.substr(kFileSize - 1, 1));
-}
-
-TEST_F(MemoryMappedFileTest, ExtendableFile) {
-  const size_t kFileSize = 127;
-  const size_t kFileExtend = 100;
-  CreateTemporaryTestFile(kFileSize);
-
-  {
-    File file(temp_file_path(),
-              File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE);
-    MemoryMappedFile::Region region = {0, kFileSize + kFileExtend};
-    MemoryMappedFile map;
-    map.Initialize(std::move(file), region,
-                   MemoryMappedFile::READ_WRITE_EXTEND);
-    EXPECT_EQ(kFileSize + kFileExtend, map.length());
-    ASSERT_TRUE(map.data() != nullptr);
-    EXPECT_TRUE(map.IsValid());
-    ASSERT_TRUE(CheckBufferContents(map.data(), kFileSize, 0));
-
-    uint8_t* bytes = map.data();
-    EXPECT_EQ(0, bytes[kFileSize + 0]);
-    EXPECT_EQ(0, bytes[kFileSize + 1]);
-    EXPECT_EQ(0, bytes[kFileSize + 2]);
-    bytes[kFileSize + 0] = 'B';
-    bytes[kFileSize + 1] = 'A';
-    bytes[kFileSize + 2] = 'Z';
-    EXPECT_TRUE(CheckBufferContents(map.data(), kFileSize, 0));
-  }
-
-  int64_t file_size;
-  ASSERT_TRUE(GetFileSize(temp_file_path(), &file_size));
-  EXPECT_LE(static_cast<int64_t>(kFileSize + 3), file_size);
-  EXPECT_GE(static_cast<int64_t>(kFileSize + kFileExtend), file_size);
-
-  std::string contents;
-  ASSERT_TRUE(ReadFileToString(temp_file_path(), &contents));
-  EXPECT_EQ("BAZ", contents.substr(kFileSize, 3));
-}
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/files/scoped_temp_dir_unittest.cc b/base/files/scoped_temp_dir_unittest.cc
deleted file mode 100644
index 84eff6e..0000000
--- a/base/files/scoped_temp_dir_unittest.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-
-#include "base/files/file.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(ScopedTempDir, FullPath) {
-  FilePath test_path;
-  base::CreateNewTempDirectory(FILE_PATH_LITERAL("scoped_temp_dir"),
-                               &test_path);
-
-  // Against an existing dir, it should get destroyed when leaving scope.
-  EXPECT_TRUE(DirectoryExists(test_path));
-  {
-    ScopedTempDir dir;
-    EXPECT_TRUE(dir.Set(test_path));
-    EXPECT_TRUE(dir.IsValid());
-  }
-  EXPECT_FALSE(DirectoryExists(test_path));
-
-  {
-    ScopedTempDir dir;
-    EXPECT_TRUE(dir.Set(test_path));
-    // Now the dir doesn't exist, so ensure that it gets created.
-    EXPECT_TRUE(DirectoryExists(test_path));
-    // When we call Release(), it shouldn't get destroyed when leaving scope.
-    FilePath path = dir.Take();
-    EXPECT_EQ(path.value(), test_path.value());
-    EXPECT_FALSE(dir.IsValid());
-  }
-  EXPECT_TRUE(DirectoryExists(test_path));
-
-  // Clean up.
-  {
-    ScopedTempDir dir;
-    EXPECT_TRUE(dir.Set(test_path));
-  }
-  EXPECT_FALSE(DirectoryExists(test_path));
-}
-
-TEST(ScopedTempDir, TempDir) {
-  // In this case, just verify that a directory was created and that it's a
-  // child of TempDir.
-  FilePath test_path;
-  {
-    ScopedTempDir dir;
-    EXPECT_TRUE(dir.CreateUniqueTempDir());
-    test_path = dir.GetPath();
-    EXPECT_TRUE(DirectoryExists(test_path));
-    FilePath tmp_dir;
-    EXPECT_TRUE(base::GetTempDir(&tmp_dir));
-    EXPECT_TRUE(test_path.value().find(tmp_dir.value()) != std::string::npos);
-  }
-  EXPECT_FALSE(DirectoryExists(test_path));
-}
-
-TEST(ScopedTempDir, UniqueTempDirUnderPath) {
-  // Create a path which will contain a unique temp path.
-  FilePath base_path;
-  ASSERT_TRUE(base::CreateNewTempDirectory(FILE_PATH_LITERAL("base_dir"),
-                                           &base_path));
-
-  FilePath test_path;
-  {
-    ScopedTempDir dir;
-    EXPECT_TRUE(dir.CreateUniqueTempDirUnderPath(base_path));
-    test_path = dir.GetPath();
-    EXPECT_TRUE(DirectoryExists(test_path));
-    EXPECT_TRUE(base_path.IsParent(test_path));
-    EXPECT_TRUE(test_path.value().find(base_path.value()) != std::string::npos);
-  }
-  EXPECT_FALSE(DirectoryExists(test_path));
-  base::DeleteFile(base_path, true);
-}
-
-TEST(ScopedTempDir, MultipleInvocations) {
-  ScopedTempDir dir;
-  EXPECT_TRUE(dir.CreateUniqueTempDir());
-  EXPECT_FALSE(dir.CreateUniqueTempDir());
-  EXPECT_TRUE(dir.Delete());
-  EXPECT_TRUE(dir.CreateUniqueTempDir());
-  EXPECT_FALSE(dir.CreateUniqueTempDir());
-  ScopedTempDir other_dir;
-  EXPECT_TRUE(other_dir.Set(dir.Take()));
-  EXPECT_TRUE(dir.CreateUniqueTempDir());
-  EXPECT_FALSE(dir.CreateUniqueTempDir());
-  EXPECT_FALSE(other_dir.CreateUniqueTempDir());
-}
-
-#if defined(OS_WIN)
-TEST(ScopedTempDir, LockedTempDir) {
-  ScopedTempDir dir;
-  EXPECT_TRUE(dir.CreateUniqueTempDir());
-  base::File file(dir.GetPath().Append(FILE_PATH_LITERAL("temp")),
-                  base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-  EXPECT_TRUE(file.IsValid());
-  EXPECT_EQ(base::File::FILE_OK, file.error_details());
-  EXPECT_FALSE(dir.Delete());  // We should not be able to delete.
-  EXPECT_FALSE(dir.GetPath().empty());  // We should still have a valid path.
-  file.Close();
-  // Now, we should be able to delete.
-  EXPECT_TRUE(dir.Delete());
-}
-#endif  // defined(OS_WIN)
-
-}  // namespace base
diff --git a/base/gmock_unittest.cc b/base/gmock_unittest.cc
deleted file mode 100644
index 5c16728..0000000
--- a/base/gmock_unittest.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This test is a simple sanity check to make sure gmock is able to build/link
-// correctly.  It just instantiates a mock object and runs through a couple of
-// the basic mock features.
-
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-// Gmock matchers and actions that we use below.
-using testing::AnyOf;
-using testing::Eq;
-using testing::Return;
-using testing::SetArgPointee;
-using testing::WithArg;
-using testing::_;
-
-namespace {
-
-// Simple class that we can mock out the behavior for.  Everything is virtual
-// for easy mocking.
-class SampleClass {
- public:
-  SampleClass() = default;
-  virtual ~SampleClass() = default;
-
-  virtual int ReturnSomething() {
-    return -1;
-  }
-
-  virtual void ReturnNothingConstly() const {
-  }
-
-  virtual void OutputParam(int* a) {
-  }
-
-  virtual int ReturnSecond(int a, int b) {
-    return b;
-  }
-};
-
-// Declare a mock for the class.
-class MockSampleClass : public SampleClass {
- public:
-  MOCK_METHOD0(ReturnSomething, int());
-  MOCK_CONST_METHOD0(ReturnNothingConstly, void());
-  MOCK_METHOD1(OutputParam, void(int* a));
-  MOCK_METHOD2(ReturnSecond, int(int a, int b));
-};
-
-// Create a couple of custom actions.  Custom actions can be used for adding
-// more complex behavior into your mock...though if you start needing these, ask
-// if you're asking your mock to do too much.
-ACTION(ReturnVal) {
-  // Return the first argument received.
-  return arg0;
-}
-ACTION(ReturnSecond) {
-  // Returns the second argument.  This basically implemetns ReturnSecond.
-  return arg1;
-}
-
-TEST(GmockTest, SimpleMatchAndActions) {
-  // Basic test of some simple gmock matchers, actions, and cardinality
-  // expectations.
-  MockSampleClass mock;
-
-  EXPECT_CALL(mock, ReturnSomething())
-      .WillOnce(Return(1))
-      .WillOnce(Return(2))
-      .WillOnce(Return(3));
-  EXPECT_EQ(1, mock.ReturnSomething());
-  EXPECT_EQ(2, mock.ReturnSomething());
-  EXPECT_EQ(3, mock.ReturnSomething());
-
-  EXPECT_CALL(mock, ReturnNothingConstly()).Times(2);
-  mock.ReturnNothingConstly();
-  mock.ReturnNothingConstly();
-}
-
-TEST(GmockTest, AssignArgument) {
-  // Capture an argument for examination.
-  MockSampleClass mock;
-
-  EXPECT_CALL(mock, OutputParam(_)).WillRepeatedly(SetArgPointee<0>(5));
-
-  int arg = 0;
-  mock.OutputParam(&arg);
-  EXPECT_EQ(5, arg);
-}
-
-TEST(GmockTest, SideEffects) {
-  // Capture an argument for examination.
-  MockSampleClass mock;
-
-  EXPECT_CALL(mock, OutputParam(_)).WillRepeatedly(SetArgPointee<0>(5));
-
-  int arg = 0;
-  mock.OutputParam(&arg);
-  EXPECT_EQ(5, arg);
-}
-
-TEST(GmockTest, CustomAction_ReturnSecond) {
-  // Test a mock of the ReturnSecond behavior using an action that provides an
-  // alternate implementation of the function.  Danger here though, this is
-  // starting to add too much behavior of the mock, which means the mock
-  // implementation might start to have bugs itself.
-  MockSampleClass mock;
-
-  EXPECT_CALL(mock, ReturnSecond(_, AnyOf(Eq(4), Eq(5))))
-      .WillRepeatedly(ReturnSecond());
-  EXPECT_EQ(4, mock.ReturnSecond(-1, 4));
-  EXPECT_EQ(5, mock.ReturnSecond(0, 5));
-  EXPECT_EQ(4, mock.ReturnSecond(0xdeadbeef, 4));
-  EXPECT_EQ(4, mock.ReturnSecond(112358, 4));
-  EXPECT_EQ(5, mock.ReturnSecond(1337, 5));
-}
-
-TEST(GmockTest, CustomAction_ReturnVal) {
-  // Alternate implemention of ReturnSecond using a more general custom action,
-  // and a WithArg adapter to bridge the interfaces.
-  MockSampleClass mock;
-
-  EXPECT_CALL(mock, ReturnSecond(_, AnyOf(Eq(4), Eq(5))))
-      .WillRepeatedly(WithArg<1>(ReturnVal()));
-  EXPECT_EQ(4, mock.ReturnSecond(-1, 4));
-  EXPECT_EQ(5, mock.ReturnSecond(0, 5));
-  EXPECT_EQ(4, mock.ReturnSecond(0xdeadbeef, 4));
-  EXPECT_EQ(4, mock.ReturnSecond(112358, 4));
-  EXPECT_EQ(5, mock.ReturnSecond(1337, 5));
-}
-
-}  // namespace
diff --git a/base/guid_unittest.cc b/base/guid_unittest.cc
deleted file mode 100644
index 8aa56ed..0000000
--- a/base/guid_unittest.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/guid.h"
-
-#include <stdint.h>
-
-#include <limits>
-
-#include "base/strings/string_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-bool IsGUIDv4(const std::string& guid) {
-  // The format of GUID version 4 must be xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx,
-  // where y is one of [8, 9, A, B].
-  return IsValidGUID(guid) && guid[14] == '4' &&
-         (guid[19] == '8' || guid[19] == '9' || guid[19] == 'A' ||
-          guid[19] == 'a' || guid[19] == 'B' || guid[19] == 'b');
-}
-
-}  // namespace
-
-TEST(GUIDTest, GUIDGeneratesAllZeroes) {
-  uint64_t bytes[] = {0, 0};
-  std::string clientid = RandomDataToGUIDString(bytes);
-  EXPECT_EQ("00000000-0000-0000-0000-000000000000", clientid);
-}
-
-TEST(GUIDTest, GUIDGeneratesCorrectly) {
-  uint64_t bytes[] = {0x0123456789ABCDEFULL, 0xFEDCBA9876543210ULL};
-  std::string clientid = RandomDataToGUIDString(bytes);
-  EXPECT_EQ("01234567-89ab-cdef-fedc-ba9876543210", clientid);
-}
-
-TEST(GUIDTest, GUIDCorrectlyFormatted) {
-  const int kIterations = 10;
-  for (int it = 0; it < kIterations; ++it) {
-    std::string guid = GenerateGUID();
-    EXPECT_TRUE(IsValidGUID(guid));
-    EXPECT_TRUE(IsValidGUIDOutputString(guid));
-    EXPECT_TRUE(IsValidGUID(ToLowerASCII(guid)));
-    EXPECT_TRUE(IsValidGUID(ToUpperASCII(guid)));
-  }
-}
-
-TEST(GUIDTest, GUIDBasicUniqueness) {
-  const int kIterations = 10;
-  for (int it = 0; it < kIterations; ++it) {
-    std::string guid1 = GenerateGUID();
-    std::string guid2 = GenerateGUID();
-    EXPECT_EQ(36U, guid1.length());
-    EXPECT_EQ(36U, guid2.length());
-    EXPECT_NE(guid1, guid2);
-    EXPECT_TRUE(IsGUIDv4(guid1));
-    EXPECT_TRUE(IsGUIDv4(guid2));
-  }
-}
-
-}  // namespace base
diff --git a/base/hash_unittest.cc b/base/hash_unittest.cc
deleted file mode 100644
index fc8a751..0000000
--- a/base/hash_unittest.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/hash.h"
-
-#include <string>
-#include <vector>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(HashTest, String) {
-  std::string str;
-  // Empty string (should hash to 0).
-  str = "";
-  EXPECT_EQ(0u, Hash(str));
-
-  // Simple test.
-  str = "hello world";
-  EXPECT_EQ(2794219650u, Hash(str));
-
-  // Change one bit.
-  str = "helmo world";
-  EXPECT_EQ(1006697176u, Hash(str));
-
-  // Insert a null byte.
-  str = "hello  world";
-  str[5] = '\0';
-  EXPECT_EQ(2319902537u, Hash(str));
-
-  // Test that the bytes after the null contribute to the hash.
-  str = "hello  worle";
-  str[5] = '\0';
-  EXPECT_EQ(553904462u, Hash(str));
-
-  // Extremely long string.
-  // Also tests strings with high bit set, and null byte.
-  std::vector<char> long_string_buffer;
-  for (int i = 0; i < 4096; ++i)
-    long_string_buffer.push_back((i % 256) - 128);
-  str.assign(&long_string_buffer.front(), long_string_buffer.size());
-  EXPECT_EQ(2797962408u, Hash(str));
-
-  // All possible lengths (mod 4). Tests separate code paths. Also test with
-  // final byte high bit set (regression test for http://crbug.com/90659).
-  // Note that the 1 and 3 cases have a weird bug where the final byte is
-  // treated as a signed char. It was decided on the above bug discussion to
-  // enshrine that behaviour as "correct" to avoid invalidating existing hashes.
-
-  // Length mod 4 == 0.
-  str = "hello w\xab";
-  EXPECT_EQ(615571198u, Hash(str));
-  // Length mod 4 == 1.
-  str = "hello wo\xab";
-  EXPECT_EQ(623474296u, Hash(str));
-  // Length mod 4 == 2.
-  str = "hello wor\xab";
-  EXPECT_EQ(4278562408u, Hash(str));
-  // Length mod 4 == 3.
-  str = "hello worl\xab";
-  EXPECT_EQ(3224633008u, Hash(str));
-}
-
-TEST(HashTest, CString) {
-  const char* str;
-  // Empty string (should hash to 0).
-  str = "";
-  EXPECT_EQ(0u, Hash(str, strlen(str)));
-
-  // Simple test.
-  str = "hello world";
-  EXPECT_EQ(2794219650u, Hash(str, strlen(str)));
-
-  // Ensure that it stops reading after the given length, and does not expect a
-  // null byte.
-  str = "hello world; don't read this part";
-  EXPECT_EQ(2794219650u, Hash(str, strlen("hello world")));
-}
-
-}  // namespace base
diff --git a/base/i18n/bidi_line_iterator_unittest.cc b/base/i18n/bidi_line_iterator_unittest.cc
deleted file mode 100644
index d531313..0000000
--- a/base/i18n/bidi_line_iterator_unittest.cc
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/bidi_line_iterator.h"
-
-#include "base/macros.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace i18n {
-namespace {
-
-class BiDiLineIteratorTest : public testing::TestWithParam<TextDirection> {
- public:
-  BiDiLineIteratorTest() = default;
-
-  BiDiLineIterator* iterator() { return &iterator_; }
-
- private:
-  BiDiLineIterator iterator_;
-
-  DISALLOW_COPY_AND_ASSIGN(BiDiLineIteratorTest);
-};
-
-TEST_P(BiDiLineIteratorTest, OnlyLTR) {
-  iterator()->Open(UTF8ToUTF16("abc 😁 测试"), GetParam(),
-                   BiDiLineIterator::CustomBehavior::NONE);
-  ASSERT_EQ(1, iterator()->CountRuns());
-
-  int start, length;
-  EXPECT_EQ(UBIDI_LTR, iterator()->GetVisualRun(0, &start, &length));
-  EXPECT_EQ(0, start);
-  EXPECT_EQ(9, length);
-
-  int end;
-  UBiDiLevel level;
-  iterator()->GetLogicalRun(0, &end, &level);
-  EXPECT_EQ(9, end);
-  if (GetParam() == TextDirection::RIGHT_TO_LEFT)
-    EXPECT_EQ(2, level);
-  else
-    EXPECT_EQ(0, level);
-}
-
-TEST_P(BiDiLineIteratorTest, OnlyRTL) {
-  iterator()->Open(UTF8ToUTF16("מה השעה"), GetParam(),
-                   BiDiLineIterator::CustomBehavior::NONE);
-  ASSERT_EQ(1, iterator()->CountRuns());
-
-  int start, length;
-  EXPECT_EQ(UBIDI_RTL, iterator()->GetVisualRun(0, &start, &length));
-  EXPECT_EQ(0, start);
-  EXPECT_EQ(7, length);
-
-  int end;
-  UBiDiLevel level;
-  iterator()->GetLogicalRun(0, &end, &level);
-  EXPECT_EQ(7, end);
-  EXPECT_EQ(1, level);
-}
-
-TEST_P(BiDiLineIteratorTest, Mixed) {
-  iterator()->Open(UTF8ToUTF16("אני משתמש ב- Chrome כדפדפן האינטרנט שלי"),
-                   GetParam(), BiDiLineIterator::CustomBehavior::NONE);
-  ASSERT_EQ(3, iterator()->CountRuns());
-
-  // We'll get completely different results depending on the top-level paragraph
-  // direction.
-  if (GetParam() == TextDirection::RIGHT_TO_LEFT) {
-    // If para direction is RTL, expect the LTR substring "Chrome" to be nested
-    // within the surrounding RTL text.
-    int start, length;
-    EXPECT_EQ(UBIDI_RTL, iterator()->GetVisualRun(0, &start, &length));
-    EXPECT_EQ(19, start);
-    EXPECT_EQ(20, length);
-    EXPECT_EQ(UBIDI_LTR, iterator()->GetVisualRun(1, &start, &length));
-    EXPECT_EQ(13, start);
-    EXPECT_EQ(6, length);
-    EXPECT_EQ(UBIDI_RTL, iterator()->GetVisualRun(2, &start, &length));
-    EXPECT_EQ(0, start);
-    EXPECT_EQ(13, length);
-
-    int end;
-    UBiDiLevel level;
-    iterator()->GetLogicalRun(0, &end, &level);
-    EXPECT_EQ(13, end);
-    EXPECT_EQ(1, level);
-    iterator()->GetLogicalRun(13, &end, &level);
-    EXPECT_EQ(19, end);
-    EXPECT_EQ(2, level);
-    iterator()->GetLogicalRun(19, &end, &level);
-    EXPECT_EQ(39, end);
-    EXPECT_EQ(1, level);
-  } else {
-    // If the para direction is LTR, expect the LTR substring "- Chrome " to be
-    // at the top level, with two nested RTL runs on either side.
-    int start, length;
-    EXPECT_EQ(UBIDI_RTL, iterator()->GetVisualRun(0, &start, &length));
-    EXPECT_EQ(0, start);
-    EXPECT_EQ(11, length);
-    EXPECT_EQ(UBIDI_LTR, iterator()->GetVisualRun(1, &start, &length));
-    EXPECT_EQ(11, start);
-    EXPECT_EQ(9, length);
-    EXPECT_EQ(UBIDI_RTL, iterator()->GetVisualRun(2, &start, &length));
-    EXPECT_EQ(20, start);
-    EXPECT_EQ(19, length);
-
-    int end;
-    UBiDiLevel level;
-    iterator()->GetLogicalRun(0, &end, &level);
-    EXPECT_EQ(11, end);
-    EXPECT_EQ(1, level);
-    iterator()->GetLogicalRun(11, &end, &level);
-    EXPECT_EQ(20, end);
-    EXPECT_EQ(0, level);
-    iterator()->GetLogicalRun(20, &end, &level);
-    EXPECT_EQ(39, end);
-    EXPECT_EQ(1, level);
-  }
-}
-
-TEST_P(BiDiLineIteratorTest, RTLPunctuationNoCustomBehavior) {
-  // This string features Hebrew characters interleaved with ASCII punctuation.
-  iterator()->Open(UTF8ToUTF16("א!ב\"ג#ד$ה%ו&ז'ח(ט)י*ך+כ,ל-ם.מ/"
-                               "ן:נ;ס<ע=ף>פ?ץ@צ[ק\\ר]ש^ת_א`ב{ג|ד}ה~ו"),
-                   GetParam(), BiDiLineIterator::CustomBehavior::NONE);
-
-  // Expect a single RTL run.
-  ASSERT_EQ(1, iterator()->CountRuns());
-
-  int start, length;
-  EXPECT_EQ(UBIDI_RTL, iterator()->GetVisualRun(0, &start, &length));
-  EXPECT_EQ(0, start);
-  EXPECT_EQ(65, length);
-
-  int end;
-  UBiDiLevel level;
-  iterator()->GetLogicalRun(0, &end, &level);
-  EXPECT_EQ(65, end);
-  EXPECT_EQ(1, level);
-}
-
-TEST_P(BiDiLineIteratorTest, RTLPunctuationAsURL) {
-  // This string features Hebrew characters interleaved with ASCII punctuation.
-  iterator()->Open(UTF8ToUTF16("א!ב\"ג#ד$ה%ו&ז'ח(ט)י*ך+כ,ל-ם.מ/"
-                               "ן:נ;ס<ע=ף>פ?ץ@צ[ק\\ר]ש^ת_א`ב{ג|ד}ה~ו"),
-                   GetParam(), BiDiLineIterator::CustomBehavior::AS_URL);
-
-  const int kStringSize = 65;
-
-  // Expect a primary RTL run, broken up by each of the 8 punctuation marks that
-  // are considered strong LTR (17 runs total).
-  struct {
-    int start;
-    UBiDiDirection dir;
-  } expected_runs[] = {
-      {0, UBIDI_RTL},  {5, UBIDI_LTR},   // '#'
-      {6, UBIDI_RTL},  {11, UBIDI_LTR},  // '&'
-      {12, UBIDI_RTL}, {27, UBIDI_LTR},  // '.'
-      {28, UBIDI_RTL}, {29, UBIDI_LTR},  // '/'
-      {30, UBIDI_RTL}, {31, UBIDI_LTR},  // ':'
-      {32, UBIDI_RTL}, {37, UBIDI_LTR},  // '='
-      {38, UBIDI_RTL}, {41, UBIDI_LTR},  // '?'
-      {42, UBIDI_RTL}, {43, UBIDI_LTR},  // '@'
-      {44, UBIDI_RTL},
-  };
-
-  ASSERT_EQ(arraysize(expected_runs),
-            static_cast<size_t>(iterator()->CountRuns()));
-
-  for (size_t i = 0; i < arraysize(expected_runs); ++i) {
-    const auto& expected_run = expected_runs[i];
-    int expected_run_end = i >= arraysize(expected_runs) - 1
-                               ? kStringSize
-                               : expected_runs[i + 1].start;
-
-    size_t visual_index = GetParam() == TextDirection::RIGHT_TO_LEFT
-                              ? arraysize(expected_runs) - 1 - i
-                              : i;
-    int start, length;
-    EXPECT_EQ(expected_run.dir,
-              iterator()->GetVisualRun(visual_index, &start, &length))
-        << "(i = " << i << ")";
-    EXPECT_EQ(expected_run.start, start) << "(i = " << i << ")";
-    EXPECT_EQ(expected_run_end - expected_run.start, length)
-        << "(i = " << i << ")";
-
-    int expected_level =
-        expected_run.dir == UBIDI_RTL
-            ? 1
-            : (GetParam() == TextDirection::RIGHT_TO_LEFT ? 2 : 0);
-    int end;
-    UBiDiLevel level;
-    iterator()->GetLogicalRun(expected_run.start, &end, &level);
-    EXPECT_EQ(expected_run_end, end) << "(i = " << i << ")";
-    EXPECT_EQ(expected_level, level) << "(i = " << i << ")";
-  }
-}
-
-INSTANTIATE_TEST_CASE_P(,
-                        BiDiLineIteratorTest,
-                        ::testing::Values(TextDirection::LEFT_TO_RIGHT,
-                                          TextDirection::RIGHT_TO_LEFT));
-
-}  // namespace
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/break_iterator_unittest.cc b/base/i18n/break_iterator_unittest.cc
deleted file mode 100644
index 6137e02..0000000
--- a/base/i18n/break_iterator_unittest.cc
+++ /dev/null
@@ -1,461 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/break_iterator.h"
-
-#include <stddef.h>
-
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace i18n {
-
-TEST(BreakIteratorTest, BreakWordEmpty) {
-  string16 empty;
-  BreakIterator iter(empty, BreakIterator::BREAK_WORD);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());  // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakWord) {
-  string16 space(UTF8ToUTF16(" "));
-  string16 str(UTF8ToUTF16(" foo bar! \npouet boom"));
-  BreakIterator iter(str, BreakIterator::BREAK_WORD);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(space, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_TRUE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("foo"), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(space, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_TRUE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("bar"), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("!"), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(space, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("\n"), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_TRUE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("pouet"), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(space, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_TRUE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("boom"), iter.GetString());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());  // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakWide16) {
-  // Two greek words separated by space.
-  const string16 str(WideToUTF16(
-      L"\x03a0\x03b1\x03b3\x03ba\x03cc\x03c3\x03bc\x03b9"
-      L"\x03bf\x03c2\x0020\x0399\x03c3\x03c4\x03cc\x03c2"));
-  const string16 word1(str.substr(0, 10));
-  const string16 word2(str.substr(11, 5));
-  BreakIterator iter(str, BreakIterator::BREAK_WORD);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_TRUE(iter.IsWord());
-  EXPECT_EQ(word1, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16(" "), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_TRUE(iter.IsWord());
-  EXPECT_EQ(word2, iter.GetString());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());  // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakWide32) {
-  // U+1D49C MATHEMATICAL SCRIPT CAPITAL A
-  const char very_wide_char[] = "\xF0\x9D\x92\x9C";
-  const string16 str(
-      UTF8ToUTF16(base::StringPrintf("%s a", very_wide_char)));
-  const string16 very_wide_word(str.substr(0, 2));
-
-  BreakIterator iter(str, BreakIterator::BREAK_WORD);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_TRUE(iter.IsWord());
-  EXPECT_EQ(very_wide_word, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16(" "), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_TRUE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("a"), iter.GetString());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());  // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakSpaceEmpty) {
-  string16 empty;
-  BreakIterator iter(empty, BreakIterator::BREAK_SPACE);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());  // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakSpace) {
-  string16 str(UTF8ToUTF16(" foo bar! \npouet boom"));
-  BreakIterator iter(str, BreakIterator::BREAK_SPACE);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16(" "), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("foo "), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("bar! \n"), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("pouet "), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("boom"), iter.GetString());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());  // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakSpaceSP) {
-  string16 str(UTF8ToUTF16(" foo bar! \npouet boom "));
-  BreakIterator iter(str, BreakIterator::BREAK_SPACE);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16(" "), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("foo "), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("bar! \n"), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("pouet "), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("boom "), iter.GetString());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());  // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakSpacekWide16) {
-  // Two Greek words.
-  const string16 str(WideToUTF16(
-      L"\x03a0\x03b1\x03b3\x03ba\x03cc\x03c3\x03bc\x03b9"
-      L"\x03bf\x03c2\x0020\x0399\x03c3\x03c4\x03cc\x03c2"));
-  const string16 word1(str.substr(0, 11));
-  const string16 word2(str.substr(11, 5));
-  BreakIterator iter(str, BreakIterator::BREAK_SPACE);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(word1, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(word2, iter.GetString());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());  // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakSpaceWide32) {
-  // U+1D49C MATHEMATICAL SCRIPT CAPITAL A
-  const char very_wide_char[] = "\xF0\x9D\x92\x9C";
-  const string16 str(
-      UTF8ToUTF16(base::StringPrintf("%s a", very_wide_char)));
-  const string16 very_wide_word(str.substr(0, 3));
-
-  BreakIterator iter(str, BreakIterator::BREAK_SPACE);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(very_wide_word, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("a"), iter.GetString());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());  // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakLineEmpty) {
-  string16 empty;
-  BreakIterator iter(empty, BreakIterator::BREAK_NEWLINE);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());   // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakLine) {
-  string16 nl(UTF8ToUTF16("\n"));
-  string16 str(UTF8ToUTF16("\nfoo bar!\n\npouet boom"));
-  BreakIterator iter(str, BreakIterator::BREAK_NEWLINE);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(nl, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("foo bar!\n"), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(nl, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("pouet boom"), iter.GetString());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());   // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakLineNL) {
-  string16 nl(UTF8ToUTF16("\n"));
-  string16 str(UTF8ToUTF16("\nfoo bar!\n\npouet boom\n"));
-  BreakIterator iter(str, BreakIterator::BREAK_NEWLINE);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(nl, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("foo bar!\n"), iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(nl, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("pouet boom\n"), iter.GetString());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());   // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakLineWide16) {
-  // Two Greek words separated by newline.
-  const string16 str(WideToUTF16(
-      L"\x03a0\x03b1\x03b3\x03ba\x03cc\x03c3\x03bc\x03b9"
-      L"\x03bf\x03c2\x000a\x0399\x03c3\x03c4\x03cc\x03c2"));
-  const string16 line1(str.substr(0, 11));
-  const string16 line2(str.substr(11, 5));
-  BreakIterator iter(str, BreakIterator::BREAK_NEWLINE);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(line1, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(line2, iter.GetString());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());   // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakLineWide32) {
-  // U+1D49C MATHEMATICAL SCRIPT CAPITAL A
-  const char very_wide_char[] = "\xF0\x9D\x92\x9C";
-  const string16 str(
-      UTF8ToUTF16(base::StringPrintf("%s\na", very_wide_char)));
-  const string16 very_wide_line(str.substr(0, 3));
-  BreakIterator iter(str, BreakIterator::BREAK_NEWLINE);
-  ASSERT_TRUE(iter.Init());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(very_wide_line, iter.GetString());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_EQ(UTF8ToUTF16("a"), iter.GetString());
-  EXPECT_FALSE(iter.Advance());
-  EXPECT_FALSE(iter.IsWord());
-  EXPECT_FALSE(iter.Advance());   // Test unexpected advance after end.
-  EXPECT_FALSE(iter.IsWord());
-}
-
-TEST(BreakIteratorTest, BreakCharacter) {
-  static const wchar_t* kCharacters[] = {
-    // An English word consisting of four ASCII characters.
-    L"w", L"o", L"r", L"d", L" ",
-    // A Hindi word (which means "Hindi") consisting of three Devanagari
-    // characters.
-    L"\x0939\x093F", L"\x0928\x094D", L"\x0926\x0940", L" ",
-    // A Thai word (which means "feel") consisting of three Thai characters.
-    L"\x0E23\x0E39\x0E49", L"\x0E2A\x0E36", L"\x0E01", L" ",
-  };
-  std::vector<string16> characters;
-  string16 text;
-  for (size_t i = 0; i < arraysize(kCharacters); ++i) {
-    characters.push_back(WideToUTF16(kCharacters[i]));
-    text.append(characters.back());
-  }
-  BreakIterator iter(text, BreakIterator::BREAK_CHARACTER);
-  ASSERT_TRUE(iter.Init());
-  for (size_t i = 0; i < arraysize(kCharacters); ++i) {
-    EXPECT_TRUE(iter.Advance());
-    EXPECT_EQ(characters[i], iter.GetString());
-  }
-}
-
-// Test for https://code.google.com/p/chromium/issues/detail?id=411213
-// We should be able to get valid substrings with GetString() function
-// after setting new content by calling SetText().
-TEST(BreakIteratorTest, GetStringAfterSetText) {
-  const string16 initial_string(ASCIIToUTF16("str"));
-  BreakIterator iter(initial_string, BreakIterator::BREAK_WORD);
-  ASSERT_TRUE(iter.Init());
-
-  const string16 long_string(ASCIIToUTF16("another,string"));
-  EXPECT_TRUE(iter.SetText(long_string.c_str(), long_string.size()));
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_TRUE(iter.Advance());  // Advance to ',' in |long_string|
-
-  // Check that the current position is out of bounds of the |initial_string|.
-  EXPECT_LT(initial_string.size(), iter.pos());
-
-  // Check that we can get a valid substring of |long_string|.
-  EXPECT_EQ(ASCIIToUTF16(","), iter.GetString());
-}
-
-TEST(BreakIteratorTest, GetStringPiece) {
-  const string16 initial_string(ASCIIToUTF16("some string"));
-  BreakIterator iter(initial_string, BreakIterator::BREAK_WORD);
-  ASSERT_TRUE(iter.Init());
-
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_EQ(iter.GetString(), iter.GetStringPiece().as_string());
-  EXPECT_EQ(StringPiece16(ASCIIToUTF16("some")), iter.GetStringPiece());
-
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_EQ(iter.GetString(), iter.GetStringPiece().as_string());
-  EXPECT_EQ(StringPiece16(ASCIIToUTF16("string")), iter.GetStringPiece());
-}
-
-// Make sure that when not in RULE_BASED or BREAK_WORD mode we're getting
-// IS_LINE_OR_CHAR_BREAK.
-TEST(BreakIteratorTest, GetWordBreakStatusBreakLine) {
-  // A string containing the English word "foo", followed by two Khmer
-  // characters, the English word "Can", and then two Russian characters and
-  // punctuation.
-  base::string16 text(
-      base::WideToUTF16(L"foo \x1791\x17C1 \nCan \x041C\x0438..."));
-  BreakIterator iter(text, BreakIterator::BREAK_LINE);
-  ASSERT_TRUE(iter.Init());
-
-  EXPECT_TRUE(iter.Advance());
-  // Finds "foo" and the space.
-  EXPECT_EQ(base::UTF8ToUTF16("foo "), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_LINE_OR_CHAR_BREAK);
-  EXPECT_TRUE(iter.Advance());
-  // Finds the Khmer characters, the next space, and the newline.
-  EXPECT_EQ(base::WideToUTF16(L"\x1791\x17C1 \n"), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_LINE_OR_CHAR_BREAK);
-  EXPECT_TRUE(iter.Advance());
-  // Finds "Can" and the space.
-  EXPECT_EQ(base::UTF8ToUTF16("Can "), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_LINE_OR_CHAR_BREAK);
-  EXPECT_TRUE(iter.Advance());
-  // Finds the Russian characters and periods.
-  EXPECT_EQ(base::WideToUTF16(L"\x041C\x0438..."), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_LINE_OR_CHAR_BREAK);
-  EXPECT_FALSE(iter.Advance());
-}
-
-// Make sure that in BREAK_WORD mode we're getting IS_WORD_BREAK and
-// IS_SKIPPABLE_WORD when we should be. IS_WORD_BREAK should be returned when we
-// finish going over non-punctuation characters while IS_SKIPPABLE_WORD should
-// be returned on punctuation and spaces.
-TEST(BreakIteratorTest, GetWordBreakStatusBreakWord) {
-  // A string containing the English word "foo", followed by two Khmer
-  // characters, the English word "Can", and then two Russian characters and
-  // punctuation.
-  base::string16 text(
-      base::WideToUTF16(L"foo \x1791\x17C1 \nCan \x041C\x0438..."));
-  BreakIterator iter(text, BreakIterator::BREAK_WORD);
-  ASSERT_TRUE(iter.Init());
-
-  EXPECT_TRUE(iter.Advance());
-  // Finds "foo".
-  EXPECT_EQ(base::UTF8ToUTF16("foo"), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_WORD_BREAK);
-  EXPECT_TRUE(iter.Advance());
-  // Finds the space, and the Khmer characters.
-  EXPECT_EQ(base::UTF8ToUTF16(" "), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_SKIPPABLE_WORD);
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_EQ(base::WideToUTF16(L"\x1791\x17C1"), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_WORD_BREAK);
-  EXPECT_TRUE(iter.Advance());
-  // Finds the space and the newline.
-  EXPECT_EQ(base::UTF8ToUTF16(" "), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_SKIPPABLE_WORD);
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_EQ(base::UTF8ToUTF16("\n"), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_SKIPPABLE_WORD);
-  EXPECT_TRUE(iter.Advance());
-  // Finds "Can".
-  EXPECT_EQ(base::UTF8ToUTF16("Can"), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_WORD_BREAK);
-  EXPECT_TRUE(iter.Advance());
-  // Finds the space and the Russian characters.
-  EXPECT_EQ(base::UTF8ToUTF16(" "), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_SKIPPABLE_WORD);
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_EQ(base::WideToUTF16(L"\x041C\x0438"), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_WORD_BREAK);
-  EXPECT_TRUE(iter.Advance());
-  // Finds the trailing periods.
-  EXPECT_EQ(base::UTF8ToUTF16("."), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_SKIPPABLE_WORD);
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_EQ(base::UTF8ToUTF16("."), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_SKIPPABLE_WORD);
-  EXPECT_TRUE(iter.Advance());
-  EXPECT_EQ(base::UTF8ToUTF16("."), iter.GetString());
-  EXPECT_EQ(iter.GetWordBreakStatus(), BreakIterator::IS_SKIPPABLE_WORD);
-  EXPECT_FALSE(iter.Advance());
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/case_conversion_unittest.cc b/base/i18n/case_conversion_unittest.cc
deleted file mode 100644
index ee795bc..0000000
--- a/base/i18n/case_conversion_unittest.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/case_conversion.h"
-#include "base/i18n/rtl.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/test/icu_test_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/icu/source/i18n/unicode/usearch.h"
-
-namespace base {
-namespace i18n {
-
-namespace {
-
-const wchar_t kNonASCIIMixed[] =
-    L"\xC4\xD6\xE4\xF6\x20\xCF\xEF\x20\xF7\x25"
-    L"\xA4\x23\x2A\x5E\x60\x40\xA3\x24\x2030\x201A\x7E\x20\x1F07\x1F0F"
-    L"\x20\x1E00\x1E01";
-const wchar_t kNonASCIILower[] =
-    L"\xE4\xF6\xE4\xF6\x20\xEF\xEF"
-    L"\x20\xF7\x25\xA4\x23\x2A\x5E\x60\x40\xA3\x24\x2030\x201A\x7E\x20\x1F07"
-    L"\x1F07\x20\x1E01\x1E01";
-const wchar_t kNonASCIIUpper[] =
-    L"\xC4\xD6\xC4\xD6\x20\xCF\xCF"
-    L"\x20\xF7\x25\xA4\x23\x2A\x5E\x60\x40\xA3\x24\x2030\x201A\x7E\x20\x1F0F"
-    L"\x1F0F\x20\x1E00\x1E00";
-
-}  // namespace
-
-// Test upper and lower case string conversion.
-TEST(CaseConversionTest, UpperLower) {
-  const string16 mixed(ASCIIToUTF16("Text with UPPer & lowER casE."));
-  const string16 expected_lower(ASCIIToUTF16("text with upper & lower case."));
-  const string16 expected_upper(ASCIIToUTF16("TEXT WITH UPPER & LOWER CASE."));
-
-  string16 result = ToLower(mixed);
-  EXPECT_EQ(expected_lower, result);
-
-  result = ToUpper(mixed);
-  EXPECT_EQ(expected_upper, result);
-}
-
-TEST(CaseConversionTest, NonASCII) {
-  const string16 mixed(WideToUTF16(kNonASCIIMixed));
-  const string16 expected_lower(WideToUTF16(kNonASCIILower));
-  const string16 expected_upper(WideToUTF16(kNonASCIIUpper));
-
-  string16 result = ToLower(mixed);
-  EXPECT_EQ(expected_lower, result);
-
-  result = ToUpper(mixed);
-  EXPECT_EQ(expected_upper, result);
-}
-
-TEST(CaseConversionTest, TurkishLocaleConversion) {
-  const string16 mixed(WideToUTF16(L"\x49\x131"));
-  const string16 expected_lower(WideToUTF16(L"\x69\x131"));
-  const string16 expected_upper(WideToUTF16(L"\x49\x49"));
-
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  i18n::SetICUDefaultLocale("en_US");
-
-  string16 result = ToLower(mixed);
-  EXPECT_EQ(expected_lower, result);
-
-  result = ToUpper(mixed);
-  EXPECT_EQ(expected_upper, result);
-
-  i18n::SetICUDefaultLocale("tr");
-
-  const string16 expected_lower_turkish(WideToUTF16(L"\x131\x131"));
-  const string16 expected_upper_turkish(WideToUTF16(L"\x49\x49"));
-
-  result = ToLower(mixed);
-  EXPECT_EQ(expected_lower_turkish, result);
-
-  result = ToUpper(mixed);
-  EXPECT_EQ(expected_upper_turkish, result);
-}
-
-TEST(CaseConversionTest, FoldCase) {
-  // Simple ASCII, should lower-case.
-  EXPECT_EQ(ASCIIToUTF16("hello, world"),
-            FoldCase(ASCIIToUTF16("Hello, World")));
-
-  // Non-ASCII cases from above. They should all fold to the same result.
-  EXPECT_EQ(FoldCase(WideToUTF16(kNonASCIIMixed)),
-            FoldCase(WideToUTF16(kNonASCIILower)));
-  EXPECT_EQ(FoldCase(WideToUTF16(kNonASCIIMixed)),
-            FoldCase(WideToUTF16(kNonASCIIUpper)));
-
-  // Turkish cases from above. This is the lower-case expected result from the
-  // US locale. It should be the same even when the current locale is Turkish.
-  const string16 turkish(WideToUTF16(L"\x49\x131"));
-  const string16 turkish_expected(WideToUTF16(L"\x69\x131"));
-
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  i18n::SetICUDefaultLocale("en_US");
-  EXPECT_EQ(turkish_expected, FoldCase(turkish));
-
-  i18n::SetICUDefaultLocale("tr");
-  EXPECT_EQ(turkish_expected, FoldCase(turkish));
-
-  // Test a case that gets bigger when processed.
-  // U+130 = LATIN CAPITAL LETTER I WITH DOT ABOVE gets folded to a lower case
-  // "i" followed by U+307 COMBINING DOT ABOVE.
-  EXPECT_EQ(WideToUTF16(L"i\u0307j"), FoldCase(WideToUTF16(L"\u0130j")));
-
-  // U+00DF (SHARP S) and U+1E9E (CAPIRAL SHARP S) are both folded to "ss".
-  EXPECT_EQ(ASCIIToUTF16("ssss"), FoldCase(WideToUTF16(L"\u00DF\u1E9E")));
-}
-
-}  // namespace i18n
-}  // namespace base
-
-
-
diff --git a/base/i18n/char_iterator_unittest.cc b/base/i18n/char_iterator_unittest.cc
deleted file mode 100644
index 0cf8e6c..0000000
--- a/base/i18n/char_iterator_unittest.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/char_iterator.h"
-
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace i18n {
-
-TEST(CharIteratorsTest, TestUTF8) {
-  std::string empty;
-  UTF8CharIterator empty_iter(&empty);
-  ASSERT_TRUE(empty_iter.end());
-  ASSERT_EQ(0, empty_iter.array_pos());
-  ASSERT_EQ(0, empty_iter.char_pos());
-  ASSERT_FALSE(empty_iter.Advance());
-
-  std::string str("s\303\273r");  // [u with circumflex]
-  UTF8CharIterator iter(&str);
-  ASSERT_FALSE(iter.end());
-  ASSERT_EQ(0, iter.array_pos());
-  ASSERT_EQ(0, iter.char_pos());
-  ASSERT_EQ('s', iter.get());
-  ASSERT_TRUE(iter.Advance());
-
-  ASSERT_FALSE(iter.end());
-  ASSERT_EQ(1, iter.array_pos());
-  ASSERT_EQ(1, iter.char_pos());
-  ASSERT_EQ(251, iter.get());
-  ASSERT_TRUE(iter.Advance());
-
-  ASSERT_FALSE(iter.end());
-  ASSERT_EQ(3, iter.array_pos());
-  ASSERT_EQ(2, iter.char_pos());
-  ASSERT_EQ('r', iter.get());
-  ASSERT_TRUE(iter.Advance());
-
-  ASSERT_TRUE(iter.end());
-  ASSERT_EQ(4, iter.array_pos());
-  ASSERT_EQ(3, iter.char_pos());
-
-  // Don't care what it returns, but this shouldn't crash
-  iter.get();
-
-  ASSERT_FALSE(iter.Advance());
-}
-
-TEST(CharIteratorsTest, TestUTF16) {
-  string16 empty = UTF8ToUTF16("");
-  UTF16CharIterator empty_iter(&empty);
-  ASSERT_TRUE(empty_iter.end());
-  ASSERT_EQ(0, empty_iter.array_pos());
-  ASSERT_EQ(0, empty_iter.char_pos());
-  ASSERT_FALSE(empty_iter.Advance());
-
-  // This test string contains 4 characters:
-  //   x
-  //   u with circumflex - 2 bytes in UTF8, 1 codeword in UTF16
-  //   math double-struck A - 4 bytes in UTF8, 2 codewords in UTF16
-  //   z
-  string16 str = UTF8ToUTF16("x\303\273\360\235\224\270z");
-  UTF16CharIterator iter(&str);
-  ASSERT_FALSE(iter.end());
-  ASSERT_EQ(0, iter.array_pos());
-  ASSERT_EQ(0, iter.char_pos());
-  ASSERT_EQ('x', iter.get());
-  ASSERT_TRUE(iter.Advance());
-
-  ASSERT_FALSE(iter.end());
-  ASSERT_EQ(1, iter.array_pos());
-  ASSERT_EQ(1, iter.char_pos());
-  ASSERT_EQ(251, iter.get());
-  ASSERT_TRUE(iter.Advance());
-
-  ASSERT_FALSE(iter.end());
-  ASSERT_EQ(2, iter.array_pos());
-  ASSERT_EQ(2, iter.char_pos());
-  ASSERT_EQ(120120, iter.get());
-  ASSERT_TRUE(iter.Advance());
-
-  ASSERT_FALSE(iter.end());
-  ASSERT_EQ(4, iter.array_pos());
-  ASSERT_EQ(3, iter.char_pos());
-  ASSERT_EQ('z', iter.get());
-  ASSERT_TRUE(iter.Advance());
-
-  ASSERT_TRUE(iter.end());
-  ASSERT_EQ(5, iter.array_pos());
-  ASSERT_EQ(4, iter.char_pos());
-
-  // Don't care what it returns, but this shouldn't crash
-  iter.get();
-
-  ASSERT_FALSE(iter.Advance());
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/character_encoding_unittest.cc b/base/i18n/character_encoding_unittest.cc
deleted file mode 100644
index 3c11ba3..0000000
--- a/base/i18n/character_encoding_unittest.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/character_encoding.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(CharacterEncodingTest, GetCanonicalEncodingNameByAliasName) {
-  EXPECT_EQ("Big5", GetCanonicalEncodingNameByAliasName("Big5"));
-  EXPECT_EQ("windows-874", GetCanonicalEncodingNameByAliasName("windows-874"));
-  EXPECT_EQ("ISO-8859-8", GetCanonicalEncodingNameByAliasName("ISO-8859-8"));
-
-  // Non-canonical alias names should be converted to a canonical one.
-  EXPECT_EQ("UTF-8", GetCanonicalEncodingNameByAliasName("utf8"));
-  EXPECT_EQ("gb18030", GetCanonicalEncodingNameByAliasName("GB18030"));
-  EXPECT_EQ("windows-874", GetCanonicalEncodingNameByAliasName("tis-620"));
-  EXPECT_EQ("EUC-KR", GetCanonicalEncodingNameByAliasName("ks_c_5601-1987"));
-}
-
-}  // namespace base
diff --git a/base/i18n/file_util_icu_unittest.cc b/base/i18n/file_util_icu_unittest.cc
deleted file mode 100644
index f1c2ecc..0000000
--- a/base/i18n/file_util_icu_unittest.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/file_util_icu.h"
-
-#include <stddef.h>
-
-#include "base/files/file_util.h"
-#include "base/macros.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-namespace base {
-namespace i18n {
-
-// file_util winds up using autoreleased objects on the Mac, so this needs
-// to be a PlatformTest
-class FileUtilICUTest : public PlatformTest {
-};
-
-#if defined(OS_POSIX) && !defined(OS_MACOSX)
-
-// On linux, file path is parsed and filtered as UTF-8.
-static const struct GoodBadPairLinux {
-  const char* bad_name;
-  const char* good_name;
-} kLinuxIllegalCharacterCases[] = {
-  {"bad*\\/file:name?.jpg", "bad---file-name-.jpg"},
-  {"**********::::.txt", "--------------.txt"},
-  {"\xe9\xf0zzzz.\xff", "\xe9\xf0zzzz.\xff"},
-  {" _ ", "-_-"},
-  {".", "-"},
-  {" .( ). ", "-.( ).-"},
-  {"     ", "-   -"},
-};
-
-TEST_F(FileUtilICUTest, ReplaceIllegalCharactersInPathLinuxTest) {
-  for (size_t i = 0; i < arraysize(kLinuxIllegalCharacterCases); ++i) {
-    std::string bad_name(kLinuxIllegalCharacterCases[i].bad_name);
-    ReplaceIllegalCharactersInPath(&bad_name, '-');
-    EXPECT_EQ(kLinuxIllegalCharacterCases[i].good_name, bad_name);
-  }
-}
-
-#endif
-
-// For Mac & Windows, which both do Unicode validation on filenames. These
-// characters are given as wide strings since its more convenient to specify
-// unicode characters. For Mac they should be converted to UTF-8.
-static const struct goodbad_pair {
-  const wchar_t* bad_name;
-  const wchar_t* good_name;
-} kIllegalCharacterCases[] = {
-    {L"bad*file:name?.jpg", L"bad-file-name-.jpg"},
-    {L"**********::::.txt", L"--------------.txt"},
-    // We can't use UCNs (universal character names) for C0/C1 characters and
-    // U+007F, but \x escape is interpreted by MSVC and gcc as we intend.
-    {L"bad\x0003\x0091 file\u200E\u200Fname.png", L"bad-- file--name.png"},
-    {L"bad*file\\?name.jpg", L"bad-file--name.jpg"},
-    {L"\t  bad*file\\name/.jpg", L"-  bad-file-name-.jpg"},
-    {L"this_file_name is okay!.mp3", L"this_file_name is okay!.mp3"},
-    {L"\u4E00\uAC00.mp3", L"\u4E00\uAC00.mp3"},
-    {L"\u0635\u200C\u0644.mp3", L"\u0635-\u0644.mp3"},
-    {L"\U00010330\U00010331.mp3", L"\U00010330\U00010331.mp3"},
-    // Unassigned codepoints are ok.
-    {L"\u0378\U00040001.mp3", L"\u0378\U00040001.mp3"},
-    // Non-characters are not allowed.
-    {L"bad\uFFFFfile\U0010FFFEname.jpg", L"bad-file-name.jpg"},
-    {L"bad\uFDD0file\uFDEFname.jpg", L"bad-file-name.jpg"},
-    // CVE-2014-9390
-    {L"(\u200C.\u200D.\u200E.\u200F.\u202A.\u202B.\u202C.\u202D.\u202E.\u206A."
-     L"\u206B.\u206C.\u206D.\u206F.\uFEFF)",
-     L"(-.-.-.-.-.-.-.-.-.-.-.-.-.-.-)"},
-    {L"config~1", L"config-1"},
-    {L" _ ", L"-_-"},
-    {L" ", L"-"},
-    {L"\u2008.(\u2007).\u3000", L"-.(\u2007).-"},
-    {L"     ", L"-   -"},
-    {L".    ", L"-   -"}
-};
-
-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_POSIX)
-
-TEST_F(FileUtilICUTest, ReplaceIllegalCharactersInPathTest) {
-  for (size_t i = 0; i < arraysize(kIllegalCharacterCases); ++i) {
-#if defined(OS_WIN)
-    std::wstring bad_name(kIllegalCharacterCases[i].bad_name);
-    ReplaceIllegalCharactersInPath(&bad_name, '-');
-    EXPECT_EQ(kIllegalCharacterCases[i].good_name, bad_name);
-#else
-    std::string bad_name(WideToUTF8(kIllegalCharacterCases[i].bad_name));
-    ReplaceIllegalCharactersInPath(&bad_name, '-');
-    EXPECT_EQ(WideToUTF8(kIllegalCharacterCases[i].good_name), bad_name);
-#endif
-  }
-}
-
-#endif
-
-TEST_F(FileUtilICUTest, IsFilenameLegalTest) {
-  EXPECT_TRUE(IsFilenameLegal(string16()));
-
-  for (const auto& test_case : kIllegalCharacterCases) {
-    string16 bad_name = WideToUTF16(test_case.bad_name);
-    string16 good_name = WideToUTF16(test_case.good_name);
-
-    EXPECT_TRUE(IsFilenameLegal(good_name)) << good_name;
-    if (good_name != bad_name)
-      EXPECT_FALSE(IsFilenameLegal(bad_name)) << bad_name;
-  }
-}
-
-#if defined(OS_CHROMEOS)
-static const struct normalize_name_encoding_test_cases {
-  const char* original_path;
-  const char* normalized_path;
-} kNormalizeFileNameEncodingTestCases[] = {
-  { "foo_na\xcc\x88me.foo", "foo_n\xc3\xa4me.foo"},
-  { "foo_dir_na\xcc\x88me/foo_na\xcc\x88me.foo",
-    "foo_dir_na\xcc\x88me/foo_n\xc3\xa4me.foo"},
-  { "", ""},
-  { "foo_dir_na\xcc\x88me/", "foo_dir_n\xc3\xa4me"}
-};
-
-TEST_F(FileUtilICUTest, NormalizeFileNameEncoding) {
-  for (size_t i = 0; i < arraysize(kNormalizeFileNameEncodingTestCases); i++) {
-    FilePath path(kNormalizeFileNameEncodingTestCases[i].original_path);
-    NormalizeFileNameEncoding(&path);
-    EXPECT_EQ(FilePath(kNormalizeFileNameEncodingTestCases[i].normalized_path),
-              path);
-  }
-}
-
-#endif
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/icu_string_conversions_unittest.cc b/base/i18n/icu_string_conversions_unittest.cc
deleted file mode 100644
index 871f18b..0000000
--- a/base/i18n/icu_string_conversions_unittest.cc
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <math.h>
-#include <stdarg.h>
-#include <stddef.h>
-
-#include <limits>
-#include <sstream>
-
-#include "base/format_macros.h"
-#include "base/i18n/icu_string_conversions.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-// Given a null-terminated string of wchar_t with each wchar_t representing
-// a UTF-16 code unit, returns a string16 made up of wchar_t's in the input.
-// Each wchar_t should be <= 0xFFFF and a non-BMP character (> U+FFFF)
-// should be represented as a surrogate pair (two UTF-16 units)
-// *even* where wchar_t is 32-bit (Linux and Mac).
-//
-// This is to help write tests for functions with string16 params until
-// the C++ 0x UTF-16 literal is well-supported by compilers.
-string16 BuildString16(const wchar_t* s) {
-#if defined(WCHAR_T_IS_UTF16)
-  return string16(s);
-#elif defined(WCHAR_T_IS_UTF32)
-  string16 u16;
-  while (*s != 0) {
-    DCHECK_LE(static_cast<unsigned int>(*s), 0xFFFFu);
-    u16.push_back(*s++);
-  }
-  return u16;
-#endif
-}
-
-}  // namespace
-
-// kConverterCodepageCases is not comprehensive. There are a number of cases
-// to add if we really want to have a comprehensive coverage of various
-// codepages and their 'idiosyncrasies'. Currently, the only implementation
-// for CodepageTo* and *ToCodepage uses ICU, which has a very extensive
-// set of tests for the charset conversion. So, we can get away with a
-// relatively small number of cases listed below.
-//
-// Note about |u16_wide| in the following struct.
-// On Windows, the field is always identical to |wide|. On Mac and Linux,
-// it's identical as long as there's no character outside the
-// BMP (<= U+FFFF). When there is, it is different from |wide| and
-// is not a real wide string (UTF-32 string) in that each wchar_t in
-// the string is a UTF-16 code unit zero-extended to be 32-bit
-// even when the code unit belongs to a surrogate pair.
-// For instance, a Unicode string (U+0041 U+010000) is represented as
-// L"\x0041\xD800\xDC00" instead of L"\x0041\x10000".
-// To avoid the clutter, |u16_wide| will be set to NULL
-// if it's identical to |wide| on *all* platforms.
-
-static const struct {
-  const char* codepage_name;
-  const char* encoded;
-  OnStringConversionError::Type on_error;
-  bool success;
-  const wchar_t* wide;
-  const wchar_t* u16_wide;
-} kConvertCodepageCases[] = {
-    // Test a case where the input cannot be decoded, using SKIP, FAIL
-    // and SUBSTITUTE error handling rules. "A7 41" is valid, but "A6" isn't.
-    {"big5", "\xA7\x41\xA6", OnStringConversionError::FAIL, false, L"",
-     nullptr},
-    {"big5", "\xA7\x41\xA6", OnStringConversionError::SKIP, true, L"\x4F60",
-     nullptr},
-    {"big5", "\xA7\x41\xA6", OnStringConversionError::SUBSTITUTE, true,
-     L"\x4F60\xFFFD", nullptr},
-    // Arabic (ISO-8859)
-    {"iso-8859-6",
-     "\xC7\xEE\xE4\xD3\xF1\xEE\xE4\xC7\xE5\xEF"
-     " "
-     "\xD9\xEE\xE4\xEE\xEA\xF2\xE3\xEF\xE5\xF2",
-     OnStringConversionError::FAIL, true,
-     L"\x0627\x064E\x0644\x0633\x0651\x064E\x0644\x0627\x0645\x064F"
-     L" "
-     L"\x0639\x064E\x0644\x064E\x064A\x0652\x0643\x064F\x0645\x0652",
-     nullptr},
-    // Chinese Simplified (GB2312)
-    {"gb2312", "\xC4\xE3\xBA\xC3", OnStringConversionError::FAIL, true,
-     L"\x4F60\x597D", nullptr},
-    // Chinese (GB18030) : 4 byte sequences mapped to BMP characters
-    {"gb18030", "\x81\x30\x84\x36\xA1\xA7", OnStringConversionError::FAIL, true,
-     L"\x00A5\x00A8", nullptr},
-    // Chinese (GB18030) : A 4 byte sequence mapped to plane 2 (U+20000)
-    {"gb18030", "\x95\x32\x82\x36\xD2\xBB", OnStringConversionError::FAIL, true,
-#if defined(WCHAR_T_IS_UTF16)
-     L"\xD840\xDC00\x4E00",
-#elif defined(WCHAR_T_IS_UTF32)
-     L"\x20000\x4E00",
-#endif
-     L"\xD840\xDC00\x4E00"},
-    {"big5", "\xA7\x41\xA6\x6E", OnStringConversionError::FAIL, true,
-     L"\x4F60\x597D", nullptr},
-    // Greek (ISO-8859)
-    {"iso-8859-7",
-     "\xE3\xE5\xE9\xDC"
-     " "
-     "\xF3\xEF\xF5",
-     OnStringConversionError::FAIL, true,
-     L"\x03B3\x03B5\x03B9\x03AC"
-     L" "
-     L"\x03C3\x03BF\x03C5",
-     nullptr},
-    // Hebrew (Windows)
-    {"windows-1255", "\xF9\xD1\xC8\xEC\xE5\xC9\xED",
-     OnStringConversionError::FAIL, true,
-     L"\x05E9\x05C1\x05B8\x05DC\x05D5\x05B9\x05DD", nullptr},
-    // Korean (EUC)
-    {"euc-kr", "\xBE\xC8\xB3\xE7\xC7\xCF\xBC\xBC\xBF\xE4",
-     OnStringConversionError::FAIL, true, L"\xC548\xB155\xD558\xC138\xC694",
-     nullptr},
-    // Japanese (EUC)
-    {"euc-jp", "\xA4\xB3\xA4\xF3\xA4\xCB\xA4\xC1\xA4\xCF\xB0\xEC\x8E\xA6",
-     OnStringConversionError::FAIL, true,
-     L"\x3053\x3093\x306B\x3061\x306F\x4E00\xFF66", nullptr},
-    // Japanese (ISO-2022)
-    {"iso-2022-jp",
-     "\x1B$B"
-     "\x24\x33\x24\x73\x24\x4B\x24\x41\x24\x4F\x30\x6C"
-     "\x1B(B"
-     "ab"
-     "\x1B(J"
-     "\x5C\x7E#$"
-     "\x1B(B",
-     OnStringConversionError::FAIL, true,
-     L"\x3053\x3093\x306B\x3061\x306F\x4E00"
-     L"ab\x00A5\x203E#$",
-     nullptr},
-    // Japanese (Shift-JIS)
-    {"sjis", "\x82\xB1\x82\xF1\x82\xC9\x82\xBF\x82\xCD\x88\xEA\xA6",
-     OnStringConversionError::FAIL, true,
-     L"\x3053\x3093\x306B\x3061\x306F\x4E00\xFF66", nullptr},
-    // Russian (KOI8)
-    {"koi8-r", "\xDA\xC4\xD2\xC1\xD7\xD3\xD4\xD7\xD5\xCA\xD4\xC5",
-     OnStringConversionError::FAIL, true,
-     L"\x0437\x0434\x0440\x0430\x0432\x0441\x0442\x0432"
-     L"\x0443\x0439\x0442\x0435",
-     nullptr},
-    // Thai (windows-874)
-    {"windows-874",
-     "\xCA\xC7\xD1\xCA\xB4\xD5"
-     "\xA4\xC3\xD1\xBA",
-     OnStringConversionError::FAIL, true,
-     L"\x0E2A\x0E27\x0E31\x0E2A\x0E14\x0E35"
-     L"\x0E04\x0E23\x0e31\x0E1A",
-     nullptr},
-};
-
-TEST(ICUStringConversionsTest, ConvertBetweenCodepageAndUTF16) {
-  for (size_t i = 0; i < arraysize(kConvertCodepageCases); ++i) {
-    SCOPED_TRACE(base::StringPrintf(
-                     "Test[%" PRIuS "]: <encoded: %s> <codepage: %s>", i,
-                     kConvertCodepageCases[i].encoded,
-                     kConvertCodepageCases[i].codepage_name));
-
-    string16 utf16;
-    bool success = CodepageToUTF16(kConvertCodepageCases[i].encoded,
-                                   kConvertCodepageCases[i].codepage_name,
-                                   kConvertCodepageCases[i].on_error,
-                                   &utf16);
-    string16 utf16_expected;
-    if (kConvertCodepageCases[i].u16_wide == nullptr)
-      utf16_expected = BuildString16(kConvertCodepageCases[i].wide);
-    else
-      utf16_expected = BuildString16(kConvertCodepageCases[i].u16_wide);
-    EXPECT_EQ(kConvertCodepageCases[i].success, success);
-    EXPECT_EQ(utf16_expected, utf16);
-
-    // When decoding was successful and nothing was skipped, we also check the
-    // reverse conversion. See also the corresponding comment in
-    // ConvertBetweenCodepageAndWide.
-    if (success &&
-        kConvertCodepageCases[i].on_error == OnStringConversionError::FAIL) {
-      std::string encoded;
-      success = UTF16ToCodepage(utf16, kConvertCodepageCases[i].codepage_name,
-                                kConvertCodepageCases[i].on_error, &encoded);
-      EXPECT_EQ(kConvertCodepageCases[i].success, success);
-      EXPECT_EQ(kConvertCodepageCases[i].encoded, encoded);
-    }
-  }
-}
-
-static const struct {
-  const char* encoded;
-  const char* codepage_name;
-  bool expected_success;
-  const char* expected_value;
-} kConvertAndNormalizeCases[] = {
-  {"foo-\xe4.html", "iso-8859-1", true, "foo-\xc3\xa4.html"},
-  {"foo-\xe4.html", "iso-8859-7", true, "foo-\xce\xb4.html"},
-  {"foo-\xe4.html", "foo-bar", false, ""},
-  // HTML Encoding spec treats US-ASCII as synonymous with windows-1252
-  {"foo-\xff.html", "ascii", true, "foo-\xc3\xbf.html"},
-  {"foo.html", "ascii", true, "foo.html"},
-  {"foo-a\xcc\x88.html", "utf-8", true, "foo-\xc3\xa4.html"},
-  {"\x95\x32\x82\x36\xD2\xBB", "gb18030", true, "\xF0\xA0\x80\x80\xE4\xB8\x80"},
-  {"\xA7\x41\xA6\x6E", "big5", true, "\xE4\xBD\xA0\xE5\xA5\xBD"},
-  // Windows-1258 does have a combining character at xD2 (which is U+0309).
-  // The sequence of (U+00E2, U+0309) is also encoded as U+1EA9.
-  {"foo\xE2\xD2", "windows-1258", true, "foo\xE1\xBA\xA9"},
-  {"", "iso-8859-1", true, ""},
-};
-TEST(ICUStringConversionsTest, ConvertToUtf8AndNormalize) {
-  std::string result;
-  for (size_t i = 0; i < arraysize(kConvertAndNormalizeCases); ++i) {
-    SCOPED_TRACE(base::StringPrintf(
-                     "Test[%" PRIuS "]: <encoded: %s> <codepage: %s>", i,
-                     kConvertAndNormalizeCases[i].encoded,
-                     kConvertAndNormalizeCases[i].codepage_name));
-
-    bool success = ConvertToUtf8AndNormalize(
-        kConvertAndNormalizeCases[i].encoded,
-        kConvertAndNormalizeCases[i].codepage_name, &result);
-    EXPECT_EQ(kConvertAndNormalizeCases[i].expected_success, success);
-    EXPECT_EQ(kConvertAndNormalizeCases[i].expected_value, result);
-  }
-}
-
-}  // namespace base
diff --git a/base/i18n/message_formatter_unittest.cc b/base/i18n/message_formatter_unittest.cc
deleted file mode 100644
index a6f4613..0000000
--- a/base/i18n/message_formatter_unittest.cc
+++ /dev/null
@@ -1,185 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/message_formatter.h"
-
-#include <memory>
-
-#include "base/i18n/rtl.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/icu/source/common/unicode/unistr.h"
-#include "third_party/icu/source/i18n/unicode/datefmt.h"
-#include "third_party/icu/source/i18n/unicode/msgfmt.h"
-
-typedef testing::Test MessageFormatterTest;
-
-namespace base {
-namespace i18n {
-
-class MessageFormatterTest : public testing::Test {
- protected:
-  MessageFormatterTest() {
-    original_locale_ = GetConfiguredLocale();
-    SetICUDefaultLocale("en-US");
-  }
-  ~MessageFormatterTest() override {
-    SetICUDefaultLocale(original_locale_);
-  }
-
- private:
-  std::string original_locale_;
-};
-
-namespace {
-
-void AppendFormattedDateTime(const std::unique_ptr<icu::DateFormat>& df,
-                             const Time& now,
-                             std::string* result) {
-  icu::UnicodeString formatted;
-  df->format(static_cast<UDate>(now.ToJsTime()), formatted).
-      toUTF8String(*result);
-}
-
-}  // namespace
-
-TEST_F(MessageFormatterTest, PluralNamedArgs) {
-  const string16 pattern = ASCIIToUTF16(
-      "{num_people, plural, "
-      "=0 {I met nobody in {place}.}"
-      "=1 {I met a person in {place}.}"
-      "other {I met # people in {place}.}}");
-
-  std::string result = UTF16ToASCII(MessageFormatter::FormatWithNamedArgs(
-      pattern, "num_people", 0, "place", "Paris"));
-  EXPECT_EQ("I met nobody in Paris.", result);
-  result = UTF16ToASCII(MessageFormatter::FormatWithNamedArgs(
-      pattern, "num_people", 1, "place", "Paris"));
-  EXPECT_EQ("I met a person in Paris.", result);
-  result = UTF16ToASCII(MessageFormatter::FormatWithNamedArgs(
-      pattern, "num_people", 5, "place", "Paris"));
-  EXPECT_EQ("I met 5 people in Paris.", result);
-}
-
-TEST_F(MessageFormatterTest, PluralNamedArgsWithOffset) {
-  const string16 pattern = ASCIIToUTF16(
-      "{num_people, plural, offset:1 "
-      "=0 {I met nobody in {place}.}"
-      "=1 {I met {person} in {place}.}"
-      "=2 {I met {person} and one other person in {place}.}"
-      "=13 {I met {person} and a dozen other people in {place}.}"
-      "other {I met {person} and # other people in {place}.}}");
-
-  std::string result = UTF16ToASCII(MessageFormatter::FormatWithNamedArgs(
-      pattern, "num_people", 0, "place", "Paris"));
-  EXPECT_EQ("I met nobody in Paris.", result);
-  // {person} is ignored if {num_people} is 0.
-  result = UTF16ToASCII(MessageFormatter::FormatWithNamedArgs(
-      pattern, "num_people", 0, "place", "Paris", "person", "Peter"));
-  EXPECT_EQ("I met nobody in Paris.", result);
-  result = UTF16ToASCII(MessageFormatter::FormatWithNamedArgs(
-      pattern, "num_people", 1, "place", "Paris", "person", "Peter"));
-  EXPECT_EQ("I met Peter in Paris.", result);
-  result = UTF16ToASCII(MessageFormatter::FormatWithNamedArgs(
-      pattern, "num_people", 2, "place", "Paris", "person", "Peter"));
-  EXPECT_EQ("I met Peter and one other person in Paris.", result);
-  result = UTF16ToASCII(MessageFormatter::FormatWithNamedArgs(
-      pattern, "num_people", 13, "place", "Paris", "person", "Peter"));
-  EXPECT_EQ("I met Peter and a dozen other people in Paris.", result);
-  result = UTF16ToASCII(MessageFormatter::FormatWithNamedArgs(
-      pattern, "num_people", 50, "place", "Paris", "person", "Peter"));
-  EXPECT_EQ("I met Peter and 49 other people in Paris.", result);
-}
-
-TEST_F(MessageFormatterTest, PluralNumberedArgs) {
-  const string16 pattern = ASCIIToUTF16(
-      "{1, plural, "
-      "=1 {The cert for {0} expired yesterday.}"
-      "=7 {The cert for {0} expired a week ago.}"
-      "other {The cert for {0} expired # days ago.}}");
-
-  std::string result = UTF16ToASCII(MessageFormatter::FormatWithNumberedArgs(
-      pattern, "example.com", 1));
-  EXPECT_EQ("The cert for example.com expired yesterday.", result);
-  result = UTF16ToASCII(MessageFormatter::FormatWithNumberedArgs(
-      pattern, "example.com", 7));
-  EXPECT_EQ("The cert for example.com expired a week ago.", result);
-  result = UTF16ToASCII(MessageFormatter::FormatWithNumberedArgs(
-      pattern, "example.com", 15));
-  EXPECT_EQ("The cert for example.com expired 15 days ago.", result);
-}
-
-TEST_F(MessageFormatterTest, PluralNumberedArgsWithDate) {
-  const string16 pattern = ASCIIToUTF16(
-      "{1, plural, "
-      "=1 {The cert for {0} expired yesterday. Today is {2,date,full}}"
-      "other {The cert for {0} expired # days ago. Today is {2,date,full}}}");
-
-  base::Time now = base::Time::Now();
-  using icu::DateFormat;
-  std::unique_ptr<DateFormat> df(
-      DateFormat::createDateInstance(DateFormat::FULL));
-  std::string second_sentence = " Today is ";
-  AppendFormattedDateTime(df, now, &second_sentence);
-
-  std::string result = UTF16ToASCII(MessageFormatter::FormatWithNumberedArgs(
-      pattern, "example.com", 1, now));
-  EXPECT_EQ("The cert for example.com expired yesterday." + second_sentence,
-            result);
-  result = UTF16ToASCII(MessageFormatter::FormatWithNumberedArgs(
-      pattern, "example.com", 15, now));
-  EXPECT_EQ("The cert for example.com expired 15 days ago." + second_sentence,
-            result);
-}
-
-TEST_F(MessageFormatterTest, DateTimeAndNumber) {
-  // Note that using 'mph' for all locales is not a good i18n practice.
-  const string16 pattern = ASCIIToUTF16(
-      "At {0,time, short} on {0,date, medium}, "
-      "there was {1} at building {2,number,integer}. "
-      "The speed of the wind was {3,number,###.#} mph.");
-
-  using icu::DateFormat;
-  std::unique_ptr<DateFormat> tf(
-      DateFormat::createTimeInstance(DateFormat::SHORT));
-  std::unique_ptr<DateFormat> df(
-      DateFormat::createDateInstance(DateFormat::MEDIUM));
-
-  base::Time now = base::Time::Now();
-  std::string expected = "At ";
-  AppendFormattedDateTime(tf, now, &expected);
-  expected.append(" on ");
-  AppendFormattedDateTime(df, now, &expected);
-  expected.append(", there was an explosion at building 3. "
-                  "The speed of the wind was 37.4 mph.");
-
-  EXPECT_EQ(expected, UTF16ToASCII(MessageFormatter::FormatWithNumberedArgs(
-      pattern, now, "an explosion", 3, 37.413)));
-}
-
-TEST_F(MessageFormatterTest, SelectorSingleOrMultiple) {
-  const string16 pattern = ASCIIToUTF16(
-      "{0, select,"
-      "single {Select a file to upload.}"
-      "multiple {Select files to upload.}"
-      "other {UNUSED}}");
-
-  std::string result = UTF16ToASCII(MessageFormatter::FormatWithNumberedArgs(
-      pattern, "single"));
-  EXPECT_EQ("Select a file to upload.", result);
-  result = UTF16ToASCII(MessageFormatter::FormatWithNumberedArgs(
-      pattern, "multiple"));
-  EXPECT_EQ("Select files to upload.", result);
-
-  // fallback if a parameter is not selectors specified in the message pattern.
-  result = UTF16ToASCII(MessageFormatter::FormatWithNumberedArgs(
-      pattern, "foobar"));
-  EXPECT_EQ("UNUSED", result);
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/number_formatting_unittest.cc b/base/i18n/number_formatting_unittest.cc
deleted file mode 100644
index 71b15a5..0000000
--- a/base/i18n/number_formatting_unittest.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-
-#include "base/i18n/number_formatting.h"
-#include "base/i18n/rtl.h"
-#include "base/macros.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/test/icu_test_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/icu/source/i18n/unicode/usearch.h"
-
-namespace base {
-namespace {
-
-TEST(NumberFormattingTest, FormatNumber) {
-  static const struct {
-    int64_t number;
-    const char* expected_english;
-    const char* expected_german;
-  } cases[] = {
-    {0, "0", "0"},
-    {1024, "1,024", "1.024"},
-    {std::numeric_limits<int64_t>::max(),
-        "9,223,372,036,854,775,807", "9.223.372.036.854.775.807"},
-    {std::numeric_limits<int64_t>::min(),
-        "-9,223,372,036,854,775,808", "-9.223.372.036.854.775.808"},
-    {-42, "-42", "-42"},
-  };
-
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    i18n::SetICUDefaultLocale("en");
-    testing::ResetFormatters();
-    EXPECT_EQ(cases[i].expected_english,
-              UTF16ToUTF8(FormatNumber(cases[i].number)));
-    i18n::SetICUDefaultLocale("de");
-    testing::ResetFormatters();
-    EXPECT_EQ(cases[i].expected_german,
-              UTF16ToUTF8(FormatNumber(cases[i].number)));
-  }
-}
-
-TEST(NumberFormattingTest, FormatDouble) {
-  static const struct {
-    double number;
-    int frac_digits;
-    const char* expected_english;
-    const char* expected_german;
-  } cases[] = {
-    {0.0, 0, "0", "0"},
-#if !defined(OS_ANDROID)
-    // Bionic can't printf negative zero correctly.
-    {-0.0, 4, "-0.0000", "-0,0000"},
-#endif
-    {1024.2, 0, "1,024", "1.024"},
-    {-1024.223, 2, "-1,024.22", "-1.024,22"},
-    {std::numeric_limits<double>::max(), 6,
-     "179,769,313,486,231,570,000,000,000,000,000,000,000,000,000,000,000,"
-     "000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,"
-     "000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,"
-     "000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,"
-     "000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,"
-     "000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,"
-     "000.000000",
-     "179.769.313.486.231.570.000.000.000.000.000.000.000.000.000.000.000."
-     "000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000."
-     "000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000."
-     "000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000."
-     "000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000."
-     "000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000."
-     "000,000000"},
-    {std::numeric_limits<double>::min(), 2, "0.00", "0,00"},
-    {-42.7, 3, "-42.700", "-42,700"},
-  };
-
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    i18n::SetICUDefaultLocale("en");
-    testing::ResetFormatters();
-    EXPECT_EQ(cases[i].expected_english,
-              UTF16ToUTF8(FormatDouble(cases[i].number, cases[i].frac_digits)));
-    i18n::SetICUDefaultLocale("de");
-    testing::ResetFormatters();
-    EXPECT_EQ(cases[i].expected_german,
-              UTF16ToUTF8(FormatDouble(cases[i].number, cases[i].frac_digits)));
-  }
-}
-
-TEST(NumberFormattingTest, FormatPercent) {
-  static const struct {
-    int64_t number;
-    const char* expected_english;
-    const wchar_t* expected_german;   // Note: Space before % isn't \x20.
-    // Note: Eastern Arabic-Indic digits (U+06Fx) for Persian and
-    // Arabic-Indic digits (U+066x) for Arabic.
-    // See https://unicode.org/cldr/trac/ticket/9040 for details.
-    // See also https://unicode.org/cldr/trac/ticket/10176 .
-    // For now, take what CLDR 32 has (percent sign to the right of
-    // a number in Persian).
-    const wchar_t* expected_persian;
-    const wchar_t* expected_arabic;
-  } cases[] = {
-      {0, "0%", L"0\xa0%", L"\x6f0\x66a", L"\x660\x66a\x61c"},
-      {42, "42%", L"42\xa0%", L"\x6f4\x6f2\x66a", L"\x664\x662\x66a\x61c"},
-      {1024, "1,024%", L"1.024\xa0%", L"\x6f1\x66c\x6f0\x6f2\x6f4\x66a",
-       L"\x661\x66c\x660\x662\x664\x66a\x61c"},
-  };
-
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    i18n::SetICUDefaultLocale("en");
-    EXPECT_EQ(ASCIIToUTF16(cases[i].expected_english),
-              FormatPercent(cases[i].number));
-    i18n::SetICUDefaultLocale("de");
-    EXPECT_EQ(WideToUTF16(cases[i].expected_german),
-              FormatPercent(cases[i].number));
-    i18n::SetICUDefaultLocale("fa");
-    EXPECT_EQ(WideToUTF16(cases[i].expected_persian),
-              FormatPercent(cases[i].number));
-    i18n::SetICUDefaultLocale("ar");
-    EXPECT_EQ(WideToUTF16(cases[i].expected_arabic),
-              FormatPercent(cases[i].number));
-  }
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/i18n/rtl_unittest.cc b/base/i18n/rtl_unittest.cc
deleted file mode 100644
index 88ae36a..0000000
--- a/base/i18n/rtl_unittest.cc
+++ /dev/null
@@ -1,567 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/rtl.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/strings/string_util.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/test/icu_test_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-#include "third_party/icu/source/common/unicode/locid.h"
-#include "third_party/icu/source/i18n/unicode/usearch.h"
-
-namespace base {
-namespace i18n {
-
-namespace {
-
-// A test utility function to set the application default text direction.
-void SetRTL(bool rtl) {
-  // Override the current locale/direction.
-  SetICUDefaultLocale(rtl ? "he" : "en");
-  EXPECT_EQ(rtl, IsRTL());
-}
-
-}  // namespace
-
-class RTLTest : public PlatformTest {
-};
-
-TEST_F(RTLTest, GetFirstStrongCharacterDirection) {
-  struct {
-    const wchar_t* text;
-    TextDirection direction;
-  } cases[] = {
-    // Test pure LTR string.
-    { L"foo bar", LEFT_TO_RIGHT },
-    // Test pure RTL string.
-    { L"\x05d0\x05d1\x05d2 \x05d3\x0d4\x05d5", RIGHT_TO_LEFT},
-    // Test bidi string in which the first character with strong directionality
-    // is a character with type L.
-    { L"foo \x05d0 bar", LEFT_TO_RIGHT },
-    // Test bidi string in which the first character with strong directionality
-    // is a character with type R.
-    { L"\x05d0 foo bar", RIGHT_TO_LEFT },
-    // Test bidi string which starts with a character with weak directionality
-    // and in which the first character with strong directionality is a
-    // character with type L.
-    { L"!foo \x05d0 bar", LEFT_TO_RIGHT },
-    // Test bidi string which starts with a character with weak directionality
-    // and in which the first character with strong directionality is a
-    // character with type R.
-    { L",\x05d0 foo bar", RIGHT_TO_LEFT },
-    // Test bidi string in which the first character with strong directionality
-    // is a character with type LRE.
-    { L"\x202a \x05d0 foo  bar", LEFT_TO_RIGHT },
-    // Test bidi string in which the first character with strong directionality
-    // is a character with type LRO.
-    { L"\x202d \x05d0 foo  bar", LEFT_TO_RIGHT },
-    // Test bidi string in which the first character with strong directionality
-    // is a character with type RLE.
-    { L"\x202b foo \x05d0 bar", RIGHT_TO_LEFT },
-    // Test bidi string in which the first character with strong directionality
-    // is a character with type RLO.
-    { L"\x202e foo \x05d0 bar", RIGHT_TO_LEFT },
-    // Test bidi string in which the first character with strong directionality
-    // is a character with type AL.
-    { L"\x0622 foo \x05d0 bar", RIGHT_TO_LEFT },
-    // Test a string without strong directionality characters.
-    { L",!.{}", LEFT_TO_RIGHT },
-    // Test empty string.
-    { L"", LEFT_TO_RIGHT },
-    // Test characters in non-BMP (e.g. Phoenician letters. Please refer to
-    // http://demo.icu-project.org/icu-bin/ubrowse?scr=151&b=10910 for more
-    // information).
-    {
-#if defined(WCHAR_T_IS_UTF32)
-      L" ! \x10910" L"abc 123",
-#elif defined(WCHAR_T_IS_UTF16)
-      L" ! \xd802\xdd10" L"abc 123",
-#else
-#error wchar_t should be either UTF-16 or UTF-32
-#endif
-      RIGHT_TO_LEFT },
-    {
-#if defined(WCHAR_T_IS_UTF32)
-      L" ! \x10401" L"abc 123",
-#elif defined(WCHAR_T_IS_UTF16)
-      L" ! \xd801\xdc01" L"abc 123",
-#else
-#error wchar_t should be either UTF-16 or UTF-32
-#endif
-      LEFT_TO_RIGHT },
-   };
-
-  for (size_t i = 0; i < arraysize(cases); ++i)
-    EXPECT_EQ(cases[i].direction,
-              GetFirstStrongCharacterDirection(WideToUTF16(cases[i].text)));
-}
-
-
-// Note that the cases with LRE, LRO, RLE and RLO are invalid for
-// GetLastStrongCharacterDirection because they should be followed by PDF
-// character.
-TEST_F(RTLTest, GetLastStrongCharacterDirection) {
-  struct {
-    const wchar_t* text;
-    TextDirection direction;
-  } cases[] = {
-    // Test pure LTR string.
-    { L"foo bar", LEFT_TO_RIGHT },
-    // Test pure RTL string.
-    { L"\x05d0\x05d1\x05d2 \x05d3\x0d4\x05d5", RIGHT_TO_LEFT},
-    // Test bidi string in which the last character with strong directionality
-    // is a character with type L.
-    { L"foo \x05d0 bar", LEFT_TO_RIGHT },
-    // Test bidi string in which the last character with strong directionality
-    // is a character with type R.
-    { L"\x05d0 foo bar \x05d3", RIGHT_TO_LEFT },
-    // Test bidi string which ends with a character with weak directionality
-    // and in which the last character with strong directionality is a
-    // character with type L.
-    { L"!foo \x05d0 bar!", LEFT_TO_RIGHT },
-    // Test bidi string which ends with a character with weak directionality
-    // and in which the last character with strong directionality is a
-    // character with type R.
-    { L",\x05d0 foo bar \x05d1,", RIGHT_TO_LEFT },
-    // Test bidi string in which the last character with strong directionality
-    // is a character with type AL.
-    { L"\x0622 foo \x05d0 bar \x0622", RIGHT_TO_LEFT },
-    // Test a string without strong directionality characters.
-    { L",!.{}", LEFT_TO_RIGHT },
-    // Test empty string.
-    { L"", LEFT_TO_RIGHT },
-    // Test characters in non-BMP (e.g. Phoenician letters. Please refer to
-    // http://demo.icu-project.org/icu-bin/ubrowse?scr=151&b=10910 for more
-    // information).
-    {
-#if defined(WCHAR_T_IS_UTF32)
-       L"abc 123" L" ! \x10910 !",
-#elif defined(WCHAR_T_IS_UTF16)
-       L"abc 123" L" ! \xd802\xdd10 !",
-#else
-#error wchar_t should be either UTF-16 or UTF-32
-#endif
-      RIGHT_TO_LEFT },
-    {
-#if defined(WCHAR_T_IS_UTF32)
-       L"abc 123" L" ! \x10401 !",
-#elif defined(WCHAR_T_IS_UTF16)
-       L"abc 123" L" ! \xd801\xdc01 !",
-#else
-#error wchar_t should be either UTF-16 or UTF-32
-#endif
-      LEFT_TO_RIGHT },
-   };
-
-  for (size_t i = 0; i < arraysize(cases); ++i)
-    EXPECT_EQ(cases[i].direction,
-              GetLastStrongCharacterDirection(WideToUTF16(cases[i].text)));
-}
-
-TEST_F(RTLTest, GetStringDirection) {
-  struct {
-    const wchar_t* text;
-    TextDirection direction;
-  } cases[] = {
-    // Test pure LTR string.
-    { L"foobar", LEFT_TO_RIGHT },
-    { L".foobar", LEFT_TO_RIGHT },
-    { L"foo, bar", LEFT_TO_RIGHT },
-    // Test pure LTR with strong directionality characters of type LRE.
-    { L"\x202a\x202a", LEFT_TO_RIGHT },
-    { L".\x202a\x202a", LEFT_TO_RIGHT },
-    { L"\x202a, \x202a", LEFT_TO_RIGHT },
-    // Test pure LTR with strong directionality characters of type LRO.
-    { L"\x202d\x202d", LEFT_TO_RIGHT },
-    { L".\x202d\x202d", LEFT_TO_RIGHT },
-    { L"\x202d, \x202d", LEFT_TO_RIGHT },
-    // Test pure LTR with various types of strong directionality characters.
-    { L"foo \x202a\x202d", LEFT_TO_RIGHT },
-    { L".\x202d foo \x202a", LEFT_TO_RIGHT },
-    { L"\x202a, \x202d foo", LEFT_TO_RIGHT },
-    // Test pure RTL with strong directionality characters of type R.
-    { L"\x05d0\x05d0", RIGHT_TO_LEFT },
-    { L".\x05d0\x05d0", RIGHT_TO_LEFT },
-    { L"\x05d0, \x05d0", RIGHT_TO_LEFT },
-    // Test pure RTL with strong directionality characters of type RLE.
-    { L"\x202b\x202b", RIGHT_TO_LEFT },
-    { L".\x202b\x202b", RIGHT_TO_LEFT },
-    { L"\x202b, \x202b", RIGHT_TO_LEFT },
-    // Test pure RTL with strong directionality characters of type RLO.
-    { L"\x202e\x202e", RIGHT_TO_LEFT },
-    { L".\x202e\x202e", RIGHT_TO_LEFT },
-    { L"\x202e, \x202e", RIGHT_TO_LEFT },
-    // Test pure RTL with strong directionality characters of type AL.
-    { L"\x0622\x0622", RIGHT_TO_LEFT },
-    { L".\x0622\x0622", RIGHT_TO_LEFT },
-    { L"\x0622, \x0622", RIGHT_TO_LEFT },
-    // Test pure RTL with various types of strong directionality characters.
-    { L"\x05d0\x202b\x202e\x0622", RIGHT_TO_LEFT },
-    { L".\x202b\x202e\x0622\x05d0", RIGHT_TO_LEFT },
-    { L"\x0622\x202e, \x202b\x05d0", RIGHT_TO_LEFT },
-    // Test bidi strings.
-    { L"foo \x05d0 bar", UNKNOWN_DIRECTION },
-    { L"\x202b foo bar", UNKNOWN_DIRECTION },
-    { L"!foo \x0622 bar", UNKNOWN_DIRECTION },
-    { L"\x202a\x202b", UNKNOWN_DIRECTION },
-    { L"\x202e\x202d", UNKNOWN_DIRECTION },
-    { L"\x0622\x202a", UNKNOWN_DIRECTION },
-    { L"\x202d\x05d0", UNKNOWN_DIRECTION },
-    // Test a string without strong directionality characters.
-    { L",!.{}", LEFT_TO_RIGHT },
-    // Test empty string.
-    { L"", LEFT_TO_RIGHT },
-    {
-#if defined(WCHAR_T_IS_UTF32)
-      L" ! \x10910" L"abc 123",
-#elif defined(WCHAR_T_IS_UTF16)
-      L" ! \xd802\xdd10" L"abc 123",
-#else
-#error wchar_t should be either UTF-16 or UTF-32
-#endif
-      UNKNOWN_DIRECTION },
-    {
-#if defined(WCHAR_T_IS_UTF32)
-      L" ! \x10401" L"abc 123",
-#elif defined(WCHAR_T_IS_UTF16)
-      L" ! \xd801\xdc01" L"abc 123",
-#else
-#error wchar_t should be either UTF-16 or UTF-32
-#endif
-      LEFT_TO_RIGHT },
-   };
-
-  for (size_t i = 0; i < arraysize(cases); ++i)
-    EXPECT_EQ(cases[i].direction,
-              GetStringDirection(WideToUTF16(cases[i].text)));
-}
-
-TEST_F(RTLTest, WrapPathWithLTRFormatting) {
-  const wchar_t* cases[] = {
-    // Test common path, such as "c:\foo\bar".
-    L"c:/foo/bar",
-    // Test path with file name, such as "c:\foo\bar\test.jpg".
-    L"c:/foo/bar/test.jpg",
-    // Test path ending with punctuation, such as "c:\(foo)\bar.".
-    L"c:/(foo)/bar.",
-    // Test path ending with separator, such as "c:\foo\bar\".
-    L"c:/foo/bar/",
-    // Test path with RTL character.
-    L"c:/\x05d0",
-    // Test path with 2 level RTL directory names.
-    L"c:/\x05d0/\x0622",
-    // Test path with mixed RTL/LTR directory names and ending with punctuation.
-    L"c:/\x05d0/\x0622/(foo)/b.a.r.",
-    // Test path without driver name, such as "/foo/bar/test/jpg".
-    L"/foo/bar/test.jpg",
-    // Test path start with current directory, such as "./foo".
-    L"./foo",
-    // Test path start with parent directory, such as "../foo/bar.jpg".
-    L"../foo/bar.jpg",
-    // Test absolute path, such as "//foo/bar.jpg".
-    L"//foo/bar.jpg",
-    // Test path with mixed RTL/LTR directory names.
-    L"c:/foo/\x05d0/\x0622/\x05d1.jpg",
-    // Test empty path.
-    L""
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    FilePath path;
-#if defined(OS_WIN)
-    std::wstring win_path(cases[i]);
-    std::replace(win_path.begin(), win_path.end(), '/', '\\');
-    path = FilePath(win_path);
-    std::wstring wrapped_expected =
-        std::wstring(L"\x202a") + win_path + L"\x202c";
-#else
-    path = FilePath(base::SysWideToNativeMB(cases[i]));
-    std::wstring wrapped_expected =
-        std::wstring(L"\x202a") + cases[i] + L"\x202c";
-#endif
-    string16 localized_file_path_string;
-    WrapPathWithLTRFormatting(path, &localized_file_path_string);
-
-    std::wstring wrapped_actual = UTF16ToWide(localized_file_path_string);
-    EXPECT_EQ(wrapped_expected, wrapped_actual);
-  }
-}
-
-TEST_F(RTLTest, WrapString) {
-  const wchar_t* cases[] = {
-    L" . ",
-    L"abc",
-    L"a" L"\x5d0\x5d1",
-    L"a" L"\x5d1" L"b",
-    L"\x5d0\x5d1\x5d2",
-    L"\x5d0\x5d1" L"a",
-    L"\x5d0" L"a" L"\x5d1",
-  };
-
-  const bool was_rtl = IsRTL();
-
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  for (size_t i = 0; i < 2; ++i) {
-    // Toggle the application default text direction (to try each direction).
-    SetRTL(!IsRTL());
-
-    string16 empty;
-    WrapStringWithLTRFormatting(&empty);
-    EXPECT_TRUE(empty.empty());
-    WrapStringWithRTLFormatting(&empty);
-    EXPECT_TRUE(empty.empty());
-
-    for (size_t i = 0; i < arraysize(cases); ++i) {
-      string16 input = WideToUTF16(cases[i]);
-      string16 ltr_wrap = input;
-      WrapStringWithLTRFormatting(&ltr_wrap);
-      EXPECT_EQ(ltr_wrap[0], kLeftToRightEmbeddingMark);
-      EXPECT_EQ(ltr_wrap.substr(1, ltr_wrap.length() - 2), input);
-      EXPECT_EQ(ltr_wrap[ltr_wrap.length() -1], kPopDirectionalFormatting);
-
-      string16 rtl_wrap = input;
-      WrapStringWithRTLFormatting(&rtl_wrap);
-      EXPECT_EQ(rtl_wrap[0], kRightToLeftEmbeddingMark);
-      EXPECT_EQ(rtl_wrap.substr(1, rtl_wrap.length() - 2), input);
-      EXPECT_EQ(rtl_wrap[rtl_wrap.length() -1], kPopDirectionalFormatting);
-    }
-  }
-
-  EXPECT_EQ(was_rtl, IsRTL());
-}
-
-TEST_F(RTLTest, GetDisplayStringInLTRDirectionality) {
-  struct {
-    const wchar_t* path;
-    bool wrap_ltr;
-    bool wrap_rtl;
-  } cases[] = {
-    { L"test",                   false, true },
-    { L"test.html",              false, true },
-    { L"\x05d0\x05d1\x05d2",     true,  true },
-    { L"\x05d0\x05d1\x05d2.txt", true,  true },
-    { L"\x05d0" L"abc",          true,  true },
-    { L"\x05d0" L"abc.txt",      true,  true },
-    { L"abc\x05d0\x05d1",        false, true },
-    { L"abc\x05d0\x05d1.jpg",    false, true },
-  };
-
-  const bool was_rtl = IsRTL();
-
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  for (size_t i = 0; i < 2; ++i) {
-    // Toggle the application default text direction (to try each direction).
-    SetRTL(!IsRTL());
-    for (size_t i = 0; i < arraysize(cases); ++i) {
-      string16 input = WideToUTF16(cases[i].path);
-      string16 output = GetDisplayStringInLTRDirectionality(input);
-      // Test the expected wrapping behavior for the current UI directionality.
-      if (IsRTL() ? cases[i].wrap_rtl : cases[i].wrap_ltr)
-        EXPECT_NE(output, input);
-      else
-        EXPECT_EQ(output, input);
-    }
-  }
-
-  EXPECT_EQ(was_rtl, IsRTL());
-}
-
-TEST_F(RTLTest, GetTextDirection) {
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("ar"));
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("ar_EG"));
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("he"));
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("he_IL"));
-  // iw is an obsolete code for Hebrew.
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("iw"));
-  // Although we're not yet localized to Farsi and Urdu, we
-  // do have the text layout direction information for them.
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("fa"));
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("ur"));
-#if 0
-  // Enable these when we include the minimal locale data for Azerbaijani
-  // written in Arabic and Dhivehi. At the moment, our copy of
-  // ICU data does not have entries for them.
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("az_Arab"));
-  // Dhivehi that uses Thaana script.
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("dv"));
-#endif
-  EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocale("en"));
-  // Chinese in China with '-'.
-  EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocale("zh-CN"));
-  // Filipino : 3-letter code
-  EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocale("fil"));
-  // Russian
-  EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocale("ru"));
-  // Japanese that uses multiple scripts
-  EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocale("ja"));
-}
-
-TEST_F(RTLTest, GetTextDirectionForLocaleInStartUp) {
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("ar"));
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("ar_EG"));
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("he"));
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("he_IL"));
-  // iw is an obsolete code for Hebrew.
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("iw"));
-  // Although we're not yet localized to Farsi and Urdu, we
-  // do have the text layout direction information for them.
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("fa"));
-  EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("ur"));
-  EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocaleInStartUp("en"));
-  // Chinese in China with '-'.
-  EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocaleInStartUp("zh-CN"));
-  // Filipino : 3-letter code
-  EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocaleInStartUp("fil"));
-  // Russian
-  EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocaleInStartUp("ru"));
-  // Japanese that uses multiple scripts
-  EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocaleInStartUp("ja"));
-}
-
-TEST_F(RTLTest, UnadjustStringForLocaleDirection) {
-  // These test strings are borrowed from WrapPathWithLTRFormatting
-  const wchar_t* cases[] = {
-    L"foo bar",
-    L"foo \x05d0 bar",
-    L"\x05d0 foo bar",
-    L"!foo \x05d0 bar",
-    L",\x05d0 foo bar",
-    L"\x202a \x05d0 foo  bar",
-    L"\x202d \x05d0 foo  bar",
-    L"\x202b foo \x05d0 bar",
-    L"\x202e foo \x05d0 bar",
-    L"\x0622 foo \x05d0 bar",
-  };
-
-  const bool was_rtl = IsRTL();
-
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  for (size_t i = 0; i < 2; ++i) {
-    // Toggle the application default text direction (to try each direction).
-    SetRTL(!IsRTL());
-
-    for (size_t i = 0; i < arraysize(cases); ++i) {
-      string16 test_case = WideToUTF16(cases[i]);
-      string16 adjusted_string = test_case;
-
-      if (!AdjustStringForLocaleDirection(&adjusted_string))
-        continue;
-
-      EXPECT_NE(test_case, adjusted_string);
-      EXPECT_TRUE(UnadjustStringForLocaleDirection(&adjusted_string));
-      EXPECT_EQ(test_case, adjusted_string) << " for test case [" << test_case
-                                            << "] with IsRTL() == " << IsRTL();
-    }
-  }
-
-  EXPECT_EQ(was_rtl, IsRTL());
-}
-
-TEST_F(RTLTest, EnsureTerminatedDirectionalFormatting) {
-  struct {
-    const wchar_t* unformated_text;
-    const wchar_t* formatted_text;
-  } cases[] = {
-      // Tests string without any dir-formatting characters.
-      {L"google.com", L"google.com"},
-      // Tests string with properly terminated dir-formatting character.
-      {L"\x202egoogle.com\x202c", L"\x202egoogle.com\x202c"},
-      // Tests string with over-terminated dir-formatting characters.
-      {L"\x202egoogle\x202c.com\x202c", L"\x202egoogle\x202c.com\x202c"},
-      // Tests string beginning with a dir-formatting character.
-      {L"\x202emoc.elgoog", L"\x202emoc.elgoog\x202c"},
-      // Tests string that over-terminates then re-opens.
-      {L"\x202egoogle\x202c\x202c.\x202eom",
-       L"\x202egoogle\x202c\x202c.\x202eom\x202c"},
-      // Tests string containing a dir-formatting character in the middle.
-      {L"google\x202e.com", L"google\x202e.com\x202c"},
-      // Tests string with multiple dir-formatting characters.
-      {L"\x202egoogle\x202e.com/\x202eguest",
-       L"\x202egoogle\x202e.com/\x202eguest\x202c\x202c\x202c"},
-      // Test the other dir-formatting characters (U+202A, U+202B, and U+202D).
-      {L"\x202agoogle.com", L"\x202agoogle.com\x202c"},
-      {L"\x202bgoogle.com", L"\x202bgoogle.com\x202c"},
-      {L"\x202dgoogle.com", L"\x202dgoogle.com\x202c"},
-  };
-
-  const bool was_rtl = IsRTL();
-
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  for (size_t i = 0; i < 2; ++i) {
-    // Toggle the application default text direction (to try each direction).
-    SetRTL(!IsRTL());
-    for (size_t i = 0; i < arraysize(cases); ++i) {
-      string16 unsanitized_text = WideToUTF16(cases[i].unformated_text);
-      string16 sanitized_text = WideToUTF16(cases[i].formatted_text);
-      EnsureTerminatedDirectionalFormatting(&unsanitized_text);
-      EXPECT_EQ(sanitized_text, unsanitized_text);
-    }
-  }
-  EXPECT_EQ(was_rtl, IsRTL());
-}
-
-TEST_F(RTLTest, SanitizeUserSuppliedString) {
-  struct {
-    const wchar_t* unformatted_text;
-    const wchar_t* formatted_text;
-  } cases[] = {
-      // Tests RTL string with properly terminated dir-formatting character.
-      {L"\x202eكبير Google التطبيق\x202c", L"\x202eكبير Google التطبيق\x202c"},
-      // Tests RTL string with over-terminated dir-formatting characters.
-      {L"\x202eكبير Google\x202cالتطبيق\x202c",
-       L"\x202eكبير Google\x202cالتطبيق\x202c"},
-      // Tests RTL string that over-terminates then re-opens.
-      {L"\x202eكبير Google\x202c\x202cالتطبيق\x202e",
-       L"\x202eكبير Google\x202c\x202cالتطبيق\x202e\x202c"},
-      // Tests RTL string with multiple dir-formatting characters.
-      {L"\x202eك\x202eبير Google الت\x202eطبيق",
-       L"\x202eك\x202eبير Google الت\x202eطبيق\x202c\x202c\x202c"},
-      // Test the other dir-formatting characters (U+202A, U+202B, and U+202D).
-      {L"\x202aكبير Google التطبيق", L"\x202aكبير Google التطبيق\x202c"},
-      {L"\x202bكبير Google التطبيق", L"\x202bكبير Google التطبيق\x202c"},
-      {L"\x202dكبير Google التطبيق", L"\x202dكبير Google التطبيق\x202c"},
-
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    // On Windows for an LTR locale, no changes to the string are made.
-    string16 prefix, suffix = WideToUTF16(L"");
-#if !defined(OS_WIN)
-    prefix = WideToUTF16(L"\x200e\x202b");
-    suffix = WideToUTF16(L"\x202c\x200e");
-#endif  // !OS_WIN
-    string16 unsanitized_text = WideToUTF16(cases[i].unformatted_text);
-    string16 sanitized_text =
-        prefix + WideToUTF16(cases[i].formatted_text) + suffix;
-    SanitizeUserSuppliedString(&unsanitized_text);
-    EXPECT_EQ(sanitized_text, unsanitized_text);
-  }
-}
-
-class SetICULocaleTest : public PlatformTest {};
-
-TEST_F(SetICULocaleTest, OverlongLocaleId) {
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  std::string id("fr-ca-x-foo");
-  while (id.length() < 152)
-    id.append("-x-foo");
-  SetICUDefaultLocale(id);
-  EXPECT_STRNE("en_US", icu::Locale::getDefault().getName());
-  id.append("zzz");
-  SetICUDefaultLocale(id);
-  EXPECT_STREQ("en_US", icu::Locale::getDefault().getName());
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/streaming_utf8_validator_unittest.cc b/base/i18n/streaming_utf8_validator_unittest.cc
deleted file mode 100644
index f9772d0..0000000
--- a/base/i18n/streaming_utf8_validator_unittest.cc
+++ /dev/null
@@ -1,412 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/streaming_utf8_validator.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <string>
-
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-// Define BASE_I18N_UTF8_VALIDATOR_THOROUGH_TEST to verify that this class
-// accepts exactly the same set of 4-byte strings as ICU-based validation. This
-// tests every possible 4-byte string, so it is too slow to run routinely on
-// low-powered machines.
-//
-// #define BASE_I18N_UTF8_VALIDATOR_THOROUGH_TEST
-
-#ifdef BASE_I18N_UTF8_VALIDATOR_THOROUGH_TEST
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversion_utils.h"
-#include "base/synchronization/lock.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/task_scheduler/task_scheduler.h"
-#include "third_party/icu/source/common/unicode/utf8.h"
-
-#endif  // BASE_I18N_UTF8_VALIDATOR_THOROUGH_TEST
-
-namespace base {
-namespace {
-
-// Avoid having to qualify the enum values in the tests.
-const StreamingUtf8Validator::State VALID_ENDPOINT =
-    StreamingUtf8Validator::VALID_ENDPOINT;
-const StreamingUtf8Validator::State VALID_MIDPOINT =
-    StreamingUtf8Validator::VALID_MIDPOINT;
-const StreamingUtf8Validator::State INVALID = StreamingUtf8Validator::INVALID;
-
-#ifdef BASE_I18N_UTF8_VALIDATOR_THOROUGH_TEST
-
-const uint32_t kThoroughTestChunkSize = 1 << 24;
-
-class StreamingUtf8ValidatorThoroughTest : public ::testing::Test {
- protected:
-  StreamingUtf8ValidatorThoroughTest()
-      : tasks_dispatched_(0), tasks_finished_(0) {}
-
-  // This uses the same logic as base::IsStringUTF8 except it considers
-  // non-characters valid (and doesn't require a string as input).
-  static bool IsStringUtf8(const char* src, int32_t src_len) {
-    int32_t char_index = 0;
-
-    while (char_index < src_len) {
-      int32_t code_point;
-      U8_NEXT(src, char_index, src_len, code_point);
-      if (!base::IsValidCodepoint(code_point))
-        return false;
-    }
-    return true;
-  }
-
-  // Converts the passed-in integer to a 4 byte string and then
-  // verifies that IsStringUtf8 and StreamingUtf8Validator agree on
-  // whether it is valid UTF-8 or not.
-  void TestNumber(uint32_t n) const {
-    char test[sizeof n];
-    memcpy(test, &n, sizeof n);
-    StreamingUtf8Validator validator;
-    EXPECT_EQ(IsStringUtf8(test, sizeof n),
-              validator.AddBytes(test, sizeof n) == VALID_ENDPOINT)
-        << "Difference of opinion for \""
-        << base::StringPrintf("\\x%02X\\x%02X\\x%02X\\x%02X",
-                              test[0] & 0xFF,
-                              test[1] & 0xFF,
-                              test[2] & 0xFF,
-                              test[3] & 0xFF) << "\"";
-  }
-
- public:
-  // Tests the 4-byte sequences corresponding to the |size| integers
-  // starting at |begin|. This is intended to be run from a worker
-  // pool. Signals |all_done_| at the end if it thinks all tasks are
-  // finished.
-  void TestRange(uint32_t begin, uint32_t size) {
-    for (uint32_t i = 0; i < size; ++i) {
-      TestNumber(begin + i);
-    }
-    base::AutoLock al(lock_);
-    ++tasks_finished_;
-    LOG(INFO) << tasks_finished_ << " / " << tasks_dispatched_
-              << " tasks done\n";
-  }
-
- protected:
-  base::Lock lock_;
-  int tasks_dispatched_;
-  int tasks_finished_;
-};
-
-TEST_F(StreamingUtf8ValidatorThoroughTest, TestEverything) {
-  base::TaskScheduler::CreateAndStartWithDefaultParams(
-      "StreamingUtf8ValidatorThoroughTest");
-  {
-    base::AutoLock al(lock_);
-    uint32_t begin = 0;
-    do {
-      base::PostTaskWithTraits(
-          FROM_HERE, {base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
-          base::BindOnce(&StreamingUtf8ValidatorThoroughTest::TestRange,
-                         base::Unretained(this), begin,
-                         kThoroughTestChunkSize));
-      ++tasks_dispatched_;
-      begin += kThoroughTestChunkSize;
-    } while (begin != 0);
-  }
-  base::TaskScheduler::GetInstance()->Shutdown();
-  base::TaskScheduler::GetInstance()->JoinForTesting();
-  base::TaskScheduler::SetInstance(nullptr);
-}
-
-#endif  // BASE_I18N_UTF8_VALIDATOR_THOROUGH_TEST
-
-// These valid and invalid UTF-8 sequences are based on the tests from
-// base/strings/string_util_unittest.cc
-
-// All of the strings in |valid| must represent a single codepoint, because
-// partial sequences are constructed by taking non-empty prefixes of these
-// strings.
-const char* const valid[] = {"\r",           "\n",           "a",
-                             "\xc2\x81",     "\xe1\x80\xbf", "\xf1\x80\xa0\xbf",
-                             "\xef\xbb\xbf",  // UTF-8 BOM
-};
-
-const char* const* const valid_end = valid + arraysize(valid);
-
-const char* const invalid[] = {
-    // always invalid bytes
-    "\xc0", "\xc1",
-    "\xf5", "\xf6", "\xf7",
-    "\xf8", "\xf9", "\xfa", "\xfb", "\xfc", "\xfd", "\xfe", "\xff",
-    // surrogate code points
-    "\xed\xa0\x80", "\xed\x0a\x8f", "\xed\xbf\xbf",
-    //
-    // overlong sequences
-    "\xc0\x80",              // U+0000
-    "\xc1\x80",              // "A"
-    "\xc1\x81",              // "B"
-    "\xe0\x80\x80",          // U+0000
-    "\xe0\x82\x80",          // U+0080
-    "\xe0\x9f\xbf",          // U+07ff
-    "\xf0\x80\x80\x8D",      // U+000D
-    "\xf0\x80\x82\x91",      // U+0091
-    "\xf0\x80\xa0\x80",      // U+0800
-    "\xf0\x8f\xbb\xbf",      // U+FEFF (BOM)
-    "\xf8\x80\x80\x80\xbf",  // U+003F
-    "\xfc\x80\x80\x80\xa0\xa5",
-    //
-    // Beyond U+10FFFF
-    "\xf4\x90\x80\x80",          // U+110000
-    "\xf8\xa0\xbf\x80\xbf",      // 5 bytes
-    "\xfc\x9c\xbf\x80\xbf\x80",  // 6 bytes
-    //
-    // BOMs in UTF-16(BE|LE)
-    "\xfe\xff", "\xff\xfe",
-};
-
-const char* const* const invalid_end = invalid + arraysize(invalid);
-
-// A ForwardIterator which returns all the non-empty prefixes of the elements of
-// "valid".
-class PartialIterator {
- public:
-  // The constructor returns the first iterator, ie. it is equivalent to
-  // begin().
-  PartialIterator() : index_(0), prefix_length_(0) { Advance(); }
-  // The trivial destructor left intentionally undefined.
-  // This is a value type; the default copy constructor and assignment operator
-  // generated by the compiler are used.
-
-  static PartialIterator end() { return PartialIterator(arraysize(valid), 1); }
-
-  PartialIterator& operator++() {
-    Advance();
-    return *this;
-  }
-
-  base::StringPiece operator*() const {
-    return base::StringPiece(valid[index_], prefix_length_);
-  }
-
-  bool operator==(const PartialIterator& rhs) const {
-    return index_ == rhs.index_ && prefix_length_ == rhs.prefix_length_;
-  }
-
-  bool operator!=(const PartialIterator& rhs) const { return !(rhs == *this); }
-
- private:
-  // This constructor is used by the end() method.
-  PartialIterator(size_t index, size_t prefix_length)
-      : index_(index), prefix_length_(prefix_length) {}
-
-  void Advance() {
-    if (index_ < arraysize(valid) && prefix_length_ < strlen(valid[index_]))
-      ++prefix_length_;
-    while (index_ < arraysize(valid) &&
-           prefix_length_ == strlen(valid[index_])) {
-      ++index_;
-      prefix_length_ = 1;
-    }
-  }
-
-  // The UTF-8 sequence, as an offset into the |valid| array.
-  size_t index_;
-  size_t prefix_length_;
-};
-
-// A test fixture for tests which test one UTF-8 sequence (or invalid
-// byte sequence) at a time.
-class StreamingUtf8ValidatorSingleSequenceTest : public ::testing::Test {
- protected:
-  // Iterator must be convertible when de-referenced to StringPiece.
-  template <typename Iterator>
-  void CheckRange(Iterator begin,
-                  Iterator end,
-                  StreamingUtf8Validator::State expected) {
-    for (Iterator it = begin; it != end; ++it) {
-      StreamingUtf8Validator validator;
-      base::StringPiece sequence = *it;
-      EXPECT_EQ(expected,
-                validator.AddBytes(sequence.data(), sequence.size()))
-          << "Failed for \"" << sequence << "\"";
-    }
-  }
-
-  // Adding input a byte at a time should make absolutely no difference.
-  template <typename Iterator>
-  void CheckRangeByteAtATime(Iterator begin,
-                             Iterator end,
-                             StreamingUtf8Validator::State expected) {
-    for (Iterator it = begin; it != end; ++it) {
-      StreamingUtf8Validator validator;
-      base::StringPiece sequence = *it;
-      StreamingUtf8Validator::State state = VALID_ENDPOINT;
-      for (base::StringPiece::const_iterator cit = sequence.begin();
-           cit != sequence.end();
-           ++cit) {
-        state = validator.AddBytes(&*cit, 1);
-      }
-      EXPECT_EQ(expected, state) << "Failed for \"" << sequence << "\"";
-    }
-  }
-};
-
-// A test fixture for tests which test the concatenation of byte sequences.
-class StreamingUtf8ValidatorDoubleSequenceTest : public ::testing::Test {
- protected:
-  // Check every possible concatenation of byte sequences from two
-  // ranges, and verify that the combination matches the expected
-  // state.
-  template <typename Iterator1, typename Iterator2>
-  void CheckCombinations(Iterator1 begin1,
-                         Iterator1 end1,
-                         Iterator2 begin2,
-                         Iterator2 end2,
-                         StreamingUtf8Validator::State expected) {
-    StreamingUtf8Validator validator;
-    for (Iterator1 it1 = begin1; it1 != end1; ++it1) {
-      base::StringPiece c1 = *it1;
-      for (Iterator2 it2 = begin2; it2 != end2; ++it2) {
-        base::StringPiece c2 = *it2;
-        validator.AddBytes(c1.data(), c1.size());
-        EXPECT_EQ(expected, validator.AddBytes(c2.data(), c2.size()))
-            << "Failed for \"" << c1 << c2 << "\"";
-        validator.Reset();
-      }
-    }
-  }
-};
-
-TEST(StreamingUtf8ValidatorTest, NothingIsValid) {
-  static const char kNothing[] = "";
-  EXPECT_EQ(VALID_ENDPOINT, StreamingUtf8Validator().AddBytes(kNothing, 0));
-}
-
-// Because the members of the |valid| array need to be non-zero length
-// sequences and are measured with strlen(), |valid| cannot be used it
-// to test the NUL character '\0', so the NUL character gets its own
-// test.
-TEST(StreamingUtf8ValidatorTest, NulIsValid) {
-  static const char kNul[] = "\x00";
-  EXPECT_EQ(VALID_ENDPOINT, StreamingUtf8Validator().AddBytes(kNul, 1));
-}
-
-// Just a basic sanity test before we start getting fancy.
-TEST(StreamingUtf8ValidatorTest, HelloWorld) {
-  static const char kHelloWorld[] = "Hello, World!";
-  EXPECT_EQ(
-      VALID_ENDPOINT,
-      StreamingUtf8Validator().AddBytes(kHelloWorld, strlen(kHelloWorld)));
-}
-
-// Check that the Reset() method works.
-TEST(StreamingUtf8ValidatorTest, ResetWorks) {
-  StreamingUtf8Validator validator;
-  EXPECT_EQ(INVALID, validator.AddBytes("\xC0", 1));
-  EXPECT_EQ(INVALID, validator.AddBytes("a", 1));
-  validator.Reset();
-  EXPECT_EQ(VALID_ENDPOINT, validator.AddBytes("a", 1));
-}
-
-TEST_F(StreamingUtf8ValidatorSingleSequenceTest, Valid) {
-  CheckRange(valid, valid_end, VALID_ENDPOINT);
-}
-
-TEST_F(StreamingUtf8ValidatorSingleSequenceTest, Partial) {
-  CheckRange(PartialIterator(), PartialIterator::end(), VALID_MIDPOINT);
-}
-
-TEST_F(StreamingUtf8ValidatorSingleSequenceTest, Invalid) {
-  CheckRange(invalid, invalid_end, INVALID);
-}
-
-TEST_F(StreamingUtf8ValidatorSingleSequenceTest, ValidByByte) {
-  CheckRangeByteAtATime(valid, valid_end, VALID_ENDPOINT);
-}
-
-TEST_F(StreamingUtf8ValidatorSingleSequenceTest, PartialByByte) {
-  CheckRangeByteAtATime(
-      PartialIterator(), PartialIterator::end(), VALID_MIDPOINT);
-}
-
-TEST_F(StreamingUtf8ValidatorSingleSequenceTest, InvalidByByte) {
-  CheckRangeByteAtATime(invalid, invalid_end, INVALID);
-}
-
-TEST_F(StreamingUtf8ValidatorDoubleSequenceTest, ValidPlusValidIsValid) {
-  CheckCombinations(valid, valid_end, valid, valid_end, VALID_ENDPOINT);
-}
-
-TEST_F(StreamingUtf8ValidatorDoubleSequenceTest, ValidPlusPartialIsPartial) {
-  CheckCombinations(valid,
-                    valid_end,
-                    PartialIterator(),
-                    PartialIterator::end(),
-                    VALID_MIDPOINT);
-}
-
-TEST_F(StreamingUtf8ValidatorDoubleSequenceTest, PartialPlusValidIsInvalid) {
-  CheckCombinations(
-      PartialIterator(), PartialIterator::end(), valid, valid_end, INVALID);
-}
-
-TEST_F(StreamingUtf8ValidatorDoubleSequenceTest, PartialPlusPartialIsInvalid) {
-  CheckCombinations(PartialIterator(),
-                    PartialIterator::end(),
-                    PartialIterator(),
-                    PartialIterator::end(),
-                    INVALID);
-}
-
-TEST_F(StreamingUtf8ValidatorDoubleSequenceTest, ValidPlusInvalidIsInvalid) {
-  CheckCombinations(valid, valid_end, invalid, invalid_end, INVALID);
-}
-
-TEST_F(StreamingUtf8ValidatorDoubleSequenceTest, InvalidPlusValidIsInvalid) {
-  CheckCombinations(invalid, invalid_end, valid, valid_end, INVALID);
-}
-
-TEST_F(StreamingUtf8ValidatorDoubleSequenceTest, InvalidPlusInvalidIsInvalid) {
-  CheckCombinations(invalid, invalid_end, invalid, invalid_end, INVALID);
-}
-
-TEST_F(StreamingUtf8ValidatorDoubleSequenceTest, InvalidPlusPartialIsInvalid) {
-  CheckCombinations(
-      invalid, invalid_end, PartialIterator(), PartialIterator::end(), INVALID);
-}
-
-TEST_F(StreamingUtf8ValidatorDoubleSequenceTest, PartialPlusInvalidIsInvalid) {
-  CheckCombinations(
-      PartialIterator(), PartialIterator::end(), invalid, invalid_end, INVALID);
-}
-
-TEST(StreamingUtf8ValidatorValidateTest, EmptyIsValid) {
-  EXPECT_TRUE(StreamingUtf8Validator::Validate(std::string()));
-}
-
-TEST(StreamingUtf8ValidatorValidateTest, SimpleValidCase) {
-  EXPECT_TRUE(StreamingUtf8Validator::Validate("\xc2\x81"));
-}
-
-TEST(StreamingUtf8ValidatorValidateTest, SimpleInvalidCase) {
-  EXPECT_FALSE(StreamingUtf8Validator::Validate("\xc0\x80"));
-}
-
-TEST(StreamingUtf8ValidatorValidateTest, TruncatedIsInvalid) {
-  EXPECT_FALSE(StreamingUtf8Validator::Validate("\xc2"));
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/i18n/string_search_unittest.cc b/base/i18n/string_search_unittest.cc
deleted file mode 100644
index 69501d6..0000000
--- a/base/i18n/string_search_unittest.cc
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/i18n/rtl.h"
-#include "base/i18n/string_search.h"
-#include "base/strings/string16.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/icu/source/i18n/unicode/usearch.h"
-
-namespace base {
-namespace i18n {
-
-// Note on setting default locale for testing: The current default locale on
-// the Mac trybot is en_US_POSIX, with which primary-level collation strength
-// string search is case-sensitive, when normally it should be
-// case-insensitive. In other locales (including en_US which English speakers
-// in the U.S. use), this search would be case-insensitive as expected.
-
-TEST(StringSearchTest, ASCII) {
-  std::string default_locale(uloc_getDefault());
-  bool locale_is_posix = (default_locale == "en_US_POSIX");
-  if (locale_is_posix)
-    SetICUDefaultLocale("en_US");
-
-  size_t index = 0;
-  size_t length = 0;
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      ASCIIToUTF16("hello"), ASCIIToUTF16("hello world"), &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(5U, length);
-
-  EXPECT_FALSE(StringSearchIgnoringCaseAndAccents(
-      ASCIIToUTF16("h    e l l o"), ASCIIToUTF16("h   e l l o"),
-      &index, &length));
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      ASCIIToUTF16("aabaaa"), ASCIIToUTF16("aaabaabaaa"), &index, &length));
-  EXPECT_EQ(4U, index);
-  EXPECT_EQ(6U, length);
-
-  EXPECT_FALSE(StringSearchIgnoringCaseAndAccents(
-      ASCIIToUTF16("searching within empty string"), string16(),
-      &index, &length));
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      string16(), ASCIIToUTF16("searching for empty string"), &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(0U, length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      ASCIIToUTF16("case insensitivity"), ASCIIToUTF16("CaSe InSeNsItIvItY"),
-      &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(18U, length);
-
-  if (locale_is_posix)
-    SetICUDefaultLocale(default_locale.data());
-}
-
-TEST(StringSearchTest, UnicodeLocaleIndependent) {
-  // Base characters
-  const string16 e_base = WideToUTF16(L"e");
-  const string16 E_base = WideToUTF16(L"E");
-  const string16 a_base = WideToUTF16(L"a");
-
-  // Composed characters
-  const string16 e_with_acute_accent = WideToUTF16(L"\u00e9");
-  const string16 E_with_acute_accent = WideToUTF16(L"\u00c9");
-  const string16 e_with_grave_accent = WideToUTF16(L"\u00e8");
-  const string16 E_with_grave_accent = WideToUTF16(L"\u00c8");
-  const string16 a_with_acute_accent = WideToUTF16(L"\u00e1");
-
-  // Decomposed characters
-  const string16 e_with_acute_combining_mark = WideToUTF16(L"e\u0301");
-  const string16 E_with_acute_combining_mark = WideToUTF16(L"E\u0301");
-  const string16 e_with_grave_combining_mark = WideToUTF16(L"e\u0300");
-  const string16 E_with_grave_combining_mark = WideToUTF16(L"E\u0300");
-  const string16 a_with_acute_combining_mark = WideToUTF16(L"a\u0301");
-
-  std::string default_locale(uloc_getDefault());
-  bool locale_is_posix = (default_locale == "en_US_POSIX");
-  if (locale_is_posix)
-    SetICUDefaultLocale("en_US");
-
-  size_t index = 0;
-  size_t length = 0;
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      e_base, e_with_acute_accent, &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_acute_accent.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      e_with_acute_accent, e_base, &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_base.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      e_base, e_with_acute_combining_mark, &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_acute_combining_mark.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      e_with_acute_combining_mark, e_base, &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_base.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      e_with_acute_combining_mark, e_with_acute_accent,
-      &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_acute_accent.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      e_with_acute_accent, e_with_acute_combining_mark,
-      &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_acute_combining_mark.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      e_with_acute_combining_mark, e_with_grave_combining_mark,
-      &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_grave_combining_mark.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      e_with_grave_combining_mark, e_with_acute_combining_mark,
-      &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_acute_combining_mark.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      e_with_acute_combining_mark, e_with_grave_accent, &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_grave_accent.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      e_with_grave_accent, e_with_acute_combining_mark, &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_acute_combining_mark.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      E_with_acute_accent, e_with_acute_accent, &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_acute_accent.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      E_with_grave_accent, e_with_acute_accent, &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_acute_accent.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      E_with_acute_combining_mark, e_with_grave_accent, &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_grave_accent.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      E_with_grave_combining_mark, e_with_acute_accent, &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_acute_accent.size(), length);
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(
-      E_base, e_with_grave_accent, &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(e_with_grave_accent.size(), length);
-
-  EXPECT_FALSE(StringSearchIgnoringCaseAndAccents(
-      a_with_acute_accent, e_with_acute_accent, &index, &length));
-
-  EXPECT_FALSE(StringSearchIgnoringCaseAndAccents(
-      a_with_acute_combining_mark, e_with_acute_combining_mark,
-      &index, &length));
-
-  if (locale_is_posix)
-    SetICUDefaultLocale(default_locale.data());
-}
-
-TEST(StringSearchTest, UnicodeLocaleDependent) {
-  // Base characters
-  const string16 a_base = WideToUTF16(L"a");
-
-  // Composed characters
-  const string16 a_with_ring = WideToUTF16(L"\u00e5");
-
-  EXPECT_TRUE(StringSearchIgnoringCaseAndAccents(a_base, a_with_ring, nullptr,
-                                                 nullptr));
-
-  const char* default_locale = uloc_getDefault();
-  SetICUDefaultLocale("da");
-
-  EXPECT_FALSE(StringSearchIgnoringCaseAndAccents(a_base, a_with_ring, nullptr,
-                                                  nullptr));
-
-  SetICUDefaultLocale(default_locale);
-}
-
-TEST(StringSearchTest, FixedPatternMultipleSearch) {
-  std::string default_locale(uloc_getDefault());
-  bool locale_is_posix = (default_locale == "en_US_POSIX");
-  if (locale_is_posix)
-    SetICUDefaultLocale("en_US");
-
-  size_t index = 0;
-  size_t length = 0;
-
-  // Search "hello" over multiple texts.
-  FixedPatternStringSearchIgnoringCaseAndAccents query(ASCIIToUTF16("hello"));
-  EXPECT_TRUE(query.Search(ASCIIToUTF16("12hello34"), &index, &length));
-  EXPECT_EQ(2U, index);
-  EXPECT_EQ(5U, length);
-  EXPECT_FALSE(query.Search(ASCIIToUTF16("bye"), &index, &length));
-  EXPECT_TRUE(query.Search(ASCIIToUTF16("hELLo"), &index, &length));
-  EXPECT_EQ(0U, index);
-  EXPECT_EQ(5U, length);
-
-  if (locale_is_posix)
-    SetICUDefaultLocale(default_locale.data());
-}
-
-}  // namespace i18n
-}  // namespace base
diff --git a/base/i18n/time_formatting_unittest.cc b/base/i18n/time_formatting_unittest.cc
deleted file mode 100644
index 027b7c9..0000000
--- a/base/i18n/time_formatting_unittest.cc
+++ /dev/null
@@ -1,434 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/time_formatting.h"
-
-#include <memory>
-
-#include "base/i18n/rtl.h"
-#include "base/i18n/unicodestring.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/test/icu_test_util.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/icu/source/common/unicode/uversion.h"
-#include "third_party/icu/source/i18n/unicode/calendar.h"
-#include "third_party/icu/source/i18n/unicode/timezone.h"
-#include "third_party/icu/source/i18n/unicode/tzfmt.h"
-
-namespace base {
-namespace {
-
-const Time::Exploded kTestDateTimeExploded = {
-    2011, 4,  6, 30,  // Sat, Apr 30, 2011
-    22,   42, 7, 0    // 22:42:07.000 in UTC = 15:42:07 in US PDT.
-};
-
-// Returns difference between the local time and GMT formatted as string.
-// This function gets |time| because the difference depends on time,
-// see https://en.wikipedia.org/wiki/Daylight_saving_time for details.
-string16 GetShortTimeZone(const Time& time) {
-  UErrorCode status = U_ZERO_ERROR;
-  std::unique_ptr<icu::TimeZone> zone(icu::TimeZone::createDefault());
-  std::unique_ptr<icu::TimeZoneFormat> zone_formatter(
-      icu::TimeZoneFormat::createInstance(icu::Locale::getDefault(), status));
-  EXPECT_TRUE(U_SUCCESS(status));
-  icu::UnicodeString name;
-  zone_formatter->format(UTZFMT_STYLE_SPECIFIC_SHORT, *zone,
-                         static_cast<UDate>(time.ToDoubleT() * 1000),
-                         name, nullptr);
-  return i18n::UnicodeStringToString16(name);
-}
-
-// Calls TimeDurationFormat() with |delta| and |width| and returns the resulting
-// string. On failure, adds a failed expectation and returns an empty string.
-string16 TimeDurationFormatString(const TimeDelta& delta,
-                                  DurationFormatWidth width) {
-  string16 str;
-  EXPECT_TRUE(TimeDurationFormat(delta, width, &str))
-      << "Failed to format " << delta.ToInternalValue() << " with width "
-      << width;
-  return str;
-}
-
-// Calls TimeDurationFormatWithSeconds() with |delta| and |width| and returns
-// the resulting string. On failure, adds a failed expectation and returns an
-// empty string.
-string16 TimeDurationFormatWithSecondsString(const TimeDelta& delta,
-                                             DurationFormatWidth width) {
-  string16 str;
-  EXPECT_TRUE(TimeDurationFormatWithSeconds(delta, width, &str))
-      << "Failed to format " << delta.ToInternalValue() << " with width "
-      << width;
-  return str;
-}
-
-class ScopedRestoreDefaultTimezone {
- public:
-  ScopedRestoreDefaultTimezone(const char* zoneid) {
-    original_zone_.reset(icu::TimeZone::createDefault());
-    icu::TimeZone::adoptDefault(icu::TimeZone::createTimeZone(zoneid));
-  }
-  ~ScopedRestoreDefaultTimezone() {
-    icu::TimeZone::adoptDefault(original_zone_.release());
-  }
-
-  ScopedRestoreDefaultTimezone(const ScopedRestoreDefaultTimezone&) = delete;
-  ScopedRestoreDefaultTimezone& operator=(const ScopedRestoreDefaultTimezone&) =
-      delete;
-
- private:
-  std::unique_ptr<icu::TimeZone> original_zone_;
-};
-
-TEST(TimeFormattingTest, TimeFormatTimeOfDayDefault12h) {
-  // Test for a locale defaulted to 12h clock.
-  // As an instance, we use third_party/icu/source/data/locales/en.txt.
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  i18n::SetICUDefaultLocale("en_US");
-  ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
-
-  Time time;
-  EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
-  string16 clock24h(ASCIIToUTF16("15:42"));
-  string16 clock12h_pm(ASCIIToUTF16("3:42 PM"));
-  string16 clock12h(ASCIIToUTF16("3:42"));
-  string16 clock24h_millis(ASCIIToUTF16("15:42:07.000"));
-
-  // The default is 12h clock.
-  EXPECT_EQ(clock12h_pm, TimeFormatTimeOfDay(time));
-  EXPECT_EQ(clock24h_millis, TimeFormatTimeOfDayWithMilliseconds(time));
-  EXPECT_EQ(k12HourClock, GetHourClockType());
-  // k{Keep,Drop}AmPm should not affect for 24h clock.
-  EXPECT_EQ(clock24h,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k24HourClock,
-                                                 kKeepAmPm));
-  EXPECT_EQ(clock24h,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k24HourClock,
-                                                 kDropAmPm));
-  // k{Keep,Drop}AmPm affects for 12h clock.
-  EXPECT_EQ(clock12h_pm,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k12HourClock,
-                                                 kKeepAmPm));
-  EXPECT_EQ(clock12h,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k12HourClock,
-                                                 kDropAmPm));
-}
-
-TEST(TimeFormattingTest, TimeFormatTimeOfDayDefault24h) {
-  // Test for a locale defaulted to 24h clock.
-  // As an instance, we use third_party/icu/source/data/locales/en_GB.txt.
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  i18n::SetICUDefaultLocale("en_GB");
-  ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
-
-  Time time;
-  EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
-  string16 clock24h(ASCIIToUTF16("15:42"));
-  string16 clock12h_pm(ASCIIToUTF16("3:42 pm"));
-  string16 clock12h(ASCIIToUTF16("3:42"));
-  string16 clock24h_millis(ASCIIToUTF16("15:42:07.000"));
-
-  // The default is 24h clock.
-  EXPECT_EQ(clock24h, TimeFormatTimeOfDay(time));
-  EXPECT_EQ(clock24h_millis, TimeFormatTimeOfDayWithMilliseconds(time));
-  EXPECT_EQ(k24HourClock, GetHourClockType());
-  // k{Keep,Drop}AmPm should not affect for 24h clock.
-  EXPECT_EQ(clock24h,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k24HourClock,
-                                                 kKeepAmPm));
-  EXPECT_EQ(clock24h,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k24HourClock,
-                                                 kDropAmPm));
-  // k{Keep,Drop}AmPm affects for 12h clock.
-  EXPECT_EQ(clock12h_pm,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k12HourClock,
-                                                 kKeepAmPm));
-  EXPECT_EQ(clock12h,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k12HourClock,
-                                                 kDropAmPm));
-}
-
-TEST(TimeFormattingTest, TimeFormatTimeOfDayJP) {
-  // Test for a locale that uses different mark than "AM" and "PM".
-  // As an instance, we use third_party/icu/source/data/locales/ja.txt.
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  i18n::SetICUDefaultLocale("ja_JP");
-  ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
-
-  Time time;
-  EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
-  string16 clock24h(ASCIIToUTF16("15:42"));
-  string16 clock12h_pm(UTF8ToUTF16(u8"午後3:42"));
-  string16 clock12h(ASCIIToUTF16("3:42"));
-
-  // The default is 24h clock.
-  EXPECT_EQ(clock24h, TimeFormatTimeOfDay(time));
-  EXPECT_EQ(k24HourClock, GetHourClockType());
-  // k{Keep,Drop}AmPm should not affect for 24h clock.
-  EXPECT_EQ(clock24h, TimeFormatTimeOfDayWithHourClockType(time, k24HourClock,
-                                                           kKeepAmPm));
-  EXPECT_EQ(clock24h, TimeFormatTimeOfDayWithHourClockType(time, k24HourClock,
-                                                           kDropAmPm));
-  // k{Keep,Drop}AmPm affects for 12h clock.
-  EXPECT_EQ(clock12h_pm, TimeFormatTimeOfDayWithHourClockType(
-                             time, k12HourClock, kKeepAmPm));
-  EXPECT_EQ(clock12h, TimeFormatTimeOfDayWithHourClockType(time, k12HourClock,
-                                                           kDropAmPm));
-}
-
-TEST(TimeFormattingTest, TimeFormatTimeOfDayDE) {
-  // Test for a locale that uses different mark than "AM" and "PM".
-  // As an instance, we use third_party/icu/source/data/locales/de.txt.
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  i18n::SetICUDefaultLocale("de");
-  ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
-
-  Time time;
-  EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
-  string16 clock24h(ASCIIToUTF16("15:42"));
-  string16 clock12h_pm(UTF8ToUTF16("3:42 nachm."));
-  string16 clock12h(ASCIIToUTF16("3:42"));
-
-  // The default is 24h clock.
-  EXPECT_EQ(clock24h, TimeFormatTimeOfDay(time));
-  EXPECT_EQ(k24HourClock, GetHourClockType());
-  // k{Keep,Drop}AmPm should not affect for 24h clock.
-  EXPECT_EQ(clock24h,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k24HourClock,
-                                                 kKeepAmPm));
-  EXPECT_EQ(clock24h,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k24HourClock,
-                                                 kDropAmPm));
-  // k{Keep,Drop}AmPm affects for 12h clock.
-  EXPECT_EQ(clock12h_pm,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k12HourClock,
-                                                 kKeepAmPm));
-  EXPECT_EQ(clock12h,
-            TimeFormatTimeOfDayWithHourClockType(time,
-                                                 k12HourClock,
-                                                 kDropAmPm));
-}
-
-TEST(TimeFormattingTest, TimeFormatDateUS) {
-  // See third_party/icu/source/data/locales/en.txt.
-  // The date patterns are "EEEE, MMMM d, y", "MMM d, y", and "M/d/yy".
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  i18n::SetICUDefaultLocale("en_US");
-  ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
-
-  Time time;
-  EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
-
-  EXPECT_EQ(ASCIIToUTF16("Apr 30, 2011"), TimeFormatShortDate(time));
-  EXPECT_EQ(ASCIIToUTF16("4/30/11"), TimeFormatShortDateNumeric(time));
-
-  EXPECT_EQ(ASCIIToUTF16("4/30/11, 3:42:07 PM"),
-            TimeFormatShortDateAndTime(time));
-  EXPECT_EQ(ASCIIToUTF16("4/30/11, 3:42:07 PM ") + GetShortTimeZone(time),
-            TimeFormatShortDateAndTimeWithTimeZone(time));
-
-  EXPECT_EQ(ASCIIToUTF16("April 2011"), TimeFormatMonthAndYear(time));
-
-  EXPECT_EQ(ASCIIToUTF16("Saturday, April 30, 2011 at 3:42:07 PM"),
-            TimeFormatFriendlyDateAndTime(time));
-
-  EXPECT_EQ(ASCIIToUTF16("Saturday, April 30, 2011"),
-            TimeFormatFriendlyDate(time));
-}
-
-TEST(TimeFormattingTest, TimeFormatDateGB) {
-  // See third_party/icu/source/data/locales/en_GB.txt.
-  // The date patterns are "EEEE, d MMMM y", "d MMM y", and "dd/MM/yyyy".
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  i18n::SetICUDefaultLocale("en_GB");
-  ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
-
-  Time time;
-  EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
-
-  EXPECT_EQ(ASCIIToUTF16("30 Apr 2011"), TimeFormatShortDate(time));
-  EXPECT_EQ(ASCIIToUTF16("30/04/2011"), TimeFormatShortDateNumeric(time));
-  EXPECT_EQ(ASCIIToUTF16("30/04/2011, 15:42:07"),
-            TimeFormatShortDateAndTime(time));
-  EXPECT_EQ(ASCIIToUTF16("30/04/2011, 15:42:07 ") + GetShortTimeZone(time),
-            TimeFormatShortDateAndTimeWithTimeZone(time));
-  EXPECT_EQ(ASCIIToUTF16("April 2011"), TimeFormatMonthAndYear(time));
-  EXPECT_EQ(ASCIIToUTF16("Saturday, 30 April 2011 at 15:42:07"),
-            TimeFormatFriendlyDateAndTime(time));
-  EXPECT_EQ(ASCIIToUTF16("Saturday, 30 April 2011"),
-            TimeFormatFriendlyDate(time));
-}
-
-TEST(TimeFormattingTest, TimeFormatWithPattern) {
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
-
-  Time time;
-  EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &time));
-
-  i18n::SetICUDefaultLocale("en_US");
-  EXPECT_EQ(ASCIIToUTF16("Apr 30, 2011"), TimeFormatWithPattern(time, "yMMMd"));
-  EXPECT_EQ(ASCIIToUTF16("April 30, 3:42:07 PM"),
-            TimeFormatWithPattern(time, "MMMMdjmmss"));
-
-  i18n::SetICUDefaultLocale("en_GB");
-  EXPECT_EQ(ASCIIToUTF16("30 Apr 2011"), TimeFormatWithPattern(time, "yMMMd"));
-  EXPECT_EQ(ASCIIToUTF16("30 April, 15:42:07"),
-            TimeFormatWithPattern(time, "MMMMdjmmss"));
-
-  i18n::SetICUDefaultLocale("ja_JP");
-  EXPECT_EQ(UTF8ToUTF16(u8"2011年4月30日"),
-            TimeFormatWithPattern(time, "yMMMd"));
-  EXPECT_EQ(UTF8ToUTF16(u8"4月30日 15:42:07"),
-            TimeFormatWithPattern(time, "MMMMdjmmss"));
-}
-
-TEST(TimeFormattingTest, TimeDurationFormat) {
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  TimeDelta delta = TimeDelta::FromMinutes(15 * 60 + 42);
-
-  // US English.
-  i18n::SetICUDefaultLocale("en_US");
-  EXPECT_EQ(ASCIIToUTF16("15 hours, 42 minutes"),
-            TimeDurationFormatString(delta, DURATION_WIDTH_WIDE));
-  EXPECT_EQ(ASCIIToUTF16("15 hr, 42 min"),
-            TimeDurationFormatString(delta, DURATION_WIDTH_SHORT));
-  EXPECT_EQ(ASCIIToUTF16("15h 42m"),
-            TimeDurationFormatString(delta, DURATION_WIDTH_NARROW));
-  EXPECT_EQ(ASCIIToUTF16("15:42"),
-            TimeDurationFormatString(delta, DURATION_WIDTH_NUMERIC));
-
-  // Danish, with Latin alphabet but different abbreviations and punctuation.
-  i18n::SetICUDefaultLocale("da");
-  EXPECT_EQ(ASCIIToUTF16("15 timer og 42 minutter"),
-            TimeDurationFormatString(delta, DURATION_WIDTH_WIDE));
-  EXPECT_EQ(ASCIIToUTF16("15 t og 42 min."),
-            TimeDurationFormatString(delta, DURATION_WIDTH_SHORT));
-  EXPECT_EQ(ASCIIToUTF16("15 t og 42 min"),
-            TimeDurationFormatString(delta, DURATION_WIDTH_NARROW));
-  EXPECT_EQ(ASCIIToUTF16("15.42"),
-            TimeDurationFormatString(delta, DURATION_WIDTH_NUMERIC));
-
-  // Persian, with non-Arabic numbers.
-  i18n::SetICUDefaultLocale("fa");
-  string16 fa_wide = UTF8ToUTF16(
-      u8"\u06f1\u06f5 \u0633\u0627\u0639\u062a \u0648 \u06f4\u06f2 \u062f\u0642"
-      u8"\u06cc\u0642\u0647");
-  string16 fa_short = UTF8ToUTF16(
-      u8"\u06f1\u06f5 \u0633\u0627\u0639\u062a\u060c\u200f \u06f4\u06f2 \u062f"
-      u8"\u0642\u06cc\u0642\u0647");
-  string16 fa_narrow = UTF8ToUTF16(
-      u8"\u06f1\u06f5 \u0633\u0627\u0639\u062a \u06f4\u06f2 \u062f\u0642\u06cc"
-      u8"\u0642\u0647");
-  string16 fa_numeric = UTF8ToUTF16(u8"\u06f1\u06f5:\u06f4\u06f2");
-  EXPECT_EQ(fa_wide, TimeDurationFormatString(delta, DURATION_WIDTH_WIDE));
-  EXPECT_EQ(fa_short, TimeDurationFormatString(delta, DURATION_WIDTH_SHORT));
-  EXPECT_EQ(fa_narrow, TimeDurationFormatString(delta, DURATION_WIDTH_NARROW));
-  EXPECT_EQ(fa_numeric,
-            TimeDurationFormatString(delta, DURATION_WIDTH_NUMERIC));
-}
-
-TEST(TimeFormattingTest, TimeDurationFormatWithSeconds) {
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-
-  // US English.
-  i18n::SetICUDefaultLocale("en_US");
-
-  // Test different formats.
-  TimeDelta delta = TimeDelta::FromSeconds(15 * 3600 + 42 * 60 + 30);
-  EXPECT_EQ(ASCIIToUTF16("15 hours, 42 minutes, 30 seconds"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_WIDE));
-  EXPECT_EQ(ASCIIToUTF16("15 hr, 42 min, 30 sec"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_SHORT));
-  EXPECT_EQ(ASCIIToUTF16("15h 42m 30s"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NARROW));
-  EXPECT_EQ(ASCIIToUTF16("15:42:30"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NUMERIC));
-
-  // Test edge case when hour >= 100.
-  delta = TimeDelta::FromSeconds(125 * 3600 + 42 * 60 + 30);
-  EXPECT_EQ(ASCIIToUTF16("125 hours, 42 minutes, 30 seconds"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_WIDE));
-  EXPECT_EQ(ASCIIToUTF16("125 hr, 42 min, 30 sec"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_SHORT));
-  EXPECT_EQ(ASCIIToUTF16("125h 42m 30s"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NARROW));
-
-  // Test edge case when minute = 0.
-  delta = TimeDelta::FromSeconds(15 * 3600 + 0 * 60 + 30);
-  EXPECT_EQ(ASCIIToUTF16("15 hours, 0 minutes, 30 seconds"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_WIDE));
-  EXPECT_EQ(ASCIIToUTF16("15 hr, 0 min, 30 sec"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_SHORT));
-  EXPECT_EQ(ASCIIToUTF16("15h 0m 30s"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NARROW));
-  EXPECT_EQ(ASCIIToUTF16("15:00:30"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NUMERIC));
-
-  // Test edge case when second = 0.
-  delta = TimeDelta::FromSeconds(15 * 3600 + 42 * 60 + 0);
-  EXPECT_EQ(ASCIIToUTF16("15 hours, 42 minutes, 0 seconds"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_WIDE));
-  EXPECT_EQ(ASCIIToUTF16("15 hr, 42 min, 0 sec"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_SHORT));
-  EXPECT_EQ(ASCIIToUTF16("15h 42m 0s"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NARROW));
-  EXPECT_EQ(ASCIIToUTF16("15:42:00"),
-            TimeDurationFormatWithSecondsString(delta, DURATION_WIDTH_NUMERIC));
-}
-
-TEST(TimeFormattingTest, TimeIntervalFormat) {
-  test::ScopedRestoreICUDefaultLocale restore_locale;
-  i18n::SetICUDefaultLocale("en_US");
-  ScopedRestoreDefaultTimezone la_time("America/Los_Angeles");
-
-  const Time::Exploded kTestIntervalEndTimeExploded = {
-      2011, 5,  6, 28,  // Sat, May 28, 2012
-      22,   42, 7, 0    // 22:42:07.000
-  };
-
-  Time begin_time;
-  EXPECT_TRUE(Time::FromUTCExploded(kTestDateTimeExploded, &begin_time));
-  Time end_time;
-  EXPECT_TRUE(Time::FromUTCExploded(kTestIntervalEndTimeExploded, &end_time));
-
-  EXPECT_EQ(
-      UTF8ToUTF16(u8"Saturday, April 30 – Saturday, May 28"),
-      DateIntervalFormat(begin_time, end_time, DATE_FORMAT_MONTH_WEEKDAY_DAY));
-
-  const Time::Exploded kTestIntervalBeginTimeExploded = {
-      2011, 5,  1, 16,  // Mon, May 16, 2012
-      22,   42, 7, 0    // 22:42:07.000
-  };
-  EXPECT_TRUE(
-      Time::FromUTCExploded(kTestIntervalBeginTimeExploded, &begin_time));
-  EXPECT_EQ(
-      UTF8ToUTF16(u8"Monday, May 16 – Saturday, May 28"),
-      DateIntervalFormat(begin_time, end_time, DATE_FORMAT_MONTH_WEEKDAY_DAY));
-
-  i18n::SetICUDefaultLocale("en_GB");
-  EXPECT_EQ(
-      UTF8ToUTF16(u8"Monday 16 – Saturday 28 May"),
-      DateIntervalFormat(begin_time, end_time, DATE_FORMAT_MONTH_WEEKDAY_DAY));
-
-  i18n::SetICUDefaultLocale("ja");
-  EXPECT_EQ(
-      UTF8ToUTF16(u8"5月16日(月曜日)～28日(土曜日)"),
-      DateIntervalFormat(begin_time, end_time, DATE_FORMAT_MONTH_WEEKDAY_DAY));
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/i18n/timezone_unittest.cc b/base/i18n/timezone_unittest.cc
deleted file mode 100644
index 57467dc..0000000
--- a/base/i18n/timezone_unittest.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/i18n/timezone.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-TEST(TimezoneTest, CountryCodeForCurrentTimezone) {
-  std::string country_code = CountryCodeForCurrentTimezone();
-  // On some systems (such as Android or some flavors of Linux), ICU may come up
-  // empty. With https://chromium-review.googlesource.com/c/512282/ , ICU will
-  // not fail any more. See also http://bugs.icu-project.org/trac/ticket/13208 .
-  // Even with that, ICU returns '001' (world) for region-agnostic timezones
-  // such as Etc/UTC and |CountryCodeForCurrentTimezone| returns an empty
-  // string so that the next fallback can be tried by a customer.
-  // TODO(jshin): Revise this to test for actual timezones using
-  // use ScopedRestoreICUDefaultTimezone.
-  if (!country_code.empty())
-    EXPECT_EQ(2U, country_code.size()) << "country_code = " << country_code;
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/json/json_parser_unittest.cc b/base/json/json_parser_unittest.cc
deleted file mode 100644
index 0da3db8..0000000
--- a/base/json/json_parser_unittest.cc
+++ /dev/null
@@ -1,462 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/json/json_parser.h"
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/json/json_reader.h"
-#include "base/memory/ptr_util.h"
-#include "base/optional.h"
-#include "base/strings/stringprintf.h"
-#include "base/values.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-class JSONParserTest : public testing::Test {
- public:
-  JSONParser* NewTestParser(const std::string& input,
-                            int options = JSON_PARSE_RFC) {
-    JSONParser* parser = new JSONParser(options);
-    parser->input_ = input;
-    parser->index_ = 0;
-    return parser;
-  }
-
-  // MSan will do a better job detecting over-read errors if the input is
-  // not nul-terminated on the heap. This will copy |input| to a new buffer
-  // owned by |owner|, returning a StringPiece to |owner|.
-  StringPiece MakeNotNullTerminatedInput(const char* input,
-                                         std::unique_ptr<char[]>* owner) {
-    size_t str_len = strlen(input);
-    owner->reset(new char[str_len]);
-    memcpy(owner->get(), input, str_len);
-    return StringPiece(owner->get(), str_len);
-  }
-
-  void TestLastThree(JSONParser* parser) {
-    EXPECT_EQ(',', *parser->PeekChar());
-    parser->ConsumeChar();
-    EXPECT_EQ('|', *parser->PeekChar());
-    parser->ConsumeChar();
-    EXPECT_EQ('\0', *parser->pos());
-    EXPECT_EQ(static_cast<size_t>(parser->index_), parser->input_.length());
-  }
-};
-
-TEST_F(JSONParserTest, NextChar) {
-  std::string input("Hello world");
-  std::unique_ptr<JSONParser> parser(NewTestParser(input));
-
-  EXPECT_EQ('H', *parser->pos());
-  for (size_t i = 1; i < input.length(); ++i) {
-    parser->ConsumeChar();
-    EXPECT_EQ(input[i], *parser->PeekChar());
-  }
-  parser->ConsumeChar();
-  EXPECT_EQ('\0', *parser->pos());
-  EXPECT_EQ(static_cast<size_t>(parser->index_), parser->input_.length());
-}
-
-TEST_F(JSONParserTest, ConsumeString) {
-  std::string input("\"test\",|");
-  std::unique_ptr<JSONParser> parser(NewTestParser(input));
-  Optional<Value> value(parser->ConsumeString());
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  std::string str;
-  EXPECT_TRUE(value->GetAsString(&str));
-  EXPECT_EQ("test", str);
-}
-
-TEST_F(JSONParserTest, ConsumeList) {
-  std::string input("[true, false],|");
-  std::unique_ptr<JSONParser> parser(NewTestParser(input));
-  Optional<Value> value(parser->ConsumeList());
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  base::ListValue* list;
-  EXPECT_TRUE(value->GetAsList(&list));
-  EXPECT_EQ(2u, list->GetSize());
-}
-
-TEST_F(JSONParserTest, ConsumeDictionary) {
-  std::string input("{\"abc\":\"def\"},|");
-  std::unique_ptr<JSONParser> parser(NewTestParser(input));
-  Optional<Value> value(parser->ConsumeDictionary());
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  base::DictionaryValue* dict;
-  EXPECT_TRUE(value->GetAsDictionary(&dict));
-  std::string str;
-  EXPECT_TRUE(dict->GetString("abc", &str));
-  EXPECT_EQ("def", str);
-}
-
-TEST_F(JSONParserTest, ConsumeLiterals) {
-  // Literal |true|.
-  std::string input("true,|");
-  std::unique_ptr<JSONParser> parser(NewTestParser(input));
-  Optional<Value> value(parser->ConsumeLiteral());
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  bool bool_value = false;
-  EXPECT_TRUE(value->GetAsBoolean(&bool_value));
-  EXPECT_TRUE(bool_value);
-
-  // Literal |false|.
-  input = "false,|";
-  parser.reset(NewTestParser(input));
-  value = parser->ConsumeLiteral();
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  EXPECT_TRUE(value->GetAsBoolean(&bool_value));
-  EXPECT_FALSE(bool_value);
-
-  // Literal |null|.
-  input = "null,|";
-  parser.reset(NewTestParser(input));
-  value = parser->ConsumeLiteral();
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  EXPECT_TRUE(value->is_none());
-}
-
-TEST_F(JSONParserTest, ConsumeNumbers) {
-  // Integer.
-  std::string input("1234,|");
-  std::unique_ptr<JSONParser> parser(NewTestParser(input));
-  Optional<Value> value(parser->ConsumeNumber());
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  int number_i;
-  EXPECT_TRUE(value->GetAsInteger(&number_i));
-  EXPECT_EQ(1234, number_i);
-
-  // Negative integer.
-  input = "-1234,|";
-  parser.reset(NewTestParser(input));
-  value = parser->ConsumeNumber();
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  EXPECT_TRUE(value->GetAsInteger(&number_i));
-  EXPECT_EQ(-1234, number_i);
-
-  // Double.
-  input = "12.34,|";
-  parser.reset(NewTestParser(input));
-  value = parser->ConsumeNumber();
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  double number_d;
-  EXPECT_TRUE(value->GetAsDouble(&number_d));
-  EXPECT_EQ(12.34, number_d);
-
-  // Scientific.
-  input = "42e3,|";
-  parser.reset(NewTestParser(input));
-  value = parser->ConsumeNumber();
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  EXPECT_TRUE(value->GetAsDouble(&number_d));
-  EXPECT_EQ(42000, number_d);
-
-  // Negative scientific.
-  input = "314159e-5,|";
-  parser.reset(NewTestParser(input));
-  value = parser->ConsumeNumber();
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  EXPECT_TRUE(value->GetAsDouble(&number_d));
-  EXPECT_EQ(3.14159, number_d);
-
-  // Positive scientific.
-  input = "0.42e+3,|";
-  parser.reset(NewTestParser(input));
-  value = parser->ConsumeNumber();
-  EXPECT_EQ(',', *parser->pos());
-
-  TestLastThree(parser.get());
-
-  ASSERT_TRUE(value);
-  EXPECT_TRUE(value->GetAsDouble(&number_d));
-  EXPECT_EQ(420, number_d);
-}
-
-TEST_F(JSONParserTest, ErrorMessages) {
-  // Error strings should not be modified in case of success.
-  std::string error_message;
-  int error_code = 0;
-  std::unique_ptr<Value> root = JSONReader::ReadAndReturnError(
-      "[42]", JSON_PARSE_RFC, &error_code, &error_message);
-  EXPECT_TRUE(error_message.empty());
-  EXPECT_EQ(0, error_code);
-
-  // Test line and column counting
-  const char big_json[] = "[\n0,\n1,\n2,\n3,4,5,6 7,\n8,\n9\n]";
-  // error here ----------------------------------^
-  root = JSONReader::ReadAndReturnError(big_json, JSON_PARSE_RFC, &error_code,
-                                        &error_message);
-  EXPECT_FALSE(root.get());
-  EXPECT_EQ(JSONParser::FormatErrorMessage(5, 10, JSONReader::kSyntaxError),
-            error_message);
-  EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code);
-
-  error_code = 0;
-  error_message = "";
-  // Test line and column counting with "\r\n" line ending
-  const char big_json_crlf[] =
-      "[\r\n0,\r\n1,\r\n2,\r\n3,4,5,6 7,\r\n8,\r\n9\r\n]";
-  // error here ----------------------^
-  root = JSONReader::ReadAndReturnError(big_json_crlf, JSON_PARSE_RFC,
-                                        &error_code, &error_message);
-  EXPECT_FALSE(root.get());
-  EXPECT_EQ(JSONParser::FormatErrorMessage(5, 10, JSONReader::kSyntaxError),
-            error_message);
-  EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code);
-
-  // Test each of the error conditions
-  root = JSONReader::ReadAndReturnError("{},{}", JSON_PARSE_RFC, &error_code,
-                                        &error_message);
-  EXPECT_FALSE(root.get());
-  EXPECT_EQ(JSONParser::FormatErrorMessage(1, 3,
-      JSONReader::kUnexpectedDataAfterRoot), error_message);
-  EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, error_code);
-
-  std::string nested_json;
-  for (int i = 0; i < 201; ++i) {
-    nested_json.insert(nested_json.begin(), '[');
-    nested_json.append(1, ']');
-  }
-  root = JSONReader::ReadAndReturnError(nested_json, JSON_PARSE_RFC,
-                                        &error_code, &error_message);
-  EXPECT_FALSE(root.get());
-  EXPECT_EQ(JSONParser::FormatErrorMessage(1, 200, JSONReader::kTooMuchNesting),
-            error_message);
-  EXPECT_EQ(JSONReader::JSON_TOO_MUCH_NESTING, error_code);
-
-  root = JSONReader::ReadAndReturnError("[1,]", JSON_PARSE_RFC, &error_code,
-                                        &error_message);
-  EXPECT_FALSE(root.get());
-  EXPECT_EQ(JSONParser::FormatErrorMessage(1, 4, JSONReader::kTrailingComma),
-            error_message);
-  EXPECT_EQ(JSONReader::JSON_TRAILING_COMMA, error_code);
-
-  root = JSONReader::ReadAndReturnError("{foo:\"bar\"}", JSON_PARSE_RFC,
-                                        &error_code, &error_message);
-  EXPECT_FALSE(root.get());
-  EXPECT_EQ(JSONParser::FormatErrorMessage(1, 2,
-      JSONReader::kUnquotedDictionaryKey), error_message);
-  EXPECT_EQ(JSONReader::JSON_UNQUOTED_DICTIONARY_KEY, error_code);
-
-  root = JSONReader::ReadAndReturnError("{\"foo\":\"bar\",}", JSON_PARSE_RFC,
-                                        &error_code, &error_message);
-  EXPECT_FALSE(root.get());
-  EXPECT_EQ(JSONParser::FormatErrorMessage(1, 14, JSONReader::kTrailingComma),
-            error_message);
-
-  root = JSONReader::ReadAndReturnError("[nu]", JSON_PARSE_RFC, &error_code,
-                                        &error_message);
-  EXPECT_FALSE(root.get());
-  EXPECT_EQ(JSONParser::FormatErrorMessage(1, 2, JSONReader::kSyntaxError),
-            error_message);
-  EXPECT_EQ(JSONReader::JSON_SYNTAX_ERROR, error_code);
-
-  root = JSONReader::ReadAndReturnError("[\"xxx\\xq\"]", JSON_PARSE_RFC,
-                                        &error_code, &error_message);
-  EXPECT_FALSE(root.get());
-  EXPECT_EQ(JSONParser::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape),
-            error_message);
-  EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code);
-
-  root = JSONReader::ReadAndReturnError("[\"xxx\\uq\"]", JSON_PARSE_RFC,
-                                        &error_code, &error_message);
-  EXPECT_FALSE(root.get());
-  EXPECT_EQ(JSONParser::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape),
-            error_message);
-  EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code);
-
-  root = JSONReader::ReadAndReturnError("[\"xxx\\q\"]", JSON_PARSE_RFC,
-                                        &error_code, &error_message);
-  EXPECT_FALSE(root.get());
-  EXPECT_EQ(JSONParser::FormatErrorMessage(1, 7, JSONReader::kInvalidEscape),
-            error_message);
-  EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code);
-
-  root = JSONReader::ReadAndReturnError(("[\"\\ufffe\"]"), JSON_PARSE_RFC,
-                                        &error_code, &error_message);
-  EXPECT_EQ(JSONParser::FormatErrorMessage(1, 8, JSONReader::kInvalidEscape),
-            error_message);
-  EXPECT_EQ(JSONReader::JSON_INVALID_ESCAPE, error_code);
-}
-
-TEST_F(JSONParserTest, Decode4ByteUtf8Char) {
-  // This test strings contains a 4 byte unicode character (a smiley!) that the
-  // reader should be able to handle (the character is \xf0\x9f\x98\x87).
-  const char kUtf8Data[] =
-      "[\"😇\",[],[],[],{\"google:suggesttype\":[]}]";
-  std::string error_message;
-  int error_code = 0;
-  std::unique_ptr<Value> root = JSONReader::ReadAndReturnError(
-      kUtf8Data, JSON_PARSE_RFC, &error_code, &error_message);
-  EXPECT_TRUE(root.get()) << error_message;
-}
-
-TEST_F(JSONParserTest, DecodeUnicodeNonCharacter) {
-  // Tests Unicode code points (encoded as escaped UTF-16) that are not valid
-  // characters.
-  EXPECT_FALSE(JSONReader::Read("[\"\\ufdd0\"]"));
-  EXPECT_FALSE(JSONReader::Read("[\"\\ufffe\"]"));
-  EXPECT_FALSE(JSONReader::Read("[\"\\ud83f\\udffe\"]"));
-
-  EXPECT_TRUE(
-      JSONReader::Read("[\"\\ufdd0\"]", JSON_REPLACE_INVALID_CHARACTERS));
-  EXPECT_TRUE(
-      JSONReader::Read("[\"\\ufffe\"]", JSON_REPLACE_INVALID_CHARACTERS));
-}
-
-TEST_F(JSONParserTest, DecodeNegativeEscapeSequence) {
-  EXPECT_FALSE(JSONReader::Read("[\"\\x-A\"]"));
-  EXPECT_FALSE(JSONReader::Read("[\"\\u-00A\"]"));
-}
-
-// Verifies invalid utf-8 characters are replaced.
-TEST_F(JSONParserTest, ReplaceInvalidCharacters) {
-  const std::string bogus_char = "󿿿";
-  const std::string quoted_bogus_char = "\"" + bogus_char + "\"";
-  std::unique_ptr<JSONParser> parser(
-      NewTestParser(quoted_bogus_char, JSON_REPLACE_INVALID_CHARACTERS));
-  Optional<Value> value(parser->ConsumeString());
-  ASSERT_TRUE(value);
-  std::string str;
-  EXPECT_TRUE(value->GetAsString(&str));
-  EXPECT_EQ(kUnicodeReplacementString, str);
-}
-
-TEST_F(JSONParserTest, ReplaceInvalidUTF16EscapeSequence) {
-  const std::string invalid = "\"\\ufffe\"";
-  std::unique_ptr<JSONParser> parser(
-      NewTestParser(invalid, JSON_REPLACE_INVALID_CHARACTERS));
-  Optional<Value> value(parser->ConsumeString());
-  ASSERT_TRUE(value);
-  std::string str;
-  EXPECT_TRUE(value->GetAsString(&str));
-  EXPECT_EQ(kUnicodeReplacementString, str);
-}
-
-TEST_F(JSONParserTest, ParseNumberErrors) {
-  const struct {
-    const char* input;
-    bool parse_success;
-    double value;
-  } kCases[] = {
-      // clang-format off
-      {"1", true, 1},
-      {"2.", false, 0},
-      {"42", true, 42},
-      {"6e", false, 0},
-      {"43e2", true, 4300},
-      {"43e-", false, 0},
-      {"9e-3", true, 0.009},
-      {"2e+", false, 0},
-      {"2e+2", true, 200},
-      // clang-format on
-  };
-
-  for (unsigned int i = 0; i < arraysize(kCases); ++i) {
-    auto test_case = kCases[i];
-    SCOPED_TRACE(StringPrintf("case %u: \"%s\"", i, test_case.input));
-
-    std::unique_ptr<char[]> input_owner;
-    StringPiece input =
-        MakeNotNullTerminatedInput(test_case.input, &input_owner);
-
-    std::unique_ptr<Value> result = JSONReader::Read(input);
-    if (test_case.parse_success) {
-      EXPECT_TRUE(result);
-    } else {
-      EXPECT_FALSE(result);
-    }
-
-    if (!result)
-      continue;
-
-    double double_value = 0;
-    EXPECT_TRUE(result->GetAsDouble(&double_value));
-    EXPECT_EQ(test_case.value, double_value);
-  }
-}
-
-TEST_F(JSONParserTest, UnterminatedInputs) {
-  const char* kCases[] = {
-      // clang-format off
-      "/",
-      "//",
-      "/*",
-      "\"xxxxxx",
-      "\"",
-      "{   ",
-      "[\t",
-      "tru",
-      "fals",
-      "nul",
-      "\"\\x",
-      "\"\\x2",
-      "\"\\u123",
-      "\"\\uD803\\u",
-      "\"\\",
-      "\"\\/",
-      // clang-format on
-  };
-
-  for (unsigned int i = 0; i < arraysize(kCases); ++i) {
-    auto* test_case = kCases[i];
-    SCOPED_TRACE(StringPrintf("case %u: \"%s\"", i, test_case));
-
-    std::unique_ptr<char[]> input_owner;
-    StringPiece input = MakeNotNullTerminatedInput(test_case, &input_owner);
-
-    EXPECT_FALSE(JSONReader::Read(input));
-  }
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/json/json_reader_unittest.cc b/base/json/json_reader_unittest.cc
deleted file mode 100644
index 828fba0..0000000
--- a/base/json/json_reader_unittest.cc
+++ /dev/null
@@ -1,665 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/json/json_reader.h"
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/base_paths.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/path_service.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/values.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(JSONReaderTest, Whitespace) {
-  std::unique_ptr<Value> root = JSONReader().ReadToValue("   null   ");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_none());
-}
-
-TEST(JSONReaderTest, InvalidString) {
-  EXPECT_FALSE(JSONReader().ReadToValue("nu"));
-}
-
-TEST(JSONReaderTest, SimpleBool) {
-  std::unique_ptr<Value> root = JSONReader().ReadToValue("true  ");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_bool());
-}
-
-TEST(JSONReaderTest, EmbeddedComments) {
-  std::unique_ptr<Value> root = JSONReader().ReadToValue("/* comment */null");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_none());
-  root = JSONReader().ReadToValue("40 /* comment */");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_int());
-  root = JSONReader().ReadToValue("true // comment");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_bool());
-  root = JSONReader().ReadToValue("/* comment */\"sample string\"");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_string());
-  std::string value;
-  EXPECT_TRUE(root->GetAsString(&value));
-  EXPECT_EQ("sample string", value);
-  std::unique_ptr<ListValue> list =
-      ListValue::From(JSONReader().ReadToValue("[1, /* comment, 2 ] */ \n 3]"));
-  ASSERT_TRUE(list);
-  EXPECT_EQ(2u, list->GetSize());
-  int int_val = 0;
-  EXPECT_TRUE(list->GetInteger(0, &int_val));
-  EXPECT_EQ(1, int_val);
-  EXPECT_TRUE(list->GetInteger(1, &int_val));
-  EXPECT_EQ(3, int_val);
-  list = ListValue::From(JSONReader().ReadToValue("[1, /*a*/2, 3]"));
-  ASSERT_TRUE(list);
-  EXPECT_EQ(3u, list->GetSize());
-  root = JSONReader().ReadToValue("/* comment **/42");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_int());
-  EXPECT_TRUE(root->GetAsInteger(&int_val));
-  EXPECT_EQ(42, int_val);
-  root = JSONReader().ReadToValue(
-      "/* comment **/\n"
-      "// */ 43\n"
-      "44");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_int());
-  EXPECT_TRUE(root->GetAsInteger(&int_val));
-  EXPECT_EQ(44, int_val);
-}
-
-TEST(JSONReaderTest, Ints) {
-  std::unique_ptr<Value> root = JSONReader().ReadToValue("43");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_int());
-  int int_val = 0;
-  EXPECT_TRUE(root->GetAsInteger(&int_val));
-  EXPECT_EQ(43, int_val);
-}
-
-TEST(JSONReaderTest, NonDecimalNumbers) {
-  // According to RFC4627, oct, hex, and leading zeros are invalid JSON.
-  EXPECT_FALSE(JSONReader().ReadToValue("043"));
-  EXPECT_FALSE(JSONReader().ReadToValue("0x43"));
-  EXPECT_FALSE(JSONReader().ReadToValue("00"));
-}
-
-TEST(JSONReaderTest, NumberZero) {
-  // Test 0 (which needs to be special cased because of the leading zero
-  // clause).
-  std::unique_ptr<Value> root = JSONReader().ReadToValue("0");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_int());
-  int int_val = 1;
-  EXPECT_TRUE(root->GetAsInteger(&int_val));
-  EXPECT_EQ(0, int_val);
-}
-
-TEST(JSONReaderTest, LargeIntPromotion) {
-  // Numbers that overflow ints should succeed, being internally promoted to
-  // storage as doubles
-  std::unique_ptr<Value> root = JSONReader().ReadToValue("2147483648");
-  ASSERT_TRUE(root);
-  double double_val;
-  EXPECT_TRUE(root->is_double());
-  double_val = 0.0;
-  EXPECT_TRUE(root->GetAsDouble(&double_val));
-  EXPECT_DOUBLE_EQ(2147483648.0, double_val);
-  root = JSONReader().ReadToValue("-2147483649");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_double());
-  double_val = 0.0;
-  EXPECT_TRUE(root->GetAsDouble(&double_val));
-  EXPECT_DOUBLE_EQ(-2147483649.0, double_val);
-}
-
-TEST(JSONReaderTest, Doubles) {
-  std::unique_ptr<Value> root = JSONReader().ReadToValue("43.1");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_double());
-  double double_val = 0.0;
-  EXPECT_TRUE(root->GetAsDouble(&double_val));
-  EXPECT_DOUBLE_EQ(43.1, double_val);
-
-  root = JSONReader().ReadToValue("4.3e-1");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_double());
-  double_val = 0.0;
-  EXPECT_TRUE(root->GetAsDouble(&double_val));
-  EXPECT_DOUBLE_EQ(.43, double_val);
-
-  root = JSONReader().ReadToValue("2.1e0");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_double());
-  double_val = 0.0;
-  EXPECT_TRUE(root->GetAsDouble(&double_val));
-  EXPECT_DOUBLE_EQ(2.1, double_val);
-
-  root = JSONReader().ReadToValue("2.1e+0001");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_double());
-  double_val = 0.0;
-  EXPECT_TRUE(root->GetAsDouble(&double_val));
-  EXPECT_DOUBLE_EQ(21.0, double_val);
-
-  root = JSONReader().ReadToValue("0.01");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_double());
-  double_val = 0.0;
-  EXPECT_TRUE(root->GetAsDouble(&double_val));
-  EXPECT_DOUBLE_EQ(0.01, double_val);
-
-  root = JSONReader().ReadToValue("1.00");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_double());
-  double_val = 0.0;
-  EXPECT_TRUE(root->GetAsDouble(&double_val));
-  EXPECT_DOUBLE_EQ(1.0, double_val);
-}
-
-TEST(JSONReaderTest, FractionalNumbers) {
-  // Fractional parts must have a digit before and after the decimal point.
-  EXPECT_FALSE(JSONReader().ReadToValue("1."));
-  EXPECT_FALSE(JSONReader().ReadToValue(".1"));
-  EXPECT_FALSE(JSONReader().ReadToValue("1.e10"));
-}
-
-TEST(JSONReaderTest, ExponentialNumbers) {
-  // Exponent must have a digit following the 'e'.
-  EXPECT_FALSE(JSONReader().ReadToValue("1e"));
-  EXPECT_FALSE(JSONReader().ReadToValue("1E"));
-  EXPECT_FALSE(JSONReader().ReadToValue("1e1."));
-  EXPECT_FALSE(JSONReader().ReadToValue("1e1.0"));
-}
-
-TEST(JSONReaderTest, InvalidNAN) {
-  EXPECT_FALSE(JSONReader().ReadToValue("1e1000"));
-  EXPECT_FALSE(JSONReader().ReadToValue("-1e1000"));
-  EXPECT_FALSE(JSONReader().ReadToValue("NaN"));
-  EXPECT_FALSE(JSONReader().ReadToValue("nan"));
-  EXPECT_FALSE(JSONReader().ReadToValue("inf"));
-}
-
-TEST(JSONReaderTest, InvalidNumbers) {
-  EXPECT_FALSE(JSONReader().ReadToValue("4.3.1"));
-  EXPECT_FALSE(JSONReader().ReadToValue("4e3.1"));
-  EXPECT_FALSE(JSONReader().ReadToValue("4.a"));
-}
-
-TEST(JSONReader, SimpleString) {
-  std::unique_ptr<Value> root = JSONReader().ReadToValue("\"hello world\"");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_string());
-  std::string str_val;
-  EXPECT_TRUE(root->GetAsString(&str_val));
-  EXPECT_EQ("hello world", str_val);
-}
-
-TEST(JSONReaderTest, EmptyString) {
-  std::unique_ptr<Value> root = JSONReader().ReadToValue("\"\"");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_string());
-  std::string str_val;
-  EXPECT_TRUE(root->GetAsString(&str_val));
-  EXPECT_EQ("", str_val);
-}
-
-TEST(JSONReaderTest, BasicStringEscapes) {
-  std::unique_ptr<Value> root =
-      JSONReader().ReadToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_string());
-  std::string str_val;
-  EXPECT_TRUE(root->GetAsString(&str_val));
-  EXPECT_EQ(" \"\\/\b\f\n\r\t\v", str_val);
-}
-
-TEST(JSONReaderTest, UnicodeEscapes) {
-  // Test hex and unicode escapes including the null character.
-  std::unique_ptr<Value> root =
-      JSONReader().ReadToValue("\"\\x41\\x00\\u1234\\u0000\"");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_string());
-  std::string str_val;
-  EXPECT_TRUE(root->GetAsString(&str_val));
-  EXPECT_EQ(std::wstring(L"A\0\x1234\0", 4), UTF8ToWide(str_val));
-}
-
-TEST(JSONReaderTest, InvalidStrings) {
-  EXPECT_FALSE(JSONReader().ReadToValue("\"no closing quote"));
-  EXPECT_FALSE(JSONReader().ReadToValue("\"\\z invalid escape char\""));
-  EXPECT_FALSE(JSONReader().ReadToValue("\"\\xAQ invalid hex code\""));
-  EXPECT_FALSE(JSONReader().ReadToValue("not enough hex chars\\x1\""));
-  EXPECT_FALSE(JSONReader().ReadToValue("\"not enough escape chars\\u123\""));
-  EXPECT_FALSE(
-      JSONReader().ReadToValue("\"extra backslash at end of input\\\""));
-}
-
-TEST(JSONReaderTest, BasicArray) {
-  std::unique_ptr<ListValue> list =
-      ListValue::From(JSONReader::Read("[true, false, null]"));
-  ASSERT_TRUE(list);
-  EXPECT_EQ(3U, list->GetSize());
-
-  // Test with trailing comma.  Should be parsed the same as above.
-  std::unique_ptr<Value> root2 =
-      JSONReader::Read("[true, false, null, ]", JSON_ALLOW_TRAILING_COMMAS);
-  EXPECT_TRUE(list->Equals(root2.get()));
-}
-
-TEST(JSONReaderTest, EmptyArray) {
-  std::unique_ptr<ListValue> list = ListValue::From(JSONReader::Read("[]"));
-  ASSERT_TRUE(list);
-  EXPECT_EQ(0U, list->GetSize());
-}
-
-TEST(JSONReaderTest, NestedArrays) {
-  std::unique_ptr<ListValue> list = ListValue::From(
-      JSONReader::Read("[[true], [], [false, [], [null]], null]"));
-  ASSERT_TRUE(list);
-  EXPECT_EQ(4U, list->GetSize());
-
-  // Lots of trailing commas.
-  std::unique_ptr<Value> root2 =
-      JSONReader::Read("[[true], [], [false, [], [null, ]  , ], null,]",
-                       JSON_ALLOW_TRAILING_COMMAS);
-  EXPECT_TRUE(list->Equals(root2.get()));
-}
-
-TEST(JSONReaderTest, InvalidArrays) {
-  // Missing close brace.
-  EXPECT_FALSE(JSONReader::Read("[[true], [], [false, [], [null]], null"));
-
-  // Too many commas.
-  EXPECT_FALSE(JSONReader::Read("[true,, null]"));
-  EXPECT_FALSE(JSONReader::Read("[true,, null]", JSON_ALLOW_TRAILING_COMMAS));
-
-  // No commas.
-  EXPECT_FALSE(JSONReader::Read("[true null]"));
-
-  // Trailing comma.
-  EXPECT_FALSE(JSONReader::Read("[true,]"));
-}
-
-TEST(JSONReaderTest, ArrayTrailingComma) {
-  // Valid if we set |allow_trailing_comma| to true.
-  std::unique_ptr<ListValue> list =
-      ListValue::From(JSONReader::Read("[true,]", JSON_ALLOW_TRAILING_COMMAS));
-  ASSERT_TRUE(list);
-  EXPECT_EQ(1U, list->GetSize());
-  Value* tmp_value = nullptr;
-  ASSERT_TRUE(list->Get(0, &tmp_value));
-  EXPECT_TRUE(tmp_value->is_bool());
-  bool bool_value = false;
-  EXPECT_TRUE(tmp_value->GetAsBoolean(&bool_value));
-  EXPECT_TRUE(bool_value);
-}
-
-TEST(JSONReaderTest, ArrayTrailingCommaNoEmptyElements) {
-  // Don't allow empty elements, even if |allow_trailing_comma| is
-  // true.
-  EXPECT_FALSE(JSONReader::Read("[,]", JSON_ALLOW_TRAILING_COMMAS));
-  EXPECT_FALSE(JSONReader::Read("[true,,]", JSON_ALLOW_TRAILING_COMMAS));
-  EXPECT_FALSE(JSONReader::Read("[,true,]", JSON_ALLOW_TRAILING_COMMAS));
-  EXPECT_FALSE(JSONReader::Read("[true,,false]", JSON_ALLOW_TRAILING_COMMAS));
-}
-
-TEST(JSONReaderTest, EmptyDictionary) {
-  std::unique_ptr<DictionaryValue> dict_val =
-      DictionaryValue::From(JSONReader::Read("{}"));
-  ASSERT_TRUE(dict_val);
-}
-
-TEST(JSONReaderTest, CompleteDictionary) {
-  auto dict_val = DictionaryValue::From(JSONReader::Read(
-      "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\" }"));
-  ASSERT_TRUE(dict_val);
-  double double_val = 0.0;
-  EXPECT_TRUE(dict_val->GetDouble("number", &double_val));
-  EXPECT_DOUBLE_EQ(9.87654321, double_val);
-  Value* null_val = nullptr;
-  ASSERT_TRUE(dict_val->Get("null", &null_val));
-  EXPECT_TRUE(null_val->is_none());
-  std::string str_val;
-  EXPECT_TRUE(dict_val->GetString("S", &str_val));
-  EXPECT_EQ("str", str_val);
-
-  std::unique_ptr<Value> root2 = JSONReader::Read(
-      "{\"number\":9.87654321, \"null\":null , \"\\x53\" : \"str\", }",
-      JSON_ALLOW_TRAILING_COMMAS);
-  ASSERT_TRUE(root2);
-  EXPECT_TRUE(dict_val->Equals(root2.get()));
-
-  // Test newline equivalence.
-  root2 = JSONReader::Read(
-      "{\n"
-      "  \"number\":9.87654321,\n"
-      "  \"null\":null,\n"
-      "  \"\\x53\":\"str\",\n"
-      "}\n",
-      JSON_ALLOW_TRAILING_COMMAS);
-  ASSERT_TRUE(root2);
-  EXPECT_TRUE(dict_val->Equals(root2.get()));
-
-  root2 = JSONReader::Read(
-      "{\r\n"
-      "  \"number\":9.87654321,\r\n"
-      "  \"null\":null,\r\n"
-      "  \"\\x53\":\"str\",\r\n"
-      "}\r\n",
-      JSON_ALLOW_TRAILING_COMMAS);
-  ASSERT_TRUE(root2);
-  EXPECT_TRUE(dict_val->Equals(root2.get()));
-}
-
-TEST(JSONReaderTest, NestedDictionaries) {
-  std::unique_ptr<DictionaryValue> dict_val =
-      DictionaryValue::From(JSONReader::Read(
-          "{\"inner\":{\"array\":[true]},\"false\":false,\"d\":{}}"));
-  ASSERT_TRUE(dict_val);
-  DictionaryValue* inner_dict = nullptr;
-  ASSERT_TRUE(dict_val->GetDictionary("inner", &inner_dict));
-  ListValue* inner_array = nullptr;
-  ASSERT_TRUE(inner_dict->GetList("array", &inner_array));
-  EXPECT_EQ(1U, inner_array->GetSize());
-  bool bool_value = true;
-  EXPECT_TRUE(dict_val->GetBoolean("false", &bool_value));
-  EXPECT_FALSE(bool_value);
-  inner_dict = nullptr;
-  EXPECT_TRUE(dict_val->GetDictionary("d", &inner_dict));
-
-  std::unique_ptr<Value> root2 = JSONReader::Read(
-      "{\"inner\": {\"array\":[true] , },\"false\":false,\"d\":{},}",
-      JSON_ALLOW_TRAILING_COMMAS);
-  EXPECT_TRUE(dict_val->Equals(root2.get()));
-}
-
-TEST(JSONReaderTest, DictionaryKeysWithPeriods) {
-  std::unique_ptr<DictionaryValue> dict_val = DictionaryValue::From(
-      JSONReader::Read("{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}"));
-  ASSERT_TRUE(dict_val);
-  int integer_value = 0;
-  EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value));
-  EXPECT_EQ(3, integer_value);
-  EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("c", &integer_value));
-  EXPECT_EQ(2, integer_value);
-  DictionaryValue* inner_dict = nullptr;
-  ASSERT_TRUE(
-      dict_val->GetDictionaryWithoutPathExpansion("d.e.f", &inner_dict));
-  EXPECT_EQ(1U, inner_dict->size());
-  EXPECT_TRUE(
-      inner_dict->GetIntegerWithoutPathExpansion("g.h.i.j", &integer_value));
-  EXPECT_EQ(1, integer_value);
-
-  dict_val =
-      DictionaryValue::From(JSONReader::Read("{\"a\":{\"b\":2},\"a.b\":1}"));
-  ASSERT_TRUE(dict_val);
-  EXPECT_TRUE(dict_val->GetInteger("a.b", &integer_value));
-  EXPECT_EQ(2, integer_value);
-  EXPECT_TRUE(dict_val->GetIntegerWithoutPathExpansion("a.b", &integer_value));
-  EXPECT_EQ(1, integer_value);
-}
-
-TEST(JSONReaderTest, InvalidDictionaries) {
-  // No closing brace.
-  EXPECT_FALSE(JSONReader::Read("{\"a\": true"));
-
-  // Keys must be quoted strings.
-  EXPECT_FALSE(JSONReader::Read("{foo:true}"));
-  EXPECT_FALSE(JSONReader::Read("{1234: false}"));
-  EXPECT_FALSE(JSONReader::Read("{:false}"));
-
-  // Trailing comma.
-  EXPECT_FALSE(JSONReader::Read("{\"a\":true,}"));
-
-  // Too many commas.
-  EXPECT_FALSE(JSONReader::Read("{\"a\":true,,\"b\":false}"));
-  EXPECT_FALSE(JSONReader::Read("{\"a\":true,,\"b\":false}",
-                                JSON_ALLOW_TRAILING_COMMAS));
-
-  // No separator.
-  EXPECT_FALSE(JSONReader::Read("{\"a\" \"b\"}"));
-
-  // Lone comma.
-  EXPECT_FALSE(JSONReader::Read("{,}"));
-  EXPECT_FALSE(JSONReader::Read("{,}", JSON_ALLOW_TRAILING_COMMAS));
-  EXPECT_FALSE(JSONReader::Read("{\"a\":true,,}", JSON_ALLOW_TRAILING_COMMAS));
-  EXPECT_FALSE(JSONReader::Read("{,\"a\":true}", JSON_ALLOW_TRAILING_COMMAS));
-  EXPECT_FALSE(JSONReader::Read("{\"a\":true,,\"b\":false}",
-                                JSON_ALLOW_TRAILING_COMMAS));
-}
-
-TEST(JSONReaderTest, StackOverflow) {
-  std::string evil(1000000, '[');
-  evil.append(std::string(1000000, ']'));
-  EXPECT_FALSE(JSONReader::Read(evil));
-
-  // A few thousand adjacent lists is fine.
-  std::string not_evil("[");
-  not_evil.reserve(15010);
-  for (int i = 0; i < 5000; ++i)
-    not_evil.append("[],");
-  not_evil.append("[]]");
-  std::unique_ptr<ListValue> list = ListValue::From(JSONReader::Read(not_evil));
-  ASSERT_TRUE(list);
-  EXPECT_EQ(5001U, list->GetSize());
-}
-
-TEST(JSONReaderTest, UTF8Input) {
-  std::unique_ptr<Value> root =
-      JSONReader().ReadToValue("\"\xe7\xbd\x91\xe9\xa1\xb5\"");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_string());
-  std::string str_val;
-  EXPECT_TRUE(root->GetAsString(&str_val));
-  EXPECT_EQ(L"\x7f51\x9875", UTF8ToWide(str_val));
-
-  std::unique_ptr<DictionaryValue> dict_val =
-      DictionaryValue::From(JSONReader().ReadToValue(
-          "{\"path\": \"/tmp/\xc3\xa0\xc3\xa8\xc3\xb2.png\"}"));
-  ASSERT_TRUE(dict_val);
-  EXPECT_TRUE(dict_val->GetString("path", &str_val));
-  EXPECT_EQ("/tmp/\xC3\xA0\xC3\xA8\xC3\xB2.png", str_val);
-}
-
-TEST(JSONReaderTest, InvalidUTF8Input) {
-  EXPECT_FALSE(JSONReader().ReadToValue("\"345\xb0\xa1\xb0\xa2\""));
-  EXPECT_FALSE(JSONReader().ReadToValue("\"123\xc0\x81\""));
-  EXPECT_FALSE(JSONReader().ReadToValue("\"abc\xc0\xae\""));
-}
-
-TEST(JSONReaderTest, UTF16Escapes) {
-  std::unique_ptr<Value> root = JSONReader().ReadToValue("\"\\u20ac3,14\"");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_string());
-  std::string str_val;
-  EXPECT_TRUE(root->GetAsString(&str_val));
-  EXPECT_EQ(
-      "\xe2\x82\xac"
-      "3,14",
-      str_val);
-
-  root = JSONReader().ReadToValue("\"\\ud83d\\udca9\\ud83d\\udc6c\"");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_string());
-  str_val.clear();
-  EXPECT_TRUE(root->GetAsString(&str_val));
-  EXPECT_EQ("\xf0\x9f\x92\xa9\xf0\x9f\x91\xac", str_val);
-}
-
-TEST(JSONReaderTest, InvalidUTF16Escapes) {
-  const char* const cases[] = {
-      "\"\\u123\"",          // Invalid scalar.
-      "\"\\ud83d\"",         // Invalid scalar.
-      "\"\\u$%@!\"",         // Invalid scalar.
-      "\"\\uzz89\"",         // Invalid scalar.
-      "\"\\ud83d\\udca\"",   // Invalid lower surrogate.
-      "\"\\ud83d\\ud83d\"",  // Invalid lower surrogate.
-      "\"\\ud83d\\uaaaZ\""   // Invalid lower surrogate.
-      "\"\\ud83foo\"",       // No lower surrogate.
-      "\"\\ud83d\\foo\""     // No lower surrogate.
-      "\"\\ud83\\foo\""      // Invalid upper surrogate.
-      "\"\\ud83d\\u1\""      // No lower surrogate.
-      "\"\\ud83\\u1\""       // Invalid upper surrogate.
-  };
-  std::unique_ptr<Value> root;
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    root = JSONReader().ReadToValue(cases[i]);
-    EXPECT_FALSE(root) << cases[i];
-  }
-}
-
-TEST(JSONReaderTest, LiteralRoots) {
-  std::unique_ptr<Value> root = JSONReader::Read("null");
-  ASSERT_TRUE(root);
-  EXPECT_TRUE(root->is_none());
-
-  root = JSONReader::Read("true");
-  ASSERT_TRUE(root);
-  bool bool_value;
-  EXPECT_TRUE(root->GetAsBoolean(&bool_value));
-  EXPECT_TRUE(bool_value);
-
-  root = JSONReader::Read("10");
-  ASSERT_TRUE(root);
-  int integer_value;
-  EXPECT_TRUE(root->GetAsInteger(&integer_value));
-  EXPECT_EQ(10, integer_value);
-
-  root = JSONReader::Read("\"root\"");
-  ASSERT_TRUE(root);
-  std::string str_val;
-  EXPECT_TRUE(root->GetAsString(&str_val));
-  EXPECT_EQ("root", str_val);
-}
-
-TEST(JSONReaderTest, ReadFromFile) {
-  FilePath path;
-  ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &path));
-  path = path.AppendASCII("json");
-  ASSERT_TRUE(base::PathExists(path));
-
-  std::string input;
-  ASSERT_TRUE(ReadFileToString(path.AppendASCII("bom_feff.json"), &input));
-
-  JSONReader reader;
-  std::unique_ptr<Value> root(reader.ReadToValue(input));
-  ASSERT_TRUE(root) << reader.GetErrorMessage();
-  EXPECT_TRUE(root->is_dict());
-}
-
-// Tests that the root of a JSON object can be deleted safely while its
-// children outlive it.
-TEST(JSONReaderTest, StringOptimizations) {
-  std::unique_ptr<Value> dict_literal_0;
-  std::unique_ptr<Value> dict_literal_1;
-  std::unique_ptr<Value> dict_string_0;
-  std::unique_ptr<Value> dict_string_1;
-  std::unique_ptr<Value> list_value_0;
-  std::unique_ptr<Value> list_value_1;
-
-  {
-    std::unique_ptr<Value> root = JSONReader::Read(
-        "{"
-        "  \"test\": {"
-        "    \"foo\": true,"
-        "    \"bar\": 3.14,"
-        "    \"baz\": \"bat\","
-        "    \"moo\": \"cow\""
-        "  },"
-        "  \"list\": ["
-        "    \"a\","
-        "    \"b\""
-        "  ]"
-        "}",
-        JSON_PARSE_RFC);
-    ASSERT_TRUE(root);
-
-    DictionaryValue* root_dict = nullptr;
-    ASSERT_TRUE(root->GetAsDictionary(&root_dict));
-
-    DictionaryValue* dict = nullptr;
-    ListValue* list = nullptr;
-
-    ASSERT_TRUE(root_dict->GetDictionary("test", &dict));
-    ASSERT_TRUE(root_dict->GetList("list", &list));
-
-    ASSERT_TRUE(dict->Remove("foo", &dict_literal_0));
-    ASSERT_TRUE(dict->Remove("bar", &dict_literal_1));
-    ASSERT_TRUE(dict->Remove("baz", &dict_string_0));
-    ASSERT_TRUE(dict->Remove("moo", &dict_string_1));
-
-    ASSERT_EQ(2u, list->GetSize());
-    ASSERT_TRUE(list->Remove(0, &list_value_0));
-    ASSERT_TRUE(list->Remove(0, &list_value_1));
-  }
-
-  bool b = false;
-  double d = 0;
-  std::string s;
-
-  EXPECT_TRUE(dict_literal_0->GetAsBoolean(&b));
-  EXPECT_TRUE(b);
-
-  EXPECT_TRUE(dict_literal_1->GetAsDouble(&d));
-  EXPECT_EQ(3.14, d);
-
-  EXPECT_TRUE(dict_string_0->GetAsString(&s));
-  EXPECT_EQ("bat", s);
-
-  EXPECT_TRUE(dict_string_1->GetAsString(&s));
-  EXPECT_EQ("cow", s);
-
-  EXPECT_TRUE(list_value_0->GetAsString(&s));
-  EXPECT_EQ("a", s);
-  EXPECT_TRUE(list_value_1->GetAsString(&s));
-  EXPECT_EQ("b", s);
-}
-
-// A smattering of invalid JSON designed to test specific portions of the
-// parser implementation against buffer overflow. Best run with DCHECKs so
-// that the one in NextChar fires.
-TEST(JSONReaderTest, InvalidSanity) {
-  const char* const kInvalidJson[] = {
-      "/* test *", "{\"foo\"", "{\"foo\":", "  [", "\"\\u123g\"", "{\n\"eh:\n}",
-  };
-
-  for (size_t i = 0; i < arraysize(kInvalidJson); ++i) {
-    JSONReader reader;
-    LOG(INFO) << "Sanity test " << i << ": <" << kInvalidJson[i] << ">";
-    EXPECT_FALSE(reader.ReadToValue(kInvalidJson[i]));
-    EXPECT_NE(JSONReader::JSON_NO_ERROR, reader.error_code());
-    EXPECT_NE("", reader.GetErrorMessage());
-  }
-}
-
-TEST(JSONReaderTest, IllegalTrailingNull) {
-  const char json[] = { '"', 'n', 'u', 'l', 'l', '"', '\0' };
-  std::string json_string(json, sizeof(json));
-  JSONReader reader;
-  EXPECT_FALSE(reader.ReadToValue(json_string));
-  EXPECT_EQ(JSONReader::JSON_UNEXPECTED_DATA_AFTER_ROOT, reader.error_code());
-}
-
-TEST(JSONReaderTest, MaxNesting) {
-  std::string json(R"({"outer": { "inner": {"foo": true}}})");
-  std::unique_ptr<Value> root;
-  root = JSONReader::Read(json, JSON_PARSE_RFC, 3);
-  ASSERT_FALSE(root);
-  root = JSONReader::Read(json, JSON_PARSE_RFC, 4);
-  ASSERT_TRUE(root);
-}
-
-}  // namespace base
diff --git a/base/json/json_value_converter_unittest.cc b/base/json/json_value_converter_unittest.cc
deleted file mode 100644
index 322f5f0..0000000
--- a/base/json/json_value_converter_unittest.cc
+++ /dev/null
@@ -1,255 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/json/json_value_converter.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/json/json_reader.h"
-#include "base/strings/string_piece.h"
-#include "base/values.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-// Very simple messages.
-struct SimpleMessage {
-  enum SimpleEnum {
-    FOO, BAR,
-  };
-  int foo;
-  std::string bar;
-  bool baz;
-  bool bstruct;
-  SimpleEnum simple_enum;
-  std::vector<std::unique_ptr<int>> ints;
-  std::vector<std::unique_ptr<std::string>> string_values;
-  SimpleMessage() : foo(0), baz(false), bstruct(false), simple_enum(FOO) {}
-
-  static bool ParseSimpleEnum(StringPiece value, SimpleEnum* field) {
-    if (value == "foo") {
-      *field = FOO;
-      return true;
-    } else if (value == "bar") {
-      *field = BAR;
-      return true;
-    }
-    return false;
-  }
-
-  static bool HasFieldPresent(const base::Value* value, bool* result) {
-    *result = value != nullptr;
-    return true;
-  }
-
-  static bool GetValueString(const base::Value* value, std::string* result) {
-    const base::DictionaryValue* dict = nullptr;
-    if (!value->GetAsDictionary(&dict))
-      return false;
-
-    if (!dict->GetString("val", result))
-      return false;
-
-    return true;
-  }
-
-  static void RegisterJSONConverter(
-      base::JSONValueConverter<SimpleMessage>* converter) {
-    converter->RegisterIntField("foo", &SimpleMessage::foo);
-    converter->RegisterStringField("bar", &SimpleMessage::bar);
-    converter->RegisterBoolField("baz", &SimpleMessage::baz);
-    converter->RegisterCustomField<SimpleEnum>(
-        "simple_enum", &SimpleMessage::simple_enum, &ParseSimpleEnum);
-    converter->RegisterRepeatedInt("ints", &SimpleMessage::ints);
-    converter->RegisterCustomValueField<bool>("bstruct",
-                                              &SimpleMessage::bstruct,
-                                              &HasFieldPresent);
-    converter->RegisterRepeatedCustomValue<std::string>(
-        "string_values",
-        &SimpleMessage::string_values,
-        &GetValueString);
-  }
-};
-
-// For nested messages.
-struct NestedMessage {
-  double foo;
-  SimpleMessage child;
-  std::vector<std::unique_ptr<SimpleMessage>> children;
-
-  NestedMessage() : foo(0) {}
-
-  static void RegisterJSONConverter(
-      base::JSONValueConverter<NestedMessage>* converter) {
-    converter->RegisterDoubleField("foo", &NestedMessage::foo);
-    converter->RegisterNestedField("child", &NestedMessage::child);
-    converter->RegisterRepeatedMessage("children", &NestedMessage::children);
-  }
-};
-
-}  // namespace
-
-TEST(JSONValueConverterTest, ParseSimpleMessage) {
-  const char normal_data[] =
-      "{\n"
-      "  \"foo\": 1,\n"
-      "  \"bar\": \"bar\",\n"
-      "  \"baz\": true,\n"
-      "  \"bstruct\": {},\n"
-      "  \"string_values\": [{\"val\": \"value_1\"}, {\"val\": \"value_2\"}],"
-      "  \"simple_enum\": \"foo\","
-      "  \"ints\": [1, 2]"
-      "}\n";
-
-  std::unique_ptr<Value> value = base::JSONReader::Read(normal_data);
-  SimpleMessage message;
-  base::JSONValueConverter<SimpleMessage> converter;
-  EXPECT_TRUE(converter.Convert(*value.get(), &message));
-
-  EXPECT_EQ(1, message.foo);
-  EXPECT_EQ("bar", message.bar);
-  EXPECT_TRUE(message.baz);
-  EXPECT_EQ(SimpleMessage::FOO, message.simple_enum);
-  EXPECT_EQ(2, static_cast<int>(message.ints.size()));
-  ASSERT_EQ(2U, message.string_values.size());
-  EXPECT_EQ("value_1", *message.string_values[0]);
-  EXPECT_EQ("value_2", *message.string_values[1]);
-  EXPECT_EQ(1, *(message.ints[0]));
-  EXPECT_EQ(2, *(message.ints[1]));
-}
-
-TEST(JSONValueConverterTest, ParseNestedMessage) {
-  const char normal_data[] =
-      "{\n"
-      "  \"foo\": 1.0,\n"
-      "  \"child\": {\n"
-      "    \"foo\": 1,\n"
-      "    \"bar\": \"bar\",\n"
-      "    \"bstruct\": {},\n"
-      "    \"string_values\": [{\"val\": \"value_1\"}, {\"val\": \"value_2\"}],"
-      "    \"baz\": true\n"
-      "  },\n"
-      "  \"children\": [{\n"
-      "    \"foo\": 2,\n"
-      "    \"bar\": \"foobar\",\n"
-      "    \"bstruct\": \"\",\n"
-      "    \"string_values\": [{\"val\": \"value_1\"}],"
-      "    \"baz\": true\n"
-      "  },\n"
-      "  {\n"
-      "    \"foo\": 3,\n"
-      "    \"bar\": \"barbaz\",\n"
-      "    \"baz\": false\n"
-      "  }]\n"
-      "}\n";
-
-  std::unique_ptr<Value> value = base::JSONReader::Read(normal_data);
-  NestedMessage message;
-  base::JSONValueConverter<NestedMessage> converter;
-  EXPECT_TRUE(converter.Convert(*value.get(), &message));
-
-  EXPECT_EQ(1.0, message.foo);
-  EXPECT_EQ(1, message.child.foo);
-  EXPECT_EQ("bar", message.child.bar);
-  EXPECT_TRUE(message.child.baz);
-  EXPECT_TRUE(message.child.bstruct);
-  ASSERT_EQ(2U, message.child.string_values.size());
-  EXPECT_EQ("value_1", *message.child.string_values[0]);
-  EXPECT_EQ("value_2", *message.child.string_values[1]);
-
-  EXPECT_EQ(2, static_cast<int>(message.children.size()));
-  const SimpleMessage* first_child = message.children[0].get();
-  ASSERT_TRUE(first_child);
-  EXPECT_EQ(2, first_child->foo);
-  EXPECT_EQ("foobar", first_child->bar);
-  EXPECT_TRUE(first_child->baz);
-  EXPECT_TRUE(first_child->bstruct);
-  ASSERT_EQ(1U, first_child->string_values.size());
-  EXPECT_EQ("value_1", *first_child->string_values[0]);
-
-  const SimpleMessage* second_child = message.children[1].get();
-  ASSERT_TRUE(second_child);
-  EXPECT_EQ(3, second_child->foo);
-  EXPECT_EQ("barbaz", second_child->bar);
-  EXPECT_FALSE(second_child->baz);
-  EXPECT_FALSE(second_child->bstruct);
-  EXPECT_EQ(0U, second_child->string_values.size());
-}
-
-TEST(JSONValueConverterTest, ParseFailures) {
-  const char normal_data[] =
-      "{\n"
-      "  \"foo\": 1,\n"
-      "  \"bar\": 2,\n" // "bar" is an integer here.
-      "  \"baz\": true,\n"
-      "  \"ints\": [1, 2]"
-      "}\n";
-
-  std::unique_ptr<Value> value = base::JSONReader::Read(normal_data);
-  SimpleMessage message;
-  base::JSONValueConverter<SimpleMessage> converter;
-  EXPECT_FALSE(converter.Convert(*value.get(), &message));
-  // Do not check the values below.  |message| may be modified during
-  // Convert() even it fails.
-}
-
-TEST(JSONValueConverterTest, ParseWithMissingFields) {
-  const char normal_data[] =
-      "{\n"
-      "  \"foo\": 1,\n"
-      "  \"baz\": true,\n"
-      "  \"ints\": [1, 2]"
-      "}\n";
-
-  std::unique_ptr<Value> value = base::JSONReader::Read(normal_data);
-  SimpleMessage message;
-  base::JSONValueConverter<SimpleMessage> converter;
-  // Convert() still succeeds even if the input doesn't have "bar" field.
-  EXPECT_TRUE(converter.Convert(*value.get(), &message));
-
-  EXPECT_EQ(1, message.foo);
-  EXPECT_TRUE(message.baz);
-  EXPECT_EQ(2, static_cast<int>(message.ints.size()));
-  EXPECT_EQ(1, *(message.ints[0]));
-  EXPECT_EQ(2, *(message.ints[1]));
-}
-
-TEST(JSONValueConverterTest, EnumParserFails) {
-  const char normal_data[] =
-      "{\n"
-      "  \"foo\": 1,\n"
-      "  \"bar\": \"bar\",\n"
-      "  \"baz\": true,\n"
-      "  \"simple_enum\": \"baz\","
-      "  \"ints\": [1, 2]"
-      "}\n";
-
-  std::unique_ptr<Value> value = base::JSONReader::Read(normal_data);
-  SimpleMessage message;
-  base::JSONValueConverter<SimpleMessage> converter;
-  EXPECT_FALSE(converter.Convert(*value.get(), &message));
-  // No check the values as mentioned above.
-}
-
-TEST(JSONValueConverterTest, RepeatedValueErrorInTheMiddle) {
-  const char normal_data[] =
-      "{\n"
-      "  \"foo\": 1,\n"
-      "  \"bar\": \"bar\",\n"
-      "  \"baz\": true,\n"
-      "  \"simple_enum\": \"baz\","
-      "  \"ints\": [1, false]"
-      "}\n";
-
-  std::unique_ptr<Value> value = base::JSONReader::Read(normal_data);
-  SimpleMessage message;
-  base::JSONValueConverter<SimpleMessage> converter;
-  EXPECT_FALSE(converter.Convert(*value.get(), &message));
-  // No check the values as mentioned above.
-}
-
-}  // namespace base
diff --git a/base/json/json_value_serializer_unittest.cc b/base/json/json_value_serializer_unittest.cc
deleted file mode 100644
index b358dec..0000000
--- a/base/json/json_value_serializer_unittest.cc
+++ /dev/null
@@ -1,487 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <string>
-
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/json/json_file_value_serializer.h"
-#include "base/json/json_reader.h"
-#include "base/json/json_string_value_serializer.h"
-#include "base/json/json_writer.h"
-#include "base/path_service.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/values.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-// Some proper JSON to test with:
-const char kProperJSON[] =
-    "{\n"
-    "   \"compound\": {\n"
-    "      \"a\": 1,\n"
-    "      \"b\": 2\n"
-    "   },\n"
-    "   \"some_String\": \"1337\",\n"
-    "   \"some_int\": 42,\n"
-    "   \"the_list\": [ \"val1\", \"val2\" ]\n"
-    "}\n";
-
-// Some proper JSON with trailing commas:
-const char kProperJSONWithCommas[] =
-    "{\n"
-    "\t\"some_int\": 42,\n"
-    "\t\"some_String\": \"1337\",\n"
-    "\t\"the_list\": [\"val1\", \"val2\", ],\n"
-    "\t\"compound\": { \"a\": 1, \"b\": 2, },\n"
-    "}\n";
-
-// kProperJSON with a few misc characters at the begin and end.
-const char kProperJSONPadded[] =
-    ")]}'\n"
-    "{\n"
-    "   \"compound\": {\n"
-    "      \"a\": 1,\n"
-    "      \"b\": 2\n"
-    "   },\n"
-    "   \"some_String\": \"1337\",\n"
-    "   \"some_int\": 42,\n"
-    "   \"the_list\": [ \"val1\", \"val2\" ]\n"
-    "}\n"
-    "?!ab\n";
-
-const char kWinLineEnds[] = "\r\n";
-const char kLinuxLineEnds[] = "\n";
-
-// Verifies the generated JSON against the expected output.
-void CheckJSONIsStillTheSame(const Value& value) {
-  // Serialize back the output.
-  std::string serialized_json;
-  JSONStringValueSerializer str_serializer(&serialized_json);
-  str_serializer.set_pretty_print(true);
-  ASSERT_TRUE(str_serializer.Serialize(value));
-  // Unify line endings between platforms.
-  ReplaceSubstringsAfterOffset(&serialized_json, 0,
-                               kWinLineEnds, kLinuxLineEnds);
-  // Now compare the input with the output.
-  ASSERT_EQ(kProperJSON, serialized_json);
-}
-
-void ValidateJsonList(const std::string& json) {
-  std::unique_ptr<ListValue> list = ListValue::From(JSONReader::Read(json));
-  ASSERT_TRUE(list);
-  ASSERT_EQ(1U, list->GetSize());
-  Value* elt = nullptr;
-  ASSERT_TRUE(list->Get(0, &elt));
-  int value = 0;
-  ASSERT_TRUE(elt && elt->GetAsInteger(&value));
-  ASSERT_EQ(1, value);
-}
-
-// Test proper JSON deserialization from string is working.
-TEST(JSONValueDeserializerTest, ReadProperJSONFromString) {
-  // Try to deserialize it through the serializer.
-  JSONStringValueDeserializer str_deserializer(kProperJSON);
-
-  int error_code = 0;
-  std::string error_message;
-  std::unique_ptr<Value> value =
-      str_deserializer.Deserialize(&error_code, &error_message);
-  ASSERT_TRUE(value);
-  ASSERT_EQ(0, error_code);
-  ASSERT_TRUE(error_message.empty());
-  // Verify if the same JSON is still there.
-  CheckJSONIsStillTheSame(*value);
-}
-
-// Test proper JSON deserialization from a StringPiece substring.
-TEST(JSONValueDeserializerTest, ReadProperJSONFromStringPiece) {
-  // Create a StringPiece for the substring of kProperJSONPadded that matches
-  // kProperJSON.
-  StringPiece proper_json(kProperJSONPadded);
-  proper_json = proper_json.substr(5, proper_json.length() - 10);
-  JSONStringValueDeserializer str_deserializer(proper_json);
-
-  int error_code = 0;
-  std::string error_message;
-  std::unique_ptr<Value> value =
-      str_deserializer.Deserialize(&error_code, &error_message);
-  ASSERT_TRUE(value);
-  ASSERT_EQ(0, error_code);
-  ASSERT_TRUE(error_message.empty());
-  // Verify if the same JSON is still there.
-  CheckJSONIsStillTheSame(*value);
-}
-
-// Test that trialing commas are only properly deserialized from string when
-// the proper flag for that is set.
-TEST(JSONValueDeserializerTest, ReadJSONWithTrailingCommasFromString) {
-  // Try to deserialize it through the serializer.
-  JSONStringValueDeserializer str_deserializer(kProperJSONWithCommas);
-
-  int error_code = 0;
-  std::string error_message;
-  std::unique_ptr<Value> value =
-      str_deserializer.Deserialize(&error_code, &error_message);
-  ASSERT_FALSE(value);
-  ASSERT_NE(0, error_code);
-  ASSERT_FALSE(error_message.empty());
-  // Repeat with commas allowed.
-  JSONStringValueDeserializer str_deserializer2(kProperJSONWithCommas,
-                                                JSON_ALLOW_TRAILING_COMMAS);
-  value = str_deserializer2.Deserialize(&error_code, &error_message);
-  ASSERT_TRUE(value);
-  ASSERT_EQ(JSONReader::JSON_TRAILING_COMMA, error_code);
-  // Verify if the same JSON is still there.
-  CheckJSONIsStillTheSame(*value);
-}
-
-// Test proper JSON deserialization from file is working.
-TEST(JSONValueDeserializerTest, ReadProperJSONFromFile) {
-  ScopedTempDir tempdir;
-  ASSERT_TRUE(tempdir.CreateUniqueTempDir());
-  // Write it down in the file.
-  FilePath temp_file(tempdir.GetPath().AppendASCII("test.json"));
-  ASSERT_EQ(static_cast<int>(strlen(kProperJSON)),
-            WriteFile(temp_file, kProperJSON, strlen(kProperJSON)));
-
-  // Try to deserialize it through the serializer.
-  JSONFileValueDeserializer file_deserializer(temp_file);
-
-  int error_code = 0;
-  std::string error_message;
-  std::unique_ptr<Value> value =
-      file_deserializer.Deserialize(&error_code, &error_message);
-  ASSERT_TRUE(value);
-  ASSERT_EQ(0, error_code);
-  ASSERT_TRUE(error_message.empty());
-  // Verify if the same JSON is still there.
-  CheckJSONIsStillTheSame(*value);
-}
-
-// Test that trialing commas are only properly deserialized from file when
-// the proper flag for that is set.
-TEST(JSONValueDeserializerTest, ReadJSONWithCommasFromFile) {
-  ScopedTempDir tempdir;
-  ASSERT_TRUE(tempdir.CreateUniqueTempDir());
-  // Write it down in the file.
-  FilePath temp_file(tempdir.GetPath().AppendASCII("test.json"));
-  ASSERT_EQ(static_cast<int>(strlen(kProperJSONWithCommas)),
-            WriteFile(temp_file, kProperJSONWithCommas,
-                      strlen(kProperJSONWithCommas)));
-
-  // Try to deserialize it through the serializer.
-  JSONFileValueDeserializer file_deserializer(temp_file);
-  // This must fail without the proper flag.
-  int error_code = 0;
-  std::string error_message;
-  std::unique_ptr<Value> value =
-      file_deserializer.Deserialize(&error_code, &error_message);
-  ASSERT_FALSE(value);
-  ASSERT_NE(0, error_code);
-  ASSERT_FALSE(error_message.empty());
-  // Repeat with commas allowed.
-  JSONFileValueDeserializer file_deserializer2(temp_file,
-                                               JSON_ALLOW_TRAILING_COMMAS);
-  value = file_deserializer2.Deserialize(&error_code, &error_message);
-  ASSERT_TRUE(value);
-  ASSERT_EQ(JSONReader::JSON_TRAILING_COMMA, error_code);
-  // Verify if the same JSON is still there.
-  CheckJSONIsStillTheSame(*value);
-}
-
-TEST(JSONValueDeserializerTest, AllowTrailingComma) {
-  static const char kTestWithCommas[] = "{\"key\": [true,],}";
-  static const char kTestNoCommas[] = "{\"key\": [true]}";
-
-  JSONStringValueDeserializer deserializer(kTestWithCommas,
-                                           JSON_ALLOW_TRAILING_COMMAS);
-  JSONStringValueDeserializer deserializer_expected(kTestNoCommas);
-  std::unique_ptr<Value> root = deserializer.Deserialize(nullptr, nullptr);
-  ASSERT_TRUE(root);
-  std::unique_ptr<Value> root_expected;
-  root_expected = deserializer_expected.Deserialize(nullptr, nullptr);
-  ASSERT_TRUE(root_expected);
-  ASSERT_TRUE(root->Equals(root_expected.get()));
-}
-
-TEST(JSONValueSerializerTest, Roundtrip) {
-  static const char kOriginalSerialization[] =
-    "{\"bool\":true,\"double\":3.14,\"int\":42,\"list\":[1,2],\"null\":null}";
-  JSONStringValueDeserializer deserializer(kOriginalSerialization);
-  std::unique_ptr<DictionaryValue> root_dict =
-      DictionaryValue::From(deserializer.Deserialize(nullptr, nullptr));
-  ASSERT_TRUE(root_dict);
-
-  Value* null_value = nullptr;
-  ASSERT_TRUE(root_dict->Get("null", &null_value));
-  ASSERT_TRUE(null_value);
-  ASSERT_TRUE(null_value->is_none());
-
-  bool bool_value = false;
-  ASSERT_TRUE(root_dict->GetBoolean("bool", &bool_value));
-  ASSERT_TRUE(bool_value);
-
-  int int_value = 0;
-  ASSERT_TRUE(root_dict->GetInteger("int", &int_value));
-  ASSERT_EQ(42, int_value);
-
-  double double_value = 0.0;
-  ASSERT_TRUE(root_dict->GetDouble("double", &double_value));
-  ASSERT_DOUBLE_EQ(3.14, double_value);
-
-  std::string test_serialization;
-  JSONStringValueSerializer mutable_serializer(&test_serialization);
-  ASSERT_TRUE(mutable_serializer.Serialize(*root_dict));
-  ASSERT_EQ(kOriginalSerialization, test_serialization);
-
-  mutable_serializer.set_pretty_print(true);
-  ASSERT_TRUE(mutable_serializer.Serialize(*root_dict));
-  // JSON output uses a different newline style on Windows than on other
-  // platforms.
-#if defined(OS_WIN)
-#define JSON_NEWLINE "\r\n"
-#else
-#define JSON_NEWLINE "\n"
-#endif
-  const std::string pretty_serialization =
-    "{" JSON_NEWLINE
-    "   \"bool\": true," JSON_NEWLINE
-    "   \"double\": 3.14," JSON_NEWLINE
-    "   \"int\": 42," JSON_NEWLINE
-    "   \"list\": [ 1, 2 ]," JSON_NEWLINE
-    "   \"null\": null" JSON_NEWLINE
-    "}" JSON_NEWLINE;
-#undef JSON_NEWLINE
-  ASSERT_EQ(pretty_serialization, test_serialization);
-}
-
-TEST(JSONValueSerializerTest, StringEscape) {
-  string16 all_chars;
-  for (int i = 1; i < 256; ++i) {
-    all_chars += static_cast<char16>(i);
-  }
-  // Generated in in Firefox using the following js (with an extra backslash for
-  // double quote):
-  // var s = '';
-  // for (var i = 1; i < 256; ++i) { s += String.fromCharCode(i); }
-  // uneval(s).replace(/\\/g, "\\\\");
-  std::string all_chars_expected =
-      "\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000B\\f\\r"
-      "\\u000E\\u000F\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017"
-      "\\u0018\\u0019\\u001A\\u001B\\u001C\\u001D\\u001E\\u001F !\\\"#$%&'()*+,"
-      "-./0123456789:;\\u003C=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcde"
-      "fghijklmnopqrstuvwxyz{|}~\x7F\xC2\x80\xC2\x81\xC2\x82\xC2\x83\xC2\x84"
-      "\xC2\x85\xC2\x86\xC2\x87\xC2\x88\xC2\x89\xC2\x8A\xC2\x8B\xC2\x8C\xC2\x8D"
-      "\xC2\x8E\xC2\x8F\xC2\x90\xC2\x91\xC2\x92\xC2\x93\xC2\x94\xC2\x95\xC2\x96"
-      "\xC2\x97\xC2\x98\xC2\x99\xC2\x9A\xC2\x9B\xC2\x9C\xC2\x9D\xC2\x9E\xC2\x9F"
-      "\xC2\xA0\xC2\xA1\xC2\xA2\xC2\xA3\xC2\xA4\xC2\xA5\xC2\xA6\xC2\xA7\xC2\xA8"
-      "\xC2\xA9\xC2\xAA\xC2\xAB\xC2\xAC\xC2\xAD\xC2\xAE\xC2\xAF\xC2\xB0\xC2\xB1"
-      "\xC2\xB2\xC2\xB3\xC2\xB4\xC2\xB5\xC2\xB6\xC2\xB7\xC2\xB8\xC2\xB9\xC2\xBA"
-      "\xC2\xBB\xC2\xBC\xC2\xBD\xC2\xBE\xC2\xBF\xC3\x80\xC3\x81\xC3\x82\xC3\x83"
-      "\xC3\x84\xC3\x85\xC3\x86\xC3\x87\xC3\x88\xC3\x89\xC3\x8A\xC3\x8B\xC3\x8C"
-      "\xC3\x8D\xC3\x8E\xC3\x8F\xC3\x90\xC3\x91\xC3\x92\xC3\x93\xC3\x94\xC3\x95"
-      "\xC3\x96\xC3\x97\xC3\x98\xC3\x99\xC3\x9A\xC3\x9B\xC3\x9C\xC3\x9D\xC3\x9E"
-      "\xC3\x9F\xC3\xA0\xC3\xA1\xC3\xA2\xC3\xA3\xC3\xA4\xC3\xA5\xC3\xA6\xC3\xA7"
-      "\xC3\xA8\xC3\xA9\xC3\xAA\xC3\xAB\xC3\xAC\xC3\xAD\xC3\xAE\xC3\xAF\xC3\xB0"
-      "\xC3\xB1\xC3\xB2\xC3\xB3\xC3\xB4\xC3\xB5\xC3\xB6\xC3\xB7\xC3\xB8\xC3\xB9"
-      "\xC3\xBA\xC3\xBB\xC3\xBC\xC3\xBD\xC3\xBE\xC3\xBF";
-
-  std::string expected_output = "{\"all_chars\":\"" + all_chars_expected +
-                                 "\"}";
-  // Test JSONWriter interface
-  std::string output_js;
-  DictionaryValue valueRoot;
-  valueRoot.SetString("all_chars", all_chars);
-  JSONWriter::Write(valueRoot, &output_js);
-  ASSERT_EQ(expected_output, output_js);
-
-  // Test JSONValueSerializer interface (uses JSONWriter).
-  JSONStringValueSerializer serializer(&output_js);
-  ASSERT_TRUE(serializer.Serialize(valueRoot));
-  ASSERT_EQ(expected_output, output_js);
-}
-
-TEST(JSONValueSerializerTest, UnicodeStrings) {
-  // unicode string json -> escaped ascii text
-  DictionaryValue root;
-  string16 test(WideToUTF16(L"\x7F51\x9875"));
-  root.SetString("web", test);
-
-  static const char kExpected[] = "{\"web\":\"\xE7\xBD\x91\xE9\xA1\xB5\"}";
-
-  std::string actual;
-  JSONStringValueSerializer serializer(&actual);
-  ASSERT_TRUE(serializer.Serialize(root));
-  ASSERT_EQ(kExpected, actual);
-
-  // escaped ascii text -> json
-  JSONStringValueDeserializer deserializer(kExpected);
-  std::unique_ptr<Value> deserial_root =
-      deserializer.Deserialize(nullptr, nullptr);
-  ASSERT_TRUE(deserial_root);
-  DictionaryValue* dict_root =
-      static_cast<DictionaryValue*>(deserial_root.get());
-  string16 web_value;
-  ASSERT_TRUE(dict_root->GetString("web", &web_value));
-  ASSERT_EQ(test, web_value);
-}
-
-TEST(JSONValueSerializerTest, HexStrings) {
-  // hex string json -> escaped ascii text
-  DictionaryValue root;
-  string16 test(WideToUTF16(L"\x01\x02"));
-  root.SetString("test", test);
-
-  static const char kExpected[] = "{\"test\":\"\\u0001\\u0002\"}";
-
-  std::string actual;
-  JSONStringValueSerializer serializer(&actual);
-  ASSERT_TRUE(serializer.Serialize(root));
-  ASSERT_EQ(kExpected, actual);
-
-  // escaped ascii text -> json
-  JSONStringValueDeserializer deserializer(kExpected);
-  std::unique_ptr<Value> deserial_root =
-      deserializer.Deserialize(nullptr, nullptr);
-  ASSERT_TRUE(deserial_root);
-  DictionaryValue* dict_root =
-      static_cast<DictionaryValue*>(deserial_root.get());
-  string16 test_value;
-  ASSERT_TRUE(dict_root->GetString("test", &test_value));
-  ASSERT_EQ(test, test_value);
-
-  // Test converting escaped regular chars
-  static const char kEscapedChars[] = "{\"test\":\"\\u0067\\u006f\"}";
-  JSONStringValueDeserializer deserializer2(kEscapedChars);
-  deserial_root = deserializer2.Deserialize(nullptr, nullptr);
-  ASSERT_TRUE(deserial_root);
-  dict_root = static_cast<DictionaryValue*>(deserial_root.get());
-  ASSERT_TRUE(dict_root->GetString("test", &test_value));
-  ASSERT_EQ(ASCIIToUTF16("go"), test_value);
-}
-
-TEST(JSONValueSerializerTest, JSONReaderComments) {
-  ValidateJsonList("[ // 2, 3, ignore me ] \n1 ]");
-  ValidateJsonList("[ /* 2, \n3, ignore me ]*/ \n1 ]");
-  ValidateJsonList("//header\n[ // 2, \n// 3, \n1 ]// footer");
-  ValidateJsonList("/*\n[ // 2, \n// 3, \n1 ]*/[1]");
-  ValidateJsonList("[ 1 /* one */ ] /* end */");
-  ValidateJsonList("[ 1 //// ,2\r\n ]");
-
-  // It's ok to have a comment in a string.
-  std::unique_ptr<ListValue> list =
-      ListValue::From(JSONReader::Read("[\"// ok\\n /* foo */ \"]"));
-  ASSERT_TRUE(list);
-  ASSERT_EQ(1U, list->GetSize());
-  Value* elt = nullptr;
-  ASSERT_TRUE(list->Get(0, &elt));
-  std::string value;
-  ASSERT_TRUE(elt && elt->GetAsString(&value));
-  ASSERT_EQ("// ok\n /* foo */ ", value);
-
-  // You can't nest comments.
-  ASSERT_FALSE(JSONReader::Read("/* /* inner */ outer */ [ 1 ]"));
-
-  // Not a open comment token.
-  ASSERT_FALSE(JSONReader::Read("/ * * / [1]"));
-}
-
-class JSONFileValueSerializerTest : public testing::Test {
- protected:
-  void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }
-
-  ScopedTempDir temp_dir_;
-};
-
-TEST_F(JSONFileValueSerializerTest, Roundtrip) {
-  FilePath original_file_path;
-  ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &original_file_path));
-  original_file_path = original_file_path.AppendASCII("serializer_test.json");
-
-  ASSERT_TRUE(PathExists(original_file_path));
-
-  JSONFileValueDeserializer deserializer(original_file_path);
-  std::unique_ptr<DictionaryValue> root_dict =
-      DictionaryValue::From(deserializer.Deserialize(nullptr, nullptr));
-  ASSERT_TRUE(root_dict);
-
-  Value* null_value = nullptr;
-  ASSERT_TRUE(root_dict->Get("null", &null_value));
-  ASSERT_TRUE(null_value);
-  ASSERT_TRUE(null_value->is_none());
-
-  bool bool_value = false;
-  ASSERT_TRUE(root_dict->GetBoolean("bool", &bool_value));
-  ASSERT_TRUE(bool_value);
-
-  int int_value = 0;
-  ASSERT_TRUE(root_dict->GetInteger("int", &int_value));
-  ASSERT_EQ(42, int_value);
-
-  std::string string_value;
-  ASSERT_TRUE(root_dict->GetString("string", &string_value));
-  ASSERT_EQ("hello", string_value);
-
-  // Now try writing.
-  const FilePath written_file_path =
-      temp_dir_.GetPath().AppendASCII("test_output.js");
-
-  ASSERT_FALSE(PathExists(written_file_path));
-  JSONFileValueSerializer serializer(written_file_path);
-  ASSERT_TRUE(serializer.Serialize(*root_dict));
-  ASSERT_TRUE(PathExists(written_file_path));
-
-  // Now compare file contents.
-  EXPECT_TRUE(TextContentsEqual(original_file_path, written_file_path));
-  EXPECT_TRUE(DeleteFile(written_file_path, false));
-}
-
-TEST_F(JSONFileValueSerializerTest, RoundtripNested) {
-  FilePath original_file_path;
-  ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &original_file_path));
-  original_file_path =
-      original_file_path.AppendASCII("serializer_nested_test.json");
-
-  ASSERT_TRUE(PathExists(original_file_path));
-
-  JSONFileValueDeserializer deserializer(original_file_path);
-  std::unique_ptr<Value> root = deserializer.Deserialize(nullptr, nullptr);
-  ASSERT_TRUE(root);
-
-  // Now try writing.
-  FilePath written_file_path =
-      temp_dir_.GetPath().AppendASCII("test_output.json");
-
-  ASSERT_FALSE(PathExists(written_file_path));
-  JSONFileValueSerializer serializer(written_file_path);
-  ASSERT_TRUE(serializer.Serialize(*root));
-  ASSERT_TRUE(PathExists(written_file_path));
-
-  // Now compare file contents.
-  EXPECT_TRUE(TextContentsEqual(original_file_path, written_file_path));
-  EXPECT_TRUE(DeleteFile(written_file_path, false));
-}
-
-TEST_F(JSONFileValueSerializerTest, NoWhitespace) {
-  FilePath source_file_path;
-  ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &source_file_path));
-  source_file_path =
-      source_file_path.AppendASCII("serializer_test_nowhitespace.json");
-  ASSERT_TRUE(PathExists(source_file_path));
-  JSONFileValueDeserializer deserializer(source_file_path);
-  std::unique_ptr<Value> root = deserializer.Deserialize(nullptr, nullptr);
-  ASSERT_TRUE(root);
-}
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/json/json_writer_unittest.cc b/base/json/json_writer_unittest.cc
deleted file mode 100644
index b90c3ea..0000000
--- a/base/json/json_writer_unittest.cc
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/json/json_writer.h"
-
-#include "base/memory/ptr_util.h"
-#include "base/values.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(JSONWriterTest, BasicTypes) {
-  std::string output_js;
-
-  // Test null.
-  EXPECT_TRUE(JSONWriter::Write(Value(), &output_js));
-  EXPECT_EQ("null", output_js);
-
-  // Test empty dict.
-  EXPECT_TRUE(JSONWriter::Write(DictionaryValue(), &output_js));
-  EXPECT_EQ("{}", output_js);
-
-  // Test empty list.
-  EXPECT_TRUE(JSONWriter::Write(ListValue(), &output_js));
-  EXPECT_EQ("[]", output_js);
-
-  // Test integer values.
-  EXPECT_TRUE(JSONWriter::Write(Value(42), &output_js));
-  EXPECT_EQ("42", output_js);
-
-  // Test boolean values.
-  EXPECT_TRUE(JSONWriter::Write(Value(true), &output_js));
-  EXPECT_EQ("true", output_js);
-
-  // Test Real values should always have a decimal or an 'e'.
-  EXPECT_TRUE(JSONWriter::Write(Value(1.0), &output_js));
-  EXPECT_EQ("1.0", output_js);
-
-  // Test Real values in the the range (-1, 1) must have leading zeros
-  EXPECT_TRUE(JSONWriter::Write(Value(0.2), &output_js));
-  EXPECT_EQ("0.2", output_js);
-
-  // Test Real values in the the range (-1, 1) must have leading zeros
-  EXPECT_TRUE(JSONWriter::Write(Value(-0.8), &output_js));
-  EXPECT_EQ("-0.8", output_js);
-
-  // Test String values.
-  EXPECT_TRUE(JSONWriter::Write(Value("foo"), &output_js));
-  EXPECT_EQ("\"foo\"", output_js);
-}
-
-TEST(JSONWriterTest, NestedTypes) {
-  std::string output_js;
-
-  // Writer unittests like empty list/dict nesting,
-  // list list nesting, etc.
-  DictionaryValue root_dict;
-  std::unique_ptr<ListValue> list(new ListValue());
-  std::unique_ptr<DictionaryValue> inner_dict(new DictionaryValue());
-  inner_dict->SetInteger("inner int", 10);
-  list->Append(std::move(inner_dict));
-  list->Append(std::make_unique<ListValue>());
-  list->AppendBoolean(true);
-  root_dict.Set("list", std::move(list));
-
-  // Test the pretty-printer.
-  EXPECT_TRUE(JSONWriter::Write(root_dict, &output_js));
-  EXPECT_EQ("{\"list\":[{\"inner int\":10},[],true]}", output_js);
-  EXPECT_TRUE(JSONWriter::WriteWithOptions(
-      root_dict, JSONWriter::OPTIONS_PRETTY_PRINT, &output_js));
-
-  // The pretty-printer uses a different newline style on Windows than on
-  // other platforms.
-#if defined(OS_WIN)
-#define JSON_NEWLINE "\r\n"
-#else
-#define JSON_NEWLINE "\n"
-#endif
-  EXPECT_EQ("{" JSON_NEWLINE
-            "   \"list\": [ {" JSON_NEWLINE
-            "      \"inner int\": 10" JSON_NEWLINE
-            "   }, [  ], true ]" JSON_NEWLINE
-            "}" JSON_NEWLINE,
-            output_js);
-#undef JSON_NEWLINE
-}
-
-TEST(JSONWriterTest, KeysWithPeriods) {
-  std::string output_js;
-
-  DictionaryValue period_dict;
-  period_dict.SetKey("a.b", base::Value(3));
-  period_dict.SetKey("c", base::Value(2));
-  std::unique_ptr<DictionaryValue> period_dict2(new DictionaryValue());
-  period_dict2->SetKey("g.h.i.j", base::Value(1));
-  period_dict.SetWithoutPathExpansion("d.e.f", std::move(period_dict2));
-  EXPECT_TRUE(JSONWriter::Write(period_dict, &output_js));
-  EXPECT_EQ("{\"a.b\":3,\"c\":2,\"d.e.f\":{\"g.h.i.j\":1}}", output_js);
-
-  DictionaryValue period_dict3;
-  period_dict3.SetInteger("a.b", 2);
-  period_dict3.SetKey("a.b", base::Value(1));
-  EXPECT_TRUE(JSONWriter::Write(period_dict3, &output_js));
-  EXPECT_EQ("{\"a\":{\"b\":2},\"a.b\":1}", output_js);
-}
-
-TEST(JSONWriterTest, BinaryValues) {
-  std::string output_js;
-
-  // Binary values should return errors unless suppressed via the
-  // OPTIONS_OMIT_BINARY_VALUES flag.
-  std::unique_ptr<Value> root(Value::CreateWithCopiedBuffer("asdf", 4));
-  EXPECT_FALSE(JSONWriter::Write(*root, &output_js));
-  EXPECT_TRUE(JSONWriter::WriteWithOptions(
-      *root, JSONWriter::OPTIONS_OMIT_BINARY_VALUES, &output_js));
-  EXPECT_TRUE(output_js.empty());
-
-  ListValue binary_list;
-  binary_list.Append(Value::CreateWithCopiedBuffer("asdf", 4));
-  binary_list.Append(std::make_unique<Value>(5));
-  binary_list.Append(Value::CreateWithCopiedBuffer("asdf", 4));
-  binary_list.Append(std::make_unique<Value>(2));
-  binary_list.Append(Value::CreateWithCopiedBuffer("asdf", 4));
-  EXPECT_FALSE(JSONWriter::Write(binary_list, &output_js));
-  EXPECT_TRUE(JSONWriter::WriteWithOptions(
-      binary_list, JSONWriter::OPTIONS_OMIT_BINARY_VALUES, &output_js));
-  EXPECT_EQ("[5,2]", output_js);
-
-  DictionaryValue binary_dict;
-  binary_dict.Set("a", Value::CreateWithCopiedBuffer("asdf", 4));
-  binary_dict.SetInteger("b", 5);
-  binary_dict.Set("c", Value::CreateWithCopiedBuffer("asdf", 4));
-  binary_dict.SetInteger("d", 2);
-  binary_dict.Set("e", Value::CreateWithCopiedBuffer("asdf", 4));
-  EXPECT_FALSE(JSONWriter::Write(binary_dict, &output_js));
-  EXPECT_TRUE(JSONWriter::WriteWithOptions(
-      binary_dict, JSONWriter::OPTIONS_OMIT_BINARY_VALUES, &output_js));
-  EXPECT_EQ("{\"b\":5,\"d\":2}", output_js);
-}
-
-TEST(JSONWriterTest, DoublesAsInts) {
-  std::string output_js;
-
-  // Test allowing a double with no fractional part to be written as an integer.
-  Value double_value(1e10);
-  EXPECT_TRUE(JSONWriter::WriteWithOptions(
-      double_value, JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION,
-      &output_js));
-  EXPECT_EQ("10000000000", output_js);
-}
-
-}  // namespace base
diff --git a/base/json/string_escape_unittest.cc b/base/json/string_escape_unittest.cc
deleted file mode 100644
index 1e962c6..0000000
--- a/base/json/string_escape_unittest.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/json/string_escape.h"
-
-#include <stddef.h>
-
-#include "base/macros.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(JSONStringEscapeTest, EscapeUTF8) {
-  const struct {
-    const char* to_escape;
-    const char* escaped;
-  } cases[] = {
-      {"\b\001aZ\"\\wee", "\\b\\u0001aZ\\\"\\\\wee"},
-      {"a\b\f\n\r\t\v\1\\.\"z", "a\\b\\f\\n\\r\\t\\u000B\\u0001\\\\.\\\"z"},
-      {"b\x0f\x7f\xf0\xff!",  // \xf0\xff is not a valid UTF-8 unit.
-       "b\\u000F\x7F\xEF\xBF\xBD\xEF\xBF\xBD!"},
-      {"c<>d", "c\\u003C>d"},
-      {"Hello\xe2\x80\xa8world", "Hello\\u2028world"},
-      {"\xe2\x80\xa9purple", "\\u2029purple"},
-      {"\xF3\xBF\xBF\xBF", "\xEF\xBF\xBD"},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    const char* in_ptr = cases[i].to_escape;
-    std::string in_str = in_ptr;
-
-    std::string out;
-    EscapeJSONString(in_ptr, false, &out);
-    EXPECT_EQ(std::string(cases[i].escaped), out);
-    EXPECT_TRUE(IsStringUTF8(out));
-
-    out.erase();
-    bool convert_ok = EscapeJSONString(in_str, false, &out);
-    EXPECT_EQ(std::string(cases[i].escaped), out);
-    EXPECT_TRUE(IsStringUTF8(out));
-
-    if (convert_ok) {
-      std::string fooout = GetQuotedJSONString(in_str);
-      EXPECT_EQ("\"" + std::string(cases[i].escaped) + "\"", fooout);
-      EXPECT_TRUE(IsStringUTF8(out));
-    }
-  }
-
-  std::string in = cases[0].to_escape;
-  std::string out;
-  EscapeJSONString(in, false, &out);
-  EXPECT_TRUE(IsStringUTF8(out));
-
-  // test quoting
-  std::string out_quoted;
-  EscapeJSONString(in, true, &out_quoted);
-  EXPECT_EQ(out.length() + 2, out_quoted.length());
-  EXPECT_EQ(out_quoted.find(out), 1U);
-  EXPECT_TRUE(IsStringUTF8(out_quoted));
-
-  // now try with a NULL in the string
-  std::string null_prepend = "test";
-  null_prepend.push_back(0);
-  in = null_prepend + in;
-  std::string expected = "test\\u0000";
-  expected += cases[0].escaped;
-  out.clear();
-  EscapeJSONString(in, false, &out);
-  EXPECT_EQ(expected, out);
-  EXPECT_TRUE(IsStringUTF8(out));
-}
-
-TEST(JSONStringEscapeTest, EscapeUTF16) {
-  const struct {
-    const wchar_t* to_escape;
-    const char* escaped;
-  } cases[] = {
-    {L"b\uffb1\u00ff", "b\xEF\xBE\xB1\xC3\xBF"},
-    {L"\b\001aZ\"\\wee", "\\b\\u0001aZ\\\"\\\\wee"},
-    {L"a\b\f\n\r\t\v\1\\.\"z",
-        "a\\b\\f\\n\\r\\t\\u000B\\u0001\\\\.\\\"z"},
-    {L"b\x0f\x7f\xf0\xff!", "b\\u000F\x7F\xC3\xB0\xC3\xBF!"},
-    {L"c<>d", "c\\u003C>d"},
-    {L"Hello\u2028world", "Hello\\u2028world"},
-    {L"\u2029purple", "\\u2029purple"},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    string16 in = WideToUTF16(cases[i].to_escape);
-
-    std::string out;
-    EscapeJSONString(in, false, &out);
-    EXPECT_EQ(std::string(cases[i].escaped), out);
-    EXPECT_TRUE(IsStringUTF8(out));
-
-    out = GetQuotedJSONString(in);
-    EXPECT_EQ("\"" + std::string(cases[i].escaped) + "\"", out);
-    EXPECT_TRUE(IsStringUTF8(out));
-  }
-
-  string16 in = WideToUTF16(cases[0].to_escape);
-  std::string out;
-  EscapeJSONString(in, false, &out);
-  EXPECT_TRUE(IsStringUTF8(out));
-
-  // test quoting
-  std::string out_quoted;
-  EscapeJSONString(in, true, &out_quoted);
-  EXPECT_EQ(out.length() + 2, out_quoted.length());
-  EXPECT_EQ(out_quoted.find(out), 1U);
-  EXPECT_TRUE(IsStringUTF8(out));
-
-  // now try with a NULL in the string
-  string16 null_prepend = WideToUTF16(L"test");
-  null_prepend.push_back(0);
-  in = null_prepend + in;
-  std::string expected = "test\\u0000";
-  expected += cases[0].escaped;
-  out.clear();
-  EscapeJSONString(in, false, &out);
-  EXPECT_EQ(expected, out);
-  EXPECT_TRUE(IsStringUTF8(out));
-}
-
-TEST(JSONStringEscapeTest, EscapeUTF16OutsideBMP) {
-  {
-    // {a, U+10300, !}, SMP.
-    string16 test;
-    test.push_back('a');
-    test.push_back(0xD800);
-    test.push_back(0xDF00);
-    test.push_back('!');
-    std::string actual;
-    EXPECT_TRUE(EscapeJSONString(test, false, &actual));
-    EXPECT_EQ("a\xF0\x90\x8C\x80!", actual);
-  }
-  {
-    // {U+20021, U+2002B}, SIP.
-    string16 test;
-    test.push_back(0xD840);
-    test.push_back(0xDC21);
-    test.push_back(0xD840);
-    test.push_back(0xDC2B);
-    std::string actual;
-    EXPECT_TRUE(EscapeJSONString(test, false, &actual));
-    EXPECT_EQ("\xF0\xA0\x80\xA1\xF0\xA0\x80\xAB", actual);
-  }
-  {
-    // {?, U+D800, @}, lone surrogate.
-    string16 test;
-    test.push_back('?');
-    test.push_back(0xD800);
-    test.push_back('@');
-    std::string actual;
-    EXPECT_FALSE(EscapeJSONString(test, false, &actual));
-    EXPECT_EQ("?\xEF\xBF\xBD@", actual);
-  }
-}
-
-TEST(JSONStringEscapeTest, EscapeBytes) {
-  const struct {
-    const char* to_escape;
-    const char* escaped;
-  } cases[] = {
-    {"b\x0f\x7f\xf0\xff!", "b\\u000F\\u007F\\u00F0\\u00FF!"},
-    {"\xe5\xc4\x4f\x05\xb6\xfd", "\\u00E5\\u00C4O\\u0005\\u00B6\\u00FD"},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    std::string in = std::string(cases[i].to_escape);
-    EXPECT_FALSE(IsStringUTF8(in));
-
-    EXPECT_EQ(std::string(cases[i].escaped),
-        EscapeBytesAsInvalidJSONString(in, false));
-    EXPECT_EQ("\"" + std::string(cases[i].escaped) + "\"",
-        EscapeBytesAsInvalidJSONString(in, true));
-  }
-
-  const char kEmbedNull[] = { '\xab', '\x39', '\0', '\x9f', '\xab' };
-  std::string in(kEmbedNull, arraysize(kEmbedNull));
-  EXPECT_FALSE(IsStringUTF8(in));
-  EXPECT_EQ(std::string("\\u00AB9\\u0000\\u009F\\u00AB"),
-            EscapeBytesAsInvalidJSONString(in, false));
-}
-
-}  // namespace base
diff --git a/base/lazy_instance_unittest.cc b/base/lazy_instance_unittest.cc
deleted file mode 100644
index 242e8b5..0000000
--- a/base/lazy_instance_unittest.cc
+++ /dev/null
@@ -1,322 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/at_exit.h"
-#include "base/atomic_sequence_num.h"
-#include "base/atomicops.h"
-#include "base/barrier_closure.h"
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/sys_info.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-base::AtomicSequenceNumber constructed_seq_;
-base::AtomicSequenceNumber destructed_seq_;
-
-class ConstructAndDestructLogger {
- public:
-  ConstructAndDestructLogger() {
-    constructed_seq_.GetNext();
-  }
-  ~ConstructAndDestructLogger() {
-    destructed_seq_.GetNext();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ConstructAndDestructLogger);
-};
-
-class SlowConstructor {
- public:
-  SlowConstructor() : some_int_(0) {
-    // Sleep for 1 second to try to cause a race.
-    base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(1));
-    ++constructed;
-    some_int_ = 12;
-  }
-  int some_int() const { return some_int_; }
-
-  static int constructed;
- private:
-  int some_int_;
-
-  DISALLOW_COPY_AND_ASSIGN(SlowConstructor);
-};
-
-// static
-int SlowConstructor::constructed = 0;
-
-class SlowDelegate : public base::DelegateSimpleThread::Delegate {
- public:
-  explicit SlowDelegate(
-      base::LazyInstance<SlowConstructor>::DestructorAtExit* lazy)
-      : lazy_(lazy) {}
-
-  void Run() override {
-    EXPECT_EQ(12, lazy_->Get().some_int());
-    EXPECT_EQ(12, lazy_->Pointer()->some_int());
-  }
-
- private:
-  base::LazyInstance<SlowConstructor>::DestructorAtExit* lazy_;
-
-  DISALLOW_COPY_AND_ASSIGN(SlowDelegate);
-};
-
-}  // namespace
-
-base::LazyInstance<ConstructAndDestructLogger>::DestructorAtExit lazy_logger =
-    LAZY_INSTANCE_INITIALIZER;
-
-TEST(LazyInstanceTest, Basic) {
-  {
-    base::ShadowingAtExitManager shadow;
-
-    EXPECT_FALSE(lazy_logger.IsCreated());
-    EXPECT_EQ(0, constructed_seq_.GetNext());
-    EXPECT_EQ(0, destructed_seq_.GetNext());
-
-    lazy_logger.Get();
-    EXPECT_TRUE(lazy_logger.IsCreated());
-    EXPECT_EQ(2, constructed_seq_.GetNext());
-    EXPECT_EQ(1, destructed_seq_.GetNext());
-
-    lazy_logger.Pointer();
-    EXPECT_TRUE(lazy_logger.IsCreated());
-    EXPECT_EQ(3, constructed_seq_.GetNext());
-    EXPECT_EQ(2, destructed_seq_.GetNext());
-  }
-  EXPECT_FALSE(lazy_logger.IsCreated());
-  EXPECT_EQ(4, constructed_seq_.GetNext());
-  EXPECT_EQ(4, destructed_seq_.GetNext());
-}
-
-base::LazyInstance<SlowConstructor>::DestructorAtExit lazy_slow =
-    LAZY_INSTANCE_INITIALIZER;
-
-TEST(LazyInstanceTest, ConstructorThreadSafety) {
-  {
-    base::ShadowingAtExitManager shadow;
-
-    SlowDelegate delegate(&lazy_slow);
-    EXPECT_EQ(0, SlowConstructor::constructed);
-
-    base::DelegateSimpleThreadPool pool("lazy_instance_cons", 5);
-    pool.AddWork(&delegate, 20);
-    EXPECT_EQ(0, SlowConstructor::constructed);
-
-    pool.Start();
-    pool.JoinAll();
-    EXPECT_EQ(1, SlowConstructor::constructed);
-  }
-}
-
-namespace {
-
-// DeleteLogger is an object which sets a flag when it's destroyed.
-// It accepts a bool* and sets the bool to true when the dtor runs.
-class DeleteLogger {
- public:
-  DeleteLogger() : deleted_(nullptr) {}
-  ~DeleteLogger() { *deleted_ = true; }
-
-  void SetDeletedPtr(bool* deleted) {
-    deleted_ = deleted;
-  }
-
- private:
-  bool* deleted_;
-};
-
-}  // anonymous namespace
-
-TEST(LazyInstanceTest, LeakyLazyInstance) {
-  // Check that using a plain LazyInstance causes the dtor to run
-  // when the AtExitManager finishes.
-  bool deleted1 = false;
-  {
-    base::ShadowingAtExitManager shadow;
-    static base::LazyInstance<DeleteLogger>::DestructorAtExit test =
-        LAZY_INSTANCE_INITIALIZER;
-    test.Get().SetDeletedPtr(&deleted1);
-  }
-  EXPECT_TRUE(deleted1);
-
-  // Check that using a *leaky* LazyInstance makes the dtor not run
-  // when the AtExitManager finishes.
-  bool deleted2 = false;
-  {
-    base::ShadowingAtExitManager shadow;
-    static base::LazyInstance<DeleteLogger>::Leaky
-        test = LAZY_INSTANCE_INITIALIZER;
-    test.Get().SetDeletedPtr(&deleted2);
-  }
-  EXPECT_FALSE(deleted2);
-}
-
-namespace {
-
-template <size_t alignment>
-class AlignedData {
- public:
-  AlignedData() = default;
-  ~AlignedData() = default;
-  alignas(alignment) char data_[alignment];
-};
-
-}  // namespace
-
-#define EXPECT_ALIGNED(ptr, align) \
-    EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(ptr) & (align - 1))
-
-TEST(LazyInstanceTest, Alignment) {
-  using base::LazyInstance;
-
-  // Create some static instances with increasing sizes and alignment
-  // requirements. By ordering this way, the linker will need to do some work to
-  // ensure proper alignment of the static data.
-  static LazyInstance<AlignedData<4>>::DestructorAtExit align4 =
-      LAZY_INSTANCE_INITIALIZER;
-  static LazyInstance<AlignedData<32>>::DestructorAtExit align32 =
-      LAZY_INSTANCE_INITIALIZER;
-  static LazyInstance<AlignedData<4096>>::DestructorAtExit align4096 =
-      LAZY_INSTANCE_INITIALIZER;
-
-  EXPECT_ALIGNED(align4.Pointer(), 4);
-  EXPECT_ALIGNED(align32.Pointer(), 32);
-  EXPECT_ALIGNED(align4096.Pointer(), 4096);
-}
-
-namespace {
-
-// A class whose constructor busy-loops until it is told to complete
-// construction.
-class BlockingConstructor {
- public:
-  BlockingConstructor() {
-    EXPECT_FALSE(WasConstructorCalled());
-    base::subtle::NoBarrier_Store(&constructor_called_, 1);
-    EXPECT_TRUE(WasConstructorCalled());
-    while (!base::subtle::NoBarrier_Load(&complete_construction_))
-      base::PlatformThread::YieldCurrentThread();
-    done_construction_ = true;
-  }
-
-  ~BlockingConstructor() {
-    // Restore static state for the next test.
-    base::subtle::NoBarrier_Store(&constructor_called_, 0);
-    base::subtle::NoBarrier_Store(&complete_construction_, 0);
-  }
-
-  // Returns true if BlockingConstructor() was entered.
-  static bool WasConstructorCalled() {
-    return base::subtle::NoBarrier_Load(&constructor_called_);
-  }
-
-  // Instructs BlockingConstructor() that it may now unblock its construction.
-  static void CompleteConstructionNow() {
-    base::subtle::NoBarrier_Store(&complete_construction_, 1);
-  }
-
-  bool done_construction() { return done_construction_; }
-
- private:
-  // Use Atomic32 instead of AtomicFlag for them to be trivially initialized.
-  static base::subtle::Atomic32 constructor_called_;
-  static base::subtle::Atomic32 complete_construction_;
-
-  bool done_construction_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(BlockingConstructor);
-};
-
-// A SimpleThread running at |thread_priority| which invokes |before_get|
-// (optional) and then invokes Get() on the LazyInstance it's assigned.
-class BlockingConstructorThread : public base::SimpleThread {
- public:
-  BlockingConstructorThread(
-      base::ThreadPriority thread_priority,
-      base::LazyInstance<BlockingConstructor>::DestructorAtExit* lazy,
-      base::OnceClosure before_get)
-      : SimpleThread("BlockingConstructorThread", Options(thread_priority)),
-        lazy_(lazy),
-        before_get_(std::move(before_get)) {}
-
-  void Run() override {
-    if (before_get_)
-      std::move(before_get_).Run();
-    EXPECT_TRUE(lazy_->Get().done_construction());
-  }
-
- private:
-  base::LazyInstance<BlockingConstructor>::DestructorAtExit* lazy_;
-  base::OnceClosure before_get_;
-
-  DISALLOW_COPY_AND_ASSIGN(BlockingConstructorThread);
-};
-
-// static
-base::subtle::Atomic32 BlockingConstructor::constructor_called_ = 0;
-// static
-base::subtle::Atomic32 BlockingConstructor::complete_construction_ = 0;
-
-base::LazyInstance<BlockingConstructor>::DestructorAtExit lazy_blocking =
-    LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-// Tests that if the thread assigned to construct the LazyInstance runs at
-// background priority : the foreground threads will yield to it enough for it
-// to eventually complete construction.
-// This is a regression test for https://crbug.com/797129.
-TEST(LazyInstanceTest, PriorityInversionAtInitializationResolves) {
-  base::TimeTicks test_begin = base::TimeTicks::Now();
-
-  // Construct BlockingConstructor from a background thread.
-  BlockingConstructorThread background_getter(
-      base::ThreadPriority::BACKGROUND, &lazy_blocking, base::OnceClosure());
-  background_getter.Start();
-
-  while (!BlockingConstructor::WasConstructorCalled())
-    base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
-
-  // Spin 4 foreground thread per core contending to get the already under
-  // construction LazyInstance. When they are all running and poking at it :
-  // allow the background thread to complete its work.
-  const int kNumForegroundThreads = 4 * base::SysInfo::NumberOfProcessors();
-  std::vector<std::unique_ptr<base::SimpleThread>> foreground_threads;
-  base::RepeatingClosure foreground_thread_ready_callback =
-      base::BarrierClosure(
-          kNumForegroundThreads,
-          base::BindOnce(&BlockingConstructor::CompleteConstructionNow));
-  for (int i = 0; i < kNumForegroundThreads; ++i) {
-    foreground_threads.push_back(std::make_unique<BlockingConstructorThread>(
-        base::ThreadPriority::NORMAL, &lazy_blocking,
-        foreground_thread_ready_callback));
-    foreground_threads.back()->Start();
-  }
-
-  // This test will hang if the foreground threads become stuck in
-  // LazyInstance::Get() per the background thread never being scheduled to
-  // complete construction.
-  for (auto& foreground_thread : foreground_threads)
-    foreground_thread->Join();
-  background_getter.Join();
-
-  // Fail if this test takes more than 5 seconds (it takes 5-10 seconds on a
-  // Z840 without r527445 but is expected to be fast (~30ms) with the fix).
-  EXPECT_LT(base::TimeTicks::Now() - test_begin,
-            base::TimeDelta::FromSeconds(5));
-}
diff --git a/base/logging_unittest.cc b/base/logging_unittest.cc
deleted file mode 100644
index 0264012..0000000
--- a/base/logging_unittest.cc
+++ /dev/null
@@ -1,676 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/logging.h"
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-#include "base/test/scoped_feature_list.h"
-#include "build_config.h"
-
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_POSIX)
-#include <signal.h>
-#include <unistd.h>
-#include "base/posix/eintr_wrapper.h"
-#endif  // OS_POSIX
-
-#if defined(OS_LINUX) || defined(OS_ANDROID)
-#include <ucontext.h>
-#endif
-
-#if defined(OS_WIN)
-#include <excpt.h>
-#include <windows.h>
-#endif  // OS_WIN
-
-#if defined(OS_FUCHSIA)
-#include "base/fuchsia/fuchsia_logging.h"
-#endif
-
-namespace logging {
-
-namespace {
-
-using ::testing::Return;
-using ::testing::_;
-
-// Needs to be global since log assert handlers can't maintain state.
-int g_log_sink_call_count = 0;
-
-#if !defined(OFFICIAL_BUILD) || defined(DCHECK_ALWAYS_ON) || !defined(NDEBUG)
-void LogSink(const char* file,
-             int line,
-             const base::StringPiece message,
-             const base::StringPiece stack_trace) {
-  ++g_log_sink_call_count;
-}
-#endif
-
-// Class to make sure any manipulations we do to the min log level are
-// contained (i.e., do not affect other unit tests).
-class LogStateSaver {
- public:
-  LogStateSaver() : old_min_log_level_(GetMinLogLevel()) {}
-
-  ~LogStateSaver() {
-    SetMinLogLevel(old_min_log_level_);
-    g_log_sink_call_count = 0;
-  }
-
- private:
-  int old_min_log_level_;
-
-  DISALLOW_COPY_AND_ASSIGN(LogStateSaver);
-};
-
-class LoggingTest : public testing::Test {
- private:
-  LogStateSaver log_state_saver_;
-};
-
-class MockLogSource {
- public:
-  MOCK_METHOD0(Log, const char*());
-};
-
-class MockLogAssertHandler {
- public:
-  MOCK_METHOD4(
-      HandleLogAssert,
-      void(const char*, int, const base::StringPiece, const base::StringPiece));
-};
-
-TEST_F(LoggingTest, BasicLogging) {
-  MockLogSource mock_log_source;
-  EXPECT_CALL(mock_log_source, Log())
-      .Times(DCHECK_IS_ON() ? 16 : 8)
-      .WillRepeatedly(Return("log message"));
-
-  SetMinLogLevel(LOG_INFO);
-
-  EXPECT_TRUE(LOG_IS_ON(INFO));
-  EXPECT_TRUE((DCHECK_IS_ON() != 0) == DLOG_IS_ON(INFO));
-  EXPECT_TRUE(VLOG_IS_ON(0));
-
-  LOG(INFO) << mock_log_source.Log();
-  LOG_IF(INFO, true) << mock_log_source.Log();
-  PLOG(INFO) << mock_log_source.Log();
-  PLOG_IF(INFO, true) << mock_log_source.Log();
-  VLOG(0) << mock_log_source.Log();
-  VLOG_IF(0, true) << mock_log_source.Log();
-  VPLOG(0) << mock_log_source.Log();
-  VPLOG_IF(0, true) << mock_log_source.Log();
-
-  DLOG(INFO) << mock_log_source.Log();
-  DLOG_IF(INFO, true) << mock_log_source.Log();
-  DPLOG(INFO) << mock_log_source.Log();
-  DPLOG_IF(INFO, true) << mock_log_source.Log();
-  DVLOG(0) << mock_log_source.Log();
-  DVLOG_IF(0, true) << mock_log_source.Log();
-  DVPLOG(0) << mock_log_source.Log();
-  DVPLOG_IF(0, true) << mock_log_source.Log();
-}
-
-TEST_F(LoggingTest, LogIsOn) {
-#if defined(NDEBUG)
-  const bool kDfatalIsFatal = false;
-#else  // defined(NDEBUG)
-  const bool kDfatalIsFatal = true;
-#endif  // defined(NDEBUG)
-
-  SetMinLogLevel(LOG_INFO);
-  EXPECT_TRUE(LOG_IS_ON(INFO));
-  EXPECT_TRUE(LOG_IS_ON(WARNING));
-  EXPECT_TRUE(LOG_IS_ON(ERROR));
-  EXPECT_TRUE(LOG_IS_ON(FATAL));
-  EXPECT_TRUE(LOG_IS_ON(DFATAL));
-
-  SetMinLogLevel(LOG_WARNING);
-  EXPECT_FALSE(LOG_IS_ON(INFO));
-  EXPECT_TRUE(LOG_IS_ON(WARNING));
-  EXPECT_TRUE(LOG_IS_ON(ERROR));
-  EXPECT_TRUE(LOG_IS_ON(FATAL));
-  EXPECT_TRUE(LOG_IS_ON(DFATAL));
-
-  SetMinLogLevel(LOG_ERROR);
-  EXPECT_FALSE(LOG_IS_ON(INFO));
-  EXPECT_FALSE(LOG_IS_ON(WARNING));
-  EXPECT_TRUE(LOG_IS_ON(ERROR));
-  EXPECT_TRUE(LOG_IS_ON(FATAL));
-  EXPECT_TRUE(LOG_IS_ON(DFATAL));
-
-  // LOG_IS_ON(FATAL) should always be true.
-  SetMinLogLevel(LOG_FATAL + 1);
-  EXPECT_FALSE(LOG_IS_ON(INFO));
-  EXPECT_FALSE(LOG_IS_ON(WARNING));
-  EXPECT_FALSE(LOG_IS_ON(ERROR));
-  EXPECT_TRUE(LOG_IS_ON(FATAL));
-  EXPECT_EQ(kDfatalIsFatal, LOG_IS_ON(DFATAL));
-}
-
-TEST_F(LoggingTest, LoggingIsLazyBySeverity) {
-  MockLogSource mock_log_source;
-  EXPECT_CALL(mock_log_source, Log()).Times(0);
-
-  SetMinLogLevel(LOG_WARNING);
-
-  EXPECT_FALSE(LOG_IS_ON(INFO));
-  EXPECT_FALSE(DLOG_IS_ON(INFO));
-  EXPECT_FALSE(VLOG_IS_ON(1));
-
-  LOG(INFO) << mock_log_source.Log();
-  LOG_IF(INFO, false) << mock_log_source.Log();
-  PLOG(INFO) << mock_log_source.Log();
-  PLOG_IF(INFO, false) << mock_log_source.Log();
-  VLOG(1) << mock_log_source.Log();
-  VLOG_IF(1, true) << mock_log_source.Log();
-  VPLOG(1) << mock_log_source.Log();
-  VPLOG_IF(1, true) << mock_log_source.Log();
-
-  DLOG(INFO) << mock_log_source.Log();
-  DLOG_IF(INFO, true) << mock_log_source.Log();
-  DPLOG(INFO) << mock_log_source.Log();
-  DPLOG_IF(INFO, true) << mock_log_source.Log();
-  DVLOG(1) << mock_log_source.Log();
-  DVLOG_IF(1, true) << mock_log_source.Log();
-  DVPLOG(1) << mock_log_source.Log();
-  DVPLOG_IF(1, true) << mock_log_source.Log();
-}
-
-TEST_F(LoggingTest, LoggingIsLazyByDestination) {
-  MockLogSource mock_log_source;
-  MockLogSource mock_log_source_error;
-  EXPECT_CALL(mock_log_source, Log()).Times(0);
-
-  // Severity >= ERROR is always printed to stderr.
-  EXPECT_CALL(mock_log_source_error, Log()).Times(1).
-      WillRepeatedly(Return("log message"));
-
-  LoggingSettings settings;
-  settings.logging_dest = LOG_NONE;
-  InitLogging(settings);
-
-  LOG(INFO) << mock_log_source.Log();
-  LOG(WARNING) << mock_log_source.Log();
-  LOG(ERROR) << mock_log_source_error.Log();
-}
-
-// Official builds have CHECKs directly call BreakDebugger.
-#if !defined(OFFICIAL_BUILD)
-
-// https://crbug.com/709067 tracks test flakiness on iOS.
-#if defined(OS_IOS)
-#define MAYBE_CheckStreamsAreLazy DISABLED_CheckStreamsAreLazy
-#else
-#define MAYBE_CheckStreamsAreLazy CheckStreamsAreLazy
-#endif
-TEST_F(LoggingTest, MAYBE_CheckStreamsAreLazy) {
-  MockLogSource mock_log_source, uncalled_mock_log_source;
-  EXPECT_CALL(mock_log_source, Log()).Times(8).
-      WillRepeatedly(Return("check message"));
-  EXPECT_CALL(uncalled_mock_log_source, Log()).Times(0);
-
-  ScopedLogAssertHandler scoped_assert_handler(base::Bind(LogSink));
-
-  CHECK(mock_log_source.Log()) << uncalled_mock_log_source.Log();
-  PCHECK(!mock_log_source.Log()) << mock_log_source.Log();
-  CHECK_EQ(mock_log_source.Log(), mock_log_source.Log())
-      << uncalled_mock_log_source.Log();
-  CHECK_NE(mock_log_source.Log(), mock_log_source.Log())
-      << mock_log_source.Log();
-}
-
-#endif
-
-#if defined(OFFICIAL_BUILD) && defined(OS_WIN)
-NOINLINE void CheckContainingFunc(int death_location) {
-  CHECK(death_location != 1);
-  CHECK(death_location != 2);
-  CHECK(death_location != 3);
-}
-
-int GetCheckExceptionData(EXCEPTION_POINTERS* p, DWORD* code, void** addr) {
-  *code = p->ExceptionRecord->ExceptionCode;
-  *addr = p->ExceptionRecord->ExceptionAddress;
-  return EXCEPTION_EXECUTE_HANDLER;
-}
-
-TEST_F(LoggingTest, CheckCausesDistinctBreakpoints) {
-  DWORD code1 = 0;
-  DWORD code2 = 0;
-  DWORD code3 = 0;
-  void* addr1 = nullptr;
-  void* addr2 = nullptr;
-  void* addr3 = nullptr;
-
-  // Record the exception code and addresses.
-  __try {
-    CheckContainingFunc(1);
-  } __except (
-      GetCheckExceptionData(GetExceptionInformation(), &code1, &addr1)) {
-  }
-
-  __try {
-    CheckContainingFunc(2);
-  } __except (
-      GetCheckExceptionData(GetExceptionInformation(), &code2, &addr2)) {
-  }
-
-  __try {
-    CheckContainingFunc(3);
-  } __except (
-      GetCheckExceptionData(GetExceptionInformation(), &code3, &addr3)) {
-  }
-
-  // Ensure that the exception codes are correct (in particular, breakpoints,
-  // not access violations).
-  EXPECT_EQ(STATUS_BREAKPOINT, code1);
-  EXPECT_EQ(STATUS_BREAKPOINT, code2);
-  EXPECT_EQ(STATUS_BREAKPOINT, code3);
-
-  // Ensure that none of the CHECKs are colocated.
-  EXPECT_NE(addr1, addr2);
-  EXPECT_NE(addr1, addr3);
-  EXPECT_NE(addr2, addr3);
-}
-
-#elif defined(OS_POSIX) && !defined(OS_NACL) && !defined(OS_IOS) && \
-    !defined(OS_FUCHSIA) &&                                         \
-    (defined(ARCH_CPU_X86_FAMILY) || defined(ARCH_CPU_ARM_FAMILY))
-
-int g_child_crash_pipe;
-
-void CheckCrashTestSighandler(int, siginfo_t* info, void* context_ptr) {
-  // Conversely to what clearly stated in "man 2 sigaction", some Linux kernels
-  // do NOT populate the |info->si_addr| in the case of a SIGTRAP. Hence we
-  // need the arch-specific boilerplate below, which is inspired by breakpad.
-  // At the same time, on OSX, ucontext.h is deprecated but si_addr works fine.
-  uintptr_t crash_addr = 0;
-#if defined(OS_MACOSX)
-  crash_addr = reinterpret_cast<uintptr_t>(info->si_addr);
-#else  // OS_POSIX && !OS_MACOSX
-  ucontext_t* context = reinterpret_cast<ucontext_t*>(context_ptr);
-#if defined(ARCH_CPU_X86)
-  crash_addr = static_cast<uintptr_t>(context->uc_mcontext.gregs[REG_EIP]);
-#elif defined(ARCH_CPU_X86_64)
-  crash_addr = static_cast<uintptr_t>(context->uc_mcontext.gregs[REG_RIP]);
-#elif defined(ARCH_CPU_ARMEL)
-  crash_addr = static_cast<uintptr_t>(context->uc_mcontext.arm_pc);
-#elif defined(ARCH_CPU_ARM64)
-  crash_addr = static_cast<uintptr_t>(context->uc_mcontext.pc);
-#endif  // ARCH_*
-#endif  // OS_POSIX && !OS_MACOSX
-  HANDLE_EINTR(write(g_child_crash_pipe, &crash_addr, sizeof(uintptr_t)));
-  _exit(0);
-}
-
-// CHECK causes a direct crash (without jumping to another function) only in
-// official builds. Unfortunately, continuous test coverage on official builds
-// is lower. DO_CHECK here falls back on a home-brewed implementation in
-// non-official builds, to catch regressions earlier in the CQ.
-#if defined(OFFICIAL_BUILD)
-#define DO_CHECK CHECK
-#else
-#define DO_CHECK(cond) \
-  if (!(cond))         \
-  IMMEDIATE_CRASH()
-#endif
-
-void CrashChildMain(int death_location) {
-  struct sigaction act = {};
-  act.sa_sigaction = CheckCrashTestSighandler;
-  act.sa_flags = SA_SIGINFO;
-  ASSERT_EQ(0, sigaction(SIGTRAP, &act, nullptr));
-  ASSERT_EQ(0, sigaction(SIGBUS, &act, nullptr));
-  ASSERT_EQ(0, sigaction(SIGILL, &act, nullptr));
-  DO_CHECK(death_location != 1);
-  DO_CHECK(death_location != 2);
-  printf("\n");
-  DO_CHECK(death_location != 3);
-
-  // Should never reach this point.
-  const uintptr_t failed = 0;
-  HANDLE_EINTR(write(g_child_crash_pipe, &failed, sizeof(uintptr_t)));
-};
-
-void SpawnChildAndCrash(int death_location, uintptr_t* child_crash_addr) {
-  int pipefd[2];
-  ASSERT_EQ(0, pipe(pipefd));
-
-  int pid = fork();
-  ASSERT_GE(pid, 0);
-
-  if (pid == 0) {      // child process.
-    close(pipefd[0]);  // Close reader (parent) end.
-    g_child_crash_pipe = pipefd[1];
-    CrashChildMain(death_location);
-    FAIL() << "The child process was supposed to crash. It didn't.";
-  }
-
-  close(pipefd[1]);  // Close writer (child) end.
-  DCHECK(child_crash_addr);
-  int res = HANDLE_EINTR(read(pipefd[0], child_crash_addr, sizeof(uintptr_t)));
-  ASSERT_EQ(static_cast<int>(sizeof(uintptr_t)), res);
-}
-
-TEST_F(LoggingTest, CheckCausesDistinctBreakpoints) {
-  uintptr_t child_crash_addr_1 = 0;
-  uintptr_t child_crash_addr_2 = 0;
-  uintptr_t child_crash_addr_3 = 0;
-
-  SpawnChildAndCrash(1, &child_crash_addr_1);
-  SpawnChildAndCrash(2, &child_crash_addr_2);
-  SpawnChildAndCrash(3, &child_crash_addr_3);
-
-  ASSERT_NE(0u, child_crash_addr_1);
-  ASSERT_NE(0u, child_crash_addr_2);
-  ASSERT_NE(0u, child_crash_addr_3);
-  ASSERT_NE(child_crash_addr_1, child_crash_addr_2);
-  ASSERT_NE(child_crash_addr_1, child_crash_addr_3);
-  ASSERT_NE(child_crash_addr_2, child_crash_addr_3);
-}
-#endif  // OS_POSIX
-
-TEST_F(LoggingTest, DebugLoggingReleaseBehavior) {
-#if DCHECK_IS_ON()
-  int debug_only_variable = 1;
-#endif
-  // These should avoid emitting references to |debug_only_variable|
-  // in release mode.
-  DLOG_IF(INFO, debug_only_variable) << "test";
-  DLOG_ASSERT(debug_only_variable) << "test";
-  DPLOG_IF(INFO, debug_only_variable) << "test";
-  DVLOG_IF(1, debug_only_variable) << "test";
-}
-
-TEST_F(LoggingTest, DcheckStreamsAreLazy) {
-  MockLogSource mock_log_source;
-  EXPECT_CALL(mock_log_source, Log()).Times(0);
-#if DCHECK_IS_ON()
-  DCHECK(true) << mock_log_source.Log();
-  DCHECK_EQ(0, 0) << mock_log_source.Log();
-#else
-  DCHECK(mock_log_source.Log()) << mock_log_source.Log();
-  DPCHECK(mock_log_source.Log()) << mock_log_source.Log();
-  DCHECK_EQ(0, 0) << mock_log_source.Log();
-  DCHECK_EQ(mock_log_source.Log(), static_cast<const char*>(nullptr))
-      << mock_log_source.Log();
-#endif
-}
-
-void DcheckEmptyFunction1() {
-  // Provide a body so that Release builds do not cause the compiler to
-  // optimize DcheckEmptyFunction1 and DcheckEmptyFunction2 as a single
-  // function, which breaks the Dcheck tests below.
-  LOG(INFO) << "DcheckEmptyFunction1";
-}
-void DcheckEmptyFunction2() {}
-
-#if DCHECK_IS_CONFIGURABLE
-class ScopedDcheckSeverity {
- public:
-  ScopedDcheckSeverity(LogSeverity new_severity) : old_severity_(LOG_DCHECK) {
-    LOG_DCHECK = new_severity;
-  }
-
-  ~ScopedDcheckSeverity() { LOG_DCHECK = old_severity_; }
-
- private:
-  LogSeverity old_severity_;
-};
-#endif  // DCHECK_IS_CONFIGURABLE
-
-// https://crbug.com/709067 tracks test flakiness on iOS.
-#if defined(OS_IOS)
-#define MAYBE_Dcheck DISABLED_Dcheck
-#else
-#define MAYBE_Dcheck Dcheck
-#endif
-TEST_F(LoggingTest, MAYBE_Dcheck) {
-#if DCHECK_IS_CONFIGURABLE
-  // DCHECKs are enabled, and LOG_DCHECK is mutable, but defaults to non-fatal.
-  // Set it to LOG_FATAL to get the expected behavior from the rest of this
-  // test.
-  ScopedDcheckSeverity dcheck_severity(LOG_FATAL);
-#endif  // DCHECK_IS_CONFIGURABLE
-
-#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
-  // Release build.
-  EXPECT_FALSE(DCHECK_IS_ON());
-  EXPECT_FALSE(DLOG_IS_ON(DCHECK));
-#elif defined(NDEBUG) && defined(DCHECK_ALWAYS_ON)
-  // Release build with real DCHECKS.
-  ScopedLogAssertHandler scoped_assert_handler(base::Bind(LogSink));
-  EXPECT_TRUE(DCHECK_IS_ON());
-  EXPECT_TRUE(DLOG_IS_ON(DCHECK));
-#else
-  // Debug build.
-  ScopedLogAssertHandler scoped_assert_handler(base::Bind(LogSink));
-  EXPECT_TRUE(DCHECK_IS_ON());
-  EXPECT_TRUE(DLOG_IS_ON(DCHECK));
-#endif
-
-  // DCHECKs are fatal iff they're compiled in DCHECK_IS_ON() and the DCHECK
-  // log level is set to fatal.
-  const bool dchecks_are_fatal = DCHECK_IS_ON() && LOG_DCHECK == LOG_FATAL;
-  EXPECT_EQ(0, g_log_sink_call_count);
-  DCHECK(false);
-  EXPECT_EQ(dchecks_are_fatal ? 1 : 0, g_log_sink_call_count);
-  DPCHECK(false);
-  EXPECT_EQ(dchecks_are_fatal ? 2 : 0, g_log_sink_call_count);
-  DCHECK_EQ(0, 1);
-  EXPECT_EQ(dchecks_are_fatal ? 3 : 0, g_log_sink_call_count);
-
-  // Test DCHECK on std::nullptr_t
-  g_log_sink_call_count = 0;
-  const void* p_null = nullptr;
-  const void* p_not_null = &p_null;
-  DCHECK_EQ(p_null, nullptr);
-  DCHECK_EQ(nullptr, p_null);
-  DCHECK_NE(p_not_null, nullptr);
-  DCHECK_NE(nullptr, p_not_null);
-  EXPECT_EQ(0, g_log_sink_call_count);
-
-  // Test DCHECK on a scoped enum.
-  enum class Animal { DOG, CAT };
-  DCHECK_EQ(Animal::DOG, Animal::DOG);
-  EXPECT_EQ(0, g_log_sink_call_count);
-  DCHECK_EQ(Animal::DOG, Animal::CAT);
-  EXPECT_EQ(dchecks_are_fatal ? 1 : 0, g_log_sink_call_count);
-
-  // Test DCHECK on functions and function pointers.
-  g_log_sink_call_count = 0;
-  struct MemberFunctions {
-    void MemberFunction1() {
-      // See the comment in DcheckEmptyFunction1().
-      LOG(INFO) << "Do not merge with MemberFunction2.";
-    }
-    void MemberFunction2() {}
-  };
-  void (MemberFunctions::*mp1)() = &MemberFunctions::MemberFunction1;
-  void (MemberFunctions::*mp2)() = &MemberFunctions::MemberFunction2;
-  void (*fp1)() = DcheckEmptyFunction1;
-  void (*fp2)() = DcheckEmptyFunction2;
-  void (*fp3)() = DcheckEmptyFunction1;
-  DCHECK_EQ(fp1, fp3);
-  EXPECT_EQ(0, g_log_sink_call_count);
-  DCHECK_EQ(mp1, &MemberFunctions::MemberFunction1);
-  EXPECT_EQ(0, g_log_sink_call_count);
-  DCHECK_EQ(mp2, &MemberFunctions::MemberFunction2);
-  EXPECT_EQ(0, g_log_sink_call_count);
-  DCHECK_EQ(fp1, fp2);
-  EXPECT_EQ(dchecks_are_fatal ? 1 : 0, g_log_sink_call_count);
-  DCHECK_EQ(mp2, &MemberFunctions::MemberFunction1);
-  EXPECT_EQ(dchecks_are_fatal ? 2 : 0, g_log_sink_call_count);
-}
-
-TEST_F(LoggingTest, DcheckReleaseBehavior) {
-  int some_variable = 1;
-  // These should still reference |some_variable| so we don't get
-  // unused variable warnings.
-  DCHECK(some_variable) << "test";
-  DPCHECK(some_variable) << "test";
-  DCHECK_EQ(some_variable, 1) << "test";
-}
-
-TEST_F(LoggingTest, DCheckEqStatements) {
-  bool reached = false;
-  if (false)
-    DCHECK_EQ(false, true);           // Unreached.
-  else
-    DCHECK_EQ(true, reached = true);  // Reached, passed.
-  ASSERT_EQ(DCHECK_IS_ON() ? true : false, reached);
-
-  if (false)
-    DCHECK_EQ(false, true);           // Unreached.
-}
-
-TEST_F(LoggingTest, CheckEqStatements) {
-  bool reached = false;
-  if (false)
-    CHECK_EQ(false, true);           // Unreached.
-  else
-    CHECK_EQ(true, reached = true);  // Reached, passed.
-  ASSERT_TRUE(reached);
-
-  if (false)
-    CHECK_EQ(false, true);           // Unreached.
-}
-
-TEST_F(LoggingTest, NestedLogAssertHandlers) {
-  ::testing::InSequence dummy;
-  ::testing::StrictMock<MockLogAssertHandler> handler_a, handler_b;
-
-  EXPECT_CALL(
-      handler_a,
-      HandleLogAssert(
-          _, _, base::StringPiece("First assert must be caught by handler_a"),
-          _));
-  EXPECT_CALL(
-      handler_b,
-      HandleLogAssert(
-          _, _, base::StringPiece("Second assert must be caught by handler_b"),
-          _));
-  EXPECT_CALL(
-      handler_a,
-      HandleLogAssert(
-          _, _,
-          base::StringPiece("Last assert must be caught by handler_a again"),
-          _));
-
-  logging::ScopedLogAssertHandler scoped_handler_a(base::Bind(
-      &MockLogAssertHandler::HandleLogAssert, base::Unretained(&handler_a)));
-
-  // Using LOG(FATAL) rather than CHECK(false) here since log messages aren't
-  // preserved for CHECKs in official builds.
-  LOG(FATAL) << "First assert must be caught by handler_a";
-
-  {
-    logging::ScopedLogAssertHandler scoped_handler_b(base::Bind(
-        &MockLogAssertHandler::HandleLogAssert, base::Unretained(&handler_b)));
-    LOG(FATAL) << "Second assert must be caught by handler_b";
-  }
-
-  LOG(FATAL) << "Last assert must be caught by handler_a again";
-}
-
-// Test that defining an operator<< for a type in a namespace doesn't prevent
-// other code in that namespace from calling the operator<<(ostream, wstring)
-// defined by logging.h. This can fail if operator<<(ostream, wstring) can't be
-// found by ADL, since defining another operator<< prevents name lookup from
-// looking in the global namespace.
-namespace nested_test {
-  class Streamable {};
-  ALLOW_UNUSED_TYPE std::ostream& operator<<(std::ostream& out,
-                                             const Streamable&) {
-    return out << "Streamable";
-  }
-  TEST_F(LoggingTest, StreamingWstringFindsCorrectOperator) {
-    std::wstring wstr = L"Hello World";
-    std::ostringstream ostr;
-    ostr << wstr;
-    EXPECT_EQ("Hello World", ostr.str());
-  }
-}  // namespace nested_test
-
-#if DCHECK_IS_CONFIGURABLE
-TEST_F(LoggingTest, ConfigurableDCheck) {
-  // Verify that DCHECKs default to non-fatal in configurable-DCHECK builds.
-  // Note that we require only that DCHECK is non-fatal by default, rather
-  // than requiring that it be exactly INFO, ERROR, etc level.
-  EXPECT_LT(LOG_DCHECK, LOG_FATAL);
-  DCHECK(false);
-
-  // Verify that DCHECK* aren't hard-wired to crash on failure.
-  LOG_DCHECK = LOG_INFO;
-  DCHECK(false);
-  DCHECK_EQ(1, 2);
-
-  // Verify that DCHECK does crash if LOG_DCHECK is set to LOG_FATAL.
-  LOG_DCHECK = LOG_FATAL;
-
-  ::testing::StrictMock<MockLogAssertHandler> handler;
-  EXPECT_CALL(handler, HandleLogAssert(_, _, _, _)).Times(2);
-  {
-    logging::ScopedLogAssertHandler scoped_handler_b(base::Bind(
-        &MockLogAssertHandler::HandleLogAssert, base::Unretained(&handler)));
-    DCHECK(false);
-    DCHECK_EQ(1, 2);
-  }
-}
-
-TEST_F(LoggingTest, ConfigurableDCheckFeature) {
-  // Initialize FeatureList with and without DcheckIsFatal, and verify the
-  // value of LOG_DCHECK. Note that we don't require that DCHECK take a
-  // specific value when the feature is off, only that it is non-fatal.
-
-  {
-    base::test::ScopedFeatureList feature_list;
-    feature_list.InitFromCommandLine("DcheckIsFatal", "");
-    EXPECT_EQ(LOG_DCHECK, LOG_FATAL);
-  }
-
-  {
-    base::test::ScopedFeatureList feature_list;
-    feature_list.InitFromCommandLine("", "DcheckIsFatal");
-    EXPECT_LT(LOG_DCHECK, LOG_FATAL);
-  }
-
-  // The default case is last, so we leave LOG_DCHECK in the default state.
-  {
-    base::test::ScopedFeatureList feature_list;
-    feature_list.InitFromCommandLine("", "");
-    EXPECT_LT(LOG_DCHECK, LOG_FATAL);
-  }
-}
-#endif  // DCHECK_IS_CONFIGURABLE
-
-#if defined(OS_FUCHSIA)
-TEST_F(LoggingTest, FuchsiaLogging) {
-  MockLogSource mock_log_source;
-  EXPECT_CALL(mock_log_source, Log())
-      .Times(DCHECK_IS_ON() ? 2 : 1)
-      .WillRepeatedly(Return("log message"));
-
-  SetMinLogLevel(LOG_INFO);
-
-  EXPECT_TRUE(LOG_IS_ON(INFO));
-  EXPECT_TRUE((DCHECK_IS_ON() != 0) == DLOG_IS_ON(INFO));
-
-  ZX_LOG(INFO, ZX_ERR_INTERNAL) << mock_log_source.Log();
-  ZX_DLOG(INFO, ZX_ERR_INTERNAL) << mock_log_source.Log();
-
-  ZX_CHECK(true, ZX_ERR_INTERNAL);
-  ZX_DCHECK(true, ZX_ERR_INTERNAL);
-}
-#endif  // defined(OS_FUCHSIA)
-
-}  // namespace
-
-}  // namespace logging
diff --git a/base/mac/dispatch_source_mach_unittest.cc b/base/mac/dispatch_source_mach_unittest.cc
deleted file mode 100644
index 738a137..0000000
--- a/base/mac/dispatch_source_mach_unittest.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/mac/dispatch_source_mach.h"
-
-#include <mach/mach.h>
-
-#include <memory>
-
-#include "base/logging.h"
-#include "base/mac/scoped_mach_port.h"
-#include "base/test/test_timeouts.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-class DispatchSourceMachTest : public testing::Test {
- public:
-  void SetUp() override {
-    mach_port_t port = MACH_PORT_NULL;
-    ASSERT_EQ(KERN_SUCCESS, mach_port_allocate(mach_task_self(),
-        MACH_PORT_RIGHT_RECEIVE, &port));
-    receive_right_.reset(port);
-
-    ASSERT_EQ(KERN_SUCCESS, mach_port_insert_right(mach_task_self(), port,
-        port, MACH_MSG_TYPE_MAKE_SEND));
-    send_right_.reset(port);
-  }
-
-  mach_port_t GetPort() { return receive_right_.get(); }
-
-  void WaitForSemaphore(dispatch_semaphore_t semaphore) {
-    dispatch_semaphore_wait(semaphore, dispatch_time(
-        DISPATCH_TIME_NOW,
-        TestTimeouts::action_timeout().InSeconds() * NSEC_PER_SEC));
-  }
-
- private:
-  base::mac::ScopedMachReceiveRight receive_right_;
-  base::mac::ScopedMachSendRight send_right_;
-};
-
-TEST_F(DispatchSourceMachTest, ReceiveAfterResume) {
-  dispatch_semaphore_t signal = dispatch_semaphore_create(0);
-  mach_port_t port = GetPort();
-
-  bool __block did_receive = false;
-  DispatchSourceMach source("org.chromium.base.test.ReceiveAfterResume",
-      port, ^{
-          mach_msg_empty_rcv_t msg = {{0}};
-          msg.header.msgh_size = sizeof(msg);
-          msg.header.msgh_local_port = port;
-          mach_msg_receive(&msg.header);
-          did_receive = true;
-
-          dispatch_semaphore_signal(signal);
-      });
-
-  mach_msg_empty_send_t msg = {{0}};
-  msg.header.msgh_size = sizeof(msg);
-  msg.header.msgh_remote_port = port;
-  msg.header.msgh_bits = MACH_MSGH_BITS_REMOTE(MACH_MSG_TYPE_COPY_SEND);
-  ASSERT_EQ(KERN_SUCCESS, mach_msg_send(&msg.header));
-
-  EXPECT_FALSE(did_receive);
-
-  source.Resume();
-
-  WaitForSemaphore(signal);
-  dispatch_release(signal);
-
-  EXPECT_TRUE(did_receive);
-}
-
-TEST_F(DispatchSourceMachTest, NoMessagesAfterDestruction) {
-  mach_port_t port = GetPort();
-
-  std::unique_ptr<int> count(new int(0));
-  int* __block count_ptr = count.get();
-
-  std::unique_ptr<DispatchSourceMach> source(new DispatchSourceMach(
-      "org.chromium.base.test.NoMessagesAfterDestruction", port, ^{
-        mach_msg_empty_rcv_t msg = {{0}};
-        msg.header.msgh_size = sizeof(msg);
-        msg.header.msgh_local_port = port;
-        mach_msg_receive(&msg.header);
-        LOG(INFO) << "Receieve " << *count_ptr;
-        ++(*count_ptr);
-      }));
-  source->Resume();
-
-  dispatch_queue_t queue =
-      dispatch_queue_create("org.chromium.base.test.MessageSend", NULL);
-  dispatch_semaphore_t signal = dispatch_semaphore_create(0);
-  for (int i = 0; i < 30; ++i) {
-    dispatch_async(queue, ^{
-        mach_msg_empty_send_t msg = {{0}};
-        msg.header.msgh_size = sizeof(msg);
-        msg.header.msgh_remote_port = port;
-        msg.header.msgh_bits =
-            MACH_MSGH_BITS_REMOTE(MACH_MSG_TYPE_COPY_SEND);
-        mach_msg_send(&msg.header);
-    });
-
-    // After sending five messages, shut down the source and taint the
-    // pointer the handler dereferences. The test will crash if |count_ptr|
-    // is being used after "free".
-    if (i == 5) {
-      std::unique_ptr<DispatchSourceMach>* source_ptr = &source;
-      dispatch_async(queue, ^{
-          source_ptr->reset();
-          count_ptr = reinterpret_cast<int*>(0xdeaddead);
-          dispatch_semaphore_signal(signal);
-      });
-    }
-  }
-
-  WaitForSemaphore(signal);
-  dispatch_release(signal);
-
-  dispatch_release(queue);
-}
-
-}  // namespace base
diff --git a/base/mac/mach_port_broker_unittest.cc b/base/mac/mach_port_broker_unittest.cc
deleted file mode 100644
index bff8eb6..0000000
--- a/base/mac/mach_port_broker_unittest.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/mac/mach_port_broker.h"
-
-#include "base/command_line.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_timeouts.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-
-namespace base {
-
-namespace {
-const char kBootstrapPortName[] = "thisisatest";
-}
-
-class MachPortBrokerTest : public testing::Test,
-                           public base::PortProvider::Observer {
- public:
-  MachPortBrokerTest()
-      : broker_(kBootstrapPortName),
-        event_(base::WaitableEvent::ResetPolicy::MANUAL,
-               base::WaitableEvent::InitialState::NOT_SIGNALED),
-        received_process_(kNullProcessHandle) {
-    broker_.AddObserver(this);
-  }
-  ~MachPortBrokerTest() override {
-    broker_.RemoveObserver(this);
-  }
-
-  // Helper function to acquire/release locks and call |PlaceholderForPid()|.
-  void AddPlaceholderForPid(base::ProcessHandle pid) {
-    base::AutoLock lock(broker_.GetLock());
-    broker_.AddPlaceholderForPid(pid);
-  }
-
-  // Helper function to acquire/release locks and call |FinalizePid()|.
-  void FinalizePid(base::ProcessHandle pid,
-                   mach_port_t task_port) {
-    base::AutoLock lock(broker_.GetLock());
-    broker_.FinalizePid(pid, task_port);
-  }
-
-  void WaitForTaskPort() {
-    event_.Wait();
-  }
-
-  // base::PortProvider::Observer:
-  void OnReceivedTaskPort(ProcessHandle process) override {
-    received_process_ = process;
-    event_.Signal();
-  }
-
- protected:
-  MachPortBroker broker_;
-  WaitableEvent event_;
-  ProcessHandle received_process_;
-};
-
-TEST_F(MachPortBrokerTest, Locks) {
-  // Acquire and release the locks.  Nothing bad should happen.
-  base::AutoLock lock(broker_.GetLock());
-}
-
-TEST_F(MachPortBrokerTest, AddPlaceholderAndFinalize) {
-  // Add a placeholder for PID 1.
-  AddPlaceholderForPid(1);
-  EXPECT_EQ(0u, broker_.TaskForPid(1));
-
-  // Finalize PID 1.
-  FinalizePid(1, 100u);
-  EXPECT_EQ(100u, broker_.TaskForPid(1));
-
-  // Should be no entry for PID 2.
-  EXPECT_EQ(0u, broker_.TaskForPid(2));
-}
-
-TEST_F(MachPortBrokerTest, FinalizeUnknownPid) {
-  // Finalizing an entry for an unknown pid should not add it to the map.
-  FinalizePid(1u, 100u);
-  EXPECT_EQ(0u, broker_.TaskForPid(1u));
-}
-
-MULTIPROCESS_TEST_MAIN(MachPortBrokerTestChild) {
-  CHECK(base::MachPortBroker::ChildSendTaskPortToParent(kBootstrapPortName));
-  return 0;
-}
-
-TEST_F(MachPortBrokerTest, ReceivePortFromChild) {
-  ASSERT_TRUE(broker_.Init());
-  CommandLine command_line(
-      base::GetMultiProcessTestChildBaseCommandLine());
-  broker_.GetLock().Acquire();
-  base::Process test_child_process = base::SpawnMultiProcessTestChild(
-      "MachPortBrokerTestChild", command_line, LaunchOptions());
-  broker_.AddPlaceholderForPid(test_child_process.Handle());
-  broker_.GetLock().Release();
-
-  WaitForTaskPort();
-  EXPECT_EQ(test_child_process.Handle(), received_process_);
-
-  int rv = -1;
-  ASSERT_TRUE(test_child_process.WaitForExitWithTimeout(
-      TestTimeouts::action_timeout(), &rv));
-  EXPECT_EQ(0, rv);
-
-  EXPECT_NE(static_cast<mach_port_t>(MACH_PORT_NULL),
-            broker_.TaskForPid(test_child_process.Handle()));
-}
-
-TEST_F(MachPortBrokerTest, ReceivePortFromChildWithoutAdding) {
-  ASSERT_TRUE(broker_.Init());
-  CommandLine command_line(
-      base::GetMultiProcessTestChildBaseCommandLine());
-  broker_.GetLock().Acquire();
-  base::Process test_child_process = base::SpawnMultiProcessTestChild(
-      "MachPortBrokerTestChild", command_line, LaunchOptions());
-  broker_.GetLock().Release();
-
-  int rv = -1;
-  ASSERT_TRUE(test_child_process.WaitForExitWithTimeout(
-      TestTimeouts::action_timeout(), &rv));
-  EXPECT_EQ(0, rv);
-
-  EXPECT_EQ(static_cast<mach_port_t>(MACH_PORT_NULL),
-            broker_.TaskForPid(test_child_process.Handle()));
-}
-
-}  // namespace base
diff --git a/base/md5_unittest.cc b/base/md5_unittest.cc
deleted file mode 100644
index b27efe9..0000000
--- a/base/md5_unittest.cc
+++ /dev/null
@@ -1,253 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/md5.h"
-
-#include <string.h>
-
-#include <memory>
-#include <string>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(MD5, DigestToBase16) {
-  MD5Digest digest;
-
-  int data[] = {
-    0xd4, 0x1d, 0x8c, 0xd9,
-    0x8f, 0x00, 0xb2, 0x04,
-    0xe9, 0x80, 0x09, 0x98,
-    0xec, 0xf8, 0x42, 0x7e
-  };
-
-  for (int i = 0; i < 16; ++i)
-    digest.a[i] = data[i] & 0xff;
-
-  std::string actual = MD5DigestToBase16(digest);
-  std::string expected = "d41d8cd98f00b204e9800998ecf8427e";
-
-  EXPECT_EQ(expected, actual);
-}
-
-TEST(MD5, MD5SumEmtpyData) {
-  MD5Digest digest;
-  const char data[] = "";
-
-  MD5Sum(data, strlen(data), &digest);
-
-  int expected[] = {
-    0xd4, 0x1d, 0x8c, 0xd9,
-    0x8f, 0x00, 0xb2, 0x04,
-    0xe9, 0x80, 0x09, 0x98,
-    0xec, 0xf8, 0x42, 0x7e
-  };
-
-  for (int i = 0; i < 16; ++i)
-    EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
-}
-
-TEST(MD5, MD5SumOneByteData) {
-  MD5Digest digest;
-  const char data[] = "a";
-
-  MD5Sum(data, strlen(data), &digest);
-
-  int expected[] = {
-    0x0c, 0xc1, 0x75, 0xb9,
-    0xc0, 0xf1, 0xb6, 0xa8,
-    0x31, 0xc3, 0x99, 0xe2,
-    0x69, 0x77, 0x26, 0x61
-  };
-
-  for (int i = 0; i < 16; ++i)
-    EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
-}
-
-TEST(MD5, MD5SumLongData) {
-  const int length = 10 * 1024 * 1024 + 1;
-  std::unique_ptr<char[]> data(new char[length]);
-
-  for (int i = 0; i < length; ++i)
-    data[i] = i & 0xFF;
-
-  MD5Digest digest;
-  MD5Sum(data.get(), length, &digest);
-
-  int expected[] = {
-    0x90, 0xbd, 0x6a, 0xd9,
-    0x0a, 0xce, 0xf5, 0xad,
-    0xaa, 0x92, 0x20, 0x3e,
-    0x21, 0xc7, 0xa1, 0x3e
-  };
-
-  for (int i = 0; i < 16; ++i)
-    EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
-}
-
-TEST(MD5, ContextWithEmptyData) {
-  MD5Context ctx;
-  MD5Init(&ctx);
-
-  MD5Digest digest;
-  MD5Final(&digest, &ctx);
-
-  int expected[] = {
-    0xd4, 0x1d, 0x8c, 0xd9,
-    0x8f, 0x00, 0xb2, 0x04,
-    0xe9, 0x80, 0x09, 0x98,
-    0xec, 0xf8, 0x42, 0x7e
-  };
-
-  for (int i = 0; i < 16; ++i)
-    EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
-}
-
-TEST(MD5, ContextWithLongData) {
-  MD5Context ctx;
-  MD5Init(&ctx);
-
-  const int length = 10 * 1024 * 1024 + 1;
-  std::unique_ptr<char[]> data(new char[length]);
-
-  for (int i = 0; i < length; ++i)
-    data[i] = i & 0xFF;
-
-  int total = 0;
-  while (total < length) {
-    int len = 4097;  // intentionally not 2^k.
-    if (len > length - total)
-      len = length - total;
-
-    MD5Update(&ctx,
-              StringPiece(reinterpret_cast<char*>(data.get() + total), len));
-    total += len;
-  }
-
-  EXPECT_EQ(length, total);
-
-  MD5Digest digest;
-  MD5Final(&digest, &ctx);
-
-  int expected[] = {
-    0x90, 0xbd, 0x6a, 0xd9,
-    0x0a, 0xce, 0xf5, 0xad,
-    0xaa, 0x92, 0x20, 0x3e,
-    0x21, 0xc7, 0xa1, 0x3e
-  };
-
-  for (int i = 0; i < 16; ++i)
-    EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
-}
-
-// Example data from http://www.ietf.org/rfc/rfc1321.txt A.5 Test Suite
-TEST(MD5, MD5StringTestSuite1) {
-  std::string actual = MD5String("");
-  std::string expected = "d41d8cd98f00b204e9800998ecf8427e";
-  EXPECT_EQ(expected, actual);
-}
-
-TEST(MD5, MD5StringTestSuite2) {
-  std::string actual = MD5String("a");
-  std::string expected = "0cc175b9c0f1b6a831c399e269772661";
-  EXPECT_EQ(expected, actual);
-}
-
-TEST(MD5, MD5StringTestSuite3) {
-  std::string actual = MD5String("abc");
-  std::string expected = "900150983cd24fb0d6963f7d28e17f72";
-  EXPECT_EQ(expected, actual);
-}
-
-TEST(MD5, MD5StringTestSuite4) {
-  std::string actual = MD5String("message digest");
-  std::string expected = "f96b697d7cb7938d525a2f31aaf161d0";
-  EXPECT_EQ(expected, actual);
-}
-
-TEST(MD5, MD5StringTestSuite5) {
-  std::string actual = MD5String("abcdefghijklmnopqrstuvwxyz");
-  std::string expected = "c3fcd3d76192e4007dfb496cca67e13b";
-  EXPECT_EQ(expected, actual);
-}
-
-TEST(MD5, MD5StringTestSuite6) {
-  std::string actual = MD5String("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                                 "abcdefghijklmnopqrstuvwxyz"
-                                 "0123456789");
-  std::string expected = "d174ab98d277d9f5a5611c2c9f419d9f";
-  EXPECT_EQ(expected, actual);
-}
-
-TEST(MD5, MD5StringTestSuite7) {
-  std::string actual = MD5String("12345678901234567890"
-                                 "12345678901234567890"
-                                 "12345678901234567890"
-                                 "12345678901234567890");
-  std::string expected = "57edf4a22be3c955ac49da2e2107b67a";
-  EXPECT_EQ(expected, actual);
-}
-
-TEST(MD5, ContextWithStringData) {
-  MD5Context ctx;
-  MD5Init(&ctx);
-
-  MD5Update(&ctx, "abc");
-
-  MD5Digest digest;
-  MD5Final(&digest, &ctx);
-
-  std::string actual = MD5DigestToBase16(digest);
-  std::string expected = "900150983cd24fb0d6963f7d28e17f72";
-
-  EXPECT_EQ(expected, actual);
-}
-
-// Test that a digest generated by MD5IntermediateFinal() gives the same results
-// as an independently-calculated digest, and also does not modify the context.
-TEST(MD5, IntermediateFinal) {
-  // Independent context over the header.
-  MD5Context check_header_context;
-  MD5Init(&check_header_context);
-
-  // Independent context over entire input.
-  MD5Context check_full_context;
-  MD5Init(&check_full_context);
-
-  // Context intermediate digest will be calculated from.
-  MD5Context context;
-  MD5Init(&context);
-
-  static const char kHeader[] = "header data";
-  static const char kBody[] = "payload data";
-
-  MD5Update(&context, kHeader);
-  MD5Update(&check_header_context, kHeader);
-  MD5Update(&check_full_context, kHeader);
-
-  MD5Digest check_header_digest;
-  MD5Final(&check_header_digest, &check_header_context);
-
-  MD5Digest header_digest;
-  MD5IntermediateFinal(&header_digest, &context);
-
-  MD5Update(&context, kBody);
-  MD5Update(&check_full_context, kBody);
-
-  MD5Digest check_full_digest;
-  MD5Final(&check_full_digest, &check_full_context);
-
-  MD5Digest digest;
-  MD5Final(&digest, &context);
-
-  // The header and full digest pairs are the same, and they aren't the same as
-  // each other.
-  EXPECT_TRUE(!memcmp(&header_digest, &check_header_digest,
-                      sizeof(header_digest)));
-  EXPECT_TRUE(!memcmp(&digest, &check_full_digest, sizeof(digest)));
-  EXPECT_TRUE(memcmp(&digest, &header_digest, sizeof(digest)));
-}
-
-}  // namespace base
diff --git a/base/memory/aligned_memory_unittest.cc b/base/memory/aligned_memory_unittest.cc
deleted file mode 100644
index 29ed706..0000000
--- a/base/memory/aligned_memory_unittest.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/aligned_memory.h"
-
-#include <memory>
-
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#define EXPECT_ALIGNED(ptr, align) \
-    EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(ptr) & (align - 1))
-
-namespace base {
-
-TEST(AlignedMemoryTest, DynamicAllocation) {
-  void* p = AlignedAlloc(8, 8);
-  EXPECT_TRUE(p);
-  EXPECT_ALIGNED(p, 8);
-  AlignedFree(p);
-
-  p = AlignedAlloc(8, 16);
-  EXPECT_TRUE(p);
-  EXPECT_ALIGNED(p, 16);
-  AlignedFree(p);
-
-  p = AlignedAlloc(8, 256);
-  EXPECT_TRUE(p);
-  EXPECT_ALIGNED(p, 256);
-  AlignedFree(p);
-
-  p = AlignedAlloc(8, 4096);
-  EXPECT_TRUE(p);
-  EXPECT_ALIGNED(p, 4096);
-  AlignedFree(p);
-}
-
-TEST(AlignedMemoryTest, ScopedDynamicAllocation) {
-  std::unique_ptr<float, AlignedFreeDeleter> p(
-      static_cast<float*>(AlignedAlloc(8, 8)));
-  EXPECT_TRUE(p.get());
-  EXPECT_ALIGNED(p.get(), 8);
-}
-
-}  // namespace base
diff --git a/base/memory/discardable_shared_memory_unittest.cc b/base/memory/discardable_shared_memory_unittest.cc
deleted file mode 100644
index bda37f6..0000000
--- a/base/memory/discardable_shared_memory_unittest.cc
+++ /dev/null
@@ -1,456 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fcntl.h>
-#include <stdint.h>
-
-#include "base/files/scoped_file.h"
-#include "base/memory/discardable_shared_memory.h"
-#include "base/memory/shared_memory_tracker.h"
-#include "base/process/process_metrics.h"
-#include "base/trace_event/memory_allocator_dump.h"
-#include "base/trace_event/process_memory_dump.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-class TestDiscardableSharedMemory : public DiscardableSharedMemory {
- public:
-  TestDiscardableSharedMemory() = default;
-
-  explicit TestDiscardableSharedMemory(UnsafeSharedMemoryRegion region)
-      : DiscardableSharedMemory(std::move(region)) {}
-
-  void SetNow(Time now) { now_ = now; }
-
- private:
-  // Overriden from DiscardableSharedMemory:
-  Time Now() const override { return now_; }
-
-  Time now_;
-};
-
-TEST(DiscardableSharedMemoryTest, CreateAndMap) {
-  const uint32_t kDataSize = 1024;
-
-  TestDiscardableSharedMemory memory;
-  bool rv = memory.CreateAndMap(kDataSize);
-  ASSERT_TRUE(rv);
-  EXPECT_GE(memory.mapped_size(), kDataSize);
-  EXPECT_TRUE(memory.IsMemoryLocked());
-}
-
-TEST(DiscardableSharedMemoryTest, CreateFromHandle) {
-  const uint32_t kDataSize = 1024;
-
-  TestDiscardableSharedMemory memory1;
-  bool rv = memory1.CreateAndMap(kDataSize);
-  ASSERT_TRUE(rv);
-
-  UnsafeSharedMemoryRegion shared_region = memory1.DuplicateRegion();
-  ASSERT_TRUE(shared_region.IsValid());
-
-  TestDiscardableSharedMemory memory2(std::move(shared_region));
-  rv = memory2.Map(kDataSize);
-  ASSERT_TRUE(rv);
-  EXPECT_TRUE(memory2.IsMemoryLocked());
-}
-
-TEST(DiscardableSharedMemoryTest, LockAndUnlock) {
-  const uint32_t kDataSize = 1024;
-
-  TestDiscardableSharedMemory memory1;
-  bool rv = memory1.CreateAndMap(kDataSize);
-  ASSERT_TRUE(rv);
-
-  // Memory is initially locked. Unlock it.
-  memory1.SetNow(Time::FromDoubleT(1));
-  memory1.Unlock(0, 0);
-  EXPECT_FALSE(memory1.IsMemoryLocked());
-
-  // Lock and unlock memory.
-  DiscardableSharedMemory::LockResult lock_rv = memory1.Lock(0, 0);
-  EXPECT_EQ(DiscardableSharedMemory::SUCCESS, lock_rv);
-  memory1.SetNow(Time::FromDoubleT(2));
-  memory1.Unlock(0, 0);
-
-  // Lock again before duplicating and passing ownership to new instance.
-  lock_rv = memory1.Lock(0, 0);
-  EXPECT_EQ(DiscardableSharedMemory::SUCCESS, lock_rv);
-  EXPECT_TRUE(memory1.IsMemoryLocked());
-
-  UnsafeSharedMemoryRegion shared_region = memory1.DuplicateRegion();
-  ASSERT_TRUE(shared_region.IsValid());
-
-  TestDiscardableSharedMemory memory2(std::move(shared_region));
-  rv = memory2.Map(kDataSize);
-  ASSERT_TRUE(rv);
-
-  // Unlock second instance.
-  memory2.SetNow(Time::FromDoubleT(3));
-  memory2.Unlock(0, 0);
-
-  // Both memory instances should be unlocked now.
-  EXPECT_FALSE(memory2.IsMemoryLocked());
-  EXPECT_FALSE(memory1.IsMemoryLocked());
-
-  // Lock second instance before passing ownership back to first instance.
-  lock_rv = memory2.Lock(0, 0);
-  EXPECT_EQ(DiscardableSharedMemory::SUCCESS, lock_rv);
-
-  // Memory should still be resident and locked.
-  rv = memory1.IsMemoryResident();
-  EXPECT_TRUE(rv);
-  EXPECT_TRUE(memory1.IsMemoryLocked());
-
-  // Unlock first instance.
-  memory1.SetNow(Time::FromDoubleT(4));
-  memory1.Unlock(0, 0);
-}
-
-TEST(DiscardableSharedMemoryTest, Purge) {
-  const uint32_t kDataSize = 1024;
-
-  TestDiscardableSharedMemory memory1;
-  bool rv = memory1.CreateAndMap(kDataSize);
-  ASSERT_TRUE(rv);
-
-  UnsafeSharedMemoryRegion shared_region = memory1.DuplicateRegion();
-  ASSERT_TRUE(shared_region.IsValid());
-
-  TestDiscardableSharedMemory memory2(std::move(shared_region));
-  rv = memory2.Map(kDataSize);
-  ASSERT_TRUE(rv);
-
-  // This should fail as memory is locked.
-  rv = memory1.Purge(Time::FromDoubleT(1));
-  EXPECT_FALSE(rv);
-
-  memory2.SetNow(Time::FromDoubleT(2));
-  memory2.Unlock(0, 0);
-
-  ASSERT_TRUE(memory2.IsMemoryResident());
-
-  // Memory is unlocked, but our usage timestamp is incorrect.
-  rv = memory1.Purge(Time::FromDoubleT(3));
-  EXPECT_FALSE(rv);
-
-  ASSERT_TRUE(memory2.IsMemoryResident());
-
-  // Memory is unlocked and our usage timestamp should be correct.
-  rv = memory1.Purge(Time::FromDoubleT(4));
-  EXPECT_TRUE(rv);
-
-  // Lock should fail as memory has been purged.
-  DiscardableSharedMemory::LockResult lock_rv = memory2.Lock(0, 0);
-  EXPECT_EQ(DiscardableSharedMemory::FAILED, lock_rv);
-
-  ASSERT_FALSE(memory2.IsMemoryResident());
-}
-
-TEST(DiscardableSharedMemoryTest, LastUsed) {
-  const uint32_t kDataSize = 1024;
-
-  TestDiscardableSharedMemory memory1;
-  bool rv = memory1.CreateAndMap(kDataSize);
-  ASSERT_TRUE(rv);
-
-  UnsafeSharedMemoryRegion shared_region = memory1.DuplicateRegion();
-  ASSERT_TRUE(shared_region.IsValid());
-
-  TestDiscardableSharedMemory memory2(std::move(shared_region));
-  rv = memory2.Map(kDataSize);
-  ASSERT_TRUE(rv);
-
-  memory2.SetNow(Time::FromDoubleT(1));
-  memory2.Unlock(0, 0);
-
-  EXPECT_EQ(memory2.last_known_usage(), Time::FromDoubleT(1));
-
-  DiscardableSharedMemory::LockResult lock_rv = memory2.Lock(0, 0);
-  EXPECT_EQ(DiscardableSharedMemory::SUCCESS, lock_rv);
-
-  // This should fail as memory is locked.
-  rv = memory1.Purge(Time::FromDoubleT(2));
-  ASSERT_FALSE(rv);
-
-  // Last usage should have been updated to timestamp passed to Purge above.
-  EXPECT_EQ(memory1.last_known_usage(), Time::FromDoubleT(2));
-
-  memory2.SetNow(Time::FromDoubleT(3));
-  memory2.Unlock(0, 0);
-
-  // Usage time should be correct for |memory2| instance.
-  EXPECT_EQ(memory2.last_known_usage(), Time::FromDoubleT(3));
-
-  // However, usage time has not changed as far as |memory1| instance knows.
-  EXPECT_EQ(memory1.last_known_usage(), Time::FromDoubleT(2));
-
-  // Memory is unlocked, but our usage timestamp is incorrect.
-  rv = memory1.Purge(Time::FromDoubleT(4));
-  EXPECT_FALSE(rv);
-
-  // The failed purge attempt should have updated usage time to the correct
-  // value.
-  EXPECT_EQ(memory1.last_known_usage(), Time::FromDoubleT(3));
-
-  // Purge memory through |memory2| instance. The last usage time should be
-  // set to 0 as a result of this.
-  rv = memory2.Purge(Time::FromDoubleT(5));
-  EXPECT_TRUE(rv);
-  EXPECT_TRUE(memory2.last_known_usage().is_null());
-
-  // This should fail as memory has already been purged and |memory1|'s usage
-  // time is incorrect as a result.
-  rv = memory1.Purge(Time::FromDoubleT(6));
-  EXPECT_FALSE(rv);
-
-  // The failed purge attempt should have updated usage time to the correct
-  // value.
-  EXPECT_TRUE(memory1.last_known_usage().is_null());
-
-  // Purge should succeed now that usage time is correct.
-  rv = memory1.Purge(Time::FromDoubleT(7));
-  EXPECT_TRUE(rv);
-}
-
-TEST(DiscardableSharedMemoryTest, LockShouldAlwaysFailAfterSuccessfulPurge) {
-  const uint32_t kDataSize = 1024;
-
-  TestDiscardableSharedMemory memory1;
-  bool rv = memory1.CreateAndMap(kDataSize);
-  ASSERT_TRUE(rv);
-
-  UnsafeSharedMemoryRegion shared_region = memory1.DuplicateRegion();
-  ASSERT_TRUE(shared_region.IsValid());
-
-  TestDiscardableSharedMemory memory2(std::move(shared_region));
-  rv = memory2.Map(kDataSize);
-  ASSERT_TRUE(rv);
-
-  memory2.SetNow(Time::FromDoubleT(1));
-  memory2.Unlock(0, 0);
-
-  rv = memory2.Purge(Time::FromDoubleT(2));
-  EXPECT_TRUE(rv);
-
-  // Lock should fail as memory has been purged.
-  DiscardableSharedMemory::LockResult lock_rv = memory2.Lock(0, 0);
-  EXPECT_EQ(DiscardableSharedMemory::FAILED, lock_rv);
-}
-
-#if defined(OS_ANDROID)
-TEST(DiscardableSharedMemoryTest, LockShouldFailIfPlatformLockPagesFails) {
-  const uint32_t kDataSize = 1024;
-
-  DiscardableSharedMemory memory1;
-  bool rv1 = memory1.CreateAndMap(kDataSize);
-  ASSERT_TRUE(rv1);
-
-  base::UnsafeSharedMemoryRegion region = memory1.DuplicateRegion();
-  int fd = region.GetPlatformHandle();
-  DiscardableSharedMemory memory2(std::move(region));
-  bool rv2 = memory2.Map(kDataSize);
-  ASSERT_TRUE(rv2);
-
-  // Unlock() the first page of memory, so we can test Lock()ing it.
-  memory2.Unlock(0, base::GetPageSize());
-  // To cause ashmem_pin_region() to fail, we arrange for it to be called with
-  // an invalid file-descriptor, which requires a valid-looking fd (i.e. we
-  // can't just Close() |memory|), but one on which the operation is invalid.
-  // We can overwrite the |memory| fd with a handle to a different file using
-  // dup2(), which has the nice properties that |memory| still has a valid fd
-  // that it can close, etc without errors, but on which ashmem_pin_region()
-  // will fail.
-  base::ScopedFD null(open("/dev/null", O_RDONLY));
-  ASSERT_EQ(fd, dup2(null.get(), fd));
-
-  // Now re-Lock()ing the first page should fail.
-  DiscardableSharedMemory::LockResult lock_rv =
-      memory2.Lock(0, base::GetPageSize());
-  EXPECT_EQ(DiscardableSharedMemory::FAILED, lock_rv);
-}
-#endif  // defined(OS_ANDROID)
-
-TEST(DiscardableSharedMemoryTest, LockAndUnlockRange) {
-  const uint32_t kDataSize = 32;
-
-  uint32_t data_size_in_bytes = kDataSize * base::GetPageSize();
-
-  TestDiscardableSharedMemory memory1;
-  bool rv = memory1.CreateAndMap(data_size_in_bytes);
-  ASSERT_TRUE(rv);
-
-  UnsafeSharedMemoryRegion shared_region = memory1.DuplicateRegion();
-  ASSERT_TRUE(shared_region.IsValid());
-
-  TestDiscardableSharedMemory memory2(std::move(shared_region));
-  rv = memory2.Map(data_size_in_bytes);
-  ASSERT_TRUE(rv);
-
-  // Unlock first page.
-  memory2.SetNow(Time::FromDoubleT(1));
-  memory2.Unlock(0, base::GetPageSize());
-
-  rv = memory1.Purge(Time::FromDoubleT(2));
-  EXPECT_FALSE(rv);
-
-  // Lock first page again.
-  memory2.SetNow(Time::FromDoubleT(3));
-  DiscardableSharedMemory::LockResult lock_rv =
-      memory2.Lock(0, base::GetPageSize());
-  EXPECT_NE(DiscardableSharedMemory::FAILED, lock_rv);
-
-  // Unlock first page.
-  memory2.SetNow(Time::FromDoubleT(4));
-  memory2.Unlock(0, base::GetPageSize());
-
-  rv = memory1.Purge(Time::FromDoubleT(5));
-  EXPECT_FALSE(rv);
-
-  // Unlock second page.
-  memory2.SetNow(Time::FromDoubleT(6));
-  memory2.Unlock(base::GetPageSize(), base::GetPageSize());
-
-  rv = memory1.Purge(Time::FromDoubleT(7));
-  EXPECT_FALSE(rv);
-
-  // Unlock anything onwards.
-  memory2.SetNow(Time::FromDoubleT(8));
-  memory2.Unlock(2 * base::GetPageSize(), 0);
-
-  // Memory is unlocked, but our usage timestamp is incorrect.
-  rv = memory1.Purge(Time::FromDoubleT(9));
-  EXPECT_FALSE(rv);
-
-  // The failed purge attempt should have updated usage time to the correct
-  // value.
-  EXPECT_EQ(Time::FromDoubleT(8), memory1.last_known_usage());
-
-  // Purge should now succeed.
-  rv = memory1.Purge(Time::FromDoubleT(10));
-  EXPECT_TRUE(rv);
-}
-
-TEST(DiscardableSharedMemoryTest, MappedSize) {
-  const uint32_t kDataSize = 1024;
-
-  TestDiscardableSharedMemory memory;
-  bool rv = memory.CreateAndMap(kDataSize);
-  ASSERT_TRUE(rv);
-
-  EXPECT_LE(kDataSize, memory.mapped_size());
-
-  // Mapped size should be 0 after memory segment has been unmapped.
-  rv = memory.Unmap();
-  EXPECT_TRUE(rv);
-  EXPECT_EQ(0u, memory.mapped_size());
-}
-
-TEST(DiscardableSharedMemoryTest, Close) {
-  const uint32_t kDataSize = 1024;
-
-  TestDiscardableSharedMemory memory;
-  bool rv = memory.CreateAndMap(kDataSize);
-  ASSERT_TRUE(rv);
-
-  // Mapped size should be unchanged after memory segment has been closed.
-  memory.Close();
-  EXPECT_LE(kDataSize, memory.mapped_size());
-
-  // Memory is initially locked. Unlock it.
-  memory.SetNow(Time::FromDoubleT(1));
-  memory.Unlock(0, 0);
-
-  // Lock and unlock memory.
-  DiscardableSharedMemory::LockResult lock_rv = memory.Lock(0, 0);
-  EXPECT_EQ(DiscardableSharedMemory::SUCCESS, lock_rv);
-  memory.SetNow(Time::FromDoubleT(2));
-  memory.Unlock(0, 0);
-}
-
-TEST(DiscardableSharedMemoryTest, ZeroSize) {
-  TestDiscardableSharedMemory memory;
-  bool rv = memory.CreateAndMap(0);
-  ASSERT_TRUE(rv);
-
-  EXPECT_LE(0u, memory.mapped_size());
-
-  // Memory is initially locked. Unlock it.
-  memory.SetNow(Time::FromDoubleT(1));
-  memory.Unlock(0, 0);
-
-  // Lock and unlock memory.
-  DiscardableSharedMemory::LockResult lock_rv = memory.Lock(0, 0);
-  EXPECT_NE(DiscardableSharedMemory::FAILED, lock_rv);
-  memory.SetNow(Time::FromDoubleT(2));
-  memory.Unlock(0, 0);
-}
-
-// This test checks that zero-filled pages are returned after purging a segment
-// when DISCARDABLE_SHARED_MEMORY_ZERO_FILL_ON_DEMAND_PAGES_AFTER_PURGE is
-// defined and MADV_REMOVE is supported.
-#if defined(DISCARDABLE_SHARED_MEMORY_ZERO_FILL_ON_DEMAND_PAGES_AFTER_PURGE)
-TEST(DiscardableSharedMemoryTest, ZeroFilledPagesAfterPurge) {
-  const uint32_t kDataSize = 1024;
-
-  TestDiscardableSharedMemory memory1;
-  bool rv = memory1.CreateAndMap(kDataSize);
-  ASSERT_TRUE(rv);
-
-  UnsafeSharedMemoryRegion shared_region = memory1.DuplicateRegion();
-  ASSERT_TRUE(shared_region.IsValid());
-
-  TestDiscardableSharedMemory memory2(std::move(shared_region));
-  rv = memory2.Map(kDataSize);
-  ASSERT_TRUE(rv);
-
-  // Initialize all memory to '0xaa'.
-  memset(memory2.memory(), 0xaa, kDataSize);
-
-  // Unlock memory.
-  memory2.SetNow(Time::FromDoubleT(1));
-  memory2.Unlock(0, 0);
-  EXPECT_FALSE(memory1.IsMemoryLocked());
-
-  // Memory is unlocked, but our usage timestamp is incorrect.
-  rv = memory1.Purge(Time::FromDoubleT(2));
-  EXPECT_FALSE(rv);
-  rv = memory1.Purge(Time::FromDoubleT(3));
-  EXPECT_TRUE(rv);
-
-  // Check that reading memory after it has been purged is returning
-  // zero-filled pages.
-  uint8_t expected_data[kDataSize] = {};
-  EXPECT_EQ(memcmp(memory2.memory(), expected_data, kDataSize), 0);
-}
-#endif
-
-TEST(DiscardableSharedMemoryTest, TracingOwnershipEdges) {
-  const uint32_t kDataSize = 1024;
-  TestDiscardableSharedMemory memory1;
-  bool rv = memory1.CreateAndMap(kDataSize);
-  ASSERT_TRUE(rv);
-
-  base::trace_event::MemoryDumpArgs args = {
-      base::trace_event::MemoryDumpLevelOfDetail::DETAILED};
-  trace_event::ProcessMemoryDump pmd(nullptr, args);
-  trace_event::MemoryAllocatorDump* client_dump =
-      pmd.CreateAllocatorDump("discardable_manager/map1");
-  const bool is_owned = false;
-  memory1.CreateSharedMemoryOwnershipEdge(client_dump, &pmd, is_owned);
-  const auto* shm_dump = pmd.GetAllocatorDump(
-      SharedMemoryTracker::GetDumpNameForTracing(memory1.mapped_id()));
-  EXPECT_TRUE(shm_dump);
-  EXPECT_EQ(shm_dump->GetSizeInternal(), client_dump->GetSizeInternal());
-  const auto edges = pmd.allocator_dumps_edges();
-  EXPECT_EQ(2u, edges.size());
-  EXPECT_NE(edges.end(), edges.find(shm_dump->guid()));
-  EXPECT_NE(edges.end(), edges.find(client_dump->guid()));
-  // TODO(ssid): test for weak global dump once the
-  // CreateWeakSharedMemoryOwnershipEdge() is fixed, crbug.com/661257.
-}
-
-}  // namespace base
diff --git a/base/memory/linked_ptr_unittest.cc b/base/memory/linked_ptr_unittest.cc
deleted file mode 100644
index 344ffa4..0000000
--- a/base/memory/linked_ptr_unittest.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-
-#include "base/memory/linked_ptr.h"
-#include "base/strings/stringprintf.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-int num = 0;
-
-std::string history;
-
-// Class which tracks allocation/deallocation
-struct A {
-  A(): mynum(num++) { history += base::StringPrintf("A%d ctor\n", mynum); }
-  virtual ~A() { history += base::StringPrintf("A%d dtor\n", mynum); }
-  virtual void Use() { history += base::StringPrintf("A%d use\n", mynum); }
-  int mynum;
-};
-
-// Subclass
-struct B: public A {
-  B() { history += base::StringPrintf("B%d ctor\n", mynum); }
-  ~B() override { history += base::StringPrintf("B%d dtor\n", mynum); }
-  void Use() override { history += base::StringPrintf("B%d use\n", mynum); }
-};
-
-}  // namespace
-
-TEST(LinkedPtrTest, Test) {
-  {
-    linked_ptr<A> a0, a1, a2;
-    a0 = *&a0;  // The *& defeats Clang's -Wself-assign warning.
-    a1 = a2;
-    ASSERT_EQ(a0.get(), static_cast<A*>(nullptr));
-    ASSERT_EQ(a1.get(), static_cast<A*>(nullptr));
-    ASSERT_EQ(a2.get(), static_cast<A*>(nullptr));
-    ASSERT_TRUE(a0 == nullptr);
-    ASSERT_TRUE(a1 == nullptr);
-    ASSERT_TRUE(a2 == nullptr);
-
-    {
-      linked_ptr<A> a3(new A);
-      a0 = a3;
-      ASSERT_TRUE(a0 == a3);
-      ASSERT_TRUE(a0 != nullptr);
-      ASSERT_TRUE(a0.get() == a3);
-      ASSERT_TRUE(a0 == a3.get());
-      linked_ptr<A> a4(a0);
-      a1 = a4;
-      linked_ptr<A> a5(new A);
-      ASSERT_TRUE(a5.get() != a3);
-      ASSERT_TRUE(a5 != a3.get());
-      a2 = a5;
-      linked_ptr<B> b0(new B);
-      linked_ptr<A> a6(b0);
-      ASSERT_TRUE(b0 == a6);
-      ASSERT_TRUE(a6 == b0);
-      ASSERT_TRUE(b0 != nullptr);
-      a5 = b0;
-      a5 = b0;
-      a3->Use();
-      a4->Use();
-      a5->Use();
-      a6->Use();
-      b0->Use();
-      (*b0).Use();
-      b0.get()->Use();
-    }
-
-    a0->Use();
-    a1->Use();
-    a2->Use();
-
-    a1 = a2;
-    a2.reset(new A);
-    a0.reset();
-
-    linked_ptr<A> a7;
-  }
-
-  ASSERT_EQ(history,
-    "A0 ctor\n"
-    "A1 ctor\n"
-    "A2 ctor\n"
-    "B2 ctor\n"
-    "A0 use\n"
-    "A0 use\n"
-    "B2 use\n"
-    "B2 use\n"
-    "B2 use\n"
-    "B2 use\n"
-    "B2 use\n"
-    "B2 dtor\n"
-    "A2 dtor\n"
-    "A0 use\n"
-    "A0 use\n"
-    "A1 use\n"
-    "A3 ctor\n"
-    "A0 dtor\n"
-    "A3 dtor\n"
-    "A1 dtor\n"
-  );
-}
diff --git a/base/memory/memory_coordinator_client_registry_unittest.cc b/base/memory/memory_coordinator_client_registry_unittest.cc
deleted file mode 100644
index 37ed767..0000000
--- a/base/memory/memory_coordinator_client_registry_unittest.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/memory_coordinator_client_registry.h"
-
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class TestMemoryCoordinatorClient : public MemoryCoordinatorClient {
- public:
-  void OnMemoryStateChange(MemoryState state) override { state_ = state; }
-
-  void OnPurgeMemory() override { ++purge_count_; }
-
-  MemoryState state() const { return state_; }
-  size_t purge_count() const { return purge_count_; }
-
- private:
-  MemoryState state_ = MemoryState::UNKNOWN;
-  size_t purge_count_ = 0;
-};
-
-void RunUntilIdle() {
-  base::RunLoop loop;
-  loop.RunUntilIdle();
-}
-
-TEST(MemoryCoordinatorClientRegistryTest, NotifyStateChange) {
-  MessageLoop loop;
-  auto* registry = MemoryCoordinatorClientRegistry::GetInstance();
-  TestMemoryCoordinatorClient client;
-  registry->Register(&client);
-  registry->Notify(MemoryState::THROTTLED);
-  RunUntilIdle();
-  ASSERT_EQ(MemoryState::THROTTLED, client.state());
-  registry->Unregister(&client);
-}
-
-TEST(MemoryCoordinatorClientRegistryTest, PurgeMemory) {
-  MessageLoop loop;
-  auto* registry = MemoryCoordinatorClientRegistry::GetInstance();
-  TestMemoryCoordinatorClient client;
-  registry->Register(&client);
-  registry->PurgeMemory();
-  RunUntilIdle();
-  ASSERT_EQ(1u, client.purge_count());
-  registry->Unregister(&client);
-}
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/memory/memory_pressure_listener_unittest.cc b/base/memory/memory_pressure_listener_unittest.cc
deleted file mode 100644
index 87d5f4c..0000000
--- a/base/memory/memory_pressure_listener_unittest.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/memory_pressure_listener.h"
-
-#include "base/bind.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace base {
-
-using MemoryPressureLevel = MemoryPressureListener::MemoryPressureLevel;
-
-class MemoryPressureListenerTest : public testing::Test {
- public:
-  void SetUp() override {
-    message_loop_.reset(new MessageLoopForUI());
-    listener_.reset(new MemoryPressureListener(
-        Bind(&MemoryPressureListenerTest::OnMemoryPressure, Unretained(this))));
-  }
-
-  void TearDown() override {
-    listener_.reset();
-    message_loop_.reset();
-  }
-
- protected:
-  void ExpectNotification(
-      void (*notification_function)(MemoryPressureLevel),
-      MemoryPressureLevel level) {
-    EXPECT_CALL(*this, OnMemoryPressure(level)).Times(1);
-    notification_function(level);
-    RunLoop().RunUntilIdle();
-  }
-
-  void ExpectNoNotification(
-      void (*notification_function)(MemoryPressureLevel),
-      MemoryPressureLevel level) {
-    EXPECT_CALL(*this, OnMemoryPressure(testing::_)).Times(0);
-    notification_function(level);
-    RunLoop().RunUntilIdle();
-  }
-
- private:
-  MOCK_METHOD1(OnMemoryPressure,
-               void(MemoryPressureListener::MemoryPressureLevel));
-
-  std::unique_ptr<MessageLoopForUI> message_loop_;
-  std::unique_ptr<MemoryPressureListener> listener_;
-};
-
-TEST_F(MemoryPressureListenerTest, NotifyMemoryPressure) {
-  // Memory pressure notifications are not suppressed by default.
-  EXPECT_FALSE(MemoryPressureListener::AreNotificationsSuppressed());
-  ExpectNotification(&MemoryPressureListener::NotifyMemoryPressure,
-                     MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_MODERATE);
-  ExpectNotification(&MemoryPressureListener::SimulatePressureNotification,
-                     MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_MODERATE);
-
-  // Enable suppressing memory pressure notifications.
-  MemoryPressureListener::SetNotificationsSuppressed(true);
-  EXPECT_TRUE(MemoryPressureListener::AreNotificationsSuppressed());
-  ExpectNoNotification(&MemoryPressureListener::NotifyMemoryPressure,
-                       MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_MODERATE);
-  ExpectNotification(&MemoryPressureListener::SimulatePressureNotification,
-                     MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_MODERATE);
-
-  // Disable suppressing memory pressure notifications.
-  MemoryPressureListener::SetNotificationsSuppressed(false);
-  EXPECT_FALSE(MemoryPressureListener::AreNotificationsSuppressed());
-  ExpectNotification(&MemoryPressureListener::NotifyMemoryPressure,
-                     MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_CRITICAL);
-  ExpectNotification(&MemoryPressureListener::SimulatePressureNotification,
-                     MemoryPressureLevel::MEMORY_PRESSURE_LEVEL_CRITICAL);
-}
-
-}  // namespace base
diff --git a/base/memory/memory_pressure_monitor_chromeos_unittest.cc b/base/memory/memory_pressure_monitor_chromeos_unittest.cc
deleted file mode 100644
index ee00091..0000000
--- a/base/memory/memory_pressure_monitor_chromeos_unittest.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/memory_pressure_monitor_chromeos.h"
-
-#include "base/macros.h"
-#include "base/memory/memory_pressure_listener.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/sys_info.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace chromeos {
-
-namespace {
-
-// True if the memory notifier got called.
-// Do not read/modify value directly.
-bool on_memory_pressure_called = false;
-
-// If the memory notifier got called, this is the memory pressure reported.
-MemoryPressureListener::MemoryPressureLevel on_memory_pressure_level =
-    MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE;
-
-// Processes OnMemoryPressure calls.
-void OnMemoryPressure(MemoryPressureListener::MemoryPressureLevel level) {
-  on_memory_pressure_called = true;
-  on_memory_pressure_level = level;
-}
-
-// Resets the indicator for memory pressure.
-void ResetOnMemoryPressureCalled() {
-  on_memory_pressure_called = false;
-}
-
-// Returns true when OnMemoryPressure was called (and resets it).
-bool WasOnMemoryPressureCalled() {
-  bool b = on_memory_pressure_called;
-  ResetOnMemoryPressureCalled();
-  return b;
-}
-
-}  // namespace
-
-class TestMemoryPressureMonitor : public MemoryPressureMonitor {
- public:
-  TestMemoryPressureMonitor()
-      : MemoryPressureMonitor(THRESHOLD_DEFAULT),
-        memory_in_percent_override_(0) {
-    // Disable any timers which are going on and set a special memory reporting
-    // function.
-    StopObserving();
-  }
-  ~TestMemoryPressureMonitor() override = default;
-
-  void SetMemoryInPercentOverride(int percent) {
-    memory_in_percent_override_ = percent;
-  }
-
-  void CheckMemoryPressureForTest() {
-    CheckMemoryPressure();
-  }
-
- private:
-  int GetUsedMemoryInPercent() override {
-    return memory_in_percent_override_;
-  }
-
-  int memory_in_percent_override_;
-  DISALLOW_COPY_AND_ASSIGN(TestMemoryPressureMonitor);
-};
-
-// This test tests the various transition states from memory pressure, looking
-// for the correct behavior on event reposting as well as state updates.
-TEST(ChromeOSMemoryPressureMonitorTest, CheckMemoryPressure) {
-  // crbug.com/844102:
-  if (base::SysInfo::IsRunningOnChromeOS())
-    return;
-
-  base::MessageLoopForUI message_loop;
-  std::unique_ptr<TestMemoryPressureMonitor> monitor(
-      new TestMemoryPressureMonitor);
-  std::unique_ptr<MemoryPressureListener> listener(
-      new MemoryPressureListener(base::Bind(&OnMemoryPressure)));
-  // Checking the memory pressure while 0% are used should not produce any
-  // events.
-  monitor->SetMemoryInPercentOverride(0);
-  ResetOnMemoryPressureCalled();
-
-  monitor->CheckMemoryPressureForTest();
-  RunLoop().RunUntilIdle();
-  EXPECT_FALSE(WasOnMemoryPressureCalled());
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE,
-            monitor->GetCurrentPressureLevel());
-
-  // Setting the memory level to 80% should produce a moderate pressure level.
-  monitor->SetMemoryInPercentOverride(80);
-  monitor->CheckMemoryPressureForTest();
-  RunLoop().RunUntilIdle();
-  EXPECT_TRUE(WasOnMemoryPressureCalled());
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-            monitor->GetCurrentPressureLevel());
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-            on_memory_pressure_level);
-
-  // We need to check that the event gets reposted after a while.
-  int i = 0;
-  for (; i < 100; i++) {
-    monitor->CheckMemoryPressureForTest();
-    RunLoop().RunUntilIdle();
-    EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-              monitor->GetCurrentPressureLevel());
-    if (WasOnMemoryPressureCalled()) {
-      EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-                on_memory_pressure_level);
-      break;
-    }
-  }
-  // Should be more than 5 and less than 100.
-  EXPECT_LE(5, i);
-  EXPECT_GE(99, i);
-
-  // Setting the memory usage to 99% should produce critical levels.
-  monitor->SetMemoryInPercentOverride(99);
-  monitor->CheckMemoryPressureForTest();
-  RunLoop().RunUntilIdle();
-  EXPECT_TRUE(WasOnMemoryPressureCalled());
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL,
-            on_memory_pressure_level);
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL,
-            monitor->GetCurrentPressureLevel());
-
-  // Calling it again should immediately produce a second call.
-  monitor->CheckMemoryPressureForTest();
-  RunLoop().RunUntilIdle();
-  EXPECT_TRUE(WasOnMemoryPressureCalled());
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL,
-            on_memory_pressure_level);
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL,
-            monitor->GetCurrentPressureLevel());
-
-  // When lowering the pressure again we should not get an event, but the
-  // pressure should go back to moderate.
-  monitor->SetMemoryInPercentOverride(80);
-  monitor->CheckMemoryPressureForTest();
-  RunLoop().RunUntilIdle();
-  EXPECT_FALSE(WasOnMemoryPressureCalled());
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-            monitor->GetCurrentPressureLevel());
-
-  // We should need exactly the same amount of calls as before, before the next
-  // call comes in.
-  int j = 0;
-  for (; j < 100; j++) {
-    monitor->CheckMemoryPressureForTest();
-    RunLoop().RunUntilIdle();
-    EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-              monitor->GetCurrentPressureLevel());
-    if (WasOnMemoryPressureCalled()) {
-      EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-                on_memory_pressure_level);
-      break;
-    }
-  }
-  // We should have needed exactly the same amount of checks as before.
-  EXPECT_EQ(j, i);
-}
-
-}  // namespace chromeos
-}  // namespace base
diff --git a/base/memory/memory_pressure_monitor_mac_unittest.cc b/base/memory/memory_pressure_monitor_mac_unittest.cc
deleted file mode 100644
index ff464fb..0000000
--- a/base/memory/memory_pressure_monitor_mac_unittest.cc
+++ /dev/null
@@ -1,228 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/memory_pressure_monitor_mac.h"
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/mac/scoped_cftyperef.h"
-#include "base/macros.h"
-#include "base/test/histogram_tester.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace mac {
-
-class TestMemoryPressureMonitor : public MemoryPressureMonitor {
- public:
-  using MemoryPressureMonitor::MemoryPressureLevelForMacMemoryPressureLevel;
-
-  // A HistogramTester for verifying correct UMA stat generation.
-  base::HistogramTester tester;
-
-  TestMemoryPressureMonitor() { }
-
-  // Clears the next run loop update time so that the next pass of the run
-  // loop checks the memory pressure level immediately. Normally there's a
-  // 5 second delay between pressure readings.
-  void ResetRunLoopUpdateTime() { next_run_loop_update_time_ = 0; }
-
-  // Sets the last UMA stat report time. Time spent in memory pressure is
-  // recorded in 5-second "ticks" from the last time statistics were recorded.
-  void SetLastStatisticReportTime(CFTimeInterval time) {
-    last_statistic_report_time_ = time;
-  }
-
-  // Sets the raw macOS memory pressure level read by the memory pressure
-  // monitor.
-  int macos_pressure_level_for_testing_;
-
-  // Exposes the UpdatePressureLevel() method for testing.
-  void UpdatePressureLevel() { MemoryPressureMonitor::UpdatePressureLevel(); }
-
-  // Returns the number of seconds left over from the last UMA tick
-  // calculation.
-  int SubTickSeconds() { return subtick_seconds_; }
-
-  // Returns the number of seconds per UMA tick.
-  static int GetSecondsPerUMATick() {
-    return MemoryPressureMonitor::GetSecondsPerUMATick();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestMemoryPressureMonitor);
-
-  int GetMacMemoryPressureLevel() override {
-    return macos_pressure_level_for_testing_;
-  }
-};
-
-TEST(MacMemoryPressureMonitorTest, MemoryPressureFromMacMemoryPressure) {
-  EXPECT_EQ(
-      MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE,
-      TestMemoryPressureMonitor::MemoryPressureLevelForMacMemoryPressureLevel(
-          DISPATCH_MEMORYPRESSURE_NORMAL));
-  EXPECT_EQ(
-      MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-      TestMemoryPressureMonitor::MemoryPressureLevelForMacMemoryPressureLevel(
-          DISPATCH_MEMORYPRESSURE_WARN));
-  EXPECT_EQ(
-      MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL,
-      TestMemoryPressureMonitor::MemoryPressureLevelForMacMemoryPressureLevel(
-          DISPATCH_MEMORYPRESSURE_CRITICAL));
-  EXPECT_EQ(
-      MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE,
-      TestMemoryPressureMonitor::MemoryPressureLevelForMacMemoryPressureLevel(
-          0));
-  EXPECT_EQ(
-      MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE,
-      TestMemoryPressureMonitor::MemoryPressureLevelForMacMemoryPressureLevel(
-          3));
-  EXPECT_EQ(
-      MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE,
-      TestMemoryPressureMonitor::MemoryPressureLevelForMacMemoryPressureLevel(
-          5));
-  EXPECT_EQ(
-      MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE,
-      TestMemoryPressureMonitor::MemoryPressureLevelForMacMemoryPressureLevel(
-          -1));
-}
-
-TEST(MacMemoryPressureMonitorTest, CurrentMemoryPressure) {
-  TestMemoryPressureMonitor monitor;
-
-  MemoryPressureListener::MemoryPressureLevel memory_pressure =
-      monitor.GetCurrentPressureLevel();
-  EXPECT_TRUE(memory_pressure ==
-                  MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE ||
-              memory_pressure ==
-                  MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE ||
-              memory_pressure ==
-                  MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
-}
-
-TEST(MacMemoryPressureMonitorTest, MemoryPressureConversion) {
-  TestMemoryPressureMonitor monitor;
-
-  monitor.macos_pressure_level_for_testing_ = DISPATCH_MEMORYPRESSURE_NORMAL;
-  monitor.UpdatePressureLevel();
-  MemoryPressureListener::MemoryPressureLevel memory_pressure =
-      monitor.GetCurrentPressureLevel();
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE,
-            memory_pressure);
-
-  monitor.macos_pressure_level_for_testing_ = DISPATCH_MEMORYPRESSURE_WARN;
-  monitor.UpdatePressureLevel();
-  memory_pressure = monitor.GetCurrentPressureLevel();
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-            memory_pressure);
-
-  monitor.macos_pressure_level_for_testing_ = DISPATCH_MEMORYPRESSURE_CRITICAL;
-  monitor.UpdatePressureLevel();
-  memory_pressure = monitor.GetCurrentPressureLevel();
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL,
-            memory_pressure);
-}
-
-TEST(MacMemoryPressureMonitorTest, MemoryPressureRunLoopChecking) {
-  TestMemoryPressureMonitor monitor;
-
-  // To test grabbing the memory presure at the end of the run loop, we have to
-  // run the run loop, but to do that the run loop needs a run loop source. Add
-  // a timer as the source. We know that the exit observer is attached to
-  // the kMessageLoopExclusiveRunLoopMode mode, so use that mode.
-  ScopedCFTypeRef<CFRunLoopTimerRef> timer_ref(CFRunLoopTimerCreate(
-      NULL, CFAbsoluteTimeGetCurrent() + 10, 0, 0, 0, nullptr, nullptr));
-  CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer_ref,
-                    kMessageLoopExclusiveRunLoopMode);
-
-  monitor.macos_pressure_level_for_testing_ = DISPATCH_MEMORYPRESSURE_WARN;
-  monitor.ResetRunLoopUpdateTime();
-  CFRunLoopRunInMode(kMessageLoopExclusiveRunLoopMode, 0, true);
-  EXPECT_EQ(monitor.GetCurrentPressureLevel(),
-            MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
-
-  monitor.macos_pressure_level_for_testing_ = DISPATCH_MEMORYPRESSURE_CRITICAL;
-  monitor.ResetRunLoopUpdateTime();
-  CFRunLoopRunInMode(kMessageLoopExclusiveRunLoopMode, 0, true);
-  EXPECT_EQ(monitor.GetCurrentPressureLevel(),
-            MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
-
-  monitor.macos_pressure_level_for_testing_ = DISPATCH_MEMORYPRESSURE_NORMAL;
-  monitor.ResetRunLoopUpdateTime();
-  CFRunLoopRunInMode(kMessageLoopExclusiveRunLoopMode, 0, true);
-  EXPECT_EQ(monitor.GetCurrentPressureLevel(),
-            MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE);
-
-  CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), timer_ref,
-                       kMessageLoopExclusiveRunLoopMode);
-}
-
-TEST(MacMemoryPressureMonitorTest, RecordMemoryPressureStats) {
-  TestMemoryPressureMonitor monitor;
-  const char* kHistogram = "Memory.PressureLevel";
-  CFTimeInterval now = CFAbsoluteTimeGetCurrent();
-  const int seconds_per_tick =
-      TestMemoryPressureMonitor::GetSecondsPerUMATick();
-
-  // Set the initial pressure level.
-  monitor.macos_pressure_level_for_testing_ = DISPATCH_MEMORYPRESSURE_NORMAL;
-  // Incur one UMA tick of time (and include one extra second of elapsed time).
-  monitor.SetLastStatisticReportTime(now - (seconds_per_tick + 1));
-  monitor.UpdatePressureLevel();
-  monitor.tester.ExpectTotalCount(kHistogram, 1);
-  monitor.tester.ExpectBucketCount(kHistogram, 0, 1);
-  // The report time above included an extra second so there should be 1
-  // sub-tick second left over.
-  EXPECT_EQ(1, monitor.SubTickSeconds());
-
-  // Simulate sitting in normal pressure for 1 second less than 6 UMA tick
-  // seconds and then elevating to warning. With the left over sub-tick second
-  // from above, the total elapsed ticks should be an even 6 UMA ticks.
-  monitor.macos_pressure_level_for_testing_ = DISPATCH_MEMORYPRESSURE_WARN;
-  monitor.SetLastStatisticReportTime(now - (seconds_per_tick * 6 - 1));
-  monitor.UpdatePressureLevel();
-  monitor.tester.ExpectTotalCount(kHistogram, 7);
-  monitor.tester.ExpectBucketCount(kHistogram, 0, 7);
-  monitor.tester.ExpectBucketCount(kHistogram, 1, 0);
-  EXPECT_EQ(0, monitor.SubTickSeconds());
-
-  // Simulate sitting in warning pressure for 20 UMA ticks and 2 seconds, and
-  // then elevating to critical.
-  monitor.macos_pressure_level_for_testing_ = DISPATCH_MEMORYPRESSURE_CRITICAL;
-  monitor.SetLastStatisticReportTime(now - (20 * seconds_per_tick + 2));
-  monitor.UpdatePressureLevel();
-  monitor.tester.ExpectTotalCount(kHistogram, 27);
-  monitor.tester.ExpectBucketCount(kHistogram, 0, 7);
-  monitor.tester.ExpectBucketCount(kHistogram, 1, 20);
-  monitor.tester.ExpectBucketCount(kHistogram, 2, 0);
-  EXPECT_EQ(2, monitor.SubTickSeconds());
-
-  // A quick update while critical - the stats should not budge because less
-  // than 1 tick of time has elapsed.
-  monitor.macos_pressure_level_for_testing_ = DISPATCH_MEMORYPRESSURE_CRITICAL;
-  monitor.SetLastStatisticReportTime(now - 1);
-  monitor.UpdatePressureLevel();
-  monitor.tester.ExpectTotalCount(kHistogram, 27);
-  monitor.tester.ExpectBucketCount(kHistogram, 0, 7);
-  monitor.tester.ExpectBucketCount(kHistogram, 1, 20);
-  monitor.tester.ExpectBucketCount(kHistogram, 2, 0);
-  EXPECT_EQ(3, monitor.SubTickSeconds());
-
-  // A quick change back to normal. Less than 1 tick of time has elapsed, but
-  // in this case the pressure level changed, so the critical bucket should
-  // get another sample (otherwise we could miss quick level changes).
-  monitor.macos_pressure_level_for_testing_ = DISPATCH_MEMORYPRESSURE_NORMAL;
-  monitor.SetLastStatisticReportTime(now - 1);
-  monitor.UpdatePressureLevel();
-  monitor.tester.ExpectTotalCount(kHistogram, 28);
-  monitor.tester.ExpectBucketCount(kHistogram, 0, 7);
-  monitor.tester.ExpectBucketCount(kHistogram, 1, 20);
-  monitor.tester.ExpectBucketCount(kHistogram, 2, 1);
-  // When less than 1 tick of time has elapsed but the pressure level changed,
-  // the subtick remainder gets zeroed out.
-  EXPECT_EQ(0, monitor.SubTickSeconds());
-}
-}  // namespace mac
-}  // namespace base
diff --git a/base/memory/memory_pressure_monitor_unittest.cc b/base/memory/memory_pressure_monitor_unittest.cc
deleted file mode 100644
index e974741..0000000
--- a/base/memory/memory_pressure_monitor_unittest.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/memory_pressure_monitor.h"
-
-#include "base/macros.h"
-#include "base/memory/memory_pressure_listener.h"
-#include "base/test/histogram_tester.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(MemoryPressureMonitorTest, RecordMemoryPressure) {
-  base::HistogramTester tester;
-  const char* kHistogram = "Memory.PressureLevel";
-
-  MemoryPressureMonitor::RecordMemoryPressure(
-      MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE, 3);
-  tester.ExpectTotalCount(kHistogram, 3);
-  tester.ExpectBucketCount(kHistogram, 0, 3);
-
-  MemoryPressureMonitor::RecordMemoryPressure(
-      MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE, 2);
-  tester.ExpectTotalCount(kHistogram, 5);
-  tester.ExpectBucketCount(kHistogram, 1, 2);
-
-  MemoryPressureMonitor::RecordMemoryPressure(
-      MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL, 1);
-  tester.ExpectTotalCount(kHistogram, 6);
-  tester.ExpectBucketCount(kHistogram, 2, 1);
-}
-}  // namespace base
diff --git a/base/memory/memory_pressure_monitor_win_unittest.cc b/base/memory/memory_pressure_monitor_win_unittest.cc
deleted file mode 100644
index 1002a01..0000000
--- a/base/memory/memory_pressure_monitor_win_unittest.cc
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/memory_pressure_monitor_win.h"
-
-#include "base/macros.h"
-#include "base/memory/memory_pressure_listener.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-struct PressureSettings {
-  int phys_left_mb;
-  MemoryPressureListener::MemoryPressureLevel level;
-};
-
-}  // namespace
-
-// This is outside of the anonymous namespace so that it can be seen as a friend
-// to the monitor class.
-class TestMemoryPressureMonitor : public MemoryPressureMonitor {
- public:
-  using MemoryPressureMonitor::CalculateCurrentPressureLevel;
-  using MemoryPressureMonitor::CheckMemoryPressure;
-
-  static const DWORDLONG kMBBytes = 1024 * 1024;
-
-  explicit TestMemoryPressureMonitor(bool large_memory)
-      : mem_status_() {
-    // Generate a plausible amount of memory.
-    mem_status_.ullTotalPhys =
-        static_cast<DWORDLONG>(GenerateTotalMemoryMb(large_memory)) * kMBBytes;
-
-    // Rerun InferThresholds using the test fixture's GetSystemMemoryStatus.
-    InferThresholds();
-    // Stop the timer.
-    StopObserving();
-  }
-
-  TestMemoryPressureMonitor(int system_memory_mb,
-                            int moderate_threshold_mb,
-                            int critical_threshold_mb)
-      : MemoryPressureMonitor(moderate_threshold_mb, critical_threshold_mb),
-        mem_status_() {
-    // Set the amount of system memory.
-    mem_status_.ullTotalPhys = static_cast<DWORDLONG>(
-        system_memory_mb * kMBBytes);
-
-    // Stop the timer.
-    StopObserving();
-  }
-
-  virtual ~TestMemoryPressureMonitor() {}
-
-  MOCK_METHOD1(OnMemoryPressure,
-               void(MemoryPressureListener::MemoryPressureLevel level));
-
-  // Generates an amount of total memory that is consistent with the requested
-  // memory model.
-  int GenerateTotalMemoryMb(bool large_memory) {
-    int total_mb = 64;
-    while (total_mb < MemoryPressureMonitor::kLargeMemoryThresholdMb)
-      total_mb *= 2;
-    if (large_memory)
-      return total_mb * 2;
-    return total_mb / 2;
-  }
-
-  // Sets up the memory status to reflect the provided absolute memory left.
-  void SetMemoryFree(int phys_left_mb) {
-    // ullTotalPhys is set in the constructor and not modified.
-
-    // Set the amount of available memory.
-    mem_status_.ullAvailPhys =
-        static_cast<DWORDLONG>(phys_left_mb) * kMBBytes;
-    DCHECK_LT(mem_status_.ullAvailPhys, mem_status_.ullTotalPhys);
-
-    // These fields are unused.
-    mem_status_.dwMemoryLoad = 0;
-    mem_status_.ullTotalPageFile = 0;
-    mem_status_.ullAvailPageFile = 0;
-    mem_status_.ullTotalVirtual = 0;
-    mem_status_.ullAvailVirtual = 0;
-  }
-
-  void SetNone() {
-    SetMemoryFree(moderate_threshold_mb() + 1);
-  }
-
-  void SetModerate() {
-    SetMemoryFree(moderate_threshold_mb() - 1);
-  }
-
-  void SetCritical() {
-    SetMemoryFree(critical_threshold_mb() - 1);
-  }
-
- private:
-  bool GetSystemMemoryStatus(MEMORYSTATUSEX* mem_status) override {
-    // Simply copy the memory status set by the test fixture.
-    *mem_status = mem_status_;
-    return true;
-  }
-
-  MEMORYSTATUSEX mem_status_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestMemoryPressureMonitor);
-};
-
-class WinMemoryPressureMonitorTest : public testing::Test {
- protected:
-  void CalculateCurrentMemoryPressureLevelTest(
-      TestMemoryPressureMonitor* monitor) {
-
-    int mod = monitor->moderate_threshold_mb();
-    monitor->SetMemoryFree(mod + 1);
-    EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE,
-              monitor->CalculateCurrentPressureLevel());
-
-    monitor->SetMemoryFree(mod);
-    EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-              monitor->CalculateCurrentPressureLevel());
-
-    monitor->SetMemoryFree(mod - 1);
-    EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-              monitor->CalculateCurrentPressureLevel());
-
-    int crit = monitor->critical_threshold_mb();
-    monitor->SetMemoryFree(crit + 1);
-    EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-              monitor->CalculateCurrentPressureLevel());
-
-    monitor->SetMemoryFree(crit);
-    EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL,
-              monitor->CalculateCurrentPressureLevel());
-
-    monitor->SetMemoryFree(crit - 1);
-    EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL,
-              monitor->CalculateCurrentPressureLevel());
-  }
-
-  base::MessageLoopForUI message_loop_;
-};
-
-// Tests the fundamental direct calculation of memory pressure with automatic
-// small-memory thresholds.
-TEST_F(WinMemoryPressureMonitorTest, CalculateCurrentMemoryPressureLevelSmall) {
-  static const int kModerateMb =
-      MemoryPressureMonitor::kSmallMemoryDefaultModerateThresholdMb;
-  static const int kCriticalMb =
-      MemoryPressureMonitor::kSmallMemoryDefaultCriticalThresholdMb;
-
-  TestMemoryPressureMonitor monitor(false);  // Small-memory model.
-
-  EXPECT_EQ(kModerateMb, monitor.moderate_threshold_mb());
-  EXPECT_EQ(kCriticalMb, monitor.critical_threshold_mb());
-
-  ASSERT_NO_FATAL_FAILURE(CalculateCurrentMemoryPressureLevelTest(&monitor));
-}
-
-// Tests the fundamental direct calculation of memory pressure with automatic
-// large-memory thresholds.
-TEST_F(WinMemoryPressureMonitorTest, CalculateCurrentMemoryPressureLevelLarge) {
-  static const int kModerateMb =
-      MemoryPressureMonitor::kLargeMemoryDefaultModerateThresholdMb;
-  static const int kCriticalMb =
-      MemoryPressureMonitor::kLargeMemoryDefaultCriticalThresholdMb;
-
-  TestMemoryPressureMonitor monitor(true);  // Large-memory model.
-
-  EXPECT_EQ(kModerateMb, monitor.moderate_threshold_mb());
-  EXPECT_EQ(kCriticalMb, monitor.critical_threshold_mb());
-
-  ASSERT_NO_FATAL_FAILURE(CalculateCurrentMemoryPressureLevelTest(&monitor));
-}
-
-// Tests the fundamental direct calculation of memory pressure with manually
-// specified threshold levels.
-TEST_F(WinMemoryPressureMonitorTest,
-       CalculateCurrentMemoryPressureLevelCustom) {
-  static const int kSystemMb = 512;
-  static const int kModerateMb = 256;
-  static const int kCriticalMb = 128;
-
-  TestMemoryPressureMonitor monitor(kSystemMb, kModerateMb, kCriticalMb);
-
-  EXPECT_EQ(kModerateMb, monitor.moderate_threshold_mb());
-  EXPECT_EQ(kCriticalMb, monitor.critical_threshold_mb());
-
-  ASSERT_NO_FATAL_FAILURE(CalculateCurrentMemoryPressureLevelTest(&monitor));
-}
-
-// This test tests the various transition states from memory pressure, looking
-// for the correct behavior on event reposting as well as state updates.
-TEST_F(WinMemoryPressureMonitorTest, CheckMemoryPressure) {
-  // Large-memory.
-  testing::StrictMock<TestMemoryPressureMonitor> monitor(true);
-  MemoryPressureListener listener(
-      base::Bind(&TestMemoryPressureMonitor::OnMemoryPressure,
-                 base::Unretained(&monitor)));
-
-  // Checking the memory pressure at 0% load should not produce any
-  // events.
-  monitor.SetNone();
-  monitor.CheckMemoryPressure();
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE,
-            monitor.GetCurrentPressureLevel());
-
-  // Setting the memory level to 80% should produce a moderate pressure level.
-  EXPECT_CALL(monitor,
-              OnMemoryPressure(MemoryPressureListener::
-                                   MEMORY_PRESSURE_LEVEL_MODERATE));
-  monitor.SetModerate();
-  monitor.CheckMemoryPressure();
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-            monitor.GetCurrentPressureLevel());
-  testing::Mock::VerifyAndClearExpectations(&monitor);
-
-  // Check that the event gets reposted after a while.
-  for (int i = 0; i < monitor.kModeratePressureCooldownCycles; ++i) {
-    if (i + 1 == monitor.kModeratePressureCooldownCycles) {
-      EXPECT_CALL(monitor,
-                  OnMemoryPressure(MemoryPressureListener::
-                                       MEMORY_PRESSURE_LEVEL_MODERATE));
-    }
-    monitor.CheckMemoryPressure();
-    RunLoop().RunUntilIdle();
-    EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-              monitor.GetCurrentPressureLevel());
-    testing::Mock::VerifyAndClearExpectations(&monitor);
-  }
-
-  // Setting the memory usage to 99% should produce critical levels.
-  EXPECT_CALL(monitor,
-              OnMemoryPressure(MemoryPressureListener::
-                                   MEMORY_PRESSURE_LEVEL_CRITICAL));
-  monitor.SetCritical();
-  monitor.CheckMemoryPressure();
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL,
-            monitor.GetCurrentPressureLevel());
-  testing::Mock::VerifyAndClearExpectations(&monitor);
-
-  // Calling it again should immediately produce a second call.
-  EXPECT_CALL(monitor,
-              OnMemoryPressure(MemoryPressureListener::
-                                   MEMORY_PRESSURE_LEVEL_CRITICAL));
-  monitor.CheckMemoryPressure();
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL,
-            monitor.GetCurrentPressureLevel());
-  testing::Mock::VerifyAndClearExpectations(&monitor);
-
-  // When lowering the pressure again there should be a notification and the
-  // pressure should go back to moderate.
-  EXPECT_CALL(monitor,
-              OnMemoryPressure(MemoryPressureListener::
-                                   MEMORY_PRESSURE_LEVEL_MODERATE));
-  monitor.SetModerate();
-  monitor.CheckMemoryPressure();
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-            monitor.GetCurrentPressureLevel());
-  testing::Mock::VerifyAndClearExpectations(&monitor);
-
-  // Check that the event gets reposted after a while.
-  for (int i = 0; i < monitor.kModeratePressureCooldownCycles; ++i) {
-    if (i + 1 == monitor.kModeratePressureCooldownCycles) {
-      EXPECT_CALL(monitor,
-                  OnMemoryPressure(MemoryPressureListener::
-                                       MEMORY_PRESSURE_LEVEL_MODERATE));
-    }
-    monitor.CheckMemoryPressure();
-    RunLoop().RunUntilIdle();
-    EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
-              monitor.GetCurrentPressureLevel());
-    testing::Mock::VerifyAndClearExpectations(&monitor);
-  }
-
-  // Going down to no pressure should not produce an notification.
-  monitor.SetNone();
-  monitor.CheckMemoryPressure();
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE,
-            monitor.GetCurrentPressureLevel());
-  testing::Mock::VerifyAndClearExpectations(&monitor);
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/memory/platform_shared_memory_region_unittest.cc b/base/memory/platform_shared_memory_region_unittest.cc
deleted file mode 100644
index f4d3071..0000000
--- a/base/memory/platform_shared_memory_region_unittest.cc
+++ /dev/null
@@ -1,288 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/platform_shared_memory_region.h"
-
-#include "base/memory/shared_memory_mapping.h"
-#include "base/process/process_metrics.h"
-#include "base/sys_info.h"
-#include "base/test/gtest_util.h"
-#include "base/test/test_shared_memory_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include <mach/mach_vm.h>
-#endif
-
-namespace base {
-namespace subtle {
-
-const size_t kRegionSize = 1024;
-
-class PlatformSharedMemoryRegionTest : public ::testing::Test {};
-
-// Tests that a default constructed region is invalid and produces invalid
-// mappings.
-TEST_F(PlatformSharedMemoryRegionTest, DefaultConstructedRegionIsInvalid) {
-  PlatformSharedMemoryRegion region;
-  EXPECT_FALSE(region.IsValid());
-  WritableSharedMemoryMapping mapping = MapForTesting(&region);
-  EXPECT_FALSE(mapping.IsValid());
-  PlatformSharedMemoryRegion duplicate = region.Duplicate();
-  EXPECT_FALSE(duplicate.IsValid());
-  EXPECT_FALSE(region.ConvertToReadOnly());
-}
-
-// Tests that creating a region of 0 size returns an invalid region.
-TEST_F(PlatformSharedMemoryRegionTest, CreateRegionOfZeroSizeIsInvalid) {
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(0);
-  EXPECT_FALSE(region.IsValid());
-
-  PlatformSharedMemoryRegion region2 =
-      PlatformSharedMemoryRegion::CreateUnsafe(0);
-  EXPECT_FALSE(region2.IsValid());
-}
-
-// Tests that creating a region of size bigger than the integer max value
-// returns an invalid region.
-TEST_F(PlatformSharedMemoryRegionTest, CreateTooLargeRegionIsInvalid) {
-  size_t too_large_region_size =
-      static_cast<size_t>(std::numeric_limits<int>::max()) + 1;
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(too_large_region_size);
-  EXPECT_FALSE(region.IsValid());
-
-  PlatformSharedMemoryRegion region2 =
-      PlatformSharedMemoryRegion::CreateUnsafe(too_large_region_size);
-  EXPECT_FALSE(region2.IsValid());
-}
-
-// Tests that regions consistently report their size as the size requested at
-// creation time even if their allocation size is larger due to platform
-// constraints.
-TEST_F(PlatformSharedMemoryRegionTest, ReportedSizeIsRequestedSize) {
-  constexpr size_t kTestSizes[] = {1, 2, 3, 64, 4096, 1024 * 1024};
-  for (size_t size : kTestSizes) {
-    PlatformSharedMemoryRegion region =
-        PlatformSharedMemoryRegion::CreateWritable(size);
-    EXPECT_EQ(region.GetSize(), size);
-
-    region.ConvertToReadOnly();
-    EXPECT_EQ(region.GetSize(), size);
-  }
-}
-
-// Tests that the platform-specific handle converted to read-only cannot be used
-// to perform a writable mapping with low-level system APIs like mmap().
-TEST_F(PlatformSharedMemoryRegionTest, ReadOnlyHandleIsNotWritable) {
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  EXPECT_TRUE(region.ConvertToReadOnly());
-  EXPECT_EQ(region.GetMode(), PlatformSharedMemoryRegion::Mode::kReadOnly);
-  EXPECT_TRUE(
-      CheckReadOnlyPlatformSharedMemoryRegionForTesting(std::move(region)));
-}
-
-// Tests that the PassPlatformHandle() call invalidates the region.
-TEST_F(PlatformSharedMemoryRegionTest, InvalidAfterPass) {
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  ignore_result(region.PassPlatformHandle());
-  EXPECT_FALSE(region.IsValid());
-}
-
-// Tests that the region is invalid after move.
-TEST_F(PlatformSharedMemoryRegionTest, InvalidAfterMove) {
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  PlatformSharedMemoryRegion moved_region = std::move(region);
-  EXPECT_FALSE(region.IsValid());
-  EXPECT_TRUE(moved_region.IsValid());
-}
-
-// Tests that calling Take() with the size parameter equal to zero returns an
-// invalid region.
-TEST_F(PlatformSharedMemoryRegionTest, TakeRegionOfZeroSizeIsInvalid) {
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  PlatformSharedMemoryRegion region2 = PlatformSharedMemoryRegion::Take(
-      region.PassPlatformHandle(), region.GetMode(), 0, region.GetGUID());
-  EXPECT_FALSE(region2.IsValid());
-}
-
-// Tests that calling Take() with the size parameter bigger than the integer max
-// value returns an invalid region.
-TEST_F(PlatformSharedMemoryRegionTest, TakeTooLargeRegionIsInvalid) {
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  PlatformSharedMemoryRegion region2 = PlatformSharedMemoryRegion::Take(
-      region.PassPlatformHandle(), region.GetMode(),
-      static_cast<size_t>(std::numeric_limits<int>::max()) + 1,
-      region.GetGUID());
-  EXPECT_FALSE(region2.IsValid());
-}
-
-// Tests that mapping bytes out of the region limits fails.
-TEST_F(PlatformSharedMemoryRegionTest, MapAtOutOfTheRegionLimitsTest) {
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  WritableSharedMemoryMapping mapping =
-      MapAtForTesting(&region, 0, region.GetSize() + 1);
-  EXPECT_FALSE(mapping.IsValid());
-}
-
-// Tests that mapping with a size and offset causing overflow fails.
-TEST_F(PlatformSharedMemoryRegionTest, MapAtWithOverflowTest) {
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(
-          SysInfo::VMAllocationGranularity() * 2);
-  ASSERT_TRUE(region.IsValid());
-  size_t size = std::numeric_limits<size_t>::max();
-  size_t offset = SysInfo::VMAllocationGranularity();
-  // |size| + |offset| should be below the region size due to overflow but
-  // mapping a region with these parameters should be invalid.
-  EXPECT_LT(size + offset, region.GetSize());
-  WritableSharedMemoryMapping mapping = MapAtForTesting(&region, offset, size);
-  EXPECT_FALSE(mapping.IsValid());
-}
-
-#if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_FUCHSIA) && \
-    !defined(OS_MACOSX)
-// Tests that the second handle is closed after a conversion to read-only on
-// POSIX.
-TEST_F(PlatformSharedMemoryRegionTest,
-       ConvertToReadOnlyInvalidatesSecondHandle) {
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  ASSERT_TRUE(region.ConvertToReadOnly());
-  FDPair fds = region.GetPlatformHandle();
-  EXPECT_LT(fds.readonly_fd, 0);
-}
-#endif
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-// Tests that protection bits are set correctly for read-only region on MacOS.
-TEST_F(PlatformSharedMemoryRegionTest, MapCurrentAndMaxProtectionSetCorrectly) {
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  ASSERT_TRUE(region.ConvertToReadOnly());
-  WritableSharedMemoryMapping ro_mapping = MapForTesting(&region);
-  ASSERT_TRUE(ro_mapping.IsValid());
-
-  vm_region_basic_info_64 basic_info;
-  mach_vm_size_t dummy_size = 0;
-  void* temp_addr = ro_mapping.memory();
-  MachVMRegionResult result = GetBasicInfo(
-      mach_task_self(), &dummy_size,
-      reinterpret_cast<mach_vm_address_t*>(&temp_addr), &basic_info);
-  EXPECT_EQ(result, MachVMRegionResult::Success);
-  EXPECT_EQ(basic_info.protection & VM_PROT_ALL, VM_PROT_READ);
-  EXPECT_EQ(basic_info.max_protection & VM_PROT_ALL, VM_PROT_READ);
-}
-#endif
-
-// Tests that platform handle permissions are checked correctly.
-TEST_F(PlatformSharedMemoryRegionTest,
-       CheckPlatformHandlePermissionsCorrespondToMode) {
-  using Mode = PlatformSharedMemoryRegion::Mode;
-  auto check = [](const PlatformSharedMemoryRegion& region,
-                  PlatformSharedMemoryRegion::Mode mode) {
-    return PlatformSharedMemoryRegion::
-        CheckPlatformHandlePermissionsCorrespondToMode(
-            region.GetPlatformHandle(), mode, region.GetSize());
-  };
-
-  // Check kWritable region.
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  EXPECT_TRUE(check(region, Mode::kWritable));
-  EXPECT_FALSE(check(region, Mode::kReadOnly));
-
-  // Check kReadOnly region.
-  ASSERT_TRUE(region.ConvertToReadOnly());
-  EXPECT_TRUE(check(region, Mode::kReadOnly));
-  EXPECT_FALSE(check(region, Mode::kWritable));
-  EXPECT_FALSE(check(region, Mode::kUnsafe));
-
-  // Check kUnsafe region.
-  PlatformSharedMemoryRegion region2 =
-      PlatformSharedMemoryRegion::CreateUnsafe(kRegionSize);
-  ASSERT_TRUE(region2.IsValid());
-  EXPECT_TRUE(check(region2, Mode::kUnsafe));
-  EXPECT_FALSE(check(region2, Mode::kReadOnly));
-}
-
-// Tests that it's impossible to create read-only platform shared memory region.
-TEST_F(PlatformSharedMemoryRegionTest, CreateReadOnlyRegionDeathTest) {
-#ifdef OFFICIAL_BUILD
-  // The official build does not print the reason a CHECK failed.
-  const char kErrorRegex[] = "";
-#else
-  const char kErrorRegex[] =
-      "Creating a region in read-only mode will lead to this region being "
-      "non-modifiable";
-#endif
-  EXPECT_DEATH_IF_SUPPORTED(
-      PlatformSharedMemoryRegion::Create(
-          PlatformSharedMemoryRegion::Mode::kReadOnly, kRegionSize),
-      kErrorRegex);
-}
-
-// Tests that it's prohibited to duplicate a writable region.
-TEST_F(PlatformSharedMemoryRegionTest, DuplicateWritableRegionDeathTest) {
-#ifdef OFFICIAL_BUILD
-  const char kErrorRegex[] = "";
-#else
-  const char kErrorRegex[] =
-      "Duplicating a writable shared memory region is prohibited";
-#endif
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  EXPECT_DEATH_IF_SUPPORTED(region.Duplicate(), kErrorRegex);
-}
-
-// Tests that it's prohibited to convert an unsafe region to read-only.
-TEST_F(PlatformSharedMemoryRegionTest, UnsafeRegionConvertToReadOnlyDeathTest) {
-#ifdef OFFICIAL_BUILD
-  const char kErrorRegex[] = "";
-#else
-  const char kErrorRegex[] =
-      "Only writable shared memory region can be converted to read-only";
-#endif
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateUnsafe(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  EXPECT_DEATH_IF_SUPPORTED(region.ConvertToReadOnly(), kErrorRegex);
-}
-
-// Tests that it's prohibited to convert a read-only region to read-only.
-TEST_F(PlatformSharedMemoryRegionTest,
-       ReadOnlyRegionConvertToReadOnlyDeathTest) {
-#ifdef OFFICIAL_BUILD
-  const char kErrorRegex[] = "";
-#else
-  const char kErrorRegex[] =
-      "Only writable shared memory region can be converted to read-only";
-#endif
-  PlatformSharedMemoryRegion region =
-      PlatformSharedMemoryRegion::CreateWritable(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  EXPECT_TRUE(region.ConvertToReadOnly());
-  EXPECT_DEATH_IF_SUPPORTED(region.ConvertToReadOnly(), kErrorRegex);
-}
-
-}  // namespace subtle
-}  // namespace base
diff --git a/base/memory/protected_memory_unittest.cc b/base/memory/protected_memory_unittest.cc
deleted file mode 100644
index b6ec61d..0000000
--- a/base/memory/protected_memory_unittest.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/protected_memory.h"
-#include "base/memory/protected_memory_cfi.h"
-#include "base/synchronization/lock.h"
-#include "base/test/gtest_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-struct Data {
-  Data() = default;
-  Data(int foo_) : foo(foo_) {}
-  int foo;
-};
-
-}  // namespace
-
-class ProtectedMemoryTest : public ::testing::Test {
- protected:
-  // Run tests one at a time. Some of the negative tests can not be made thread
-  // safe.
-  void SetUp() final { lock.Acquire(); }
-  void TearDown() final { lock.Release(); }
-
-  Lock lock;
-};
-
-PROTECTED_MEMORY_SECTION ProtectedMemory<int> init;
-
-TEST_F(ProtectedMemoryTest, Initializer) {
-  static ProtectedMemory<int>::Initializer I(&init, 4);
-  EXPECT_EQ(*init, 4);
-}
-
-PROTECTED_MEMORY_SECTION ProtectedMemory<Data> data;
-
-TEST_F(ProtectedMemoryTest, Basic) {
-  AutoWritableMemory writer = AutoWritableMemory::Create(data);
-  data->foo = 5;
-  EXPECT_EQ(data->foo, 5);
-}
-
-#if defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
-
-#if PROTECTED_MEMORY_ENABLED
-TEST_F(ProtectedMemoryTest, ReadOnlyOnStart) {
-  EXPECT_DEATH({ data->foo = 6; AutoWritableMemory::Create(data); }, "");
-}
-
-TEST_F(ProtectedMemoryTest, ReadOnlyAfterSetWritable) {
-  { AutoWritableMemory writer = AutoWritableMemory::Create(data); }
-  EXPECT_DEATH({ data->foo = 7; }, "");
-}
-
-TEST_F(ProtectedMemoryTest, AssertMemoryIsReadOnly) {
-  AssertMemoryIsReadOnly(&data->foo);
-  { AutoWritableMemory::Create(data); }
-  AssertMemoryIsReadOnly(&data->foo);
-
-  ProtectedMemory<Data> writable_data;
-  EXPECT_DCHECK_DEATH({ AssertMemoryIsReadOnly(&writable_data->foo); });
-}
-
-TEST_F(ProtectedMemoryTest, FailsIfDefinedOutsideOfProtectMemoryRegion) {
-  ProtectedMemory<Data> data;
-  EXPECT_DCHECK_DEATH({ AutoWritableMemory::Create(data); });
-}
-
-TEST_F(ProtectedMemoryTest, UnsanitizedCfiCallOutsideOfProtectedMemoryRegion) {
-  ProtectedMemory<void (*)(void)> data;
-  EXPECT_DCHECK_DEATH({ UnsanitizedCfiCall(data)(); });
-}
-#endif  // PROTECTED_MEMORY_ENABLED
-
-namespace {
-
-struct BadIcall {
-  BadIcall() = default;
-  BadIcall(int (*fp_)(int)) : fp(fp_) {}
-  int (*fp)(int);
-};
-
-unsigned int bad_icall(int i) {
-  return 4 + i;
-}
-
-}  // namespace
-
-PROTECTED_MEMORY_SECTION ProtectedMemory<BadIcall> icall_pm1;
-
-TEST_F(ProtectedMemoryTest, BadMemberCall) {
-  static ProtectedMemory<BadIcall>::Initializer I(
-      &icall_pm1, BadIcall(reinterpret_cast<int (*)(int)>(&bad_icall)));
-
-  EXPECT_EQ(UnsanitizedCfiCall(icall_pm1, &BadIcall::fp)(1), 5);
-  EXPECT_EQ(icall_pm1->fp(1), 5);
-}
-
-PROTECTED_MEMORY_SECTION ProtectedMemory<int (*)(int)> icall_pm2;
-
-TEST_F(ProtectedMemoryTest, BadFnPtrCall) {
-  static ProtectedMemory<int (*)(int)>::Initializer I(
-      &icall_pm2, reinterpret_cast<int (*)(int)>(&bad_icall));
-
-  EXPECT_EQ(UnsanitizedCfiCall(icall_pm2)(1), 5);
-  EXPECT_EQ((*icall_pm2)(1), 5);
-}
-
-#endif  // defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
-
-}  // namespace base
diff --git a/base/memory/ptr_util_unittest.cc b/base/memory/ptr_util_unittest.cc
deleted file mode 100644
index 3fa40d8..0000000
--- a/base/memory/ptr_util_unittest.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/ptr_util.h"
-
-#include <stddef.h>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class DeleteCounter {
- public:
-  DeleteCounter() { ++count_; }
-  ~DeleteCounter() { --count_; }
-
-  static size_t count() { return count_; }
-
- private:
-  static size_t count_;
-};
-
-size_t DeleteCounter::count_ = 0;
-
-}  // namespace
-
-TEST(PtrUtilTest, WrapUnique) {
-  EXPECT_EQ(0u, DeleteCounter::count());
-  DeleteCounter* counter = new DeleteCounter;
-  EXPECT_EQ(1u, DeleteCounter::count());
-  std::unique_ptr<DeleteCounter> owned_counter = WrapUnique(counter);
-  EXPECT_EQ(1u, DeleteCounter::count());
-  owned_counter.reset();
-  EXPECT_EQ(0u, DeleteCounter::count());
-}
-
-}  // namespace base
diff --git a/base/memory/ref_counted_memory_unittest.cc b/base/memory/ref_counted_memory_unittest.cc
deleted file mode 100644
index b7498f9..0000000
--- a/base/memory/ref_counted_memory_unittest.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/ref_counted_memory.h"
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/memory/read_only_shared_memory_region.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using testing::Each;
-using testing::ElementsAre;
-
-namespace base {
-
-TEST(RefCountedMemoryUnitTest, RefCountedStaticMemory) {
-  auto mem = MakeRefCounted<RefCountedStaticMemory>("static mem00", 10);
-
-  EXPECT_EQ(10U, mem->size());
-  EXPECT_EQ("static mem", std::string(mem->front_as<char>(), mem->size()));
-}
-
-TEST(RefCountedMemoryUnitTest, RefCountedBytes) {
-  std::vector<uint8_t> data;
-  data.push_back(45);
-  data.push_back(99);
-  scoped_refptr<RefCountedMemory> mem = RefCountedBytes::TakeVector(&data);
-
-  EXPECT_EQ(0U, data.size());
-
-  ASSERT_EQ(2U, mem->size());
-  EXPECT_EQ(45U, mem->front()[0]);
-  EXPECT_EQ(99U, mem->front()[1]);
-
-  scoped_refptr<RefCountedMemory> mem2;
-  {
-    const unsigned char kData[] = {12, 11, 99};
-    mem2 = MakeRefCounted<RefCountedBytes>(kData, arraysize(kData));
-  }
-  ASSERT_EQ(3U, mem2->size());
-  EXPECT_EQ(12U, mem2->front()[0]);
-  EXPECT_EQ(11U, mem2->front()[1]);
-  EXPECT_EQ(99U, mem2->front()[2]);
-}
-
-TEST(RefCountedMemoryUnitTest, RefCountedBytesMutable) {
-  auto mem = base::MakeRefCounted<RefCountedBytes>(10);
-
-  ASSERT_EQ(10U, mem->size());
-  EXPECT_THAT(mem->data(), Each(0U));
-
-  // Test non-const versions of data(), front() and front_as<>().
-  mem->data()[0] = 1;
-  mem->front()[1] = 2;
-  mem->front_as<char>()[2] = 3;
-
-  EXPECT_THAT(mem->data(), ElementsAre(1, 2, 3, 0, 0, 0, 0, 0, 0, 0));
-}
-
-TEST(RefCountedMemoryUnitTest, RefCountedString) {
-  std::string s("destroy me");
-  scoped_refptr<RefCountedMemory> mem = RefCountedString::TakeString(&s);
-
-  EXPECT_EQ(0U, s.size());
-
-  ASSERT_EQ(10U, mem->size());
-  EXPECT_EQ('d', mem->front()[0]);
-  EXPECT_EQ('e', mem->front()[1]);
-  EXPECT_EQ('e', mem->front()[9]);
-}
-
-TEST(RefCountedMemoryUnitTest, RefCountedSharedMemory) {
-  static const char kData[] = "shm_dummy_data";
-  auto shm = std::make_unique<SharedMemory>();
-  ASSERT_TRUE(shm->CreateAndMapAnonymous(sizeof(kData)));
-  memcpy(shm->memory(), kData, sizeof(kData));
-
-  auto mem =
-      MakeRefCounted<RefCountedSharedMemory>(std::move(shm), sizeof(kData));
-  ASSERT_EQ(sizeof(kData), mem->size());
-  EXPECT_EQ('s', mem->front()[0]);
-  EXPECT_EQ('h', mem->front()[1]);
-  EXPECT_EQ('_', mem->front()[9]);
-}
-
-TEST(RefCountedMemoryUnitTest, RefCountedSharedMemoryMapping) {
-  static const char kData[] = "mem_region_dummy_data";
-  scoped_refptr<RefCountedSharedMemoryMapping> mem;
-  {
-    MappedReadOnlyRegion region =
-        ReadOnlySharedMemoryRegion::Create(sizeof(kData));
-    ReadOnlySharedMemoryMapping ro_mapping = region.region.Map();
-    WritableSharedMemoryMapping rw_mapping = std::move(region.mapping);
-    ASSERT_TRUE(rw_mapping.IsValid());
-    memcpy(rw_mapping.memory(), kData, sizeof(kData));
-    mem = MakeRefCounted<RefCountedSharedMemoryMapping>(std::move(ro_mapping));
-  }
-
-  ASSERT_LE(sizeof(kData), mem->size());
-  EXPECT_EQ('e', mem->front()[1]);
-  EXPECT_EQ('m', mem->front()[2]);
-  EXPECT_EQ('o', mem->front()[8]);
-
-  {
-    MappedReadOnlyRegion region =
-        ReadOnlySharedMemoryRegion::Create(sizeof(kData));
-    WritableSharedMemoryMapping rw_mapping = std::move(region.mapping);
-    ASSERT_TRUE(rw_mapping.IsValid());
-    memcpy(rw_mapping.memory(), kData, sizeof(kData));
-    mem = RefCountedSharedMemoryMapping::CreateFromWholeRegion(region.region);
-  }
-
-  ASSERT_LE(sizeof(kData), mem->size());
-  EXPECT_EQ('_', mem->front()[3]);
-  EXPECT_EQ('r', mem->front()[4]);
-  EXPECT_EQ('i', mem->front()[7]);
-}
-
-TEST(RefCountedMemoryUnitTest, Equals) {
-  std::string s1("same");
-  scoped_refptr<RefCountedMemory> mem1 = RefCountedString::TakeString(&s1);
-
-  std::vector<unsigned char> d2 = {'s', 'a', 'm', 'e'};
-  scoped_refptr<RefCountedMemory> mem2 = RefCountedBytes::TakeVector(&d2);
-
-  EXPECT_TRUE(mem1->Equals(mem2));
-
-  std::string s3("diff");
-  scoped_refptr<RefCountedMemory> mem3 = RefCountedString::TakeString(&s3);
-
-  EXPECT_FALSE(mem1->Equals(mem3));
-  EXPECT_FALSE(mem2->Equals(mem3));
-}
-
-TEST(RefCountedMemoryUnitTest, EqualsNull) {
-  std::string s("str");
-  scoped_refptr<RefCountedMemory> mem = RefCountedString::TakeString(&s);
-  EXPECT_FALSE(mem->Equals(nullptr));
-}
-
-}  //  namespace base
diff --git a/base/memory/ref_counted_unittest.cc b/base/memory/ref_counted_unittest.cc
deleted file mode 100644
index d88fc54..0000000
--- a/base/memory/ref_counted_unittest.cc
+++ /dev/null
@@ -1,606 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/ref_counted.h"
-
-#include <type_traits>
-#include <utility>
-
-#include "base/test/gtest_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-class SelfAssign : public base::RefCounted<SelfAssign> {
- protected:
-  virtual ~SelfAssign() = default;
-
- private:
-  friend class base::RefCounted<SelfAssign>;
-};
-
-class Derived : public SelfAssign {
- protected:
-  ~Derived() override = default;
-
- private:
-  friend class base::RefCounted<Derived>;
-};
-
-class CheckDerivedMemberAccess : public scoped_refptr<SelfAssign> {
- public:
-  CheckDerivedMemberAccess() {
-    // This shouldn't compile if we don't have access to the member variable.
-    SelfAssign** pptr = &ptr_;
-    EXPECT_EQ(*pptr, ptr_);
-  }
-};
-
-class ScopedRefPtrToSelf : public base::RefCounted<ScopedRefPtrToSelf> {
- public:
-  ScopedRefPtrToSelf() : self_ptr_(this) {}
-
-  static bool was_destroyed() { return was_destroyed_; }
-
-  static void reset_was_destroyed() { was_destroyed_ = false; }
-
-  scoped_refptr<ScopedRefPtrToSelf> self_ptr_;
-
- private:
-  friend class base::RefCounted<ScopedRefPtrToSelf>;
-  ~ScopedRefPtrToSelf() { was_destroyed_ = true; }
-
-  static bool was_destroyed_;
-};
-
-bool ScopedRefPtrToSelf::was_destroyed_ = false;
-
-class ScopedRefPtrCountBase : public base::RefCounted<ScopedRefPtrCountBase> {
- public:
-  ScopedRefPtrCountBase() { ++constructor_count_; }
-
-  static int constructor_count() { return constructor_count_; }
-
-  static int destructor_count() { return destructor_count_; }
-
-  static void reset_count() {
-    constructor_count_ = 0;
-    destructor_count_ = 0;
-  }
-
- protected:
-  virtual ~ScopedRefPtrCountBase() { ++destructor_count_; }
-
- private:
-  friend class base::RefCounted<ScopedRefPtrCountBase>;
-
-  static int constructor_count_;
-  static int destructor_count_;
-};
-
-int ScopedRefPtrCountBase::constructor_count_ = 0;
-int ScopedRefPtrCountBase::destructor_count_ = 0;
-
-class ScopedRefPtrCountDerived : public ScopedRefPtrCountBase {
- public:
-  ScopedRefPtrCountDerived() { ++constructor_count_; }
-
-  static int constructor_count() { return constructor_count_; }
-
-  static int destructor_count() { return destructor_count_; }
-
-  static void reset_count() {
-    constructor_count_ = 0;
-    destructor_count_ = 0;
-  }
-
- protected:
-  ~ScopedRefPtrCountDerived() override { ++destructor_count_; }
-
- private:
-  friend class base::RefCounted<ScopedRefPtrCountDerived>;
-
-  static int constructor_count_;
-  static int destructor_count_;
-};
-
-int ScopedRefPtrCountDerived::constructor_count_ = 0;
-int ScopedRefPtrCountDerived::destructor_count_ = 0;
-
-class Other : public base::RefCounted<Other> {
- private:
-  friend class base::RefCounted<Other>;
-
-  ~Other() = default;
-};
-
-class HasPrivateDestructorWithDeleter;
-
-struct Deleter {
-  static void Destruct(const HasPrivateDestructorWithDeleter* x);
-};
-
-class HasPrivateDestructorWithDeleter
-    : public base::RefCounted<HasPrivateDestructorWithDeleter, Deleter> {
- public:
-  HasPrivateDestructorWithDeleter() = default;
-
- private:
-  friend struct Deleter;
-  ~HasPrivateDestructorWithDeleter() = default;
-};
-
-void Deleter::Destruct(const HasPrivateDestructorWithDeleter* x) {
-  delete x;
-}
-
-scoped_refptr<Other> Overloaded(scoped_refptr<Other> other) {
-  return other;
-}
-
-scoped_refptr<SelfAssign> Overloaded(scoped_refptr<SelfAssign> self_assign) {
-  return self_assign;
-}
-
-class InitialRefCountIsOne : public base::RefCounted<InitialRefCountIsOne> {
- public:
-  REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE();
-
-  InitialRefCountIsOne() = default;
-
- private:
-  friend class base::RefCounted<InitialRefCountIsOne>;
-  ~InitialRefCountIsOne() = default;
-};
-
-}  // end namespace
-
-TEST(RefCountedUnitTest, TestSelfAssignment) {
-  SelfAssign* p = new SelfAssign;
-  scoped_refptr<SelfAssign> var(p);
-  var = *&var;  // The *& defeats Clang's -Wself-assign warning.
-  EXPECT_EQ(var.get(), p);
-  var = std::move(var);
-  EXPECT_EQ(var.get(), p);
-  var.swap(var);
-  EXPECT_EQ(var.get(), p);
-  swap(var, var);
-  EXPECT_EQ(var.get(), p);
-}
-
-TEST(RefCountedUnitTest, ScopedRefPtrMemberAccess) {
-  CheckDerivedMemberAccess check;
-}
-
-TEST(RefCountedUnitTest, ScopedRefPtrToSelfPointerAssignment) {
-  ScopedRefPtrToSelf::reset_was_destroyed();
-
-  ScopedRefPtrToSelf* check = new ScopedRefPtrToSelf();
-  EXPECT_FALSE(ScopedRefPtrToSelf::was_destroyed());
-  check->self_ptr_ = nullptr;
-  EXPECT_TRUE(ScopedRefPtrToSelf::was_destroyed());
-}
-
-TEST(RefCountedUnitTest, ScopedRefPtrToSelfMoveAssignment) {
-  ScopedRefPtrToSelf::reset_was_destroyed();
-
-  ScopedRefPtrToSelf* check = new ScopedRefPtrToSelf();
-  EXPECT_FALSE(ScopedRefPtrToSelf::was_destroyed());
-  // Releasing |check->self_ptr_| will delete |check|.
-  // The move assignment operator must assign |check->self_ptr_| first then
-  // release |check->self_ptr_|.
-  check->self_ptr_ = scoped_refptr<ScopedRefPtrToSelf>();
-  EXPECT_TRUE(ScopedRefPtrToSelf::was_destroyed());
-}
-
-TEST(RefCountedUnitTest, BooleanTesting) {
-  scoped_refptr<SelfAssign> ptr_to_an_instance = new SelfAssign;
-  EXPECT_TRUE(ptr_to_an_instance);
-  EXPECT_FALSE(!ptr_to_an_instance);
-
-  if (ptr_to_an_instance) {
-  } else {
-    ADD_FAILURE() << "Pointer to an instance should result in true.";
-  }
-
-  if (!ptr_to_an_instance) {  // check for operator!().
-    ADD_FAILURE() << "Pointer to an instance should result in !x being false.";
-  }
-
-  scoped_refptr<SelfAssign> null_ptr;
-  EXPECT_FALSE(null_ptr);
-  EXPECT_TRUE(!null_ptr);
-
-  if (null_ptr) {
-    ADD_FAILURE() << "Null pointer should result in false.";
-  }
-
-  if (!null_ptr) {  // check for operator!().
-  } else {
-    ADD_FAILURE() << "Null pointer should result in !x being true.";
-  }
-}
-
-TEST(RefCountedUnitTest, Equality) {
-  scoped_refptr<SelfAssign> p1(new SelfAssign);
-  scoped_refptr<SelfAssign> p2(new SelfAssign);
-
-  EXPECT_EQ(p1, p1);
-  EXPECT_EQ(p2, p2);
-
-  EXPECT_NE(p1, p2);
-  EXPECT_NE(p2, p1);
-}
-
-TEST(RefCountedUnitTest, NullptrEquality) {
-  scoped_refptr<SelfAssign> ptr_to_an_instance(new SelfAssign);
-  scoped_refptr<SelfAssign> ptr_to_nullptr;
-
-  EXPECT_NE(nullptr, ptr_to_an_instance);
-  EXPECT_NE(ptr_to_an_instance, nullptr);
-  EXPECT_EQ(nullptr, ptr_to_nullptr);
-  EXPECT_EQ(ptr_to_nullptr, nullptr);
-}
-
-TEST(RefCountedUnitTest, ConvertibleEquality) {
-  scoped_refptr<Derived> p1(new Derived);
-  scoped_refptr<SelfAssign> p2;
-
-  EXPECT_NE(p1, p2);
-  EXPECT_NE(p2, p1);
-
-  p2 = p1;
-
-  EXPECT_EQ(p1, p2);
-  EXPECT_EQ(p2, p1);
-}
-
-TEST(RefCountedUnitTest, MoveAssignment1) {
-  ScopedRefPtrCountBase::reset_count();
-
-  {
-    ScopedRefPtrCountBase *raw = new ScopedRefPtrCountBase();
-    scoped_refptr<ScopedRefPtrCountBase> p1(raw);
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-    {
-      scoped_refptr<ScopedRefPtrCountBase> p2;
-
-      p2 = std::move(p1);
-      EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-      EXPECT_EQ(nullptr, p1.get());
-      EXPECT_EQ(raw, p2.get());
-
-      // p2 goes out of scope.
-    }
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-
-    // p1 goes out of scope.
-  }
-  EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-  EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-}
-
-TEST(RefCountedUnitTest, MoveAssignment2) {
-  ScopedRefPtrCountBase::reset_count();
-
-  {
-    ScopedRefPtrCountBase *raw = new ScopedRefPtrCountBase();
-    scoped_refptr<ScopedRefPtrCountBase> p1;
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-    {
-      scoped_refptr<ScopedRefPtrCountBase> p2(raw);
-      EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-      p1 = std::move(p2);
-      EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-      EXPECT_EQ(raw, p1.get());
-      EXPECT_EQ(nullptr, p2.get());
-
-      // p2 goes out of scope.
-    }
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-    // p1 goes out of scope.
-  }
-  EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-  EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-}
-
-TEST(RefCountedUnitTest, MoveAssignmentSameInstance1) {
-  ScopedRefPtrCountBase::reset_count();
-
-  {
-    ScopedRefPtrCountBase *raw = new ScopedRefPtrCountBase();
-    scoped_refptr<ScopedRefPtrCountBase> p1(raw);
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-    {
-      scoped_refptr<ScopedRefPtrCountBase> p2(p1);
-      EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-      p1 = std::move(p2);
-      EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-      EXPECT_EQ(raw, p1.get());
-      EXPECT_EQ(nullptr, p2.get());
-
-      // p2 goes out of scope.
-    }
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-    // p1 goes out of scope.
-  }
-  EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-  EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-}
-
-TEST(RefCountedUnitTest, MoveAssignmentSameInstance2) {
-  ScopedRefPtrCountBase::reset_count();
-
-  {
-    ScopedRefPtrCountBase *raw = new ScopedRefPtrCountBase();
-    scoped_refptr<ScopedRefPtrCountBase> p1(raw);
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-    {
-      scoped_refptr<ScopedRefPtrCountBase> p2(p1);
-      EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-      p2 = std::move(p1);
-      EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-      EXPECT_EQ(nullptr, p1.get());
-      EXPECT_EQ(raw, p2.get());
-
-      // p2 goes out of scope.
-    }
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-
-    // p1 goes out of scope.
-  }
-  EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-  EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-}
-
-TEST(RefCountedUnitTest, MoveAssignmentDifferentInstances) {
-  ScopedRefPtrCountBase::reset_count();
-
-  {
-    ScopedRefPtrCountBase *raw1 = new ScopedRefPtrCountBase();
-    scoped_refptr<ScopedRefPtrCountBase> p1(raw1);
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-    {
-      ScopedRefPtrCountBase *raw2 = new ScopedRefPtrCountBase();
-      scoped_refptr<ScopedRefPtrCountBase> p2(raw2);
-      EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-      p1 = std::move(p2);
-      EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-      EXPECT_EQ(raw2, p1.get());
-      EXPECT_EQ(nullptr, p2.get());
-
-      // p2 goes out of scope.
-    }
-    EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-
-    // p1 goes out of scope.
-  }
-  EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count());
-  EXPECT_EQ(2, ScopedRefPtrCountBase::destructor_count());
-}
-
-TEST(RefCountedUnitTest, MoveAssignmentSelfMove) {
-  ScopedRefPtrCountBase::reset_count();
-
-  {
-    ScopedRefPtrCountBase* raw = new ScopedRefPtrCountBase;
-    scoped_refptr<ScopedRefPtrCountBase> p1(raw);
-    scoped_refptr<ScopedRefPtrCountBase>& p1_ref = p1;
-
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-    p1 = std::move(p1_ref);
-
-    // |p1| is "valid but unspecified", so don't bother inspecting its
-    // contents, just ensure that we don't crash.
-  }
-
-  EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-  EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-}
-
-TEST(RefCountedUnitTest, MoveAssignmentDerived) {
-  ScopedRefPtrCountBase::reset_count();
-  ScopedRefPtrCountDerived::reset_count();
-
-  {
-    ScopedRefPtrCountBase *raw1 = new ScopedRefPtrCountBase();
-    scoped_refptr<ScopedRefPtrCountBase> p1(raw1);
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountDerived::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count());
-
-    {
-      ScopedRefPtrCountDerived *raw2 = new ScopedRefPtrCountDerived();
-      scoped_refptr<ScopedRefPtrCountDerived> p2(raw2);
-      EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-      EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count());
-
-      p1 = std::move(p2);
-      EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-      EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count());
-      EXPECT_EQ(raw2, p1.get());
-      EXPECT_EQ(nullptr, p2.get());
-
-      // p2 goes out of scope.
-    }
-    EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-    EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count());
-
-    // p1 goes out of scope.
-  }
-  EXPECT_EQ(2, ScopedRefPtrCountBase::constructor_count());
-  EXPECT_EQ(2, ScopedRefPtrCountBase::destructor_count());
-  EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count());
-  EXPECT_EQ(1, ScopedRefPtrCountDerived::destructor_count());
-}
-
-TEST(RefCountedUnitTest, MoveConstructor) {
-  ScopedRefPtrCountBase::reset_count();
-
-  {
-    ScopedRefPtrCountBase *raw = new ScopedRefPtrCountBase();
-    scoped_refptr<ScopedRefPtrCountBase> p1(raw);
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-
-    {
-      scoped_refptr<ScopedRefPtrCountBase> p2(std::move(p1));
-      EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-      EXPECT_EQ(nullptr, p1.get());
-      EXPECT_EQ(raw, p2.get());
-
-      // p2 goes out of scope.
-    }
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-
-    // p1 goes out of scope.
-  }
-  EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-  EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-}
-
-TEST(RefCountedUnitTest, MoveConstructorDerived) {
-  ScopedRefPtrCountBase::reset_count();
-  ScopedRefPtrCountDerived::reset_count();
-
-  {
-    ScopedRefPtrCountDerived *raw1 = new ScopedRefPtrCountDerived();
-    scoped_refptr<ScopedRefPtrCountDerived> p1(raw1);
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-    EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count());
-    EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count());
-
-    {
-      scoped_refptr<ScopedRefPtrCountBase> p2(std::move(p1));
-      EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountBase::destructor_count());
-      EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count());
-      EXPECT_EQ(0, ScopedRefPtrCountDerived::destructor_count());
-      EXPECT_EQ(nullptr, p1.get());
-      EXPECT_EQ(raw1, p2.get());
-
-      // p2 goes out of scope.
-    }
-    EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-    EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-    EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count());
-    EXPECT_EQ(1, ScopedRefPtrCountDerived::destructor_count());
-
-    // p1 goes out of scope.
-  }
-  EXPECT_EQ(1, ScopedRefPtrCountBase::constructor_count());
-  EXPECT_EQ(1, ScopedRefPtrCountBase::destructor_count());
-  EXPECT_EQ(1, ScopedRefPtrCountDerived::constructor_count());
-  EXPECT_EQ(1, ScopedRefPtrCountDerived::destructor_count());
-}
-
-TEST(RefCountedUnitTest, TestOverloadResolutionCopy) {
-  const scoped_refptr<Derived> derived(new Derived);
-  const scoped_refptr<SelfAssign> expected(derived);
-  EXPECT_EQ(expected, Overloaded(derived));
-
-  const scoped_refptr<Other> other(new Other);
-  EXPECT_EQ(other, Overloaded(other));
-}
-
-TEST(RefCountedUnitTest, TestOverloadResolutionMove) {
-  scoped_refptr<Derived> derived(new Derived);
-  const scoped_refptr<SelfAssign> expected(derived);
-  EXPECT_EQ(expected, Overloaded(std::move(derived)));
-
-  scoped_refptr<Other> other(new Other);
-  const scoped_refptr<Other> other2(other);
-  EXPECT_EQ(other2, Overloaded(std::move(other)));
-}
-
-TEST(RefCountedUnitTest, TestMakeRefCounted) {
-  scoped_refptr<Derived> derived = new Derived;
-  EXPECT_TRUE(derived->HasOneRef());
-  derived = nullptr;
-
-  scoped_refptr<Derived> derived2 = base::MakeRefCounted<Derived>();
-  EXPECT_TRUE(derived2->HasOneRef());
-  derived2 = nullptr;
-}
-
-TEST(RefCountedUnitTest, TestInitialRefCountIsOne) {
-  scoped_refptr<InitialRefCountIsOne> obj =
-      base::MakeRefCounted<InitialRefCountIsOne>();
-  EXPECT_TRUE(obj->HasOneRef());
-  obj = nullptr;
-
-  scoped_refptr<InitialRefCountIsOne> obj2 =
-      base::AdoptRef(new InitialRefCountIsOne);
-  EXPECT_TRUE(obj2->HasOneRef());
-  obj2 = nullptr;
-
-  scoped_refptr<Other> obj3 = base::MakeRefCounted<Other>();
-  EXPECT_TRUE(obj3->HasOneRef());
-  obj3 = nullptr;
-}
-
-TEST(RefCountedDeathTest, TestAdoptRef) {
-  // Check that WrapRefCounted() DCHECKs if passed a type that defines
-  // REQUIRE_ADOPTION_FOR_REFCOUNTED_TYPE.
-  EXPECT_DCHECK_DEATH(base::WrapRefCounted(new InitialRefCountIsOne));
-
-  // Check that AdoptRef() DCHECKs if passed a nullptr.
-  InitialRefCountIsOne* ptr = nullptr;
-  EXPECT_DCHECK_DEATH(base::AdoptRef(ptr));
-
-  // Check that AdoptRef() DCHECKs if passed an object that doesn't need to be
-  // adopted.
-  scoped_refptr<InitialRefCountIsOne> obj =
-      base::MakeRefCounted<InitialRefCountIsOne>();
-  EXPECT_DCHECK_DEATH(base::AdoptRef(obj.get()));
-}
-
-TEST(RefCountedUnitTest, TestPrivateDestructorWithDeleter) {
-  // Ensure that RefCounted doesn't need the access to the pointee dtor when
-  // a custom deleter is given.
-  scoped_refptr<HasPrivateDestructorWithDeleter> obj =
-      base::MakeRefCounted<HasPrivateDestructorWithDeleter>();
-}
diff --git a/base/memory/ref_counted_unittest.nc b/base/memory/ref_counted_unittest.nc
deleted file mode 100644
index b8c371f..0000000
--- a/base/memory/ref_counted_unittest.nc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/ref_counted.h"
-
-namespace base {
-
-class InitialRefCountIsZero : public base::RefCounted<InitialRefCountIsZero> {
- public:
-  InitialRefCountIsZero() {}
- private:
-  friend class base::RefCounted<InitialRefCountIsZero>;
-  ~InitialRefCountIsZero() {}
-};
-
-// TODO(hans): Remove .* and update the static_assert expectations once we roll
-// past Clang r313315. https://crbug.com/765692.
-
-#if defined(NCTEST_ADOPT_REF_TO_ZERO_START)  // [r"fatal error: static_assert failed .*\"Use AdoptRef only for the reference count starts from one\.\""]
-
-void WontCompile() {
-  AdoptRef(new InitialRefCountIsZero());
-}
-
-#endif
-
-}  // namespace base
diff --git a/base/memory/shared_memory_mac_unittest.cc b/base/memory/shared_memory_mac_unittest.cc
deleted file mode 100644
index b17dab7..0000000
--- a/base/memory/shared_memory_mac_unittest.cc
+++ /dev/null
@@ -1,457 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <mach/mach.h>
-#include <mach/mach_vm.h>
-#include <servers/bootstrap.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/command_line.h"
-#include "base/mac/mac_util.h"
-#include "base/mac/mach_logging.h"
-#include "base/mac/scoped_mach_port.h"
-#include "base/macros.h"
-#include "base/memory/shared_memory.h"
-#include "base/process/process_handle.h"
-#include "base/rand_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/sys_info.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_timeouts.h"
-#include "base/unguessable_token.h"
-#include "testing/multiprocess_func_list.h"
-
-namespace base {
-
-namespace {
-
-// Gets the current and maximum protection levels of the memory region.
-// Returns whether the operation was successful.
-// |current| and |max| are output variables only populated on success.
-bool GetProtections(void* address, size_t size, int* current, int* max) {
-  vm_region_info_t region_info;
-  mach_vm_address_t mem_address = reinterpret_cast<mach_vm_address_t>(address);
-  mach_vm_size_t mem_size = size;
-  vm_region_basic_info_64 basic_info;
-
-  region_info = reinterpret_cast<vm_region_recurse_info_t>(&basic_info);
-  vm_region_flavor_t flavor = VM_REGION_BASIC_INFO_64;
-  memory_object_name_t memory_object;
-  mach_msg_type_number_t count = VM_REGION_BASIC_INFO_COUNT_64;
-
-  kern_return_t kr =
-      mach_vm_region(mach_task_self(), &mem_address, &mem_size, flavor,
-                     region_info, &count, &memory_object);
-  if (kr != KERN_SUCCESS) {
-    MACH_LOG(ERROR, kr) << "Failed to get region info.";
-    return false;
-  }
-
-  *current = basic_info.protection;
-  *max = basic_info.max_protection;
-  return true;
-}
-
-// Creates a new SharedMemory with the given |size|, filled with 'a'.
-std::unique_ptr<SharedMemory> CreateSharedMemory(int size) {
-  SharedMemoryHandle shm(size, UnguessableToken::Create());
-  if (!shm.IsValid()) {
-    LOG(ERROR) << "Failed to make SharedMemoryHandle";
-    return nullptr;
-  }
-  std::unique_ptr<SharedMemory> shared_memory(new SharedMemory(shm, false));
-  shared_memory->Map(size);
-  memset(shared_memory->memory(), 'a', size);
-  return shared_memory;
-}
-
-static const std::string g_service_switch_name = "service_name";
-
-// Structs used to pass a mach port from client to server.
-struct MachSendPortMessage {
-  mach_msg_header_t header;
-  mach_msg_body_t body;
-  mach_msg_port_descriptor_t data;
-};
-struct MachReceivePortMessage {
-  mach_msg_header_t header;
-  mach_msg_body_t body;
-  mach_msg_port_descriptor_t data;
-  mach_msg_trailer_t trailer;
-};
-
-// Makes the current process into a Mach Server with the given |service_name|.
-mach_port_t BecomeMachServer(const char* service_name) {
-  mach_port_t port;
-  kern_return_t kr = bootstrap_check_in(bootstrap_port, service_name, &port);
-  MACH_CHECK(kr == KERN_SUCCESS, kr) << "BecomeMachServer";
-  return port;
-}
-
-// Returns the mach port for the Mach Server with the given |service_name|.
-mach_port_t LookupServer(const char* service_name) {
-  mach_port_t server_port;
-  kern_return_t kr =
-      bootstrap_look_up(bootstrap_port, service_name, &server_port);
-  MACH_CHECK(kr == KERN_SUCCESS, kr) << "LookupServer";
-  return server_port;
-}
-
-mach_port_t MakeReceivingPort() {
-  mach_port_t client_port;
-  kern_return_t kr =
-      mach_port_allocate(mach_task_self(),         // our task is acquiring
-                         MACH_PORT_RIGHT_RECEIVE,  // a new receive right
-                         &client_port);            // with this name
-  MACH_CHECK(kr == KERN_SUCCESS, kr) << "MakeReceivingPort";
-  return client_port;
-}
-
-// Blocks until a mach message is sent to |server_port|. This mach message
-// must contain a mach port. Returns that mach port.
-mach_port_t ReceiveMachPort(mach_port_t port_to_listen_on) {
-  MachReceivePortMessage recv_msg;
-  mach_msg_header_t* recv_hdr = &(recv_msg.header);
-  recv_hdr->msgh_local_port = port_to_listen_on;
-  recv_hdr->msgh_size = sizeof(recv_msg);
-  kern_return_t kr =
-      mach_msg(recv_hdr,               // message buffer
-               MACH_RCV_MSG,           // option indicating service
-               0,                      // send size
-               recv_hdr->msgh_size,    // size of header + body
-               port_to_listen_on,      // receive name
-               MACH_MSG_TIMEOUT_NONE,  // no timeout, wait forever
-               MACH_PORT_NULL);        // no notification port
-  MACH_CHECK(kr == KERN_SUCCESS, kr) << "ReceiveMachPort";
-  mach_port_t other_task_port = recv_msg.data.name;
-  return other_task_port;
-}
-
-// Passes a copy of the send right of |port_to_send| to |receiving_port|.
-void SendMachPort(mach_port_t receiving_port,
-                  mach_port_t port_to_send,
-                  int disposition) {
-  MachSendPortMessage send_msg;
-  mach_msg_header_t* send_hdr;
-  send_hdr = &(send_msg.header);
-  send_hdr->msgh_bits =
-      MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0) | MACH_MSGH_BITS_COMPLEX;
-  send_hdr->msgh_size = sizeof(send_msg);
-  send_hdr->msgh_remote_port = receiving_port;
-  send_hdr->msgh_local_port = MACH_PORT_NULL;
-  send_hdr->msgh_reserved = 0;
-  send_hdr->msgh_id = 0;
-  send_msg.body.msgh_descriptor_count = 1;
-  send_msg.data.name = port_to_send;
-  send_msg.data.disposition = disposition;
-  send_msg.data.type = MACH_MSG_PORT_DESCRIPTOR;
-  int kr = mach_msg(send_hdr,               // message buffer
-                    MACH_SEND_MSG,          // option indicating send
-                    send_hdr->msgh_size,    // size of header + body
-                    0,                      // receive limit
-                    MACH_PORT_NULL,         // receive name
-                    MACH_MSG_TIMEOUT_NONE,  // no timeout, wait forever
-                    MACH_PORT_NULL);        // no notification port
-  MACH_CHECK(kr == KERN_SUCCESS, kr) << "SendMachPort";
-}
-
-std::string CreateRandomServiceName() {
-  return StringPrintf("SharedMemoryMacMultiProcessTest.%llu", RandUint64());
-}
-
-// Sets up the mach communication ports with the server. Returns a port to which
-// the server will send mach objects.
-mach_port_t CommonChildProcessSetUp() {
-  CommandLine cmd_line = *CommandLine::ForCurrentProcess();
-  std::string service_name =
-      cmd_line.GetSwitchValueASCII(g_service_switch_name);
-  mac::ScopedMachSendRight server_port(LookupServer(service_name.c_str()));
-  mach_port_t client_port = MakeReceivingPort();
-
-  // Send the port that this process is listening on to the server.
-  SendMachPort(server_port.get(), client_port, MACH_MSG_TYPE_MAKE_SEND);
-  return client_port;
-}
-
-// The number of active names in the current task's port name space.
-mach_msg_type_number_t GetActiveNameCount() {
-  mach_port_name_array_t name_array;
-  mach_msg_type_number_t names_count;
-  mach_port_type_array_t type_array;
-  mach_msg_type_number_t types_count;
-  kern_return_t kr = mach_port_names(mach_task_self(), &name_array,
-                                     &names_count, &type_array, &types_count);
-  MACH_CHECK(kr == KERN_SUCCESS, kr) << "GetActiveNameCount";
-  return names_count;
-}
-
-}  // namespace
-
-class SharedMemoryMacMultiProcessTest : public MultiProcessTest {
- public:
-  SharedMemoryMacMultiProcessTest() {}
-
-  CommandLine MakeCmdLine(const std::string& procname) override {
-    CommandLine command_line = MultiProcessTest::MakeCmdLine(procname);
-    // Pass the service name to the child process.
-    command_line.AppendSwitchASCII(g_service_switch_name, service_name_);
-    return command_line;
-  }
-
-  void SetUpChild(const std::string& name) {
-    // Make a random service name so that this test doesn't conflict with other
-    // similar tests.
-    service_name_ = CreateRandomServiceName();
-    server_port_.reset(BecomeMachServer(service_name_.c_str()));
-    child_process_ = SpawnChild(name);
-    client_port_.reset(ReceiveMachPort(server_port_.get()));
-  }
-
-  static const int s_memory_size = 99999;
-
- protected:
-  std::string service_name_;
-
-  // A port on which the main process listens for mach messages from the child
-  // process.
-  mac::ScopedMachReceiveRight server_port_;
-
-  // A port on which the child process listens for mach messages from the main
-  // process.
-  mac::ScopedMachSendRight client_port_;
-
-  base::Process child_process_;
-  DISALLOW_COPY_AND_ASSIGN(SharedMemoryMacMultiProcessTest);
-};
-
-// Tests that content written to shared memory in the server process can be read
-// by the child process.
-TEST_F(SharedMemoryMacMultiProcessTest, MachBasedSharedMemory) {
-  SetUpChild("MachBasedSharedMemoryClient");
-
-  std::unique_ptr<SharedMemory> shared_memory(
-      CreateSharedMemory(s_memory_size));
-
-  // Send the underlying memory object to the client process.
-  SendMachPort(client_port_.get(), shared_memory->handle().GetMemoryObject(),
-               MACH_MSG_TYPE_COPY_SEND);
-  int rv = -1;
-  ASSERT_TRUE(child_process_.WaitForExitWithTimeout(
-      TestTimeouts::action_timeout(), &rv));
-  EXPECT_EQ(0, rv);
-}
-
-MULTIPROCESS_TEST_MAIN(MachBasedSharedMemoryClient) {
-  mac::ScopedMachReceiveRight client_port(CommonChildProcessSetUp());
-  // The next mach port should be for a memory object.
-  mach_port_t memory_object = ReceiveMachPort(client_port.get());
-  SharedMemoryHandle shm(memory_object,
-                         SharedMemoryMacMultiProcessTest::s_memory_size,
-                         UnguessableToken::Create());
-  SharedMemory shared_memory(shm, false);
-  shared_memory.Map(SharedMemoryMacMultiProcessTest::s_memory_size);
-  const char* start = static_cast<const char*>(shared_memory.memory());
-  for (int i = 0; i < SharedMemoryMacMultiProcessTest::s_memory_size; ++i) {
-    DCHECK_EQ(start[i], 'a');
-  }
-  return 0;
-}
-
-// Tests that mapping shared memory with an offset works correctly.
-TEST_F(SharedMemoryMacMultiProcessTest, MachBasedSharedMemoryWithOffset) {
-  SetUpChild("MachBasedSharedMemoryWithOffsetClient");
-
-  SharedMemoryHandle shm(s_memory_size, UnguessableToken::Create());
-  ASSERT_TRUE(shm.IsValid());
-  SharedMemory shared_memory(shm, false);
-  shared_memory.Map(s_memory_size);
-
-  size_t page_size = SysInfo::VMAllocationGranularity();
-  char* start = static_cast<char*>(shared_memory.memory());
-  memset(start, 'a', page_size);
-  memset(start + page_size, 'b', page_size);
-  memset(start + 2 * page_size, 'c', page_size);
-
-  // Send the underlying memory object to the client process.
-  SendMachPort(
-      client_port_.get(), shm.GetMemoryObject(), MACH_MSG_TYPE_COPY_SEND);
-  int rv = -1;
-  ASSERT_TRUE(child_process_.WaitForExitWithTimeout(
-      TestTimeouts::action_timeout(), &rv));
-  EXPECT_EQ(0, rv);
-}
-
-MULTIPROCESS_TEST_MAIN(MachBasedSharedMemoryWithOffsetClient) {
-  mac::ScopedMachReceiveRight client_port(CommonChildProcessSetUp());
-  // The next mach port should be for a memory object.
-  mach_port_t memory_object = ReceiveMachPort(client_port.get());
-  SharedMemoryHandle shm(memory_object,
-                         SharedMemoryMacMultiProcessTest::s_memory_size,
-                         UnguessableToken::Create());
-  SharedMemory shared_memory(shm, false);
-  size_t page_size = SysInfo::VMAllocationGranularity();
-  shared_memory.MapAt(page_size, 2 * page_size);
-  const char* start = static_cast<const char*>(shared_memory.memory());
-  for (size_t i = 0; i < page_size; ++i) {
-    DCHECK_EQ(start[i], 'b');
-  }
-  for (size_t i = page_size; i < 2 * page_size; ++i) {
-    DCHECK_EQ(start[i], 'c');
-  }
-  return 0;
-}
-
-// Tests that duplication and closing has the right effect on Mach reference
-// counts.
-TEST_F(SharedMemoryMacMultiProcessTest, MachDuplicateAndClose) {
-  mach_msg_type_number_t active_name_count = GetActiveNameCount();
-
-  // Making a new SharedMemoryHandle increments the name count.
-  SharedMemoryHandle shm(s_memory_size, UnguessableToken::Create());
-  ASSERT_TRUE(shm.IsValid());
-  EXPECT_EQ(active_name_count + 1, GetActiveNameCount());
-
-  // Duplicating the SharedMemoryHandle increments the ref count, but doesn't
-  // make a new name.
-  shm.Duplicate();
-  EXPECT_EQ(active_name_count + 1, GetActiveNameCount());
-
-  // Closing the SharedMemoryHandle decrements the ref count. The first time has
-  // no effect.
-  shm.Close();
-  EXPECT_EQ(active_name_count + 1, GetActiveNameCount());
-
-  // Closing the SharedMemoryHandle decrements the ref count. The second time
-  // destroys the port.
-  shm.Close();
-  EXPECT_EQ(active_name_count, GetActiveNameCount());
-}
-
-// Tests that Mach shared memory can be mapped and unmapped.
-TEST_F(SharedMemoryMacMultiProcessTest, MachUnmapMap) {
-  mach_msg_type_number_t active_name_count = GetActiveNameCount();
-
-  std::unique_ptr<SharedMemory> shared_memory =
-      CreateSharedMemory(s_memory_size);
-  ASSERT_TRUE(shared_memory->Unmap());
-  ASSERT_TRUE(shared_memory->Map(s_memory_size));
-  shared_memory.reset();
-  EXPECT_EQ(active_name_count, GetActiveNameCount());
-}
-
-// Tests that passing a SharedMemoryHandle to a SharedMemory object also passes
-// ownership, and that destroying the SharedMemory closes the SharedMemoryHandle
-// as well.
-TEST_F(SharedMemoryMacMultiProcessTest, MachSharedMemoryTakesOwnership) {
-  mach_msg_type_number_t active_name_count = GetActiveNameCount();
-
-  // Making a new SharedMemoryHandle increments the name count.
-  SharedMemoryHandle shm(s_memory_size, UnguessableToken::Create());
-  ASSERT_TRUE(shm.IsValid());
-  EXPECT_EQ(active_name_count + 1, GetActiveNameCount());
-
-  // Name count doesn't change when mapping the memory.
-  std::unique_ptr<SharedMemory> shared_memory(new SharedMemory(shm, false));
-  shared_memory->Map(s_memory_size);
-  EXPECT_EQ(active_name_count + 1, GetActiveNameCount());
-
-  // Destroying the SharedMemory object frees the resource.
-  shared_memory.reset();
-  EXPECT_EQ(active_name_count, GetActiveNameCount());
-}
-
-// Tests that the read-only flag works.
-TEST_F(SharedMemoryMacMultiProcessTest, MachReadOnly) {
-  std::unique_ptr<SharedMemory> shared_memory(
-      CreateSharedMemory(s_memory_size));
-
-  SharedMemoryHandle shm2 = shared_memory->handle().Duplicate();
-  ASSERT_TRUE(shm2.IsValid());
-  SharedMemory shared_memory2(shm2, true);
-  shared_memory2.Map(s_memory_size);
-  ASSERT_DEATH(memset(shared_memory2.memory(), 'b', s_memory_size), "");
-}
-
-// Tests that duplication of the underlying handle works.
-TEST_F(SharedMemoryMacMultiProcessTest, MachDuplicate) {
-  mach_msg_type_number_t active_name_count = GetActiveNameCount();
-
-  {
-    std::unique_ptr<SharedMemory> shared_memory(
-        CreateSharedMemory(s_memory_size));
-
-    SharedMemoryHandle shm2 = shared_memory->handle().Duplicate();
-    ASSERT_TRUE(shm2.IsValid());
-    SharedMemory shared_memory2(shm2, true);
-    shared_memory2.Map(s_memory_size);
-
-    ASSERT_EQ(0, memcmp(shared_memory->memory(), shared_memory2.memory(),
-                        s_memory_size));
-  }
-
-  EXPECT_EQ(active_name_count, GetActiveNameCount());
-}
-
-// Tests that the method GetReadOnlyHandle() creates a memory object that
-// is read only.
-TEST_F(SharedMemoryMacMultiProcessTest, MachReadonly) {
-  std::unique_ptr<SharedMemory> shared_memory(
-      CreateSharedMemory(s_memory_size));
-
-  // Check the protection levels.
-  int current_prot, max_prot;
-  ASSERT_TRUE(GetProtections(shared_memory->memory(),
-                             shared_memory->mapped_size(), &current_prot,
-                             &max_prot));
-  ASSERT_EQ(VM_PROT_READ | VM_PROT_WRITE, current_prot);
-  ASSERT_EQ(VM_PROT_READ | VM_PROT_WRITE, max_prot);
-
-  // Make a new memory object.
-  SharedMemoryHandle shm2 = shared_memory->GetReadOnlyHandle();
-  ASSERT_TRUE(shm2.IsValid());
-  EXPECT_EQ(shared_memory->handle().GetGUID(), shm2.GetGUID());
-
-  // Mapping with |readonly| set to |false| should fail.
-  SharedMemory shared_memory2(shm2, false);
-  shared_memory2.Map(s_memory_size);
-  ASSERT_EQ(nullptr, shared_memory2.memory());
-
-  // Now trying mapping with |readonly| set to |true|.
-  SharedMemory shared_memory3(shm2.Duplicate(), true);
-  shared_memory3.Map(s_memory_size);
-  ASSERT_NE(nullptr, shared_memory3.memory());
-
-  // Check the protection levels.
-  ASSERT_TRUE(GetProtections(shared_memory3.memory(),
-                             shared_memory3.mapped_size(), &current_prot,
-                             &max_prot));
-  ASSERT_EQ(VM_PROT_READ, current_prot);
-  ASSERT_EQ(VM_PROT_READ, max_prot);
-
-  // The memory should still be readonly, since the underlying memory object
-  // is readonly.
-  ASSERT_DEATH(memset(shared_memory2.memory(), 'b', s_memory_size), "");
-}
-
-// Tests that the method GetReadOnlyHandle() doesn't leak.
-TEST_F(SharedMemoryMacMultiProcessTest, MachReadonlyLeak) {
-  mach_msg_type_number_t active_name_count = GetActiveNameCount();
-
-  {
-    std::unique_ptr<SharedMemory> shared_memory(
-        CreateSharedMemory(s_memory_size));
-
-    SharedMemoryHandle shm2 = shared_memory->GetReadOnlyHandle();
-    ASSERT_TRUE(shm2.IsValid());
-
-    // Intentionally map with |readonly| set to |false|.
-    SharedMemory shared_memory2(shm2, false);
-    shared_memory2.Map(s_memory_size);
-  }
-
-  EXPECT_EQ(active_name_count, GetActiveNameCount());
-}
-
-}  //  namespace base
diff --git a/base/memory/shared_memory_region_unittest.cc b/base/memory/shared_memory_region_unittest.cc
deleted file mode 100644
index e917154..0000000
--- a/base/memory/shared_memory_region_unittest.cc
+++ /dev/null
@@ -1,279 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <utility>
-
-#include "base/memory/platform_shared_memory_region.h"
-#include "base/memory/read_only_shared_memory_region.h"
-#include "base/memory/unsafe_shared_memory_region.h"
-#include "base/memory/writable_shared_memory_region.h"
-#include "base/sys_info.h"
-#include "base/test/test_shared_memory_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-const size_t kRegionSize = 1024;
-
-bool IsMemoryFilledWithByte(const void* memory, size_t size, char byte) {
-  const char* start_ptr = static_cast<const char*>(memory);
-  const char* end_ptr = start_ptr + size;
-  for (const char* ptr = start_ptr; ptr < end_ptr; ++ptr) {
-    if (*ptr != byte)
-      return false;
-  }
-
-  return true;
-}
-
-template <typename SharedMemoryRegionType>
-class SharedMemoryRegionTest : public ::testing::Test {
- public:
-  void SetUp() override {
-    std::tie(region_, rw_mapping_) =
-        CreateMappedRegion<SharedMemoryRegionType>(kRegionSize);
-    ASSERT_TRUE(region_.IsValid());
-    ASSERT_TRUE(rw_mapping_.IsValid());
-    memset(rw_mapping_.memory(), 'G', kRegionSize);
-    EXPECT_TRUE(IsMemoryFilledWithByte(rw_mapping_.memory(), kRegionSize, 'G'));
-  }
-
- protected:
-  SharedMemoryRegionType region_;
-  WritableSharedMemoryMapping rw_mapping_;
-};
-
-typedef ::testing::Types<WritableSharedMemoryRegion,
-                         UnsafeSharedMemoryRegion,
-                         ReadOnlySharedMemoryRegion>
-    AllRegionTypes;
-TYPED_TEST_CASE(SharedMemoryRegionTest, AllRegionTypes);
-
-TYPED_TEST(SharedMemoryRegionTest, NonValidRegion) {
-  TypeParam region;
-  EXPECT_FALSE(region.IsValid());
-  // We shouldn't crash on Map but should return an invalid mapping.
-  typename TypeParam::MappingType mapping = region.Map();
-  EXPECT_FALSE(mapping.IsValid());
-}
-
-TYPED_TEST(SharedMemoryRegionTest, MoveRegion) {
-  TypeParam moved_region = std::move(this->region_);
-  EXPECT_FALSE(this->region_.IsValid());
-  ASSERT_TRUE(moved_region.IsValid());
-
-  // Check that moved region maps correctly.
-  typename TypeParam::MappingType mapping = moved_region.Map();
-  ASSERT_TRUE(mapping.IsValid());
-  EXPECT_NE(this->rw_mapping_.memory(), mapping.memory());
-  EXPECT_EQ(memcmp(this->rw_mapping_.memory(), mapping.memory(), kRegionSize),
-            0);
-
-  // Verify that the second mapping reflects changes in the first.
-  memset(this->rw_mapping_.memory(), '#', kRegionSize);
-  EXPECT_EQ(memcmp(this->rw_mapping_.memory(), mapping.memory(), kRegionSize),
-            0);
-}
-
-TYPED_TEST(SharedMemoryRegionTest, MappingValidAfterClose) {
-  // Check the mapping is still valid after the region is closed.
-  this->region_ = TypeParam();
-  EXPECT_FALSE(this->region_.IsValid());
-  ASSERT_TRUE(this->rw_mapping_.IsValid());
-  EXPECT_TRUE(
-      IsMemoryFilledWithByte(this->rw_mapping_.memory(), kRegionSize, 'G'));
-}
-
-TYPED_TEST(SharedMemoryRegionTest, MapTwice) {
-  // The second mapping is either writable or read-only.
-  typename TypeParam::MappingType mapping = this->region_.Map();
-  ASSERT_TRUE(mapping.IsValid());
-  EXPECT_NE(this->rw_mapping_.memory(), mapping.memory());
-  EXPECT_EQ(memcmp(this->rw_mapping_.memory(), mapping.memory(), kRegionSize),
-            0);
-
-  // Verify that the second mapping reflects changes in the first.
-  memset(this->rw_mapping_.memory(), '#', kRegionSize);
-  EXPECT_EQ(memcmp(this->rw_mapping_.memory(), mapping.memory(), kRegionSize),
-            0);
-
-  // Close the region and unmap the first memory segment, verify the second
-  // still has the right data.
-  this->region_ = TypeParam();
-  this->rw_mapping_ = WritableSharedMemoryMapping();
-  EXPECT_TRUE(IsMemoryFilledWithByte(mapping.memory(), kRegionSize, '#'));
-}
-
-TYPED_TEST(SharedMemoryRegionTest, MapUnmapMap) {
-  this->rw_mapping_ = WritableSharedMemoryMapping();
-
-  typename TypeParam::MappingType mapping = this->region_.Map();
-  ASSERT_TRUE(mapping.IsValid());
-  EXPECT_TRUE(IsMemoryFilledWithByte(mapping.memory(), kRegionSize, 'G'));
-}
-
-TYPED_TEST(SharedMemoryRegionTest, SerializeAndDeserialize) {
-  subtle::PlatformSharedMemoryRegion platform_region =
-      TypeParam::TakeHandleForSerialization(std::move(this->region_));
-  EXPECT_EQ(platform_region.GetGUID(), this->rw_mapping_.guid());
-  TypeParam region = TypeParam::Deserialize(std::move(platform_region));
-  EXPECT_TRUE(region.IsValid());
-  EXPECT_FALSE(this->region_.IsValid());
-  typename TypeParam::MappingType mapping = region.Map();
-  ASSERT_TRUE(mapping.IsValid());
-  EXPECT_TRUE(IsMemoryFilledWithByte(mapping.memory(), kRegionSize, 'G'));
-
-  // Verify that the second mapping reflects changes in the first.
-  memset(this->rw_mapping_.memory(), '#', kRegionSize);
-  EXPECT_EQ(memcmp(this->rw_mapping_.memory(), mapping.memory(), kRegionSize),
-            0);
-}
-
-// Map() will return addresses which are aligned to the platform page size, this
-// varies from platform to platform though.  Since we'd like to advertise a
-// minimum alignment that callers can count on, test for it here.
-TYPED_TEST(SharedMemoryRegionTest, MapMinimumAlignment) {
-  EXPECT_EQ(0U,
-            reinterpret_cast<uintptr_t>(this->rw_mapping_.memory()) &
-                (subtle::PlatformSharedMemoryRegion::kMapMinimumAlignment - 1));
-}
-
-TYPED_TEST(SharedMemoryRegionTest, MapSize) {
-  EXPECT_EQ(this->rw_mapping_.size(), kRegionSize);
-  EXPECT_GE(this->rw_mapping_.mapped_size(), kRegionSize);
-}
-
-TYPED_TEST(SharedMemoryRegionTest, MapGranularity) {
-  EXPECT_LT(this->rw_mapping_.mapped_size(),
-            kRegionSize + SysInfo::VMAllocationGranularity());
-}
-
-TYPED_TEST(SharedMemoryRegionTest, MapAt) {
-  const size_t kPageSize = SysInfo::VMAllocationGranularity();
-  ASSERT_TRUE(kPageSize >= sizeof(uint32_t));
-  ASSERT_EQ(kPageSize % sizeof(uint32_t), 0U);
-  const size_t kDataSize = kPageSize * 2;
-  const size_t kCount = kDataSize / sizeof(uint32_t);
-
-  TypeParam region;
-  WritableSharedMemoryMapping rw_mapping;
-  std::tie(region, rw_mapping) = CreateMappedRegion<TypeParam>(kDataSize);
-  ASSERT_TRUE(region.IsValid());
-  ASSERT_TRUE(rw_mapping.IsValid());
-  uint32_t* ptr = static_cast<uint32_t*>(rw_mapping.memory());
-
-  for (size_t i = 0; i < kCount; ++i)
-    ptr[i] = i;
-
-  rw_mapping = WritableSharedMemoryMapping();
-  off_t bytes_offset = kPageSize;
-  typename TypeParam::MappingType mapping =
-      region.MapAt(bytes_offset, kDataSize - bytes_offset);
-  ASSERT_TRUE(mapping.IsValid());
-
-  off_t int_offset = bytes_offset / sizeof(uint32_t);
-  const uint32_t* ptr2 = static_cast<const uint32_t*>(mapping.memory());
-  for (size_t i = int_offset; i < kCount; ++i) {
-    EXPECT_EQ(ptr2[i - int_offset], i);
-  }
-}
-
-TYPED_TEST(SharedMemoryRegionTest, MapAtNotAlignedOffsetFails) {
-  const size_t kDataSize = SysInfo::VMAllocationGranularity();
-
-  TypeParam region;
-  WritableSharedMemoryMapping rw_mapping;
-  std::tie(region, rw_mapping) = CreateMappedRegion<TypeParam>(kDataSize);
-  ASSERT_TRUE(region.IsValid());
-  ASSERT_TRUE(rw_mapping.IsValid());
-  off_t offset = kDataSize / 2;
-  typename TypeParam::MappingType mapping =
-      region.MapAt(offset, kDataSize - offset);
-  EXPECT_FALSE(mapping.IsValid());
-}
-
-TYPED_TEST(SharedMemoryRegionTest, MapMoreBytesThanRegionSizeFails) {
-  size_t region_real_size = this->region_.GetSize();
-  typename TypeParam::MappingType mapping =
-      this->region_.MapAt(0, region_real_size + 1);
-  EXPECT_FALSE(mapping.IsValid());
-}
-
-template <typename DuplicatableSharedMemoryRegion>
-class DuplicatableSharedMemoryRegionTest
-    : public SharedMemoryRegionTest<DuplicatableSharedMemoryRegion> {};
-
-typedef ::testing::Types<UnsafeSharedMemoryRegion, ReadOnlySharedMemoryRegion>
-    DuplicatableRegionTypes;
-TYPED_TEST_CASE(DuplicatableSharedMemoryRegionTest, DuplicatableRegionTypes);
-
-TYPED_TEST(DuplicatableSharedMemoryRegionTest, Duplicate) {
-  TypeParam dup_region = this->region_.Duplicate();
-  typename TypeParam::MappingType mapping = dup_region.Map();
-  ASSERT_TRUE(mapping.IsValid());
-  EXPECT_NE(this->rw_mapping_.memory(), mapping.memory());
-  EXPECT_EQ(this->rw_mapping_.guid(), mapping.guid());
-  EXPECT_TRUE(IsMemoryFilledWithByte(mapping.memory(), kRegionSize, 'G'));
-}
-
-class ReadOnlySharedMemoryRegionTest : public ::testing::Test {
- public:
-  ReadOnlySharedMemoryRegion GetInitiallyReadOnlyRegion(size_t size) {
-    MappedReadOnlyRegion mapped_region =
-        ReadOnlySharedMemoryRegion::Create(size);
-    ReadOnlySharedMemoryRegion region = std::move(mapped_region.region);
-    return region;
-  }
-
-  ReadOnlySharedMemoryRegion GetConvertedToReadOnlyRegion(size_t size) {
-    WritableSharedMemoryRegion region =
-        WritableSharedMemoryRegion::Create(kRegionSize);
-    ReadOnlySharedMemoryRegion ro_region =
-        WritableSharedMemoryRegion::ConvertToReadOnly(std::move(region));
-    return ro_region;
-  }
-};
-
-TEST_F(ReadOnlySharedMemoryRegionTest,
-       InitiallyReadOnlyRegionCannotBeMappedAsWritable) {
-  ReadOnlySharedMemoryRegion region = GetInitiallyReadOnlyRegion(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-
-  EXPECT_TRUE(CheckReadOnlyPlatformSharedMemoryRegionForTesting(
-      ReadOnlySharedMemoryRegion::TakeHandleForSerialization(
-          std::move(region))));
-}
-
-TEST_F(ReadOnlySharedMemoryRegionTest,
-       ConvertedToReadOnlyRegionCannotBeMappedAsWritable) {
-  ReadOnlySharedMemoryRegion region = GetConvertedToReadOnlyRegion(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-
-  EXPECT_TRUE(CheckReadOnlyPlatformSharedMemoryRegionForTesting(
-      ReadOnlySharedMemoryRegion::TakeHandleForSerialization(
-          std::move(region))));
-}
-
-TEST_F(ReadOnlySharedMemoryRegionTest,
-       InitiallyReadOnlyRegionProducedMappingWriteDeathTest) {
-  ReadOnlySharedMemoryRegion region = GetInitiallyReadOnlyRegion(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  ReadOnlySharedMemoryMapping mapping = region.Map();
-  ASSERT_TRUE(mapping.IsValid());
-  void* memory_ptr = const_cast<void*>(mapping.memory());
-  EXPECT_DEATH_IF_SUPPORTED(memset(memory_ptr, 'G', kRegionSize), "");
-}
-
-TEST_F(ReadOnlySharedMemoryRegionTest,
-       ConvertedToReadOnlyRegionProducedMappingWriteDeathTest) {
-  ReadOnlySharedMemoryRegion region = GetConvertedToReadOnlyRegion(kRegionSize);
-  ASSERT_TRUE(region.IsValid());
-  ReadOnlySharedMemoryMapping mapping = region.Map();
-  ASSERT_TRUE(mapping.IsValid());
-  void* memory_ptr = const_cast<void*>(mapping.memory());
-  EXPECT_DEATH_IF_SUPPORTED(memset(memory_ptr, 'G', kRegionSize), "");
-}
-
-}  // namespace base
diff --git a/base/memory/shared_memory_unittest.cc b/base/memory/shared_memory_unittest.cc
deleted file mode 100644
index c4c21c4..0000000
--- a/base/memory/shared_memory_unittest.cc
+++ /dev/null
@@ -1,965 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/shared_memory.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/atomicops.h"
-#include "base/base_switches.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/shared_memory_handle.h"
-#include "base/process/kill.h"
-#include "base/rand_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/string_util.h"
-#include "base/sys_info.h"
-#include "base/test/multiprocess_test.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "base/unguessable_token.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-
-#if defined(OS_ANDROID)
-#include "base/callback.h"
-#endif
-
-#if defined(OS_POSIX)
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-#if defined(OS_LINUX)
-#include <sys/syscall.h>
-#endif
-
-#if defined(OS_WIN)
-#include "base/win/scoped_handle.h"
-#endif
-
-#if defined(OS_FUCHSIA)
-#include <zircon/process.h>
-#include <zircon/syscalls.h>
-#include "base/fuchsia/scoped_zx_handle.h"
-#endif
-
-namespace base {
-
-namespace {
-
-#if !defined(OS_MACOSX) && !defined(OS_FUCHSIA)
-// Each thread will open the shared memory.  Each thread will take a different 4
-// byte int pointer, and keep changing it, with some small pauses in between.
-// Verify that each thread's value in the shared memory is always correct.
-class MultipleThreadMain : public PlatformThread::Delegate {
- public:
-  explicit MultipleThreadMain(int16_t id) : id_(id) {}
-  ~MultipleThreadMain() override = default;
-
-  static void CleanUp() {
-    SharedMemory memory;
-    memory.Delete(s_test_name_);
-  }
-
-  // PlatformThread::Delegate interface.
-  void ThreadMain() override {
-    const uint32_t kDataSize = 1024;
-    SharedMemory memory;
-    bool rv = memory.CreateNamedDeprecated(s_test_name_, true, kDataSize);
-    EXPECT_TRUE(rv);
-    rv = memory.Map(kDataSize);
-    EXPECT_TRUE(rv);
-    int* ptr = static_cast<int*>(memory.memory()) + id_;
-    EXPECT_EQ(0, *ptr);
-
-    for (int idx = 0; idx < 100; idx++) {
-      *ptr = idx;
-      PlatformThread::Sleep(TimeDelta::FromMilliseconds(1));
-      EXPECT_EQ(*ptr, idx);
-    }
-    // Reset back to 0 for the next test that uses the same name.
-    *ptr = 0;
-
-    memory.Close();
-  }
-
- private:
-  int16_t id_;
-
-  static const char s_test_name_[];
-
-  DISALLOW_COPY_AND_ASSIGN(MultipleThreadMain);
-};
-
-const char MultipleThreadMain::s_test_name_[] =
-    "SharedMemoryOpenThreadTest";
-#endif  // !defined(OS_MACOSX) && !defined(OS_FUCHSIA)
-
-enum class Mode {
-  Default,
-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-  DisableDevShm = 1,
-#endif
-};
-
-class SharedMemoryTest : public ::testing::TestWithParam<Mode> {
- public:
-  void SetUp() override {
-    switch (GetParam()) {
-      case Mode::Default:
-        break;
-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-      case Mode::DisableDevShm:
-        CommandLine* cmdline = CommandLine::ForCurrentProcess();
-        cmdline->AppendSwitch(switches::kDisableDevShmUsage);
-        break;
-#endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
-    }
-  }
-};
-
-}  // namespace
-
-// Android/Mac/Fuchsia doesn't support SharedMemory::Open/Delete/
-// CreateNamedDeprecated(openExisting=true)
-#if !defined(OS_ANDROID) && !defined(OS_MACOSX) && !defined(OS_FUCHSIA)
-
-TEST_P(SharedMemoryTest, OpenClose) {
-  const uint32_t kDataSize = 1024;
-  std::string test_name = "SharedMemoryOpenCloseTest";
-
-  // Open two handles to a memory segment, confirm that they are mapped
-  // separately yet point to the same space.
-  SharedMemory memory1;
-  bool rv = memory1.Delete(test_name);
-  EXPECT_TRUE(rv);
-  rv = memory1.Delete(test_name);
-  EXPECT_TRUE(rv);
-  rv = memory1.Open(test_name, false);
-  EXPECT_FALSE(rv);
-  rv = memory1.CreateNamedDeprecated(test_name, false, kDataSize);
-  EXPECT_TRUE(rv);
-  rv = memory1.Map(kDataSize);
-  EXPECT_TRUE(rv);
-  SharedMemory memory2;
-  rv = memory2.Open(test_name, false);
-  EXPECT_TRUE(rv);
-  rv = memory2.Map(kDataSize);
-  EXPECT_TRUE(rv);
-  EXPECT_NE(memory1.memory(), memory2.memory());  // Compare the pointers.
-
-  // Make sure we don't segfault. (it actually happened!)
-  ASSERT_NE(memory1.memory(), static_cast<void*>(nullptr));
-  ASSERT_NE(memory2.memory(), static_cast<void*>(nullptr));
-
-  // Write data to the first memory segment, verify contents of second.
-  memset(memory1.memory(), '1', kDataSize);
-  EXPECT_EQ(memcmp(memory1.memory(), memory2.memory(), kDataSize), 0);
-
-  // Close the first memory segment, and verify the second has the right data.
-  memory1.Close();
-  char* start_ptr = static_cast<char*>(memory2.memory());
-  char* end_ptr = start_ptr + kDataSize;
-  for (char* ptr = start_ptr; ptr < end_ptr; ptr++)
-    EXPECT_EQ(*ptr, '1');
-
-  // Close the second memory segment.
-  memory2.Close();
-
-  rv = memory1.Delete(test_name);
-  EXPECT_TRUE(rv);
-  rv = memory2.Delete(test_name);
-  EXPECT_TRUE(rv);
-}
-
-TEST_P(SharedMemoryTest, OpenExclusive) {
-  const uint32_t kDataSize = 1024;
-  const uint32_t kDataSize2 = 2048;
-  std::ostringstream test_name_stream;
-  test_name_stream << "SharedMemoryOpenExclusiveTest."
-                   << Time::Now().ToDoubleT();
-  std::string test_name = test_name_stream.str();
-
-  // Open two handles to a memory segment and check that
-  // open_existing_deprecated works as expected.
-  SharedMemory memory1;
-  bool rv = memory1.CreateNamedDeprecated(test_name, false, kDataSize);
-  EXPECT_TRUE(rv);
-
-  // Memory1 knows it's size because it created it.
-  EXPECT_EQ(memory1.requested_size(), kDataSize);
-
-  rv = memory1.Map(kDataSize);
-  EXPECT_TRUE(rv);
-
-  // The mapped memory1 must be at least the size we asked for.
-  EXPECT_GE(memory1.mapped_size(), kDataSize);
-
-  // The mapped memory1 shouldn't exceed rounding for allocation granularity.
-  EXPECT_LT(memory1.mapped_size(),
-            kDataSize + SysInfo::VMAllocationGranularity());
-
-  memset(memory1.memory(), 'G', kDataSize);
-
-  SharedMemory memory2;
-  // Should not be able to create if openExisting is false.
-  rv = memory2.CreateNamedDeprecated(test_name, false, kDataSize2);
-  EXPECT_FALSE(rv);
-
-  // Should be able to create with openExisting true.
-  rv = memory2.CreateNamedDeprecated(test_name, true, kDataSize2);
-  EXPECT_TRUE(rv);
-
-  // Memory2 shouldn't know the size because we didn't create it.
-  EXPECT_EQ(memory2.requested_size(), 0U);
-
-  // We should be able to map the original size.
-  rv = memory2.Map(kDataSize);
-  EXPECT_TRUE(rv);
-
-  // The mapped memory2 must be at least the size of the original.
-  EXPECT_GE(memory2.mapped_size(), kDataSize);
-
-  // The mapped memory2 shouldn't exceed rounding for allocation granularity.
-  EXPECT_LT(memory2.mapped_size(),
-            kDataSize2 + SysInfo::VMAllocationGranularity());
-
-  // Verify that opening memory2 didn't truncate or delete memory 1.
-  char* start_ptr = static_cast<char*>(memory2.memory());
-  char* end_ptr = start_ptr + kDataSize;
-  for (char* ptr = start_ptr; ptr < end_ptr; ptr++) {
-    EXPECT_EQ(*ptr, 'G');
-  }
-
-  memory1.Close();
-  memory2.Close();
-
-  rv = memory1.Delete(test_name);
-  EXPECT_TRUE(rv);
-}
-#endif  // !defined(OS_ANDROID) && !defined(OS_MACOSX) && !defined(OS_FUCHSIA)
-
-// Check that memory is still mapped after its closed.
-TEST_P(SharedMemoryTest, CloseNoUnmap) {
-  const size_t kDataSize = 4096;
-
-  SharedMemory memory;
-  ASSERT_TRUE(memory.CreateAndMapAnonymous(kDataSize));
-  char* ptr = static_cast<char*>(memory.memory());
-  ASSERT_NE(ptr, static_cast<void*>(nullptr));
-  memset(ptr, 'G', kDataSize);
-
-  memory.Close();
-
-  EXPECT_EQ(ptr, memory.memory());
-  EXPECT_TRUE(!memory.handle().IsValid());
-
-  for (size_t i = 0; i < kDataSize; i++) {
-    EXPECT_EQ('G', ptr[i]);
-  }
-
-  memory.Unmap();
-  EXPECT_EQ(nullptr, memory.memory());
-}
-
-#if !defined(OS_MACOSX) && !defined(OS_FUCHSIA)
-// Create a set of N threads to each open a shared memory segment and write to
-// it. Verify that they are always reading/writing consistent data.
-TEST_P(SharedMemoryTest, MultipleThreads) {
-  const int kNumThreads = 5;
-
-  MultipleThreadMain::CleanUp();
-  // On POSIX we have a problem when 2 threads try to create the shmem
-  // (a file) at exactly the same time, since create both creates the
-  // file and zerofills it.  We solve the problem for this unit test
-  // (make it not flaky) by starting with 1 thread, then
-  // intentionally don't clean up its shmem before running with
-  // kNumThreads.
-
-  int threadcounts[] = { 1, kNumThreads };
-  for (size_t i = 0; i < arraysize(threadcounts); i++) {
-    int numthreads = threadcounts[i];
-    std::unique_ptr<PlatformThreadHandle[]> thread_handles;
-    std::unique_ptr<MultipleThreadMain* []> thread_delegates;
-
-    thread_handles.reset(new PlatformThreadHandle[numthreads]);
-    thread_delegates.reset(new MultipleThreadMain*[numthreads]);
-
-    // Spawn the threads.
-    for (int16_t index = 0; index < numthreads; index++) {
-      PlatformThreadHandle pth;
-      thread_delegates[index] = new MultipleThreadMain(index);
-      EXPECT_TRUE(PlatformThread::Create(0, thread_delegates[index], &pth));
-      thread_handles[index] = pth;
-    }
-
-    // Wait for the threads to finish.
-    for (int index = 0; index < numthreads; index++) {
-      PlatformThread::Join(thread_handles[index]);
-      delete thread_delegates[index];
-    }
-  }
-  MultipleThreadMain::CleanUp();
-}
-#endif
-
-// Allocate private (unique) shared memory with an empty string for a
-// name.  Make sure several of them don't point to the same thing as
-// we might expect if the names are equal.
-TEST_P(SharedMemoryTest, AnonymousPrivate) {
-  int i, j;
-  int count = 4;
-  bool rv;
-  const uint32_t kDataSize = 8192;
-
-  std::unique_ptr<SharedMemory[]> memories(new SharedMemory[count]);
-  std::unique_ptr<int* []> pointers(new int*[count]);
-  ASSERT_TRUE(memories.get());
-  ASSERT_TRUE(pointers.get());
-
-  for (i = 0; i < count; i++) {
-    rv = memories[i].CreateAndMapAnonymous(kDataSize);
-    EXPECT_TRUE(rv);
-    int* ptr = static_cast<int*>(memories[i].memory());
-    EXPECT_TRUE(ptr);
-    pointers[i] = ptr;
-  }
-
-  for (i = 0; i < count; i++) {
-    // zero out the first int in each except for i; for that one, make it 100.
-    for (j = 0; j < count; j++) {
-      if (i == j)
-        pointers[j][0] = 100;
-      else
-        pointers[j][0] = 0;
-    }
-    // make sure there is no bleeding of the 100 into the other pointers
-    for (j = 0; j < count; j++) {
-      if (i == j)
-        EXPECT_EQ(100, pointers[j][0]);
-      else
-        EXPECT_EQ(0, pointers[j][0]);
-    }
-  }
-
-  for (int i = 0; i < count; i++) {
-    memories[i].Close();
-  }
-}
-
-TEST_P(SharedMemoryTest, GetReadOnlyHandle) {
-  StringPiece contents = "Hello World";
-
-  SharedMemory writable_shmem;
-  SharedMemoryCreateOptions options;
-  options.size = contents.size();
-  options.share_read_only = true;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  // The Mach functionality is tested in shared_memory_mac_unittest.cc.
-  options.type = SharedMemoryHandle::POSIX;
-#endif
-  ASSERT_TRUE(writable_shmem.Create(options));
-  ASSERT_TRUE(writable_shmem.Map(options.size));
-  memcpy(writable_shmem.memory(), contents.data(), contents.size());
-  EXPECT_TRUE(writable_shmem.Unmap());
-
-  SharedMemoryHandle readonly_handle = writable_shmem.GetReadOnlyHandle();
-  EXPECT_EQ(writable_shmem.handle().GetGUID(), readonly_handle.GetGUID());
-  EXPECT_EQ(writable_shmem.handle().GetSize(), readonly_handle.GetSize());
-  ASSERT_TRUE(readonly_handle.IsValid());
-  SharedMemory readonly_shmem(readonly_handle, /*readonly=*/true);
-
-  ASSERT_TRUE(readonly_shmem.Map(contents.size()));
-  EXPECT_EQ(contents,
-            StringPiece(static_cast<const char*>(readonly_shmem.memory()),
-                        contents.size()));
-  EXPECT_TRUE(readonly_shmem.Unmap());
-
-#if defined(OS_ANDROID)
-  // On Android, mapping a region through a read-only descriptor makes the
-  // region read-only. Any writable mapping attempt should fail.
-  ASSERT_FALSE(writable_shmem.Map(contents.size()));
-#else
-  // Make sure the writable instance is still writable.
-  ASSERT_TRUE(writable_shmem.Map(contents.size()));
-  StringPiece new_contents = "Goodbye";
-  memcpy(writable_shmem.memory(), new_contents.data(), new_contents.size());
-  EXPECT_EQ(new_contents,
-            StringPiece(static_cast<const char*>(writable_shmem.memory()),
-                        new_contents.size()));
-#endif
-
-  // We'd like to check that if we send the read-only segment to another
-  // process, then that other process can't reopen it read/write.  (Since that
-  // would be a security hole.)  Setting up multiple processes is hard in a
-  // unittest, so this test checks that the *current* process can't reopen the
-  // segment read/write.  I think the test here is stronger than we actually
-  // care about, but there's a remote possibility that sending a file over a
-  // pipe would transform it into read/write.
-  SharedMemoryHandle handle = readonly_shmem.handle();
-
-#if defined(OS_ANDROID)
-  // The "read-only" handle is still writable on Android:
-  // http://crbug.com/320865
-  (void)handle;
-#elif defined(OS_FUCHSIA)
-  uintptr_t addr;
-  EXPECT_NE(ZX_OK, zx_vmar_map(zx_vmar_root_self(), 0, handle.GetHandle(), 0,
-                               contents.size(), ZX_VM_FLAG_PERM_WRITE, &addr))
-      << "Shouldn't be able to map as writable.";
-
-  ScopedZxHandle duped_handle;
-  EXPECT_NE(ZX_OK, zx_handle_duplicate(handle.GetHandle(), ZX_RIGHT_WRITE,
-                                       duped_handle.receive()))
-      << "Shouldn't be able to duplicate the handle into a writable one.";
-
-  EXPECT_EQ(ZX_OK, zx_handle_duplicate(handle.GetHandle(), ZX_RIGHT_READ,
-                                       duped_handle.receive()))
-      << "Should be able to duplicate the handle into a readable one.";
-#elif defined(OS_POSIX)
-  int handle_fd = SharedMemory::GetFdFromSharedMemoryHandle(handle);
-  EXPECT_EQ(O_RDONLY, fcntl(handle_fd, F_GETFL) & O_ACCMODE)
-      << "The descriptor itself should be read-only.";
-
-  errno = 0;
-  void* writable = mmap(nullptr, contents.size(), PROT_READ | PROT_WRITE,
-                        MAP_SHARED, handle_fd, 0);
-  int mmap_errno = errno;
-  EXPECT_EQ(MAP_FAILED, writable)
-      << "It shouldn't be possible to re-mmap the descriptor writable.";
-  EXPECT_EQ(EACCES, mmap_errno) << strerror(mmap_errno);
-  if (writable != MAP_FAILED)
-    EXPECT_EQ(0, munmap(writable, readonly_shmem.mapped_size()));
-
-#elif defined(OS_WIN)
-  EXPECT_EQ(NULL, MapViewOfFile(handle.GetHandle(), FILE_MAP_WRITE, 0, 0, 0))
-      << "Shouldn't be able to map memory writable.";
-
-  HANDLE temp_handle;
-  BOOL rv = ::DuplicateHandle(GetCurrentProcess(), handle.GetHandle(),
-                              GetCurrentProcess(), &temp_handle,
-                              FILE_MAP_ALL_ACCESS, false, 0);
-  EXPECT_EQ(FALSE, rv)
-      << "Shouldn't be able to duplicate the handle into a writable one.";
-  if (rv)
-    win::ScopedHandle writable_handle(temp_handle);
-  rv = ::DuplicateHandle(GetCurrentProcess(), handle.GetHandle(),
-                         GetCurrentProcess(), &temp_handle, FILE_MAP_READ,
-                         false, 0);
-  EXPECT_EQ(TRUE, rv)
-      << "Should be able to duplicate the handle into a readable one.";
-  if (rv)
-    win::ScopedHandle writable_handle(temp_handle);
-#else
-#error Unexpected platform; write a test that tries to make 'handle' writable.
-#endif  // defined(OS_POSIX) || defined(OS_WIN)
-}
-
-TEST_P(SharedMemoryTest, ShareToSelf) {
-  StringPiece contents = "Hello World";
-
-  SharedMemory shmem;
-  ASSERT_TRUE(shmem.CreateAndMapAnonymous(contents.size()));
-  memcpy(shmem.memory(), contents.data(), contents.size());
-  EXPECT_TRUE(shmem.Unmap());
-
-  SharedMemoryHandle shared_handle = shmem.handle().Duplicate();
-  ASSERT_TRUE(shared_handle.IsValid());
-  EXPECT_TRUE(shared_handle.OwnershipPassesToIPC());
-  EXPECT_EQ(shared_handle.GetGUID(), shmem.handle().GetGUID());
-  EXPECT_EQ(shared_handle.GetSize(), shmem.handle().GetSize());
-  SharedMemory shared(shared_handle, /*readonly=*/false);
-
-  ASSERT_TRUE(shared.Map(contents.size()));
-  EXPECT_EQ(
-      contents,
-      StringPiece(static_cast<const char*>(shared.memory()), contents.size()));
-
-  shared_handle = shmem.handle().Duplicate();
-  ASSERT_TRUE(shared_handle.IsValid());
-  ASSERT_TRUE(shared_handle.OwnershipPassesToIPC());
-  SharedMemory readonly(shared_handle, /*readonly=*/true);
-
-  ASSERT_TRUE(readonly.Map(contents.size()));
-  EXPECT_EQ(contents,
-            StringPiece(static_cast<const char*>(readonly.memory()),
-                        contents.size()));
-}
-
-TEST_P(SharedMemoryTest, ShareWithMultipleInstances) {
-  static const StringPiece kContents = "Hello World";
-
-  SharedMemory shmem;
-  ASSERT_TRUE(shmem.CreateAndMapAnonymous(kContents.size()));
-  // We do not need to unmap |shmem| to let |shared| map.
-  const StringPiece shmem_contents(static_cast<const char*>(shmem.memory()),
-                                   shmem.requested_size());
-
-  SharedMemoryHandle shared_handle = shmem.handle().Duplicate();
-  ASSERT_TRUE(shared_handle.IsValid());
-  SharedMemory shared(shared_handle, /*readonly=*/false);
-  ASSERT_TRUE(shared.Map(kContents.size()));
-  // The underlying shared memory is created by |shmem|, so both
-  // |shared|.requested_size() and |readonly|.requested_size() are zero.
-  ASSERT_EQ(0U, shared.requested_size());
-  const StringPiece shared_contents(static_cast<const char*>(shared.memory()),
-                                    shmem.requested_size());
-
-  shared_handle = shmem.handle().Duplicate();
-  ASSERT_TRUE(shared_handle.IsValid());
-  ASSERT_TRUE(shared_handle.OwnershipPassesToIPC());
-  SharedMemory readonly(shared_handle, /*readonly=*/true);
-  ASSERT_TRUE(readonly.Map(kContents.size()));
-  ASSERT_EQ(0U, readonly.requested_size());
-  const StringPiece readonly_contents(
-      static_cast<const char*>(readonly.memory()),
-      shmem.requested_size());
-
-  // |shmem| should be able to update the content.
-  memcpy(shmem.memory(), kContents.data(), kContents.size());
-
-  ASSERT_EQ(kContents, shmem_contents);
-  ASSERT_EQ(kContents, shared_contents);
-  ASSERT_EQ(kContents, readonly_contents);
-
-  // |shared| should also be able to update the content.
-  memcpy(shared.memory(), ToLowerASCII(kContents).c_str(), kContents.size());
-
-  ASSERT_EQ(StringPiece(ToLowerASCII(kContents)), shmem_contents);
-  ASSERT_EQ(StringPiece(ToLowerASCII(kContents)), shared_contents);
-  ASSERT_EQ(StringPiece(ToLowerASCII(kContents)), readonly_contents);
-}
-
-TEST_P(SharedMemoryTest, MapAt) {
-  ASSERT_TRUE(SysInfo::VMAllocationGranularity() >= sizeof(uint32_t));
-  const size_t kCount = SysInfo::VMAllocationGranularity();
-  const size_t kDataSize = kCount * sizeof(uint32_t);
-
-  SharedMemory memory;
-  ASSERT_TRUE(memory.CreateAndMapAnonymous(kDataSize));
-  uint32_t* ptr = static_cast<uint32_t*>(memory.memory());
-  ASSERT_NE(ptr, static_cast<void*>(nullptr));
-
-  for (size_t i = 0; i < kCount; ++i) {
-    ptr[i] = i;
-  }
-
-  memory.Unmap();
-
-  off_t offset = SysInfo::VMAllocationGranularity();
-  ASSERT_TRUE(memory.MapAt(offset, kDataSize - offset));
-  offset /= sizeof(uint32_t);
-  ptr = static_cast<uint32_t*>(memory.memory());
-  ASSERT_NE(ptr, static_cast<void*>(nullptr));
-  for (size_t i = offset; i < kCount; ++i) {
-    EXPECT_EQ(ptr[i - offset], i);
-  }
-}
-
-TEST_P(SharedMemoryTest, MapTwice) {
-  const uint32_t kDataSize = 1024;
-  SharedMemory memory;
-  bool rv = memory.CreateAndMapAnonymous(kDataSize);
-  EXPECT_TRUE(rv);
-
-  void* old_address = memory.memory();
-
-  rv = memory.Map(kDataSize);
-  EXPECT_FALSE(rv);
-  EXPECT_EQ(old_address, memory.memory());
-}
-
-#if defined(OS_POSIX)
-// This test is not applicable for iOS (crbug.com/399384).
-#if !defined(OS_IOS)
-// Create a shared memory object, mmap it, and mprotect it to PROT_EXEC.
-TEST_P(SharedMemoryTest, AnonymousExecutable) {
-  const uint32_t kTestSize = 1 << 16;
-
-  SharedMemory shared_memory;
-  SharedMemoryCreateOptions options;
-  options.size = kTestSize;
-  options.executable = true;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  // The Mach functionality is tested in shared_memory_mac_unittest.cc.
-  options.type = SharedMemoryHandle::POSIX;
-#endif
-
-  EXPECT_TRUE(shared_memory.Create(options));
-  EXPECT_TRUE(shared_memory.Map(shared_memory.requested_size()));
-
-  EXPECT_EQ(0, mprotect(shared_memory.memory(), shared_memory.requested_size(),
-                        PROT_READ | PROT_EXEC));
-}
-#endif  // !defined(OS_IOS)
-
-#if defined(OS_ANDROID)
-// This test is restricted to Android since there is no way on other platforms
-// to guarantee that a region can never be mapped with PROT_EXEC. E.g. on
-// Linux, anonymous shared regions come from /dev/shm which can be mounted
-// without 'noexec'. In this case, anything can perform an mprotect() to
-// change the protection mask of a given page.
-TEST(SharedMemoryTest, AnonymousIsNotExecutableByDefault) {
-  const uint32_t kTestSize = 1 << 16;
-
-  SharedMemory shared_memory;
-  SharedMemoryCreateOptions options;
-  options.size = kTestSize;
-
-  EXPECT_TRUE(shared_memory.Create(options));
-  EXPECT_TRUE(shared_memory.Map(shared_memory.requested_size()));
-
-  errno = 0;
-  EXPECT_EQ(-1, mprotect(shared_memory.memory(), shared_memory.requested_size(),
-                         PROT_READ | PROT_EXEC));
-  EXPECT_EQ(EACCES, errno);
-}
-#endif  // OS_ANDROID
-
-// Android supports a different permission model than POSIX for its "ashmem"
-// shared memory implementation. So the tests about file permissions are not
-// included on Android. Fuchsia does not use a file-backed shared memory
-// implementation.
-
-#if !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
-
-// Set a umask and restore the old mask on destruction.
-class ScopedUmaskSetter {
- public:
-  explicit ScopedUmaskSetter(mode_t target_mask) {
-    old_umask_ = umask(target_mask);
-  }
-  ~ScopedUmaskSetter() { umask(old_umask_); }
- private:
-  mode_t old_umask_;
-  DISALLOW_IMPLICIT_CONSTRUCTORS(ScopedUmaskSetter);
-};
-
-// Create a shared memory object, check its permissions.
-TEST_P(SharedMemoryTest, FilePermissionsAnonymous) {
-  const uint32_t kTestSize = 1 << 8;
-
-  SharedMemory shared_memory;
-  SharedMemoryCreateOptions options;
-  options.size = kTestSize;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  // The Mach functionality is tested in shared_memory_mac_unittest.cc.
-  options.type = SharedMemoryHandle::POSIX;
-#endif
-  // Set a file mode creation mask that gives all permissions.
-  ScopedUmaskSetter permissive_mask(S_IWGRP | S_IWOTH);
-
-  EXPECT_TRUE(shared_memory.Create(options));
-
-  int shm_fd =
-      SharedMemory::GetFdFromSharedMemoryHandle(shared_memory.handle());
-  struct stat shm_stat;
-  EXPECT_EQ(0, fstat(shm_fd, &shm_stat));
-  // Neither the group, nor others should be able to read the shared memory
-  // file.
-  EXPECT_FALSE(shm_stat.st_mode & S_IRWXO);
-  EXPECT_FALSE(shm_stat.st_mode & S_IRWXG);
-}
-
-// Create a shared memory object, check its permissions.
-TEST_P(SharedMemoryTest, FilePermissionsNamed) {
-  const uint32_t kTestSize = 1 << 8;
-
-  SharedMemory shared_memory;
-  SharedMemoryCreateOptions options;
-  options.size = kTestSize;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  // The Mach functionality is tested in shared_memory_mac_unittest.cc.
-  options.type = SharedMemoryHandle::POSIX;
-#endif
-
-  // Set a file mode creation mask that gives all permissions.
-  ScopedUmaskSetter permissive_mask(S_IWGRP | S_IWOTH);
-
-  EXPECT_TRUE(shared_memory.Create(options));
-
-  int fd = SharedMemory::GetFdFromSharedMemoryHandle(shared_memory.handle());
-  struct stat shm_stat;
-  EXPECT_EQ(0, fstat(fd, &shm_stat));
-  // Neither the group, nor others should have been able to open the shared
-  // memory file while its name existed.
-  EXPECT_FALSE(shm_stat.st_mode & S_IRWXO);
-  EXPECT_FALSE(shm_stat.st_mode & S_IRWXG);
-}
-#endif  // !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
-
-#endif  // defined(OS_POSIX)
-
-// Map() will return addresses which are aligned to the platform page size, this
-// varies from platform to platform though.  Since we'd like to advertise a
-// minimum alignment that callers can count on, test for it here.
-TEST_P(SharedMemoryTest, MapMinimumAlignment) {
-  static const int kDataSize = 8192;
-
-  SharedMemory shared_memory;
-  ASSERT_TRUE(shared_memory.CreateAndMapAnonymous(kDataSize));
-  EXPECT_EQ(0U, reinterpret_cast<uintptr_t>(
-      shared_memory.memory()) & (SharedMemory::MAP_MINIMUM_ALIGNMENT - 1));
-  shared_memory.Close();
-}
-
-#if defined(OS_WIN)
-TEST_P(SharedMemoryTest, UnsafeImageSection) {
-  const char kTestSectionName[] = "UnsafeImageSection";
-  wchar_t path[MAX_PATH];
-  EXPECT_GT(::GetModuleFileName(nullptr, path, arraysize(path)), 0U);
-
-  // Map the current executable image to save us creating a new PE file on disk.
-  base::win::ScopedHandle file_handle(::CreateFile(
-      path, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, 0, nullptr));
-  EXPECT_TRUE(file_handle.IsValid());
-  base::win::ScopedHandle section_handle(
-      ::CreateFileMappingA(file_handle.Get(), nullptr,
-                           PAGE_READONLY | SEC_IMAGE, 0, 0, kTestSectionName));
-  EXPECT_TRUE(section_handle.IsValid());
-
-  // Check direct opening by name, from handle and duplicated from handle.
-  SharedMemory shared_memory_open;
-  EXPECT_TRUE(shared_memory_open.Open(kTestSectionName, true));
-  EXPECT_FALSE(shared_memory_open.Map(1));
-  EXPECT_EQ(nullptr, shared_memory_open.memory());
-
-  SharedMemory shared_memory_handle_local(
-      SharedMemoryHandle(section_handle.Take(), 1, UnguessableToken::Create()),
-      true);
-  EXPECT_FALSE(shared_memory_handle_local.Map(1));
-  EXPECT_EQ(nullptr, shared_memory_handle_local.memory());
-
-  // Check that a handle without SECTION_QUERY also can't be mapped as it can't
-  // be checked.
-  SharedMemory shared_memory_handle_dummy;
-  SharedMemoryCreateOptions options;
-  options.size = 0x1000;
-  EXPECT_TRUE(shared_memory_handle_dummy.Create(options));
-  HANDLE handle_no_query;
-  EXPECT_TRUE(::DuplicateHandle(
-      ::GetCurrentProcess(), shared_memory_handle_dummy.handle().GetHandle(),
-      ::GetCurrentProcess(), &handle_no_query, FILE_MAP_READ, FALSE, 0));
-  SharedMemory shared_memory_handle_no_query(
-      SharedMemoryHandle(handle_no_query, options.size,
-                         UnguessableToken::Create()),
-      true);
-  EXPECT_FALSE(shared_memory_handle_no_query.Map(1));
-  EXPECT_EQ(nullptr, shared_memory_handle_no_query.memory());
-}
-#endif  // defined(OS_WIN)
-
-// iOS does not allow multiple processes.
-// Android ashmem does not support named shared memory.
-// Fuchsia SharedMemory does not support named shared memory.
-// Mac SharedMemory does not support named shared memory. crbug.com/345734
-#if !defined(OS_IOS) && !defined(OS_ANDROID) && !defined(OS_MACOSX) && \
-    !defined(OS_FUCHSIA)
-// On POSIX it is especially important we test shmem across processes,
-// not just across threads.  But the test is enabled on all platforms.
-class SharedMemoryProcessTest : public MultiProcessTest {
- public:
-  static void CleanUp() {
-    SharedMemory memory;
-    memory.Delete(s_test_name_);
-  }
-
-  static int TaskTestMain() {
-    int errors = 0;
-    SharedMemory memory;
-    bool rv = memory.CreateNamedDeprecated(s_test_name_, true, s_data_size_);
-    EXPECT_TRUE(rv);
-    if (rv != true)
-      errors++;
-    rv = memory.Map(s_data_size_);
-    EXPECT_TRUE(rv);
-    if (rv != true)
-      errors++;
-    int* ptr = static_cast<int*>(memory.memory());
-
-    // This runs concurrently in multiple processes. Writes need to be atomic.
-    subtle::Barrier_AtomicIncrement(ptr, 1);
-    memory.Close();
-    return errors;
-  }
-
-  static const char s_test_name_[];
-  static const uint32_t s_data_size_;
-};
-
-const char SharedMemoryProcessTest::s_test_name_[] = "MPMem";
-const uint32_t SharedMemoryProcessTest::s_data_size_ = 1024;
-
-TEST_F(SharedMemoryProcessTest, SharedMemoryAcrossProcesses) {
-  const int kNumTasks = 5;
-
-  SharedMemoryProcessTest::CleanUp();
-
-  // Create a shared memory region. Set the first word to 0.
-  SharedMemory memory;
-  bool rv = memory.CreateNamedDeprecated(s_test_name_, true, s_data_size_);
-  ASSERT_TRUE(rv);
-  rv = memory.Map(s_data_size_);
-  ASSERT_TRUE(rv);
-  int* ptr = static_cast<int*>(memory.memory());
-  *ptr = 0;
-
-  // Start |kNumTasks| processes, each of which atomically increments the first
-  // word by 1.
-  Process processes[kNumTasks];
-  for (int index = 0; index < kNumTasks; ++index) {
-    processes[index] = SpawnChild("SharedMemoryTestMain");
-    ASSERT_TRUE(processes[index].IsValid());
-  }
-
-  // Check that each process exited correctly.
-  int exit_code = 0;
-  for (int index = 0; index < kNumTasks; ++index) {
-    EXPECT_TRUE(processes[index].WaitForExit(&exit_code));
-    EXPECT_EQ(0, exit_code);
-  }
-
-  // Check that the shared memory region reflects |kNumTasks| increments.
-  ASSERT_EQ(kNumTasks, *ptr);
-
-  memory.Close();
-  SharedMemoryProcessTest::CleanUp();
-}
-
-MULTIPROCESS_TEST_MAIN(SharedMemoryTestMain) {
-  return SharedMemoryProcessTest::TaskTestMain();
-}
-#endif  // !defined(OS_IOS) && !defined(OS_ANDROID) && !defined(OS_MACOSX) &&
-        // !defined(OS_FUCHSIA)
-
-TEST_P(SharedMemoryTest, MappedId) {
-  const uint32_t kDataSize = 1024;
-  SharedMemory memory;
-  SharedMemoryCreateOptions options;
-  options.size = kDataSize;
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  // The Mach functionality is tested in shared_memory_mac_unittest.cc.
-  options.type = SharedMemoryHandle::POSIX;
-#endif
-
-  EXPECT_TRUE(memory.Create(options));
-  base::UnguessableToken id = memory.handle().GetGUID();
-  EXPECT_FALSE(id.is_empty());
-  EXPECT_TRUE(memory.mapped_id().is_empty());
-
-  EXPECT_TRUE(memory.Map(kDataSize));
-  EXPECT_EQ(id, memory.mapped_id());
-
-  memory.Close();
-  EXPECT_EQ(id, memory.mapped_id());
-
-  memory.Unmap();
-  EXPECT_TRUE(memory.mapped_id().is_empty());
-}
-
-INSTANTIATE_TEST_CASE_P(Default,
-                        SharedMemoryTest,
-                        ::testing::Values(Mode::Default));
-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-INSTANTIATE_TEST_CASE_P(SkipDevShm,
-                        SharedMemoryTest,
-                        ::testing::Values(Mode::DisableDevShm));
-#endif  // defined(OS_LINUX) && !defined(OS_CHROMEOS)
-
-#if defined(OS_ANDROID)
-TEST(SharedMemoryTest, ReadOnlyRegions) {
-  const uint32_t kDataSize = 1024;
-  SharedMemory memory;
-  SharedMemoryCreateOptions options;
-  options.size = kDataSize;
-  EXPECT_TRUE(memory.Create(options));
-
-  EXPECT_FALSE(memory.handle().IsRegionReadOnly());
-
-  // Check that it is possible to map the region directly from the fd.
-  int region_fd = memory.handle().GetHandle();
-  EXPECT_GE(region_fd, 0);
-  void* address = mmap(nullptr, kDataSize, PROT_READ | PROT_WRITE, MAP_SHARED,
-                       region_fd, 0);
-  bool success = address && address != MAP_FAILED;
-  ASSERT_TRUE(address);
-  ASSERT_NE(address, MAP_FAILED);
-  if (success) {
-    EXPECT_EQ(0, munmap(address, kDataSize));
-  }
-
-  ASSERT_TRUE(memory.handle().SetRegionReadOnly());
-  EXPECT_TRUE(memory.handle().IsRegionReadOnly());
-
-  // Check that it is no longer possible to map the region read/write.
-  errno = 0;
-  address = mmap(nullptr, kDataSize, PROT_READ | PROT_WRITE, MAP_SHARED,
-                 region_fd, 0);
-  success = address && address != MAP_FAILED;
-  ASSERT_FALSE(success);
-  ASSERT_EQ(EPERM, errno);
-  if (success) {
-    EXPECT_EQ(0, munmap(address, kDataSize));
-  }
-}
-
-TEST(SharedMemoryTest, ReadOnlyDescriptors) {
-  const uint32_t kDataSize = 1024;
-  SharedMemory memory;
-  SharedMemoryCreateOptions options;
-  options.size = kDataSize;
-  EXPECT_TRUE(memory.Create(options));
-
-  EXPECT_FALSE(memory.handle().IsRegionReadOnly());
-
-  // Getting a read-only descriptor should not make the region read-only itself.
-  SharedMemoryHandle ro_handle = memory.GetReadOnlyHandle();
-  EXPECT_FALSE(memory.handle().IsRegionReadOnly());
-
-  // Mapping a writable region from a read-only descriptor should not
-  // be possible, it will DCHECK() in debug builds (see test below),
-  // while returning false on release ones.
-  {
-    bool dcheck_fired = false;
-    logging::ScopedLogAssertHandler log_assert(
-        base::BindRepeating([](bool* flag, const char*, int, base::StringPiece,
-                               base::StringPiece) { *flag = true; },
-                            base::Unretained(&dcheck_fired)));
-
-    SharedMemory rw_region(ro_handle.Duplicate(), /* read_only */ false);
-    EXPECT_FALSE(rw_region.Map(kDataSize));
-    EXPECT_EQ(DCHECK_IS_ON() ? true : false, dcheck_fired);
-  }
-
-  // Nor shall it turn the region read-only itself.
-  EXPECT_FALSE(ro_handle.IsRegionReadOnly());
-
-  // Mapping a read-only region from a read-only descriptor should work.
-  SharedMemory ro_region(ro_handle.Duplicate(), /* read_only */ true);
-  EXPECT_TRUE(ro_region.Map(kDataSize));
-
-  // And it should turn the region read-only too.
-  EXPECT_TRUE(ro_handle.IsRegionReadOnly());
-  EXPECT_TRUE(memory.handle().IsRegionReadOnly());
-  EXPECT_FALSE(memory.Map(kDataSize));
-
-  ro_handle.Close();
-}
-
-#endif  // OS_ANDROID
-
-}  // namespace base
diff --git a/base/memory/shared_memory_win_unittest.cc b/base/memory/shared_memory_win_unittest.cc
deleted file mode 100644
index 5fc132d..0000000
--- a/base/memory/shared_memory_win_unittest.cc
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <windows.h>
-#include <sddl.h>
-
-#include <memory>
-
-#include "base/command_line.h"
-#include "base/memory/free_deleter.h"
-#include "base/memory/shared_memory.h"
-#include "base/process/process.h"
-#include "base/rand_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_timeouts.h"
-#include "base/win/scoped_handle.h"
-#include "base/win/win_util.h"
-#include "testing/multiprocess_func_list.h"
-
-namespace base {
-namespace {
-const char* kHandleSwitchName = "shared_memory_win_test_switch";
-
-// Creates a process token with a low integrity SID.
-win::ScopedHandle CreateLowIntegritySID() {
-  HANDLE process_token_raw = nullptr;
-  BOOL success = ::OpenProcessToken(GetCurrentProcess(),
-                                    TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT |
-                                        TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY,
-                                    &process_token_raw);
-  if (!success)
-    return base::win::ScopedHandle();
-  win::ScopedHandle process_token(process_token_raw);
-
-  HANDLE lowered_process_token_raw = nullptr;
-  success =
-      ::DuplicateTokenEx(process_token.Get(), 0, NULL, SecurityImpersonation,
-                         TokenPrimary, &lowered_process_token_raw);
-  if (!success)
-    return base::win::ScopedHandle();
-  win::ScopedHandle lowered_process_token(lowered_process_token_raw);
-
-  // Low integrity SID
-  WCHAR integrity_sid_string[20] = L"S-1-16-4096";
-  PSID integrity_sid = nullptr;
-  success = ::ConvertStringSidToSid(integrity_sid_string, &integrity_sid);
-  if (!success)
-    return base::win::ScopedHandle();
-
-  TOKEN_MANDATORY_LABEL TIL = {};
-  TIL.Label.Attributes = SE_GROUP_INTEGRITY;
-  TIL.Label.Sid = integrity_sid;
-  success = ::SetTokenInformation(
-      lowered_process_token.Get(), TokenIntegrityLevel, &TIL,
-      sizeof(TOKEN_MANDATORY_LABEL) + GetLengthSid(integrity_sid));
-  if (!success)
-    return base::win::ScopedHandle();
-  return lowered_process_token;
-}
-
-// Reads a HANDLE from the pipe as a raw int, least significant digit first.
-win::ScopedHandle ReadHandleFromPipe(HANDLE pipe) {
-  // Read from parent pipe.
-  const size_t buf_size = 1000;
-  char buffer[buf_size];
-  memset(buffer, 0, buf_size);
-  DWORD bytes_read;
-  BOOL success = ReadFile(pipe, buffer, buf_size, &bytes_read, NULL);
-
-  if (!success || bytes_read == 0) {
-    LOG(ERROR) << "Failed to read handle from pipe.";
-    return win::ScopedHandle();
-  }
-
-  int handle_as_int = 0;
-  int power_of_ten = 1;
-  for (unsigned int i = 0; i < bytes_read; ++i) {
-    handle_as_int += buffer[i] * power_of_ten;
-    power_of_ten *= 10;
-  }
-
-  return win::ScopedHandle(reinterpret_cast<HANDLE>(handle_as_int));
-}
-
-// Writes a HANDLE to a pipe as a raw int, least significant digit first.
-void WriteHandleToPipe(HANDLE pipe, HANDLE handle) {
-  uint32_t handle_as_int = base::win::HandleToUint32(handle);
-
-  std::unique_ptr<char, base::FreeDeleter> buffer(
-      static_cast<char*>(malloc(1000)));
-  size_t index = 0;
-  while (handle_as_int > 0) {
-    buffer.get()[index] = handle_as_int % 10;
-    handle_as_int /= 10;
-    ++index;
-  }
-
-  ::ConnectNamedPipe(pipe, nullptr);
-  DWORD written;
-  ASSERT_TRUE(::WriteFile(pipe, buffer.get(), index, &written, NULL));
-}
-
-// Creates a communication pipe with the given name.
-win::ScopedHandle CreateCommunicationPipe(const std::wstring& name) {
-  return win::ScopedHandle(CreateNamedPipe(name.c_str(),  // pipe name
-                                           PIPE_ACCESS_DUPLEX, PIPE_WAIT, 255,
-                                           1000, 1000, 0, NULL));
-}
-
-// Generates a random name for a communication pipe.
-std::wstring CreateCommunicationPipeName() {
-  uint64_t rand_values[4];
-  RandBytes(&rand_values, sizeof(rand_values));
-  std::wstring child_pipe_name = StringPrintf(
-      L"\\\\.\\pipe\\SharedMemoryWinTest_%016llx%016llx%016llx%016llx",
-      rand_values[0], rand_values[1], rand_values[2], rand_values[3]);
-  return child_pipe_name;
-}
-
-class SharedMemoryWinTest : public base::MultiProcessTest {
- protected:
-  CommandLine MakeCmdLine(const std::string& procname) override {
-    CommandLine line = base::MultiProcessTest::MakeCmdLine(procname);
-    line.AppendSwitchASCII(kHandleSwitchName, communication_pipe_name_);
-    return line;
-  }
-
-  std::string communication_pipe_name_;
-};
-
-MULTIPROCESS_TEST_MAIN(LowerPermissions) {
-  std::string handle_name =
-      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(kHandleSwitchName);
-  std::wstring handle_name16 = SysUTF8ToWide(handle_name);
-  win::ScopedHandle parent_pipe(
-      ::CreateFile(handle_name16.c_str(),  // pipe name
-                   GENERIC_READ,
-                   0,              // no sharing
-                   NULL,           // default security attributes
-                   OPEN_EXISTING,  // opens existing pipe
-                   0,              // default attributes
-                   NULL));         // no template file
-  if (parent_pipe.Get() == INVALID_HANDLE_VALUE) {
-    LOG(ERROR) << "Failed to open communication pipe.";
-    return 1;
-  }
-
-  win::ScopedHandle received_handle = ReadHandleFromPipe(parent_pipe.Get());
-  if (!received_handle.Get()) {
-    LOG(ERROR) << "Failed to read handle from pipe.";
-    return 1;
-  }
-
-  // Attempting to add the WRITE_DAC permission should fail.
-  HANDLE duped_handle;
-  BOOL success = ::DuplicateHandle(GetCurrentProcess(), received_handle.Get(),
-                                   GetCurrentProcess(), &duped_handle,
-                                   FILE_MAP_READ | WRITE_DAC, FALSE, 0);
-  if (success) {
-    LOG(ERROR) << "Should not have been able to add WRITE_DAC permission.";
-    return 1;
-  }
-
-  // Attempting to add the FILE_MAP_WRITE permission should fail.
-  success = ::DuplicateHandle(GetCurrentProcess(), received_handle.Get(),
-                              GetCurrentProcess(), &duped_handle,
-                              FILE_MAP_READ | FILE_MAP_WRITE, FALSE, 0);
-  if (success) {
-    LOG(ERROR) << "Should not have been able to add FILE_MAP_WRITE permission.";
-    return 1;
-  }
-
-  // Attempting to duplicate the HANDLE with the same permissions should
-  // succeed.
-  success = ::DuplicateHandle(GetCurrentProcess(), received_handle.Get(),
-                              GetCurrentProcess(), &duped_handle, FILE_MAP_READ,
-                              FALSE, 0);
-  if (!success) {
-    LOG(ERROR) << "Failed to duplicate handle.";
-    return 4;
-  }
-  ::CloseHandle(duped_handle);
-  return 0;
-}
-
-TEST_F(SharedMemoryWinTest, LowerPermissions) {
-  std::wstring communication_pipe_name = CreateCommunicationPipeName();
-  communication_pipe_name_ = SysWideToUTF8(communication_pipe_name);
-
-  win::ScopedHandle communication_pipe =
-      CreateCommunicationPipe(communication_pipe_name);
-  ASSERT_TRUE(communication_pipe.Get());
-
-  win::ScopedHandle lowered_process_token = CreateLowIntegritySID();
-  ASSERT_TRUE(lowered_process_token.Get());
-
-  base::LaunchOptions options;
-  options.as_user = lowered_process_token.Get();
-  base::Process process = SpawnChildWithOptions("LowerPermissions", options);
-  ASSERT_TRUE(process.IsValid());
-
-  SharedMemory memory;
-  memory.CreateAndMapAnonymous(1001);
-
-  // Duplicate into child process, giving only FILE_MAP_READ permissions.
-  HANDLE raw_handle = nullptr;
-  ::DuplicateHandle(::GetCurrentProcess(), memory.handle().GetHandle(),
-                    process.Handle(), &raw_handle,
-                    FILE_MAP_READ | SECTION_QUERY, FALSE, 0);
-  ASSERT_TRUE(raw_handle);
-
-  WriteHandleToPipe(communication_pipe.Get(), raw_handle);
-
-  int exit_code;
-  EXPECT_TRUE(process.WaitForExitWithTimeout(TestTimeouts::action_max_timeout(),
-                                             &exit_code));
-  EXPECT_EQ(0, exit_code);
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/memory/singleton_unittest.cc b/base/memory/singleton_unittest.cc
deleted file mode 100644
index 06e53b2..0000000
--- a/base/memory/singleton_unittest.cc
+++ /dev/null
@@ -1,299 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-
-#include "base/at_exit.h"
-#include "base/memory/singleton.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-static_assert(DefaultSingletonTraits<int>::kRegisterAtExit == true,
-              "object must be deleted on process exit");
-
-typedef void (*CallbackFunc)();
-
-template <size_t alignment>
-class AlignedData {
- public:
-  AlignedData() = default;
-  ~AlignedData() = default;
-  alignas(alignment) char data_[alignment];
-};
-
-class IntSingleton {
- public:
-  static IntSingleton* GetInstance() {
-    return Singleton<IntSingleton>::get();
-  }
-
-  int value_;
-};
-
-class Init5Singleton {
- public:
-  struct Trait;
-
-  static Init5Singleton* GetInstance() {
-    return Singleton<Init5Singleton, Trait>::get();
-  }
-
-  int value_;
-};
-
-struct Init5Singleton::Trait : public DefaultSingletonTraits<Init5Singleton> {
-  static Init5Singleton* New() {
-    Init5Singleton* instance = new Init5Singleton();
-    instance->value_ = 5;
-    return instance;
-  }
-};
-
-int* SingletonInt() {
-  return &IntSingleton::GetInstance()->value_;
-}
-
-int* SingletonInt5() {
-  return &Init5Singleton::GetInstance()->value_;
-}
-
-template <typename Type>
-struct CallbackTrait : public DefaultSingletonTraits<Type> {
-  static void Delete(Type* instance) {
-    if (instance->callback_)
-      (instance->callback_)();
-    DefaultSingletonTraits<Type>::Delete(instance);
-  }
-};
-
-class CallbackSingleton {
- public:
-  CallbackSingleton() : callback_(nullptr) {}
-  CallbackFunc callback_;
-};
-
-class CallbackSingletonWithNoLeakTrait : public CallbackSingleton {
- public:
-  struct Trait : public CallbackTrait<CallbackSingletonWithNoLeakTrait> { };
-
-  CallbackSingletonWithNoLeakTrait() : CallbackSingleton() { }
-
-  static CallbackSingletonWithNoLeakTrait* GetInstance() {
-    return Singleton<CallbackSingletonWithNoLeakTrait, Trait>::get();
-  }
-};
-
-class CallbackSingletonWithLeakTrait : public CallbackSingleton {
- public:
-  struct Trait : public CallbackTrait<CallbackSingletonWithLeakTrait> {
-    static const bool kRegisterAtExit = false;
-  };
-
-  CallbackSingletonWithLeakTrait() : CallbackSingleton() { }
-
-  static CallbackSingletonWithLeakTrait* GetInstance() {
-    return Singleton<CallbackSingletonWithLeakTrait, Trait>::get();
-  }
-};
-
-class CallbackSingletonWithStaticTrait : public CallbackSingleton {
- public:
-  struct Trait;
-
-  CallbackSingletonWithStaticTrait() : CallbackSingleton() { }
-
-  static CallbackSingletonWithStaticTrait* GetInstance() {
-    return Singleton<CallbackSingletonWithStaticTrait, Trait>::get();
-  }
-};
-
-struct CallbackSingletonWithStaticTrait::Trait
-    : public StaticMemorySingletonTraits<CallbackSingletonWithStaticTrait> {
-  static void Delete(CallbackSingletonWithStaticTrait* instance) {
-    if (instance->callback_)
-      (instance->callback_)();
-    StaticMemorySingletonTraits<CallbackSingletonWithStaticTrait>::Delete(
-        instance);
-  }
-};
-
-template <class Type>
-class AlignedTestSingleton {
- public:
-  AlignedTestSingleton() = default;
-  ~AlignedTestSingleton() = default;
-  static AlignedTestSingleton* GetInstance() {
-    return Singleton<AlignedTestSingleton,
-                     StaticMemorySingletonTraits<AlignedTestSingleton>>::get();
-  }
-
-  Type type_;
-};
-
-
-void SingletonNoLeak(CallbackFunc CallOnQuit) {
-  CallbackSingletonWithNoLeakTrait::GetInstance()->callback_ = CallOnQuit;
-}
-
-void SingletonLeak(CallbackFunc CallOnQuit) {
-  CallbackSingletonWithLeakTrait::GetInstance()->callback_ = CallOnQuit;
-}
-
-CallbackFunc* GetLeakySingleton() {
-  return &CallbackSingletonWithLeakTrait::GetInstance()->callback_;
-}
-
-void DeleteLeakySingleton() {
-  DefaultSingletonTraits<CallbackSingletonWithLeakTrait>::Delete(
-      CallbackSingletonWithLeakTrait::GetInstance());
-}
-
-void SingletonStatic(CallbackFunc CallOnQuit) {
-  CallbackSingletonWithStaticTrait::GetInstance()->callback_ = CallOnQuit;
-}
-
-CallbackFunc* GetStaticSingleton() {
-  return &CallbackSingletonWithStaticTrait::GetInstance()->callback_;
-}
-
-
-class SingletonTest : public testing::Test {
- public:
-  SingletonTest() = default;
-
-  void SetUp() override {
-    non_leak_called_ = false;
-    leaky_called_ = false;
-    static_called_ = false;
-  }
-
- protected:
-  void VerifiesCallbacks() {
-    EXPECT_TRUE(non_leak_called_);
-    EXPECT_FALSE(leaky_called_);
-    EXPECT_TRUE(static_called_);
-    non_leak_called_ = false;
-    leaky_called_ = false;
-    static_called_ = false;
-  }
-
-  void VerifiesCallbacksNotCalled() {
-    EXPECT_FALSE(non_leak_called_);
-    EXPECT_FALSE(leaky_called_);
-    EXPECT_FALSE(static_called_);
-    non_leak_called_ = false;
-    leaky_called_ = false;
-    static_called_ = false;
-  }
-
-  static void CallbackNoLeak() {
-    non_leak_called_ = true;
-  }
-
-  static void CallbackLeak() {
-    leaky_called_ = true;
-  }
-
-  static void CallbackStatic() {
-    static_called_ = true;
-  }
-
- private:
-  static bool non_leak_called_;
-  static bool leaky_called_;
-  static bool static_called_;
-};
-
-bool SingletonTest::non_leak_called_ = false;
-bool SingletonTest::leaky_called_ = false;
-bool SingletonTest::static_called_ = false;
-
-TEST_F(SingletonTest, Basic) {
-  int* singleton_int;
-  int* singleton_int_5;
-  CallbackFunc* leaky_singleton;
-  CallbackFunc* static_singleton;
-
-  {
-    ShadowingAtExitManager sem;
-    {
-      singleton_int = SingletonInt();
-    }
-    // Ensure POD type initialization.
-    EXPECT_EQ(*singleton_int, 0);
-    *singleton_int = 1;
-
-    EXPECT_EQ(singleton_int, SingletonInt());
-    EXPECT_EQ(*singleton_int, 1);
-
-    {
-      singleton_int_5 = SingletonInt5();
-    }
-    // Is default initialized to 5.
-    EXPECT_EQ(*singleton_int_5, 5);
-
-    SingletonNoLeak(&CallbackNoLeak);
-    SingletonLeak(&CallbackLeak);
-    SingletonStatic(&CallbackStatic);
-    static_singleton = GetStaticSingleton();
-    leaky_singleton = GetLeakySingleton();
-    EXPECT_TRUE(leaky_singleton);
-  }
-
-  // Verify that only the expected callback has been called.
-  VerifiesCallbacks();
-  // Delete the leaky singleton.
-  DeleteLeakySingleton();
-
-  // The static singleton can't be acquired post-atexit.
-  EXPECT_EQ(nullptr, GetStaticSingleton());
-
-  {
-    ShadowingAtExitManager sem;
-    // Verifiy that the variables were reset.
-    {
-      singleton_int = SingletonInt();
-      EXPECT_EQ(*singleton_int, 0);
-    }
-    {
-      singleton_int_5 = SingletonInt5();
-      EXPECT_EQ(*singleton_int_5, 5);
-    }
-    {
-      // Resurrect the static singleton, and assert that it
-      // still points to the same (static) memory.
-      CallbackSingletonWithStaticTrait::Trait::ResurrectForTesting();
-      EXPECT_EQ(GetStaticSingleton(), static_singleton);
-    }
-  }
-  // The leaky singleton shouldn't leak since SingletonLeak has not been called.
-  VerifiesCallbacksNotCalled();
-}
-
-#define EXPECT_ALIGNED(ptr, align) \
-    EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(ptr) & (align - 1))
-
-TEST_F(SingletonTest, Alignment) {
-  // Create some static singletons with increasing sizes and alignment
-  // requirements. By ordering this way, the linker will need to do some work to
-  // ensure proper alignment of the static data.
-  AlignedTestSingleton<int32_t>* align4 =
-      AlignedTestSingleton<int32_t>::GetInstance();
-  AlignedTestSingleton<AlignedData<32>>* align32 =
-      AlignedTestSingleton<AlignedData<32>>::GetInstance();
-  AlignedTestSingleton<AlignedData<128>>* align128 =
-      AlignedTestSingleton<AlignedData<128>>::GetInstance();
-  AlignedTestSingleton<AlignedData<4096>>* align4096 =
-      AlignedTestSingleton<AlignedData<4096>>::GetInstance();
-
-  EXPECT_ALIGNED(align4, 4);
-  EXPECT_ALIGNED(align32, 32);
-  EXPECT_ALIGNED(align128, 128);
-  EXPECT_ALIGNED(align4096, 4096);
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/memory/weak_ptr_unittest.cc b/base/memory/weak_ptr_unittest.cc
deleted file mode 100644
index f8dfb7c..0000000
--- a/base/memory/weak_ptr_unittest.cc
+++ /dev/null
@@ -1,716 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/weak_ptr.h"
-
-#include <memory>
-#include <string>
-
-#include "base/bind.h"
-#include "base/debug/leak_annotations.h"
-#include "base/location.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/gtest_util.h"
-#include "base/threading/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-WeakPtr<int> PassThru(WeakPtr<int> ptr) {
-  return ptr;
-}
-
-template <class T>
-class OffThreadObjectCreator {
- public:
-  static T* NewObject() {
-    T* result;
-    {
-      Thread creator_thread("creator_thread");
-      creator_thread.Start();
-      creator_thread.task_runner()->PostTask(
-          FROM_HERE,
-          base::BindOnce(OffThreadObjectCreator::CreateObject, &result));
-    }
-    DCHECK(result);  // We synchronized on thread destruction above.
-    return result;
-  }
- private:
-  static void CreateObject(T** result) {
-    *result = new T;
-  }
-};
-
-struct Base {
-  std::string member;
-};
-struct Derived : public Base {};
-
-struct TargetBase {};
-struct Target : public TargetBase, public SupportsWeakPtr<Target> {
-  virtual ~Target() = default;
-};
-
-struct DerivedTarget : public Target {};
-
-// A class inheriting from Target and defining a nested type called 'Base'.
-// To guard against strange compilation errors.
-struct DerivedTargetWithNestedBase : public Target {
-  using Base = void;
-};
-
-// A struct with a virtual destructor.
-struct VirtualDestructor {
-  virtual ~VirtualDestructor() = default;
-};
-
-// A class inheriting from Target where Target is not the first base, and where
-// the first base has a virtual method table. This creates a structure where the
-// Target base is not positioned at the beginning of
-// DerivedTargetMultipleInheritance.
-struct DerivedTargetMultipleInheritance : public VirtualDestructor,
-                                          public Target {};
-
-struct Arrow {
-  WeakPtr<Target> target;
-};
-struct TargetWithFactory : public Target {
-  TargetWithFactory() : factory(this) {}
-  WeakPtrFactory<Target> factory;
-};
-
-// Helper class to create and destroy weak pointer copies
-// and delete objects on a background thread.
-class BackgroundThread : public Thread {
- public:
-  BackgroundThread() : Thread("owner_thread") {}
-
-  ~BackgroundThread() override { Stop(); }
-
-  void CreateArrowFromTarget(Arrow** arrow, Target* target) {
-    WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-    task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(&BackgroundThread::DoCreateArrowFromTarget,
-                                  arrow, target, &completion));
-    completion.Wait();
-  }
-
-  void CreateArrowFromArrow(Arrow** arrow, const Arrow* other) {
-    WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-    task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(&BackgroundThread::DoCreateArrowFromArrow,
-                                  arrow, other, &completion));
-    completion.Wait();
-  }
-
-  void DeleteTarget(Target* object) {
-    WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-    task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&BackgroundThread::DoDeleteTarget, object, &completion));
-    completion.Wait();
-  }
-
-  void CopyAndAssignArrow(Arrow* object) {
-    WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-    task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(&BackgroundThread::DoCopyAndAssignArrow,
-                                  object, &completion));
-    completion.Wait();
-  }
-
-  void CopyAndAssignArrowBase(Arrow* object) {
-    WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-    task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(&BackgroundThread::DoCopyAndAssignArrowBase,
-                                  object, &completion));
-    completion.Wait();
-  }
-
-  void DeleteArrow(Arrow* object) {
-    WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-    task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&BackgroundThread::DoDeleteArrow, object, &completion));
-    completion.Wait();
-  }
-
-  Target* DeRef(const Arrow* arrow) {
-    WaitableEvent completion(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-    Target* result = nullptr;
-    task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(&BackgroundThread::DoDeRef, arrow, &result,
-                                  &completion));
-    completion.Wait();
-    return result;
-  }
-
- protected:
-  static void DoCreateArrowFromArrow(Arrow** arrow,
-                                     const Arrow* other,
-                                     WaitableEvent* completion) {
-    *arrow = new Arrow;
-    **arrow = *other;
-    completion->Signal();
-  }
-
-  static void DoCreateArrowFromTarget(Arrow** arrow,
-                                      Target* target,
-                                      WaitableEvent* completion) {
-    *arrow = new Arrow;
-    (*arrow)->target = target->AsWeakPtr();
-    completion->Signal();
-  }
-
-  static void DoDeRef(const Arrow* arrow,
-                      Target** result,
-                      WaitableEvent* completion) {
-    *result = arrow->target.get();
-    completion->Signal();
-  }
-
-  static void DoDeleteTarget(Target* object, WaitableEvent* completion) {
-    delete object;
-    completion->Signal();
-  }
-
-  static void DoCopyAndAssignArrow(Arrow* object, WaitableEvent* completion) {
-    // Copy constructor.
-    Arrow a = *object;
-    // Assignment operator.
-    *object = a;
-    completion->Signal();
-  }
-
-  static void DoCopyAndAssignArrowBase(
-      Arrow* object,
-      WaitableEvent* completion) {
-    // Copy constructor.
-    WeakPtr<TargetBase> b = object->target;
-    // Assignment operator.
-    WeakPtr<TargetBase> c;
-    c = object->target;
-    completion->Signal();
-  }
-
-  static void DoDeleteArrow(Arrow* object, WaitableEvent* completion) {
-    delete object;
-    completion->Signal();
-  }
-};
-
-}  // namespace
-
-TEST(WeakPtrFactoryTest, Basic) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-  WeakPtr<int> ptr = factory.GetWeakPtr();
-  EXPECT_EQ(&data, ptr.get());
-}
-
-TEST(WeakPtrFactoryTest, Comparison) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-  WeakPtr<int> ptr = factory.GetWeakPtr();
-  WeakPtr<int> ptr2 = ptr;
-  EXPECT_EQ(ptr.get(), ptr2.get());
-}
-
-TEST(WeakPtrFactoryTest, Move) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-  WeakPtr<int> ptr = factory.GetWeakPtr();
-  WeakPtr<int> ptr2 = factory.GetWeakPtr();
-  WeakPtr<int> ptr3 = std::move(ptr2);
-  EXPECT_NE(ptr.get(), ptr2.get());
-  EXPECT_EQ(ptr.get(), ptr3.get());
-}
-
-TEST(WeakPtrFactoryTest, OutOfScope) {
-  WeakPtr<int> ptr;
-  EXPECT_EQ(nullptr, ptr.get());
-  {
-    int data;
-    WeakPtrFactory<int> factory(&data);
-    ptr = factory.GetWeakPtr();
-  }
-  EXPECT_EQ(nullptr, ptr.get());
-}
-
-TEST(WeakPtrFactoryTest, Multiple) {
-  WeakPtr<int> a, b;
-  {
-    int data;
-    WeakPtrFactory<int> factory(&data);
-    a = factory.GetWeakPtr();
-    b = factory.GetWeakPtr();
-    EXPECT_EQ(&data, a.get());
-    EXPECT_EQ(&data, b.get());
-  }
-  EXPECT_EQ(nullptr, a.get());
-  EXPECT_EQ(nullptr, b.get());
-}
-
-TEST(WeakPtrFactoryTest, MultipleStaged) {
-  WeakPtr<int> a;
-  {
-    int data;
-    WeakPtrFactory<int> factory(&data);
-    a = factory.GetWeakPtr();
-    {
-      WeakPtr<int> b = factory.GetWeakPtr();
-    }
-    EXPECT_NE(nullptr, a.get());
-  }
-  EXPECT_EQ(nullptr, a.get());
-}
-
-TEST(WeakPtrFactoryTest, Dereference) {
-  Base data;
-  data.member = "123456";
-  WeakPtrFactory<Base> factory(&data);
-  WeakPtr<Base> ptr = factory.GetWeakPtr();
-  EXPECT_EQ(&data, ptr.get());
-  EXPECT_EQ(data.member, (*ptr).member);
-  EXPECT_EQ(data.member, ptr->member);
-}
-
-TEST(WeakPtrFactoryTest, UpCast) {
-  Derived data;
-  WeakPtrFactory<Derived> factory(&data);
-  WeakPtr<Base> ptr = factory.GetWeakPtr();
-  ptr = factory.GetWeakPtr();
-  EXPECT_EQ(ptr.get(), &data);
-}
-
-TEST(WeakPtrTest, ConstructFromNullptr) {
-  WeakPtr<int> ptr = PassThru(nullptr);
-  EXPECT_EQ(nullptr, ptr.get());
-}
-
-TEST(WeakPtrTest, SupportsWeakPtr) {
-  Target target;
-  WeakPtr<Target> ptr = target.AsWeakPtr();
-  EXPECT_EQ(&target, ptr.get());
-}
-
-TEST(WeakPtrTest, DerivedTarget) {
-  DerivedTarget target;
-  WeakPtr<DerivedTarget> ptr = AsWeakPtr(&target);
-  EXPECT_EQ(&target, ptr.get());
-}
-
-TEST(WeakPtrTest, DerivedTargetWithNestedBase) {
-  DerivedTargetWithNestedBase target;
-  WeakPtr<DerivedTargetWithNestedBase> ptr = AsWeakPtr(&target);
-  EXPECT_EQ(&target, ptr.get());
-}
-
-TEST(WeakPtrTest, DerivedTargetMultipleInheritance) {
-  DerivedTargetMultipleInheritance d;
-  Target& b = d;
-  EXPECT_NE(static_cast<void*>(&d), static_cast<void*>(&b));
-  const WeakPtr<Target> pb = AsWeakPtr(&b);
-  EXPECT_EQ(pb.get(), &b);
-  const WeakPtr<DerivedTargetMultipleInheritance> pd = AsWeakPtr(&d);
-  EXPECT_EQ(pd.get(), &d);
-}
-
-TEST(WeakPtrFactoryTest, BooleanTesting) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-
-  WeakPtr<int> ptr_to_an_instance = factory.GetWeakPtr();
-  EXPECT_TRUE(ptr_to_an_instance);
-  EXPECT_FALSE(!ptr_to_an_instance);
-
-  if (ptr_to_an_instance) {
-  } else {
-    ADD_FAILURE() << "Pointer to an instance should result in true.";
-  }
-
-  if (!ptr_to_an_instance) {  // check for operator!().
-    ADD_FAILURE() << "Pointer to an instance should result in !x being false.";
-  }
-
-  WeakPtr<int> null_ptr;
-  EXPECT_FALSE(null_ptr);
-  EXPECT_TRUE(!null_ptr);
-
-  if (null_ptr) {
-    ADD_FAILURE() << "Null pointer should result in false.";
-  }
-
-  if (!null_ptr) {  // check for operator!().
-  } else {
-    ADD_FAILURE() << "Null pointer should result in !x being true.";
-  }
-}
-
-TEST(WeakPtrFactoryTest, ComparisonToNull) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-
-  WeakPtr<int> ptr_to_an_instance = factory.GetWeakPtr();
-  EXPECT_NE(nullptr, ptr_to_an_instance);
-  EXPECT_NE(ptr_to_an_instance, nullptr);
-
-  WeakPtr<int> null_ptr;
-  EXPECT_EQ(null_ptr, nullptr);
-  EXPECT_EQ(nullptr, null_ptr);
-}
-
-TEST(WeakPtrTest, InvalidateWeakPtrs) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-  WeakPtr<int> ptr = factory.GetWeakPtr();
-  EXPECT_EQ(&data, ptr.get());
-  EXPECT_TRUE(factory.HasWeakPtrs());
-  factory.InvalidateWeakPtrs();
-  EXPECT_EQ(nullptr, ptr.get());
-  EXPECT_FALSE(factory.HasWeakPtrs());
-
-  // Test that the factory can create new weak pointers after a
-  // InvalidateWeakPtrs call, and they remain valid until the next
-  // InvalidateWeakPtrs call.
-  WeakPtr<int> ptr2 = factory.GetWeakPtr();
-  EXPECT_EQ(&data, ptr2.get());
-  EXPECT_TRUE(factory.HasWeakPtrs());
-  factory.InvalidateWeakPtrs();
-  EXPECT_EQ(nullptr, ptr2.get());
-  EXPECT_FALSE(factory.HasWeakPtrs());
-}
-
-TEST(WeakPtrTest, HasWeakPtrs) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-  {
-    WeakPtr<int> ptr = factory.GetWeakPtr();
-    EXPECT_TRUE(factory.HasWeakPtrs());
-  }
-  EXPECT_FALSE(factory.HasWeakPtrs());
-}
-
-TEST(WeakPtrTest, ObjectAndWeakPtrOnDifferentThreads) {
-  // Test that it is OK to create an object that supports WeakPtr on one thread,
-  // but use it on another.  This tests that we do not trip runtime checks that
-  // ensure that a WeakPtr is not used by multiple threads.
-  std::unique_ptr<Target> target(OffThreadObjectCreator<Target>::NewObject());
-  WeakPtr<Target> weak_ptr = target->AsWeakPtr();
-  EXPECT_EQ(target.get(), weak_ptr.get());
-}
-
-TEST(WeakPtrTest, WeakPtrInitiateAndUseOnDifferentThreads) {
-  // Test that it is OK to create an object that has a WeakPtr member on one
-  // thread, but use it on another.  This tests that we do not trip runtime
-  // checks that ensure that a WeakPtr is not used by multiple threads.
-  std::unique_ptr<Arrow> arrow(OffThreadObjectCreator<Arrow>::NewObject());
-  Target target;
-  arrow->target = target.AsWeakPtr();
-  EXPECT_EQ(&target, arrow->target.get());
-}
-
-TEST(WeakPtrTest, MoveOwnershipImplicitly) {
-  // Move object ownership to another thread by releasing all weak pointers
-  // on the original thread first, and then establish WeakPtr on a different
-  // thread.
-  BackgroundThread background;
-  background.Start();
-
-  Target* target = new Target();
-  {
-    WeakPtr<Target> weak_ptr = target->AsWeakPtr();
-    // Main thread deletes the WeakPtr, then the thread ownership of the
-    // object can be implicitly moved.
-  }
-  Arrow* arrow;
-
-  // Background thread creates WeakPtr(and implicitly owns the object).
-  background.CreateArrowFromTarget(&arrow, target);
-  EXPECT_EQ(background.DeRef(arrow), target);
-
-  {
-    // Main thread creates another WeakPtr, but this does not trigger implicitly
-    // thread ownership move.
-    Arrow arrow;
-    arrow.target = target->AsWeakPtr();
-
-    // The new WeakPtr is owned by background thread.
-    EXPECT_EQ(target, background.DeRef(&arrow));
-  }
-
-  // Target can only be deleted on background thread.
-  background.DeleteTarget(target);
-  background.DeleteArrow(arrow);
-}
-
-TEST(WeakPtrTest, MoveOwnershipOfUnreferencedObject) {
-  BackgroundThread background;
-  background.Start();
-
-  Arrow* arrow;
-  {
-    Target target;
-    // Background thread creates WeakPtr.
-    background.CreateArrowFromTarget(&arrow, &target);
-
-    // Bind to background thread.
-    EXPECT_EQ(&target, background.DeRef(arrow));
-
-    // Release the only WeakPtr.
-    arrow->target.reset();
-
-    // Now we should be able to create a new reference from this thread.
-    arrow->target = target.AsWeakPtr();
-
-    // Re-bind to main thread.
-    EXPECT_EQ(&target, arrow->target.get());
-
-    // And the main thread can now delete the target.
-  }
-
-  delete arrow;
-}
-
-TEST(WeakPtrTest, MoveOwnershipAfterInvalidate) {
-  BackgroundThread background;
-  background.Start();
-
-  Arrow arrow;
-  std::unique_ptr<TargetWithFactory> target(new TargetWithFactory);
-
-  // Bind to main thread.
-  arrow.target = target->factory.GetWeakPtr();
-  EXPECT_EQ(target.get(), arrow.target.get());
-
-  target->factory.InvalidateWeakPtrs();
-  EXPECT_EQ(nullptr, arrow.target.get());
-
-  arrow.target = target->factory.GetWeakPtr();
-  // Re-bind to background thread.
-  EXPECT_EQ(target.get(), background.DeRef(&arrow));
-
-  // And the background thread can now delete the target.
-  background.DeleteTarget(target.release());
-}
-
-TEST(WeakPtrTest, MainThreadRefOutlivesBackgroundThreadRef) {
-  // Originating thread has a WeakPtr that outlives others.
-  // - Main thread creates a WeakPtr
-  // - Background thread creates a WeakPtr copy from the one in main thread
-  // - Destruct the WeakPtr on background thread
-  // - Destruct the WeakPtr on main thread
-  BackgroundThread background;
-  background.Start();
-
-  Target target;
-  Arrow arrow;
-  arrow.target = target.AsWeakPtr();
-
-  Arrow* arrow_copy;
-  background.CreateArrowFromArrow(&arrow_copy, &arrow);
-  EXPECT_EQ(arrow_copy->target.get(), &target);
-  background.DeleteArrow(arrow_copy);
-}
-
-TEST(WeakPtrTest, BackgroundThreadRefOutlivesMainThreadRef) {
-  // Originating thread drops all references before another thread.
-  // - Main thread creates a WeakPtr and passes copy to background thread
-  // - Destruct the pointer on main thread
-  // - Destruct the pointer on background thread
-  BackgroundThread background;
-  background.Start();
-
-  Target target;
-  Arrow* arrow_copy;
-  {
-    Arrow arrow;
-    arrow.target = target.AsWeakPtr();
-    background.CreateArrowFromArrow(&arrow_copy, &arrow);
-  }
-  EXPECT_EQ(arrow_copy->target.get(), &target);
-  background.DeleteArrow(arrow_copy);
-}
-
-TEST(WeakPtrTest, OwnerThreadDeletesObject) {
-  // Originating thread invalidates WeakPtrs while its held by other thread.
-  // - Main thread creates WeakPtr and passes Copy to background thread
-  // - Object gets destroyed on main thread
-  //   (invalidates WeakPtr on background thread)
-  // - WeakPtr gets destroyed on Thread B
-  BackgroundThread background;
-  background.Start();
-  Arrow* arrow_copy;
-  {
-    Target target;
-    Arrow arrow;
-    arrow.target = target.AsWeakPtr();
-    background.CreateArrowFromArrow(&arrow_copy, &arrow);
-  }
-  EXPECT_EQ(nullptr, arrow_copy->target.get());
-  background.DeleteArrow(arrow_copy);
-}
-
-TEST(WeakPtrTest, NonOwnerThreadCanCopyAndAssignWeakPtr) {
-  // Main thread creates a Target object.
-  Target target;
-  // Main thread creates an arrow referencing the Target.
-  Arrow *arrow = new Arrow();
-  arrow->target = target.AsWeakPtr();
-
-  // Background can copy and assign arrow (as well as the WeakPtr inside).
-  BackgroundThread background;
-  background.Start();
-  background.CopyAndAssignArrow(arrow);
-  background.DeleteArrow(arrow);
-}
-
-TEST(WeakPtrTest, NonOwnerThreadCanCopyAndAssignWeakPtrBase) {
-  // Main thread creates a Target object.
-  Target target;
-  // Main thread creates an arrow referencing the Target.
-  Arrow *arrow = new Arrow();
-  arrow->target = target.AsWeakPtr();
-
-  // Background can copy and assign arrow's WeakPtr to a base class WeakPtr.
-  BackgroundThread background;
-  background.Start();
-  background.CopyAndAssignArrowBase(arrow);
-  background.DeleteArrow(arrow);
-}
-
-TEST(WeakPtrTest, NonOwnerThreadCanDeleteWeakPtr) {
-  // Main thread creates a Target object.
-  Target target;
-  // Main thread creates an arrow referencing the Target.
-  Arrow* arrow = new Arrow();
-  arrow->target = target.AsWeakPtr();
-
-  // Background can delete arrow (as well as the WeakPtr inside).
-  BackgroundThread background;
-  background.Start();
-  background.DeleteArrow(arrow);
-}
-
-TEST(WeakPtrDeathTest, WeakPtrCopyDoesNotChangeThreadBinding) {
-  // The default style "fast" does not support multi-threaded tests
-  // (introduces deadlock on Linux).
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-
-  BackgroundThread background;
-  background.Start();
-
-  // Main thread creates a Target object.
-  Target target;
-  // Main thread creates an arrow referencing the Target.
-  Arrow arrow;
-  arrow.target = target.AsWeakPtr();
-
-  // Background copies the WeakPtr.
-  Arrow* arrow_copy;
-  background.CreateArrowFromArrow(&arrow_copy, &arrow);
-
-  // The copy is still bound to main thread so I can deref.
-  EXPECT_EQ(arrow.target.get(), arrow_copy->target.get());
-
-  // Although background thread created the copy, it can not deref the copied
-  // WeakPtr.
-  ASSERT_DCHECK_DEATH(background.DeRef(arrow_copy));
-
-  background.DeleteArrow(arrow_copy);
-}
-
-TEST(WeakPtrDeathTest, NonOwnerThreadDereferencesWeakPtrAfterReference) {
-  // The default style "fast" does not support multi-threaded tests
-  // (introduces deadlock on Linux).
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-
-  // Main thread creates a Target object.
-  Target target;
-
-  // Main thread creates an arrow referencing the Target (so target's
-  // thread ownership can not be implicitly moved).
-  Arrow arrow;
-  arrow.target = target.AsWeakPtr();
-  arrow.target.get();
-
-  // Background thread tries to deref target, which violates thread ownership.
-  BackgroundThread background;
-  background.Start();
-  ASSERT_DCHECK_DEATH(background.DeRef(&arrow));
-}
-
-TEST(WeakPtrDeathTest, NonOwnerThreadDeletesWeakPtrAfterReference) {
-  // The default style "fast" does not support multi-threaded tests
-  // (introduces deadlock on Linux).
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-
-  std::unique_ptr<Target> target(new Target());
-
-  // Main thread creates an arrow referencing the Target.
-  Arrow arrow;
-  arrow.target = target->AsWeakPtr();
-
-  // Background thread tries to deref target, binding it to the thread.
-  BackgroundThread background;
-  background.Start();
-  background.DeRef(&arrow);
-
-  // Main thread deletes Target, violating thread binding.
-  ASSERT_DCHECK_DEATH(target.reset());
-
-  // |target.reset()| died so |target| still holds the object, so we
-  // must pass it to the background thread to teardown.
-  background.DeleteTarget(target.release());
-}
-
-TEST(WeakPtrDeathTest, NonOwnerThreadDeletesObjectAfterReference) {
-  // The default style "fast" does not support multi-threaded tests
-  // (introduces deadlock on Linux).
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-
-  std::unique_ptr<Target> target(new Target());
-
-  // Main thread creates an arrow referencing the Target, and references it, so
-  // that it becomes bound to the thread.
-  Arrow arrow;
-  arrow.target = target->AsWeakPtr();
-  arrow.target.get();
-
-  // Background thread tries to delete target, volating thread binding.
-  BackgroundThread background;
-  background.Start();
-  ASSERT_DCHECK_DEATH(background.DeleteTarget(target.release()));
-}
-
-TEST(WeakPtrDeathTest, NonOwnerThreadReferencesObjectAfterDeletion) {
-  // The default style "fast" does not support multi-threaded tests
-  // (introduces deadlock on Linux).
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-
-  std::unique_ptr<Target> target(new Target());
-
-  // Main thread creates an arrow referencing the Target.
-  Arrow arrow;
-  arrow.target = target->AsWeakPtr();
-
-  // Background thread tries to delete target, binding the object to the thread.
-  BackgroundThread background;
-  background.Start();
-  background.DeleteTarget(target.release());
-
-  // Main thread attempts to dereference the target, violating thread binding.
-  ASSERT_DCHECK_DEATH(arrow.target.get());
-}
-
-}  // namespace base
diff --git a/base/memory/weak_ptr_unittest.nc b/base/memory/weak_ptr_unittest.nc
deleted file mode 100644
index b96b033..0000000
--- a/base/memory/weak_ptr_unittest.nc
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a "No Compile Test" suite.
-// http://dev.chromium.org/developers/testing/no-compile-tests
-
-#include "base/memory/weak_ptr.h"
-
-namespace base {
-
-struct Producer : SupportsWeakPtr<Producer> {};
-struct DerivedProducer : Producer {};
-struct OtherDerivedProducer : Producer {};
-struct MultiplyDerivedProducer : Producer,
-                                 SupportsWeakPtr<MultiplyDerivedProducer> {};
-struct Unrelated {};
-struct DerivedUnrelated : Unrelated {};
-
-#if defined(NCTEST_AUTO_DOWNCAST)  // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
-
-void WontCompile() {
-  Producer f;
-  WeakPtr<Producer> ptr = f.AsWeakPtr();
-  WeakPtr<DerivedProducer> derived_ptr = ptr;
-}
-
-#elif defined(NCTEST_STATIC_DOWNCAST)  // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
-
-void WontCompile() {
-  Producer f;
-  WeakPtr<Producer> ptr = f.AsWeakPtr();
-  WeakPtr<DerivedProducer> derived_ptr =
-      static_cast<WeakPtr<DerivedProducer> >(ptr);
-}
-
-#elif defined(NCTEST_AUTO_REF_DOWNCAST)  // [r"fatal error: non-const lvalue reference to type 'WeakPtr<base::DerivedProducer>' cannot bind to a value of unrelated type 'WeakPtr<base::Producer>'"]
-
-void WontCompile() {
-  Producer f;
-  WeakPtr<Producer> ptr = f.AsWeakPtr();
-  WeakPtr<DerivedProducer>& derived_ptr = ptr;
-}
-
-#elif defined(NCTEST_STATIC_REF_DOWNCAST)  // [r"fatal error: non-const lvalue reference to type 'WeakPtr<base::DerivedProducer>' cannot bind to a value of unrelated type 'WeakPtr<base::Producer>'"]
-
-void WontCompile() {
-  Producer f;
-  WeakPtr<Producer> ptr = f.AsWeakPtr();
-  WeakPtr<DerivedProducer>& derived_ptr =
-      static_cast<WeakPtr<DerivedProducer>&>(ptr);
-}
-
-#elif defined(NCTEST_STATIC_ASWEAKPTR_DOWNCAST)  // [r"no matching function"]
-
-void WontCompile() {
-  Producer f;
-  WeakPtr<DerivedProducer> ptr =
-      SupportsWeakPtr<Producer>::StaticAsWeakPtr<DerivedProducer>(&f);
-}
-
-#elif defined(NCTEST_UNSAFE_HELPER_DOWNCAST)  // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
-
-void WontCompile() {
-  Producer f;
-  WeakPtr<DerivedProducer> ptr = AsWeakPtr(&f);
-}
-
-#elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_DOWNCAST)  // [r"no matching function"]
-
-void WontCompile() {
-  Producer f;
-  WeakPtr<DerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f);
-}
-
-#elif defined(NCTEST_UNSAFE_WRONG_INSANTIATED_HELPER_DOWNCAST)  // [r"cannot initialize a variable of type 'base::DerivedProducer \*' with an rvalue of type 'base::Producer \*'"]
-
-void WontCompile() {
-  Producer f;
-  WeakPtr<DerivedProducer> ptr = AsWeakPtr<Producer>(&f);
-}
-
-#elif defined(NCTEST_UNSAFE_HELPER_CAST)  // [r"cannot initialize a variable of type 'base::OtherDerivedProducer \*' with an rvalue of type 'base::DerivedProducer \*'"]
-
-void WontCompile() {
-  DerivedProducer f;
-  WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr(&f);
-}
-
-#elif defined(NCTEST_UNSAFE_INSTANTIATED_HELPER_SIDECAST)  // [r"fatal error: no matching function for call to 'AsWeakPtr'"]
-
-void WontCompile() {
-  DerivedProducer f;
-  WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<OtherDerivedProducer>(&f);
-}
-
-#elif defined(NCTEST_UNSAFE_WRONG_INSTANTIATED_HELPER_SIDECAST)  // [r"cannot initialize a variable of type 'base::OtherDerivedProducer \*' with an rvalue of type 'base::DerivedProducer \*'"]
-
-void WontCompile() {
-  DerivedProducer f;
-  WeakPtr<OtherDerivedProducer> ptr = AsWeakPtr<DerivedProducer>(&f);
-}
-
-#elif defined(NCTEST_UNRELATED_HELPER)  // [r"cannot initialize a variable of type 'base::Unrelated \*' with an rvalue of type 'base::DerivedProducer \*'"]
-
-void WontCompile() {
-  DerivedProducer f;
-  WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
-}
-
-#elif defined(NCTEST_UNRELATED_INSTANTIATED_HELPER)  // [r"no matching function"]
-
-void WontCompile() {
-  DerivedProducer f;
-  WeakPtr<Unrelated> ptr = AsWeakPtr<Unrelated>(&f);
-}
-
-// TODO(hans): Remove .* and update the static_assert expectations once we roll
-// past Clang r313315. https://crbug.com/765692.
-
-#elif defined(NCTEST_COMPLETELY_UNRELATED_HELPER)  // [r"fatal error: static_assert failed .*\"AsWeakPtr argument must inherit from SupportsWeakPtr\""]
-
-void WontCompile() {
-  Unrelated f;
-  WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
-}
-
-#elif defined(NCTEST_DERIVED_COMPLETELY_UNRELATED_HELPER)  // [r"fatal error: static_assert failed .*\"AsWeakPtr argument must inherit from SupportsWeakPtr\""]
-
-void WontCompile() {
-  DerivedUnrelated f;
-  WeakPtr<Unrelated> ptr = AsWeakPtr(&f);
-}
-
-#elif defined(NCTEST_AMBIGUOUS_ANCESTORS)  // [r"fatal error: use of undeclared identifier 'AsWeakPtrImpl'"]
-
-void WontCompile() {
-  MultiplyDerivedProducer f;
-  WeakPtr<MultiplyDerivedProducer> ptr = AsWeakPtr(&f);
-}
-
-#endif
-
-}
diff --git a/base/message_loop/message_loop_io_posix_unittest.cc b/base/message_loop/message_loop_io_posix_unittest.cc
deleted file mode 100644
index 9ecd606..0000000
--- a/base/message_loop/message_loop_io_posix_unittest.cc
+++ /dev/null
@@ -1,418 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_loop.h"
-
-#include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop_current.h"
-#include "base/message_loop/message_pump_for_io.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/run_loop.h"
-#include "base/test/gtest_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-#if !defined(OS_NACL)
-
-namespace {
-
-class MessageLoopForIoPosixTest : public testing::Test {
- public:
-  MessageLoopForIoPosixTest() = default;
-
-  // testing::Test interface.
-  void SetUp() override {
-    // Create a file descriptor.  Doesn't need to be readable or writable,
-    // as we don't need to actually get any notifications.
-    // pipe() is just the easiest way to do it.
-    int pipefds[2];
-    int err = pipe(pipefds);
-    ASSERT_EQ(0, err);
-    read_fd_ = ScopedFD(pipefds[0]);
-    write_fd_ = ScopedFD(pipefds[1]);
-  }
-
-  void TriggerReadEvent() {
-    // Write from the other end of the pipe to trigger the event.
-    char c = '\0';
-    EXPECT_EQ(1, HANDLE_EINTR(write(write_fd_.get(), &c, 1)));
-  }
-
- protected:
-  ScopedFD read_fd_;
-  ScopedFD write_fd_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessageLoopForIoPosixTest);
-};
-
-class TestHandler : public MessagePumpForIO::FdWatcher {
- public:
-  void OnFileCanReadWithoutBlocking(int fd) override {
-    watcher_to_delete_ = nullptr;
-    is_readable_ = true;
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-  }
-  void OnFileCanWriteWithoutBlocking(int fd) override {
-    watcher_to_delete_ = nullptr;
-    is_writable_ = true;
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-  }
-
-  bool is_readable_ = false;
-  bool is_writable_ = false;
-
-  // If set then the contained watcher will be deleted on notification.
-  std::unique_ptr<MessagePumpForIO::FdWatchController> watcher_to_delete_;
-};
-
-// Watcher that calls specified closures when read/write events occur. Verifies
-// that each non-null closure passed to this class is called once and only once.
-// Also resets the read event by reading from the FD.
-class CallClosureHandler : public MessagePumpForIO::FdWatcher {
- public:
-  CallClosureHandler(OnceClosure read_closure, OnceClosure write_closure)
-      : read_closure_(std::move(read_closure)),
-        write_closure_(std::move(write_closure)) {}
-
-  ~CallClosureHandler() override {
-    EXPECT_TRUE(read_closure_.is_null());
-    EXPECT_TRUE(write_closure_.is_null());
-  }
-
-  void SetReadClosure(OnceClosure read_closure) {
-    EXPECT_TRUE(read_closure_.is_null());
-    read_closure_ = std::move(read_closure);
-  }
-
-  void SetWriteClosure(OnceClosure write_closure) {
-    EXPECT_TRUE(write_closure_.is_null());
-    write_closure_ = std::move(write_closure);
-  }
-
-  // base:MessagePumpFuchsia::Watcher interface.
-  void OnFileCanReadWithoutBlocking(int fd) override {
-    // Empty the pipe buffer to reset the event. Otherwise libevent
-    // implementation of MessageLoop may call the event handler again even if
-    // |read_closure_| below quits the RunLoop.
-    char c;
-    int result = HANDLE_EINTR(read(fd, &c, 1));
-    if (result == -1) {
-      PLOG(ERROR) << "read";
-      FAIL();
-    }
-    EXPECT_EQ(result, 1);
-
-    ASSERT_FALSE(read_closure_.is_null());
-    std::move(read_closure_).Run();
-  }
-
-  void OnFileCanWriteWithoutBlocking(int fd) override {
-    ASSERT_FALSE(write_closure_.is_null());
-    std::move(write_closure_).Run();
-  }
-
- private:
-  OnceClosure read_closure_;
-  OnceClosure write_closure_;
-};
-
-TEST_F(MessageLoopForIoPosixTest, FileDescriptorWatcherOutlivesMessageLoop) {
-  // Simulate a MessageLoop that dies before an FileDescriptorWatcher.
-  // This could happen when people use the Singleton pattern or atexit.
-
-  // Arrange for watcher to live longer than message loop.
-  MessagePumpForIO::FdWatchController watcher(FROM_HERE);
-  TestHandler handler;
-  {
-    MessageLoopForIO message_loop;
-
-    MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-        write_fd_.get(), true, MessagePumpForIO::WATCH_WRITE, &watcher,
-        &handler);
-    // Don't run the message loop, just destroy it.
-  }
-
-  ASSERT_FALSE(handler.is_readable_);
-  ASSERT_FALSE(handler.is_writable_);
-}
-
-TEST_F(MessageLoopForIoPosixTest, FileDescriptorWatcherDoubleStop) {
-  // Verify that it's ok to call StopWatchingFileDescriptor().
-
-  // Arrange for message loop to live longer than watcher.
-  MessageLoopForIO message_loop;
-  {
-    MessagePumpForIO::FdWatchController watcher(FROM_HERE);
-
-    TestHandler handler;
-    MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-        write_fd_.get(), true, MessagePumpForIO::WATCH_WRITE, &watcher,
-        &handler);
-    ASSERT_TRUE(watcher.StopWatchingFileDescriptor());
-    ASSERT_TRUE(watcher.StopWatchingFileDescriptor());
-  }
-}
-
-TEST_F(MessageLoopForIoPosixTest, FileDescriptorWatcherDeleteInCallback) {
-  // Verify that it is OK to delete the FileDescriptorWatcher from within a
-  // callback.
-  MessageLoopForIO message_loop;
-
-  TestHandler handler;
-  handler.watcher_to_delete_ =
-      std::make_unique<MessagePumpForIO::FdWatchController>(FROM_HERE);
-
-  MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-      write_fd_.get(), true, MessagePumpForIO::WATCH_WRITE,
-      handler.watcher_to_delete_.get(), &handler);
-  RunLoop().Run();
-}
-
-// Verify that basic readable notification works.
-TEST_F(MessageLoopForIoPosixTest, WatchReadable) {
-  MessageLoopForIO message_loop;
-  MessagePumpForIO::FdWatchController watcher(FROM_HERE);
-  TestHandler handler;
-
-  // Watch the pipe for readability.
-  ASSERT_TRUE(MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-      read_fd_.get(), /*persistent=*/false, MessagePumpForIO::WATCH_READ,
-      &watcher, &handler));
-
-  // The pipe should not be readable when first created.
-  RunLoop().RunUntilIdle();
-  ASSERT_FALSE(handler.is_readable_);
-  ASSERT_FALSE(handler.is_writable_);
-
-  TriggerReadEvent();
-
-  // We don't want to assume that the read fd becomes readable the
-  // instant a bytes is written, so Run until quit by an event.
-  RunLoop().Run();
-
-  ASSERT_TRUE(handler.is_readable_);
-  ASSERT_FALSE(handler.is_writable_);
-}
-
-// Verify that watching a file descriptor for writability succeeds.
-TEST_F(MessageLoopForIoPosixTest, WatchWritable) {
-  MessageLoopForIO message_loop;
-  MessagePumpForIO::FdWatchController watcher(FROM_HERE);
-  TestHandler handler;
-
-  // Watch the pipe for writability.
-  ASSERT_TRUE(MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-      write_fd_.get(), /*persistent=*/false, MessagePumpForIO::WATCH_WRITE,
-      &watcher, &handler));
-
-  // We should not receive a writable notification until we process events.
-  ASSERT_FALSE(handler.is_readable_);
-  ASSERT_FALSE(handler.is_writable_);
-
-  // The pipe should be writable immediately, but wait for the quit closure
-  // anyway, to be sure.
-  RunLoop().Run();
-
-  ASSERT_FALSE(handler.is_readable_);
-  ASSERT_TRUE(handler.is_writable_);
-}
-
-// Verify that RunUntilIdle() receives IO notifications.
-TEST_F(MessageLoopForIoPosixTest, RunUntilIdle) {
-  MessageLoopForIO message_loop;
-  MessagePumpForIO::FdWatchController watcher(FROM_HERE);
-  TestHandler handler;
-
-  // Watch the pipe for readability.
-  ASSERT_TRUE(MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-      read_fd_.get(), /*persistent=*/false, MessagePumpForIO::WATCH_READ,
-      &watcher, &handler));
-
-  // The pipe should not be readable when first created.
-  RunLoop().RunUntilIdle();
-  ASSERT_FALSE(handler.is_readable_);
-
-  TriggerReadEvent();
-
-  while (!handler.is_readable_)
-    RunLoop().RunUntilIdle();
-}
-
-void StopWatching(MessagePumpForIO::FdWatchController* controller,
-                  RunLoop* run_loop) {
-  controller->StopWatchingFileDescriptor();
-  run_loop->Quit();
-}
-
-// Verify that StopWatchingFileDescriptor() works from an event handler.
-TEST_F(MessageLoopForIoPosixTest, StopFromHandler) {
-  MessageLoopForIO message_loop;
-  RunLoop run_loop;
-  MessagePumpForIO::FdWatchController watcher(FROM_HERE);
-  CallClosureHandler handler(BindOnce(&StopWatching, &watcher, &run_loop),
-                             OnceClosure());
-
-  // Create persistent watcher.
-  ASSERT_TRUE(MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-      read_fd_.get(), /*persistent=*/true, MessagePumpForIO::WATCH_READ,
-      &watcher, &handler));
-
-  TriggerReadEvent();
-  run_loop.Run();
-
-  // Trigger the event again. The event handler should not be called again.
-  TriggerReadEvent();
-  RunLoop().RunUntilIdle();
-}
-
-// Verify that non-persistent watcher is called only once.
-TEST_F(MessageLoopForIoPosixTest, NonPersistentWatcher) {
-  MessageLoopForIO message_loop;
-  MessagePumpForIO::FdWatchController watcher(FROM_HERE);
-
-  RunLoop run_loop;
-  CallClosureHandler handler(run_loop.QuitClosure(), OnceClosure());
-
-  // Create a non-persistent watcher.
-  ASSERT_TRUE(MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-      read_fd_.get(), /*persistent=*/false, MessagePumpForIO::WATCH_READ,
-      &watcher, &handler));
-
-  TriggerReadEvent();
-  run_loop.Run();
-
-  // Trigger the event again. handler should not be called again.
-  TriggerReadEvent();
-  RunLoop().RunUntilIdle();
-}
-
-// Verify that persistent watcher is called every time the event is triggered.
-TEST_F(MessageLoopForIoPosixTest, PersistentWatcher) {
-  MessageLoopForIO message_loop;
-  MessagePumpForIO::FdWatchController watcher(FROM_HERE);
-
-  RunLoop run_loop1;
-  CallClosureHandler handler(run_loop1.QuitClosure(), OnceClosure());
-
-  // Create persistent watcher.
-  ASSERT_TRUE(MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-      read_fd_.get(), /*persistent=*/true, MessagePumpForIO::WATCH_READ,
-      &watcher, &handler));
-
-  TriggerReadEvent();
-  run_loop1.Run();
-
-  RunLoop run_loop2;
-  handler.SetReadClosure(run_loop2.QuitClosure());
-
-  // Trigger the event again. handler should be called now, which will quit
-  // run_loop2.
-  TriggerReadEvent();
-  run_loop2.Run();
-}
-
-void StopWatchingAndWatchAgain(MessagePumpForIO::FdWatchController* controller,
-                               int fd,
-                               MessagePumpForIO::FdWatcher* new_handler,
-                               RunLoop* run_loop) {
-  controller->StopWatchingFileDescriptor();
-
-  ASSERT_TRUE(MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-      fd, /*persistent=*/true, MessagePumpForIO::WATCH_READ, controller,
-      new_handler));
-
-  run_loop->Quit();
-}
-
-// Verify that a watcher can be stopped and reused from an event handler.
-TEST_F(MessageLoopForIoPosixTest, StopAndRestartFromHandler) {
-  MessageLoopForIO message_loop;
-  MessagePumpForIO::FdWatchController watcher(FROM_HERE);
-
-  RunLoop run_loop1;
-  RunLoop run_loop2;
-  CallClosureHandler handler2(run_loop2.QuitClosure(), OnceClosure());
-  CallClosureHandler handler1(BindOnce(&StopWatchingAndWatchAgain, &watcher,
-                                       read_fd_.get(), &handler2, &run_loop1),
-                              OnceClosure());
-
-  // Create persistent watcher.
-  ASSERT_TRUE(MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-      read_fd_.get(), /*persistent=*/true, MessagePumpForIO::WATCH_READ,
-      &watcher, &handler1));
-
-  TriggerReadEvent();
-  run_loop1.Run();
-
-  // Trigger the event again. handler2 should be called now, which will quit
-  // run_loop2
-  TriggerReadEvent();
-  run_loop2.Run();
-}
-
-// Verify that the pump properly handles a delayed task after an IO event.
-TEST_F(MessageLoopForIoPosixTest, IoEventThenTimer) {
-  MessageLoopForIO message_loop;
-  MessagePumpForIO::FdWatchController watcher(FROM_HERE);
-
-  RunLoop timer_run_loop;
-  message_loop.task_runner()->PostDelayedTask(
-      FROM_HERE, timer_run_loop.QuitClosure(),
-      base::TimeDelta::FromMilliseconds(10));
-
-  RunLoop watcher_run_loop;
-  CallClosureHandler handler(watcher_run_loop.QuitClosure(), OnceClosure());
-
-  // Create a non-persistent watcher.
-  ASSERT_TRUE(MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-      read_fd_.get(), /*persistent=*/false, MessagePumpForIO::WATCH_READ,
-      &watcher, &handler));
-
-  TriggerReadEvent();
-
-  // Normally the IO event will be received before the delayed task is
-  // executed, so this run loop will first handle the IO event and then quit on
-  // the timer.
-  timer_run_loop.Run();
-
-  // Run watcher_run_loop in case the IO event wasn't received before the
-  // delayed task.
-  watcher_run_loop.Run();
-}
-
-// Verify that the pipe can handle an IO event after a delayed task.
-TEST_F(MessageLoopForIoPosixTest, TimerThenIoEvent) {
-  MessageLoopForIO message_loop;
-  MessagePumpForIO::FdWatchController watcher(FROM_HERE);
-
-  // Trigger read event from a delayed task.
-  message_loop.task_runner()->PostDelayedTask(
-      FROM_HERE,
-      BindOnce(&MessageLoopForIoPosixTest::TriggerReadEvent, Unretained(this)),
-      TimeDelta::FromMilliseconds(1));
-
-  RunLoop run_loop;
-  CallClosureHandler handler(run_loop.QuitClosure(), OnceClosure());
-
-  // Create a non-persistent watcher.
-  ASSERT_TRUE(MessageLoopCurrentForIO::Get()->WatchFileDescriptor(
-      read_fd_.get(), /*persistent=*/false, MessagePumpForIO::WATCH_READ,
-      &watcher, &handler));
-
-  run_loop.Run();
-}
-
-}  // namespace
-
-#endif  // !defined(OS_NACL)
-
-}  // namespace base
diff --git a/base/message_loop/message_loop_task_runner_unittest.cc b/base/message_loop/message_loop_task_runner_unittest.cc
deleted file mode 100644
index c7e9aa0..0000000
--- a/base/message_loop/message_loop_task_runner_unittest.cc
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_loop_task_runner.h"
-
-#include <memory>
-
-#include "base/atomic_sequence_num.h"
-#include "base/bind.h"
-#include "base/debug/leak_annotations.h"
-#include "base/message_loop/message_loop.h"
-#include "base/message_loop/message_loop_task_runner.h"
-#include "base/run_loop.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-namespace base {
-
-class MessageLoopTaskRunnerTest : public testing::Test {
- public:
-  MessageLoopTaskRunnerTest()
-      : current_loop_(new MessageLoop()),
-        task_thread_("task_thread"),
-        thread_sync_(WaitableEvent::ResetPolicy::MANUAL,
-                     WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  void DeleteCurrentMessageLoop() { current_loop_.reset(); }
-
- protected:
-  void SetUp() override {
-    // Use SetUp() instead of the constructor to avoid posting a task to a
-    // partially constructed object.
-    task_thread_.Start();
-
-    // Allow us to pause the |task_thread_|'s MessageLoop.
-    task_thread_.task_runner()->PostTask(
-        FROM_HERE, BindOnce(&MessageLoopTaskRunnerTest::BlockTaskThreadHelper,
-                            Unretained(this)));
-  }
-
-  void TearDown() override {
-    // Make sure the |task_thread_| is not blocked, and stop the thread
-    // fully before destruction because its tasks may still depend on the
-    // |thread_sync_| event.
-    thread_sync_.Signal();
-    task_thread_.Stop();
-    DeleteCurrentMessageLoop();
-  }
-
-  // Make LoopRecorder threadsafe so that there is defined behavior even if a
-  // threading mistake sneaks into the PostTaskAndReplyRelay implementation.
-  class LoopRecorder : public RefCountedThreadSafe<LoopRecorder> {
-   public:
-    LoopRecorder(MessageLoop** run_on,
-                 MessageLoop** deleted_on,
-                 int* destruct_order)
-        : run_on_(run_on),
-          deleted_on_(deleted_on),
-          destruct_order_(destruct_order) {}
-
-    void RecordRun() { *run_on_ = MessageLoop::current(); }
-
-   private:
-    friend class RefCountedThreadSafe<LoopRecorder>;
-    ~LoopRecorder() {
-      *deleted_on_ = MessageLoop::current();
-      *destruct_order_ = g_order.GetNext();
-    }
-
-    MessageLoop** run_on_;
-    MessageLoop** deleted_on_;
-    int* destruct_order_;
-  };
-
-  static void RecordLoop(scoped_refptr<LoopRecorder> recorder) {
-    recorder->RecordRun();
-  }
-
-  static void RecordLoopAndQuit(scoped_refptr<LoopRecorder> recorder) {
-    recorder->RecordRun();
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-  }
-
-  void UnblockTaskThread() { thread_sync_.Signal(); }
-
-  void BlockTaskThreadHelper() { thread_sync_.Wait(); }
-
-  static AtomicSequenceNumber g_order;
-
-  std::unique_ptr<MessageLoop> current_loop_;
-  Thread task_thread_;
-
- private:
-  base::WaitableEvent thread_sync_;
-};
-
-AtomicSequenceNumber MessageLoopTaskRunnerTest::g_order;
-
-TEST_F(MessageLoopTaskRunnerTest, PostTaskAndReply_Basic) {
-  MessageLoop* task_run_on = nullptr;
-  MessageLoop* task_deleted_on = nullptr;
-  int task_delete_order = -1;
-  MessageLoop* reply_run_on = nullptr;
-  MessageLoop* reply_deleted_on = nullptr;
-  int reply_delete_order = -1;
-
-  scoped_refptr<LoopRecorder> task_recorder =
-      new LoopRecorder(&task_run_on, &task_deleted_on, &task_delete_order);
-  scoped_refptr<LoopRecorder> reply_recorder =
-      new LoopRecorder(&reply_run_on, &reply_deleted_on, &reply_delete_order);
-
-  ASSERT_TRUE(task_thread_.task_runner()->PostTaskAndReply(
-      FROM_HERE, BindOnce(&RecordLoop, task_recorder),
-      BindOnce(&RecordLoopAndQuit, reply_recorder)));
-
-  // Die if base::Bind doesn't retain a reference to the recorders.
-  task_recorder = nullptr;
-  reply_recorder = nullptr;
-  ASSERT_FALSE(task_deleted_on);
-  ASSERT_FALSE(reply_deleted_on);
-
-  UnblockTaskThread();
-  RunLoop().Run();
-
-  EXPECT_EQ(task_thread_.message_loop(), task_run_on);
-  EXPECT_EQ(task_thread_.message_loop(), task_deleted_on);
-  EXPECT_EQ(current_loop_.get(), reply_run_on);
-  EXPECT_EQ(current_loop_.get(), reply_deleted_on);
-  EXPECT_LT(task_delete_order, reply_delete_order);
-}
-
-TEST_F(MessageLoopTaskRunnerTest, PostTaskAndReplyOnDeletedThreadDoesNotLeak) {
-  MessageLoop* task_run_on = nullptr;
-  MessageLoop* task_deleted_on = nullptr;
-  int task_delete_order = -1;
-  MessageLoop* reply_run_on = nullptr;
-  MessageLoop* reply_deleted_on = nullptr;
-  int reply_delete_order = -1;
-
-  scoped_refptr<LoopRecorder> task_recorder =
-      new LoopRecorder(&task_run_on, &task_deleted_on, &task_delete_order);
-  scoped_refptr<LoopRecorder> reply_recorder =
-      new LoopRecorder(&reply_run_on, &reply_deleted_on, &reply_delete_order);
-
-  // Grab a task runner to a dead MessageLoop.
-  scoped_refptr<SingleThreadTaskRunner> task_runner =
-      task_thread_.task_runner();
-  UnblockTaskThread();
-  task_thread_.Stop();
-
-  ASSERT_FALSE(task_runner->PostTaskAndReply(
-      FROM_HERE, BindOnce(&RecordLoop, task_recorder),
-      BindOnce(&RecordLoopAndQuit, reply_recorder)));
-
-  // The relay should have properly deleted its resources leaving us as the only
-  // reference.
-  EXPECT_EQ(task_delete_order, reply_delete_order);
-  ASSERT_TRUE(task_recorder->HasOneRef());
-  ASSERT_TRUE(reply_recorder->HasOneRef());
-
-  // Nothing should have run though.
-  EXPECT_FALSE(task_run_on);
-  EXPECT_FALSE(reply_run_on);
-}
-
-TEST_F(MessageLoopTaskRunnerTest, PostTaskAndReply_SameLoop) {
-  MessageLoop* task_run_on = nullptr;
-  MessageLoop* task_deleted_on = nullptr;
-  int task_delete_order = -1;
-  MessageLoop* reply_run_on = nullptr;
-  MessageLoop* reply_deleted_on = nullptr;
-  int reply_delete_order = -1;
-
-  scoped_refptr<LoopRecorder> task_recorder =
-      new LoopRecorder(&task_run_on, &task_deleted_on, &task_delete_order);
-  scoped_refptr<LoopRecorder> reply_recorder =
-      new LoopRecorder(&reply_run_on, &reply_deleted_on, &reply_delete_order);
-
-  // Enqueue the relay.
-  ASSERT_TRUE(current_loop_->task_runner()->PostTaskAndReply(
-      FROM_HERE, BindOnce(&RecordLoop, task_recorder),
-      BindOnce(&RecordLoopAndQuit, reply_recorder)));
-
-  // Die if base::Bind doesn't retain a reference to the recorders.
-  task_recorder = nullptr;
-  reply_recorder = nullptr;
-  ASSERT_FALSE(task_deleted_on);
-  ASSERT_FALSE(reply_deleted_on);
-
-  RunLoop().Run();
-
-  EXPECT_EQ(current_loop_.get(), task_run_on);
-  EXPECT_EQ(current_loop_.get(), task_deleted_on);
-  EXPECT_EQ(current_loop_.get(), reply_run_on);
-  EXPECT_EQ(current_loop_.get(), reply_deleted_on);
-  EXPECT_LT(task_delete_order, reply_delete_order);
-}
-
-TEST_F(MessageLoopTaskRunnerTest,
-       PostTaskAndReply_DeadReplyTaskRunnerBehavior) {
-  // Annotate the scope as having memory leaks to suppress heapchecker reports.
-  ANNOTATE_SCOPED_MEMORY_LEAK;
-  MessageLoop* task_run_on = nullptr;
-  MessageLoop* task_deleted_on = nullptr;
-  int task_delete_order = -1;
-  MessageLoop* reply_run_on = nullptr;
-  MessageLoop* reply_deleted_on = nullptr;
-  int reply_delete_order = -1;
-
-  scoped_refptr<LoopRecorder> task_recorder =
-      new LoopRecorder(&task_run_on, &task_deleted_on, &task_delete_order);
-  scoped_refptr<LoopRecorder> reply_recorder =
-      new LoopRecorder(&reply_run_on, &reply_deleted_on, &reply_delete_order);
-
-  // Enqueue the relay.
-  task_thread_.task_runner()->PostTaskAndReply(
-      FROM_HERE, BindOnce(&RecordLoop, task_recorder),
-      BindOnce(&RecordLoopAndQuit, reply_recorder));
-
-  // Die if base::Bind doesn't retain a reference to the recorders.
-  task_recorder = nullptr;
-  reply_recorder = nullptr;
-  ASSERT_FALSE(task_deleted_on);
-  ASSERT_FALSE(reply_deleted_on);
-
-  UnblockTaskThread();
-
-  // Mercilessly whack the current loop before |reply| gets to run.
-  current_loop_.reset();
-
-  // This should ensure the relay has been run.  We need to record the
-  // MessageLoop pointer before stopping the thread because Thread::Stop() will
-  // NULL out its own pointer.
-  MessageLoop* task_loop = task_thread_.message_loop();
-  task_thread_.Stop();
-
-  // Even if the reply task runner is already gone, the original task should
-  // already be deleted. However, the reply which hasn't executed yet should
-  // leak to avoid thread-safety issues.
-  EXPECT_EQ(task_loop, task_run_on);
-  EXPECT_EQ(task_loop, task_deleted_on);
-  EXPECT_FALSE(reply_run_on);
-  ASSERT_FALSE(reply_deleted_on);
-
-  // The PostTaskAndReplyRelay is leaked here.  Even if we had a reference to
-  // it, we cannot just delete it because PostTaskAndReplyRelay's destructor
-  // checks that MessageLoop::current() is the the same as when the
-  // PostTaskAndReplyRelay object was constructed.  However, this loop must have
-  // already been deleted in order to perform this test.  See
-  // http://crbug.com/86301.
-}
-
-class MessageLoopTaskRunnerThreadingTest : public testing::Test {
- public:
-  void Release() const {
-    AssertOnIOThread();
-    Quit();
-  }
-
-  void Quit() const {
-    loop_.task_runner()->PostTask(
-        FROM_HERE, RunLoop::QuitCurrentWhenIdleClosureDeprecated());
-  }
-
-  void AssertOnIOThread() const {
-    ASSERT_TRUE(io_thread_->task_runner()->BelongsToCurrentThread());
-    ASSERT_EQ(io_thread_->task_runner(), ThreadTaskRunnerHandle::Get());
-  }
-
-  void AssertOnFileThread() const {
-    ASSERT_TRUE(file_thread_->task_runner()->BelongsToCurrentThread());
-    ASSERT_EQ(file_thread_->task_runner(), ThreadTaskRunnerHandle::Get());
-  }
-
- protected:
-  void SetUp() override {
-    io_thread_.reset(new Thread("MessageLoopTaskRunnerThreadingTest_IO"));
-    file_thread_.reset(new Thread("MessageLoopTaskRunnerThreadingTest_File"));
-    io_thread_->Start();
-    file_thread_->Start();
-  }
-
-  void TearDown() override {
-    io_thread_->Stop();
-    file_thread_->Stop();
-  }
-
-  static void BasicFunction(MessageLoopTaskRunnerThreadingTest* test) {
-    test->AssertOnFileThread();
-    test->Quit();
-  }
-
-  static void AssertNotRun() { FAIL() << "Callback Should not get executed."; }
-
-  class DeletedOnFile {
-   public:
-    explicit DeletedOnFile(MessageLoopTaskRunnerThreadingTest* test)
-        : test_(test) {}
-
-    ~DeletedOnFile() {
-      test_->AssertOnFileThread();
-      test_->Quit();
-    }
-
-   private:
-    MessageLoopTaskRunnerThreadingTest* test_;
-  };
-
-  std::unique_ptr<Thread> io_thread_;
-  std::unique_ptr<Thread> file_thread_;
-
- private:
-  mutable MessageLoop loop_;
-};
-
-TEST_F(MessageLoopTaskRunnerThreadingTest, Release) {
-  EXPECT_TRUE(io_thread_->task_runner()->ReleaseSoon(FROM_HERE, this));
-  RunLoop().Run();
-}
-
-TEST_F(MessageLoopTaskRunnerThreadingTest, Delete) {
-  DeletedOnFile* deleted_on_file = new DeletedOnFile(this);
-  EXPECT_TRUE(
-      file_thread_->task_runner()->DeleteSoon(FROM_HERE, deleted_on_file));
-  RunLoop().Run();
-}
-
-TEST_F(MessageLoopTaskRunnerThreadingTest, PostTask) {
-  EXPECT_TRUE(file_thread_->task_runner()->PostTask(
-      FROM_HERE, BindOnce(&MessageLoopTaskRunnerThreadingTest::BasicFunction,
-                          Unretained(this))));
-  RunLoop().Run();
-}
-
-TEST_F(MessageLoopTaskRunnerThreadingTest, PostTaskAfterThreadExits) {
-  std::unique_ptr<Thread> test_thread(
-      new Thread("MessageLoopTaskRunnerThreadingTest_Dummy"));
-  test_thread->Start();
-  scoped_refptr<SingleThreadTaskRunner> task_runner =
-      test_thread->task_runner();
-  test_thread->Stop();
-
-  bool ret = task_runner->PostTask(
-      FROM_HERE, BindOnce(&MessageLoopTaskRunnerThreadingTest::AssertNotRun));
-  EXPECT_FALSE(ret);
-}
-
-TEST_F(MessageLoopTaskRunnerThreadingTest, PostTaskAfterThreadIsDeleted) {
-  scoped_refptr<SingleThreadTaskRunner> task_runner;
-  {
-    std::unique_ptr<Thread> test_thread(
-        new Thread("MessageLoopTaskRunnerThreadingTest_Dummy"));
-    test_thread->Start();
-    task_runner = test_thread->task_runner();
-  }
-  bool ret = task_runner->PostTask(
-      FROM_HERE, BindOnce(&MessageLoopTaskRunnerThreadingTest::AssertNotRun));
-  EXPECT_FALSE(ret);
-}
-
-}  // namespace base
diff --git a/base/message_loop/message_loop_unittest.cc b/base/message_loop/message_loop_unittest.cc
deleted file mode 100644
index 970f6d1..0000000
--- a/base/message_loop/message_loop_unittest.cc
+++ /dev/null
@@ -1,2184 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/message_loop/message_loop_current.h"
-#include "base/message_loop/message_pump_for_io.h"
-#include "base/pending_task.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/task_scheduler.h"
-#include "base/test/test_simple_task_runner.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/sequence_local_storage_slot.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_ANDROID)
-#include "base/android/java_handler_thread.h"
-#include "base/android/jni_android.h"
-#include "base/test/android/java_handler_thread_helpers.h"
-#endif
-
-#if defined(OS_WIN)
-#include "base/message_loop/message_pump_win.h"
-#include "base/process/memory.h"
-#include "base/strings/string16.h"
-#include "base/win/current_module.h"
-#include "base/win/scoped_handle.h"
-#endif
-
-namespace base {
-
-// TODO(darin): Platform-specific MessageLoop tests should be grouped together
-// to avoid chopping this file up with so many #ifdefs.
-
-namespace {
-
-class Foo : public RefCounted<Foo> {
- public:
-  Foo() : test_count_(0) {
-  }
-
-  void Test0() { ++test_count_; }
-
-  void Test1ConstRef(const std::string& a) {
-    ++test_count_;
-    result_.append(a);
-  }
-
-  void Test1Ptr(std::string* a) {
-    ++test_count_;
-    result_.append(*a);
-  }
-
-  void Test1Int(int a) { test_count_ += a; }
-
-  void Test2Ptr(std::string* a, std::string* b) {
-    ++test_count_;
-    result_.append(*a);
-    result_.append(*b);
-  }
-
-  void Test2Mixed(const std::string& a, std::string* b) {
-    ++test_count_;
-    result_.append(a);
-    result_.append(*b);
-  }
-
-  int test_count() const { return test_count_; }
-  const std::string& result() const { return result_; }
-
- private:
-  friend class RefCounted<Foo>;
-
-  ~Foo() = default;
-
-  int test_count_;
-  std::string result_;
-
-  DISALLOW_COPY_AND_ASSIGN(Foo);
-};
-
-// This function runs slowly to simulate a large amount of work being done.
-static void SlowFunc(TimeDelta pause, int* quit_counter) {
-  PlatformThread::Sleep(pause);
-  if (--(*quit_counter) == 0)
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-}
-
-// This function records the time when Run was called in a Time object, which is
-// useful for building a variety of MessageLoop tests.
-static void RecordRunTimeFunc(TimeTicks* run_time, int* quit_counter) {
-  *run_time = TimeTicks::Now();
-
-  // Cause our Run function to take some time to execute.  As a result we can
-  // count on subsequent RecordRunTimeFunc()s running at a future time,
-  // without worry about the resolution of our system clock being an issue.
-  SlowFunc(TimeDelta::FromMilliseconds(10), quit_counter);
-}
-
-enum TaskType {
-  MESSAGEBOX,
-  ENDDIALOG,
-  RECURSIVE,
-  TIMEDMESSAGELOOP,
-  QUITMESSAGELOOP,
-  ORDERED,
-  PUMPS,
-  SLEEP,
-  RUNS,
-};
-
-// Saves the order in which the tasks executed.
-struct TaskItem {
-  TaskItem(TaskType t, int c, bool s)
-      : type(t),
-        cookie(c),
-        start(s) {
-  }
-
-  TaskType type;
-  int cookie;
-  bool start;
-
-  bool operator == (const TaskItem& other) const {
-    return type == other.type && cookie == other.cookie && start == other.start;
-  }
-};
-
-std::ostream& operator <<(std::ostream& os, TaskType type) {
-  switch (type) {
-  case MESSAGEBOX:        os << "MESSAGEBOX"; break;
-  case ENDDIALOG:         os << "ENDDIALOG"; break;
-  case RECURSIVE:         os << "RECURSIVE"; break;
-  case TIMEDMESSAGELOOP:  os << "TIMEDMESSAGELOOP"; break;
-  case QUITMESSAGELOOP:   os << "QUITMESSAGELOOP"; break;
-  case ORDERED:          os << "ORDERED"; break;
-  case PUMPS:             os << "PUMPS"; break;
-  case SLEEP:             os << "SLEEP"; break;
-  default:
-    NOTREACHED();
-    os << "Unknown TaskType";
-    break;
-  }
-  return os;
-}
-
-std::ostream& operator <<(std::ostream& os, const TaskItem& item) {
-  if (item.start)
-    return os << item.type << " " << item.cookie << " starts";
-  else
-    return os << item.type << " " << item.cookie << " ends";
-}
-
-class TaskList {
- public:
-  void RecordStart(TaskType type, int cookie) {
-    TaskItem item(type, cookie, true);
-    DVLOG(1) << item;
-    task_list_.push_back(item);
-  }
-
-  void RecordEnd(TaskType type, int cookie) {
-    TaskItem item(type, cookie, false);
-    DVLOG(1) << item;
-    task_list_.push_back(item);
-  }
-
-  size_t Size() {
-    return task_list_.size();
-  }
-
-  TaskItem Get(int n)  {
-    return task_list_[n];
-  }
-
- private:
-  std::vector<TaskItem> task_list_;
-};
-
-class DummyTaskObserver : public MessageLoop::TaskObserver {
- public:
-  explicit DummyTaskObserver(int num_tasks)
-      : num_tasks_started_(0), num_tasks_processed_(0), num_tasks_(num_tasks) {}
-
-  DummyTaskObserver(int num_tasks, int num_tasks_started)
-      : num_tasks_started_(num_tasks_started),
-        num_tasks_processed_(0),
-        num_tasks_(num_tasks) {}
-
-  ~DummyTaskObserver() override = default;
-
-  void WillProcessTask(const PendingTask& pending_task) override {
-    num_tasks_started_++;
-    EXPECT_LE(num_tasks_started_, num_tasks_);
-    EXPECT_EQ(num_tasks_started_, num_tasks_processed_ + 1);
-  }
-
-  void DidProcessTask(const PendingTask& pending_task) override {
-    num_tasks_processed_++;
-    EXPECT_LE(num_tasks_started_, num_tasks_);
-    EXPECT_EQ(num_tasks_started_, num_tasks_processed_);
-  }
-
-  int num_tasks_started() const { return num_tasks_started_; }
-  int num_tasks_processed() const { return num_tasks_processed_; }
-
- private:
-  int num_tasks_started_;
-  int num_tasks_processed_;
-  const int num_tasks_;
-
-  DISALLOW_COPY_AND_ASSIGN(DummyTaskObserver);
-};
-
-void RecursiveFunc(TaskList* order, int cookie, int depth,
-                   bool is_reentrant) {
-  order->RecordStart(RECURSIVE, cookie);
-  if (depth > 0) {
-    if (is_reentrant)
-      MessageLoopCurrent::Get()->SetNestableTasksAllowed(true);
-    ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        BindOnce(&RecursiveFunc, order, cookie, depth - 1, is_reentrant));
-  }
-  order->RecordEnd(RECURSIVE, cookie);
-}
-
-void QuitFunc(TaskList* order, int cookie) {
-  order->RecordStart(QUITMESSAGELOOP, cookie);
-  RunLoop::QuitCurrentWhenIdleDeprecated();
-  order->RecordEnd(QUITMESSAGELOOP, cookie);
-}
-
-void PostNTasks(int posts_remaining) {
-  if (posts_remaining > 1) {
-    ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, BindOnce(&PostNTasks, posts_remaining - 1));
-  }
-}
-
-enum class TaskSchedulerAvailability {
-  NO_TASK_SCHEDULER,
-  WITH_TASK_SCHEDULER,
-};
-
-std::string TaskSchedulerAvailabilityToString(
-    TaskSchedulerAvailability availability) {
-  switch (availability) {
-    case TaskSchedulerAvailability::NO_TASK_SCHEDULER:
-      return "NoTaskScheduler";
-    case TaskSchedulerAvailability::WITH_TASK_SCHEDULER:
-      return "WithTaskScheduler";
-  }
-  NOTREACHED();
-  return "Unknown";
-}
-
-class MessageLoopTest
-    : public ::testing::TestWithParam<TaskSchedulerAvailability> {
- public:
-  MessageLoopTest() = default;
-  ~MessageLoopTest() override = default;
-
-  void SetUp() override {
-    if (GetParam() == TaskSchedulerAvailability::WITH_TASK_SCHEDULER)
-      TaskScheduler::CreateAndStartWithDefaultParams("MessageLoopTest");
-  }
-
-  void TearDown() override {
-    if (GetParam() == TaskSchedulerAvailability::WITH_TASK_SCHEDULER) {
-      // Failure to call FlushForTesting() could result in task leaks as tasks
-      // are skipped on shutdown.
-      base::TaskScheduler::GetInstance()->FlushForTesting();
-      base::TaskScheduler::GetInstance()->Shutdown();
-      base::TaskScheduler::GetInstance()->JoinForTesting();
-      base::TaskScheduler::SetInstance(nullptr);
-    }
-  }
-
-  static std::string ParamInfoToString(
-      ::testing::TestParamInfo<TaskSchedulerAvailability> param_info) {
-    return TaskSchedulerAvailabilityToString(param_info.param);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MessageLoopTest);
-};
-
-#if defined(OS_ANDROID)
-void DoNotRun() {
-  ASSERT_TRUE(false);
-}
-
-void RunTest_AbortDontRunMoreTasks(bool delayed, bool init_java_first) {
-  WaitableEvent test_done_event(WaitableEvent::ResetPolicy::MANUAL,
-                                WaitableEvent::InitialState::NOT_SIGNALED);
-  std::unique_ptr<android::JavaHandlerThread> java_thread;
-  if (init_java_first) {
-    java_thread = android::JavaHandlerThreadHelpers::CreateJavaFirst();
-  } else {
-    java_thread = std::make_unique<android::JavaHandlerThread>(
-        "JavaHandlerThreadForTesting from AbortDontRunMoreTasks");
-  }
-  java_thread->Start();
-  java_thread->ListenForUncaughtExceptionsForTesting();
-
-  auto target =
-      BindOnce(&android::JavaHandlerThreadHelpers::ThrowExceptionAndAbort,
-               &test_done_event);
-  if (delayed) {
-    java_thread->message_loop()->task_runner()->PostDelayedTask(
-        FROM_HERE, std::move(target), TimeDelta::FromMilliseconds(10));
-  } else {
-    java_thread->message_loop()->task_runner()->PostTask(FROM_HERE,
-                                                         std::move(target));
-    java_thread->message_loop()->task_runner()->PostTask(FROM_HERE,
-                                                         BindOnce(&DoNotRun));
-  }
-  test_done_event.Wait();
-  java_thread->Stop();
-  android::ScopedJavaLocalRef<jthrowable> exception =
-      java_thread->GetUncaughtExceptionIfAny();
-  ASSERT_TRUE(
-      android::JavaHandlerThreadHelpers::IsExceptionTestException(exception));
-}
-
-TEST_P(MessageLoopTest, JavaExceptionAbort) {
-  constexpr bool delayed = false;
-  constexpr bool init_java_first = false;
-  RunTest_AbortDontRunMoreTasks(delayed, init_java_first);
-}
-TEST_P(MessageLoopTest, DelayedJavaExceptionAbort) {
-  constexpr bool delayed = true;
-  constexpr bool init_java_first = false;
-  RunTest_AbortDontRunMoreTasks(delayed, init_java_first);
-}
-TEST_P(MessageLoopTest, JavaExceptionAbortInitJavaFirst) {
-  constexpr bool delayed = false;
-  constexpr bool init_java_first = true;
-  RunTest_AbortDontRunMoreTasks(delayed, init_java_first);
-}
-
-TEST_P(MessageLoopTest, RunTasksWhileShuttingDownJavaThread) {
-  const int kNumPosts = 6;
-  DummyTaskObserver observer(kNumPosts, 1);
-
-  auto java_thread = std::make_unique<android::JavaHandlerThread>("test");
-  java_thread->Start();
-
-  java_thread->message_loop()->task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](android::JavaHandlerThread* java_thread,
-             DummyTaskObserver* observer, int num_posts) {
-            java_thread->message_loop()->AddTaskObserver(observer);
-            ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-                FROM_HERE, BindOnce([]() { ADD_FAILURE(); }),
-                TimeDelta::FromDays(1));
-            java_thread->StopMessageLoopForTesting();
-            PostNTasks(num_posts);
-          },
-          Unretained(java_thread.get()), Unretained(&observer), kNumPosts));
-
-  java_thread->JoinForTesting();
-  java_thread.reset();
-
-  EXPECT_EQ(kNumPosts, observer.num_tasks_started());
-  EXPECT_EQ(kNumPosts, observer.num_tasks_processed());
-}
-#endif  // defined(OS_ANDROID)
-
-#if defined(OS_WIN)
-
-void SubPumpFunc() {
-  MessageLoopCurrent::Get()->SetNestableTasksAllowed(true);
-  MSG msg;
-  while (GetMessage(&msg, NULL, 0, 0)) {
-    TranslateMessage(&msg);
-    DispatchMessage(&msg);
-  }
-  RunLoop::QuitCurrentWhenIdleDeprecated();
-}
-
-void RunTest_PostDelayedTask_SharedTimer_SubPump() {
-  MessageLoop message_loop(MessageLoop::TYPE_UI);
-
-  // Test that the interval of the timer, used to run the next delayed task, is
-  // set to a value corresponding to when the next delayed task should run.
-
-  // By setting num_tasks to 1, we ensure that the first task to run causes the
-  // run loop to exit.
-  int num_tasks = 1;
-  TimeTicks run_time;
-
-  message_loop.task_runner()->PostTask(FROM_HERE, BindOnce(&SubPumpFunc));
-
-  // This very delayed task should never run.
-  message_loop.task_runner()->PostDelayedTask(
-      FROM_HERE, BindOnce(&RecordRunTimeFunc, &run_time, &num_tasks),
-      TimeDelta::FromSeconds(1000));
-
-  // This slightly delayed task should run from within SubPumpFunc.
-  message_loop.task_runner()->PostDelayedTask(FROM_HERE,
-                                              BindOnce(&PostQuitMessage, 0),
-                                              TimeDelta::FromMilliseconds(10));
-
-  Time start_time = Time::Now();
-
-  RunLoop().Run();
-  EXPECT_EQ(1, num_tasks);
-
-  // Ensure that we ran in far less time than the slower timer.
-  TimeDelta total_time = Time::Now() - start_time;
-  EXPECT_GT(5000, total_time.InMilliseconds());
-
-  // In case both timers somehow run at nearly the same time, sleep a little
-  // and then run all pending to force them both to have run.  This is just
-  // encouraging flakiness if there is any.
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(100));
-  RunLoop().RunUntilIdle();
-
-  EXPECT_TRUE(run_time.is_null());
-}
-
-const wchar_t kMessageBoxTitle[] = L"MessageLoop Unit Test";
-
-// MessageLoop implicitly start a "modal message loop". Modal dialog boxes,
-// common controls (like OpenFile) and StartDoc printing function can cause
-// implicit message loops.
-void MessageBoxFunc(TaskList* order, int cookie, bool is_reentrant) {
-  order->RecordStart(MESSAGEBOX, cookie);
-  if (is_reentrant)
-    MessageLoopCurrent::Get()->SetNestableTasksAllowed(true);
-  MessageBox(NULL, L"Please wait...", kMessageBoxTitle, MB_OK);
-  order->RecordEnd(MESSAGEBOX, cookie);
-}
-
-// Will end the MessageBox.
-void EndDialogFunc(TaskList* order, int cookie) {
-  order->RecordStart(ENDDIALOG, cookie);
-  HWND window = GetActiveWindow();
-  if (window != NULL) {
-    EXPECT_NE(EndDialog(window, IDCONTINUE), 0);
-    // Cheap way to signal that the window wasn't found if RunEnd() isn't
-    // called.
-    order->RecordEnd(ENDDIALOG, cookie);
-  }
-}
-
-void RecursiveFuncWin(scoped_refptr<SingleThreadTaskRunner> task_runner,
-                      HANDLE event,
-                      bool expect_window,
-                      TaskList* order,
-                      bool is_reentrant) {
-  task_runner->PostTask(FROM_HERE,
-                        BindOnce(&RecursiveFunc, order, 1, 2, is_reentrant));
-  task_runner->PostTask(FROM_HERE,
-                        BindOnce(&MessageBoxFunc, order, 2, is_reentrant));
-  task_runner->PostTask(FROM_HERE,
-                        BindOnce(&RecursiveFunc, order, 3, 2, is_reentrant));
-  // The trick here is that for recursive task processing, this task will be
-  // ran _inside_ the MessageBox message loop, dismissing the MessageBox
-  // without a chance.
-  // For non-recursive task processing, this will be executed _after_ the
-  // MessageBox will have been dismissed by the code below, where
-  // expect_window_ is true.
-  task_runner->PostTask(FROM_HERE, BindOnce(&EndDialogFunc, order, 4));
-  task_runner->PostTask(FROM_HERE, BindOnce(&QuitFunc, order, 5));
-
-  // Enforce that every tasks are sent before starting to run the main thread
-  // message loop.
-  ASSERT_TRUE(SetEvent(event));
-
-  // Poll for the MessageBox. Don't do this at home! At the speed we do it,
-  // you will never realize one MessageBox was shown.
-  for (; expect_window;) {
-    HWND window = FindWindow(L"#32770", kMessageBoxTitle);
-    if (window) {
-      // Dismiss it.
-      for (;;) {
-        HWND button = FindWindowEx(window, NULL, L"Button", NULL);
-        if (button != NULL) {
-          EXPECT_EQ(0, SendMessage(button, WM_LBUTTONDOWN, 0, 0));
-          EXPECT_EQ(0, SendMessage(button, WM_LBUTTONUP, 0, 0));
-          break;
-        }
-      }
-      break;
-    }
-  }
-}
-
-// TODO(darin): These tests need to be ported since they test critical
-// message loop functionality.
-
-// A side effect of this test is the generation a beep. Sorry.
-void RunTest_RecursiveDenial2(MessageLoop::Type message_loop_type) {
-  MessageLoop loop(message_loop_type);
-
-  Thread worker("RecursiveDenial2_worker");
-  Thread::Options options;
-  options.message_loop_type = message_loop_type;
-  ASSERT_EQ(true, worker.StartWithOptions(options));
-  TaskList order;
-  win::ScopedHandle event(CreateEvent(NULL, FALSE, FALSE, NULL));
-  worker.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&RecursiveFuncWin, ThreadTaskRunnerHandle::Get(),
-                          event.Get(), true, &order, false));
-  // Let the other thread execute.
-  WaitForSingleObject(event.Get(), INFINITE);
-  RunLoop().Run();
-
-  ASSERT_EQ(17u, order.Size());
-  EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(2), TaskItem(MESSAGEBOX, 2, true));
-  EXPECT_EQ(order.Get(3), TaskItem(MESSAGEBOX, 2, false));
-  EXPECT_EQ(order.Get(4), TaskItem(RECURSIVE, 3, true));
-  EXPECT_EQ(order.Get(5), TaskItem(RECURSIVE, 3, false));
-  // When EndDialogFunc is processed, the window is already dismissed, hence no
-  // "end" entry.
-  EXPECT_EQ(order.Get(6), TaskItem(ENDDIALOG, 4, true));
-  EXPECT_EQ(order.Get(7), TaskItem(QUITMESSAGELOOP, 5, true));
-  EXPECT_EQ(order.Get(8), TaskItem(QUITMESSAGELOOP, 5, false));
-  EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(10), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(11), TaskItem(RECURSIVE, 3, true));
-  EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 3, false));
-  EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(14), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(15), TaskItem(RECURSIVE, 3, true));
-  EXPECT_EQ(order.Get(16), TaskItem(RECURSIVE, 3, false));
-}
-
-// A side effect of this test is the generation a beep. Sorry.  This test also
-// needs to process windows messages on the current thread.
-void RunTest_RecursiveSupport2(MessageLoop::Type message_loop_type) {
-  MessageLoop loop(message_loop_type);
-
-  Thread worker("RecursiveSupport2_worker");
-  Thread::Options options;
-  options.message_loop_type = message_loop_type;
-  ASSERT_EQ(true, worker.StartWithOptions(options));
-  TaskList order;
-  win::ScopedHandle event(CreateEvent(NULL, FALSE, FALSE, NULL));
-  worker.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&RecursiveFuncWin, ThreadTaskRunnerHandle::Get(),
-                          event.Get(), false, &order, true));
-  // Let the other thread execute.
-  WaitForSingleObject(event.Get(), INFINITE);
-  RunLoop().Run();
-
-  ASSERT_EQ(18u, order.Size());
-  EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(2), TaskItem(MESSAGEBOX, 2, true));
-  // Note that this executes in the MessageBox modal loop.
-  EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 3, true));
-  EXPECT_EQ(order.Get(4), TaskItem(RECURSIVE, 3, false));
-  EXPECT_EQ(order.Get(5), TaskItem(ENDDIALOG, 4, true));
-  EXPECT_EQ(order.Get(6), TaskItem(ENDDIALOG, 4, false));
-  EXPECT_EQ(order.Get(7), TaskItem(MESSAGEBOX, 2, false));
-  /* The order can subtly change here. The reason is that when RecursiveFunc(1)
-     is called in the main thread, if it is faster than getting to the
-     PostTask(FROM_HERE, BindOnce(&QuitFunc) execution, the order of task
-     execution can change. We don't care anyway that the order isn't correct.
-  EXPECT_EQ(order.Get(8), TaskItem(QUITMESSAGELOOP, 5, true));
-  EXPECT_EQ(order.Get(9), TaskItem(QUITMESSAGELOOP, 5, false));
-  EXPECT_EQ(order.Get(10), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(11), TaskItem(RECURSIVE, 1, false));
-  */
-  EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 3, true));
-  EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 3, false));
-  EXPECT_EQ(order.Get(14), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(15), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(16), TaskItem(RECURSIVE, 3, true));
-  EXPECT_EQ(order.Get(17), TaskItem(RECURSIVE, 3, false));
-}
-
-#endif  // defined(OS_WIN)
-
-void PostNTasksThenQuit(int posts_remaining) {
-  if (posts_remaining > 1) {
-    ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, BindOnce(&PostNTasksThenQuit, posts_remaining - 1));
-  } else {
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-  }
-}
-
-#if defined(OS_WIN)
-
-class TestIOHandler : public MessagePumpForIO::IOHandler {
- public:
-  TestIOHandler(const wchar_t* name, HANDLE signal, bool wait);
-
-  void OnIOCompleted(MessagePumpForIO::IOContext* context,
-                     DWORD bytes_transfered,
-                     DWORD error) override;
-
-  void Init();
-  void WaitForIO();
-  OVERLAPPED* context() { return &context_.overlapped; }
-  DWORD size() { return sizeof(buffer_); }
-
- private:
-  char buffer_[48];
-  MessagePumpForIO::IOContext context_;
-  HANDLE signal_;
-  win::ScopedHandle file_;
-  bool wait_;
-};
-
-TestIOHandler::TestIOHandler(const wchar_t* name, HANDLE signal, bool wait)
-    : signal_(signal), wait_(wait) {
-  memset(buffer_, 0, sizeof(buffer_));
-
-  file_.Set(CreateFile(name, GENERIC_READ, 0, NULL, OPEN_EXISTING,
-                       FILE_FLAG_OVERLAPPED, NULL));
-  EXPECT_TRUE(file_.IsValid());
-}
-
-void TestIOHandler::Init() {
-  MessageLoopCurrentForIO::Get()->RegisterIOHandler(file_.Get(), this);
-
-  DWORD read;
-  EXPECT_FALSE(ReadFile(file_.Get(), buffer_, size(), &read, context()));
-  EXPECT_EQ(static_cast<DWORD>(ERROR_IO_PENDING), GetLastError());
-  if (wait_)
-    WaitForIO();
-}
-
-void TestIOHandler::OnIOCompleted(MessagePumpForIO::IOContext* context,
-                                  DWORD bytes_transfered,
-                                  DWORD error) {
-  ASSERT_TRUE(context == &context_);
-  ASSERT_TRUE(SetEvent(signal_));
-}
-
-void TestIOHandler::WaitForIO() {
-  EXPECT_TRUE(MessageLoopCurrentForIO::Get()->WaitForIOCompletion(300, this));
-  EXPECT_TRUE(MessageLoopCurrentForIO::Get()->WaitForIOCompletion(400, this));
-}
-
-void RunTest_IOHandler() {
-  win::ScopedHandle callback_called(CreateEvent(NULL, TRUE, FALSE, NULL));
-  ASSERT_TRUE(callback_called.IsValid());
-
-  const wchar_t* kPipeName = L"\\\\.\\pipe\\iohandler_pipe";
-  win::ScopedHandle server(
-      CreateNamedPipe(kPipeName, PIPE_ACCESS_OUTBOUND, 0, 1, 0, 0, 0, NULL));
-  ASSERT_TRUE(server.IsValid());
-
-  Thread thread("IOHandler test");
-  Thread::Options options;
-  options.message_loop_type = MessageLoop::TYPE_IO;
-  ASSERT_TRUE(thread.StartWithOptions(options));
-
-  TestIOHandler handler(kPipeName, callback_called.Get(), false);
-  thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&TestIOHandler::Init, Unretained(&handler)));
-  // Make sure the thread runs and sleeps for lack of work.
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(100));
-
-  const char buffer[] = "Hello there!";
-  DWORD written;
-  EXPECT_TRUE(WriteFile(server.Get(), buffer, sizeof(buffer), &written, NULL));
-
-  DWORD result = WaitForSingleObject(callback_called.Get(), 1000);
-  EXPECT_EQ(WAIT_OBJECT_0, result);
-
-  thread.Stop();
-}
-
-void RunTest_WaitForIO() {
-  win::ScopedHandle callback1_called(
-      CreateEvent(NULL, TRUE, FALSE, NULL));
-  win::ScopedHandle callback2_called(
-      CreateEvent(NULL, TRUE, FALSE, NULL));
-  ASSERT_TRUE(callback1_called.IsValid());
-  ASSERT_TRUE(callback2_called.IsValid());
-
-  const wchar_t* kPipeName1 = L"\\\\.\\pipe\\iohandler_pipe1";
-  const wchar_t* kPipeName2 = L"\\\\.\\pipe\\iohandler_pipe2";
-  win::ScopedHandle server1(
-      CreateNamedPipe(kPipeName1, PIPE_ACCESS_OUTBOUND, 0, 1, 0, 0, 0, NULL));
-  win::ScopedHandle server2(
-      CreateNamedPipe(kPipeName2, PIPE_ACCESS_OUTBOUND, 0, 1, 0, 0, 0, NULL));
-  ASSERT_TRUE(server1.IsValid());
-  ASSERT_TRUE(server2.IsValid());
-
-  Thread thread("IOHandler test");
-  Thread::Options options;
-  options.message_loop_type = MessageLoop::TYPE_IO;
-  ASSERT_TRUE(thread.StartWithOptions(options));
-
-  TestIOHandler handler1(kPipeName1, callback1_called.Get(), false);
-  TestIOHandler handler2(kPipeName2, callback2_called.Get(), true);
-  thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&TestIOHandler::Init, Unretained(&handler1)));
-  // TODO(ajwong): Do we really need such long Sleeps in this function?
-  // Make sure the thread runs and sleeps for lack of work.
-  TimeDelta delay = TimeDelta::FromMilliseconds(100);
-  PlatformThread::Sleep(delay);
-  thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&TestIOHandler::Init, Unretained(&handler2)));
-  PlatformThread::Sleep(delay);
-
-  // At this time handler1 is waiting to be called, and the thread is waiting
-  // on the Init method of handler2, filtering only handler2 callbacks.
-
-  const char buffer[] = "Hello there!";
-  DWORD written;
-  EXPECT_TRUE(WriteFile(server1.Get(), buffer, sizeof(buffer), &written, NULL));
-  PlatformThread::Sleep(2 * delay);
-  EXPECT_EQ(static_cast<DWORD>(WAIT_TIMEOUT),
-            WaitForSingleObject(callback1_called.Get(), 0))
-      << "handler1 has not been called";
-
-  EXPECT_TRUE(WriteFile(server2.Get(), buffer, sizeof(buffer), &written, NULL));
-
-  HANDLE objects[2] = { callback1_called.Get(), callback2_called.Get() };
-  DWORD result = WaitForMultipleObjects(2, objects, TRUE, 1000);
-  EXPECT_EQ(WAIT_OBJECT_0, result);
-
-  thread.Stop();
-}
-
-#endif  // defined(OS_WIN)
-
-}  // namespace
-
-//-----------------------------------------------------------------------------
-// Each test is run against each type of MessageLoop.  That way we are sure
-// that message loops work properly in all configurations.  Of course, in some
-// cases, a unit test may only be for a particular type of loop.
-
-namespace {
-
-struct MessageLoopTypedTestParams {
-  MessageLoopTypedTestParams(
-      MessageLoop::Type type_in,
-      TaskSchedulerAvailability task_scheduler_availability_in) {
-    type = type_in;
-    task_scheduler_availability = task_scheduler_availability_in;
-  }
-
-  MessageLoop::Type type;
-  TaskSchedulerAvailability task_scheduler_availability;
-};
-
-class MessageLoopTypedTest
-    : public ::testing::TestWithParam<MessageLoopTypedTestParams> {
- public:
-  MessageLoopTypedTest() = default;
-  ~MessageLoopTypedTest() = default;
-
-  void SetUp() override {
-    if (GetTaskSchedulerAvailability() ==
-        TaskSchedulerAvailability::WITH_TASK_SCHEDULER) {
-      TaskScheduler::CreateAndStartWithDefaultParams("MessageLoopTypedTest");
-    }
-  }
-
-  void TearDown() override {
-    if (GetTaskSchedulerAvailability() ==
-        TaskSchedulerAvailability::WITH_TASK_SCHEDULER) {
-      // Failure to call FlushForTesting() could result in task leaks as tasks
-      // are skipped on shutdown.
-      base::TaskScheduler::GetInstance()->FlushForTesting();
-      base::TaskScheduler::GetInstance()->Shutdown();
-      base::TaskScheduler::GetInstance()->JoinForTesting();
-      base::TaskScheduler::SetInstance(nullptr);
-    }
-  }
-
-  static std::string ParamInfoToString(
-      ::testing::TestParamInfo<MessageLoopTypedTestParams> param_info) {
-    return MessageLoopTypeToString(param_info.param.type) + "_" +
-           TaskSchedulerAvailabilityToString(
-               param_info.param.task_scheduler_availability);
-  }
-
- protected:
-  MessageLoop::Type GetMessageLoopType() { return GetParam().type; }
-
- private:
-  static std::string MessageLoopTypeToString(MessageLoop::Type type) {
-    switch (type) {
-      case MessageLoop::TYPE_DEFAULT:
-        return "Default";
-      case MessageLoop::TYPE_IO:
-        return "IO";
-      case MessageLoop::TYPE_UI:
-        return "UI";
-      case MessageLoop::TYPE_CUSTOM:
-#if defined(OS_ANDROID)
-      case MessageLoop::TYPE_JAVA:
-#endif  // defined(OS_ANDROID)
-        break;
-    }
-    NOTREACHED();
-    return "NotSupported";
-  }
-
-  TaskSchedulerAvailability GetTaskSchedulerAvailability() {
-    return GetParam().task_scheduler_availability;
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(MessageLoopTypedTest);
-};
-
-}  // namespace
-
-TEST_P(MessageLoopTypedTest, PostTask) {
-  MessageLoop loop(GetMessageLoopType());
-  // Add tests to message loop
-  scoped_refptr<Foo> foo(new Foo());
-  std::string a("a"), b("b"), c("c"), d("d");
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&Foo::Test0, foo));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&Foo::Test1ConstRef, foo, a));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&Foo::Test1Ptr, foo, &b));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&Foo::Test1Int, foo, 100));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&Foo::Test2Ptr, foo, &a, &c));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&Foo::Test2Mixed, foo, a, &d));
-  // After all tests, post a message that will shut down the message loop
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&RunLoop::QuitCurrentWhenIdleDeprecated));
-
-  // Now kick things off
-  RunLoop().Run();
-
-  EXPECT_EQ(foo->test_count(), 105);
-  EXPECT_EQ(foo->result(), "abacad");
-}
-
-TEST_P(MessageLoopTypedTest, PostDelayedTask_Basic) {
-  MessageLoop loop(GetMessageLoopType());
-
-  // Test that PostDelayedTask results in a delayed task.
-
-  const TimeDelta kDelay = TimeDelta::FromMilliseconds(100);
-
-  int num_tasks = 1;
-  TimeTicks run_time;
-
-  TimeTicks time_before_run = TimeTicks::Now();
-  loop.task_runner()->PostDelayedTask(
-      FROM_HERE, BindOnce(&RecordRunTimeFunc, &run_time, &num_tasks), kDelay);
-  RunLoop().Run();
-  TimeTicks time_after_run = TimeTicks::Now();
-
-  EXPECT_EQ(0, num_tasks);
-  EXPECT_LT(kDelay, time_after_run - time_before_run);
-}
-
-TEST_P(MessageLoopTypedTest, PostDelayedTask_InDelayOrder) {
-  MessageLoop loop(GetMessageLoopType());
-
-  // Test that two tasks with different delays run in the right order.
-  int num_tasks = 2;
-  TimeTicks run_time1, run_time2;
-
-  loop.task_runner()->PostDelayedTask(
-      FROM_HERE, BindOnce(&RecordRunTimeFunc, &run_time1, &num_tasks),
-      TimeDelta::FromMilliseconds(200));
-  // If we get a large pause in execution (due to a context switch) here, this
-  // test could fail.
-  loop.task_runner()->PostDelayedTask(
-      FROM_HERE, BindOnce(&RecordRunTimeFunc, &run_time2, &num_tasks),
-      TimeDelta::FromMilliseconds(10));
-
-  RunLoop().Run();
-  EXPECT_EQ(0, num_tasks);
-
-  EXPECT_TRUE(run_time2 < run_time1);
-}
-
-TEST_P(MessageLoopTypedTest, PostDelayedTask_InPostOrder) {
-  MessageLoop loop(GetMessageLoopType());
-
-  // Test that two tasks with the same delay run in the order in which they
-  // were posted.
-  //
-  // NOTE: This is actually an approximate test since the API only takes a
-  // "delay" parameter, so we are not exactly simulating two tasks that get
-  // posted at the exact same time.  It would be nice if the API allowed us to
-  // specify the desired run time.
-
-  const TimeDelta kDelay = TimeDelta::FromMilliseconds(100);
-
-  int num_tasks = 2;
-  TimeTicks run_time1, run_time2;
-
-  loop.task_runner()->PostDelayedTask(
-      FROM_HERE, BindOnce(&RecordRunTimeFunc, &run_time1, &num_tasks), kDelay);
-  loop.task_runner()->PostDelayedTask(
-      FROM_HERE, BindOnce(&RecordRunTimeFunc, &run_time2, &num_tasks), kDelay);
-
-  RunLoop().Run();
-  EXPECT_EQ(0, num_tasks);
-
-  EXPECT_TRUE(run_time1 < run_time2);
-}
-
-TEST_P(MessageLoopTypedTest, PostDelayedTask_InPostOrder_2) {
-  MessageLoop loop(GetMessageLoopType());
-
-  // Test that a delayed task still runs after a normal tasks even if the
-  // normal tasks take a long time to run.
-
-  const TimeDelta kPause = TimeDelta::FromMilliseconds(50);
-
-  int num_tasks = 2;
-  TimeTicks run_time;
-
-  loop.task_runner()->PostTask(FROM_HERE,
-                               BindOnce(&SlowFunc, kPause, &num_tasks));
-  loop.task_runner()->PostDelayedTask(
-      FROM_HERE, BindOnce(&RecordRunTimeFunc, &run_time, &num_tasks),
-      TimeDelta::FromMilliseconds(10));
-
-  TimeTicks time_before_run = TimeTicks::Now();
-  RunLoop().Run();
-  TimeTicks time_after_run = TimeTicks::Now();
-
-  EXPECT_EQ(0, num_tasks);
-
-  EXPECT_LT(kPause, time_after_run - time_before_run);
-}
-
-TEST_P(MessageLoopTypedTest, PostDelayedTask_InPostOrder_3) {
-  MessageLoop loop(GetMessageLoopType());
-
-  // Test that a delayed task still runs after a pile of normal tasks.  The key
-  // difference between this test and the previous one is that here we return
-  // the MessageLoop a lot so we give the MessageLoop plenty of opportunities
-  // to maybe run the delayed task.  It should know not to do so until the
-  // delayed task's delay has passed.
-
-  int num_tasks = 11;
-  TimeTicks run_time1, run_time2;
-
-  // Clutter the ML with tasks.
-  for (int i = 1; i < num_tasks; ++i)
-    loop.task_runner()->PostTask(
-        FROM_HERE, BindOnce(&RecordRunTimeFunc, &run_time1, &num_tasks));
-
-  loop.task_runner()->PostDelayedTask(
-      FROM_HERE, BindOnce(&RecordRunTimeFunc, &run_time2, &num_tasks),
-      TimeDelta::FromMilliseconds(1));
-
-  RunLoop().Run();
-  EXPECT_EQ(0, num_tasks);
-
-  EXPECT_TRUE(run_time2 > run_time1);
-}
-
-TEST_P(MessageLoopTypedTest, PostDelayedTask_SharedTimer) {
-  MessageLoop loop(GetMessageLoopType());
-
-  // Test that the interval of the timer, used to run the next delayed task, is
-  // set to a value corresponding to when the next delayed task should run.
-
-  // By setting num_tasks to 1, we ensure that the first task to run causes the
-  // run loop to exit.
-  int num_tasks = 1;
-  TimeTicks run_time1, run_time2;
-
-  loop.task_runner()->PostDelayedTask(
-      FROM_HERE, BindOnce(&RecordRunTimeFunc, &run_time1, &num_tasks),
-      TimeDelta::FromSeconds(1000));
-  loop.task_runner()->PostDelayedTask(
-      FROM_HERE, BindOnce(&RecordRunTimeFunc, &run_time2, &num_tasks),
-      TimeDelta::FromMilliseconds(10));
-
-  TimeTicks start_time = TimeTicks::Now();
-
-  RunLoop().Run();
-  EXPECT_EQ(0, num_tasks);
-
-  // Ensure that we ran in far less time than the slower timer.
-  TimeDelta total_time = TimeTicks::Now() - start_time;
-  EXPECT_GT(5000, total_time.InMilliseconds());
-
-  // In case both timers somehow run at nearly the same time, sleep a little
-  // and then run all pending to force them both to have run.  This is just
-  // encouraging flakiness if there is any.
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(100));
-  RunLoop().RunUntilIdle();
-
-  EXPECT_TRUE(run_time1.is_null());
-  EXPECT_FALSE(run_time2.is_null());
-}
-
-namespace {
-
-// This is used to inject a test point for recording the destructor calls for
-// Closure objects send to MessageLoop::PostTask(). It is awkward usage since we
-// are trying to hook the actual destruction, which is not a common operation.
-class RecordDeletionProbe : public RefCounted<RecordDeletionProbe> {
- public:
-  RecordDeletionProbe(RecordDeletionProbe* post_on_delete, bool* was_deleted)
-      : post_on_delete_(post_on_delete), was_deleted_(was_deleted) {}
-  void Run() {}
-
- private:
-  friend class RefCounted<RecordDeletionProbe>;
-
-  ~RecordDeletionProbe() {
-    *was_deleted_ = true;
-    if (post_on_delete_.get())
-      ThreadTaskRunnerHandle::Get()->PostTask(
-          FROM_HERE, BindOnce(&RecordDeletionProbe::Run, post_on_delete_));
-  }
-
-  scoped_refptr<RecordDeletionProbe> post_on_delete_;
-  bool* was_deleted_;
-};
-
-}  // namespace
-
-/* TODO(darin): MessageLoop does not support deleting all tasks in the */
-/* destructor. */
-/* Fails, http://crbug.com/50272. */
-TEST_P(MessageLoopTypedTest, DISABLED_EnsureDeletion) {
-  bool a_was_deleted = false;
-  bool b_was_deleted = false;
-  {
-    MessageLoop loop(GetMessageLoopType());
-    loop.task_runner()->PostTask(
-        FROM_HERE, BindOnce(&RecordDeletionProbe::Run,
-                            new RecordDeletionProbe(nullptr, &a_was_deleted)));
-    // TODO(ajwong): Do we really need 1000ms here?
-    loop.task_runner()->PostDelayedTask(
-        FROM_HERE,
-        BindOnce(&RecordDeletionProbe::Run,
-                 new RecordDeletionProbe(nullptr, &b_was_deleted)),
-        TimeDelta::FromMilliseconds(1000));
-  }
-  EXPECT_TRUE(a_was_deleted);
-  EXPECT_TRUE(b_was_deleted);
-}
-
-/* TODO(darin): MessageLoop does not support deleting all tasks in the */
-/* destructor. */
-/* Fails, http://crbug.com/50272. */
-TEST_P(MessageLoopTypedTest, DISABLED_EnsureDeletion_Chain) {
-  bool a_was_deleted = false;
-  bool b_was_deleted = false;
-  bool c_was_deleted = false;
-  {
-    MessageLoop loop(GetMessageLoopType());
-    // The scoped_refptr for each of the below is held either by the chained
-    // RecordDeletionProbe, or the bound RecordDeletionProbe::Run() callback.
-    RecordDeletionProbe* a = new RecordDeletionProbe(nullptr, &a_was_deleted);
-    RecordDeletionProbe* b = new RecordDeletionProbe(a, &b_was_deleted);
-    RecordDeletionProbe* c = new RecordDeletionProbe(b, &c_was_deleted);
-    loop.task_runner()->PostTask(FROM_HERE,
-                                 BindOnce(&RecordDeletionProbe::Run, c));
-  }
-  EXPECT_TRUE(a_was_deleted);
-  EXPECT_TRUE(b_was_deleted);
-  EXPECT_TRUE(c_was_deleted);
-}
-
-namespace {
-
-void NestingFunc(int* depth) {
-  if (*depth > 0) {
-    *depth -= 1;
-    ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                            BindOnce(&NestingFunc, depth));
-
-    MessageLoopCurrent::Get()->SetNestableTasksAllowed(true);
-    RunLoop().Run();
-  }
-  base::RunLoop::QuitCurrentWhenIdleDeprecated();
-}
-
-}  // namespace
-
-TEST_P(MessageLoopTypedTest, Nesting) {
-  MessageLoop loop(GetMessageLoopType());
-
-  int depth = 50;
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&NestingFunc, &depth));
-  RunLoop().Run();
-  EXPECT_EQ(depth, 0);
-}
-
-TEST_P(MessageLoopTypedTest, RecursiveDenial1) {
-  MessageLoop loop(GetMessageLoopType());
-
-  EXPECT_TRUE(MessageLoopCurrent::Get()->NestableTasksAllowed());
-  TaskList order;
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&RecursiveFunc, &order, 1, 2, false));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&RecursiveFunc, &order, 2, 2, false));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&QuitFunc, &order, 3));
-
-  RunLoop().Run();
-
-  // FIFO order.
-  ASSERT_EQ(14U, order.Size());
-  EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(2), TaskItem(RECURSIVE, 2, true));
-  EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 2, false));
-  EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true));
-  EXPECT_EQ(order.Get(5), TaskItem(QUITMESSAGELOOP, 3, false));
-  EXPECT_EQ(order.Get(6), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(7), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(8), TaskItem(RECURSIVE, 2, true));
-  EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false));
-  EXPECT_EQ(order.Get(10), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(11), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 2, true));
-  EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 2, false));
-}
-
-namespace {
-
-void RecursiveSlowFunc(TaskList* order,
-                       int cookie,
-                       int depth,
-                       bool is_reentrant) {
-  RecursiveFunc(order, cookie, depth, is_reentrant);
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(10));
-}
-
-void OrderedFunc(TaskList* order, int cookie) {
-  order->RecordStart(ORDERED, cookie);
-  order->RecordEnd(ORDERED, cookie);
-}
-
-}  // namespace
-
-TEST_P(MessageLoopTypedTest, RecursiveDenial3) {
-  MessageLoop loop(GetMessageLoopType());
-
-  EXPECT_TRUE(MessageLoopCurrent::Get()->NestableTasksAllowed());
-  TaskList order;
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&RecursiveSlowFunc, &order, 1, 2, false));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&RecursiveSlowFunc, &order, 2, 2, false));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, BindOnce(&OrderedFunc, &order, 3),
-      TimeDelta::FromMilliseconds(5));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, BindOnce(&QuitFunc, &order, 4),
-      TimeDelta::FromMilliseconds(5));
-
-  RunLoop().Run();
-
-  // FIFO order.
-  ASSERT_EQ(16U, order.Size());
-  EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(2), TaskItem(RECURSIVE, 2, true));
-  EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 2, false));
-  EXPECT_EQ(order.Get(4), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(5), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(6), TaskItem(ORDERED, 3, true));
-  EXPECT_EQ(order.Get(7), TaskItem(ORDERED, 3, false));
-  EXPECT_EQ(order.Get(8), TaskItem(RECURSIVE, 2, true));
-  EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false));
-  EXPECT_EQ(order.Get(10), TaskItem(QUITMESSAGELOOP, 4, true));
-  EXPECT_EQ(order.Get(11), TaskItem(QUITMESSAGELOOP, 4, false));
-  EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(14), TaskItem(RECURSIVE, 2, true));
-  EXPECT_EQ(order.Get(15), TaskItem(RECURSIVE, 2, false));
-}
-
-TEST_P(MessageLoopTypedTest, RecursiveSupport1) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&RecursiveFunc, &order, 1, 2, true));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&RecursiveFunc, &order, 2, 2, true));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&QuitFunc, &order, 3));
-
-  RunLoop().Run();
-
-  // FIFO order.
-  ASSERT_EQ(14U, order.Size());
-  EXPECT_EQ(order.Get(0), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(1), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(2), TaskItem(RECURSIVE, 2, true));
-  EXPECT_EQ(order.Get(3), TaskItem(RECURSIVE, 2, false));
-  EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true));
-  EXPECT_EQ(order.Get(5), TaskItem(QUITMESSAGELOOP, 3, false));
-  EXPECT_EQ(order.Get(6), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(7), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(8), TaskItem(RECURSIVE, 2, true));
-  EXPECT_EQ(order.Get(9), TaskItem(RECURSIVE, 2, false));
-  EXPECT_EQ(order.Get(10), TaskItem(RECURSIVE, 1, true));
-  EXPECT_EQ(order.Get(11), TaskItem(RECURSIVE, 1, false));
-  EXPECT_EQ(order.Get(12), TaskItem(RECURSIVE, 2, true));
-  EXPECT_EQ(order.Get(13), TaskItem(RECURSIVE, 2, false));
-}
-
-// Tests that non nestable tasks run in FIFO if there are no nested loops.
-TEST_P(MessageLoopTypedTest, NonNestableWithNoNesting) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-
-  ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
-      FROM_HERE, BindOnce(&OrderedFunc, &order, 1));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 2));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&QuitFunc, &order, 3));
-  RunLoop().Run();
-
-  // FIFO order.
-  ASSERT_EQ(6U, order.Size());
-  EXPECT_EQ(order.Get(0), TaskItem(ORDERED, 1, true));
-  EXPECT_EQ(order.Get(1), TaskItem(ORDERED, 1, false));
-  EXPECT_EQ(order.Get(2), TaskItem(ORDERED, 2, true));
-  EXPECT_EQ(order.Get(3), TaskItem(ORDERED, 2, false));
-  EXPECT_EQ(order.Get(4), TaskItem(QUITMESSAGELOOP, 3, true));
-  EXPECT_EQ(order.Get(5), TaskItem(QUITMESSAGELOOP, 3, false));
-}
-
-namespace {
-
-void FuncThatPumps(TaskList* order, int cookie) {
-  order->RecordStart(PUMPS, cookie);
-  RunLoop(RunLoop::Type::kNestableTasksAllowed).RunUntilIdle();
-  order->RecordEnd(PUMPS, cookie);
-}
-
-void SleepFunc(TaskList* order, int cookie, TimeDelta delay) {
-  order->RecordStart(SLEEP, cookie);
-  PlatformThread::Sleep(delay);
-  order->RecordEnd(SLEEP, cookie);
-}
-
-}  // namespace
-
-// Tests that non nestable tasks don't run when there's code in the call stack.
-TEST_P(MessageLoopTypedTest, NonNestableDelayedInNestedLoop) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&FuncThatPumps, &order, 1));
-  ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
-      FROM_HERE, BindOnce(&OrderedFunc, &order, 2));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 3));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      BindOnce(&SleepFunc, &order, 4, TimeDelta::FromMilliseconds(50)));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 5));
-  ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
-      FROM_HERE, BindOnce(&QuitFunc, &order, 6));
-
-  RunLoop().Run();
-
-  // FIFO order.
-  ASSERT_EQ(12U, order.Size());
-  EXPECT_EQ(order.Get(0), TaskItem(PUMPS, 1, true));
-  EXPECT_EQ(order.Get(1), TaskItem(ORDERED, 3, true));
-  EXPECT_EQ(order.Get(2), TaskItem(ORDERED, 3, false));
-  EXPECT_EQ(order.Get(3), TaskItem(SLEEP, 4, true));
-  EXPECT_EQ(order.Get(4), TaskItem(SLEEP, 4, false));
-  EXPECT_EQ(order.Get(5), TaskItem(ORDERED, 5, true));
-  EXPECT_EQ(order.Get(6), TaskItem(ORDERED, 5, false));
-  EXPECT_EQ(order.Get(7), TaskItem(PUMPS, 1, false));
-  EXPECT_EQ(order.Get(8), TaskItem(ORDERED, 2, true));
-  EXPECT_EQ(order.Get(9), TaskItem(ORDERED, 2, false));
-  EXPECT_EQ(order.Get(10), TaskItem(QUITMESSAGELOOP, 6, true));
-  EXPECT_EQ(order.Get(11), TaskItem(QUITMESSAGELOOP, 6, false));
-}
-
-namespace {
-
-void FuncThatRuns(TaskList* order, int cookie, RunLoop* run_loop) {
-  order->RecordStart(RUNS, cookie);
-  {
-    MessageLoopCurrent::ScopedNestableTaskAllower allow;
-    run_loop->Run();
-  }
-  order->RecordEnd(RUNS, cookie);
-}
-
-void FuncThatQuitsNow() {
-  base::RunLoop::QuitCurrentDeprecated();
-}
-
-}  // namespace
-
-// Tests RunLoopQuit only quits the corresponding MessageLoop::Run.
-TEST_P(MessageLoopTypedTest, QuitNow) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-
-  RunLoop run_loop;
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&FuncThatRuns, &order, 1, Unretained(&run_loop)));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 2));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&FuncThatQuitsNow));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 3));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&FuncThatQuitsNow));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&OrderedFunc, &order, 4));  // never runs
-
-  RunLoop().Run();
-
-  ASSERT_EQ(6U, order.Size());
-  int task_index = 0;
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, false));
-  EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
-}
-
-// Tests RunLoopQuit only quits the corresponding MessageLoop::Run.
-TEST_P(MessageLoopTypedTest, RunLoopQuitTop) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-
-  RunLoop outer_run_loop;
-  RunLoop nested_run_loop;
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      BindOnce(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop)));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          outer_run_loop.QuitClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 2));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          nested_run_loop.QuitClosure());
-
-  outer_run_loop.Run();
-
-  ASSERT_EQ(4U, order.Size());
-  int task_index = 0;
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
-  EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
-}
-
-// Tests RunLoopQuit only quits the corresponding MessageLoop::Run.
-TEST_P(MessageLoopTypedTest, RunLoopQuitNested) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-
-  RunLoop outer_run_loop;
-  RunLoop nested_run_loop;
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      BindOnce(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop)));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          nested_run_loop.QuitClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 2));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          outer_run_loop.QuitClosure());
-
-  outer_run_loop.Run();
-
-  ASSERT_EQ(4U, order.Size());
-  int task_index = 0;
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false));
-  EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
-}
-
-// Quits current loop and immediately runs a nested loop.
-void QuitAndRunNestedLoop(TaskList* order,
-                          int cookie,
-                          RunLoop* outer_run_loop,
-                          RunLoop* nested_run_loop) {
-  order->RecordStart(RUNS, cookie);
-  outer_run_loop->Quit();
-  nested_run_loop->Run();
-  order->RecordEnd(RUNS, cookie);
-}
-
-// Test that we can run nested loop after quitting the current one.
-TEST_P(MessageLoopTypedTest, RunLoopNestedAfterQuit) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-
-  RunLoop outer_run_loop;
-  RunLoop nested_run_loop;
-
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          nested_run_loop.QuitClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&QuitAndRunNestedLoop, &order, 1, &outer_run_loop,
-                          &nested_run_loop));
-
-  outer_run_loop.Run();
-
-  ASSERT_EQ(2U, order.Size());
-  int task_index = 0;
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
-  EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
-}
-
-// Tests RunLoopQuit only quits the corresponding MessageLoop::Run.
-TEST_P(MessageLoopTypedTest, RunLoopQuitBogus) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-
-  RunLoop outer_run_loop;
-  RunLoop nested_run_loop;
-  RunLoop bogus_run_loop;
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      BindOnce(&FuncThatRuns, &order, 1, Unretained(&nested_run_loop)));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          bogus_run_loop.QuitClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 2));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          outer_run_loop.QuitClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          nested_run_loop.QuitClosure());
-
-  outer_run_loop.Run();
-
-  ASSERT_EQ(4U, order.Size());
-  int task_index = 0;
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
-  EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
-}
-
-// Tests RunLoopQuit only quits the corresponding MessageLoop::Run.
-TEST_P(MessageLoopTypedTest, RunLoopQuitDeep) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-
-  RunLoop outer_run_loop;
-  RunLoop nested_loop1;
-  RunLoop nested_loop2;
-  RunLoop nested_loop3;
-  RunLoop nested_loop4;
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&FuncThatRuns, &order, 1, Unretained(&nested_loop1)));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&FuncThatRuns, &order, 2, Unretained(&nested_loop2)));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&FuncThatRuns, &order, 3, Unretained(&nested_loop3)));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&FuncThatRuns, &order, 4, Unretained(&nested_loop4)));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 5));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          outer_run_loop.QuitClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 6));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          nested_loop1.QuitClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 7));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          nested_loop2.QuitClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 8));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          nested_loop3.QuitClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 9));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          nested_loop4.QuitClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 10));
-
-  outer_run_loop.Run();
-
-  ASSERT_EQ(18U, order.Size());
-  int task_index = 0;
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 2, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 3, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 4, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 5, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 5, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 6, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 6, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 7, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 7, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 8, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 8, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 9, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 9, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 4, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 3, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 2, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
-  EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
-}
-
-// Tests RunLoopQuit works before RunWithID.
-TEST_P(MessageLoopTypedTest, RunLoopQuitOrderBefore) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-
-  RunLoop run_loop;
-
-  run_loop.Quit();
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&OrderedFunc, &order, 1));  // never runs
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&FuncThatQuitsNow));  // never runs
-
-  run_loop.Run();
-
-  ASSERT_EQ(0U, order.Size());
-}
-
-// Tests RunLoopQuit works during RunWithID.
-TEST_P(MessageLoopTypedTest, RunLoopQuitOrderDuring) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-
-  RunLoop run_loop;
-
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 1));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, run_loop.QuitClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&OrderedFunc, &order, 2));  // never runs
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&FuncThatQuitsNow));  // never runs
-
-  run_loop.Run();
-
-  ASSERT_EQ(2U, order.Size());
-  int task_index = 0;
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 1, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 1, false));
-  EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
-}
-
-// Tests RunLoopQuit works after RunWithID.
-TEST_P(MessageLoopTypedTest, RunLoopQuitOrderAfter) {
-  MessageLoop loop(GetMessageLoopType());
-
-  TaskList order;
-
-  RunLoop run_loop;
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&FuncThatRuns, &order, 1, Unretained(&run_loop)));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 2));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&FuncThatQuitsNow));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 3));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, run_loop.QuitClosure());  // has no affect
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&OrderedFunc, &order, 4));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&FuncThatQuitsNow));
-
-  RunLoop outer_run_loop;
-  outer_run_loop.Run();
-
-  ASSERT_EQ(8U, order.Size());
-  int task_index = 0;
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 2, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(RUNS, 1, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 3, false));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 4, true));
-  EXPECT_EQ(order.Get(task_index++), TaskItem(ORDERED, 4, false));
-  EXPECT_EQ(static_cast<size_t>(task_index), order.Size());
-}
-
-// There was a bug in the MessagePumpGLib where posting tasks recursively
-// caused the message loop to hang, due to the buffer of the internal pipe
-// becoming full. Test all MessageLoop types to ensure this issue does not
-// exist in other MessagePumps.
-//
-// On Linux, the pipe buffer size is 64KiB by default. The bug caused one
-// byte accumulated in the pipe per two posts, so we should repeat 128K
-// times to reproduce the bug.
-TEST_P(MessageLoopTypedTest, RecursivePosts) {
-  const int kNumTimes = 1 << 17;
-  MessageLoop loop(GetMessageLoopType());
-  loop.task_runner()->PostTask(FROM_HERE,
-                               BindOnce(&PostNTasksThenQuit, kNumTimes));
-  RunLoop().Run();
-}
-
-TEST_P(MessageLoopTypedTest, NestableTasksAllowedAtTopLevel) {
-  MessageLoop loop(GetMessageLoopType());
-  EXPECT_TRUE(MessageLoopCurrent::Get()->NestableTasksAllowed());
-}
-
-// Nestable tasks shouldn't be allowed to run reentrantly by default (regression
-// test for https://crbug.com/754112).
-TEST_P(MessageLoopTypedTest, NestableTasksDisallowedByDefault) {
-  MessageLoop loop(GetMessageLoopType());
-  RunLoop run_loop;
-  loop.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](RunLoop* run_loop) {
-            EXPECT_FALSE(MessageLoopCurrent::Get()->NestableTasksAllowed());
-            run_loop->Quit();
-          },
-          Unretained(&run_loop)));
-  run_loop.Run();
-}
-
-TEST_P(MessageLoopTypedTest, NestableTasksProcessedWhenRunLoopAllows) {
-  MessageLoop loop(GetMessageLoopType());
-  RunLoop run_loop;
-  loop.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](RunLoop* run_loop) {
-            // This test would hang if this RunLoop wasn't of type
-            // kNestableTasksAllowed (i.e. this is testing that this is
-            // processed and doesn't hang).
-            RunLoop nested_run_loop(RunLoop::Type::kNestableTasksAllowed);
-            ThreadTaskRunnerHandle::Get()->PostTask(
-                FROM_HERE,
-                BindOnce(
-                    [](RunLoop* nested_run_loop) {
-                      // Each additional layer of application task nesting
-                      // requires its own allowance. The kNestableTasksAllowed
-                      // RunLoop allowed this task to be processed but further
-                      // nestable tasks are by default disallowed from this
-                      // layer.
-                      EXPECT_FALSE(
-                          MessageLoopCurrent::Get()->NestableTasksAllowed());
-                      nested_run_loop->Quit();
-                    },
-                    Unretained(&nested_run_loop)));
-            nested_run_loop.Run();
-
-            run_loop->Quit();
-          },
-          Unretained(&run_loop)));
-  run_loop.Run();
-}
-
-TEST_P(MessageLoopTypedTest, NestableTasksAllowedExplicitlyInScope) {
-  MessageLoop loop(GetMessageLoopType());
-  RunLoop run_loop;
-  loop.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](RunLoop* run_loop) {
-            {
-              MessageLoopCurrent::ScopedNestableTaskAllower
-                  allow_nestable_tasks;
-              EXPECT_TRUE(MessageLoopCurrent::Get()->NestableTasksAllowed());
-            }
-            EXPECT_FALSE(MessageLoopCurrent::Get()->NestableTasksAllowed());
-            run_loop->Quit();
-          },
-          Unretained(&run_loop)));
-  run_loop.Run();
-}
-
-TEST_P(MessageLoopTypedTest, NestableTasksAllowedManually) {
-  MessageLoop loop(GetMessageLoopType());
-  RunLoop run_loop;
-  loop.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](RunLoop* run_loop) {
-            EXPECT_FALSE(MessageLoopCurrent::Get()->NestableTasksAllowed());
-            MessageLoopCurrent::Get()->SetNestableTasksAllowed(true);
-            EXPECT_TRUE(MessageLoopCurrent::Get()->NestableTasksAllowed());
-            MessageLoopCurrent::Get()->SetNestableTasksAllowed(false);
-            EXPECT_FALSE(MessageLoopCurrent::Get()->NestableTasksAllowed());
-            run_loop->Quit();
-          },
-          Unretained(&run_loop)));
-  run_loop.Run();
-}
-
-INSTANTIATE_TEST_CASE_P(
-    ,
-    MessageLoopTypedTest,
-    ::testing::Values(MessageLoopTypedTestParams(
-                          MessageLoop::TYPE_DEFAULT,
-                          TaskSchedulerAvailability::NO_TASK_SCHEDULER),
-                      MessageLoopTypedTestParams(
-                          MessageLoop::TYPE_IO,
-                          TaskSchedulerAvailability::NO_TASK_SCHEDULER),
-                      MessageLoopTypedTestParams(
-                          MessageLoop::TYPE_UI,
-                          TaskSchedulerAvailability::NO_TASK_SCHEDULER),
-                      MessageLoopTypedTestParams(
-                          MessageLoop::TYPE_DEFAULT,
-                          TaskSchedulerAvailability::WITH_TASK_SCHEDULER),
-                      MessageLoopTypedTestParams(
-                          MessageLoop::TYPE_IO,
-                          TaskSchedulerAvailability::WITH_TASK_SCHEDULER),
-                      MessageLoopTypedTestParams(
-                          MessageLoop::TYPE_UI,
-                          TaskSchedulerAvailability::WITH_TASK_SCHEDULER)),
-    MessageLoopTypedTest::ParamInfoToString);
-
-#if defined(OS_WIN)
-// Verifies that the MessageLoop ignores WM_QUIT, rather than quitting.
-// Users of MessageLoop typically expect to control when their RunLoops stop
-// Run()ning explicitly, via QuitClosure() etc (see https://crbug.com/720078)
-TEST_P(MessageLoopTest, WmQuitIsIgnored) {
-  MessageLoop loop(MessageLoop::TYPE_UI);
-  RunLoop run_loop;
-  // Post a WM_QUIT message to the current thread.
-  ::PostQuitMessage(0);
-
-  // Post a task to the current thread, with a small delay to make it less
-  // likely that we process the posted task before looking for WM_* messages.
-  bool task_was_run = false;
-  loop.task_runner()->PostDelayedTask(
-      FROM_HERE,
-      BindOnce(
-          [](bool* flag, OnceClosure closure) {
-            *flag = true;
-            std::move(closure).Run();
-          },
-          &task_was_run, run_loop.QuitClosure()),
-      TestTimeouts::tiny_timeout());
-
-  // Run the loop, and ensure that the posted task is processed before we quit.
-  run_loop.Run();
-  EXPECT_TRUE(task_was_run);
-}
-
-TEST_P(MessageLoopTest, PostDelayedTask_SharedTimer_SubPump) {
-  RunTest_PostDelayedTask_SharedTimer_SubPump();
-}
-
-// This test occasionally hangs. See http://crbug.com/44567.
-TEST_P(MessageLoopTest, DISABLED_RecursiveDenial2) {
-  RunTest_RecursiveDenial2(MessageLoop::TYPE_DEFAULT);
-  RunTest_RecursiveDenial2(MessageLoop::TYPE_UI);
-  RunTest_RecursiveDenial2(MessageLoop::TYPE_IO);
-}
-
-TEST_P(MessageLoopTest, RecursiveSupport2) {
-  // This test requires a UI loop.
-  RunTest_RecursiveSupport2(MessageLoop::TYPE_UI);
-}
-#endif  // defined(OS_WIN)
-
-TEST_P(MessageLoopTest, TaskObserver) {
-  const int kNumPosts = 6;
-  DummyTaskObserver observer(kNumPosts);
-
-  MessageLoop loop;
-  loop.AddTaskObserver(&observer);
-  loop.task_runner()->PostTask(FROM_HERE,
-                               BindOnce(&PostNTasksThenQuit, kNumPosts));
-  RunLoop().Run();
-  loop.RemoveTaskObserver(&observer);
-
-  EXPECT_EQ(kNumPosts, observer.num_tasks_started());
-  EXPECT_EQ(kNumPosts, observer.num_tasks_processed());
-}
-
-#if defined(OS_WIN)
-TEST_P(MessageLoopTest, IOHandler) {
-  RunTest_IOHandler();
-}
-
-TEST_P(MessageLoopTest, WaitForIO) {
-  RunTest_WaitForIO();
-}
-
-TEST_P(MessageLoopTest, HighResolutionTimer) {
-  MessageLoop message_loop;
-  Time::EnableHighResolutionTimer(true);
-
-  constexpr TimeDelta kFastTimer = TimeDelta::FromMilliseconds(5);
-  constexpr TimeDelta kSlowTimer = TimeDelta::FromMilliseconds(100);
-
-  {
-    // Post a fast task to enable the high resolution timers.
-    RunLoop run_loop;
-    message_loop.task_runner()->PostDelayedTask(
-        FROM_HERE,
-        BindOnce(
-            [](RunLoop* run_loop) {
-              EXPECT_TRUE(Time::IsHighResolutionTimerInUse());
-              run_loop->QuitWhenIdle();
-            },
-            &run_loop),
-        kFastTimer);
-    run_loop.Run();
-  }
-  EXPECT_FALSE(Time::IsHighResolutionTimerInUse());
-  {
-    // Check that a slow task does not trigger the high resolution logic.
-    RunLoop run_loop;
-    message_loop.task_runner()->PostDelayedTask(
-        FROM_HERE,
-        BindOnce(
-            [](RunLoop* run_loop) {
-              EXPECT_FALSE(Time::IsHighResolutionTimerInUse());
-              run_loop->QuitWhenIdle();
-            },
-            &run_loop),
-        kSlowTimer);
-    run_loop.Run();
-  }
-  Time::EnableHighResolutionTimer(false);
-  Time::ResetHighResolutionTimerUsage();
-}
-
-#endif  // defined(OS_WIN)
-
-namespace {
-// Inject a test point for recording the destructor calls for Closure objects
-// send to MessageLoop::PostTask(). It is awkward usage since we are trying to
-// hook the actual destruction, which is not a common operation.
-class DestructionObserverProbe :
-  public RefCounted<DestructionObserverProbe> {
- public:
-  DestructionObserverProbe(bool* task_destroyed,
-                           bool* destruction_observer_called)
-      : task_destroyed_(task_destroyed),
-        destruction_observer_called_(destruction_observer_called) {
-  }
-  virtual void Run() {
-    // This task should never run.
-    ADD_FAILURE();
-  }
- private:
-  friend class RefCounted<DestructionObserverProbe>;
-
-  virtual ~DestructionObserverProbe() {
-    EXPECT_FALSE(*destruction_observer_called_);
-    *task_destroyed_ = true;
-  }
-
-  bool* task_destroyed_;
-  bool* destruction_observer_called_;
-};
-
-class MLDestructionObserver : public MessageLoopCurrent::DestructionObserver {
- public:
-  MLDestructionObserver(bool* task_destroyed, bool* destruction_observer_called)
-      : task_destroyed_(task_destroyed),
-        destruction_observer_called_(destruction_observer_called),
-        task_destroyed_before_message_loop_(false) {
-  }
-  void WillDestroyCurrentMessageLoop() override {
-    task_destroyed_before_message_loop_ = *task_destroyed_;
-    *destruction_observer_called_ = true;
-  }
-  bool task_destroyed_before_message_loop() const {
-    return task_destroyed_before_message_loop_;
-  }
- private:
-  bool* task_destroyed_;
-  bool* destruction_observer_called_;
-  bool task_destroyed_before_message_loop_;
-};
-
-}  // namespace
-
-TEST_P(MessageLoopTest, DestructionObserverTest) {
-  // Verify that the destruction observer gets called at the very end (after
-  // all the pending tasks have been destroyed).
-  MessageLoop* loop = new MessageLoop;
-  const TimeDelta kDelay = TimeDelta::FromMilliseconds(100);
-
-  bool task_destroyed = false;
-  bool destruction_observer_called = false;
-
-  MLDestructionObserver observer(&task_destroyed, &destruction_observer_called);
-  loop->AddDestructionObserver(&observer);
-  loop->task_runner()->PostDelayedTask(
-      FROM_HERE,
-      BindOnce(&DestructionObserverProbe::Run,
-               new DestructionObserverProbe(&task_destroyed,
-                                            &destruction_observer_called)),
-      kDelay);
-  delete loop;
-  EXPECT_TRUE(observer.task_destroyed_before_message_loop());
-  // The task should have been destroyed when we deleted the loop.
-  EXPECT_TRUE(task_destroyed);
-  EXPECT_TRUE(destruction_observer_called);
-}
-
-
-// Verify that MessageLoop sets ThreadMainTaskRunner::current() and it
-// posts tasks on that message loop.
-TEST_P(MessageLoopTest, ThreadMainTaskRunner) {
-  MessageLoop loop;
-
-  scoped_refptr<Foo> foo(new Foo());
-  std::string a("a");
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&Foo::Test1ConstRef, foo, a));
-
-  // Post quit task;
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&RunLoop::QuitCurrentWhenIdleDeprecated));
-
-  // Now kick things off
-  RunLoop().Run();
-
-  EXPECT_EQ(foo->test_count(), 1);
-  EXPECT_EQ(foo->result(), "a");
-}
-
-TEST_P(MessageLoopTest, IsType) {
-  MessageLoop loop(MessageLoop::TYPE_UI);
-  EXPECT_TRUE(loop.IsType(MessageLoop::TYPE_UI));
-  EXPECT_FALSE(loop.IsType(MessageLoop::TYPE_IO));
-  EXPECT_FALSE(loop.IsType(MessageLoop::TYPE_DEFAULT));
-}
-
-#if defined(OS_WIN)
-void EmptyFunction() {}
-
-void PostMultipleTasks() {
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          base::BindOnce(&EmptyFunction));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          base::BindOnce(&EmptyFunction));
-}
-
-static const int kSignalMsg = WM_USER + 2;
-
-void PostWindowsMessage(HWND message_hwnd) {
-  PostMessage(message_hwnd, kSignalMsg, 0, 2);
-}
-
-void EndTest(bool* did_run, HWND hwnd) {
-  *did_run = true;
-  PostMessage(hwnd, WM_CLOSE, 0, 0);
-}
-
-int kMyMessageFilterCode = 0x5002;
-
-LRESULT CALLBACK TestWndProcThunk(HWND hwnd, UINT message,
-                                  WPARAM wparam, LPARAM lparam) {
-  if (message == WM_CLOSE)
-    EXPECT_TRUE(DestroyWindow(hwnd));
-  if (message != kSignalMsg)
-    return DefWindowProc(hwnd, message, wparam, lparam);
-
-  switch (lparam) {
-  case 1:
-    // First, we post a task that will post multiple no-op tasks to make sure
-    // that the pump's incoming task queue does not become empty during the
-    // test.
-    ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                            base::BindOnce(&PostMultipleTasks));
-    // Next, we post a task that posts a windows message to trigger the second
-    // stage of the test.
-    ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(&PostWindowsMessage, hwnd));
-    break;
-  case 2:
-    // Since we're about to enter a modal loop, tell the message loop that we
-    // intend to nest tasks.
-    MessageLoopCurrent::Get()->SetNestableTasksAllowed(true);
-    bool did_run = false;
-    ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(&EndTest, &did_run, hwnd));
-    // Run a nested windows-style message loop and verify that our task runs. If
-    // it doesn't, then we'll loop here until the test times out.
-    MSG msg;
-    while (GetMessage(&msg, 0, 0, 0)) {
-      if (!CallMsgFilter(&msg, kMyMessageFilterCode))
-        DispatchMessage(&msg);
-      // If this message is a WM_CLOSE, explicitly exit the modal loop. Posting
-      // a WM_QUIT should handle this, but unfortunately MessagePumpWin eats
-      // WM_QUIT messages even when running inside a modal loop.
-      if (msg.message == WM_CLOSE)
-        break;
-    }
-    EXPECT_TRUE(did_run);
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-    break;
-  }
-  return 0;
-}
-
-TEST_P(MessageLoopTest, AlwaysHaveUserMessageWhenNesting) {
-  MessageLoop loop(MessageLoop::TYPE_UI);
-  HINSTANCE instance = CURRENT_MODULE();
-  WNDCLASSEX wc = {0};
-  wc.cbSize = sizeof(wc);
-  wc.lpfnWndProc = TestWndProcThunk;
-  wc.hInstance = instance;
-  wc.lpszClassName = L"MessageLoopTest_HWND";
-  ATOM atom = RegisterClassEx(&wc);
-  ASSERT_TRUE(atom);
-
-  HWND message_hwnd = CreateWindow(MAKEINTATOM(atom), 0, 0, 0, 0, 0, 0,
-                                   HWND_MESSAGE, 0, instance, 0);
-  ASSERT_TRUE(message_hwnd) << GetLastError();
-
-  ASSERT_TRUE(PostMessage(message_hwnd, kSignalMsg, 0, 1));
-
-  RunLoop().Run();
-
-  ASSERT_TRUE(UnregisterClass(MAKEINTATOM(atom), instance));
-}
-#endif  // defined(OS_WIN)
-
-TEST_P(MessageLoopTest, SetTaskRunner) {
-  MessageLoop loop;
-  scoped_refptr<SingleThreadTaskRunner> new_runner(new TestSimpleTaskRunner());
-
-  loop.SetTaskRunner(new_runner);
-  EXPECT_EQ(new_runner, loop.task_runner());
-  EXPECT_EQ(new_runner, ThreadTaskRunnerHandle::Get());
-}
-
-TEST_P(MessageLoopTest, OriginalRunnerWorks) {
-  MessageLoop loop;
-  scoped_refptr<SingleThreadTaskRunner> new_runner(new TestSimpleTaskRunner());
-  scoped_refptr<SingleThreadTaskRunner> original_runner(loop.task_runner());
-  loop.SetTaskRunner(new_runner);
-
-  scoped_refptr<Foo> foo(new Foo());
-  original_runner->PostTask(FROM_HERE, BindOnce(&Foo::Test1ConstRef, foo, "a"));
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ(1, foo->test_count());
-}
-
-TEST_P(MessageLoopTest, DeleteUnboundLoop) {
-  // It should be possible to delete an unbound message loop on a thread which
-  // already has another active loop. This happens when thread creation fails.
-  MessageLoop loop;
-  std::unique_ptr<MessageLoop> unbound_loop(MessageLoop::CreateUnbound(
-      MessageLoop::TYPE_DEFAULT, MessageLoop::MessagePumpFactoryCallback()));
-  unbound_loop.reset();
-  EXPECT_EQ(&loop, MessageLoop::current());
-  EXPECT_EQ(loop.task_runner(), ThreadTaskRunnerHandle::Get());
-}
-
-TEST_P(MessageLoopTest, ThreadName) {
-  {
-    std::string kThreadName("foo");
-    MessageLoop loop;
-    PlatformThread::SetName(kThreadName);
-    EXPECT_EQ(kThreadName, loop.GetThreadName());
-  }
-
-  {
-    std::string kThreadName("bar");
-    base::Thread thread(kThreadName);
-    ASSERT_TRUE(thread.StartAndWaitForTesting());
-    EXPECT_EQ(kThreadName, thread.message_loop()->GetThreadName());
-  }
-}
-
-// Verify that tasks posted to and code running in the scope of the same
-// MessageLoop access the same SequenceLocalStorage values.
-TEST_P(MessageLoopTest, SequenceLocalStorageSetGet) {
-  MessageLoop loop;
-
-  SequenceLocalStorageSlot<int> slot;
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      BindOnce(&SequenceLocalStorageSlot<int>::Set, Unretained(&slot), 11));
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(
-                     [](SequenceLocalStorageSlot<int>* slot) {
-                       EXPECT_EQ(slot->Get(), 11);
-                     },
-                     &slot));
-
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ(slot.Get(), 11);
-}
-
-// Verify that tasks posted to and code running in different MessageLoops access
-// different SequenceLocalStorage values.
-TEST_P(MessageLoopTest, SequenceLocalStorageDifferentMessageLoops) {
-  SequenceLocalStorageSlot<int> slot;
-
-  {
-    MessageLoop loop;
-    ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE,
-        BindOnce(&SequenceLocalStorageSlot<int>::Set, Unretained(&slot), 11));
-
-    RunLoop().RunUntilIdle();
-    EXPECT_EQ(slot.Get(), 11);
-  }
-
-  MessageLoop loop;
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(
-                     [](SequenceLocalStorageSlot<int>* slot) {
-                       EXPECT_NE(slot->Get(), 11);
-                     },
-                     &slot));
-
-  RunLoop().RunUntilIdle();
-  EXPECT_NE(slot.Get(), 11);
-}
-
-INSTANTIATE_TEST_CASE_P(
-    ,
-    MessageLoopTest,
-    ::testing::Values(TaskSchedulerAvailability::NO_TASK_SCHEDULER,
-                      TaskSchedulerAvailability::WITH_TASK_SCHEDULER),
-    MessageLoopTest::ParamInfoToString);
-
-}  // namespace base
diff --git a/base/message_loop/message_pump_glib_unittest.cc b/base/message_loop/message_pump_glib_unittest.cc
deleted file mode 100644
index 70be2a4..0000000
--- a/base/message_loop/message_pump_glib_unittest.cc
+++ /dev/null
@@ -1,523 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_pump_glib.h"
-
-#include <glib.h>
-#include <math.h>
-
-#include <algorithm>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/message_loop/message_loop_current.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-// This class injects dummy "events" into the GLib loop. When "handled" these
-// events can run tasks. This is intended to mock gtk events (the corresponding
-// GLib source runs at the same priority).
-class EventInjector {
- public:
-  EventInjector() : processed_events_(0) {
-    source_ = static_cast<Source*>(g_source_new(&SourceFuncs, sizeof(Source)));
-    source_->injector = this;
-    g_source_attach(source_, nullptr);
-    g_source_set_can_recurse(source_, TRUE);
-  }
-
-  ~EventInjector() {
-    g_source_destroy(source_);
-    g_source_unref(source_);
-  }
-
-  int HandlePrepare() {
-    // If the queue is empty, block.
-    if (events_.empty())
-      return -1;
-    TimeDelta delta = events_[0].time - Time::NowFromSystemTime();
-    return std::max(0, static_cast<int>(ceil(delta.InMillisecondsF())));
-  }
-
-  bool HandleCheck() {
-    if (events_.empty())
-      return false;
-    return events_[0].time <= Time::NowFromSystemTime();
-  }
-
-  void HandleDispatch() {
-    if (events_.empty())
-      return;
-    Event event = std::move(events_[0]);
-    events_.erase(events_.begin());
-    ++processed_events_;
-    if (!event.callback.is_null())
-      std::move(event.callback).Run();
-    else if (!event.task.is_null())
-      std::move(event.task).Run();
-  }
-
-  // Adds an event to the queue. When "handled", executes |callback|.
-  // delay_ms is relative to the last event if any, or to Now() otherwise.
-  void AddEvent(int delay_ms, OnceClosure callback) {
-    AddEventHelper(delay_ms, std::move(callback), OnceClosure());
-  }
-
-  void AddDummyEvent(int delay_ms) {
-    AddEventHelper(delay_ms, OnceClosure(), OnceClosure());
-  }
-
-  void AddEventAsTask(int delay_ms, OnceClosure task) {
-    AddEventHelper(delay_ms, OnceClosure(), std::move(task));
-  }
-
-  void Reset() {
-    processed_events_ = 0;
-    events_.clear();
-  }
-
-  int processed_events() const { return processed_events_; }
-
- private:
-  struct Event {
-    Time time;
-    OnceClosure callback;
-    OnceClosure task;
-  };
-
-  struct Source : public GSource {
-    EventInjector* injector;
-  };
-
-  void AddEventHelper(int delay_ms, OnceClosure callback, OnceClosure task) {
-    Time last_time;
-    if (!events_.empty())
-      last_time = (events_.end()-1)->time;
-    else
-      last_time = Time::NowFromSystemTime();
-
-    Time future = last_time + TimeDelta::FromMilliseconds(delay_ms);
-    EventInjector::Event event = {future, std::move(callback), std::move(task)};
-    events_.push_back(std::move(event));
-  }
-
-  static gboolean Prepare(GSource* source, gint* timeout_ms) {
-    *timeout_ms = static_cast<Source*>(source)->injector->HandlePrepare();
-    return FALSE;
-  }
-
-  static gboolean Check(GSource* source) {
-    return static_cast<Source*>(source)->injector->HandleCheck();
-  }
-
-  static gboolean Dispatch(GSource* source,
-                           GSourceFunc unused_func,
-                           gpointer unused_data) {
-    static_cast<Source*>(source)->injector->HandleDispatch();
-    return TRUE;
-  }
-
-  Source* source_;
-  std::vector<Event> events_;
-  int processed_events_;
-  static GSourceFuncs SourceFuncs;
-  DISALLOW_COPY_AND_ASSIGN(EventInjector);
-};
-
-GSourceFuncs EventInjector::SourceFuncs = {EventInjector::Prepare,
-                                           EventInjector::Check,
-                                           EventInjector::Dispatch, nullptr};
-
-void IncrementInt(int *value) {
-  ++*value;
-}
-
-// Checks how many events have been processed by the injector.
-void ExpectProcessedEvents(EventInjector* injector, int count) {
-  EXPECT_EQ(injector->processed_events(), count);
-}
-
-// Posts a task on the current message loop.
-void PostMessageLoopTask(const Location& from_here, OnceClosure task) {
-  ThreadTaskRunnerHandle::Get()->PostTask(from_here, std::move(task));
-}
-
-// Test fixture.
-class MessagePumpGLibTest : public testing::Test {
- public:
-  MessagePumpGLibTest() : loop_(nullptr), injector_(nullptr) {}
-
-  // Overridden from testing::Test:
-  void SetUp() override {
-    loop_ = new MessageLoop(MessageLoop::TYPE_UI);
-    injector_ = new EventInjector();
-  }
-  void TearDown() override {
-    delete injector_;
-    injector_ = nullptr;
-    delete loop_;
-    loop_ = nullptr;
-  }
-
-  MessageLoop* loop() const { return loop_; }
-  EventInjector* injector() const { return injector_; }
-
- private:
-  MessageLoop* loop_;
-  EventInjector* injector_;
-  DISALLOW_COPY_AND_ASSIGN(MessagePumpGLibTest);
-};
-
-}  // namespace
-
-TEST_F(MessagePumpGLibTest, TestQuit) {
-  // Checks that Quit works and that the basic infrastructure is working.
-
-  // Quit from a task
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ(0, injector()->processed_events());
-
-  injector()->Reset();
-  // Quit from an event
-  injector()->AddEvent(0, RunLoop::QuitCurrentWhenIdleClosureDeprecated());
-  RunLoop().Run();
-  EXPECT_EQ(1, injector()->processed_events());
-}
-
-TEST_F(MessagePumpGLibTest, TestEventTaskInterleave) {
-  // Checks that tasks posted by events are executed before the next event if
-  // the posted task queue is empty.
-  // MessageLoop doesn't make strong guarantees that it is the case, but the
-  // current implementation ensures it and the tests below rely on it.
-  // If changes cause this test to fail, it is reasonable to change it, but
-  // TestWorkWhileWaitingForEvents and TestEventsWhileWaitingForWork have to be
-  // changed accordingly, otherwise they can become flaky.
-  injector()->AddEventAsTask(0, DoNothing());
-  OnceClosure check_task =
-      BindOnce(&ExpectProcessedEvents, Unretained(injector()), 2);
-  OnceClosure posted_task =
-      BindOnce(&PostMessageLoopTask, FROM_HERE, std::move(check_task));
-  injector()->AddEventAsTask(0, std::move(posted_task));
-  injector()->AddEventAsTask(0, DoNothing());
-  injector()->AddEvent(0, RunLoop::QuitCurrentWhenIdleClosureDeprecated());
-  RunLoop().Run();
-  EXPECT_EQ(4, injector()->processed_events());
-
-  injector()->Reset();
-  injector()->AddEventAsTask(0, DoNothing());
-  check_task = BindOnce(&ExpectProcessedEvents, Unretained(injector()), 2);
-  posted_task =
-      BindOnce(&PostMessageLoopTask, FROM_HERE, std::move(check_task));
-  injector()->AddEventAsTask(0, std::move(posted_task));
-  injector()->AddEventAsTask(10, DoNothing());
-  injector()->AddEvent(0, RunLoop::QuitCurrentWhenIdleClosureDeprecated());
-  RunLoop().Run();
-  EXPECT_EQ(4, injector()->processed_events());
-}
-
-TEST_F(MessagePumpGLibTest, TestWorkWhileWaitingForEvents) {
-  int task_count = 0;
-  // Tests that we process tasks while waiting for new events.
-  // The event queue is empty at first.
-  for (int i = 0; i < 10; ++i) {
-    loop()->task_runner()->PostTask(FROM_HERE,
-                                    BindOnce(&IncrementInt, &task_count));
-  }
-  // After all the previous tasks have executed, enqueue an event that will
-  // quit.
-  loop()->task_runner()->PostTask(
-      FROM_HERE, BindOnce(&EventInjector::AddEvent, Unretained(injector()), 0,
-                          RunLoop::QuitCurrentWhenIdleClosureDeprecated()));
-  RunLoop().Run();
-  ASSERT_EQ(10, task_count);
-  EXPECT_EQ(1, injector()->processed_events());
-
-  // Tests that we process delayed tasks while waiting for new events.
-  injector()->Reset();
-  task_count = 0;
-  for (int i = 0; i < 10; ++i) {
-    loop()->task_runner()->PostDelayedTask(FROM_HERE,
-                                           BindOnce(&IncrementInt, &task_count),
-                                           TimeDelta::FromMilliseconds(10 * i));
-  }
-  // After all the previous tasks have executed, enqueue an event that will
-  // quit.
-  // This relies on the fact that delayed tasks are executed in delay order.
-  // That is verified in message_loop_unittest.cc.
-  loop()->task_runner()->PostDelayedTask(
-      FROM_HERE,
-      BindOnce(&EventInjector::AddEvent, Unretained(injector()), 10,
-               RunLoop::QuitCurrentWhenIdleClosureDeprecated()),
-      TimeDelta::FromMilliseconds(150));
-  RunLoop().Run();
-  ASSERT_EQ(10, task_count);
-  EXPECT_EQ(1, injector()->processed_events());
-}
-
-TEST_F(MessagePumpGLibTest, TestEventsWhileWaitingForWork) {
-  // Tests that we process events while waiting for work.
-  // The event queue is empty at first.
-  for (int i = 0; i < 10; ++i) {
-    injector()->AddDummyEvent(0);
-  }
-  // After all the events have been processed, post a task that will check that
-  // the events have been processed (note: the task executes after the event
-  // that posted it has been handled, so we expect 11 at that point).
-  OnceClosure check_task =
-      BindOnce(&ExpectProcessedEvents, Unretained(injector()), 11);
-  OnceClosure posted_task =
-      BindOnce(&PostMessageLoopTask, FROM_HERE, std::move(check_task));
-  injector()->AddEventAsTask(10, std::move(posted_task));
-
-  // And then quit (relies on the condition tested by TestEventTaskInterleave).
-  injector()->AddEvent(10, RunLoop::QuitCurrentWhenIdleClosureDeprecated());
-  RunLoop().Run();
-
-  EXPECT_EQ(12, injector()->processed_events());
-}
-
-namespace {
-
-// This class is a helper for the concurrent events / posted tasks test below.
-// It will quit the main loop once enough tasks and events have been processed,
-// while making sure there is always work to do and events in the queue.
-class ConcurrentHelper : public RefCounted<ConcurrentHelper>  {
- public:
-  explicit ConcurrentHelper(EventInjector* injector)
-      : injector_(injector),
-        event_count_(kStartingEventCount),
-        task_count_(kStartingTaskCount) {
-  }
-
-  void FromTask() {
-    if (task_count_ > 0) {
-      --task_count_;
-    }
-    if (task_count_ == 0 && event_count_ == 0) {
-      RunLoop::QuitCurrentWhenIdleDeprecated();
-    } else {
-      ThreadTaskRunnerHandle::Get()->PostTask(
-          FROM_HERE, BindOnce(&ConcurrentHelper::FromTask, this));
-    }
-  }
-
-  void FromEvent() {
-    if (event_count_ > 0) {
-      --event_count_;
-    }
-    if (task_count_ == 0 && event_count_ == 0) {
-      RunLoop::QuitCurrentWhenIdleDeprecated();
-    } else {
-      injector_->AddEventAsTask(0,
-                                BindOnce(&ConcurrentHelper::FromEvent, this));
-    }
-  }
-
-  int event_count() const { return event_count_; }
-  int task_count() const { return task_count_; }
-
- private:
-  friend class RefCounted<ConcurrentHelper>;
-
-  ~ConcurrentHelper() {}
-
-  static const int kStartingEventCount = 20;
-  static const int kStartingTaskCount = 20;
-
-  EventInjector* injector_;
-  int event_count_;
-  int task_count_;
-};
-
-}  // namespace
-
-TEST_F(MessagePumpGLibTest, TestConcurrentEventPostedTask) {
-  // Tests that posted tasks don't starve events, nor the opposite.
-  // We use the helper class above. We keep both event and posted task queues
-  // full, the helper verifies that both tasks and events get processed.
-  // If that is not the case, either event_count_ or task_count_ will not get
-  // to 0, and MessageLoop::QuitWhenIdle() will never be called.
-  scoped_refptr<ConcurrentHelper> helper = new ConcurrentHelper(injector());
-
-  // Add 2 events to the queue to make sure it is always full (when we remove
-  // the event before processing it).
-  injector()->AddEventAsTask(0, BindOnce(&ConcurrentHelper::FromEvent, helper));
-  injector()->AddEventAsTask(0, BindOnce(&ConcurrentHelper::FromEvent, helper));
-
-  // Similarly post 2 tasks.
-  loop()->task_runner()->PostTask(
-      FROM_HERE, BindOnce(&ConcurrentHelper::FromTask, helper));
-  loop()->task_runner()->PostTask(
-      FROM_HERE, BindOnce(&ConcurrentHelper::FromTask, helper));
-
-  RunLoop().Run();
-  EXPECT_EQ(0, helper->event_count());
-  EXPECT_EQ(0, helper->task_count());
-}
-
-namespace {
-
-void AddEventsAndDrainGLib(EventInjector* injector) {
-  // Add a couple of dummy events
-  injector->AddDummyEvent(0);
-  injector->AddDummyEvent(0);
-  // Then add an event that will quit the main loop.
-  injector->AddEvent(0, RunLoop::QuitCurrentWhenIdleClosureDeprecated());
-
-  // Post a couple of dummy tasks
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, DoNothing());
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, DoNothing());
-
-  // Drain the events
-  while (g_main_context_pending(nullptr)) {
-    g_main_context_iteration(nullptr, FALSE);
-  }
-}
-
-}  // namespace
-
-TEST_F(MessagePumpGLibTest, TestDrainingGLib) {
-  // Tests that draining events using GLib works.
-  loop()->task_runner()->PostTask(
-      FROM_HERE, BindOnce(&AddEventsAndDrainGLib, Unretained(injector())));
-  RunLoop().Run();
-
-  EXPECT_EQ(3, injector()->processed_events());
-}
-
-namespace {
-
-// Helper class that lets us run the GLib message loop.
-class GLibLoopRunner : public RefCounted<GLibLoopRunner> {
- public:
-  GLibLoopRunner() : quit_(false) { }
-
-  void RunGLib() {
-    while (!quit_) {
-      g_main_context_iteration(nullptr, TRUE);
-    }
-  }
-
-  void RunLoop() {
-    while (!quit_) {
-      g_main_context_iteration(nullptr, TRUE);
-    }
-  }
-
-  void Quit() {
-    quit_ = true;
-  }
-
-  void Reset() {
-    quit_ = false;
-  }
-
- private:
-  friend class RefCounted<GLibLoopRunner>;
-
-  ~GLibLoopRunner() {}
-
-  bool quit_;
-};
-
-void TestGLibLoopInternal(EventInjector* injector) {
-  // Allow tasks to be processed from 'native' event loops.
-  MessageLoopCurrent::Get()->SetNestableTasksAllowed(true);
-  scoped_refptr<GLibLoopRunner> runner = new GLibLoopRunner();
-
-  int task_count = 0;
-  // Add a couple of dummy events
-  injector->AddDummyEvent(0);
-  injector->AddDummyEvent(0);
-  // Post a couple of dummy tasks
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&IncrementInt, &task_count));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&IncrementInt, &task_count));
-  // Delayed events
-  injector->AddDummyEvent(10);
-  injector->AddDummyEvent(10);
-  // Delayed work
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, BindOnce(&IncrementInt, &task_count),
-      TimeDelta::FromMilliseconds(30));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, BindOnce(&GLibLoopRunner::Quit, runner),
-      TimeDelta::FromMilliseconds(40));
-
-  // Run a nested, straight GLib message loop.
-  runner->RunGLib();
-
-  ASSERT_EQ(3, task_count);
-  EXPECT_EQ(4, injector->processed_events());
-  RunLoop::QuitCurrentWhenIdleDeprecated();
-}
-
-void TestGtkLoopInternal(EventInjector* injector) {
-  // Allow tasks to be processed from 'native' event loops.
-  MessageLoopCurrent::Get()->SetNestableTasksAllowed(true);
-  scoped_refptr<GLibLoopRunner> runner = new GLibLoopRunner();
-
-  int task_count = 0;
-  // Add a couple of dummy events
-  injector->AddDummyEvent(0);
-  injector->AddDummyEvent(0);
-  // Post a couple of dummy tasks
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&IncrementInt, &task_count));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          BindOnce(&IncrementInt, &task_count));
-  // Delayed events
-  injector->AddDummyEvent(10);
-  injector->AddDummyEvent(10);
-  // Delayed work
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, BindOnce(&IncrementInt, &task_count),
-      TimeDelta::FromMilliseconds(30));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, BindOnce(&GLibLoopRunner::Quit, runner),
-      TimeDelta::FromMilliseconds(40));
-
-  // Run a nested, straight Gtk message loop.
-  runner->RunLoop();
-
-  ASSERT_EQ(3, task_count);
-  EXPECT_EQ(4, injector->processed_events());
-  RunLoop::QuitCurrentWhenIdleDeprecated();
-}
-
-}  // namespace
-
-TEST_F(MessagePumpGLibTest, TestGLibLoop) {
-  // Tests that events and posted tasks are correctly executed if the message
-  // loop is not run by MessageLoop::Run() but by a straight GLib loop.
-  // Note that in this case we don't make strong guarantees about niceness
-  // between events and posted tasks.
-  loop()->task_runner()->PostTask(
-      FROM_HERE, BindOnce(&TestGLibLoopInternal, Unretained(injector())));
-  RunLoop().Run();
-}
-
-TEST_F(MessagePumpGLibTest, TestGtkLoop) {
-  // Tests that events and posted tasks are correctly executed if the message
-  // loop is not run by MessageLoop::Run() but by a straight Gtk loop.
-  // Note that in this case we don't make strong guarantees about niceness
-  // between events and posted tasks.
-  loop()->task_runner()->PostTask(
-      FROM_HERE, BindOnce(&TestGtkLoopInternal, Unretained(injector())));
-  RunLoop().Run();
-}
-
-}  // namespace base
diff --git a/base/message_loop/message_pump_io_ios_unittest.cc b/base/message_loop/message_pump_io_ios_unittest.cc
deleted file mode 100644
index 4d15d44..0000000
--- a/base/message_loop/message_pump_io_ios_unittest.cc
+++ /dev/null
@@ -1,153 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_pump_io_ios.h"
-
-#include <unistd.h>
-
-#include "base/macros.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/test/gtest_util.h"
-#include "base/threading/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-class MessagePumpIOSForIOTest : public testing::Test {
- protected:
-  MessagePumpIOSForIOTest() = default;
-  ~MessagePumpIOSForIOTest() override = default;
-
-  void SetUp() override {
-    int ret = pipe(pipefds_);
-    ASSERT_EQ(0, ret);
-    ret = pipe(alternate_pipefds_);
-    ASSERT_EQ(0, ret);
-  }
-
-  void TearDown() override {
-    if (IGNORE_EINTR(close(pipefds_[0])) < 0)
-      PLOG(ERROR) << "close";
-    if (IGNORE_EINTR(close(pipefds_[1])) < 0)
-      PLOG(ERROR) << "close";
-  }
-
-  void HandleFdIOEvent(MessagePumpForIO::FdWatchController* watcher) {
-    MessagePumpIOSForIO::HandleFdIOEvent(watcher->fdref_.get(),
-        kCFFileDescriptorReadCallBack | kCFFileDescriptorWriteCallBack,
-        watcher);
-  }
-
-  int pipefds_[2];
-  int alternate_pipefds_[2];
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MessagePumpIOSForIOTest);
-};
-
-namespace {
-
-// Concrete implementation of MessagePumpIOSForIO::FdWatcher that does
-// nothing useful.
-class StupidWatcher : public MessagePumpIOSForIO::FdWatcher {
- public:
-  ~StupidWatcher() override {}
-
-  // base:MessagePumpIOSForIO::FdWatcher interface
-  void OnFileCanReadWithoutBlocking(int fd) override {}
-  void OnFileCanWriteWithoutBlocking(int fd) override {}
-};
-
-class BaseWatcher : public MessagePumpIOSForIO::FdWatcher {
- public:
-  BaseWatcher(MessagePumpIOSForIO::FdWatchController* controller)
-      : controller_(controller) {
-    DCHECK(controller_);
-  }
-  ~BaseWatcher() override {}
-
-  // MessagePumpIOSForIO::FdWatcher interface
-  void OnFileCanReadWithoutBlocking(int /* fd */) override { NOTREACHED(); }
-
-  void OnFileCanWriteWithoutBlocking(int /* fd */) override { NOTREACHED(); }
-
- protected:
-  MessagePumpIOSForIO::FdWatchController* controller_;
-};
-
-class DeleteWatcher : public BaseWatcher {
- public:
-  explicit DeleteWatcher(MessagePumpIOSForIO::FdWatchController* controller)
-      : BaseWatcher(controller) {}
-
-  ~DeleteWatcher() override { DCHECK(!controller_); }
-
-  void OnFileCanWriteWithoutBlocking(int /* fd */) override {
-    DCHECK(controller_);
-    delete controller_;
-    controller_ = NULL;
-  }
-};
-
-TEST_F(MessagePumpIOSForIOTest, DeleteWatcher) {
-  std::unique_ptr<MessagePumpIOSForIO> pump(new MessagePumpIOSForIO);
-  MessagePumpIOSForIO::FdWatchController* watcher =
-      new MessagePumpIOSForIO::FdWatchController(FROM_HERE);
-  DeleteWatcher delegate(watcher);
-  pump->WatchFileDescriptor(pipefds_[1],
-      false, MessagePumpIOSForIO::WATCH_READ_WRITE, watcher, &delegate);
-
-  // Spoof a callback.
-  HandleFdIOEvent(watcher);
-}
-
-class StopWatcher : public BaseWatcher {
- public:
-  StopWatcher(MessagePumpIOSForIO::FdWatchController* controller,
-              MessagePumpIOSForIO* pump,
-              int fd_to_start_watching = -1)
-      : BaseWatcher(controller),
-        pump_(pump),
-        fd_to_start_watching_(fd_to_start_watching) {}
-
-  ~StopWatcher() override {}
-
-  void OnFileCanWriteWithoutBlocking(int /* fd */) override {
-    controller_->StopWatchingFileDescriptor();
-    if (fd_to_start_watching_ >= 0) {
-      pump_->WatchFileDescriptor(fd_to_start_watching_,
-          false, MessagePumpIOSForIO::WATCH_READ_WRITE, controller_, this);
-    }
-  }
-
- private:
-  MessagePumpIOSForIO* pump_;
-  int fd_to_start_watching_;
-};
-
-TEST_F(MessagePumpIOSForIOTest, StopWatcher) {
-  std::unique_ptr<MessagePumpIOSForIO> pump(new MessagePumpIOSForIO);
-  MessagePumpIOSForIO::FdWatchController watcher(FROM_HERE);
-  StopWatcher delegate(&watcher, pump.get());
-  pump->WatchFileDescriptor(pipefds_[1],
-      false, MessagePumpIOSForIO::WATCH_READ_WRITE, &watcher, &delegate);
-
-  // Spoof a callback.
-  HandleFdIOEvent(&watcher);
-}
-
-TEST_F(MessagePumpIOSForIOTest, StopWatcherAndWatchSomethingElse) {
-  std::unique_ptr<MessagePumpIOSForIO> pump(new MessagePumpIOSForIO);
-  MessagePumpIOSForIO::FdWatchController watcher(FROM_HERE);
-  StopWatcher delegate(&watcher, pump.get(), alternate_pipefds_[1]);
-  pump->WatchFileDescriptor(pipefds_[1],
-      false, MessagePumpIOSForIO::WATCH_READ_WRITE, &watcher, &delegate);
-
-  // Spoof a callback.
-  HandleFdIOEvent(&watcher);
-}
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/message_loop/message_pump_libevent_unittest.cc b/base/message_loop/message_pump_libevent_unittest.cc
deleted file mode 100644
index bb26c29..0000000
--- a/base/message_loop/message_pump_libevent_unittest.cc
+++ /dev/null
@@ -1,263 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_pump_libevent.h"
-
-#include <unistd.h>
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/files/file_util.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/synchronization/waitable_event_watcher.h"
-#include "base/test/gtest_util.h"
-#include "base/third_party/libevent/event.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-class MessagePumpLibeventTest : public testing::Test {
- protected:
-  MessagePumpLibeventTest()
-      : ui_loop_(new MessageLoop(MessageLoop::TYPE_UI)),
-        io_thread_("MessagePumpLibeventTestIOThread") {}
-  ~MessagePumpLibeventTest() override = default;
-
-  void SetUp() override {
-    Thread::Options options(MessageLoop::TYPE_IO, 0);
-    ASSERT_TRUE(io_thread_.StartWithOptions(options));
-    ASSERT_EQ(MessageLoop::TYPE_IO, io_thread_.message_loop()->type());
-    int ret = pipe(pipefds_);
-    ASSERT_EQ(0, ret);
-  }
-
-  void TearDown() override {
-    if (IGNORE_EINTR(close(pipefds_[0])) < 0)
-      PLOG(ERROR) << "close";
-    if (IGNORE_EINTR(close(pipefds_[1])) < 0)
-      PLOG(ERROR) << "close";
-  }
-
-  void WaitUntilIoThreadStarted() {
-    ASSERT_TRUE(io_thread_.WaitUntilThreadStarted());
-  }
-
-  scoped_refptr<SingleThreadTaskRunner> io_runner() const {
-    return io_thread_.task_runner();
-  }
-
-  void OnLibeventNotification(
-      MessagePumpLibevent* pump,
-      MessagePumpLibevent::FdWatchController* controller) {
-    pump->OnLibeventNotification(0, EV_WRITE | EV_READ, controller);
-  }
-
-  int pipefds_[2];
-  std::unique_ptr<MessageLoop> ui_loop_;
-
- private:
-  Thread io_thread_;
-};
-
-namespace {
-
-// Concrete implementation of MessagePumpLibevent::FdWatcher that does
-// nothing useful.
-class StupidWatcher : public MessagePumpLibevent::FdWatcher {
- public:
-  ~StupidWatcher() override = default;
-
-  // base:MessagePumpLibevent::FdWatcher interface
-  void OnFileCanReadWithoutBlocking(int fd) override {}
-  void OnFileCanWriteWithoutBlocking(int fd) override {}
-};
-
-TEST_F(MessagePumpLibeventTest, QuitOutsideOfRun) {
-  std::unique_ptr<MessagePumpLibevent> pump(new MessagePumpLibevent);
-  ASSERT_DCHECK_DEATH(pump->Quit());
-}
-
-class BaseWatcher : public MessagePumpLibevent::FdWatcher {
- public:
-  explicit BaseWatcher(MessagePumpLibevent::FdWatchController* controller)
-      : controller_(controller) {
-    DCHECK(controller_);
-  }
-  ~BaseWatcher() override = default;
-
-  // base:MessagePumpLibevent::FdWatcher interface
-  void OnFileCanReadWithoutBlocking(int /* fd */) override { NOTREACHED(); }
-
-  void OnFileCanWriteWithoutBlocking(int /* fd */) override { NOTREACHED(); }
-
- protected:
-  MessagePumpLibevent::FdWatchController* controller_;
-};
-
-class DeleteWatcher : public BaseWatcher {
- public:
-  explicit DeleteWatcher(MessagePumpLibevent::FdWatchController* controller)
-      : BaseWatcher(controller) {}
-
-  ~DeleteWatcher() override { DCHECK(!controller_); }
-
-  void OnFileCanWriteWithoutBlocking(int /* fd */) override {
-    DCHECK(controller_);
-    delete controller_;
-    controller_ = nullptr;
-  }
-};
-
-TEST_F(MessagePumpLibeventTest, DeleteWatcher) {
-  std::unique_ptr<MessagePumpLibevent> pump(new MessagePumpLibevent);
-  MessagePumpLibevent::FdWatchController* watcher =
-      new MessagePumpLibevent::FdWatchController(FROM_HERE);
-  DeleteWatcher delegate(watcher);
-  pump->WatchFileDescriptor(pipefds_[1],
-      false, MessagePumpLibevent::WATCH_READ_WRITE, watcher, &delegate);
-
-  // Spoof a libevent notification.
-  OnLibeventNotification(pump.get(), watcher);
-}
-
-class StopWatcher : public BaseWatcher {
- public:
-  explicit StopWatcher(MessagePumpLibevent::FdWatchController* controller)
-      : BaseWatcher(controller) {}
-
-  ~StopWatcher() override = default;
-
-  void OnFileCanWriteWithoutBlocking(int /* fd */) override {
-    controller_->StopWatchingFileDescriptor();
-  }
-};
-
-TEST_F(MessagePumpLibeventTest, StopWatcher) {
-  std::unique_ptr<MessagePumpLibevent> pump(new MessagePumpLibevent);
-  MessagePumpLibevent::FdWatchController watcher(FROM_HERE);
-  StopWatcher delegate(&watcher);
-  pump->WatchFileDescriptor(pipefds_[1],
-      false, MessagePumpLibevent::WATCH_READ_WRITE, &watcher, &delegate);
-
-  // Spoof a libevent notification.
-  OnLibeventNotification(pump.get(), &watcher);
-}
-
-void QuitMessageLoopAndStart(const Closure& quit_closure) {
-  quit_closure.Run();
-
-  RunLoop runloop(RunLoop::Type::kNestableTasksAllowed);
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, runloop.QuitClosure());
-  runloop.Run();
-}
-
-class NestedPumpWatcher : public MessagePumpLibevent::FdWatcher {
- public:
-  NestedPumpWatcher() = default;
-  ~NestedPumpWatcher() override = default;
-
-  void OnFileCanReadWithoutBlocking(int /* fd */) override {
-    RunLoop runloop;
-    ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, BindOnce(&QuitMessageLoopAndStart, runloop.QuitClosure()));
-    runloop.Run();
-  }
-
-  void OnFileCanWriteWithoutBlocking(int /* fd */) override {}
-};
-
-TEST_F(MessagePumpLibeventTest, NestedPumpWatcher) {
-  std::unique_ptr<MessagePumpLibevent> pump(new MessagePumpLibevent);
-  MessagePumpLibevent::FdWatchController watcher(FROM_HERE);
-  NestedPumpWatcher delegate;
-  pump->WatchFileDescriptor(pipefds_[1],
-      false, MessagePumpLibevent::WATCH_READ, &watcher, &delegate);
-
-  // Spoof a libevent notification.
-  OnLibeventNotification(pump.get(), &watcher);
-}
-
-void FatalClosure() {
-  FAIL() << "Reached fatal closure.";
-}
-
-class QuitWatcher : public BaseWatcher {
- public:
-  QuitWatcher(MessagePumpLibevent::FdWatchController* controller,
-              base::Closure quit_closure)
-      : BaseWatcher(controller), quit_closure_(std::move(quit_closure)) {}
-
-  void OnFileCanReadWithoutBlocking(int /* fd */) override {
-    // Post a fatal closure to the MessageLoop before we quit it.
-    ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, BindOnce(&FatalClosure));
-
-    quit_closure_.Run();
-  }
-
- private:
-  base::Closure quit_closure_;
-};
-
-void WriteFDWrapper(const int fd,
-                    const char* buf,
-                    int size,
-                    WaitableEvent* event) {
-  ASSERT_TRUE(WriteFileDescriptor(fd, buf, size));
-}
-
-// Tests that MessagePumpLibevent quits immediately when it is quit from
-// libevent's event_base_loop().
-TEST_F(MessagePumpLibeventTest, QuitWatcher) {
-  // Delete the old MessageLoop so that we can manage our own one here.
-  ui_loop_.reset();
-
-  MessagePumpLibevent* pump = new MessagePumpLibevent;  // owned by |loop|.
-  MessageLoop loop(WrapUnique(pump));
-  RunLoop run_loop;
-  MessagePumpLibevent::FdWatchController controller(FROM_HERE);
-  QuitWatcher delegate(&controller, run_loop.QuitClosure());
-  WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  std::unique_ptr<WaitableEventWatcher> watcher(new WaitableEventWatcher);
-
-  // Tell the pump to watch the pipe.
-  pump->WatchFileDescriptor(pipefds_[0], false, MessagePumpLibevent::WATCH_READ,
-                            &controller, &delegate);
-
-  // Make the IO thread wait for |event| before writing to pipefds[1].
-  const char buf = 0;
-  WaitableEventWatcher::EventCallback write_fd_task =
-      BindOnce(&WriteFDWrapper, pipefds_[1], &buf, 1);
-  io_runner()->PostTask(
-      FROM_HERE, BindOnce(IgnoreResult(&WaitableEventWatcher::StartWatching),
-                          Unretained(watcher.get()), &event,
-                          std::move(write_fd_task), io_runner()));
-
-  // Queue |event| to signal on |loop|.
-  loop.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&event)));
-
-  // Now run the MessageLoop.
-  run_loop.Run();
-
-  // StartWatching can move |watcher| to IO thread. Release on IO thread.
-  io_runner()->PostTask(FROM_HERE, BindOnce(&WaitableEventWatcher::StopWatching,
-                                            Owned(watcher.release())));
-}
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/metrics/bucket_ranges_unittest.cc b/base/metrics/bucket_ranges_unittest.cc
deleted file mode 100644
index 481054c..0000000
--- a/base/metrics/bucket_ranges_unittest.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/bucket_ranges.h"
-
-#include <stdint.h>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-TEST(BucketRangesTest, NormalSetup) {
-  BucketRanges ranges(5);
-  ASSERT_EQ(5u, ranges.size());
-  ASSERT_EQ(4u, ranges.bucket_count());
-
-  for (int i = 0; i < 5; ++i) {
-    EXPECT_EQ(0, ranges.range(i));
-  }
-  EXPECT_EQ(0u, ranges.checksum());
-
-  ranges.set_range(3, 100);
-  EXPECT_EQ(100, ranges.range(3));
-}
-
-TEST(BucketRangesTest, Equals) {
-  // Compare empty ranges.
-  BucketRanges ranges1(3);
-  BucketRanges ranges2(3);
-  BucketRanges ranges3(5);
-
-  EXPECT_TRUE(ranges1.Equals(&ranges2));
-  EXPECT_FALSE(ranges1.Equals(&ranges3));
-  EXPECT_FALSE(ranges2.Equals(&ranges3));
-
-  // Compare full filled ranges.
-  ranges1.set_range(0, 0);
-  ranges1.set_range(1, 1);
-  ranges1.set_range(2, 2);
-  ranges1.set_checksum(100);
-  ranges2.set_range(0, 0);
-  ranges2.set_range(1, 1);
-  ranges2.set_range(2, 2);
-  ranges2.set_checksum(100);
-
-  EXPECT_TRUE(ranges1.Equals(&ranges2));
-
-  // Checksum does not match.
-  ranges1.set_checksum(99);
-  EXPECT_FALSE(ranges1.Equals(&ranges2));
-  ranges1.set_checksum(100);
-
-  // Range does not match.
-  ranges1.set_range(1, 3);
-  EXPECT_FALSE(ranges1.Equals(&ranges2));
-}
-
-TEST(BucketRangesTest, Checksum) {
-  BucketRanges ranges(3);
-  ranges.set_range(0, 0);
-  ranges.set_range(1, 1);
-  ranges.set_range(2, 2);
-
-  ranges.ResetChecksum();
-  EXPECT_EQ(289217253u, ranges.checksum());
-
-  ranges.set_range(2, 3);
-  EXPECT_FALSE(ranges.HasValidChecksum());
-
-  ranges.ResetChecksum();
-  EXPECT_EQ(2843835776u, ranges.checksum());
-  EXPECT_TRUE(ranges.HasValidChecksum());
-}
-
-// Table was generated similarly to sample code for CRC-32 given on:
-// http://www.w3.org/TR/PNG/#D-CRCAppendix.
-TEST(BucketRangesTest, Crc32TableTest) {
-  for (int i = 0; i < 256; ++i) {
-    uint32_t checksum = i;
-    for (int j = 0; j < 8; ++j) {
-      const uint32_t kReversedPolynomial = 0xedb88320L;
-      if (checksum & 1)
-        checksum = kReversedPolynomial ^ (checksum >> 1);
-      else
-        checksum >>= 1;
-    }
-    EXPECT_EQ(kCrcTable[i], checksum);
-  }
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/metrics/field_trial_params_unittest.cc b/base/metrics/field_trial_params_unittest.cc
deleted file mode 100644
index d310c0d..0000000
--- a/base/metrics/field_trial_params_unittest.cc
+++ /dev/null
@@ -1,458 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/field_trial_params.h"
-
-#include "base/feature_list.h"
-#include "base/macros.h"
-#include "base/metrics/field_trial.h"
-#include "base/metrics/field_trial_param_associator.h"
-#include "base/test/scoped_feature_list.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-// Call FieldTrialList::FactoryGetFieldTrial() with a future expiry date.
-scoped_refptr<FieldTrial> CreateFieldTrial(
-    const std::string& trial_name,
-    int total_probability,
-    const std::string& default_group_name,
-    int* default_group_number) {
-  return FieldTrialList::FactoryGetFieldTrial(
-      trial_name, total_probability, default_group_name,
-      FieldTrialList::kNoExpirationYear, 1, 1, FieldTrial::SESSION_RANDOMIZED,
-      default_group_number);
-}
-
-}  // namespace
-
-class FieldTrialParamsTest : public ::testing::Test {
- public:
-  FieldTrialParamsTest() : field_trial_list_(nullptr) {}
-
-  ~FieldTrialParamsTest() override {
-    // Ensure that the maps are cleared between tests, since they are stored as
-    // process singletons.
-    FieldTrialParamAssociator::GetInstance()->ClearAllParamsForTesting();
-  }
-
-  void CreateFeatureWithTrial(const Feature& feature,
-                              FeatureList::OverrideState override_state,
-                              FieldTrial* trial) {
-    std::unique_ptr<FeatureList> feature_list(new FeatureList);
-    feature_list->RegisterFieldTrialOverride(feature.name, override_state,
-                                             trial);
-    scoped_feature_list_.InitWithFeatureList(std::move(feature_list));
-  }
-
- private:
-  FieldTrialList field_trial_list_;
-  test::ScopedFeatureList scoped_feature_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(FieldTrialParamsTest);
-};
-
-TEST_F(FieldTrialParamsTest, AssociateFieldTrialParams) {
-  const std::string kTrialName = "AssociateFieldTrialParams";
-
-  {
-    std::map<std::string, std::string> params;
-    params["a"] = "10";
-    params["b"] = "test";
-    ASSERT_TRUE(AssociateFieldTrialParams(kTrialName, "A", params));
-  }
-  {
-    std::map<std::string, std::string> params;
-    params["a"] = "5";
-    ASSERT_TRUE(AssociateFieldTrialParams(kTrialName, "B", params));
-  }
-
-  FieldTrialList::CreateFieldTrial(kTrialName, "B");
-  EXPECT_EQ("5", GetFieldTrialParamValue(kTrialName, "a"));
-  EXPECT_EQ(std::string(), GetFieldTrialParamValue(kTrialName, "b"));
-  EXPECT_EQ(std::string(), GetFieldTrialParamValue(kTrialName, "x"));
-
-  std::map<std::string, std::string> params;
-  EXPECT_TRUE(GetFieldTrialParams(kTrialName, &params));
-  EXPECT_EQ(1U, params.size());
-  EXPECT_EQ("5", params["a"]);
-}
-
-TEST_F(FieldTrialParamsTest, AssociateFieldTrialParams_Fail) {
-  const std::string kTrialName = "AssociateFieldTrialParams_Fail";
-  const std::string kGroupName = "A";
-
-  std::map<std::string, std::string> params;
-  params["a"] = "10";
-  ASSERT_TRUE(AssociateFieldTrialParams(kTrialName, kGroupName, params));
-  params["a"] = "1";
-  params["b"] = "2";
-  ASSERT_FALSE(AssociateFieldTrialParams(kTrialName, kGroupName, params));
-
-  FieldTrialList::CreateFieldTrial(kTrialName, kGroupName);
-  EXPECT_EQ("10", GetFieldTrialParamValue(kTrialName, "a"));
-  EXPECT_EQ(std::string(), GetFieldTrialParamValue(kTrialName, "b"));
-}
-
-TEST_F(FieldTrialParamsTest, AssociateFieldTrialParams_TrialActiveFail) {
-  const std::string kTrialName = "AssociateFieldTrialParams_TrialActiveFail";
-  FieldTrialList::CreateFieldTrial(kTrialName, "A");
-  ASSERT_EQ("A", FieldTrialList::FindFullName(kTrialName));
-
-  std::map<std::string, std::string> params;
-  params["a"] = "10";
-  EXPECT_FALSE(AssociateFieldTrialParams(kTrialName, "B", params));
-  EXPECT_FALSE(AssociateFieldTrialParams(kTrialName, "A", params));
-}
-
-TEST_F(FieldTrialParamsTest, AssociateFieldTrialParams_DoesntActivateTrial) {
-  const std::string kTrialName =
-      "AssociateFieldTrialParams_DoesntActivateTrial";
-
-  ASSERT_FALSE(FieldTrialList::IsTrialActive(kTrialName));
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-  ASSERT_FALSE(FieldTrialList::IsTrialActive(kTrialName));
-
-  std::map<std::string, std::string> params;
-  params["a"] = "10";
-  EXPECT_TRUE(AssociateFieldTrialParams(kTrialName, "A", params));
-  ASSERT_FALSE(FieldTrialList::IsTrialActive(kTrialName));
-}
-
-TEST_F(FieldTrialParamsTest, GetFieldTrialParams_NoTrial) {
-  const std::string kTrialName = "GetFieldTrialParams_NoParams";
-
-  std::map<std::string, std::string> params;
-  EXPECT_FALSE(GetFieldTrialParams(kTrialName, &params));
-  EXPECT_EQ(std::string(), GetFieldTrialParamValue(kTrialName, "x"));
-  EXPECT_EQ(std::string(), GetFieldTrialParamValue(kTrialName, "y"));
-}
-
-TEST_F(FieldTrialParamsTest, GetFieldTrialParams_NoParams) {
-  const std::string kTrialName = "GetFieldTrialParams_NoParams";
-
-  FieldTrialList::CreateFieldTrial(kTrialName, "A");
-
-  std::map<std::string, std::string> params;
-  EXPECT_FALSE(GetFieldTrialParams(kTrialName, &params));
-  EXPECT_EQ(std::string(), GetFieldTrialParamValue(kTrialName, "x"));
-  EXPECT_EQ(std::string(), GetFieldTrialParamValue(kTrialName, "y"));
-}
-
-TEST_F(FieldTrialParamsTest, GetFieldTrialParams_ActivatesTrial) {
-  const std::string kTrialName = "GetFieldTrialParams_ActivatesTrial";
-
-  ASSERT_FALSE(FieldTrialList::IsTrialActive(kTrialName));
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-  ASSERT_FALSE(FieldTrialList::IsTrialActive(kTrialName));
-
-  std::map<std::string, std::string> params;
-  EXPECT_FALSE(GetFieldTrialParams(kTrialName, &params));
-  ASSERT_TRUE(FieldTrialList::IsTrialActive(kTrialName));
-}
-
-TEST_F(FieldTrialParamsTest, GetFieldTrialParamValue_ActivatesTrial) {
-  const std::string kTrialName = "GetFieldTrialParamValue_ActivatesTrial";
-
-  ASSERT_FALSE(FieldTrialList::IsTrialActive(kTrialName));
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-  ASSERT_FALSE(FieldTrialList::IsTrialActive(kTrialName));
-
-  std::map<std::string, std::string> params;
-  EXPECT_EQ(std::string(), GetFieldTrialParamValue(kTrialName, "x"));
-  ASSERT_TRUE(FieldTrialList::IsTrialActive(kTrialName));
-}
-
-TEST_F(FieldTrialParamsTest, GetFieldTrialParamsByFeature) {
-  const std::string kTrialName = "GetFieldTrialParamsByFeature";
-  const Feature kFeature{"TestFeature", FEATURE_DISABLED_BY_DEFAULT};
-
-  std::map<std::string, std::string> params;
-  params["x"] = "1";
-  AssociateFieldTrialParams(kTrialName, "A", params);
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-
-  CreateFeatureWithTrial(kFeature, FeatureList::OVERRIDE_ENABLE_FEATURE,
-                         trial.get());
-
-  std::map<std::string, std::string> actualParams;
-  EXPECT_TRUE(GetFieldTrialParamsByFeature(kFeature, &actualParams));
-  EXPECT_EQ(params, actualParams);
-}
-
-TEST_F(FieldTrialParamsTest, GetFieldTrialParamValueByFeature) {
-  const std::string kTrialName = "GetFieldTrialParamsByFeature";
-  const Feature kFeature{"TestFeature", FEATURE_DISABLED_BY_DEFAULT};
-
-  std::map<std::string, std::string> params;
-  params["x"] = "1";
-  AssociateFieldTrialParams(kTrialName, "A", params);
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-
-  CreateFeatureWithTrial(kFeature, FeatureList::OVERRIDE_ENABLE_FEATURE,
-                         trial.get());
-
-  std::map<std::string, std::string> actualParams;
-  EXPECT_EQ(params["x"], GetFieldTrialParamValueByFeature(kFeature, "x"));
-}
-
-TEST_F(FieldTrialParamsTest, GetFieldTrialParamsByFeature_Disable) {
-  const std::string kTrialName = "GetFieldTrialParamsByFeature";
-  const Feature kFeature{"TestFeature", FEATURE_DISABLED_BY_DEFAULT};
-
-  std::map<std::string, std::string> params;
-  params["x"] = "1";
-  AssociateFieldTrialParams(kTrialName, "A", params);
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-
-  CreateFeatureWithTrial(kFeature, FeatureList::OVERRIDE_DISABLE_FEATURE,
-                         trial.get());
-
-  std::map<std::string, std::string> actualParams;
-  EXPECT_FALSE(GetFieldTrialParamsByFeature(kFeature, &actualParams));
-}
-
-TEST_F(FieldTrialParamsTest, GetFieldTrialParamValueByFeature_Disable) {
-  const std::string kTrialName = "GetFieldTrialParamsByFeature";
-  const Feature kFeature{"TestFeature", FEATURE_DISABLED_BY_DEFAULT};
-
-  std::map<std::string, std::string> params;
-  params["x"] = "1";
-  AssociateFieldTrialParams(kTrialName, "A", params);
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-
-  CreateFeatureWithTrial(kFeature, FeatureList::OVERRIDE_DISABLE_FEATURE,
-                         trial.get());
-
-  std::map<std::string, std::string> actualParams;
-  EXPECT_EQ(std::string(), GetFieldTrialParamValueByFeature(kFeature, "x"));
-}
-
-TEST_F(FieldTrialParamsTest, FeatureParamString) {
-  const std::string kTrialName = "GetFieldTrialParamsByFeature";
-
-  static const Feature kFeature{"TestFeature", FEATURE_DISABLED_BY_DEFAULT};
-  static const FeatureParam<std::string> a{&kFeature, "a", "default"};
-  static const FeatureParam<std::string> b{&kFeature, "b", ""};
-  static const FeatureParam<std::string> c{&kFeature, "c", "default"};
-  static const FeatureParam<std::string> d{&kFeature, "d", ""};
-  static const FeatureParam<std::string> e{&kFeature, "e", "default"};
-  static const FeatureParam<std::string> f{&kFeature, "f", ""};
-
-  std::map<std::string, std::string> params;
-  params["a"] = "";
-  params["b"] = "non-default";
-  params["c"] = "non-default";
-  params["d"] = "";
-  // "e" is not registered
-  // "f" is not registered
-  AssociateFieldTrialParams(kTrialName, "A", params);
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-
-  CreateFeatureWithTrial(kFeature, FeatureList::OVERRIDE_ENABLE_FEATURE,
-                         trial.get());
-
-  EXPECT_EQ("default", a.Get());  // empty
-  EXPECT_EQ("non-default", b.Get());
-  EXPECT_EQ("non-default", c.Get());
-  EXPECT_EQ("", d.Get());         // empty
-  EXPECT_EQ("default", e.Get());  // not registered
-  EXPECT_EQ("", f.Get());         // not registered
-}
-
-TEST_F(FieldTrialParamsTest, FeatureParamInt) {
-  const std::string kTrialName = "GetFieldTrialParamsByFeature";
-
-  static const Feature kFeature{"TestFeature", FEATURE_DISABLED_BY_DEFAULT};
-  static const FeatureParam<int> a{&kFeature, "a", 0};
-  static const FeatureParam<int> b{&kFeature, "b", 0};
-  static const FeatureParam<int> c{&kFeature, "c", 0};
-  static const FeatureParam<int> d{&kFeature, "d", 0};
-  static const FeatureParam<int> e{&kFeature, "e", 0};
-
-  std::map<std::string, std::string> params;
-  params["a"] = "1";
-  params["b"] = "1.5";
-  params["c"] = "foo";
-  params["d"] = "";
-  // "e" is not registered
-  AssociateFieldTrialParams(kTrialName, "A", params);
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-
-  CreateFeatureWithTrial(kFeature, FeatureList::OVERRIDE_ENABLE_FEATURE,
-                         trial.get());
-
-  EXPECT_EQ(1, GetFieldTrialParamByFeatureAsInt(kFeature, "a", 0));
-  EXPECT_EQ(0, GetFieldTrialParamByFeatureAsInt(kFeature, "b", 0));  // invalid
-  EXPECT_EQ(0, GetFieldTrialParamByFeatureAsInt(kFeature, "c", 0));  // invalid
-  EXPECT_EQ(0, GetFieldTrialParamByFeatureAsInt(kFeature, "d", 0));  // empty
-  EXPECT_EQ(0, GetFieldTrialParamByFeatureAsInt(kFeature, "e", 0));  // empty
-
-  EXPECT_EQ(1, a.Get());
-  EXPECT_EQ(0, b.Get());  // invalid
-  EXPECT_EQ(0, c.Get());  // invalid
-  EXPECT_EQ(0, d.Get());  // empty
-  EXPECT_EQ(0, e.Get());  // empty
-}
-
-TEST_F(FieldTrialParamsTest, FeatureParamDouble) {
-  const std::string kTrialName = "GetFieldTrialParamsByFeature";
-
-  static const Feature kFeature{"TestFeature", FEATURE_DISABLED_BY_DEFAULT};
-  static const FeatureParam<double> a{&kFeature, "a", 0.0};
-  static const FeatureParam<double> b{&kFeature, "b", 0.0};
-  static const FeatureParam<double> c{&kFeature, "c", 0.0};
-  static const FeatureParam<double> d{&kFeature, "d", 0.0};
-  static const FeatureParam<double> e{&kFeature, "e", 0.0};
-  static const FeatureParam<double> f{&kFeature, "f", 0.0};
-
-  std::map<std::string, std::string> params;
-  params["a"] = "1";
-  params["b"] = "1.5";
-  params["c"] = "1.0e-10";
-  params["d"] = "foo";
-  params["e"] = "";
-  // "f" is not registered
-  AssociateFieldTrialParams(kTrialName, "A", params);
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-
-  CreateFeatureWithTrial(kFeature, FeatureList::OVERRIDE_ENABLE_FEATURE,
-                         trial.get());
-
-  EXPECT_EQ(1, GetFieldTrialParamByFeatureAsDouble(kFeature, "a", 0));
-  EXPECT_EQ(1.5, GetFieldTrialParamByFeatureAsDouble(kFeature, "b", 0));
-  EXPECT_EQ(1.0e-10, GetFieldTrialParamByFeatureAsDouble(kFeature, "c", 0));
-  EXPECT_EQ(0,
-            GetFieldTrialParamByFeatureAsDouble(kFeature, "d", 0));  // invalid
-  EXPECT_EQ(0, GetFieldTrialParamByFeatureAsDouble(kFeature, "e", 0));  // empty
-  EXPECT_EQ(0, GetFieldTrialParamByFeatureAsDouble(kFeature, "f", 0));  // empty
-
-  EXPECT_EQ(1, a.Get());
-  EXPECT_EQ(1.5, b.Get());
-  EXPECT_EQ(1.0e-10, c.Get());
-  EXPECT_EQ(0, d.Get());  // invalid
-  EXPECT_EQ(0, e.Get());  // empty
-  EXPECT_EQ(0, f.Get());  // empty
-}
-
-TEST_F(FieldTrialParamsTest, FeatureParamBool) {
-  const std::string kTrialName = "GetFieldTrialParamsByFeature";
-
-  static const Feature kFeature{"TestFeature", FEATURE_DISABLED_BY_DEFAULT};
-  static const FeatureParam<bool> a{&kFeature, "a", false};
-  static const FeatureParam<bool> b{&kFeature, "b", true};
-  static const FeatureParam<bool> c{&kFeature, "c", false};
-  static const FeatureParam<bool> d{&kFeature, "d", true};
-  static const FeatureParam<bool> e{&kFeature, "e", true};
-  static const FeatureParam<bool> f{&kFeature, "f", true};
-
-  std::map<std::string, std::string> params;
-  params["a"] = "true";
-  params["b"] = "false";
-  params["c"] = "1";
-  params["d"] = "False";
-  params["e"] = "";
-  // "f" is not registered
-  AssociateFieldTrialParams(kTrialName, "A", params);
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-
-  CreateFeatureWithTrial(kFeature, FeatureList::OVERRIDE_ENABLE_FEATURE,
-                         trial.get());
-
-  EXPECT_TRUE(a.Get());
-  EXPECT_FALSE(b.Get());
-  EXPECT_FALSE(c.Get());  // invalid
-  EXPECT_TRUE(d.Get());   // invalid
-  EXPECT_TRUE(e.Get());   // empty
-  EXPECT_TRUE(f.Get());   // empty
-}
-
-enum Hand { ROCK, PAPER, SCISSORS };
-
-TEST_F(FieldTrialParamsTest, FeatureParamEnum) {
-  const std::string kTrialName = "GetFieldTrialParamsByFeature";
-
-  static const FeatureParam<Hand>::Option hands[] = {
-      {ROCK, "rock"}, {PAPER, "paper"}, {SCISSORS, "scissors"}};
-  static const Feature kFeature{"TestFeature", FEATURE_DISABLED_BY_DEFAULT};
-  static const FeatureParam<Hand> a{&kFeature, "a", ROCK, &hands};
-  static const FeatureParam<Hand> b{&kFeature, "b", ROCK, &hands};
-  static const FeatureParam<Hand> c{&kFeature, "c", ROCK, &hands};
-  static const FeatureParam<Hand> d{&kFeature, "d", ROCK, &hands};
-  static const FeatureParam<Hand> e{&kFeature, "e", PAPER, &hands};
-  static const FeatureParam<Hand> f{&kFeature, "f", SCISSORS, &hands};
-
-  std::map<std::string, std::string> params;
-  params["a"] = "rock";
-  params["b"] = "paper";
-  params["c"] = "scissors";
-  params["d"] = "lizard";
-  params["e"] = "";
-  // "f" is not registered
-  AssociateFieldTrialParams(kTrialName, "A", params);
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-
-  CreateFeatureWithTrial(kFeature, FeatureList::OVERRIDE_ENABLE_FEATURE,
-                         trial.get());
-
-  EXPECT_EQ(ROCK, a.Get());
-  EXPECT_EQ(PAPER, b.Get());
-  EXPECT_EQ(SCISSORS, c.Get());
-  EXPECT_EQ(ROCK, d.Get());      // invalid
-  EXPECT_EQ(PAPER, e.Get());     // invalid/empty
-  EXPECT_EQ(SCISSORS, f.Get());  // not registered
-}
-
-enum class UI { ONE_D, TWO_D, THREE_D };
-
-TEST_F(FieldTrialParamsTest, FeatureParamEnumClass) {
-  const std::string kTrialName = "GetFieldTrialParamsByFeature";
-
-  static const FeatureParam<UI>::Option uis[] = {
-      {UI::ONE_D, "1d"}, {UI::TWO_D, "2d"}, {UI::THREE_D, "3d"}};
-  static const Feature kFeature{"TestFeature", FEATURE_DISABLED_BY_DEFAULT};
-  static const FeatureParam<UI> a{&kFeature, "a", UI::ONE_D, &uis};
-  static const FeatureParam<UI> b{&kFeature, "b", UI::ONE_D, &uis};
-  static const FeatureParam<UI> c{&kFeature, "c", UI::ONE_D, &uis};
-  static const FeatureParam<UI> d{&kFeature, "d", UI::ONE_D, &uis};
-  static const FeatureParam<UI> e{&kFeature, "e", UI::TWO_D, &uis};
-  static const FeatureParam<UI> f{&kFeature, "f", UI::THREE_D, &uis};
-
-  std::map<std::string, std::string> params;
-  params["a"] = "1d";
-  params["b"] = "2d";
-  params["c"] = "3d";
-  params["d"] = "4d";
-  params["e"] = "";
-  // "f" is not registered
-  AssociateFieldTrialParams(kTrialName, "A", params);
-  scoped_refptr<FieldTrial> trial(
-      CreateFieldTrial(kTrialName, 100, "A", nullptr));
-
-  CreateFeatureWithTrial(kFeature, FeatureList::OVERRIDE_ENABLE_FEATURE,
-                         trial.get());
-
-  EXPECT_EQ(UI::ONE_D, a.Get());
-  EXPECT_EQ(UI::TWO_D, b.Get());
-  EXPECT_EQ(UI::THREE_D, c.Get());
-  EXPECT_EQ(UI::ONE_D, d.Get());    // invalid
-  EXPECT_EQ(UI::TWO_D, e.Get());    // invalid/empty
-  EXPECT_EQ(UI::THREE_D, f.Get());  // not registered
-}
-
-}  // namespace base
diff --git a/base/metrics/field_trial_params_unittest.nc b/base/metrics/field_trial_params_unittest.nc
deleted file mode 100644
index 4c6005e..0000000
--- a/base/metrics/field_trial_params_unittest.nc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a "No Compile Test" suite.
-// http://dev.chromium.org/developers/testing/no-compile-tests
-
-#include "base/feature_list.h"
-#include "base/metrics/field_trial_params.h"
-
-constexpr base::Feature kFeature{"NoCompileFeature"};
-
-enum Param { FOO, BAR };
-
-#if defined(NCTEST_NO_PARAM_TYPE)  // [r"too few template arguments"]
-
-constexpr base::FeatureParam<> kParam{
-  &kFeature, "Param"};
-
-#elif defined(NCTEST_VOID_PARAM_TYPE)  // [r"unsupported FeatureParam<> type"]
-
-constexpr base::FeatureParam<void> kParam{
-  &kFeature, "Param"};
-
-#elif defined(NCTEST_INVALID_PARAM_TYPE)  // [r"unsupported FeatureParam<> type"]
-
-constexpr base::FeatureParam<size_t> kParam{
-  &kFeature, "Param", 1u};
-
-#elif defined(NCTEST_ENUM_NULL_OPTIONS)  // [r"candidate template ignored: could not match"]
-
-constexpr base::FeatureParam<Param> kParam{
-  &kFeature, "Param", FOO, nullptr};
-
-#elif defined(NCTEST_ENUM_EMPTY_OPTIONS)  // [r"zero-length arrays are not permitted"]
-
-constexpr base::FeatureParam<Param>::Option kParamOptions[] = {};
-constexpr base::FeatureParam<Param> kParam{
-  &kFeature, "Param", FOO, &kParamOptions};
-
-#else
-
-void suppress_unused_variable_warning() {
-    (void)kFeature;
-}
-
-#endif
diff --git a/base/metrics/field_trial_unittest.cc b/base/metrics/field_trial_unittest.cc
deleted file mode 100644
index 4d55697..0000000
--- a/base/metrics/field_trial_unittest.cc
+++ /dev/null
@@ -1,1400 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/field_trial.h"
-
-#include <stddef.h>
-
-#include "base/base_switches.h"
-#include "base/feature_list.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/metrics/field_trial_param_associator.h"
-#include "base/rand_util.h"
-#include "base/run_loop.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/gtest_util.h"
-#include "base/test/mock_entropy_provider.h"
-#include "base/test/scoped_feature_list.h"
-#include "base/test/test_shared_memory_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-// Default group name used by several tests.
-const char kDefaultGroupName[] = "DefaultGroup";
-
-// Call FieldTrialList::FactoryGetFieldTrial() with a future expiry date.
-scoped_refptr<FieldTrial> CreateFieldTrial(
-    const std::string& trial_name,
-    int total_probability,
-    const std::string& default_group_name,
-    int* default_group_number) {
-  return FieldTrialList::FactoryGetFieldTrial(
-      trial_name, total_probability, default_group_name,
-      FieldTrialList::kNoExpirationYear, 1, 1, FieldTrial::SESSION_RANDOMIZED,
-      default_group_number);
-}
-
-// FieldTrialList::Observer implementation for testing.
-class TestFieldTrialObserver : public FieldTrialList::Observer {
- public:
-  enum Type {
-    ASYNCHRONOUS,
-    SYNCHRONOUS,
-  };
-
-  TestFieldTrialObserver(Type type) : type_(type) {
-    if (type == SYNCHRONOUS)
-      FieldTrialList::SetSynchronousObserver(this);
-    else
-      FieldTrialList::AddObserver(this);
-  }
-
-  ~TestFieldTrialObserver() override {
-    if (type_ == SYNCHRONOUS)
-      FieldTrialList::RemoveSynchronousObserver(this);
-    else
-      FieldTrialList::RemoveObserver(this);
-  }
-
-  void OnFieldTrialGroupFinalized(const std::string& trial,
-                                  const std::string& group) override {
-    trial_name_ = trial;
-    group_name_ = group;
-  }
-
-  const std::string& trial_name() const { return trial_name_; }
-  const std::string& group_name() const { return group_name_; }
-
- private:
-  const Type type_;
-  std::string trial_name_;
-  std::string group_name_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestFieldTrialObserver);
-};
-
-std::string MockEscapeQueryParamValue(const std::string& input) {
-  return input;
-}
-
-}  // namespace
-
-class FieldTrialTest : public ::testing::Test {
- public:
-  FieldTrialTest() : trial_list_(nullptr) {}
-
- private:
-  MessageLoop message_loop_;
-  FieldTrialList trial_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(FieldTrialTest);
-};
-
-// Test registration, and also check that destructors are called for trials.
-TEST_F(FieldTrialTest, Registration) {
-  const char name1[] = "name 1 test";
-  const char name2[] = "name 2 test";
-  EXPECT_FALSE(FieldTrialList::Find(name1));
-  EXPECT_FALSE(FieldTrialList::Find(name2));
-
-  scoped_refptr<FieldTrial> trial1 =
-      CreateFieldTrial(name1, 10, "default name 1 test", nullptr);
-  EXPECT_EQ(FieldTrial::kNotFinalized, trial1->group_);
-  EXPECT_EQ(name1, trial1->trial_name());
-  EXPECT_EQ("", trial1->group_name_internal());
-
-  trial1->AppendGroup(std::string(), 7);
-
-  EXPECT_EQ(trial1.get(), FieldTrialList::Find(name1));
-  EXPECT_FALSE(FieldTrialList::Find(name2));
-
-  scoped_refptr<FieldTrial> trial2 =
-      CreateFieldTrial(name2, 10, "default name 2 test", nullptr);
-  EXPECT_EQ(FieldTrial::kNotFinalized, trial2->group_);
-  EXPECT_EQ(name2, trial2->trial_name());
-  EXPECT_EQ("", trial2->group_name_internal());
-
-  trial2->AppendGroup("a first group", 7);
-
-  EXPECT_EQ(trial1.get(), FieldTrialList::Find(name1));
-  EXPECT_EQ(trial2.get(), FieldTrialList::Find(name2));
-  // Note: FieldTrialList should delete the objects at shutdown.
-}
-
-TEST_F(FieldTrialTest, AbsoluteProbabilities) {
-  char always_true[] = " always true";
-  char default_always_true[] = " default always true";
-  char always_false[] = " always false";
-  char default_always_false[] = " default always false";
-  for (int i = 1; i < 250; ++i) {
-    // Try lots of names, by changing the first character of the name.
-    char c = static_cast<char>(i);
-    always_true[0] = c;
-    default_always_true[0] = c;
-    always_false[0] = c;
-    default_always_false[0] = c;
-
-    scoped_refptr<FieldTrial> trial_true =
-        CreateFieldTrial(always_true, 10, default_always_true, nullptr);
-    const std::string winner = "TheWinner";
-    int winner_group = trial_true->AppendGroup(winner, 10);
-
-    EXPECT_EQ(winner_group, trial_true->group());
-    EXPECT_EQ(winner, trial_true->group_name());
-
-    scoped_refptr<FieldTrial> trial_false =
-        CreateFieldTrial(always_false, 10, default_always_false, nullptr);
-    int loser_group = trial_false->AppendGroup("ALoser", 0);
-
-    EXPECT_NE(loser_group, trial_false->group());
-  }
-}
-
-TEST_F(FieldTrialTest, RemainingProbability) {
-  // First create a test that hasn't had a winner yet.
-  const std::string winner = "Winner";
-  const std::string loser = "Loser";
-  scoped_refptr<FieldTrial> trial;
-  int counter = 0;
-  int default_group_number = -1;
-  do {
-    std::string name = StringPrintf("trial%d", ++counter);
-    trial = CreateFieldTrial(name, 10, winner, &default_group_number);
-    trial->AppendGroup(loser, 5);  // 50% chance of not being chosen.
-    // If a group is not assigned, group_ will be kNotFinalized.
-  } while (trial->group_ != FieldTrial::kNotFinalized);
-
-  // And that 'default' group (winner) should always win.
-  EXPECT_EQ(default_group_number, trial->group());
-
-  // And that winner should ALWAYS win.
-  EXPECT_EQ(winner, trial->group_name());
-}
-
-TEST_F(FieldTrialTest, FiftyFiftyProbability) {
-  // Check that even with small divisors, we have the proper probabilities, and
-  // all outcomes are possible.  Since this is a 50-50 test, it should get both
-  // outcomes in a few tries, but we'll try no more than 100 times (and be flaky
-  // with probability around 1 in 2^99).
-  bool first_winner = false;
-  bool second_winner = false;
-  int counter = 0;
-  do {
-    std::string name = StringPrintf("FiftyFifty%d", ++counter);
-    std::string default_group_name =
-        StringPrintf("Default FiftyFifty%d", ++counter);
-    scoped_refptr<FieldTrial> trial =
-        CreateFieldTrial(name, 2, default_group_name, nullptr);
-    trial->AppendGroup("first", 1);  // 50% chance of being chosen.
-    // If group_ is kNotFinalized, then a group assignement hasn't been done.
-    if (trial->group_ != FieldTrial::kNotFinalized) {
-      first_winner = true;
-      continue;
-    }
-    trial->AppendGroup("second", 1);  // Always chosen at this point.
-    EXPECT_NE(FieldTrial::kNotFinalized, trial->group());
-    second_winner = true;
-  } while ((!second_winner || !first_winner) && counter < 100);
-  EXPECT_TRUE(second_winner);
-  EXPECT_TRUE(first_winner);
-}
-
-TEST_F(FieldTrialTest, MiddleProbabilities) {
-  char name[] = " same name";
-  char default_group_name[] = " default same name";
-  bool false_event_seen = false;
-  bool true_event_seen = false;
-  for (int i = 1; i < 250; ++i) {
-    char c = static_cast<char>(i);
-    name[0] = c;
-    default_group_name[0] = c;
-    scoped_refptr<FieldTrial> trial =
-        CreateFieldTrial(name, 10, default_group_name, nullptr);
-    int might_win = trial->AppendGroup("MightWin", 5);
-
-    if (trial->group() == might_win) {
-      true_event_seen = true;
-    } else {
-      false_event_seen = true;
-    }
-    if (false_event_seen && true_event_seen)
-      return;  // Successful test!!!
-  }
-  // Very surprising to get here. Probability should be around 1 in 2 ** 250.
-  // One of the following will fail.
-  EXPECT_TRUE(false_event_seen);
-  EXPECT_TRUE(true_event_seen);
-}
-
-TEST_F(FieldTrialTest, OneWinner) {
-  char name[] = "Some name";
-  char default_group_name[] = "Default some name";
-  int group_count(10);
-
-  int default_group_number = -1;
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(name, group_count, default_group_name, nullptr);
-  int winner_index(-2);
-  std::string winner_name;
-
-  for (int i = 1; i <= group_count; ++i) {
-    int might_win = trial->AppendGroup(std::string(), 1);
-
-    // Because we keep appending groups, we want to see if the last group that
-    // was added has been assigned or not.
-    if (trial->group_ == might_win) {
-      EXPECT_EQ(-2, winner_index);
-      winner_index = might_win;
-      StringAppendF(&winner_name, "%d", might_win);
-      EXPECT_EQ(winner_name, trial->group_name());
-    }
-  }
-  EXPECT_GE(winner_index, 0);
-  // Since all groups cover the total probability, we should not have
-  // chosen the default group.
-  EXPECT_NE(trial->group(), default_group_number);
-  EXPECT_EQ(trial->group(), winner_index);
-  EXPECT_EQ(trial->group_name(), winner_name);
-}
-
-TEST_F(FieldTrialTest, ActiveGroups) {
-  std::string no_group("No Group");
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(no_group, 10, "Default", nullptr);
-
-  // There is no winner yet, so no NameGroupId should be returned.
-  FieldTrial::ActiveGroup active_group;
-  EXPECT_FALSE(trial->GetActiveGroup(&active_group));
-
-  // Create a single winning group.
-  std::string one_winner("One Winner");
-  trial = CreateFieldTrial(one_winner, 10, "Default", nullptr);
-  std::string winner("Winner");
-  trial->AppendGroup(winner, 10);
-  EXPECT_FALSE(trial->GetActiveGroup(&active_group));
-  // Finalize the group selection by accessing the selected group.
-  trial->group();
-  EXPECT_TRUE(trial->GetActiveGroup(&active_group));
-  EXPECT_EQ(one_winner, active_group.trial_name);
-  EXPECT_EQ(winner, active_group.group_name);
-
-  std::string multi_group("MultiGroup");
-  scoped_refptr<FieldTrial> multi_group_trial =
-      CreateFieldTrial(multi_group, 9, "Default", nullptr);
-
-  multi_group_trial->AppendGroup("Me", 3);
-  multi_group_trial->AppendGroup("You", 3);
-  multi_group_trial->AppendGroup("Them", 3);
-  EXPECT_FALSE(multi_group_trial->GetActiveGroup(&active_group));
-  // Finalize the group selection by accessing the selected group.
-  multi_group_trial->group();
-  EXPECT_TRUE(multi_group_trial->GetActiveGroup(&active_group));
-  EXPECT_EQ(multi_group, active_group.trial_name);
-  EXPECT_EQ(multi_group_trial->group_name(), active_group.group_name);
-
-  // Now check if the list is built properly...
-  FieldTrial::ActiveGroups active_groups;
-  FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-  EXPECT_EQ(2U, active_groups.size());
-  for (size_t i = 0; i < active_groups.size(); ++i) {
-    // Order is not guaranteed, so check all values.
-    EXPECT_NE(no_group, active_groups[i].trial_name);
-    EXPECT_TRUE(one_winner != active_groups[i].trial_name ||
-                winner == active_groups[i].group_name);
-    EXPECT_TRUE(multi_group != active_groups[i].trial_name ||
-                multi_group_trial->group_name() == active_groups[i].group_name);
-  }
-}
-
-TEST_F(FieldTrialTest, GetActiveFieldTrialGroupsFromString) {
-  FieldTrial::ActiveGroups active_groups;
-  FieldTrialList::GetActiveFieldTrialGroupsFromString("*A/X/B/Y/*C/Z",
-                                                      &active_groups);
-  ASSERT_EQ(2U, active_groups.size());
-  EXPECT_EQ("A", active_groups[0].trial_name);
-  EXPECT_EQ("X", active_groups[0].group_name);
-  EXPECT_EQ("C", active_groups[1].trial_name);
-  EXPECT_EQ("Z", active_groups[1].group_name);
-}
-
-TEST_F(FieldTrialTest, ActiveGroupsNotFinalized) {
-  const char kTrialName[] = "TestTrial";
-  const char kSecondaryGroupName[] = "SecondaryGroup";
-
-  int default_group = -1;
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group);
-  const int secondary_group = trial->AppendGroup(kSecondaryGroupName, 50);
-
-  // Before |group()| is called, |GetActiveGroup()| should return false.
-  FieldTrial::ActiveGroup active_group;
-  EXPECT_FALSE(trial->GetActiveGroup(&active_group));
-
-  // |GetActiveFieldTrialGroups()| should also not include the trial.
-  FieldTrial::ActiveGroups active_groups;
-  FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-  EXPECT_TRUE(active_groups.empty());
-
-  // After |group()| has been called, both APIs should succeed.
-  const int chosen_group = trial->group();
-  EXPECT_TRUE(chosen_group == default_group || chosen_group == secondary_group);
-
-  EXPECT_TRUE(trial->GetActiveGroup(&active_group));
-  EXPECT_EQ(kTrialName, active_group.trial_name);
-  if (chosen_group == default_group)
-    EXPECT_EQ(kDefaultGroupName, active_group.group_name);
-  else
-    EXPECT_EQ(kSecondaryGroupName, active_group.group_name);
-
-  FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-  ASSERT_EQ(1U, active_groups.size());
-  EXPECT_EQ(kTrialName, active_groups[0].trial_name);
-  EXPECT_EQ(active_group.group_name, active_groups[0].group_name);
-}
-
-TEST_F(FieldTrialTest, GetGroupNameWithoutActivation) {
-  const char kTrialName[] = "TestTrial";
-  const char kSecondaryGroupName[] = "SecondaryGroup";
-
-  int default_group = -1;
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group);
-  trial->AppendGroup(kSecondaryGroupName, 50);
-
-  // The trial should start inactive.
-  EXPECT_FALSE(FieldTrialList::IsTrialActive(kTrialName));
-
-  // Calling |GetGroupNameWithoutActivation()| should not activate the trial.
-  std::string group_name = trial->GetGroupNameWithoutActivation();
-  EXPECT_FALSE(group_name.empty());
-  EXPECT_FALSE(FieldTrialList::IsTrialActive(kTrialName));
-
-  // Calling |group_name()| should activate it and return the same group name.
-  EXPECT_EQ(group_name, trial->group_name());
-  EXPECT_TRUE(FieldTrialList::IsTrialActive(kTrialName));
-}
-
-TEST_F(FieldTrialTest, Save) {
-  std::string save_string;
-
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial("Some name", 10, "Default some name", nullptr);
-  // There is no winner yet, so no textual group name is associated with trial.
-  // In this case, the trial should not be included.
-  EXPECT_EQ("", trial->group_name_internal());
-  FieldTrialList::StatesToString(&save_string);
-  EXPECT_EQ("", save_string);
-  save_string.clear();
-
-  // Create a winning group.
-  trial->AppendGroup("Winner", 10);
-  // Finalize the group selection by accessing the selected group.
-  trial->group();
-  FieldTrialList::StatesToString(&save_string);
-  EXPECT_EQ("Some name/Winner/", save_string);
-  save_string.clear();
-
-  // Create a second trial and winning group.
-  scoped_refptr<FieldTrial> trial2 =
-      CreateFieldTrial("xxx", 10, "Default xxx", nullptr);
-  trial2->AppendGroup("yyyy", 10);
-  // Finalize the group selection by accessing the selected group.
-  trial2->group();
-
-  FieldTrialList::StatesToString(&save_string);
-  // We assume names are alphabetized... though this is not critical.
-  EXPECT_EQ("Some name/Winner/xxx/yyyy/", save_string);
-  save_string.clear();
-
-  // Create a third trial with only the default group.
-  scoped_refptr<FieldTrial> trial3 =
-      CreateFieldTrial("zzz", 10, "default", nullptr);
-  // Finalize the group selection by accessing the selected group.
-  trial3->group();
-
-  FieldTrialList::StatesToString(&save_string);
-  EXPECT_EQ("Some name/Winner/xxx/yyyy/zzz/default/", save_string);
-}
-
-TEST_F(FieldTrialTest, Restore) {
-  ASSERT_FALSE(FieldTrialList::TrialExists("Some_name"));
-  ASSERT_FALSE(FieldTrialList::TrialExists("xxx"));
-
-  FieldTrialList::CreateTrialsFromString("Some_name/Winner/xxx/yyyy/",
-                                         std::set<std::string>());
-
-  FieldTrial* trial = FieldTrialList::Find("Some_name");
-  ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
-  EXPECT_EQ("Winner", trial->group_name());
-  EXPECT_EQ("Some_name", trial->trial_name());
-
-  trial = FieldTrialList::Find("xxx");
-  ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
-  EXPECT_EQ("yyyy", trial->group_name());
-  EXPECT_EQ("xxx", trial->trial_name());
-}
-
-TEST_F(FieldTrialTest, RestoreNotEndingWithSlash) {
-  EXPECT_TRUE(FieldTrialList::CreateTrialsFromString("tname/gname",
-                                                     std::set<std::string>()));
-
-  FieldTrial* trial = FieldTrialList::Find("tname");
-  ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
-  EXPECT_EQ("gname", trial->group_name());
-  EXPECT_EQ("tname", trial->trial_name());
-}
-
-TEST_F(FieldTrialTest, BogusRestore) {
-  EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("MissingSlash",
-                                                      std::set<std::string>()));
-  EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("MissingGroupName/",
-                                                      std::set<std::string>()));
-  EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("noname, only group/",
-                                                      std::set<std::string>()));
-  EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("/emptyname",
-                                                      std::set<std::string>()));
-  EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("*/emptyname",
-                                                      std::set<std::string>()));
-}
-
-TEST_F(FieldTrialTest, DuplicateRestore) {
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial("Some name", 10, "Default", nullptr);
-  trial->AppendGroup("Winner", 10);
-  // Finalize the group selection by accessing the selected group.
-  trial->group();
-  std::string save_string;
-  FieldTrialList::StatesToString(&save_string);
-  EXPECT_EQ("Some name/Winner/", save_string);
-
-  // It is OK if we redundantly specify a winner.
-  EXPECT_TRUE(FieldTrialList::CreateTrialsFromString(save_string,
-                                                     std::set<std::string>()));
-
-  // But it is an error to try to change to a different winner.
-  EXPECT_FALSE(FieldTrialList::CreateTrialsFromString("Some name/Loser/",
-                                                      std::set<std::string>()));
-}
-
-TEST_F(FieldTrialTest, CreateTrialsFromStringNotActive) {
-  ASSERT_FALSE(FieldTrialList::TrialExists("Abc"));
-  ASSERT_FALSE(FieldTrialList::TrialExists("Xyz"));
-  ASSERT_TRUE(FieldTrialList::CreateTrialsFromString("Abc/def/Xyz/zyx/",
-                                                     std::set<std::string>()));
-
-  FieldTrial::ActiveGroups active_groups;
-  FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-  ASSERT_TRUE(active_groups.empty());
-
-  // Check that the values still get returned and querying them activates them.
-  EXPECT_EQ("def", FieldTrialList::FindFullName("Abc"));
-  EXPECT_EQ("zyx", FieldTrialList::FindFullName("Xyz"));
-
-  FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-  ASSERT_EQ(2U, active_groups.size());
-  EXPECT_EQ("Abc", active_groups[0].trial_name);
-  EXPECT_EQ("def", active_groups[0].group_name);
-  EXPECT_EQ("Xyz", active_groups[1].trial_name);
-  EXPECT_EQ("zyx", active_groups[1].group_name);
-}
-
-TEST_F(FieldTrialTest, CreateTrialsFromStringForceActivation) {
-  ASSERT_FALSE(FieldTrialList::TrialExists("Abc"));
-  ASSERT_FALSE(FieldTrialList::TrialExists("def"));
-  ASSERT_FALSE(FieldTrialList::TrialExists("Xyz"));
-  ASSERT_TRUE(FieldTrialList::CreateTrialsFromString(
-      "*Abc/cba/def/fed/*Xyz/zyx/", std::set<std::string>()));
-
-  FieldTrial::ActiveGroups active_groups;
-  FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-  ASSERT_EQ(2U, active_groups.size());
-  EXPECT_EQ("Abc", active_groups[0].trial_name);
-  EXPECT_EQ("cba", active_groups[0].group_name);
-  EXPECT_EQ("Xyz", active_groups[1].trial_name);
-  EXPECT_EQ("zyx", active_groups[1].group_name);
-}
-
-TEST_F(FieldTrialTest, CreateTrialsFromStringNotActiveObserver) {
-  ASSERT_FALSE(FieldTrialList::TrialExists("Abc"));
-
-  TestFieldTrialObserver observer(TestFieldTrialObserver::ASYNCHRONOUS);
-  ASSERT_TRUE(FieldTrialList::CreateTrialsFromString("Abc/def/",
-                                                     std::set<std::string>()));
-  RunLoop().RunUntilIdle();
-  // Observer shouldn't be notified.
-  EXPECT_TRUE(observer.trial_name().empty());
-
-  // Check that the values still get returned and querying them activates them.
-  EXPECT_EQ("def", FieldTrialList::FindFullName("Abc"));
-
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ("Abc", observer.trial_name());
-  EXPECT_EQ("def", observer.group_name());
-}
-
-TEST_F(FieldTrialTest, CreateTrialsFromStringWithIgnoredFieldTrials) {
-  ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted1"));
-  ASSERT_FALSE(FieldTrialList::TrialExists("Foo"));
-  ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted2"));
-  ASSERT_FALSE(FieldTrialList::TrialExists("Bar"));
-  ASSERT_FALSE(FieldTrialList::TrialExists("Unaccepted3"));
-
-  std::set<std::string> ignored_trial_names;
-  ignored_trial_names.insert("Unaccepted1");
-  ignored_trial_names.insert("Unaccepted2");
-  ignored_trial_names.insert("Unaccepted3");
-
-  FieldTrialList::CreateTrialsFromString(
-      "Unaccepted1/Unaccepted1_name/"
-      "Foo/Foo_name/"
-      "Unaccepted2/Unaccepted2_name/"
-      "Bar/Bar_name/"
-      "Unaccepted3/Unaccepted3_name/",
-      ignored_trial_names);
-
-  EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted1"));
-  EXPECT_TRUE(FieldTrialList::TrialExists("Foo"));
-  EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted2"));
-  EXPECT_TRUE(FieldTrialList::TrialExists("Bar"));
-  EXPECT_FALSE(FieldTrialList::TrialExists("Unaccepted3"));
-
-  FieldTrial::ActiveGroups active_groups;
-  FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-  EXPECT_TRUE(active_groups.empty());
-
-  FieldTrial* trial = FieldTrialList::Find("Foo");
-  ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
-  EXPECT_EQ("Foo", trial->trial_name());
-  EXPECT_EQ("Foo_name", trial->group_name());
-
-  trial = FieldTrialList::Find("Bar");
-  ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
-  EXPECT_EQ("Bar", trial->trial_name());
-  EXPECT_EQ("Bar_name", trial->group_name());
-}
-
-TEST_F(FieldTrialTest, CreateFieldTrial) {
-  ASSERT_FALSE(FieldTrialList::TrialExists("Some_name"));
-
-  FieldTrialList::CreateFieldTrial("Some_name", "Winner");
-
-  FieldTrial* trial = FieldTrialList::Find("Some_name");
-  ASSERT_NE(static_cast<FieldTrial*>(nullptr), trial);
-  EXPECT_EQ("Winner", trial->group_name());
-  EXPECT_EQ("Some_name", trial->trial_name());
-}
-
-TEST_F(FieldTrialTest, CreateFieldTrialIsNotActive) {
-  const char kTrialName[] = "CreateFieldTrialIsActiveTrial";
-  const char kWinnerGroup[] = "Winner";
-  ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName));
-  FieldTrialList::CreateFieldTrial(kTrialName, kWinnerGroup);
-
-  FieldTrial::ActiveGroups active_groups;
-  FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-  EXPECT_TRUE(active_groups.empty());
-}
-
-TEST_F(FieldTrialTest, DuplicateFieldTrial) {
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial("Some_name", 10, "Default", nullptr);
-  trial->AppendGroup("Winner", 10);
-
-  // It is OK if we redundantly specify a winner.
-  FieldTrial* trial1 = FieldTrialList::CreateFieldTrial("Some_name", "Winner");
-  EXPECT_TRUE(trial1 != nullptr);
-
-  // But it is an error to try to change to a different winner.
-  FieldTrial* trial2 = FieldTrialList::CreateFieldTrial("Some_name", "Loser");
-  EXPECT_TRUE(trial2 == nullptr);
-}
-
-TEST_F(FieldTrialTest, DisableImmediately) {
-  int default_group_number = -1;
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial("trial", 100, "default", &default_group_number);
-  trial->Disable();
-  ASSERT_EQ("default", trial->group_name());
-  ASSERT_EQ(default_group_number, trial->group());
-}
-
-TEST_F(FieldTrialTest, DisableAfterInitialization) {
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial("trial", 100, "default", nullptr);
-  trial->AppendGroup("non_default", 100);
-  trial->Disable();
-  ASSERT_EQ("default", trial->group_name());
-}
-
-TEST_F(FieldTrialTest, ForcedFieldTrials) {
-  // Validate we keep the forced choice.
-  FieldTrial* forced_trial = FieldTrialList::CreateFieldTrial("Use the",
-                                                              "Force");
-  EXPECT_STREQ("Force", forced_trial->group_name().c_str());
-
-  int default_group_number = -1;
-  scoped_refptr<FieldTrial> factory_trial =
-      CreateFieldTrial("Use the", 1000, "default", &default_group_number);
-  EXPECT_EQ(factory_trial.get(), forced_trial);
-
-  int chosen_group = factory_trial->AppendGroup("Force", 100);
-  EXPECT_EQ(chosen_group, factory_trial->group());
-  int not_chosen_group = factory_trial->AppendGroup("Dark Side", 100);
-  EXPECT_NE(chosen_group, not_chosen_group);
-
-  // Since we didn't force the default group, we should not be returned the
-  // chosen group as the default group.
-  EXPECT_NE(default_group_number, chosen_group);
-  int new_group = factory_trial->AppendGroup("Duck Tape", 800);
-  EXPECT_NE(chosen_group, new_group);
-  // The new group should not be the default group either.
-  EXPECT_NE(default_group_number, new_group);
-}
-
-TEST_F(FieldTrialTest, ForcedFieldTrialsDefaultGroup) {
-  // Forcing the default should use the proper group ID.
-  FieldTrial* forced_trial = FieldTrialList::CreateFieldTrial("Trial Name",
-                                                              "Default");
-  int default_group_number = -1;
-  scoped_refptr<FieldTrial> factory_trial =
-      CreateFieldTrial("Trial Name", 1000, "Default", &default_group_number);
-  EXPECT_EQ(forced_trial, factory_trial.get());
-
-  int other_group = factory_trial->AppendGroup("Not Default", 100);
-  EXPECT_STREQ("Default", factory_trial->group_name().c_str());
-  EXPECT_EQ(default_group_number, factory_trial->group());
-  EXPECT_NE(other_group, factory_trial->group());
-
-  int new_other_group = factory_trial->AppendGroup("Not Default Either", 800);
-  EXPECT_NE(new_other_group, factory_trial->group());
-}
-
-TEST_F(FieldTrialTest, SetForced) {
-  // Start by setting a trial for which we ensure a winner...
-  int default_group_number = -1;
-  scoped_refptr<FieldTrial> forced_trial =
-      CreateFieldTrial("Use the", 1, "default", &default_group_number);
-  EXPECT_EQ(forced_trial, forced_trial);
-
-  int forced_group = forced_trial->AppendGroup("Force", 1);
-  EXPECT_EQ(forced_group, forced_trial->group());
-
-  // Now force it.
-  forced_trial->SetForced();
-
-  // Now try to set it up differently as a hard coded registration would.
-  scoped_refptr<FieldTrial> hard_coded_trial =
-      CreateFieldTrial("Use the", 1, "default", &default_group_number);
-  EXPECT_EQ(hard_coded_trial, forced_trial);
-
-  int would_lose_group = hard_coded_trial->AppendGroup("Force", 0);
-  EXPECT_EQ(forced_group, hard_coded_trial->group());
-  EXPECT_EQ(forced_group, would_lose_group);
-
-  // Same thing if we would have done it to win again.
-  scoped_refptr<FieldTrial> other_hard_coded_trial =
-      CreateFieldTrial("Use the", 1, "default", &default_group_number);
-  EXPECT_EQ(other_hard_coded_trial, forced_trial);
-
-  int would_win_group = other_hard_coded_trial->AppendGroup("Force", 1);
-  EXPECT_EQ(forced_group, other_hard_coded_trial->group());
-  EXPECT_EQ(forced_group, would_win_group);
-}
-
-TEST_F(FieldTrialTest, SetForcedDefaultOnly) {
-  const char kTrialName[] = "SetForcedDefaultOnly";
-  ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName));
-
-  int default_group = -1;
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group);
-  trial->SetForced();
-
-  trial = CreateFieldTrial(kTrialName, 100, kDefaultGroupName, nullptr);
-  EXPECT_EQ(default_group, trial->group());
-  EXPECT_EQ(kDefaultGroupName, trial->group_name());
-}
-
-TEST_F(FieldTrialTest, SetForcedDefaultWithExtraGroup) {
-  const char kTrialName[] = "SetForcedDefaultWithExtraGroup";
-  ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName));
-
-  int default_group = -1;
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group);
-  trial->SetForced();
-
-  trial = CreateFieldTrial(kTrialName, 100, kDefaultGroupName, nullptr);
-  const int extra_group = trial->AppendGroup("Extra", 100);
-  EXPECT_EQ(default_group, trial->group());
-  EXPECT_NE(extra_group, trial->group());
-  EXPECT_EQ(kDefaultGroupName, trial->group_name());
-}
-
-TEST_F(FieldTrialTest, SetForcedTurnFeatureOn) {
-  const char kTrialName[] = "SetForcedTurnFeatureOn";
-  const char kExtraGroupName[] = "Extra";
-  ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName));
-
-  // Simulate a server-side (forced) config that turns the feature on when the
-  // original hard-coded config had it disabled.
-  scoped_refptr<FieldTrial> forced_trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, nullptr);
-  forced_trial->AppendGroup(kExtraGroupName, 100);
-  forced_trial->SetForced();
-
-  int default_group = -1;
-  scoped_refptr<FieldTrial> client_trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group);
-  const int extra_group = client_trial->AppendGroup(kExtraGroupName, 0);
-  EXPECT_NE(default_group, extra_group);
-
-  EXPECT_FALSE(client_trial->group_reported_);
-  EXPECT_EQ(extra_group, client_trial->group());
-  EXPECT_TRUE(client_trial->group_reported_);
-  EXPECT_EQ(kExtraGroupName, client_trial->group_name());
-}
-
-TEST_F(FieldTrialTest, SetForcedTurnFeatureOff) {
-  const char kTrialName[] = "SetForcedTurnFeatureOff";
-  const char kExtraGroupName[] = "Extra";
-  ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName));
-
-  // Simulate a server-side (forced) config that turns the feature off when the
-  // original hard-coded config had it enabled.
-  scoped_refptr<FieldTrial> forced_trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, nullptr);
-  forced_trial->AppendGroup(kExtraGroupName, 0);
-  forced_trial->SetForced();
-
-  int default_group = -1;
-  scoped_refptr<FieldTrial> client_trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group);
-  const int extra_group = client_trial->AppendGroup(kExtraGroupName, 100);
-  EXPECT_NE(default_group, extra_group);
-
-  EXPECT_FALSE(client_trial->group_reported_);
-  EXPECT_EQ(default_group, client_trial->group());
-  EXPECT_TRUE(client_trial->group_reported_);
-  EXPECT_EQ(kDefaultGroupName, client_trial->group_name());
-}
-
-TEST_F(FieldTrialTest, SetForcedChangeDefault_Default) {
-  const char kTrialName[] = "SetForcedDefaultGroupChange";
-  const char kGroupAName[] = "A";
-  const char kGroupBName[] = "B";
-  ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName));
-
-  // Simulate a server-side (forced) config that switches which group is default
-  // and ensures that the non-forced code receives the correct group numbers.
-  scoped_refptr<FieldTrial> forced_trial =
-      CreateFieldTrial(kTrialName, 100, kGroupAName, nullptr);
-  forced_trial->AppendGroup(kGroupBName, 100);
-  forced_trial->SetForced();
-
-  int default_group = -1;
-  scoped_refptr<FieldTrial> client_trial =
-      CreateFieldTrial(kTrialName, 100, kGroupBName, &default_group);
-  const int extra_group = client_trial->AppendGroup(kGroupAName, 50);
-  EXPECT_NE(default_group, extra_group);
-
-  EXPECT_FALSE(client_trial->group_reported_);
-  EXPECT_EQ(default_group, client_trial->group());
-  EXPECT_TRUE(client_trial->group_reported_);
-  EXPECT_EQ(kGroupBName, client_trial->group_name());
-}
-
-TEST_F(FieldTrialTest, SetForcedChangeDefault_NonDefault) {
-  const char kTrialName[] = "SetForcedDefaultGroupChange";
-  const char kGroupAName[] = "A";
-  const char kGroupBName[] = "B";
-  ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName));
-
-  // Simulate a server-side (forced) config that switches which group is default
-  // and ensures that the non-forced code receives the correct group numbers.
-  scoped_refptr<FieldTrial> forced_trial =
-      CreateFieldTrial(kTrialName, 100, kGroupAName, nullptr);
-  forced_trial->AppendGroup(kGroupBName, 0);
-  forced_trial->SetForced();
-
-  int default_group = -1;
-  scoped_refptr<FieldTrial> client_trial =
-      CreateFieldTrial(kTrialName, 100, kGroupBName, &default_group);
-  const int extra_group = client_trial->AppendGroup(kGroupAName, 50);
-  EXPECT_NE(default_group, extra_group);
-
-  EXPECT_FALSE(client_trial->group_reported_);
-  EXPECT_EQ(extra_group, client_trial->group());
-  EXPECT_TRUE(client_trial->group_reported_);
-  EXPECT_EQ(kGroupAName, client_trial->group_name());
-}
-
-TEST_F(FieldTrialTest, Observe) {
-  const char kTrialName[] = "TrialToObserve1";
-  const char kSecondaryGroupName[] = "SecondaryGroup";
-
-  TestFieldTrialObserver observer(TestFieldTrialObserver::ASYNCHRONOUS);
-  int default_group = -1;
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group);
-  const int secondary_group = trial->AppendGroup(kSecondaryGroupName, 50);
-  const int chosen_group = trial->group();
-  EXPECT_TRUE(chosen_group == default_group || chosen_group == secondary_group);
-
-  // Observers are called asynchronously.
-  EXPECT_TRUE(observer.trial_name().empty());
-  EXPECT_TRUE(observer.group_name().empty());
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(kTrialName, observer.trial_name());
-  if (chosen_group == default_group)
-    EXPECT_EQ(kDefaultGroupName, observer.group_name());
-  else
-    EXPECT_EQ(kSecondaryGroupName, observer.group_name());
-}
-
-TEST_F(FieldTrialTest, SynchronousObserver) {
-  const char kTrialName[] = "TrialToObserve1";
-  const char kSecondaryGroupName[] = "SecondaryGroup";
-
-  TestFieldTrialObserver observer(TestFieldTrialObserver::SYNCHRONOUS);
-  int default_group = -1;
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group);
-  const int secondary_group = trial->AppendGroup(kSecondaryGroupName, 50);
-  const int chosen_group = trial->group();
-  EXPECT_TRUE(chosen_group == default_group || chosen_group == secondary_group);
-
-  // The observer should be notified synchronously by the group() call.
-  EXPECT_EQ(kTrialName, observer.trial_name());
-  if (chosen_group == default_group)
-    EXPECT_EQ(kDefaultGroupName, observer.group_name());
-  else
-    EXPECT_EQ(kSecondaryGroupName, observer.group_name());
-}
-
-TEST_F(FieldTrialTest, ObserveDisabled) {
-  const char kTrialName[] = "TrialToObserve2";
-
-  TestFieldTrialObserver observer(TestFieldTrialObserver::ASYNCHRONOUS);
-  int default_group = -1;
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group);
-  trial->AppendGroup("A", 25);
-  trial->AppendGroup("B", 25);
-  trial->AppendGroup("C", 25);
-  trial->Disable();
-
-  // Observer shouldn't be notified of a disabled trial.
-  RunLoop().RunUntilIdle();
-  EXPECT_TRUE(observer.trial_name().empty());
-  EXPECT_TRUE(observer.group_name().empty());
-
-  // Observer shouldn't be notified even after a |group()| call.
-  EXPECT_EQ(default_group, trial->group());
-  RunLoop().RunUntilIdle();
-  EXPECT_TRUE(observer.trial_name().empty());
-  EXPECT_TRUE(observer.group_name().empty());
-}
-
-TEST_F(FieldTrialTest, ObserveForcedDisabled) {
-  const char kTrialName[] = "TrialToObserve3";
-
-  TestFieldTrialObserver observer(TestFieldTrialObserver::ASYNCHRONOUS);
-  int default_group = -1;
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, &default_group);
-  trial->AppendGroup("A", 25);
-  trial->AppendGroup("B", 25);
-  trial->AppendGroup("C", 25);
-  trial->SetForced();
-  trial->Disable();
-
-  // Observer shouldn't be notified of a disabled trial, even when forced.
-  RunLoop().RunUntilIdle();
-  EXPECT_TRUE(observer.trial_name().empty());
-  EXPECT_TRUE(observer.group_name().empty());
-
-  // Observer shouldn't be notified even after a |group()| call.
-  EXPECT_EQ(default_group, trial->group());
-  RunLoop().RunUntilIdle();
-  EXPECT_TRUE(observer.trial_name().empty());
-  EXPECT_TRUE(observer.group_name().empty());
-}
-
-TEST_F(FieldTrialTest, DisabledTrialNotActive) {
-  const char kTrialName[] = "DisabledTrial";
-  ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName));
-
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(kTrialName, 100, kDefaultGroupName, nullptr);
-  trial->AppendGroup("X", 50);
-  trial->Disable();
-
-  // Ensure the trial is not listed as active.
-  FieldTrial::ActiveGroups active_groups;
-  FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-  EXPECT_TRUE(active_groups.empty());
-
-  // Ensure the trial is not listed in the |StatesToString()| result.
-  std::string states;
-  FieldTrialList::StatesToString(&states);
-  EXPECT_TRUE(states.empty());
-}
-
-TEST_F(FieldTrialTest, ExpirationYearNotExpired) {
-  const char kTrialName[] = "NotExpired";
-  const char kGroupName[] = "Group2";
-  const int kProbability = 100;
-  ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName));
-
-  scoped_refptr<FieldTrial> trial =
-      CreateFieldTrial(kTrialName, kProbability, kDefaultGroupName, nullptr);
-  trial->AppendGroup(kGroupName, kProbability);
-  EXPECT_EQ(kGroupName, trial->group_name());
-}
-
-TEST_F(FieldTrialTest, FloatBoundariesGiveEqualGroupSizes) {
-  const int kBucketCount = 100;
-
-  // Try each boundary value |i / 100.0| as the entropy value.
-  for (int i = 0; i < kBucketCount; ++i) {
-    const double entropy = i / static_cast<double>(kBucketCount);
-
-    scoped_refptr<FieldTrial> trial(
-        new FieldTrial("test", kBucketCount, "default", entropy));
-    for (int j = 0; j < kBucketCount; ++j)
-      trial->AppendGroup(IntToString(j), 1);
-
-    EXPECT_EQ(IntToString(i), trial->group_name());
-  }
-}
-
-TEST_F(FieldTrialTest, DoesNotSurpassTotalProbability) {
-  const double kEntropyValue = 1.0 - 1e-9;
-  ASSERT_LT(kEntropyValue, 1.0);
-
-  scoped_refptr<FieldTrial> trial(
-      new FieldTrial("test", 2, "default", kEntropyValue));
-  trial->AppendGroup("1", 1);
-  trial->AppendGroup("2", 1);
-
-  EXPECT_EQ("2", trial->group_name());
-}
-
-TEST_F(FieldTrialTest, CreateSimulatedFieldTrial) {
-  const char kTrialName[] = "CreateSimulatedFieldTrial";
-  ASSERT_FALSE(FieldTrialList::TrialExists(kTrialName));
-
-  // Different cases to test, e.g. default vs. non default group being chosen.
-  struct {
-    double entropy_value;
-    const char* expected_group;
-  } test_cases[] = {
-    { 0.4, "A" },
-    { 0.85, "B" },
-    { 0.95, kDefaultGroupName },
-  };
-
-  for (size_t i = 0; i < arraysize(test_cases); ++i) {
-    TestFieldTrialObserver observer(TestFieldTrialObserver::ASYNCHRONOUS);
-    scoped_refptr<FieldTrial> trial(
-       FieldTrial::CreateSimulatedFieldTrial(kTrialName, 100, kDefaultGroupName,
-                                             test_cases[i].entropy_value));
-    trial->AppendGroup("A", 80);
-    trial->AppendGroup("B", 10);
-    EXPECT_EQ(test_cases[i].expected_group, trial->group_name());
-
-    // Field trial shouldn't have been registered with the list.
-    EXPECT_FALSE(FieldTrialList::TrialExists(kTrialName));
-    EXPECT_EQ(0u, FieldTrialList::GetFieldTrialCount());
-
-    // Observer shouldn't have been notified.
-    RunLoop().RunUntilIdle();
-    EXPECT_TRUE(observer.trial_name().empty());
-
-    // The trial shouldn't be in the active set of trials.
-    FieldTrial::ActiveGroups active_groups;
-    FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-    EXPECT_TRUE(active_groups.empty());
-
-    // The trial shouldn't be listed in the |StatesToString()| result.
-    std::string states;
-    FieldTrialList::StatesToString(&states);
-    EXPECT_TRUE(states.empty());
-  }
-}
-
-TEST(FieldTrialTestWithoutList, StatesStringFormat) {
-  std::string save_string;
-
-  // Scoping the first FieldTrialList, as we need another one to test the
-  // importing function.
-  {
-    FieldTrialList field_trial_list(nullptr);
-    scoped_refptr<FieldTrial> trial =
-        CreateFieldTrial("Abc", 10, "Default some name", nullptr);
-    trial->AppendGroup("cba", 10);
-    trial->group();
-    scoped_refptr<FieldTrial> trial2 =
-        CreateFieldTrial("Xyz", 10, "Default xxx", nullptr);
-    trial2->AppendGroup("zyx", 10);
-    trial2->group();
-    scoped_refptr<FieldTrial> trial3 =
-        CreateFieldTrial("zzz", 10, "default", nullptr);
-
-    FieldTrialList::AllStatesToString(&save_string, false);
-  }
-
-  // Starting with a new blank FieldTrialList.
-  FieldTrialList field_trial_list(nullptr);
-  ASSERT_TRUE(field_trial_list.CreateTrialsFromString(save_string,
-                                                      std::set<std::string>()));
-
-  FieldTrial::ActiveGroups active_groups;
-  field_trial_list.GetActiveFieldTrialGroups(&active_groups);
-  ASSERT_EQ(2U, active_groups.size());
-  EXPECT_EQ("Abc", active_groups[0].trial_name);
-  EXPECT_EQ("cba", active_groups[0].group_name);
-  EXPECT_EQ("Xyz", active_groups[1].trial_name);
-  EXPECT_EQ("zyx", active_groups[1].group_name);
-  EXPECT_TRUE(field_trial_list.TrialExists("zzz"));
-}
-
-TEST(FieldTrialDeathTest, OneTimeRandomizedTrialWithoutFieldTrialList) {
-  // Trying to instantiate a one-time randomized field trial before the
-  // FieldTrialList is created should crash.
-  EXPECT_DEATH_IF_SUPPORTED(
-      FieldTrialList::FactoryGetFieldTrial(
-          "OneTimeRandomizedTrialWithoutFieldTrialList", 100, kDefaultGroupName,
-          FieldTrialList::kNoExpirationYear, 1, 1,
-          FieldTrial::ONE_TIME_RANDOMIZED, nullptr),
-      "");
-}
-
-TEST(FieldTrialListTest, TestCopyFieldTrialStateToFlags) {
-  constexpr char kFieldTrialHandleSwitch[] = "test-field-trial-handle";
-  constexpr char kEnableFeaturesSwitch[] = "test-enable-features";
-  constexpr char kDisableFeaturesSwitch[] = "test-disable-features";
-
-  FieldTrialList field_trial_list(std::make_unique<MockEntropyProvider>());
-
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-  feature_list->InitializeFromCommandLine("A,B", "C");
-
-  FieldTrial* trial = FieldTrialList::CreateFieldTrial("Trial1", "Group1");
-  feature_list->RegisterFieldTrialOverride(
-      "MyFeature", FeatureList::OVERRIDE_ENABLE_FEATURE, trial);
-
-  test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatureList(std::move(feature_list));
-
-  FilePath test_file_path = FilePath(FILE_PATH_LITERAL("Program"));
-  CommandLine command_line = CommandLine(test_file_path);
-
-  FieldTrialList::CopyFieldTrialStateToFlags(
-      kFieldTrialHandleSwitch, kEnableFeaturesSwitch, kDisableFeaturesSwitch,
-      &command_line);
-  EXPECT_TRUE(command_line.HasSwitch(kFieldTrialHandleSwitch));
-
-  // Explictly specified enabled/disabled features should be specified.
-  EXPECT_EQ("A,B", command_line.GetSwitchValueASCII(kEnableFeaturesSwitch));
-  EXPECT_EQ("C", command_line.GetSwitchValueASCII(kDisableFeaturesSwitch));
-}
-
-TEST(FieldTrialListTest, InstantiateAllocator) {
-  test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.Init();
-
-  FieldTrialList field_trial_list(nullptr);
-  FieldTrialList::CreateFieldTrial("Trial1", "Group1");
-
-  FieldTrialList::InstantiateFieldTrialAllocatorIfNeeded();
-  void* memory = field_trial_list.field_trial_allocator_->shared_memory();
-  size_t used = field_trial_list.field_trial_allocator_->used();
-
-  // Ensure that the function is idempotent.
-  FieldTrialList::InstantiateFieldTrialAllocatorIfNeeded();
-  void* new_memory = field_trial_list.field_trial_allocator_->shared_memory();
-  size_t new_used = field_trial_list.field_trial_allocator_->used();
-  EXPECT_EQ(memory, new_memory);
-  EXPECT_EQ(used, new_used);
-}
-
-TEST(FieldTrialListTest, AddTrialsToAllocator) {
-  std::string save_string;
-  SharedMemoryHandle handle;
-
-  // Scoping the first FieldTrialList, as we need another one to test that it
-  // matches.
-  {
-    test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.Init();
-
-    FieldTrialList field_trial_list(nullptr);
-    FieldTrialList::CreateFieldTrial("Trial1", "Group1");
-    FieldTrialList::InstantiateFieldTrialAllocatorIfNeeded();
-    FieldTrialList::AllStatesToString(&save_string, false);
-    handle = SharedMemory::DuplicateHandle(
-        field_trial_list.field_trial_allocator_->shared_memory()->handle());
-  }
-
-  FieldTrialList field_trial_list2(nullptr);
-  std::unique_ptr<SharedMemory> shm(new SharedMemory(handle, true));
-  // 4 KiB is enough to hold the trials only created for this test.
-  shm.get()->Map(4 << 10);
-  FieldTrialList::CreateTrialsFromSharedMemory(std::move(shm));
-  std::string check_string;
-  FieldTrialList::AllStatesToString(&check_string, false);
-  EXPECT_EQ(save_string, check_string);
-}
-
-TEST(FieldTrialListTest, DoNotAddSimulatedFieldTrialsToAllocator) {
-  constexpr char kTrialName[] = "trial";
-  SharedMemoryHandle handle;
-  {
-    test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.Init();
-
-    // Create a simulated trial and a real trial and call group() on them, which
-    // should only add the real trial to the field trial allocator.
-    FieldTrialList field_trial_list(nullptr);
-    FieldTrialList::InstantiateFieldTrialAllocatorIfNeeded();
-
-    // This shouldn't add to the allocator.
-    scoped_refptr<FieldTrial> simulated_trial =
-        FieldTrial::CreateSimulatedFieldTrial(kTrialName, 100, "Simulated",
-                                              0.95);
-    simulated_trial->group();
-
-    // This should add to the allocator.
-    FieldTrial* real_trial =
-        FieldTrialList::CreateFieldTrial(kTrialName, "Real");
-    real_trial->group();
-
-    handle = SharedMemory::DuplicateHandle(
-        field_trial_list.field_trial_allocator_->shared_memory()->handle());
-  }
-
-  // Check that there's only one entry in the allocator.
-  FieldTrialList field_trial_list2(nullptr);
-  std::unique_ptr<SharedMemory> shm(new SharedMemory(handle, true));
-  // 4 KiB is enough to hold the trials only created for this test.
-  shm.get()->Map(4 << 10);
-  FieldTrialList::CreateTrialsFromSharedMemory(std::move(shm));
-  std::string check_string;
-  FieldTrialList::AllStatesToString(&check_string, false);
-  ASSERT_EQ(check_string.find("Simulated"), std::string::npos);
-}
-
-TEST(FieldTrialListTest, AssociateFieldTrialParams) {
-  test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.Init();
-
-  std::string trial_name("Trial1");
-  std::string group_name("Group1");
-
-  // Create a field trial with some params.
-  FieldTrialList field_trial_list(nullptr);
-  FieldTrialList::CreateFieldTrial(trial_name, group_name);
-  std::map<std::string, std::string> params;
-  params["key1"] = "value1";
-  params["key2"] = "value2";
-  FieldTrialParamAssociator::GetInstance()->AssociateFieldTrialParams(
-      trial_name, group_name, params);
-  FieldTrialList::InstantiateFieldTrialAllocatorIfNeeded();
-
-  // Clear all cached params from the associator.
-  FieldTrialParamAssociator::GetInstance()->ClearAllCachedParamsForTesting();
-  // Check that the params have been cleared from the cache.
-  std::map<std::string, std::string> cached_params;
-  FieldTrialParamAssociator::GetInstance()->GetFieldTrialParamsWithoutFallback(
-      trial_name, group_name, &cached_params);
-  EXPECT_EQ(0U, cached_params.size());
-
-  // Check that we fetch the param from shared memory properly.
-  std::map<std::string, std::string> new_params;
-  FieldTrialParamAssociator::GetInstance()->GetFieldTrialParams(trial_name,
-                                                                &new_params);
-  EXPECT_EQ("value1", new_params["key1"]);
-  EXPECT_EQ("value2", new_params["key2"]);
-  EXPECT_EQ(2U, new_params.size());
-}
-
-TEST(FieldTrialListTest, ClearParamsFromSharedMemory) {
-  std::string trial_name("Trial1");
-  std::string group_name("Group1");
-
-  SharedMemoryHandle handle;
-  {
-    test::ScopedFeatureList scoped_feature_list;
-    scoped_feature_list.Init();
-
-    // Create a field trial with some params.
-    FieldTrialList field_trial_list(nullptr);
-    FieldTrial* trial =
-        FieldTrialList::CreateFieldTrial(trial_name, group_name);
-    std::map<std::string, std::string> params;
-    params["key1"] = "value1";
-    params["key2"] = "value2";
-    FieldTrialParamAssociator::GetInstance()->AssociateFieldTrialParams(
-        trial_name, group_name, params);
-    FieldTrialList::InstantiateFieldTrialAllocatorIfNeeded();
-
-    // Clear all params from the associator AND shared memory. The allocated
-    // segments should be different.
-    FieldTrial::FieldTrialRef old_ref = trial->ref_;
-    FieldTrialParamAssociator::GetInstance()->ClearAllParamsForTesting();
-    FieldTrial::FieldTrialRef new_ref = trial->ref_;
-    EXPECT_NE(old_ref, new_ref);
-
-    // Check that there are no params associated with the field trial anymore.
-    std::map<std::string, std::string> new_params;
-    FieldTrialParamAssociator::GetInstance()->GetFieldTrialParams(trial_name,
-                                                                  &new_params);
-    EXPECT_EQ(0U, new_params.size());
-
-    // Now duplicate the handle so we can easily check that the trial is still
-    // in shared memory via AllStatesToString.
-    handle = SharedMemory::DuplicateHandle(
-        field_trial_list.field_trial_allocator_->shared_memory()->handle());
-  }
-
-  // Check that we have the trial.
-  FieldTrialList field_trial_list2(nullptr);
-  std::unique_ptr<SharedMemory> shm(new SharedMemory(handle, true));
-  // 4 KiB is enough to hold the trials only created for this test.
-  shm.get()->Map(4 << 10);
-  FieldTrialList::CreateTrialsFromSharedMemory(std::move(shm));
-  std::string check_string;
-  FieldTrialList::AllStatesToString(&check_string, false);
-  EXPECT_EQ("*Trial1/Group1/", check_string);
-}
-
-TEST(FieldTrialListTest, DumpAndFetchFromSharedMemory) {
-  std::string trial_name("Trial1");
-  std::string group_name("Group1");
-
-  // Create a field trial with some params.
-  FieldTrialList field_trial_list(nullptr);
-  FieldTrialList::CreateFieldTrial(trial_name, group_name);
-  std::map<std::string, std::string> params;
-  params["key1"] = "value1";
-  params["key2"] = "value2";
-  FieldTrialParamAssociator::GetInstance()->AssociateFieldTrialParams(
-      trial_name, group_name, params);
-
-  std::unique_ptr<SharedMemory> shm(new SharedMemory());
-  // 4 KiB is enough to hold the trials only created for this test.
-  shm.get()->CreateAndMapAnonymous(4 << 10);
-  // We _could_ use PersistentMemoryAllocator, this just has less params.
-  SharedPersistentMemoryAllocator allocator(std::move(shm), 1, "", false);
-
-  // Dump and subsequently retrieve the field trial to |allocator|.
-  FieldTrialList::DumpAllFieldTrialsToPersistentAllocator(&allocator);
-  std::vector<const FieldTrial::FieldTrialEntry*> entries =
-      FieldTrialList::GetAllFieldTrialsFromPersistentAllocator(allocator);
-
-  // Check that we have the entry we put in.
-  EXPECT_EQ(1u, entries.size());
-  const FieldTrial::FieldTrialEntry* entry = entries[0];
-
-  // Check that the trial and group names match.
-  StringPiece shm_trial_name;
-  StringPiece shm_group_name;
-  entry->GetTrialAndGroupName(&shm_trial_name, &shm_group_name);
-  EXPECT_EQ(trial_name, shm_trial_name);
-  EXPECT_EQ(group_name, shm_group_name);
-
-  // Check that the params match.
-  std::map<std::string, std::string> shm_params;
-  entry->GetParams(&shm_params);
-  EXPECT_EQ(2u, shm_params.size());
-  EXPECT_EQ("value1", shm_params["key1"]);
-  EXPECT_EQ("value2", shm_params["key2"]);
-}
-
-#if !defined(OS_NACL)
-TEST(FieldTrialListTest, SerializeSharedMemoryHandleMetadata) {
-  std::unique_ptr<SharedMemory> shm(new SharedMemory());
-  shm->CreateAndMapAnonymous(4 << 10);
-
-  std::string serialized =
-      FieldTrialList::SerializeSharedMemoryHandleMetadata(shm->handle());
-#if defined(OS_WIN) || defined(OS_FUCHSIA)
-  SharedMemoryHandle deserialized =
-      FieldTrialList::DeserializeSharedMemoryHandleMetadata(serialized);
-#else
-  // Use a valid-looking arbitrary number for the file descriptor. It's not
-  // being used in this unittest, but needs to pass sanity checks in the
-  // handle's constructor.
-  SharedMemoryHandle deserialized =
-      FieldTrialList::DeserializeSharedMemoryHandleMetadata(42, serialized);
-#endif
-  EXPECT_EQ(deserialized.GetGUID(), shm->handle().GetGUID());
-  EXPECT_FALSE(deserialized.GetGUID().is_empty());
-}
-#endif  // !defined(OS_NACL)
-
-// Verify that the field trial shared memory handle is really read-only, and
-// does not allow writable mappings. Test disabled on NaCl, Windows and Fuchsia
-// which don't support/implement GetFieldTrialHandle(). For Fuchsia, see
-// crbug.com/752368
-#if !defined(OS_NACL) && !defined(OS_WIN) && !defined(OS_FUCHSIA)
-TEST(FieldTrialListTest, CheckReadOnlySharedMemoryHandle) {
-  FieldTrialList field_trial_list(nullptr);
-  FieldTrialList::CreateFieldTrial("Trial1", "Group1");
-
-  test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.Init();
-
-  FieldTrialList::InstantiateFieldTrialAllocatorIfNeeded();
-
-  SharedMemoryHandle handle = FieldTrialList::GetFieldTrialHandle();
-  ASSERT_TRUE(handle.IsValid());
-
-  ASSERT_TRUE(CheckReadOnlySharedMemoryHandleForTesting(handle));
-}
-#endif  // !OS_NACL && !OS_WIN && !OS_FUCHSIA
-
-TEST_F(FieldTrialTest, TestAllParamsToString) {
-  std::string exptected_output = "t1.g1:p1/v1/p2/v2";
-
-  // Create study with one group and two params.
-  std::map<std::string, std::string> params;
-  params["p1"] = "v1";
-  params["p2"] = "v2";
-  FieldTrialParamAssociator::GetInstance()->AssociateFieldTrialParams(
-      "t1", "g1", params);
-  EXPECT_EQ(
-      "", FieldTrialList::AllParamsToString(false, &MockEscapeQueryParamValue));
-
-  scoped_refptr<FieldTrial> trial1 =
-      CreateFieldTrial("t1", 100, "Default", nullptr);
-  trial1->AppendGroup("g1", 100);
-  trial1->group();
-  EXPECT_EQ(exptected_output, FieldTrialList::AllParamsToString(
-                                  false, &MockEscapeQueryParamValue));
-
-  // Create study with two groups and params that don't belog to the assigned
-  // group. This should be in the output.
-  FieldTrialParamAssociator::GetInstance()->AssociateFieldTrialParams(
-      "t2", "g2", params);
-  scoped_refptr<FieldTrial> trial2 =
-      CreateFieldTrial("t2", 100, "Default", nullptr);
-  trial2->AppendGroup("g1", 100);
-  trial2->AppendGroup("g2", 0);
-  trial2->group();
-  EXPECT_EQ(exptected_output, FieldTrialList::AllParamsToString(
-                                  false, &MockEscapeQueryParamValue));
-}
-
-}  // namespace base
diff --git a/base/metrics/histogram_base_unittest.cc b/base/metrics/histogram_base_unittest.cc
deleted file mode 100644
index e539e5c..0000000
--- a/base/metrics/histogram_base_unittest.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <vector>
-
-#include "base/metrics/histogram.h"
-#include "base/metrics/histogram_base.h"
-#include "base/metrics/sample_vector.h"
-#include "base/metrics/sparse_histogram.h"
-#include "base/metrics/statistics_recorder.h"
-#include "base/pickle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-class HistogramBaseTest : public testing::Test {
- protected:
-  HistogramBaseTest() {
-    // Each test will have a clean state (no Histogram / BucketRanges
-    // registered).
-    ResetStatisticsRecorder();
-  }
-
-  ~HistogramBaseTest() override = default;
-
-  void ResetStatisticsRecorder() {
-    // It is necessary to fully destruct any existing StatisticsRecorder
-    // before creating a new one.
-    statistics_recorder_.reset();
-    statistics_recorder_ = StatisticsRecorder::CreateTemporaryForTesting();
-  }
-
- private:
-  std::unique_ptr<StatisticsRecorder> statistics_recorder_;
-
-  DISALLOW_COPY_AND_ASSIGN(HistogramBaseTest);
-};
-
-TEST_F(HistogramBaseTest, DeserializeHistogram) {
-  HistogramBase* histogram = Histogram::FactoryGet(
-      "TestHistogram", 1, 1000, 10,
-      (HistogramBase::kUmaTargetedHistogramFlag |
-      HistogramBase::kIPCSerializationSourceFlag));
-
-  Pickle pickle;
-  histogram->SerializeInfo(&pickle);
-
-  PickleIterator iter(pickle);
-  HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
-  EXPECT_EQ(histogram, deserialized);
-
-  ResetStatisticsRecorder();
-
-  PickleIterator iter2(pickle);
-  deserialized = DeserializeHistogramInfo(&iter2);
-  EXPECT_TRUE(deserialized);
-  EXPECT_NE(histogram, deserialized);
-  EXPECT_EQ("TestHistogram", StringPiece(deserialized->histogram_name()));
-  EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10));
-
-  // kIPCSerializationSourceFlag will be cleared.
-  EXPECT_EQ(HistogramBase::kUmaTargetedHistogramFlag, deserialized->flags());
-}
-
-TEST_F(HistogramBaseTest, DeserializeLinearHistogram) {
-  HistogramBase* histogram = LinearHistogram::FactoryGet(
-      "TestHistogram", 1, 1000, 10,
-      HistogramBase::kIPCSerializationSourceFlag);
-
-  Pickle pickle;
-  histogram->SerializeInfo(&pickle);
-
-  PickleIterator iter(pickle);
-  HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
-  EXPECT_EQ(histogram, deserialized);
-
-  ResetStatisticsRecorder();
-
-  PickleIterator iter2(pickle);
-  deserialized = DeserializeHistogramInfo(&iter2);
-  EXPECT_TRUE(deserialized);
-  EXPECT_NE(histogram, deserialized);
-  EXPECT_EQ("TestHistogram", StringPiece(deserialized->histogram_name()));
-  EXPECT_TRUE(deserialized->HasConstructionArguments(1, 1000, 10));
-  EXPECT_EQ(0, deserialized->flags());
-}
-
-TEST_F(HistogramBaseTest, DeserializeBooleanHistogram) {
-  HistogramBase* histogram = BooleanHistogram::FactoryGet(
-      "TestHistogram", HistogramBase::kIPCSerializationSourceFlag);
-
-  Pickle pickle;
-  histogram->SerializeInfo(&pickle);
-
-  PickleIterator iter(pickle);
-  HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
-  EXPECT_EQ(histogram, deserialized);
-
-  ResetStatisticsRecorder();
-
-  PickleIterator iter2(pickle);
-  deserialized = DeserializeHistogramInfo(&iter2);
-  EXPECT_TRUE(deserialized);
-  EXPECT_NE(histogram, deserialized);
-  EXPECT_EQ("TestHistogram", StringPiece(deserialized->histogram_name()));
-  EXPECT_TRUE(deserialized->HasConstructionArguments(1, 2, 3));
-  EXPECT_EQ(0, deserialized->flags());
-}
-
-TEST_F(HistogramBaseTest, DeserializeCustomHistogram) {
-  std::vector<HistogramBase::Sample> ranges;
-  ranges.push_back(13);
-  ranges.push_back(5);
-  ranges.push_back(9);
-
-  HistogramBase* histogram = CustomHistogram::FactoryGet(
-      "TestHistogram", ranges, HistogramBase::kIPCSerializationSourceFlag);
-
-  Pickle pickle;
-  histogram->SerializeInfo(&pickle);
-
-  PickleIterator iter(pickle);
-  HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
-  EXPECT_EQ(histogram, deserialized);
-
-  ResetStatisticsRecorder();
-
-  PickleIterator iter2(pickle);
-  deserialized = DeserializeHistogramInfo(&iter2);
-  EXPECT_TRUE(deserialized);
-  EXPECT_NE(histogram, deserialized);
-  EXPECT_EQ("TestHistogram", StringPiece(deserialized->histogram_name()));
-  EXPECT_TRUE(deserialized->HasConstructionArguments(5, 13, 4));
-  EXPECT_EQ(0, deserialized->flags());
-}
-
-TEST_F(HistogramBaseTest, DeserializeSparseHistogram) {
-  HistogramBase* histogram = SparseHistogram::FactoryGet(
-      "TestHistogram", HistogramBase::kIPCSerializationSourceFlag);
-
-  Pickle pickle;
-  histogram->SerializeInfo(&pickle);
-
-  PickleIterator iter(pickle);
-  HistogramBase* deserialized = DeserializeHistogramInfo(&iter);
-  EXPECT_EQ(histogram, deserialized);
-
-  ResetStatisticsRecorder();
-
-  PickleIterator iter2(pickle);
-  deserialized = DeserializeHistogramInfo(&iter2);
-  EXPECT_TRUE(deserialized);
-  EXPECT_NE(histogram, deserialized);
-  EXPECT_EQ("TestHistogram", StringPiece(deserialized->histogram_name()));
-  EXPECT_EQ(0, deserialized->flags());
-}
-
-TEST_F(HistogramBaseTest, AddKilo) {
-  HistogramBase* histogram =
-      LinearHistogram::FactoryGet("TestAddKiloHistogram", 1, 1000, 100, 0);
-
-  histogram->AddKilo(100, 1000);
-  histogram->AddKilo(200, 2000);
-  histogram->AddKilo(300, 1500);
-
-  std::unique_ptr<HistogramSamples> samples = histogram->SnapshotSamples();
-  EXPECT_EQ(1, samples->GetCount(100));
-  EXPECT_EQ(2, samples->GetCount(200));
-  EXPECT_LE(1, samples->GetCount(300));
-  EXPECT_GE(2, samples->GetCount(300));
-}
-
-TEST_F(HistogramBaseTest, AddKiB) {
-  HistogramBase* histogram =
-      LinearHistogram::FactoryGet("TestAddKiBHistogram", 1, 1000, 100, 0);
-
-  histogram->AddKiB(100, 1024);
-  histogram->AddKiB(200, 2048);
-  histogram->AddKiB(300, 1536);
-
-  std::unique_ptr<HistogramSamples> samples = histogram->SnapshotSamples();
-  EXPECT_EQ(1, samples->GetCount(100));
-  EXPECT_EQ(2, samples->GetCount(200));
-  EXPECT_LE(1, samples->GetCount(300));
-  EXPECT_GE(2, samples->GetCount(300));
-}
-
-}  // namespace base
diff --git a/base/metrics/histogram_delta_serialization_unittest.cc b/base/metrics/histogram_delta_serialization_unittest.cc
deleted file mode 100644
index 719bc70..0000000
--- a/base/metrics/histogram_delta_serialization_unittest.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/histogram_delta_serialization.h"
-
-#include <vector>
-
-#include "base/metrics/histogram.h"
-#include "base/metrics/histogram_base.h"
-#include "base/metrics/statistics_recorder.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(HistogramDeltaSerializationTest, DeserializeHistogramAndAddSamples) {
-  std::unique_ptr<StatisticsRecorder> statistic_recorder(
-      StatisticsRecorder::CreateTemporaryForTesting());
-  HistogramDeltaSerialization serializer("HistogramDeltaSerializationTest");
-  std::vector<std::string> deltas;
-  // Nothing was changed yet.
-  serializer.PrepareAndSerializeDeltas(&deltas, true);
-  EXPECT_TRUE(deltas.empty());
-
-  HistogramBase* histogram = Histogram::FactoryGet(
-      "TestHistogram", 1, 1000, 10, HistogramBase::kIPCSerializationSourceFlag);
-  histogram->Add(1);
-  histogram->Add(10);
-  histogram->Add(100);
-  histogram->Add(1000);
-
-  serializer.PrepareAndSerializeDeltas(&deltas, true);
-  EXPECT_FALSE(deltas.empty());
-
-  HistogramDeltaSerialization::DeserializeAndAddSamples(deltas);
-
-  // The histogram has kIPCSerializationSourceFlag. So samples will be ignored.
-  std::unique_ptr<HistogramSamples> snapshot(histogram->SnapshotSamples());
-  EXPECT_EQ(1, snapshot->GetCount(1));
-  EXPECT_EQ(1, snapshot->GetCount(10));
-  EXPECT_EQ(1, snapshot->GetCount(100));
-  EXPECT_EQ(1, snapshot->GetCount(1000));
-
-  // Clear kIPCSerializationSourceFlag to emulate multi-process usage.
-  histogram->ClearFlags(HistogramBase::kIPCSerializationSourceFlag);
-  HistogramDeltaSerialization::DeserializeAndAddSamples(deltas);
-
-  std::unique_ptr<HistogramSamples> snapshot2(histogram->SnapshotSamples());
-  EXPECT_EQ(2, snapshot2->GetCount(1));
-  EXPECT_EQ(2, snapshot2->GetCount(10));
-  EXPECT_EQ(2, snapshot2->GetCount(100));
-  EXPECT_EQ(2, snapshot2->GetCount(1000));
-}
-
-}  // namespace base
diff --git a/base/metrics/histogram_functions_unittest.cc b/base/metrics/histogram_functions_unittest.cc
deleted file mode 100644
index 3720674..0000000
--- a/base/metrics/histogram_functions_unittest.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/histogram_functions.h"
-
-#include "base/metrics/histogram_macros.h"
-#include "base/test/histogram_tester.h"
-#include "base/time/time.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-enum UmaHistogramTestingEnum {
-  UMA_HISTOGRAM_TESTING_ENUM_FIRST,
-  UMA_HISTOGRAM_TESTING_ENUM_SECOND,
-  UMA_HISTOGRAM_TESTING_ENUM_THIRD
-};
-
-TEST(HistogramFunctionsTest, ExactLinear) {
-  std::string histogram("Testing.UMA.HistogramExactLinear");
-  HistogramTester tester;
-  UmaHistogramExactLinear(histogram, 10, 100);
-  tester.ExpectUniqueSample(histogram, 10, 1);
-  UmaHistogramExactLinear(histogram, 20, 100);
-  UmaHistogramExactLinear(histogram, 10, 100);
-  tester.ExpectBucketCount(histogram, 10, 2);
-  tester.ExpectBucketCount(histogram, 20, 1);
-  tester.ExpectTotalCount(histogram, 3);
-  // Test linear buckets overflow.
-  UmaHistogramExactLinear(histogram, 200, 100);
-  tester.ExpectBucketCount(histogram, 101, 1);
-  tester.ExpectTotalCount(histogram, 4);
-  // Test linear buckets underflow.
-  UmaHistogramExactLinear(histogram, 0, 100);
-  tester.ExpectBucketCount(histogram, 0, 1);
-  tester.ExpectTotalCount(histogram, 5);
-}
-
-TEST(HistogramFunctionsTest, Enumeration) {
-  std::string histogram("Testing.UMA.HistogramEnumeration");
-  HistogramTester tester;
-  UmaHistogramEnumeration(histogram, UMA_HISTOGRAM_TESTING_ENUM_FIRST,
-                          UMA_HISTOGRAM_TESTING_ENUM_THIRD);
-  tester.ExpectUniqueSample(histogram, UMA_HISTOGRAM_TESTING_ENUM_FIRST, 1);
-
-  // Verify the overflow & underflow bucket exists.
-  UMA_HISTOGRAM_ENUMERATION(
-      histogram, static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD) + 10,
-      static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD));
-  tester.ExpectBucketCount(
-      histogram, static_cast<int>(UMA_HISTOGRAM_TESTING_ENUM_THIRD) + 1, 1);
-  tester.ExpectTotalCount(histogram, 2);
-}
-
-TEST(HistogramFunctionsTest, Boolean) {
-  std::string histogram("Testing.UMA.HistogramBoolean");
-  HistogramTester tester;
-  UmaHistogramBoolean(histogram, true);
-  tester.ExpectUniqueSample(histogram, 1, 1);
-  UmaHistogramBoolean(histogram, false);
-  tester.ExpectBucketCount(histogram, 0, 1);
-  tester.ExpectTotalCount(histogram, 2);
-}
-
-TEST(HistogramFunctionsTest, Percentage) {
-  std::string histogram("Testing.UMA.HistogramPercentage");
-  HistogramTester tester;
-  UmaHistogramPercentage(histogram, 50);
-  tester.ExpectUniqueSample(histogram, 50, 1);
-  // Test overflows.
-  UmaHistogramPercentage(histogram, 110);
-  tester.ExpectBucketCount(histogram, 101, 1);
-  tester.ExpectTotalCount(histogram, 2);
-}
-
-TEST(HistogramFunctionsTest, Counts) {
-  std::string histogram("Testing.UMA.HistogramCount.Custom");
-  HistogramTester tester;
-  UmaHistogramCustomCounts(histogram, 10, 1, 100, 10);
-  tester.ExpectUniqueSample(histogram, 10, 1);
-  UmaHistogramCustomCounts(histogram, 20, 1, 100, 10);
-  UmaHistogramCustomCounts(histogram, 20, 1, 100, 10);
-  UmaHistogramCustomCounts(histogram, 20, 1, 100, 10);
-  tester.ExpectBucketCount(histogram, 20, 3);
-  tester.ExpectTotalCount(histogram, 4);
-  UmaHistogramCustomCounts(histogram, 110, 1, 100, 10);
-  tester.ExpectBucketCount(histogram, 101, 1);
-  tester.ExpectTotalCount(histogram, 5);
-}
-
-TEST(HistogramFunctionsTest, Times) {
-  std::string histogram("Testing.UMA.HistogramTimes");
-  HistogramTester tester;
-  UmaHistogramTimes(histogram, TimeDelta::FromSeconds(1));
-  tester.ExpectTimeBucketCount(histogram, TimeDelta::FromSeconds(1), 1);
-  tester.ExpectTotalCount(histogram, 1);
-  UmaHistogramTimes(histogram, TimeDelta::FromSeconds(9));
-  tester.ExpectTimeBucketCount(histogram, TimeDelta::FromSeconds(9), 1);
-  tester.ExpectTotalCount(histogram, 2);
-  UmaHistogramTimes(histogram, TimeDelta::FromSeconds(10));  // Overflows
-  tester.ExpectTimeBucketCount(histogram, TimeDelta::FromSeconds(10), 1);
-  UmaHistogramTimes(histogram, TimeDelta::FromSeconds(20));  // Overflows.
-  // Check the value by picking any overflow time.
-  tester.ExpectTimeBucketCount(histogram, TimeDelta::FromSeconds(11), 2);
-  tester.ExpectTotalCount(histogram, 4);
-}
-
-TEST(HistogramFunctionsTest, Sparse_SupportsLargeRange) {
-  std::string histogram("Testing.UMA.HistogramSparse");
-  HistogramTester tester;
-  UmaHistogramSparse(histogram, 0);
-  UmaHistogramSparse(histogram, 123456789);
-  UmaHistogramSparse(histogram, 123456789);
-  EXPECT_THAT(tester.GetAllSamples(histogram),
-              testing::ElementsAre(Bucket(0, 1), Bucket(123456789, 2)));
-}
-
-TEST(HistogramFunctionsTest, Sparse_SupportsNegativeValues) {
-  std::string histogram("Testing.UMA.HistogramSparse");
-  HistogramTester tester;
-  UmaHistogramSparse(histogram, -1);
-  tester.ExpectUniqueSample(histogram, -1, 1);
-}
-
-}  // namespace base.
diff --git a/base/metrics/histogram_macros_unittest.cc b/base/metrics/histogram_macros_unittest.cc
deleted file mode 100644
index 3c592b0..0000000
--- a/base/metrics/histogram_macros_unittest.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/histogram_macros.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(ScopedHistogramTimer, TwoTimersOneScope) {
-  SCOPED_UMA_HISTOGRAM_TIMER("TestTimer0");
-  SCOPED_UMA_HISTOGRAM_TIMER("TestTimer1");
-  SCOPED_UMA_HISTOGRAM_LONG_TIMER("TestLongTimer0");
-  SCOPED_UMA_HISTOGRAM_LONG_TIMER("TestLongTimer1");
-}
-
-// Compile tests for UMA_HISTOGRAM_ENUMERATION with the three different types it
-// accepts:
-// - integral types
-// - unscoped enums
-// - scoped enums
-TEST(HistogramMacro, IntegralPsuedoEnumeration) {
-  UMA_HISTOGRAM_ENUMERATION("Test.FauxEnumeration", 1, 10000);
-}
-
-TEST(HistogramMacro, UnscopedEnumeration) {
-  enum TestEnum : char {
-    FIRST_VALUE,
-    SECOND_VALUE,
-    THIRD_VALUE,
-    MAX_ENTRIES,
-  };
-  UMA_HISTOGRAM_ENUMERATION("Test.UnscopedEnumeration", SECOND_VALUE,
-                            MAX_ENTRIES);
-}
-
-TEST(HistogramMacro, ScopedEnumeration) {
-  enum class TestEnum {
-    FIRST_VALUE,
-    SECOND_VALUE,
-    THIRD_VALUE,
-    kMaxValue = THIRD_VALUE,
-  };
-  UMA_HISTOGRAM_ENUMERATION("Test.ScopedEnumeration", TestEnum::FIRST_VALUE);
-
-  enum class TestEnum2 {
-    FIRST_VALUE,
-    SECOND_VALUE,
-    THIRD_VALUE,
-    MAX_ENTRIES,
-  };
-  UMA_HISTOGRAM_ENUMERATION("Test.ScopedEnumeration2", TestEnum2::SECOND_VALUE,
-                            TestEnum2::MAX_ENTRIES);
-}
-
-}  // namespace base
diff --git a/base/metrics/histogram_samples_unittest.cc b/base/metrics/histogram_samples_unittest.cc
deleted file mode 100644
index 74c743b..0000000
--- a/base/metrics/histogram_samples_unittest.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/histogram_samples.h"
-
-#include <limits>
-
-#include "base/test/gtest_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-using SingleSample = HistogramSamples::SingleSample;
-using AtomicSingleSample = HistogramSamples::AtomicSingleSample;
-
-TEST(SingleSampleTest, Load) {
-  AtomicSingleSample sample;
-  ASSERT_TRUE(sample.Accumulate(9, 1));
-
-  SingleSample s = sample.Load();
-  EXPECT_EQ(9U, s.bucket);
-  EXPECT_EQ(1U, s.count);
-
-  s = sample.Load();
-  EXPECT_EQ(9U, s.bucket);
-  EXPECT_EQ(1U, s.count);
-}
-
-TEST(SingleSampleTest, Extract) {
-  AtomicSingleSample sample;
-  ASSERT_TRUE(sample.Accumulate(9, 1));
-
-  SingleSample s = sample.Extract(/*disable=*/false);
-  EXPECT_EQ(9U, s.bucket);
-  EXPECT_EQ(1U, s.count);
-
-  s = sample.Extract(/*disable=*/false);
-  EXPECT_EQ(0U, s.bucket);
-  EXPECT_EQ(0U, s.count);
-}
-
-TEST(SingleSampleTest, Disable) {
-  AtomicSingleSample sample;
-  EXPECT_EQ(0U, sample.Extract(/*disable=*/false).count);
-  EXPECT_FALSE(sample.IsDisabled());
-
-  ASSERT_TRUE(sample.Accumulate(9, 1));
-  EXPECT_EQ(1U, sample.Extract(/*disable=*/true).count);
-  EXPECT_TRUE(sample.IsDisabled());
-
-  ASSERT_FALSE(sample.Accumulate(9, 1));
-  EXPECT_EQ(0U, sample.Extract(/*disable=*/false).count);
-  EXPECT_FALSE(sample.IsDisabled());
-}
-
-TEST(SingleSampleTest, Accumulate) {
-  AtomicSingleSample sample;
-
-  ASSERT_TRUE(sample.Accumulate(9, 1));
-  ASSERT_TRUE(sample.Accumulate(9, 2));
-  ASSERT_TRUE(sample.Accumulate(9, 4));
-  EXPECT_EQ(7U, sample.Extract(/*disable=*/false).count);
-
-  ASSERT_TRUE(sample.Accumulate(9, 4));
-  ASSERT_TRUE(sample.Accumulate(9, -2));
-  ASSERT_TRUE(sample.Accumulate(9, 1));
-  EXPECT_EQ(3U, sample.Extract(/*disable=*/false).count);
-}
-
-TEST(SingleSampleTest, Overflow) {
-  AtomicSingleSample sample;
-
-  ASSERT_TRUE(sample.Accumulate(9, 1));
-  ASSERT_FALSE(sample.Accumulate(9, -2));
-  EXPECT_EQ(1U, sample.Extract(/*disable=*/false).count);
-
-  ASSERT_TRUE(sample.Accumulate(9, std::numeric_limits<uint16_t>::max()));
-  ASSERT_FALSE(sample.Accumulate(9, 1));
-  EXPECT_EQ(std::numeric_limits<uint16_t>::max(),
-            sample.Extract(/*disable=*/false).count);
-}
-
-}  // namespace base
diff --git a/base/metrics/histogram_snapshot_manager_unittest.cc b/base/metrics/histogram_snapshot_manager_unittest.cc
deleted file mode 100644
index 1e2c599..0000000
--- a/base/metrics/histogram_snapshot_manager_unittest.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/histogram_snapshot_manager.h"
-
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/metrics/histogram_delta_serialization.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/metrics/sample_vector.h"
-#include "base/metrics/statistics_recorder.h"
-#include "base/stl_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-class HistogramFlattenerDeltaRecorder : public HistogramFlattener {
- public:
-  HistogramFlattenerDeltaRecorder() = default;
-
-  void RecordDelta(const HistogramBase& histogram,
-                   const HistogramSamples& snapshot) override {
-    recorded_delta_histogram_names_.push_back(histogram.histogram_name());
-    // Use CHECK instead of ASSERT to get full stack-trace and thus origin.
-    CHECK(!ContainsKey(recorded_delta_histogram_sum_,
-                       histogram.histogram_name()));
-    // Keep pointer to snapshot for testing. This really isn't ideal but the
-    // snapshot-manager keeps the snapshot alive until it's "forgotten".
-    recorded_delta_histogram_sum_[histogram.histogram_name()] = snapshot.sum();
-  }
-
-  void Reset() {
-    recorded_delta_histogram_names_.clear();
-    recorded_delta_histogram_sum_.clear();
-  }
-
-  std::vector<std::string> GetRecordedDeltaHistogramNames() {
-    return recorded_delta_histogram_names_;
-  }
-
-  int64_t GetRecordedDeltaHistogramSum(const std::string& name) {
-    EXPECT_TRUE(ContainsKey(recorded_delta_histogram_sum_, name));
-    return recorded_delta_histogram_sum_[name];
-  }
-
- private:
-  std::vector<std::string> recorded_delta_histogram_names_;
-  std::map<std::string, int64_t> recorded_delta_histogram_sum_;
-
-  DISALLOW_COPY_AND_ASSIGN(HistogramFlattenerDeltaRecorder);
-};
-
-class HistogramSnapshotManagerTest : public testing::Test {
- protected:
-  HistogramSnapshotManagerTest()
-      : statistics_recorder_(StatisticsRecorder::CreateTemporaryForTesting()),
-        histogram_snapshot_manager_(&histogram_flattener_delta_recorder_) {}
-
-  ~HistogramSnapshotManagerTest() override = default;
-
-  std::unique_ptr<StatisticsRecorder> statistics_recorder_;
-  HistogramFlattenerDeltaRecorder histogram_flattener_delta_recorder_;
-  HistogramSnapshotManager histogram_snapshot_manager_;
-};
-
-TEST_F(HistogramSnapshotManagerTest, PrepareDeltasNoFlagsFilter) {
-  // kNoFlags filter should record all histograms.
-  UMA_HISTOGRAM_ENUMERATION("UmaHistogram", 1, 4);
-  UMA_STABILITY_HISTOGRAM_ENUMERATION("UmaStabilityHistogram", 1, 2);
-
-  StatisticsRecorder::PrepareDeltas(false, HistogramBase::kNoFlags,
-                                    HistogramBase::kNoFlags,
-                                    &histogram_snapshot_manager_);
-
-  const std::vector<std::string>& histograms =
-      histogram_flattener_delta_recorder_.GetRecordedDeltaHistogramNames();
-  EXPECT_EQ(2U, histograms.size());
-  EXPECT_EQ("UmaHistogram", histograms[0]);
-  EXPECT_EQ("UmaStabilityHistogram", histograms[1]);
-}
-
-TEST_F(HistogramSnapshotManagerTest, PrepareDeltasUmaHistogramFlagFilter) {
-  // Note that kUmaStabilityHistogramFlag includes kUmaTargetedHistogramFlag.
-  UMA_HISTOGRAM_ENUMERATION("UmaHistogram", 1, 4);
-  UMA_STABILITY_HISTOGRAM_ENUMERATION("UmaStabilityHistogram", 1, 2);
-
-  StatisticsRecorder::PrepareDeltas(false, HistogramBase::kNoFlags,
-                                    HistogramBase::kUmaTargetedHistogramFlag,
-                                    &histogram_snapshot_manager_);
-
-  const std::vector<std::string>& histograms =
-      histogram_flattener_delta_recorder_.GetRecordedDeltaHistogramNames();
-  EXPECT_EQ(2U, histograms.size());
-  EXPECT_EQ("UmaHistogram", histograms[0]);
-  EXPECT_EQ("UmaStabilityHistogram", histograms[1]);
-}
-
-TEST_F(HistogramSnapshotManagerTest,
-       PrepareDeltasUmaStabilityHistogramFlagFilter) {
-  UMA_HISTOGRAM_ENUMERATION("UmaHistogram", 1, 4);
-  UMA_STABILITY_HISTOGRAM_ENUMERATION("UmaStabilityHistogram", 1, 2);
-
-  StatisticsRecorder::PrepareDeltas(false, HistogramBase::kNoFlags,
-                                    HistogramBase::kUmaStabilityHistogramFlag,
-                                    &histogram_snapshot_manager_);
-
-  const std::vector<std::string>& histograms =
-      histogram_flattener_delta_recorder_.GetRecordedDeltaHistogramNames();
-  EXPECT_EQ(1U, histograms.size());
-  EXPECT_EQ("UmaStabilityHistogram", histograms[0]);
-}
-
-}  // namespace base
diff --git a/base/metrics/histogram_unittest.cc b/base/metrics/histogram_unittest.cc
deleted file mode 100644
index b819393..0000000
--- a/base/metrics/histogram_unittest.cc
+++ /dev/null
@@ -1,841 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/histogram.h"
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <climits>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/logging.h"
-#include "base/metrics/bucket_ranges.h"
-#include "base/metrics/dummy_histogram.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/metrics/metrics_hashes.h"
-#include "base/metrics/persistent_histogram_allocator.h"
-#include "base/metrics/persistent_memory_allocator.h"
-#include "base/metrics/record_histogram_checker.h"
-#include "base/metrics/sample_vector.h"
-#include "base/metrics/statistics_recorder.h"
-#include "base/pickle.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/gtest_util.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-const char kExpiredHistogramName[] = "ExpiredHistogram";
-
-// Test implementation of RecordHistogramChecker interface.
-class TestRecordHistogramChecker : public RecordHistogramChecker {
- public:
-  ~TestRecordHistogramChecker() override = default;
-
-  // RecordHistogramChecker:
-  bool ShouldRecord(uint64_t histogram_hash) const override {
-    return histogram_hash != HashMetricName(kExpiredHistogramName);
-  }
-};
-
-}  // namespace
-
-// Test parameter indicates if a persistent memory allocator should be used
-// for histogram allocation. False will allocate histograms from the process
-// heap.
-class HistogramTest : public testing::TestWithParam<bool> {
- protected:
-  const int32_t kAllocatorMemorySize = 8 << 20;  // 8 MiB
-
-  HistogramTest() : use_persistent_histogram_allocator_(GetParam()) {}
-
-  void SetUp() override {
-    if (use_persistent_histogram_allocator_)
-      CreatePersistentHistogramAllocator();
-
-    // Each test will have a clean state (no Histogram / BucketRanges
-    // registered).
-    InitializeStatisticsRecorder();
-  }
-
-  void TearDown() override {
-    if (allocator_) {
-      ASSERT_FALSE(allocator_->IsFull());
-      ASSERT_FALSE(allocator_->IsCorrupt());
-    }
-    UninitializeStatisticsRecorder();
-    DestroyPersistentHistogramAllocator();
-  }
-
-  void InitializeStatisticsRecorder() {
-    DCHECK(!statistics_recorder_);
-    statistics_recorder_ = StatisticsRecorder::CreateTemporaryForTesting();
-    auto record_checker = std::make_unique<TestRecordHistogramChecker>();
-    StatisticsRecorder::SetRecordChecker(std::move(record_checker));
-  }
-
-  void UninitializeStatisticsRecorder() {
-    statistics_recorder_.reset();
-  }
-
-  void CreatePersistentHistogramAllocator() {
-    GlobalHistogramAllocator::CreateWithLocalMemory(
-        kAllocatorMemorySize, 0, "HistogramAllocatorTest");
-    allocator_ = GlobalHistogramAllocator::Get()->memory_allocator();
-  }
-
-  void DestroyPersistentHistogramAllocator() {
-    allocator_ = nullptr;
-    GlobalHistogramAllocator::ReleaseForTesting();
-  }
-
-  const bool use_persistent_histogram_allocator_;
-
-  std::unique_ptr<StatisticsRecorder> statistics_recorder_;
-  std::unique_ptr<char[]> allocator_memory_;
-  PersistentMemoryAllocator* allocator_ = nullptr;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(HistogramTest);
-};
-
-// Run all HistogramTest cases with both heap and persistent memory.
-INSTANTIATE_TEST_CASE_P(HeapAndPersistent, HistogramTest, testing::Bool());
-
-
-// Check for basic syntax and use.
-TEST_P(HistogramTest, BasicTest) {
-  // Try basic construction
-  HistogramBase* histogram = Histogram::FactoryGet(
-      "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
-  EXPECT_TRUE(histogram);
-
-  HistogramBase* linear_histogram = LinearHistogram::FactoryGet(
-      "TestLinearHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
-  EXPECT_TRUE(linear_histogram);
-
-  std::vector<int> custom_ranges;
-  custom_ranges.push_back(1);
-  custom_ranges.push_back(5);
-  HistogramBase* custom_histogram = CustomHistogram::FactoryGet(
-      "TestCustomHistogram", custom_ranges, HistogramBase::kNoFlags);
-  EXPECT_TRUE(custom_histogram);
-
-  // Macros that create histograms have an internal static variable which will
-  // continue to point to those from the very first run of this method even
-  // during subsequent runs.
-  static bool already_run = false;
-  if (already_run)
-    return;
-  already_run = true;
-
-  // Use standard macros (but with fixed samples)
-  LOCAL_HISTOGRAM_TIMES("Test2Histogram", TimeDelta::FromDays(1));
-  LOCAL_HISTOGRAM_COUNTS("Test3Histogram", 30);
-
-  LOCAL_HISTOGRAM_ENUMERATION("Test6Histogram", 129, 130);
-}
-
-// Check that the macro correctly matches histograms by name and records their
-// data together.
-TEST_P(HistogramTest, NameMatchTest) {
-  // Macros that create histograms have an internal static variable which will
-  // continue to point to those from the very first run of this method even
-  // during subsequent runs.
-  static bool already_run = false;
-  if (already_run)
-    return;
-  already_run = true;
-
-  LOCAL_HISTOGRAM_PERCENTAGE("DuplicatedHistogram", 10);
-  LOCAL_HISTOGRAM_PERCENTAGE("DuplicatedHistogram", 10);
-  HistogramBase* histogram = LinearHistogram::FactoryGet(
-      "DuplicatedHistogram", 1, 101, 102, HistogramBase::kNoFlags);
-
-  std::unique_ptr<HistogramSamples> samples = histogram->SnapshotSamples();
-  EXPECT_EQ(2, samples->TotalCount());
-  EXPECT_EQ(2, samples->GetCount(10));
-}
-
-// Check that delta calculations work correctly.
-TEST_P(HistogramTest, DeltaTest) {
-  HistogramBase* histogram =
-      Histogram::FactoryGet("DeltaHistogram", 1, 64, 8,
-                            HistogramBase::kNoFlags);
-  histogram->Add(1);
-  histogram->Add(10);
-  histogram->Add(50);
-
-  std::unique_ptr<HistogramSamples> samples = histogram->SnapshotDelta();
-  EXPECT_EQ(3, samples->TotalCount());
-  EXPECT_EQ(1, samples->GetCount(1));
-  EXPECT_EQ(1, samples->GetCount(10));
-  EXPECT_EQ(1, samples->GetCount(50));
-  EXPECT_EQ(samples->TotalCount(), samples->redundant_count());
-
-  samples = histogram->SnapshotDelta();
-  EXPECT_EQ(0, samples->TotalCount());
-
-  histogram->Add(10);
-  histogram->Add(10);
-  samples = histogram->SnapshotDelta();
-  EXPECT_EQ(2, samples->TotalCount());
-  EXPECT_EQ(2, samples->GetCount(10));
-
-  samples = histogram->SnapshotDelta();
-  EXPECT_EQ(0, samples->TotalCount());
-}
-
-// Check that final-delta calculations work correctly.
-TEST_P(HistogramTest, FinalDeltaTest) {
-  HistogramBase* histogram =
-      Histogram::FactoryGet("FinalDeltaHistogram", 1, 64, 8,
-                            HistogramBase::kNoFlags);
-  histogram->Add(1);
-  histogram->Add(10);
-  histogram->Add(50);
-
-  std::unique_ptr<HistogramSamples> samples = histogram->SnapshotDelta();
-  EXPECT_EQ(3, samples->TotalCount());
-  EXPECT_EQ(1, samples->GetCount(1));
-  EXPECT_EQ(1, samples->GetCount(10));
-  EXPECT_EQ(1, samples->GetCount(50));
-  EXPECT_EQ(samples->TotalCount(), samples->redundant_count());
-
-  histogram->Add(2);
-  histogram->Add(50);
-
-  samples = histogram->SnapshotFinalDelta();
-  EXPECT_EQ(2, samples->TotalCount());
-  EXPECT_EQ(1, samples->GetCount(2));
-  EXPECT_EQ(1, samples->GetCount(50));
-  EXPECT_EQ(samples->TotalCount(), samples->redundant_count());
-}
-
-TEST_P(HistogramTest, ExponentialRangesTest) {
-  // Check that we got a nice exponential when there was enough room.
-  BucketRanges ranges(9);
-  Histogram::InitializeBucketRanges(1, 64, &ranges);
-  EXPECT_EQ(0, ranges.range(0));
-  int power_of_2 = 1;
-  for (int i = 1; i < 8; i++) {
-    EXPECT_EQ(power_of_2, ranges.range(i));
-    power_of_2 *= 2;
-  }
-  EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges.range(8));
-
-  // Check the corresponding Histogram will use the correct ranges.
-  Histogram* histogram = static_cast<Histogram*>(
-      Histogram::FactoryGet("Histogram", 1, 64, 8, HistogramBase::kNoFlags));
-  EXPECT_TRUE(ranges.Equals(histogram->bucket_ranges()));
-
-  // When bucket count is limited, exponential ranges will partially look like
-  // linear.
-  BucketRanges ranges2(16);
-  Histogram::InitializeBucketRanges(1, 32, &ranges2);
-
-  EXPECT_EQ(0, ranges2.range(0));
-  EXPECT_EQ(1, ranges2.range(1));
-  EXPECT_EQ(2, ranges2.range(2));
-  EXPECT_EQ(3, ranges2.range(3));
-  EXPECT_EQ(4, ranges2.range(4));
-  EXPECT_EQ(5, ranges2.range(5));
-  EXPECT_EQ(6, ranges2.range(6));
-  EXPECT_EQ(7, ranges2.range(7));
-  EXPECT_EQ(9, ranges2.range(8));
-  EXPECT_EQ(11, ranges2.range(9));
-  EXPECT_EQ(14, ranges2.range(10));
-  EXPECT_EQ(17, ranges2.range(11));
-  EXPECT_EQ(21, ranges2.range(12));
-  EXPECT_EQ(26, ranges2.range(13));
-  EXPECT_EQ(32, ranges2.range(14));
-  EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges2.range(15));
-
-  // Check the corresponding Histogram will use the correct ranges.
-  Histogram* histogram2 = static_cast<Histogram*>(
-      Histogram::FactoryGet("Histogram2", 1, 32, 15, HistogramBase::kNoFlags));
-  EXPECT_TRUE(ranges2.Equals(histogram2->bucket_ranges()));
-}
-
-TEST_P(HistogramTest, LinearRangesTest) {
-  BucketRanges ranges(9);
-  LinearHistogram::InitializeBucketRanges(1, 7, &ranges);
-  // Gets a nice linear set of bucket ranges.
-  for (int i = 0; i < 8; i++)
-    EXPECT_EQ(i, ranges.range(i));
-  EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges.range(8));
-
-  // The correspoding LinearHistogram should use the correct ranges.
-  Histogram* histogram = static_cast<Histogram*>(
-      LinearHistogram::FactoryGet("Linear", 1, 7, 8, HistogramBase::kNoFlags));
-  EXPECT_TRUE(ranges.Equals(histogram->bucket_ranges()));
-
-  // Linear ranges are not divisible.
-  BucketRanges ranges2(6);
-  LinearHistogram::InitializeBucketRanges(1, 6, &ranges2);
-  EXPECT_EQ(0, ranges2.range(0));
-  EXPECT_EQ(1, ranges2.range(1));
-  EXPECT_EQ(3, ranges2.range(2));
-  EXPECT_EQ(4, ranges2.range(3));
-  EXPECT_EQ(6, ranges2.range(4));
-  EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges2.range(5));
-  // The correspoding LinearHistogram should use the correct ranges.
-  Histogram* histogram2 = static_cast<Histogram*>(
-      LinearHistogram::FactoryGet("Linear2", 1, 6, 5, HistogramBase::kNoFlags));
-  EXPECT_TRUE(ranges2.Equals(histogram2->bucket_ranges()));
-}
-
-TEST_P(HistogramTest, ArrayToCustomEnumRangesTest) {
-  const HistogramBase::Sample ranges[3] = {5, 10, 20};
-  std::vector<HistogramBase::Sample> ranges_vec =
-      CustomHistogram::ArrayToCustomEnumRanges(ranges);
-  ASSERT_EQ(6u, ranges_vec.size());
-  EXPECT_EQ(5, ranges_vec[0]);
-  EXPECT_EQ(6, ranges_vec[1]);
-  EXPECT_EQ(10, ranges_vec[2]);
-  EXPECT_EQ(11, ranges_vec[3]);
-  EXPECT_EQ(20, ranges_vec[4]);
-  EXPECT_EQ(21, ranges_vec[5]);
-}
-
-TEST_P(HistogramTest, CustomHistogramTest) {
-  // A well prepared custom ranges.
-  std::vector<HistogramBase::Sample> custom_ranges;
-  custom_ranges.push_back(1);
-  custom_ranges.push_back(2);
-
-  Histogram* histogram = static_cast<Histogram*>(
-      CustomHistogram::FactoryGet("TestCustomHistogram1", custom_ranges,
-                                  HistogramBase::kNoFlags));
-  const BucketRanges* ranges = histogram->bucket_ranges();
-  ASSERT_EQ(4u, ranges->size());
-  EXPECT_EQ(0, ranges->range(0));  // Auto added.
-  EXPECT_EQ(1, ranges->range(1));
-  EXPECT_EQ(2, ranges->range(2));
-  EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(3));  // Auto added.
-
-  // A unordered custom ranges.
-  custom_ranges.clear();
-  custom_ranges.push_back(2);
-  custom_ranges.push_back(1);
-  histogram = static_cast<Histogram*>(
-      CustomHistogram::FactoryGet("TestCustomHistogram2", custom_ranges,
-                                  HistogramBase::kNoFlags));
-  ranges = histogram->bucket_ranges();
-  ASSERT_EQ(4u, ranges->size());
-  EXPECT_EQ(0, ranges->range(0));
-  EXPECT_EQ(1, ranges->range(1));
-  EXPECT_EQ(2, ranges->range(2));
-  EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(3));
-
-  // A custom ranges with duplicated values.
-  custom_ranges.clear();
-  custom_ranges.push_back(4);
-  custom_ranges.push_back(1);
-  custom_ranges.push_back(4);
-  histogram = static_cast<Histogram*>(
-      CustomHistogram::FactoryGet("TestCustomHistogram3", custom_ranges,
-                                  HistogramBase::kNoFlags));
-  ranges = histogram->bucket_ranges();
-  ASSERT_EQ(4u, ranges->size());
-  EXPECT_EQ(0, ranges->range(0));
-  EXPECT_EQ(1, ranges->range(1));
-  EXPECT_EQ(4, ranges->range(2));
-  EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(3));
-}
-
-TEST_P(HistogramTest, CustomHistogramWithOnly2Buckets) {
-  // This test exploits the fact that the CustomHistogram can have 2 buckets,
-  // while the base class Histogram is *supposed* to have at least 3 buckets.
-  // We should probably change the restriction on the base class (or not inherit
-  // the base class!).
-
-  std::vector<HistogramBase::Sample> custom_ranges;
-  custom_ranges.push_back(4);
-
-  Histogram* histogram = static_cast<Histogram*>(
-      CustomHistogram::FactoryGet("2BucketsCustomHistogram", custom_ranges,
-                                  HistogramBase::kNoFlags));
-  const BucketRanges* ranges = histogram->bucket_ranges();
-  ASSERT_EQ(3u, ranges->size());
-  EXPECT_EQ(0, ranges->range(0));
-  EXPECT_EQ(4, ranges->range(1));
-  EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(2));
-}
-
-TEST_P(HistogramTest, AddCountTest) {
-  const size_t kBucketCount = 50;
-  Histogram* histogram = static_cast<Histogram*>(
-      Histogram::FactoryGet("AddCountHistogram", 10, 100, kBucketCount,
-                            HistogramBase::kNoFlags));
-
-  histogram->AddCount(20, 15);
-  histogram->AddCount(30, 14);
-
-  std::unique_ptr<HistogramSamples> samples = histogram->SnapshotSamples();
-  EXPECT_EQ(29, samples->TotalCount());
-  EXPECT_EQ(15, samples->GetCount(20));
-  EXPECT_EQ(14, samples->GetCount(30));
-
-  histogram->AddCount(20, 25);
-  histogram->AddCount(30, 24);
-
-  std::unique_ptr<HistogramSamples> samples2 = histogram->SnapshotSamples();
-  EXPECT_EQ(78, samples2->TotalCount());
-  EXPECT_EQ(40, samples2->GetCount(20));
-  EXPECT_EQ(38, samples2->GetCount(30));
-}
-
-TEST_P(HistogramTest, AddCount_LargeValuesDontOverflow) {
-  const size_t kBucketCount = 50;
-  Histogram* histogram = static_cast<Histogram*>(
-      Histogram::FactoryGet("AddCountHistogram", 10, 1000000000, kBucketCount,
-                            HistogramBase::kNoFlags));
-
-  histogram->AddCount(200000000, 15);
-  histogram->AddCount(300000000, 14);
-
-  std::unique_ptr<HistogramSamples> samples = histogram->SnapshotSamples();
-  EXPECT_EQ(29, samples->TotalCount());
-  EXPECT_EQ(15, samples->GetCount(200000000));
-  EXPECT_EQ(14, samples->GetCount(300000000));
-
-  histogram->AddCount(200000000, 25);
-  histogram->AddCount(300000000, 24);
-
-  std::unique_ptr<HistogramSamples> samples2 = histogram->SnapshotSamples();
-  EXPECT_EQ(78, samples2->TotalCount());
-  EXPECT_EQ(40, samples2->GetCount(200000000));
-  EXPECT_EQ(38, samples2->GetCount(300000000));
-  EXPECT_EQ(19400000000LL, samples2->sum());
-}
-
-// Some metrics are designed so that they are guaranteed not to overflow between
-// snapshots, but could overflow over a long-running session.
-// Make sure that counts returned by Histogram::SnapshotDelta do not overflow
-// even when a total count (returned by Histogram::SnapshotSample) does.
-TEST_P(HistogramTest, AddCount_LargeCountsDontOverflow) {
-  const size_t kBucketCount = 10;
-  Histogram* histogram = static_cast<Histogram*>(Histogram::FactoryGet(
-      "AddCountHistogram", 10, 50, kBucketCount, HistogramBase::kNoFlags));
-
-  const int count = (1 << 30) - 1;
-
-  // Repeat N times to make sure that there is no internal value overflow.
-  for (int i = 0; i < 10; ++i) {
-    histogram->AddCount(42, count);
-    std::unique_ptr<HistogramSamples> samples = histogram->SnapshotDelta();
-    EXPECT_EQ(count, samples->TotalCount());
-    EXPECT_EQ(count, samples->GetCount(42));
-  }
-}
-
-// Make sure histogram handles out-of-bounds data gracefully.
-TEST_P(HistogramTest, BoundsTest) {
-  const size_t kBucketCount = 50;
-  Histogram* histogram = static_cast<Histogram*>(
-      Histogram::FactoryGet("Bounded", 10, 100, kBucketCount,
-                            HistogramBase::kNoFlags));
-
-  // Put two samples "out of bounds" above and below.
-  histogram->Add(5);
-  histogram->Add(-50);
-
-  histogram->Add(100);
-  histogram->Add(10000);
-
-  // Verify they landed in the underflow, and overflow buckets.
-  std::unique_ptr<SampleVector> samples = histogram->SnapshotAllSamples();
-  EXPECT_EQ(2, samples->GetCountAtIndex(0));
-  EXPECT_EQ(0, samples->GetCountAtIndex(1));
-  size_t array_size = histogram->bucket_count();
-  EXPECT_EQ(kBucketCount, array_size);
-  EXPECT_EQ(0, samples->GetCountAtIndex(array_size - 2));
-  EXPECT_EQ(2, samples->GetCountAtIndex(array_size - 1));
-
-  std::vector<int> custom_ranges;
-  custom_ranges.push_back(10);
-  custom_ranges.push_back(50);
-  custom_ranges.push_back(100);
-  Histogram* test_custom_histogram = static_cast<Histogram*>(
-      CustomHistogram::FactoryGet("TestCustomRangeBoundedHistogram",
-                                  custom_ranges, HistogramBase::kNoFlags));
-
-  // Put two samples "out of bounds" above and below.
-  test_custom_histogram->Add(5);
-  test_custom_histogram->Add(-50);
-  test_custom_histogram->Add(100);
-  test_custom_histogram->Add(1000);
-  test_custom_histogram->Add(INT_MAX);
-
-  // Verify they landed in the underflow, and overflow buckets.
-  std::unique_ptr<SampleVector> custom_samples =
-      test_custom_histogram->SnapshotAllSamples();
-  EXPECT_EQ(2, custom_samples->GetCountAtIndex(0));
-  EXPECT_EQ(0, custom_samples->GetCountAtIndex(1));
-  size_t bucket_count = test_custom_histogram->bucket_count();
-  EXPECT_EQ(0, custom_samples->GetCountAtIndex(bucket_count - 2));
-  EXPECT_EQ(3, custom_samples->GetCountAtIndex(bucket_count - 1));
-}
-
-// Check to be sure samples land as expected is "correct" buckets.
-TEST_P(HistogramTest, BucketPlacementTest) {
-  Histogram* histogram = static_cast<Histogram*>(
-      Histogram::FactoryGet("Histogram", 1, 64, 8, HistogramBase::kNoFlags));
-
-  // Add i+1 samples to the i'th bucket.
-  histogram->Add(0);
-  int power_of_2 = 1;
-  for (int i = 1; i < 8; i++) {
-    for (int j = 0; j <= i; j++)
-      histogram->Add(power_of_2);
-    power_of_2 *= 2;
-  }
-
-  // Check to see that the bucket counts reflect our additions.
-  std::unique_ptr<SampleVector> samples = histogram->SnapshotAllSamples();
-  for (int i = 0; i < 8; i++)
-    EXPECT_EQ(i + 1, samples->GetCountAtIndex(i));
-}
-
-TEST_P(HistogramTest, CorruptSampleCounts) {
-  // The internal code creates histograms via macros and thus keeps static
-  // pointers to them. If those pointers are to persistent memory which will
-  // be free'd then any following calls to that code will crash with a
-  // segmentation violation.
-  if (use_persistent_histogram_allocator_)
-    return;
-
-  Histogram* histogram = static_cast<Histogram*>(
-      Histogram::FactoryGet("Histogram", 1, 64, 8, HistogramBase::kNoFlags));
-
-  // Add some samples.
-  histogram->Add(20);
-  histogram->Add(40);
-
-  std::unique_ptr<SampleVector> snapshot = histogram->SnapshotAllSamples();
-  EXPECT_EQ(HistogramBase::NO_INCONSISTENCIES,
-            histogram->FindCorruption(*snapshot));
-  EXPECT_EQ(2, snapshot->redundant_count());
-  EXPECT_EQ(2, snapshot->TotalCount());
-
-  snapshot->counts()[3] += 100;  // Sample count won't match redundant count.
-  EXPECT_EQ(HistogramBase::COUNT_LOW_ERROR,
-            histogram->FindCorruption(*snapshot));
-  snapshot->counts()[2] -= 200;
-  EXPECT_EQ(HistogramBase::COUNT_HIGH_ERROR,
-            histogram->FindCorruption(*snapshot));
-
-  // But we can't spot a corruption if it is compensated for.
-  snapshot->counts()[1] += 100;
-  EXPECT_EQ(HistogramBase::NO_INCONSISTENCIES,
-            histogram->FindCorruption(*snapshot));
-}
-
-TEST_P(HistogramTest, CorruptBucketBounds) {
-  Histogram* histogram = static_cast<Histogram*>(
-      Histogram::FactoryGet("Histogram", 1, 64, 8, HistogramBase::kNoFlags));
-
-  std::unique_ptr<HistogramSamples> snapshot = histogram->SnapshotSamples();
-  EXPECT_EQ(HistogramBase::NO_INCONSISTENCIES,
-            histogram->FindCorruption(*snapshot));
-
-  BucketRanges* bucket_ranges =
-      const_cast<BucketRanges*>(histogram->bucket_ranges());
-  HistogramBase::Sample tmp = bucket_ranges->range(1);
-  bucket_ranges->set_range(1, bucket_ranges->range(2));
-  bucket_ranges->set_range(2, tmp);
-  EXPECT_EQ(
-      HistogramBase::BUCKET_ORDER_ERROR | HistogramBase::RANGE_CHECKSUM_ERROR,
-      histogram->FindCorruption(*snapshot));
-
-  bucket_ranges->set_range(2, bucket_ranges->range(1));
-  bucket_ranges->set_range(1, tmp);
-  EXPECT_EQ(0U, histogram->FindCorruption(*snapshot));
-
-  // Show that two simple changes don't offset each other
-  bucket_ranges->set_range(3, bucket_ranges->range(3) + 1);
-  EXPECT_EQ(HistogramBase::RANGE_CHECKSUM_ERROR,
-            histogram->FindCorruption(*snapshot));
-
-  bucket_ranges->set_range(4, bucket_ranges->range(4) - 1);
-  EXPECT_EQ(HistogramBase::RANGE_CHECKSUM_ERROR,
-            histogram->FindCorruption(*snapshot));
-
-  // Repair histogram so that destructor won't DCHECK().
-  bucket_ranges->set_range(3, bucket_ranges->range(3) - 1);
-  bucket_ranges->set_range(4, bucket_ranges->range(4) + 1);
-}
-
-TEST_P(HistogramTest, HistogramSerializeInfo) {
-  Histogram* histogram = static_cast<Histogram*>(
-      Histogram::FactoryGet("Histogram", 1, 64, 8,
-                            HistogramBase::kIPCSerializationSourceFlag));
-  Pickle pickle;
-  histogram->SerializeInfo(&pickle);
-
-  PickleIterator iter(pickle);
-
-  int type;
-  EXPECT_TRUE(iter.ReadInt(&type));
-  EXPECT_EQ(HISTOGRAM, type);
-
-  std::string name;
-  EXPECT_TRUE(iter.ReadString(&name));
-  EXPECT_EQ("Histogram", name);
-
-  int flag;
-  EXPECT_TRUE(iter.ReadInt(&flag));
-  EXPECT_EQ(HistogramBase::kIPCSerializationSourceFlag,
-            flag & ~HistogramBase::kIsPersistent);
-
-  int min;
-  EXPECT_TRUE(iter.ReadInt(&min));
-  EXPECT_EQ(1, min);
-
-  int max;
-  EXPECT_TRUE(iter.ReadInt(&max));
-  EXPECT_EQ(64, max);
-
-  uint32_t bucket_count;
-  EXPECT_TRUE(iter.ReadUInt32(&bucket_count));
-  EXPECT_EQ(8u, bucket_count);
-
-  uint32_t checksum;
-  EXPECT_TRUE(iter.ReadUInt32(&checksum));
-  EXPECT_EQ(histogram->bucket_ranges()->checksum(), checksum);
-
-  // No more data in the pickle.
-  EXPECT_FALSE(iter.SkipBytes(1));
-}
-
-TEST_P(HistogramTest, CustomHistogramSerializeInfo) {
-  std::vector<int> custom_ranges;
-  custom_ranges.push_back(10);
-  custom_ranges.push_back(100);
-
-  HistogramBase* custom_histogram = CustomHistogram::FactoryGet(
-      "TestCustomRangeBoundedHistogram",
-      custom_ranges,
-      HistogramBase::kNoFlags);
-  Pickle pickle;
-  custom_histogram->SerializeInfo(&pickle);
-
-  // Validate the pickle.
-  PickleIterator iter(pickle);
-
-  int i;
-  std::string s;
-  uint32_t bucket_count;
-  uint32_t ui32;
-  EXPECT_TRUE(iter.ReadInt(&i) && iter.ReadString(&s) && iter.ReadInt(&i) &&
-              iter.ReadInt(&i) && iter.ReadInt(&i) &&
-              iter.ReadUInt32(&bucket_count) && iter.ReadUInt32(&ui32));
-  EXPECT_EQ(3u, bucket_count);
-
-  int range;
-  EXPECT_TRUE(iter.ReadInt(&range));
-  EXPECT_EQ(10, range);
-  EXPECT_TRUE(iter.ReadInt(&range));
-  EXPECT_EQ(100, range);
-
-  // No more data in the pickle.
-  EXPECT_FALSE(iter.SkipBytes(1));
-}
-
-TEST_P(HistogramTest, BadConstruction) {
-  HistogramBase* histogram = Histogram::FactoryGet(
-      "BadConstruction", 0, 100, 8, HistogramBase::kNoFlags);
-  EXPECT_TRUE(histogram->HasConstructionArguments(1, 100, 8));
-
-  // Try to get the same histogram name with different arguments.
-  HistogramBase* bad_histogram = Histogram::FactoryGet(
-      "BadConstruction", 0, 100, 7, HistogramBase::kNoFlags);
-  EXPECT_EQ(DummyHistogram::GetInstance(), bad_histogram);
-  bad_histogram = Histogram::FactoryGet(
-      "BadConstruction", 0, 99, 8, HistogramBase::kNoFlags);
-  EXPECT_EQ(DummyHistogram::GetInstance(), bad_histogram);
-
-  HistogramBase* linear_histogram = LinearHistogram::FactoryGet(
-      "BadConstructionLinear", 0, 100, 8, HistogramBase::kNoFlags);
-  EXPECT_TRUE(linear_histogram->HasConstructionArguments(1, 100, 8));
-
-  // Try to get the same histogram name with different arguments.
-  bad_histogram = LinearHistogram::FactoryGet(
-      "BadConstructionLinear", 0, 100, 7, HistogramBase::kNoFlags);
-  EXPECT_EQ(DummyHistogram::GetInstance(), bad_histogram);
-  bad_histogram = LinearHistogram::FactoryGet(
-      "BadConstructionLinear", 10, 100, 8, HistogramBase::kNoFlags);
-  EXPECT_EQ(DummyHistogram::GetInstance(), bad_histogram);
-}
-
-TEST_P(HistogramTest, FactoryTime) {
-  const int kTestCreateCount = 1 << 14;  // Must be power-of-2.
-  const int kTestLookupCount = 100000;
-  const int kTestAddCount = 1000000;
-
-  // Create all histogram names in advance for accurate timing below.
-  std::vector<std::string> histogram_names;
-  for (int i = 0; i < kTestCreateCount; ++i) {
-    histogram_names.push_back(
-        StringPrintf("TestHistogram.%d", i % kTestCreateCount));
-  }
-
-  // Calculate cost of creating histograms.
-  TimeTicks create_start = TimeTicks::Now();
-  for (int i = 0; i < kTestCreateCount; ++i) {
-    Histogram::FactoryGet(histogram_names[i], 1, 100, 10,
-                          HistogramBase::kNoFlags);
-  }
-  TimeDelta create_ticks = TimeTicks::Now() - create_start;
-  int64_t create_ms = create_ticks.InMilliseconds();
-
-  VLOG(1) << kTestCreateCount << " histogram creations took " << create_ms
-          << "ms or about "
-          << (create_ms * 1000000) / kTestCreateCount
-          << "ns each.";
-
-  // Calculate cost of looking up existing histograms.
-  TimeTicks lookup_start = TimeTicks::Now();
-  for (int i = 0; i < kTestLookupCount; ++i) {
-    // 6007 is co-prime with kTestCreateCount and so will do lookups in an
-    // order less likely to be cacheable (but still hit them all) should the
-    // underlying storage use the exact histogram name as the key.
-    const int i_mult = 6007;
-    static_assert(i_mult < INT_MAX / kTestCreateCount, "Multiplier too big");
-    int index = (i * i_mult) & (kTestCreateCount - 1);
-    Histogram::FactoryGet(histogram_names[index], 1, 100, 10,
-                          HistogramBase::kNoFlags);
-  }
-  TimeDelta lookup_ticks = TimeTicks::Now() - lookup_start;
-  int64_t lookup_ms = lookup_ticks.InMilliseconds();
-
-  VLOG(1) << kTestLookupCount << " histogram lookups took " << lookup_ms
-          << "ms or about "
-          << (lookup_ms * 1000000) / kTestLookupCount
-          << "ns each.";
-
-  // Calculate cost of accessing histograms.
-  HistogramBase* histogram = Histogram::FactoryGet(
-      histogram_names[0], 1, 100, 10, HistogramBase::kNoFlags);
-  ASSERT_TRUE(histogram);
-  TimeTicks add_start = TimeTicks::Now();
-  for (int i = 0; i < kTestAddCount; ++i)
-    histogram->Add(i & 127);
-  TimeDelta add_ticks = TimeTicks::Now() - add_start;
-  int64_t add_ms = add_ticks.InMilliseconds();
-
-  VLOG(1) << kTestAddCount << " histogram adds took " << add_ms
-          << "ms or about "
-          << (add_ms * 1000000) / kTestAddCount
-          << "ns each.";
-}
-
-// For Histogram, LinearHistogram and CustomHistogram, the minimum for a
-// declared range is 1, while the maximum is (HistogramBase::kSampleType_MAX -
-// 1). But we accept ranges exceeding those limits, and silently clamped to
-// those limits. This is for backwards compatibility.
-TEST(HistogramDeathTest, BadRangesTest) {
-  HistogramBase* histogram = Histogram::FactoryGet(
-      "BadRanges", 0, HistogramBase::kSampleType_MAX, 8,
-      HistogramBase::kNoFlags);
-  EXPECT_TRUE(
-      histogram->HasConstructionArguments(
-          1, HistogramBase::kSampleType_MAX - 1, 8));
-
-  HistogramBase* linear_histogram = LinearHistogram::FactoryGet(
-      "BadRangesLinear", 0, HistogramBase::kSampleType_MAX, 8,
-      HistogramBase::kNoFlags);
-  EXPECT_TRUE(
-      linear_histogram->HasConstructionArguments(
-          1, HistogramBase::kSampleType_MAX - 1, 8));
-
-  std::vector<int> custom_ranges;
-  custom_ranges.push_back(0);
-  custom_ranges.push_back(5);
-  Histogram* custom_histogram = static_cast<Histogram*>(
-      CustomHistogram::FactoryGet(
-          "BadRangesCustom", custom_ranges, HistogramBase::kNoFlags));
-  const BucketRanges* ranges = custom_histogram->bucket_ranges();
-  ASSERT_EQ(3u, ranges->size());
-  EXPECT_EQ(0, ranges->range(0));
-  EXPECT_EQ(5, ranges->range(1));
-  EXPECT_EQ(HistogramBase::kSampleType_MAX, ranges->range(2));
-
-  // CustomHistogram does not accepts kSampleType_MAX as range.
-  custom_ranges.push_back(HistogramBase::kSampleType_MAX);
-  EXPECT_DEATH_IF_SUPPORTED(
-      CustomHistogram::FactoryGet("BadRangesCustom2", custom_ranges,
-                                  HistogramBase::kNoFlags),
-               "");
-
-  // CustomHistogram needs at least 1 valid range.
-  custom_ranges.clear();
-  custom_ranges.push_back(0);
-  EXPECT_DEATH_IF_SUPPORTED(
-      CustomHistogram::FactoryGet("BadRangesCustom3", custom_ranges,
-                                  HistogramBase::kNoFlags),
-               "");
-}
-
-TEST_P(HistogramTest, ExpiredHistogramTest) {
-  HistogramBase* expired = Histogram::FactoryGet(kExpiredHistogramName, 1, 1000,
-                                                 10, HistogramBase::kNoFlags);
-  ASSERT_TRUE(expired);
-  expired->Add(5);
-  expired->Add(500);
-  auto samples = expired->SnapshotDelta();
-  EXPECT_EQ(0, samples->TotalCount());
-
-  HistogramBase* linear_expired = LinearHistogram::FactoryGet(
-      kExpiredHistogramName, 1, 1000, 10, HistogramBase::kNoFlags);
-  ASSERT_TRUE(linear_expired);
-  linear_expired->Add(5);
-  linear_expired->Add(500);
-  samples = linear_expired->SnapshotDelta();
-  EXPECT_EQ(0, samples->TotalCount());
-
-  std::vector<int> custom_ranges;
-  custom_ranges.push_back(1);
-  custom_ranges.push_back(5);
-  HistogramBase* custom_expired = CustomHistogram::FactoryGet(
-      kExpiredHistogramName, custom_ranges, HistogramBase::kNoFlags);
-  ASSERT_TRUE(custom_expired);
-  custom_expired->Add(2);
-  custom_expired->Add(4);
-  samples = custom_expired->SnapshotDelta();
-  EXPECT_EQ(0, samples->TotalCount());
-
-  HistogramBase* valid = Histogram::FactoryGet("ValidHistogram", 1, 1000, 10,
-                                               HistogramBase::kNoFlags);
-  ASSERT_TRUE(valid);
-  valid->Add(5);
-  valid->Add(500);
-  samples = valid->SnapshotDelta();
-  EXPECT_EQ(2, samples->TotalCount());
-
-  HistogramBase* linear_valid = LinearHistogram::FactoryGet(
-      "LinearHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
-  ASSERT_TRUE(linear_valid);
-  linear_valid->Add(5);
-  linear_valid->Add(500);
-  samples = linear_valid->SnapshotDelta();
-  EXPECT_EQ(2, samples->TotalCount());
-
-  HistogramBase* custom_valid = CustomHistogram::FactoryGet(
-      "CustomHistogram", custom_ranges, HistogramBase::kNoFlags);
-  ASSERT_TRUE(custom_valid);
-  custom_valid->Add(2);
-  custom_valid->Add(4);
-  samples = custom_valid->SnapshotDelta();
-  EXPECT_EQ(2, samples->TotalCount());
-}
-
-}  // namespace base
diff --git a/base/metrics/histogram_unittest.nc b/base/metrics/histogram_unittest.nc
deleted file mode 100644
index c9c2657..0000000
--- a/base/metrics/histogram_unittest.nc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a "No Compile Test" suite.
-// http://dev.chromium.org/developers/testing/no-compile-tests
-
-#include "base/metrics/histogram_functions.h"
-#include "base/metrics/histogram_macros.h"
-
-namespace base {
-
-#if defined(NCTEST_DIFFERENT_ENUM)  // [r"\|sample\| and \|boundary\| shouldn't be of different enums"]
-
-void WontCompile() {
-  enum TypeA { A };
-  enum TypeB { B };
-  UMA_HISTOGRAM_ENUMERATION("", A, B);
-}
-
-#elif defined(NCTEST_DIFFERENT_ENUM_CLASS)  // [r"\|sample\| and \|boundary\| shouldn't be of different enums"]
-
-void WontCompile() {
-  enum class TypeA { A };
-  enum class TypeB { B };
-  UMA_HISTOGRAM_ENUMERATION("", TypeA::A, TypeB::B);
-}
-
-#elif defined(NCTEST_DIFFERENT_ENUM_MIXED)  // [r"\|sample\| and \|boundary\| shouldn't be of different enums"]
-
-void WontCompile() {
-  enum class TypeA { A };
-  enum TypeB { B };
-  UMA_HISTOGRAM_ENUMERATION("", TypeA::A, B);
-}
-
-#elif defined(NCTEST_NEGATIVE_ENUM_MAX)  // [r'static_assert failed "\|boundary\| is out of range of HistogramBase::Sample"']
-
-void WontCompile() {
-  // Buckets for enumeration start from 0, so a boundary < 0 is illegal.
-  enum class TypeA { A = -1 };
-  UMA_HISTOGRAM_ENUMERATION("", TypeA::A, TypeA::A);
-}
-
-#elif defined(NCTEST_ENUM_MAX_OUT_OF_RANGE)  // [r'static_assert failed "\|boundary\| is out of range of HistogramBase::Sample"']
-
-void WontCompile() {
-  // HistogramBase::Sample is an int and can't hold larger values.
-  enum class TypeA : uint32_t { A = 0xffffffff };
-  UMA_HISTOGRAM_ENUMERATION("", TypeA::A, TypeA::A);
-}
-
-#elif defined(NCTEST_SAMPLE_NOT_ENUM)  // [r'static_assert failed "Unexpected: \|boundary\| is enum, but \|sample\| is not."']
-
-void WontCompile() {
-  enum TypeA { A };
-  UMA_HISTOGRAM_ENUMERATION("", 0, TypeA::A);
-}
-
-#elif defined(NCTEST_FUNCTION_INT)  // [r"Non enum passed to UmaHistogramEnumeration"]
-
-void WontCompile() {
-  UmaHistogramEnumeration("", 1, 2);
-}
-
-#elif defined(NCTEST_FUNCTION_DIFFERENT_ENUM)  // [r"no matching function for call to 'UmaHistogramEnumeration'"]
-
-void WontCompile() {
-  enum TypeA { A };
-  enum TypeB { B };
-  UmaHistogramEnumeration("", A, B);
-}
-
-#elif defined(NCTEST_FUNCTION_FIRST_NOT_ENUM)  // [r"no matching function for call to 'UmaHistogramEnumeration'"]
-
-void WontCompile() {
-  enum TypeB { B };
-  UmaHistogramEnumeration("", 1, B);
-}
-
-#elif defined(NCTEST_FUNCTION_SECOND_NOT_ENUM)  // [r"no matching function for call to 'UmaHistogramEnumeration'"]
-
-void WontCompile() {
-  enum TypeA { A };
-  UmaHistogramEnumeration("", A, 2);
-}
-
-#endif
-
-}  // namespace base
diff --git a/base/metrics/metrics_hashes_unittest.cc b/base/metrics/metrics_hashes_unittest.cc
deleted file mode 100644
index aea254e..0000000
--- a/base/metrics/metrics_hashes_unittest.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/metrics_hashes.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/format_macros.h"
-#include "base/macros.h"
-#include "base/strings/stringprintf.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-// Make sure our ID hashes are the same as what we see on the server side.
-TEST(MetricsUtilTest, HashMetricName) {
-  static const struct {
-    std::string input;
-    std::string output;
-  } cases[] = {
-    {"Back", "0x0557fa923dcee4d0"},
-    {"Forward", "0x67d2f6740a8eaebf"},
-    {"NewTab", "0x290eb683f96572f1"},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    uint64_t hash = HashMetricName(cases[i].input);
-    std::string hash_hex = base::StringPrintf("0x%016" PRIx64, hash);
-    EXPECT_EQ(cases[i].output, hash_hex);
-  }
-}
-
-}  // namespace metrics
diff --git a/base/metrics/persistent_histogram_allocator_unittest.cc b/base/metrics/persistent_histogram_allocator_unittest.cc
deleted file mode 100644
index 7e07386..0000000
--- a/base/metrics/persistent_histogram_allocator_unittest.cc
+++ /dev/null
@@ -1,375 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/persistent_histogram_allocator.h"
-
-#include "base/files/file.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/metrics/bucket_ranges.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/metrics/persistent_memory_allocator.h"
-#include "base/metrics/statistics_recorder.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-class PersistentHistogramAllocatorTest : public testing::Test {
- protected:
-  const int32_t kAllocatorMemorySize = 64 << 10;  // 64 KiB
-
-  PersistentHistogramAllocatorTest()
-      : statistics_recorder_(StatisticsRecorder::CreateTemporaryForTesting()) {
-    CreatePersistentHistogramAllocator();
-  }
-  ~PersistentHistogramAllocatorTest() override {
-    DestroyPersistentHistogramAllocator();
-  }
-
-  void CreatePersistentHistogramAllocator() {
-    allocator_memory_.reset(new char[kAllocatorMemorySize]);
-
-    GlobalHistogramAllocator::ReleaseForTesting();
-    memset(allocator_memory_.get(), 0, kAllocatorMemorySize);
-    GlobalHistogramAllocator::CreateWithPersistentMemory(
-        allocator_memory_.get(), kAllocatorMemorySize, 0, 0,
-        "PersistentHistogramAllocatorTest");
-    allocator_ = GlobalHistogramAllocator::Get()->memory_allocator();
-  }
-
-  void DestroyPersistentHistogramAllocator() {
-    allocator_ = nullptr;
-    GlobalHistogramAllocator::ReleaseForTesting();
-  }
-
-  std::unique_ptr<StatisticsRecorder> statistics_recorder_;
-  std::unique_ptr<char[]> allocator_memory_;
-  PersistentMemoryAllocator* allocator_ = nullptr;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PersistentHistogramAllocatorTest);
-};
-
-TEST_F(PersistentHistogramAllocatorTest, CreateAndIterate) {
-  PersistentMemoryAllocator::MemoryInfo meminfo0;
-  allocator_->GetMemoryInfo(&meminfo0);
-
-  // Try basic construction
-  HistogramBase* histogram = Histogram::FactoryGet(
-      "TestHistogram", 1, 1000, 10, HistogramBase::kIsPersistent);
-  EXPECT_TRUE(histogram);
-  histogram->CheckName("TestHistogram");
-  PersistentMemoryAllocator::MemoryInfo meminfo1;
-  allocator_->GetMemoryInfo(&meminfo1);
-  EXPECT_GT(meminfo0.free, meminfo1.free);
-
-  HistogramBase* linear_histogram = LinearHistogram::FactoryGet(
-      "TestLinearHistogram", 1, 1000, 10, HistogramBase::kIsPersistent);
-  EXPECT_TRUE(linear_histogram);
-  linear_histogram->CheckName("TestLinearHistogram");
-  PersistentMemoryAllocator::MemoryInfo meminfo2;
-  allocator_->GetMemoryInfo(&meminfo2);
-  EXPECT_GT(meminfo1.free, meminfo2.free);
-
-  HistogramBase* boolean_histogram = BooleanHistogram::FactoryGet(
-      "TestBooleanHistogram", HistogramBase::kIsPersistent);
-  EXPECT_TRUE(boolean_histogram);
-  boolean_histogram->CheckName("TestBooleanHistogram");
-  PersistentMemoryAllocator::MemoryInfo meminfo3;
-  allocator_->GetMemoryInfo(&meminfo3);
-  EXPECT_GT(meminfo2.free, meminfo3.free);
-
-  std::vector<int> custom_ranges;
-  custom_ranges.push_back(1);
-  custom_ranges.push_back(5);
-  HistogramBase* custom_histogram = CustomHistogram::FactoryGet(
-      "TestCustomHistogram", custom_ranges, HistogramBase::kIsPersistent);
-  EXPECT_TRUE(custom_histogram);
-  custom_histogram->CheckName("TestCustomHistogram");
-  PersistentMemoryAllocator::MemoryInfo meminfo4;
-  allocator_->GetMemoryInfo(&meminfo4);
-  EXPECT_GT(meminfo3.free, meminfo4.free);
-
-  PersistentMemoryAllocator::Iterator iter(allocator_);
-  uint32_t type;
-  EXPECT_NE(0U, iter.GetNext(&type));  // Histogram
-  EXPECT_NE(0U, iter.GetNext(&type));  // LinearHistogram
-  EXPECT_NE(0U, iter.GetNext(&type));  // BooleanHistogram
-  EXPECT_NE(0U, iter.GetNext(&type));  // CustomHistogram
-  EXPECT_EQ(0U, iter.GetNext(&type));
-
-  // Create a second allocator and have it access the memory of the first.
-  std::unique_ptr<HistogramBase> recovered;
-  PersistentHistogramAllocator recovery(
-      std::make_unique<PersistentMemoryAllocator>(
-          allocator_memory_.get(), kAllocatorMemorySize, 0, 0, "", false));
-  PersistentHistogramAllocator::Iterator histogram_iter(&recovery);
-
-  recovered = histogram_iter.GetNext();
-  ASSERT_TRUE(recovered);
-  recovered->CheckName("TestHistogram");
-
-  recovered = histogram_iter.GetNext();
-  ASSERT_TRUE(recovered);
-  recovered->CheckName("TestLinearHistogram");
-
-  recovered = histogram_iter.GetNext();
-  ASSERT_TRUE(recovered);
-  recovered->CheckName("TestBooleanHistogram");
-
-  recovered = histogram_iter.GetNext();
-  ASSERT_TRUE(recovered);
-  recovered->CheckName("TestCustomHistogram");
-
-  recovered = histogram_iter.GetNext();
-  EXPECT_FALSE(recovered);
-}
-
-TEST_F(PersistentHistogramAllocatorTest, ConstructPaths) {
-  const FilePath dir_path(FILE_PATH_LITERAL("foo/"));
-  const std::string dir_string =
-      dir_path.NormalizePathSeparators().AsUTF8Unsafe();
-
-  FilePath path = GlobalHistogramAllocator::ConstructFilePath(dir_path, "bar");
-  EXPECT_EQ(dir_string + "bar.pma", path.AsUTF8Unsafe());
-
-  std::string name;
-  Time stamp;
-  ProcessId pid;
-  EXPECT_FALSE(
-      GlobalHistogramAllocator::ParseFilePath(path, &name, nullptr, nullptr));
-  EXPECT_FALSE(
-      GlobalHistogramAllocator::ParseFilePath(path, nullptr, &stamp, nullptr));
-  EXPECT_FALSE(
-      GlobalHistogramAllocator::ParseFilePath(path, nullptr, nullptr, &pid));
-
-  path = GlobalHistogramAllocator::ConstructFilePathForUploadDir(
-      dir_path, "bar", Time::FromTimeT(12345), 6789);
-  EXPECT_EQ(dir_string + "bar-3039-1A85.pma", path.AsUTF8Unsafe());
-  ASSERT_TRUE(
-      GlobalHistogramAllocator::ParseFilePath(path, &name, &stamp, &pid));
-  EXPECT_EQ(name, "bar");
-  EXPECT_EQ(Time::FromTimeT(12345), stamp);
-  EXPECT_EQ(static_cast<ProcessId>(6789), pid);
-}
-
-TEST_F(PersistentHistogramAllocatorTest, CreateWithFile) {
-  const char temp_name[] = "CreateWithFileTest";
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath temp_file = temp_dir.GetPath().AppendASCII(temp_name);
-  const size_t temp_size = 64 << 10;  // 64 KiB
-
-  // Test creation of a new file.
-  GlobalHistogramAllocator::ReleaseForTesting();
-  GlobalHistogramAllocator::CreateWithFile(temp_file, temp_size, 0, temp_name);
-  EXPECT_EQ(std::string(temp_name),
-            GlobalHistogramAllocator::Get()->memory_allocator()->Name());
-
-  // Test re-open of a possibly-existing file.
-  GlobalHistogramAllocator::ReleaseForTesting();
-  GlobalHistogramAllocator::CreateWithFile(temp_file, temp_size, 0, "");
-  EXPECT_EQ(std::string(temp_name),
-            GlobalHistogramAllocator::Get()->memory_allocator()->Name());
-
-  // Test re-open of an known-existing file.
-  GlobalHistogramAllocator::ReleaseForTesting();
-  GlobalHistogramAllocator::CreateWithFile(temp_file, 0, 0, "");
-  EXPECT_EQ(std::string(temp_name),
-            GlobalHistogramAllocator::Get()->memory_allocator()->Name());
-
-  // Final release so file and temp-dir can be removed.
-  GlobalHistogramAllocator::ReleaseForTesting();
-}
-
-TEST_F(PersistentHistogramAllocatorTest, CreateSpareFile) {
-  const char temp_name[] = "CreateSpareFileTest.pma";
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath temp_file = temp_dir.GetPath().AppendASCII(temp_name);
-  const size_t temp_size = 64 << 10;  // 64 KiB
-
-  ASSERT_TRUE(GlobalHistogramAllocator::CreateSpareFile(temp_file, temp_size));
-
-  File file(temp_file, File::FLAG_OPEN | File::FLAG_READ);
-  ASSERT_TRUE(file.IsValid());
-  EXPECT_EQ(static_cast<int64_t>(temp_size), file.GetLength());
-
-  char buffer[256];
-  for (size_t pos = 0; pos < temp_size; pos += sizeof(buffer)) {
-    ASSERT_EQ(static_cast<int>(sizeof(buffer)),
-              file.ReadAtCurrentPos(buffer, sizeof(buffer)));
-    for (size_t i = 0; i < sizeof(buffer); ++i)
-      EXPECT_EQ(0, buffer[i]);
-  }
-}
-
-TEST_F(PersistentHistogramAllocatorTest, StatisticsRecorderMerge) {
-  const char LinearHistogramName[] = "SRTLinearHistogram";
-  const char SparseHistogramName[] = "SRTSparseHistogram";
-  const size_t starting_sr_count = StatisticsRecorder::GetHistogramCount();
-
-  // Create a local StatisticsRecorder in which the newly created histogram
-  // will be recorded. The global allocator must be replaced after because the
-  // act of releasing will cause the active SR to forget about all histograms
-  // in the relased memory.
-  std::unique_ptr<StatisticsRecorder> local_sr =
-      StatisticsRecorder::CreateTemporaryForTesting();
-  EXPECT_EQ(0U, StatisticsRecorder::GetHistogramCount());
-  std::unique_ptr<GlobalHistogramAllocator> old_allocator =
-      GlobalHistogramAllocator::ReleaseForTesting();
-  GlobalHistogramAllocator::CreateWithLocalMemory(kAllocatorMemorySize, 0, "");
-  ASSERT_TRUE(GlobalHistogramAllocator::Get());
-
-  // Create a linear histogram for merge testing.
-  HistogramBase* histogram1 =
-      LinearHistogram::FactoryGet(LinearHistogramName, 1, 10, 10, 0);
-  ASSERT_TRUE(histogram1);
-  EXPECT_EQ(1U, StatisticsRecorder::GetHistogramCount());
-  histogram1->Add(3);
-  histogram1->Add(1);
-  histogram1->Add(4);
-  histogram1->AddCount(1, 4);
-  histogram1->Add(6);
-
-  // Create a sparse histogram for merge testing.
-  HistogramBase* histogram2 =
-      SparseHistogram::FactoryGet(SparseHistogramName, 0);
-  ASSERT_TRUE(histogram2);
-  EXPECT_EQ(2U, StatisticsRecorder::GetHistogramCount());
-  histogram2->Add(3);
-  histogram2->Add(1);
-  histogram2->Add(4);
-  histogram2->AddCount(1, 4);
-  histogram2->Add(6);
-
-  // Destroy the local SR and ensure that we're back to the initial state and
-  // restore the global allocator. Histograms created in the local SR will
-  // become unmanaged.
-  std::unique_ptr<GlobalHistogramAllocator> new_allocator =
-      GlobalHistogramAllocator::ReleaseForTesting();
-  local_sr.reset();
-  EXPECT_EQ(starting_sr_count, StatisticsRecorder::GetHistogramCount());
-  GlobalHistogramAllocator::Set(std::move(old_allocator));
-
-  // Create a "recovery" allocator using the same memory as the local one.
-  PersistentHistogramAllocator recovery1(
-      std::make_unique<PersistentMemoryAllocator>(
-          const_cast<void*>(new_allocator->memory_allocator()->data()),
-          new_allocator->memory_allocator()->size(), 0, 0, "", false));
-  PersistentHistogramAllocator::Iterator histogram_iter1(&recovery1);
-
-  // Get the histograms that were created locally (and forgotten) and merge
-  // them into the global SR. New objects will be created.
-  std::unique_ptr<HistogramBase> recovered;
-  while (true) {
-    recovered = histogram_iter1.GetNext();
-    if (!recovered)
-      break;
-
-    recovery1.MergeHistogramDeltaToStatisticsRecorder(recovered.get());
-    HistogramBase* found =
-        StatisticsRecorder::FindHistogram(recovered->histogram_name());
-    EXPECT_NE(recovered.get(), found);
-  };
-  EXPECT_EQ(starting_sr_count + 2, StatisticsRecorder::GetHistogramCount());
-
-  // Check the merged histograms for accuracy.
-  HistogramBase* found = StatisticsRecorder::FindHistogram(LinearHistogramName);
-  ASSERT_TRUE(found);
-  std::unique_ptr<HistogramSamples> snapshot = found->SnapshotSamples();
-  EXPECT_EQ(found->SnapshotSamples()->TotalCount(), snapshot->TotalCount());
-  EXPECT_EQ(1, snapshot->GetCount(3));
-  EXPECT_EQ(5, snapshot->GetCount(1));
-  EXPECT_EQ(1, snapshot->GetCount(4));
-  EXPECT_EQ(1, snapshot->GetCount(6));
-
-  found = StatisticsRecorder::FindHistogram(SparseHistogramName);
-  ASSERT_TRUE(found);
-  snapshot = found->SnapshotSamples();
-  EXPECT_EQ(found->SnapshotSamples()->TotalCount(), snapshot->TotalCount());
-  EXPECT_EQ(1, snapshot->GetCount(3));
-  EXPECT_EQ(5, snapshot->GetCount(1));
-  EXPECT_EQ(1, snapshot->GetCount(4));
-  EXPECT_EQ(1, snapshot->GetCount(6));
-
-  // Perform additional histogram increments.
-  histogram1->AddCount(1, 3);
-  histogram1->Add(6);
-  histogram2->AddCount(1, 3);
-  histogram2->Add(7);
-
-  // Do another merge.
-  PersistentHistogramAllocator recovery2(
-      std::make_unique<PersistentMemoryAllocator>(
-          const_cast<void*>(new_allocator->memory_allocator()->data()),
-          new_allocator->memory_allocator()->size(), 0, 0, "", false));
-  PersistentHistogramAllocator::Iterator histogram_iter2(&recovery2);
-  while (true) {
-    recovered = histogram_iter2.GetNext();
-    if (!recovered)
-      break;
-    recovery2.MergeHistogramDeltaToStatisticsRecorder(recovered.get());
-  };
-  EXPECT_EQ(starting_sr_count + 2, StatisticsRecorder::GetHistogramCount());
-
-  // And verify.
-  found = StatisticsRecorder::FindHistogram(LinearHistogramName);
-  snapshot = found->SnapshotSamples();
-  EXPECT_EQ(found->SnapshotSamples()->TotalCount(), snapshot->TotalCount());
-  EXPECT_EQ(1, snapshot->GetCount(3));
-  EXPECT_EQ(8, snapshot->GetCount(1));
-  EXPECT_EQ(1, snapshot->GetCount(4));
-  EXPECT_EQ(2, snapshot->GetCount(6));
-
-  found = StatisticsRecorder::FindHistogram(SparseHistogramName);
-  snapshot = found->SnapshotSamples();
-  EXPECT_EQ(found->SnapshotSamples()->TotalCount(), snapshot->TotalCount());
-  EXPECT_EQ(1, snapshot->GetCount(3));
-  EXPECT_EQ(8, snapshot->GetCount(1));
-  EXPECT_EQ(1, snapshot->GetCount(4));
-  EXPECT_EQ(1, snapshot->GetCount(6));
-  EXPECT_EQ(1, snapshot->GetCount(7));
-}
-
-TEST_F(PersistentHistogramAllocatorTest, RangesDeDuplication) {
-  // This corresponds to the "ranges_ref" field of the PersistentHistogramData
-  // structure defined (privately) inside persistent_histogram_allocator.cc.
-  const int kRangesRefIndex = 5;
-
-  // Create two histograms with the same ranges.
-  HistogramBase* histogram1 =
-      Histogram::FactoryGet("TestHistogram1", 1, 1000, 10, 0);
-  HistogramBase* histogram2 =
-      Histogram::FactoryGet("TestHistogram2", 1, 1000, 10, 0);
-  const uint32_t ranges_ref = static_cast<Histogram*>(histogram1)
-                                  ->bucket_ranges()
-                                  ->persistent_reference();
-  ASSERT_NE(0U, ranges_ref);
-  EXPECT_EQ(ranges_ref, static_cast<Histogram*>(histogram2)
-                            ->bucket_ranges()
-                            ->persistent_reference());
-
-  // Make sure that the persistent data record is also correct. Two histograms
-  // will be fetched; other allocations are not "iterable".
-  PersistentMemoryAllocator::Iterator iter(allocator_);
-  uint32_t type;
-  uint32_t ref1 = iter.GetNext(&type);
-  uint32_t ref2 = iter.GetNext(&type);
-  EXPECT_EQ(0U, iter.GetNext(&type));
-  EXPECT_NE(0U, ref1);
-  EXPECT_NE(0U, ref2);
-  EXPECT_NE(ref1, ref2);
-
-  uint32_t* data1 =
-      allocator_->GetAsArray<uint32_t>(ref1, 0, kRangesRefIndex + 1);
-  uint32_t* data2 =
-      allocator_->GetAsArray<uint32_t>(ref2, 0, kRangesRefIndex + 1);
-  EXPECT_EQ(ranges_ref, data1[kRangesRefIndex]);
-  EXPECT_EQ(ranges_ref, data2[kRangesRefIndex]);
-}
-
-}  // namespace base
diff --git a/base/metrics/persistent_histogram_storage_unittest.cc b/base/metrics/persistent_histogram_storage_unittest.cc
deleted file mode 100644
index ed42068..0000000
--- a/base/metrics/persistent_histogram_storage_unittest.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/persistent_histogram_storage.h"
-
-#include <memory>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-// Name of the allocator for storing histograms.
-constexpr char kTestHistogramAllocatorName[] = "TestMetrics";
-
-}  // namespace
-
-class PersistentHistogramStorageTest : public testing::Test {
- protected:
-  PersistentHistogramStorageTest() = default;
-  ~PersistentHistogramStorageTest() override = default;
-
-  // Creates a unique temporary directory, and sets the test storage directory.
-  void SetUp() override {
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-    test_storage_dir_ =
-        temp_dir_path().AppendASCII(kTestHistogramAllocatorName);
-  }
-
-  // Gets the path to the temporary directory.
-  const FilePath& temp_dir_path() { return temp_dir_.GetPath(); }
-
-  const FilePath& test_storage_dir() { return test_storage_dir_; }
-
- private:
-  // A temporary directory where all file IO operations take place.
-  ScopedTempDir temp_dir_;
-
-  // The directory into which metrics files are written.
-  FilePath test_storage_dir_;
-
-  DISALLOW_COPY_AND_ASSIGN(PersistentHistogramStorageTest);
-};
-
-// TODO(chengx): Re-enable the test on OS_IOS after issue 836789 is fixed.
-// PersistentHistogramStorage is only used on OS_WIN now, so disabling this
-// test on OS_IOS is fine.
-#if !defined(OS_NACL) && !defined(OS_IOS)
-TEST_F(PersistentHistogramStorageTest, HistogramWriteTest) {
-  auto persistent_histogram_storage =
-      std::make_unique<PersistentHistogramStorage>(
-          kTestHistogramAllocatorName,
-          PersistentHistogramStorage::StorageDirManagement::kCreate);
-
-  persistent_histogram_storage->set_storage_base_dir(temp_dir_path());
-
-  // Log some random data.
-  UMA_HISTOGRAM_BOOLEAN("Some.Test.Metric", true);
-
-  // Deleting the object causes the data to be written to the disk.
-  persistent_histogram_storage.reset();
-
-  // The storage directory and the histogram file are created during the
-  // destruction of the PersistentHistogramStorage instance.
-  EXPECT_TRUE(DirectoryExists(test_storage_dir()));
-  EXPECT_FALSE(IsDirectoryEmpty(test_storage_dir()));
-}
-#endif  // !defined(OS_NACL) && !defined(OS_IOS)
-
-}  // namespace base
diff --git a/base/metrics/persistent_memory_allocator_unittest.cc b/base/metrics/persistent_memory_allocator_unittest.cc
deleted file mode 100644
index 75e4faa..0000000
--- a/base/metrics/persistent_memory_allocator_unittest.cc
+++ /dev/null
@@ -1,1001 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/persistent_memory_allocator.h"
-
-#include <memory>
-
-#include "base/files/file.h"
-#include "base/files/file_util.h"
-#include "base/files/memory_mapped_file.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/memory/shared_memory.h"
-#include "base/metrics/histogram.h"
-#include "base/rand_util.h"
-#include "base/strings/safe_sprintf.h"
-#include "base/strings/stringprintf.h"
-#include "base/synchronization/condition_variable.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/simple_thread.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace base {
-
-namespace {
-
-const uint32_t TEST_MEMORY_SIZE = 1 << 20;   // 1 MiB
-const uint32_t TEST_MEMORY_PAGE = 64 << 10;  // 64 KiB
-const uint32_t TEST_ID = 12345;
-const char TEST_NAME[] = "TestAllocator";
-
-void SetFileLength(const base::FilePath& path, size_t length) {
-  {
-    File file(path, File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE);
-    DCHECK(file.IsValid());
-    ASSERT_TRUE(file.SetLength(static_cast<int64_t>(length)));
-  }
-
-  int64_t actual_length;
-  DCHECK(GetFileSize(path, &actual_length));
-  DCHECK_EQ(length, static_cast<size_t>(actual_length));
-}
-
-}  // namespace
-
-typedef PersistentMemoryAllocator::Reference Reference;
-
-class PersistentMemoryAllocatorTest : public testing::Test {
- public:
-  // This can't be statically initialized because it's value isn't defined
-  // in the PersistentMemoryAllocator header file. Instead, it's simply set
-  // in the constructor.
-  uint32_t kAllocAlignment;
-
-  struct TestObject1 {
-    static constexpr uint32_t kPersistentTypeId = 1;
-    static constexpr size_t kExpectedInstanceSize = 4 + 1 + 3;
-    int32_t onething;
-    char oranother;
-  };
-
-  struct TestObject2 {
-    static constexpr uint32_t kPersistentTypeId = 2;
-    static constexpr size_t kExpectedInstanceSize = 8 + 4 + 4 + 8 + 8;
-    int64_t thiis;
-    int32_t that;
-    float andthe;
-    double other;
-    char thing[8];
-  };
-
-  PersistentMemoryAllocatorTest() {
-    kAllocAlignment = GetAllocAlignment();
-    mem_segment_.reset(new char[TEST_MEMORY_SIZE]);
-  }
-
-  void SetUp() override {
-    allocator_.reset();
-    ::memset(mem_segment_.get(), 0, TEST_MEMORY_SIZE);
-    allocator_.reset(new PersistentMemoryAllocator(
-        mem_segment_.get(), TEST_MEMORY_SIZE, TEST_MEMORY_PAGE,
-        TEST_ID, TEST_NAME, false));
-  }
-
-  void TearDown() override {
-    allocator_.reset();
-  }
-
-  unsigned CountIterables() {
-    PersistentMemoryAllocator::Iterator iter(allocator_.get());
-    uint32_t type;
-    unsigned count = 0;
-    while (iter.GetNext(&type) != 0) {
-      ++count;
-    }
-    return count;
-  }
-
-  static uint32_t GetAllocAlignment() {
-    return PersistentMemoryAllocator::kAllocAlignment;
-  }
-
- protected:
-  std::unique_ptr<char[]> mem_segment_;
-  std::unique_ptr<PersistentMemoryAllocator> allocator_;
-};
-
-TEST_F(PersistentMemoryAllocatorTest, AllocateAndIterate) {
-  allocator_->CreateTrackingHistograms(allocator_->Name());
-
-  std::string base_name(TEST_NAME);
-  EXPECT_EQ(TEST_ID, allocator_->Id());
-  EXPECT_TRUE(allocator_->used_histogram_);
-  EXPECT_EQ("UMA.PersistentAllocator." + base_name + ".UsedPct",
-            allocator_->used_histogram_->histogram_name());
-  EXPECT_EQ(PersistentMemoryAllocator::MEMORY_INITIALIZED,
-            allocator_->GetMemoryState());
-
-  // Get base memory info for later comparison.
-  PersistentMemoryAllocator::MemoryInfo meminfo0;
-  allocator_->GetMemoryInfo(&meminfo0);
-  EXPECT_EQ(TEST_MEMORY_SIZE, meminfo0.total);
-  EXPECT_GT(meminfo0.total, meminfo0.free);
-
-  // Validate allocation of test object and make sure it can be referenced
-  // and all metadata looks correct.
-  TestObject1* obj1 = allocator_->New<TestObject1>();
-  ASSERT_TRUE(obj1);
-  Reference block1 = allocator_->GetAsReference(obj1);
-  ASSERT_NE(0U, block1);
-  EXPECT_NE(nullptr, allocator_->GetAsObject<TestObject1>(block1));
-  EXPECT_EQ(nullptr, allocator_->GetAsObject<TestObject2>(block1));
-  EXPECT_LE(sizeof(TestObject1), allocator_->GetAllocSize(block1));
-  EXPECT_GT(sizeof(TestObject1) + kAllocAlignment,
-            allocator_->GetAllocSize(block1));
-  PersistentMemoryAllocator::MemoryInfo meminfo1;
-  allocator_->GetMemoryInfo(&meminfo1);
-  EXPECT_EQ(meminfo0.total, meminfo1.total);
-  EXPECT_GT(meminfo0.free, meminfo1.free);
-
-  // Verify that pointers can be turned back into references and that invalid
-  // addresses return null.
-  char* memory1 = allocator_->GetAsArray<char>(block1, 1, 1);
-  ASSERT_TRUE(memory1);
-  EXPECT_EQ(block1, allocator_->GetAsReference(memory1, 0));
-  EXPECT_EQ(block1, allocator_->GetAsReference(memory1, 1));
-  EXPECT_EQ(0U, allocator_->GetAsReference(memory1, 2));
-  EXPECT_EQ(0U, allocator_->GetAsReference(memory1 + 1, 0));
-  EXPECT_EQ(0U, allocator_->GetAsReference(memory1 + 16, 0));
-  EXPECT_EQ(0U, allocator_->GetAsReference(nullptr, 0));
-  EXPECT_EQ(0U, allocator_->GetAsReference(&base_name, 0));
-
-  // Ensure that the test-object can be made iterable.
-  PersistentMemoryAllocator::Iterator iter1a(allocator_.get());
-  EXPECT_EQ(0U, iter1a.GetLast());
-  uint32_t type;
-  EXPECT_EQ(0U, iter1a.GetNext(&type));
-  allocator_->MakeIterable(block1);
-  EXPECT_EQ(block1, iter1a.GetNext(&type));
-  EXPECT_EQ(1U, type);
-  EXPECT_EQ(block1, iter1a.GetLast());
-  EXPECT_EQ(0U, iter1a.GetNext(&type));
-  EXPECT_EQ(block1, iter1a.GetLast());
-
-  // Create second test-object and ensure everything is good and it cannot
-  // be confused with test-object of another type.
-  TestObject2* obj2 = allocator_->New<TestObject2>();
-  ASSERT_TRUE(obj2);
-  Reference block2 = allocator_->GetAsReference(obj2);
-  ASSERT_NE(0U, block2);
-  EXPECT_NE(nullptr, allocator_->GetAsObject<TestObject2>(block2));
-  EXPECT_EQ(nullptr, allocator_->GetAsObject<TestObject1>(block2));
-  EXPECT_LE(sizeof(TestObject2), allocator_->GetAllocSize(block2));
-  EXPECT_GT(sizeof(TestObject2) + kAllocAlignment,
-            allocator_->GetAllocSize(block2));
-  PersistentMemoryAllocator::MemoryInfo meminfo2;
-  allocator_->GetMemoryInfo(&meminfo2);
-  EXPECT_EQ(meminfo1.total, meminfo2.total);
-  EXPECT_GT(meminfo1.free, meminfo2.free);
-
-  // Ensure that second test-object can also be made iterable.
-  allocator_->MakeIterable(obj2);
-  EXPECT_EQ(block2, iter1a.GetNext(&type));
-  EXPECT_EQ(2U, type);
-  EXPECT_EQ(block2, iter1a.GetLast());
-  EXPECT_EQ(0U, iter1a.GetNext(&type));
-  EXPECT_EQ(block2, iter1a.GetLast());
-
-  // Check that the iterator can be reset to the beginning.
-  iter1a.Reset();
-  EXPECT_EQ(0U, iter1a.GetLast());
-  EXPECT_EQ(block1, iter1a.GetNext(&type));
-  EXPECT_EQ(block1, iter1a.GetLast());
-  EXPECT_EQ(block2, iter1a.GetNext(&type));
-  EXPECT_EQ(block2, iter1a.GetLast());
-  EXPECT_EQ(0U, iter1a.GetNext(&type));
-
-  // Check that the iterator can be reset to an arbitrary location.
-  iter1a.Reset(block1);
-  EXPECT_EQ(block1, iter1a.GetLast());
-  EXPECT_EQ(block2, iter1a.GetNext(&type));
-  EXPECT_EQ(block2, iter1a.GetLast());
-  EXPECT_EQ(0U, iter1a.GetNext(&type));
-
-  // Check that iteration can begin after an arbitrary location.
-  PersistentMemoryAllocator::Iterator iter1b(allocator_.get(), block1);
-  EXPECT_EQ(block2, iter1b.GetNext(&type));
-  EXPECT_EQ(0U, iter1b.GetNext(&type));
-
-  // Ensure nothing has gone noticably wrong.
-  EXPECT_FALSE(allocator_->IsFull());
-  EXPECT_FALSE(allocator_->IsCorrupt());
-
-  // Check the internal histogram record of used memory.
-  allocator_->UpdateTrackingHistograms();
-  std::unique_ptr<HistogramSamples> used_samples(
-      allocator_->used_histogram_->SnapshotSamples());
-  EXPECT_TRUE(used_samples);
-  EXPECT_EQ(1, used_samples->TotalCount());
-
-  // Check that an object's type can be changed.
-  EXPECT_EQ(2U, allocator_->GetType(block2));
-  allocator_->ChangeType(block2, 3, 2, false);
-  EXPECT_EQ(3U, allocator_->GetType(block2));
-  allocator_->New<TestObject2>(block2, 3, false);
-  EXPECT_EQ(2U, allocator_->GetType(block2));
-
-  // Create second allocator (read/write) using the same memory segment.
-  std::unique_ptr<PersistentMemoryAllocator> allocator2(
-      new PersistentMemoryAllocator(mem_segment_.get(), TEST_MEMORY_SIZE,
-                                    TEST_MEMORY_PAGE, 0, "", false));
-  EXPECT_EQ(TEST_ID, allocator2->Id());
-  EXPECT_FALSE(allocator2->used_histogram_);
-
-  // Ensure that iteration and access through second allocator works.
-  PersistentMemoryAllocator::Iterator iter2(allocator2.get());
-  EXPECT_EQ(block1, iter2.GetNext(&type));
-  EXPECT_EQ(block2, iter2.GetNext(&type));
-  EXPECT_EQ(0U, iter2.GetNext(&type));
-  EXPECT_NE(nullptr, allocator2->GetAsObject<TestObject1>(block1));
-  EXPECT_NE(nullptr, allocator2->GetAsObject<TestObject2>(block2));
-
-  // Create a third allocator (read-only) using the same memory segment.
-  std::unique_ptr<const PersistentMemoryAllocator> allocator3(
-      new PersistentMemoryAllocator(mem_segment_.get(), TEST_MEMORY_SIZE,
-                                    TEST_MEMORY_PAGE, 0, "", true));
-  EXPECT_EQ(TEST_ID, allocator3->Id());
-  EXPECT_FALSE(allocator3->used_histogram_);
-
-  // Ensure that iteration and access through third allocator works.
-  PersistentMemoryAllocator::Iterator iter3(allocator3.get());
-  EXPECT_EQ(block1, iter3.GetNext(&type));
-  EXPECT_EQ(block2, iter3.GetNext(&type));
-  EXPECT_EQ(0U, iter3.GetNext(&type));
-  EXPECT_NE(nullptr, allocator3->GetAsObject<TestObject1>(block1));
-  EXPECT_NE(nullptr, allocator3->GetAsObject<TestObject2>(block2));
-
-  // Ensure that GetNextOfType works.
-  PersistentMemoryAllocator::Iterator iter1c(allocator_.get());
-  EXPECT_EQ(block2, iter1c.GetNextOfType<TestObject2>());
-  EXPECT_EQ(0U, iter1c.GetNextOfType(2));
-
-  // Ensure that GetNextOfObject works.
-  PersistentMemoryAllocator::Iterator iter1d(allocator_.get());
-  EXPECT_EQ(obj2, iter1d.GetNextOfObject<TestObject2>());
-  EXPECT_EQ(nullptr, iter1d.GetNextOfObject<TestObject2>());
-
-  // Ensure that deleting an object works.
-  allocator_->Delete(obj2);
-  PersistentMemoryAllocator::Iterator iter1z(allocator_.get());
-  EXPECT_EQ(nullptr, iter1z.GetNextOfObject<TestObject2>());
-
-  // Ensure that the memory state can be set.
-  allocator_->SetMemoryState(PersistentMemoryAllocator::MEMORY_DELETED);
-  EXPECT_EQ(PersistentMemoryAllocator::MEMORY_DELETED,
-            allocator_->GetMemoryState());
-}
-
-TEST_F(PersistentMemoryAllocatorTest, PageTest) {
-  // This allocation will go into the first memory page.
-  Reference block1 = allocator_->Allocate(TEST_MEMORY_PAGE / 2, 1);
-  EXPECT_LT(0U, block1);
-  EXPECT_GT(TEST_MEMORY_PAGE, block1);
-
-  // This allocation won't fit in same page as previous block.
-  Reference block2 =
-      allocator_->Allocate(TEST_MEMORY_PAGE - 2 * kAllocAlignment, 2);
-  EXPECT_EQ(TEST_MEMORY_PAGE, block2);
-
-  // This allocation will also require a new page.
-  Reference block3 = allocator_->Allocate(2 * kAllocAlignment + 99, 3);
-  EXPECT_EQ(2U * TEST_MEMORY_PAGE, block3);
-}
-
-// A simple thread that takes an allocator and repeatedly allocates random-
-// sized chunks from it until no more can be done.
-class AllocatorThread : public SimpleThread {
- public:
-  AllocatorThread(const std::string& name,
-                  void* base,
-                  uint32_t size,
-                  uint32_t page_size)
-      : SimpleThread(name, Options()),
-        count_(0),
-        iterable_(0),
-        allocator_(base, size, page_size, 0, std::string(), false) {}
-
-  void Run() override {
-    for (;;) {
-      uint32_t size = RandInt(1, 99);
-      uint32_t type = RandInt(100, 999);
-      Reference block = allocator_.Allocate(size, type);
-      if (!block)
-        break;
-
-      count_++;
-      if (RandInt(0, 1)) {
-        allocator_.MakeIterable(block);
-        iterable_++;
-      }
-    }
-  }
-
-  unsigned iterable() { return iterable_; }
-  unsigned count() { return count_; }
-
- private:
-  unsigned count_;
-  unsigned iterable_;
-  PersistentMemoryAllocator allocator_;
-};
-
-// Test parallel allocation/iteration and ensure consistency across all
-// instances.
-TEST_F(PersistentMemoryAllocatorTest, ParallelismTest) {
-  void* memory = mem_segment_.get();
-  AllocatorThread t1("t1", memory, TEST_MEMORY_SIZE, TEST_MEMORY_PAGE);
-  AllocatorThread t2("t2", memory, TEST_MEMORY_SIZE, TEST_MEMORY_PAGE);
-  AllocatorThread t3("t3", memory, TEST_MEMORY_SIZE, TEST_MEMORY_PAGE);
-  AllocatorThread t4("t4", memory, TEST_MEMORY_SIZE, TEST_MEMORY_PAGE);
-  AllocatorThread t5("t5", memory, TEST_MEMORY_SIZE, TEST_MEMORY_PAGE);
-
-  t1.Start();
-  t2.Start();
-  t3.Start();
-  t4.Start();
-  t5.Start();
-
-  unsigned last_count = 0;
-  do {
-    unsigned count = CountIterables();
-    EXPECT_LE(last_count, count);
-  } while (!allocator_->IsCorrupt() && !allocator_->IsFull());
-
-  t1.Join();
-  t2.Join();
-  t3.Join();
-  t4.Join();
-  t5.Join();
-
-  EXPECT_FALSE(allocator_->IsCorrupt());
-  EXPECT_TRUE(allocator_->IsFull());
-  EXPECT_EQ(CountIterables(),
-            t1.iterable() + t2.iterable() + t3.iterable() + t4.iterable() +
-            t5.iterable());
-}
-
-// A simple thread that counts objects by iterating through an allocator.
-class CounterThread : public SimpleThread {
- public:
-  CounterThread(const std::string& name,
-                PersistentMemoryAllocator::Iterator* iterator,
-                Lock* lock,
-                ConditionVariable* condition,
-                bool* wake_up)
-      : SimpleThread(name, Options()),
-        iterator_(iterator),
-        lock_(lock),
-        condition_(condition),
-        count_(0),
-        wake_up_(wake_up) {}
-
-  void Run() override {
-    // Wait so all threads can start at approximately the same time.
-    // Best performance comes from releasing a single worker which then
-    // releases the next, etc., etc.
-    {
-      AutoLock autolock(*lock_);
-
-      // Before calling Wait(), make sure that the wake up condition
-      // has not already passed.  Also, since spurious signal events
-      // are possible, check the condition in a while loop to make
-      // sure that the wake up condition is met when this thread
-      // returns from the Wait().
-      // See usage comments in src/base/synchronization/condition_variable.h.
-      while (!*wake_up_) {
-        condition_->Wait();
-        condition_->Signal();
-      }
-    }
-
-    uint32_t type;
-    while (iterator_->GetNext(&type) != 0) {
-      ++count_;
-    }
-  }
-
-  unsigned count() { return count_; }
-
- private:
-  PersistentMemoryAllocator::Iterator* iterator_;
-  Lock* lock_;
-  ConditionVariable* condition_;
-  unsigned count_;
-  bool* wake_up_;
-
-  DISALLOW_COPY_AND_ASSIGN(CounterThread);
-};
-
-// Ensure that parallel iteration returns the same number of objects as
-// single-threaded iteration.
-TEST_F(PersistentMemoryAllocatorTest, IteratorParallelismTest) {
-  // Fill the memory segment with random allocations.
-  unsigned iterable_count = 0;
-  for (;;) {
-    uint32_t size = RandInt(1, 99);
-    uint32_t type = RandInt(100, 999);
-    Reference block = allocator_->Allocate(size, type);
-    if (!block)
-      break;
-    allocator_->MakeIterable(block);
-    ++iterable_count;
-  }
-  EXPECT_FALSE(allocator_->IsCorrupt());
-  EXPECT_TRUE(allocator_->IsFull());
-  EXPECT_EQ(iterable_count, CountIterables());
-
-  PersistentMemoryAllocator::Iterator iter(allocator_.get());
-  Lock lock;
-  ConditionVariable condition(&lock);
-  bool wake_up = false;
-
-  CounterThread t1("t1", &iter, &lock, &condition, &wake_up);
-  CounterThread t2("t2", &iter, &lock, &condition, &wake_up);
-  CounterThread t3("t3", &iter, &lock, &condition, &wake_up);
-  CounterThread t4("t4", &iter, &lock, &condition, &wake_up);
-  CounterThread t5("t5", &iter, &lock, &condition, &wake_up);
-
-  t1.Start();
-  t2.Start();
-  t3.Start();
-  t4.Start();
-  t5.Start();
-
-  // Take the lock and set the wake up condition to true.  This helps to
-  // avoid a race condition where the Signal() event is called before
-  // all the threads have reached the Wait() and thus never get woken up.
-  {
-    AutoLock autolock(lock);
-    wake_up = true;
-  }
-
-  // This will release all the waiting threads.
-  condition.Signal();
-
-  t1.Join();
-  t2.Join();
-  t3.Join();
-  t4.Join();
-  t5.Join();
-
-  EXPECT_EQ(iterable_count,
-            t1.count() + t2.count() + t3.count() + t4.count() + t5.count());
-
-#if 0
-  // These ensure that the threads don't run sequentially. It shouldn't be
-  // enabled in general because it could lead to a flaky test if it happens
-  // simply by chance but it is useful during development to ensure that the
-  // test is working correctly.
-  EXPECT_NE(iterable_count, t1.count());
-  EXPECT_NE(iterable_count, t2.count());
-  EXPECT_NE(iterable_count, t3.count());
-  EXPECT_NE(iterable_count, t4.count());
-  EXPECT_NE(iterable_count, t5.count());
-#endif
-}
-
-TEST_F(PersistentMemoryAllocatorTest, DelayedAllocationTest) {
-  std::atomic<Reference> ref1, ref2;
-  ref1.store(0, std::memory_order_relaxed);
-  ref2.store(0, std::memory_order_relaxed);
-  DelayedPersistentAllocation da1(allocator_.get(), &ref1, 1001, 100, true);
-  DelayedPersistentAllocation da2a(allocator_.get(), &ref2, 2002, 200, 0, true);
-  DelayedPersistentAllocation da2b(allocator_.get(), &ref2, 2002, 200, 5, true);
-
-  // Nothing should yet have been allocated.
-  uint32_t type;
-  PersistentMemoryAllocator::Iterator iter(allocator_.get());
-  EXPECT_EQ(0U, iter.GetNext(&type));
-
-  // Do first delayed allocation and check that a new persistent object exists.
-  EXPECT_EQ(0U, da1.reference());
-  void* mem1 = da1.Get();
-  ASSERT_TRUE(mem1);
-  EXPECT_NE(0U, da1.reference());
-  EXPECT_EQ(allocator_->GetAsReference(mem1, 1001),
-            ref1.load(std::memory_order_relaxed));
-  EXPECT_NE(0U, iter.GetNext(&type));
-  EXPECT_EQ(1001U, type);
-  EXPECT_EQ(0U, iter.GetNext(&type));
-
-  // Do second delayed allocation and check.
-  void* mem2a = da2a.Get();
-  ASSERT_TRUE(mem2a);
-  EXPECT_EQ(allocator_->GetAsReference(mem2a, 2002),
-            ref2.load(std::memory_order_relaxed));
-  EXPECT_NE(0U, iter.GetNext(&type));
-  EXPECT_EQ(2002U, type);
-  EXPECT_EQ(0U, iter.GetNext(&type));
-
-  // Third allocation should just return offset into second allocation.
-  void* mem2b = da2b.Get();
-  ASSERT_TRUE(mem2b);
-  EXPECT_EQ(0U, iter.GetNext(&type));
-  EXPECT_EQ(reinterpret_cast<uintptr_t>(mem2a) + 5,
-            reinterpret_cast<uintptr_t>(mem2b));
-}
-
-// This test doesn't verify anything other than it doesn't crash. Its goal
-// is to find coding errors that aren't otherwise tested for, much like a
-// "fuzzer" would.
-// This test is suppsoed to fail on TSAN bot (crbug.com/579867).
-#if defined(THREAD_SANITIZER)
-#define MAYBE_CorruptionTest DISABLED_CorruptionTest
-#else
-#define MAYBE_CorruptionTest CorruptionTest
-#endif
-TEST_F(PersistentMemoryAllocatorTest, MAYBE_CorruptionTest) {
-  char* memory = mem_segment_.get();
-  AllocatorThread t1("t1", memory, TEST_MEMORY_SIZE, TEST_MEMORY_PAGE);
-  AllocatorThread t2("t2", memory, TEST_MEMORY_SIZE, TEST_MEMORY_PAGE);
-  AllocatorThread t3("t3", memory, TEST_MEMORY_SIZE, TEST_MEMORY_PAGE);
-  AllocatorThread t4("t4", memory, TEST_MEMORY_SIZE, TEST_MEMORY_PAGE);
-  AllocatorThread t5("t5", memory, TEST_MEMORY_SIZE, TEST_MEMORY_PAGE);
-
-  t1.Start();
-  t2.Start();
-  t3.Start();
-  t4.Start();
-  t5.Start();
-
-  do {
-    size_t offset = RandInt(0, TEST_MEMORY_SIZE - 1);
-    char value = RandInt(0, 255);
-    memory[offset] = value;
-  } while (!allocator_->IsCorrupt() && !allocator_->IsFull());
-
-  t1.Join();
-  t2.Join();
-  t3.Join();
-  t4.Join();
-  t5.Join();
-
-  CountIterables();
-}
-
-// Attempt to cause crashes or loops by expressly creating dangerous conditions.
-TEST_F(PersistentMemoryAllocatorTest, MaliciousTest) {
-  Reference block1 = allocator_->Allocate(sizeof(TestObject1), 1);
-  Reference block2 = allocator_->Allocate(sizeof(TestObject1), 2);
-  Reference block3 = allocator_->Allocate(sizeof(TestObject1), 3);
-  Reference block4 = allocator_->Allocate(sizeof(TestObject1), 3);
-  Reference block5 = allocator_->Allocate(sizeof(TestObject1), 3);
-  allocator_->MakeIterable(block1);
-  allocator_->MakeIterable(block2);
-  allocator_->MakeIterable(block3);
-  allocator_->MakeIterable(block4);
-  allocator_->MakeIterable(block5);
-  EXPECT_EQ(5U, CountIterables());
-  EXPECT_FALSE(allocator_->IsCorrupt());
-
-  // Create loop in iterable list and ensure it doesn't hang. The return value
-  // from CountIterables() in these cases is unpredictable. If there is a
-  // failure, the call will hang and the test killed for taking too long.
-  uint32_t* header4 = (uint32_t*)(mem_segment_.get() + block4);
-  EXPECT_EQ(block5, header4[3]);
-  header4[3] = block4;
-  CountIterables();  // loop: 1-2-3-4-4
-  EXPECT_TRUE(allocator_->IsCorrupt());
-
-  // Test where loop goes back to previous block.
-  header4[3] = block3;
-  CountIterables();  // loop: 1-2-3-4-3
-
-  // Test where loop goes back to the beginning.
-  header4[3] = block1;
-  CountIterables();  // loop: 1-2-3-4-1
-}
-
-
-//----- LocalPersistentMemoryAllocator -----------------------------------------
-
-TEST(LocalPersistentMemoryAllocatorTest, CreationTest) {
-  LocalPersistentMemoryAllocator allocator(TEST_MEMORY_SIZE, 42, "");
-  EXPECT_EQ(42U, allocator.Id());
-  EXPECT_NE(0U, allocator.Allocate(24, 1));
-  EXPECT_FALSE(allocator.IsFull());
-  EXPECT_FALSE(allocator.IsCorrupt());
-}
-
-
-//----- SharedPersistentMemoryAllocator ----------------------------------------
-
-TEST(SharedPersistentMemoryAllocatorTest, CreationTest) {
-  SharedMemoryHandle shared_handle_1;
-  SharedMemoryHandle shared_handle_2;
-
-  PersistentMemoryAllocator::MemoryInfo meminfo1;
-  Reference r123, r456, r789;
-  {
-    std::unique_ptr<SharedMemory> shmem1(new SharedMemory());
-    ASSERT_TRUE(shmem1->CreateAndMapAnonymous(TEST_MEMORY_SIZE));
-    SharedPersistentMemoryAllocator local(std::move(shmem1), TEST_ID, "",
-                                          false);
-    EXPECT_FALSE(local.IsReadonly());
-    r123 = local.Allocate(123, 123);
-    r456 = local.Allocate(456, 456);
-    r789 = local.Allocate(789, 789);
-    local.MakeIterable(r123);
-    local.ChangeType(r456, 654, 456, false);
-    local.MakeIterable(r789);
-    local.GetMemoryInfo(&meminfo1);
-    EXPECT_FALSE(local.IsFull());
-    EXPECT_FALSE(local.IsCorrupt());
-
-    shared_handle_1 = local.shared_memory()->handle().Duplicate();
-    ASSERT_TRUE(shared_handle_1.IsValid());
-    shared_handle_2 = local.shared_memory()->handle().Duplicate();
-    ASSERT_TRUE(shared_handle_2.IsValid());
-  }
-
-  // Read-only test.
-  std::unique_ptr<SharedMemory> shmem2(new SharedMemory(shared_handle_1,
-                                                        /*readonly=*/true));
-  ASSERT_TRUE(shmem2->Map(TEST_MEMORY_SIZE));
-
-  SharedPersistentMemoryAllocator shalloc2(std::move(shmem2), 0, "", true);
-  EXPECT_TRUE(shalloc2.IsReadonly());
-  EXPECT_EQ(TEST_ID, shalloc2.Id());
-  EXPECT_FALSE(shalloc2.IsFull());
-  EXPECT_FALSE(shalloc2.IsCorrupt());
-
-  PersistentMemoryAllocator::Iterator iter2(&shalloc2);
-  uint32_t type;
-  EXPECT_EQ(r123, iter2.GetNext(&type));
-  EXPECT_EQ(r789, iter2.GetNext(&type));
-  EXPECT_EQ(0U, iter2.GetNext(&type));
-
-  EXPECT_EQ(123U, shalloc2.GetType(r123));
-  EXPECT_EQ(654U, shalloc2.GetType(r456));
-  EXPECT_EQ(789U, shalloc2.GetType(r789));
-
-  PersistentMemoryAllocator::MemoryInfo meminfo2;
-  shalloc2.GetMemoryInfo(&meminfo2);
-  EXPECT_EQ(meminfo1.total, meminfo2.total);
-  EXPECT_EQ(meminfo1.free, meminfo2.free);
-
-  // Read/write test.
-  std::unique_ptr<SharedMemory> shmem3(new SharedMemory(shared_handle_2,
-                                                        /*readonly=*/false));
-  ASSERT_TRUE(shmem3->Map(TEST_MEMORY_SIZE));
-
-  SharedPersistentMemoryAllocator shalloc3(std::move(shmem3), 0, "", false);
-  EXPECT_FALSE(shalloc3.IsReadonly());
-  EXPECT_EQ(TEST_ID, shalloc3.Id());
-  EXPECT_FALSE(shalloc3.IsFull());
-  EXPECT_FALSE(shalloc3.IsCorrupt());
-
-  PersistentMemoryAllocator::Iterator iter3(&shalloc3);
-  EXPECT_EQ(r123, iter3.GetNext(&type));
-  EXPECT_EQ(r789, iter3.GetNext(&type));
-  EXPECT_EQ(0U, iter3.GetNext(&type));
-
-  EXPECT_EQ(123U, shalloc3.GetType(r123));
-  EXPECT_EQ(654U, shalloc3.GetType(r456));
-  EXPECT_EQ(789U, shalloc3.GetType(r789));
-
-  PersistentMemoryAllocator::MemoryInfo meminfo3;
-  shalloc3.GetMemoryInfo(&meminfo3);
-  EXPECT_EQ(meminfo1.total, meminfo3.total);
-  EXPECT_EQ(meminfo1.free, meminfo3.free);
-
-  // Interconnectivity test.
-  Reference obj = shalloc3.Allocate(42, 42);
-  ASSERT_TRUE(obj);
-  shalloc3.MakeIterable(obj);
-  EXPECT_EQ(obj, iter2.GetNext(&type));
-  EXPECT_EQ(42U, type);
-
-  // Clear-on-change test.
-  Reference data_ref = shalloc3.Allocate(sizeof(int) * 4, 911);
-  int* data = shalloc3.GetAsArray<int>(data_ref, 911, 4);
-  ASSERT_TRUE(data);
-  data[0] = 0;
-  data[1] = 1;
-  data[2] = 2;
-  data[3] = 3;
-  ASSERT_TRUE(shalloc3.ChangeType(data_ref, 119, 911, false));
-  EXPECT_EQ(0, data[0]);
-  EXPECT_EQ(1, data[1]);
-  EXPECT_EQ(2, data[2]);
-  EXPECT_EQ(3, data[3]);
-  ASSERT_TRUE(shalloc3.ChangeType(data_ref, 191, 119, true));
-  EXPECT_EQ(0, data[0]);
-  EXPECT_EQ(0, data[1]);
-  EXPECT_EQ(0, data[2]);
-  EXPECT_EQ(0, data[3]);
-}
-
-
-#if !defined(OS_NACL)
-//----- FilePersistentMemoryAllocator ------------------------------------------
-
-TEST(FilePersistentMemoryAllocatorTest, CreationTest) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("persistent_memory");
-
-  PersistentMemoryAllocator::MemoryInfo meminfo1;
-  Reference r123, r456, r789;
-  {
-    LocalPersistentMemoryAllocator local(TEST_MEMORY_SIZE, TEST_ID, "");
-    EXPECT_FALSE(local.IsReadonly());
-    r123 = local.Allocate(123, 123);
-    r456 = local.Allocate(456, 456);
-    r789 = local.Allocate(789, 789);
-    local.MakeIterable(r123);
-    local.ChangeType(r456, 654, 456, false);
-    local.MakeIterable(r789);
-    local.GetMemoryInfo(&meminfo1);
-    EXPECT_FALSE(local.IsFull());
-    EXPECT_FALSE(local.IsCorrupt());
-
-    File writer(file_path, File::FLAG_CREATE | File::FLAG_WRITE);
-    ASSERT_TRUE(writer.IsValid());
-    writer.Write(0, (const char*)local.data(), local.used());
-  }
-
-  std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
-  mmfile->Initialize(file_path);
-  EXPECT_TRUE(mmfile->IsValid());
-  const size_t mmlength = mmfile->length();
-  EXPECT_GE(meminfo1.total, mmlength);
-
-  FilePersistentMemoryAllocator file(std::move(mmfile), 0, 0, "", false);
-  EXPECT_FALSE(file.IsReadonly());
-  EXPECT_EQ(TEST_ID, file.Id());
-  EXPECT_FALSE(file.IsFull());
-  EXPECT_FALSE(file.IsCorrupt());
-
-  PersistentMemoryAllocator::Iterator iter(&file);
-  uint32_t type;
-  EXPECT_EQ(r123, iter.GetNext(&type));
-  EXPECT_EQ(r789, iter.GetNext(&type));
-  EXPECT_EQ(0U, iter.GetNext(&type));
-
-  EXPECT_EQ(123U, file.GetType(r123));
-  EXPECT_EQ(654U, file.GetType(r456));
-  EXPECT_EQ(789U, file.GetType(r789));
-
-  PersistentMemoryAllocator::MemoryInfo meminfo2;
-  file.GetMemoryInfo(&meminfo2);
-  EXPECT_GE(meminfo1.total, meminfo2.total);
-  EXPECT_GE(meminfo1.free, meminfo2.free);
-  EXPECT_EQ(mmlength, meminfo2.total);
-  EXPECT_EQ(0U, meminfo2.free);
-
-  // There's no way of knowing if Flush actually does anything but at least
-  // verify that it runs without CHECK violations.
-  file.Flush(false);
-  file.Flush(true);
-}
-
-TEST(FilePersistentMemoryAllocatorTest, ExtendTest) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("extend_test");
-  MemoryMappedFile::Region region = {0, 16 << 10};  // 16KiB maximum size.
-
-  // Start with a small but valid file of persistent data.
-  ASSERT_FALSE(PathExists(file_path));
-  {
-    LocalPersistentMemoryAllocator local(TEST_MEMORY_SIZE, TEST_ID, "");
-    local.Allocate(1, 1);
-    local.Allocate(11, 11);
-
-    File writer(file_path, File::FLAG_CREATE | File::FLAG_WRITE);
-    ASSERT_TRUE(writer.IsValid());
-    writer.Write(0, (const char*)local.data(), local.used());
-  }
-  ASSERT_TRUE(PathExists(file_path));
-  int64_t before_size;
-  ASSERT_TRUE(GetFileSize(file_path, &before_size));
-
-  // Map it as an extendable read/write file and append to it.
-  {
-    std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
-    mmfile->Initialize(
-        File(file_path, File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE),
-        region, MemoryMappedFile::READ_WRITE_EXTEND);
-    FilePersistentMemoryAllocator allocator(std::move(mmfile), region.size, 0,
-                                            "", false);
-    EXPECT_EQ(static_cast<size_t>(before_size), allocator.used());
-
-    allocator.Allocate(111, 111);
-    EXPECT_LT(static_cast<size_t>(before_size), allocator.used());
-  }
-
-  // Validate that append worked.
-  int64_t after_size;
-  ASSERT_TRUE(GetFileSize(file_path, &after_size));
-  EXPECT_LT(before_size, after_size);
-
-  // Verify that it's still an acceptable file.
-  {
-    std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
-    mmfile->Initialize(
-        File(file_path, File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE),
-        region, MemoryMappedFile::READ_WRITE_EXTEND);
-    EXPECT_TRUE(FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, true));
-    EXPECT_TRUE(
-        FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, false));
-  }
-}
-
-TEST(FilePersistentMemoryAllocatorTest, AcceptableTest) {
-  const uint32_t kAllocAlignment =
-      PersistentMemoryAllocatorTest::GetAllocAlignment();
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  LocalPersistentMemoryAllocator local(TEST_MEMORY_SIZE, TEST_ID, "");
-  local.MakeIterable(local.Allocate(1, 1));
-  local.MakeIterable(local.Allocate(11, 11));
-  const size_t minsize = local.used();
-  std::unique_ptr<char[]> garbage(new char[minsize]);
-  RandBytes(garbage.get(), minsize);
-
-  std::unique_ptr<MemoryMappedFile> mmfile;
-  char filename[100];
-  for (size_t filesize = minsize; filesize > 0; --filesize) {
-    strings::SafeSPrintf(filename, "memory_%d_A", filesize);
-    FilePath file_path = temp_dir.GetPath().AppendASCII(filename);
-    ASSERT_FALSE(PathExists(file_path));
-    {
-      File writer(file_path, File::FLAG_CREATE | File::FLAG_WRITE);
-      ASSERT_TRUE(writer.IsValid());
-      writer.Write(0, (const char*)local.data(), filesize);
-    }
-    ASSERT_TRUE(PathExists(file_path));
-
-    // Request read/write access for some sizes that are a multple of the
-    // allocator's alignment size. The allocator is strict about file size
-    // being a multiple of its internal alignment when doing read/write access.
-    const bool read_only = (filesize % (2 * kAllocAlignment)) != 0;
-    const uint32_t file_flags =
-        File::FLAG_OPEN | File::FLAG_READ | (read_only ? 0 : File::FLAG_WRITE);
-    const MemoryMappedFile::Access map_access =
-        read_only ? MemoryMappedFile::READ_ONLY : MemoryMappedFile::READ_WRITE;
-
-    mmfile.reset(new MemoryMappedFile());
-    mmfile->Initialize(File(file_path, file_flags), map_access);
-    EXPECT_EQ(filesize, mmfile->length());
-    if (FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, read_only)) {
-      // Make sure construction doesn't crash. It will, however, cause
-      // error messages warning about about a corrupted memory segment.
-      FilePersistentMemoryAllocator allocator(std::move(mmfile), 0, 0, "",
-                                              read_only);
-      // Also make sure that iteration doesn't crash.
-      PersistentMemoryAllocator::Iterator iter(&allocator);
-      uint32_t type_id;
-      Reference ref;
-      while ((ref = iter.GetNext(&type_id)) != 0) {
-        const char* data = allocator.GetAsArray<char>(
-            ref, 0, PersistentMemoryAllocator::kSizeAny);
-        uint32_t type = allocator.GetType(ref);
-        size_t size = allocator.GetAllocSize(ref);
-        // Ensure compiler can't optimize-out above variables.
-        (void)data;
-        (void)type;
-        (void)size;
-      }
-
-      // Ensure that short files are detected as corrupt and full files are not.
-      EXPECT_EQ(filesize != minsize, allocator.IsCorrupt());
-    } else {
-      // For filesize >= minsize, the file must be acceptable. This
-      // else clause (file-not-acceptable) should be reached only if
-      // filesize < minsize.
-      EXPECT_LT(filesize, minsize);
-    }
-
-    strings::SafeSPrintf(filename, "memory_%d_B", filesize);
-    file_path = temp_dir.GetPath().AppendASCII(filename);
-    ASSERT_FALSE(PathExists(file_path));
-    {
-      File writer(file_path, File::FLAG_CREATE | File::FLAG_WRITE);
-      ASSERT_TRUE(writer.IsValid());
-      writer.Write(0, (const char*)garbage.get(), filesize);
-    }
-    ASSERT_TRUE(PathExists(file_path));
-
-    mmfile.reset(new MemoryMappedFile());
-    mmfile->Initialize(File(file_path, file_flags), map_access);
-    EXPECT_EQ(filesize, mmfile->length());
-    if (FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, read_only)) {
-      // Make sure construction doesn't crash. It will, however, cause
-      // error messages warning about about a corrupted memory segment.
-      FilePersistentMemoryAllocator allocator(std::move(mmfile), 0, 0, "",
-                                              read_only);
-      EXPECT_TRUE(allocator.IsCorrupt());  // Garbage data so it should be.
-    } else {
-      // For filesize >= minsize, the file must be acceptable. This
-      // else clause (file-not-acceptable) should be reached only if
-      // filesize < minsize.
-      EXPECT_GT(minsize, filesize);
-    }
-  }
-}
-
-TEST_F(PersistentMemoryAllocatorTest, TruncateTest) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath file_path = temp_dir.GetPath().AppendASCII("truncate_test");
-
-  // Start with a small but valid file of persistent data. Keep the "used"
-  // amount for both allocations.
-  Reference a1_ref;
-  Reference a2_ref;
-  size_t a1_used;
-  size_t a2_used;
-  ASSERT_FALSE(PathExists(file_path));
-  {
-    LocalPersistentMemoryAllocator allocator(TEST_MEMORY_SIZE, TEST_ID, "");
-    a1_ref = allocator.Allocate(100 << 10, 1);
-    allocator.MakeIterable(a1_ref);
-    a1_used = allocator.used();
-    a2_ref = allocator.Allocate(200 << 10, 11);
-    allocator.MakeIterable(a2_ref);
-    a2_used = allocator.used();
-
-    File writer(file_path, File::FLAG_CREATE | File::FLAG_WRITE);
-    ASSERT_TRUE(writer.IsValid());
-    writer.Write(0, static_cast<const char*>(allocator.data()),
-                 allocator.size());
-  }
-  ASSERT_TRUE(PathExists(file_path));
-  EXPECT_LE(a1_used, a2_ref);
-
-  // Truncate the file to include everything and make sure it can be read, both
-  // with read-write and read-only access.
-  for (size_t file_length : {a2_used, a1_used, a1_used / 2}) {
-    SCOPED_TRACE(StringPrintf("file_length=%zu", file_length));
-    SetFileLength(file_path, file_length);
-
-    for (bool read_only : {false, true}) {
-      SCOPED_TRACE(StringPrintf("read_only=%s", read_only ? "true" : "false"));
-
-      std::unique_ptr<MemoryMappedFile> mmfile(new MemoryMappedFile());
-      mmfile->Initialize(
-          File(file_path, File::FLAG_OPEN |
-                              (read_only ? File::FLAG_READ
-                                         : File::FLAG_READ | File::FLAG_WRITE)),
-          read_only ? MemoryMappedFile::READ_ONLY
-                    : MemoryMappedFile::READ_WRITE);
-      ASSERT_TRUE(
-          FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile, read_only));
-
-      FilePersistentMemoryAllocator allocator(std::move(mmfile), 0, 0, "",
-                                              read_only);
-
-      PersistentMemoryAllocator::Iterator iter(&allocator);
-      uint32_t type_id;
-      EXPECT_EQ(file_length >= a1_used ? a1_ref : 0U, iter.GetNext(&type_id));
-      EXPECT_EQ(file_length >= a2_used ? a2_ref : 0U, iter.GetNext(&type_id));
-      EXPECT_EQ(0U, iter.GetNext(&type_id));
-
-      // Ensure that short files are detected as corrupt and full files are not.
-      EXPECT_EQ(file_length < a2_used, allocator.IsCorrupt());
-    }
-
-    // Ensure that file length was not adjusted.
-    int64_t actual_length;
-    ASSERT_TRUE(GetFileSize(file_path, &actual_length));
-    EXPECT_EQ(file_length, static_cast<size_t>(actual_length));
-  }
-}
-
-#endif  // !defined(OS_NACL)
-
-}  // namespace base
diff --git a/base/metrics/persistent_sample_map_unittest.cc b/base/metrics/persistent_sample_map_unittest.cc
deleted file mode 100644
index b25f582..0000000
--- a/base/metrics/persistent_sample_map_unittest.cc
+++ /dev/null
@@ -1,260 +0,0 @@
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/persistent_sample_map.h"
-
-#include <memory>
-
-#include "base/memory/ptr_util.h"
-#include "base/metrics/persistent_histogram_allocator.h"
-#include "base/test/gtest_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-std::unique_ptr<PersistentHistogramAllocator> CreateHistogramAllocator(
-    size_t bytes) {
-  return std::make_unique<PersistentHistogramAllocator>(
-      std::make_unique<LocalPersistentMemoryAllocator>(bytes, 0, ""));
-}
-
-std::unique_ptr<PersistentHistogramAllocator> DuplicateHistogramAllocator(
-    PersistentHistogramAllocator* original) {
-  return std::make_unique<PersistentHistogramAllocator>(
-      std::make_unique<PersistentMemoryAllocator>(
-          const_cast<void*>(original->data()), original->length(), 0,
-          original->Id(), original->Name(), false));
-}
-
-TEST(PersistentSampleMapTest, AccumulateTest) {
-  std::unique_ptr<PersistentHistogramAllocator> allocator =
-      CreateHistogramAllocator(64 << 10);  // 64 KiB
-  HistogramSamples::LocalMetadata meta;
-  PersistentSampleMap samples(1, allocator.get(), &meta);
-
-  samples.Accumulate(1, 100);
-  samples.Accumulate(2, 200);
-  samples.Accumulate(1, -200);
-  EXPECT_EQ(-100, samples.GetCount(1));
-  EXPECT_EQ(200, samples.GetCount(2));
-
-  EXPECT_EQ(300, samples.sum());
-  EXPECT_EQ(100, samples.TotalCount());
-  EXPECT_EQ(samples.redundant_count(), samples.TotalCount());
-}
-
-TEST(PersistentSampleMapTest, Accumulate_LargeValuesDontOverflow) {
-  std::unique_ptr<PersistentHistogramAllocator> allocator =
-      CreateHistogramAllocator(64 << 10);  // 64 KiB
-  HistogramSamples::LocalMetadata meta;
-  PersistentSampleMap samples(1, allocator.get(), &meta);
-
-  samples.Accumulate(250000000, 100);
-  samples.Accumulate(500000000, 200);
-  samples.Accumulate(250000000, -200);
-  EXPECT_EQ(-100, samples.GetCount(250000000));
-  EXPECT_EQ(200, samples.GetCount(500000000));
-
-  EXPECT_EQ(75000000000LL, samples.sum());
-  EXPECT_EQ(100, samples.TotalCount());
-  EXPECT_EQ(samples.redundant_count(), samples.TotalCount());
-}
-
-TEST(PersistentSampleMapTest, AddSubtractTest) {
-  std::unique_ptr<PersistentHistogramAllocator> allocator1 =
-      CreateHistogramAllocator(64 << 10);  // 64 KiB
-  HistogramSamples::LocalMetadata meta1;
-  PersistentSampleMap samples1(1, allocator1.get(), &meta1);
-  samples1.Accumulate(1, 100);
-  samples1.Accumulate(2, 100);
-  samples1.Accumulate(3, 100);
-
-  std::unique_ptr<PersistentHistogramAllocator> allocator2 =
-      DuplicateHistogramAllocator(allocator1.get());
-  HistogramSamples::LocalMetadata meta2;
-  PersistentSampleMap samples2(2, allocator2.get(), &meta2);
-  samples2.Accumulate(1, 200);
-  samples2.Accumulate(2, 200);
-  samples2.Accumulate(4, 200);
-
-  samples1.Add(samples2);
-  EXPECT_EQ(300, samples1.GetCount(1));
-  EXPECT_EQ(300, samples1.GetCount(2));
-  EXPECT_EQ(100, samples1.GetCount(3));
-  EXPECT_EQ(200, samples1.GetCount(4));
-  EXPECT_EQ(2000, samples1.sum());
-  EXPECT_EQ(900, samples1.TotalCount());
-  EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
-
-  samples1.Subtract(samples2);
-  EXPECT_EQ(100, samples1.GetCount(1));
-  EXPECT_EQ(100, samples1.GetCount(2));
-  EXPECT_EQ(100, samples1.GetCount(3));
-  EXPECT_EQ(0, samples1.GetCount(4));
-  EXPECT_EQ(600, samples1.sum());
-  EXPECT_EQ(300, samples1.TotalCount());
-  EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
-}
-
-TEST(PersistentSampleMapTest, PersistenceTest) {
-  std::unique_ptr<PersistentHistogramAllocator> allocator1 =
-      CreateHistogramAllocator(64 << 10);  // 64 KiB
-  HistogramSamples::LocalMetadata meta12;
-  PersistentSampleMap samples1(12, allocator1.get(), &meta12);
-  samples1.Accumulate(1, 100);
-  samples1.Accumulate(2, 200);
-  samples1.Accumulate(1, -200);
-  samples1.Accumulate(-1, 1);
-  EXPECT_EQ(-100, samples1.GetCount(1));
-  EXPECT_EQ(200, samples1.GetCount(2));
-  EXPECT_EQ(1, samples1.GetCount(-1));
-  EXPECT_EQ(299, samples1.sum());
-  EXPECT_EQ(101, samples1.TotalCount());
-  EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
-
-  std::unique_ptr<PersistentHistogramAllocator> allocator2 =
-      DuplicateHistogramAllocator(allocator1.get());
-  PersistentSampleMap samples2(12, allocator2.get(), &meta12);
-  EXPECT_EQ(samples1.id(), samples2.id());
-  EXPECT_EQ(samples1.sum(), samples2.sum());
-  EXPECT_EQ(samples1.redundant_count(), samples2.redundant_count());
-  EXPECT_EQ(samples1.TotalCount(), samples2.TotalCount());
-  EXPECT_EQ(-100, samples2.GetCount(1));
-  EXPECT_EQ(200, samples2.GetCount(2));
-  EXPECT_EQ(1, samples2.GetCount(-1));
-  EXPECT_EQ(299, samples2.sum());
-  EXPECT_EQ(101, samples2.TotalCount());
-  EXPECT_EQ(samples2.redundant_count(), samples2.TotalCount());
-
-  samples1.Accumulate(-1, -1);
-  EXPECT_EQ(0, samples2.GetCount(3));
-  EXPECT_EQ(0, samples1.GetCount(3));
-  samples2.Accumulate(3, 300);
-  EXPECT_EQ(300, samples2.GetCount(3));
-  EXPECT_EQ(300, samples1.GetCount(3));
-  EXPECT_EQ(samples1.sum(), samples2.sum());
-  EXPECT_EQ(samples1.redundant_count(), samples2.redundant_count());
-  EXPECT_EQ(samples1.TotalCount(), samples2.TotalCount());
-
-  EXPECT_EQ(0, samples2.GetCount(4));
-  EXPECT_EQ(0, samples1.GetCount(4));
-  samples1.Accumulate(4, 400);
-  EXPECT_EQ(400, samples2.GetCount(4));
-  EXPECT_EQ(400, samples1.GetCount(4));
-  samples2.Accumulate(4, 4000);
-  EXPECT_EQ(4400, samples2.GetCount(4));
-  EXPECT_EQ(4400, samples1.GetCount(4));
-  EXPECT_EQ(samples1.sum(), samples2.sum());
-  EXPECT_EQ(samples1.redundant_count(), samples2.redundant_count());
-  EXPECT_EQ(samples1.TotalCount(), samples2.TotalCount());
-}
-
-TEST(PersistentSampleMapIteratorTest, IterateTest) {
-  std::unique_ptr<PersistentHistogramAllocator> allocator =
-      CreateHistogramAllocator(64 << 10);  // 64 KiB
-  HistogramSamples::LocalMetadata meta;
-  PersistentSampleMap samples(1, allocator.get(), &meta);
-  samples.Accumulate(1, 100);
-  samples.Accumulate(2, 200);
-  samples.Accumulate(4, -300);
-  samples.Accumulate(5, 0);
-
-  std::unique_ptr<SampleCountIterator> it = samples.Iterator();
-
-  HistogramBase::Sample min;
-  int64_t max;
-  HistogramBase::Count count;
-
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(1, min);
-  EXPECT_EQ(2, max);
-  EXPECT_EQ(100, count);
-  EXPECT_FALSE(it->GetBucketIndex(nullptr));
-
-  it->Next();
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(2, min);
-  EXPECT_EQ(3, max);
-  EXPECT_EQ(200, count);
-
-  it->Next();
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(4, min);
-  EXPECT_EQ(5, max);
-  EXPECT_EQ(-300, count);
-
-  it->Next();
-  EXPECT_TRUE(it->Done());
-}
-
-TEST(PersistentSampleMapIteratorTest, SkipEmptyRanges) {
-  std::unique_ptr<PersistentHistogramAllocator> allocator1 =
-      CreateHistogramAllocator(64 << 10);  // 64 KiB
-  HistogramSamples::LocalMetadata meta1;
-  PersistentSampleMap samples1(1, allocator1.get(), &meta1);
-  samples1.Accumulate(5, 1);
-  samples1.Accumulate(10, 2);
-  samples1.Accumulate(15, 3);
-  samples1.Accumulate(20, 4);
-  samples1.Accumulate(25, 5);
-
-  std::unique_ptr<PersistentHistogramAllocator> allocator2 =
-      DuplicateHistogramAllocator(allocator1.get());
-  HistogramSamples::LocalMetadata meta2;
-  PersistentSampleMap samples2(2, allocator2.get(), &meta2);
-  samples2.Accumulate(5, 1);
-  samples2.Accumulate(20, 4);
-  samples2.Accumulate(25, 5);
-
-  samples1.Subtract(samples2);
-
-  std::unique_ptr<SampleCountIterator> it = samples1.Iterator();
-  EXPECT_FALSE(it->Done());
-
-  HistogramBase::Sample min;
-  int64_t max;
-  HistogramBase::Count count;
-
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(10, min);
-  EXPECT_EQ(11, max);
-  EXPECT_EQ(2, count);
-
-  it->Next();
-  EXPECT_FALSE(it->Done());
-
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(15, min);
-  EXPECT_EQ(16, max);
-  EXPECT_EQ(3, count);
-
-  it->Next();
-  EXPECT_TRUE(it->Done());
-}
-
-TEST(PersistentSampleMapIteratorDeathTest, IterateDoneTest) {
-  std::unique_ptr<PersistentHistogramAllocator> allocator =
-      CreateHistogramAllocator(64 << 10);  // 64 KiB
-  HistogramSamples::LocalMetadata meta;
-  PersistentSampleMap samples(1, allocator.get(), &meta);
-
-  std::unique_ptr<SampleCountIterator> it = samples.Iterator();
-
-  EXPECT_TRUE(it->Done());
-
-  HistogramBase::Sample min;
-  int64_t max;
-  HistogramBase::Count count;
-  EXPECT_DCHECK_DEATH(it->Get(&min, &max, &count));
-
-  EXPECT_DCHECK_DEATH(it->Next());
-
-  samples.Accumulate(1, 100);
-  it = samples.Iterator();
-  EXPECT_FALSE(it->Done());
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/metrics/sample_map_unittest.cc b/base/metrics/sample_map_unittest.cc
deleted file mode 100644
index 83db56f..0000000
--- a/base/metrics/sample_map_unittest.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/sample_map.h"
-
-#include <memory>
-
-#include "base/test/gtest_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-TEST(SampleMapTest, AccumulateTest) {
-  SampleMap samples(1);
-
-  samples.Accumulate(1, 100);
-  samples.Accumulate(2, 200);
-  samples.Accumulate(1, -200);
-  EXPECT_EQ(-100, samples.GetCount(1));
-  EXPECT_EQ(200, samples.GetCount(2));
-
-  EXPECT_EQ(300, samples.sum());
-  EXPECT_EQ(100, samples.TotalCount());
-  EXPECT_EQ(samples.redundant_count(), samples.TotalCount());
-}
-
-TEST(SampleMapTest, Accumulate_LargeValuesDontOverflow) {
-  SampleMap samples(1);
-
-  samples.Accumulate(250000000, 100);
-  samples.Accumulate(500000000, 200);
-  samples.Accumulate(250000000, -200);
-  EXPECT_EQ(-100, samples.GetCount(250000000));
-  EXPECT_EQ(200, samples.GetCount(500000000));
-
-  EXPECT_EQ(75000000000LL, samples.sum());
-  EXPECT_EQ(100, samples.TotalCount());
-  EXPECT_EQ(samples.redundant_count(), samples.TotalCount());
-}
-
-TEST(SampleMapTest, AddSubtractTest) {
-  SampleMap samples1(1);
-  SampleMap samples2(2);
-
-  samples1.Accumulate(1, 100);
-  samples1.Accumulate(2, 100);
-  samples1.Accumulate(3, 100);
-
-  samples2.Accumulate(1, 200);
-  samples2.Accumulate(2, 200);
-  samples2.Accumulate(4, 200);
-
-  samples1.Add(samples2);
-  EXPECT_EQ(300, samples1.GetCount(1));
-  EXPECT_EQ(300, samples1.GetCount(2));
-  EXPECT_EQ(100, samples1.GetCount(3));
-  EXPECT_EQ(200, samples1.GetCount(4));
-  EXPECT_EQ(2000, samples1.sum());
-  EXPECT_EQ(900, samples1.TotalCount());
-  EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
-
-  samples1.Subtract(samples2);
-  EXPECT_EQ(100, samples1.GetCount(1));
-  EXPECT_EQ(100, samples1.GetCount(2));
-  EXPECT_EQ(100, samples1.GetCount(3));
-  EXPECT_EQ(0, samples1.GetCount(4));
-  EXPECT_EQ(600, samples1.sum());
-  EXPECT_EQ(300, samples1.TotalCount());
-  EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
-}
-
-TEST(SampleMapIteratorTest, IterateTest) {
-  SampleMap samples(1);
-  samples.Accumulate(1, 100);
-  samples.Accumulate(2, 200);
-  samples.Accumulate(4, -300);
-  samples.Accumulate(5, 0);
-
-  std::unique_ptr<SampleCountIterator> it = samples.Iterator();
-
-  HistogramBase::Sample min;
-  int64_t max;
-  HistogramBase::Count count;
-
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(1, min);
-  EXPECT_EQ(2, max);
-  EXPECT_EQ(100, count);
-  EXPECT_FALSE(it->GetBucketIndex(nullptr));
-
-  it->Next();
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(2, min);
-  EXPECT_EQ(3, max);
-  EXPECT_EQ(200, count);
-
-  it->Next();
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(4, min);
-  EXPECT_EQ(5, max);
-  EXPECT_EQ(-300, count);
-
-  it->Next();
-  EXPECT_TRUE(it->Done());
-}
-
-TEST(SampleMapIteratorTest, SkipEmptyRanges) {
-  SampleMap samples(1);
-  samples.Accumulate(5, 1);
-  samples.Accumulate(10, 2);
-  samples.Accumulate(15, 3);
-  samples.Accumulate(20, 4);
-  samples.Accumulate(25, 5);
-
-  SampleMap samples2(2);
-  samples2.Accumulate(5, 1);
-  samples2.Accumulate(20, 4);
-  samples2.Accumulate(25, 5);
-
-  samples.Subtract(samples2);
-
-  std::unique_ptr<SampleCountIterator> it = samples.Iterator();
-  EXPECT_FALSE(it->Done());
-
-  HistogramBase::Sample min;
-  int64_t max;
-  HistogramBase::Count count;
-
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(10, min);
-  EXPECT_EQ(11, max);
-  EXPECT_EQ(2, count);
-
-  it->Next();
-  EXPECT_FALSE(it->Done());
-
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(15, min);
-  EXPECT_EQ(16, max);
-  EXPECT_EQ(3, count);
-
-  it->Next();
-  EXPECT_TRUE(it->Done());
-}
-
-TEST(SampleMapIteratorDeathTest, IterateDoneTest) {
-  SampleMap samples(1);
-
-  std::unique_ptr<SampleCountIterator> it = samples.Iterator();
-
-  EXPECT_TRUE(it->Done());
-
-  HistogramBase::Sample min;
-  int64_t max;
-  HistogramBase::Count count;
-  EXPECT_DCHECK_DEATH(it->Get(&min, &max, &count));
-
-  EXPECT_DCHECK_DEATH(it->Next());
-
-  samples.Accumulate(1, 100);
-  it = samples.Iterator();
-  EXPECT_FALSE(it->Done());
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/metrics/sample_vector_unittest.cc b/base/metrics/sample_vector_unittest.cc
deleted file mode 100644
index 4921802..0000000
--- a/base/metrics/sample_vector_unittest.cc
+++ /dev/null
@@ -1,545 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/sample_vector.h"
-
-#include <limits.h>
-#include <stddef.h>
-
-#include <atomic>
-#include <memory>
-#include <vector>
-
-#include "base/metrics/bucket_ranges.h"
-#include "base/metrics/histogram.h"
-#include "base/metrics/persistent_memory_allocator.h"
-#include "base/test/gtest_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-// This framework class has "friend" access to the SampleVector for accessing
-// non-public methods and fields.
-class SampleVectorTest : public testing::Test {
- public:
-  const HistogramBase::AtomicCount* GetSamplesCounts(
-      const SampleVectorBase& samples) {
-    return samples.counts();
-  }
-};
-
-TEST_F(SampleVectorTest, Accumulate) {
-  // Custom buckets: [1, 5) [5, 10)
-  BucketRanges ranges(3);
-  ranges.set_range(0, 1);
-  ranges.set_range(1, 5);
-  ranges.set_range(2, 10);
-  SampleVector samples(1, &ranges);
-
-  samples.Accumulate(1, 200);
-  samples.Accumulate(2, -300);
-  EXPECT_EQ(-100, samples.GetCountAtIndex(0));
-
-  samples.Accumulate(5, 200);
-  EXPECT_EQ(200, samples.GetCountAtIndex(1));
-
-  EXPECT_EQ(600, samples.sum());
-  EXPECT_EQ(100, samples.redundant_count());
-  EXPECT_EQ(samples.TotalCount(), samples.redundant_count());
-
-  samples.Accumulate(5, -100);
-  EXPECT_EQ(100, samples.GetCountAtIndex(1));
-
-  EXPECT_EQ(100, samples.sum());
-  EXPECT_EQ(0, samples.redundant_count());
-  EXPECT_EQ(samples.TotalCount(), samples.redundant_count());
-}
-
-TEST_F(SampleVectorTest, Accumulate_LargeValuesDontOverflow) {
-  // Custom buckets: [1, 250000000) [250000000, 500000000)
-  BucketRanges ranges(3);
-  ranges.set_range(0, 1);
-  ranges.set_range(1, 250000000);
-  ranges.set_range(2, 500000000);
-  SampleVector samples(1, &ranges);
-
-  samples.Accumulate(240000000, 200);
-  samples.Accumulate(249999999, -300);
-  EXPECT_EQ(-100, samples.GetCountAtIndex(0));
-
-  samples.Accumulate(250000000, 200);
-  EXPECT_EQ(200, samples.GetCountAtIndex(1));
-
-  EXPECT_EQ(23000000300LL, samples.sum());
-  EXPECT_EQ(100, samples.redundant_count());
-  EXPECT_EQ(samples.TotalCount(), samples.redundant_count());
-
-  samples.Accumulate(250000000, -100);
-  EXPECT_EQ(100, samples.GetCountAtIndex(1));
-
-  EXPECT_EQ(-1999999700LL, samples.sum());
-  EXPECT_EQ(0, samples.redundant_count());
-  EXPECT_EQ(samples.TotalCount(), samples.redundant_count());
-}
-
-TEST_F(SampleVectorTest, AddSubtract) {
-  // Custom buckets: [0, 1) [1, 2) [2, 3) [3, INT_MAX)
-  BucketRanges ranges(5);
-  ranges.set_range(0, 0);
-  ranges.set_range(1, 1);
-  ranges.set_range(2, 2);
-  ranges.set_range(3, 3);
-  ranges.set_range(4, INT_MAX);
-
-  SampleVector samples1(1, &ranges);
-  samples1.Accumulate(0, 100);
-  samples1.Accumulate(2, 100);
-  samples1.Accumulate(4, 100);
-  EXPECT_EQ(600, samples1.sum());
-  EXPECT_EQ(300, samples1.TotalCount());
-  EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
-
-  SampleVector samples2(2, &ranges);
-  samples2.Accumulate(1, 200);
-  samples2.Accumulate(2, 200);
-  samples2.Accumulate(4, 200);
-  EXPECT_EQ(1400, samples2.sum());
-  EXPECT_EQ(600, samples2.TotalCount());
-  EXPECT_EQ(samples2.redundant_count(), samples2.TotalCount());
-
-  samples1.Add(samples2);
-  EXPECT_EQ(100, samples1.GetCountAtIndex(0));
-  EXPECT_EQ(200, samples1.GetCountAtIndex(1));
-  EXPECT_EQ(300, samples1.GetCountAtIndex(2));
-  EXPECT_EQ(300, samples1.GetCountAtIndex(3));
-  EXPECT_EQ(2000, samples1.sum());
-  EXPECT_EQ(900, samples1.TotalCount());
-  EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
-
-  samples1.Subtract(samples2);
-  EXPECT_EQ(100, samples1.GetCountAtIndex(0));
-  EXPECT_EQ(0, samples1.GetCountAtIndex(1));
-  EXPECT_EQ(100, samples1.GetCountAtIndex(2));
-  EXPECT_EQ(100, samples1.GetCountAtIndex(3));
-  EXPECT_EQ(600, samples1.sum());
-  EXPECT_EQ(300, samples1.TotalCount());
-  EXPECT_EQ(samples1.redundant_count(), samples1.TotalCount());
-}
-
-TEST_F(SampleVectorTest, BucketIndexDeath) {
-  // 8 buckets with exponential layout:
-  // [0, 1) [1, 2) [2, 4) [4, 8) [8, 16) [16, 32) [32, 64) [64, INT_MAX)
-  BucketRanges ranges(9);
-  Histogram::InitializeBucketRanges(1, 64, &ranges);
-  SampleVector samples(1, &ranges);
-
-  // Normal case
-  samples.Accumulate(0, 1);
-  samples.Accumulate(3, 2);
-  samples.Accumulate(64, 3);
-  EXPECT_EQ(1, samples.GetCount(0));
-  EXPECT_EQ(2, samples.GetCount(2));
-  EXPECT_EQ(3, samples.GetCount(65));
-
-  // Extreme case.
-  EXPECT_DEATH_IF_SUPPORTED(samples.Accumulate(INT_MIN, 100), "");
-  EXPECT_DEATH_IF_SUPPORTED(samples.Accumulate(-1, 100), "");
-  EXPECT_DEATH_IF_SUPPORTED(samples.Accumulate(INT_MAX, 100), "");
-
-  // Custom buckets: [1, 5) [5, 10)
-  // Note, this is not a valid BucketRanges for Histogram because it does not
-  // have overflow buckets.
-  BucketRanges ranges2(3);
-  ranges2.set_range(0, 1);
-  ranges2.set_range(1, 5);
-  ranges2.set_range(2, 10);
-  SampleVector samples2(2, &ranges2);
-
-  // Normal case.
-  samples2.Accumulate(1, 1);
-  samples2.Accumulate(4, 1);
-  samples2.Accumulate(5, 2);
-  samples2.Accumulate(9, 2);
-  EXPECT_EQ(2, samples2.GetCount(1));
-  EXPECT_EQ(4, samples2.GetCount(5));
-
-  // Extreme case.
-  EXPECT_DEATH_IF_SUPPORTED(samples2.Accumulate(0, 100), "");
-  EXPECT_DEATH_IF_SUPPORTED(samples2.Accumulate(10, 100), "");
-}
-
-TEST_F(SampleVectorTest, AddSubtractBucketNotMatchDeath) {
-  // Custom buckets 1: [1, 3) [3, 5)
-  BucketRanges ranges1(3);
-  ranges1.set_range(0, 1);
-  ranges1.set_range(1, 3);
-  ranges1.set_range(2, 5);
-  SampleVector samples1(1, &ranges1);
-
-  // Custom buckets 2: [0, 1) [1, 3) [3, 6) [6, 7)
-  BucketRanges ranges2(5);
-  ranges2.set_range(0, 0);
-  ranges2.set_range(1, 1);
-  ranges2.set_range(2, 3);
-  ranges2.set_range(3, 6);
-  ranges2.set_range(4, 7);
-  SampleVector samples2(2, &ranges2);
-
-  samples2.Accumulate(1, 100);
-  samples1.Add(samples2);
-  EXPECT_EQ(100, samples1.GetCountAtIndex(0));
-
-  // Extra bucket in the beginning. These should CHECK in GetBucketIndex.
-  samples2.Accumulate(0, 100);
-  EXPECT_DEATH_IF_SUPPORTED(samples1.Add(samples2), "");
-  EXPECT_DEATH_IF_SUPPORTED(samples1.Subtract(samples2), "");
-
-  // Extra bucket in the end. These should cause AddSubtractImpl to fail, and
-  // Add to DCHECK as a result.
-  samples2.Accumulate(0, -100);
-  samples2.Accumulate(6, 100);
-  EXPECT_DCHECK_DEATH(samples1.Add(samples2));
-  EXPECT_DCHECK_DEATH(samples1.Subtract(samples2));
-
-  // Bucket not match: [3, 5) VS [3, 6). These should cause AddSubtractImpl to
-  // DCHECK.
-  samples2.Accumulate(6, -100);
-  samples2.Accumulate(3, 100);
-  EXPECT_DCHECK_DEATH(samples1.Add(samples2));
-  EXPECT_DCHECK_DEATH(samples1.Subtract(samples2));
-}
-
-TEST_F(SampleVectorTest, Iterate) {
-  BucketRanges ranges(5);
-  ranges.set_range(0, 0);
-  ranges.set_range(1, 1);
-  ranges.set_range(2, 2);
-  ranges.set_range(3, 3);
-  ranges.set_range(4, 4);
-
-  std::vector<HistogramBase::Count> counts(3);
-  counts[0] = 1;
-  counts[1] = 0;  // Iterator will bypass this empty bucket.
-  counts[2] = 2;
-
-  // BucketRanges can have larger size than counts.
-  SampleVectorIterator it(&counts, &ranges);
-  size_t index;
-
-  HistogramBase::Sample min;
-  int64_t max;
-  HistogramBase::Count count;
-  it.Get(&min, &max, &count);
-  EXPECT_EQ(0, min);
-  EXPECT_EQ(1, max);
-  EXPECT_EQ(1, count);
-  EXPECT_TRUE(it.GetBucketIndex(&index));
-  EXPECT_EQ(0u, index);
-
-  it.Next();
-  it.Get(&min, &max, &count);
-  EXPECT_EQ(2, min);
-  EXPECT_EQ(3, max);
-  EXPECT_EQ(2, count);
-  EXPECT_TRUE(it.GetBucketIndex(&index));
-  EXPECT_EQ(2u, index);
-
-  it.Next();
-  EXPECT_TRUE(it.Done());
-
-  // Create iterator from SampleVector.
-  SampleVector samples(1, &ranges);
-  samples.Accumulate(0, 0);
-  samples.Accumulate(1, 1);
-  samples.Accumulate(2, 2);
-  samples.Accumulate(3, 3);
-  std::unique_ptr<SampleCountIterator> it2 = samples.Iterator();
-
-  int i;
-  for (i = 1; !it2->Done(); i++, it2->Next()) {
-    it2->Get(&min, &max, &count);
-    EXPECT_EQ(i, min);
-    EXPECT_EQ(i + 1, max);
-    EXPECT_EQ(i, count);
-
-    size_t index;
-    EXPECT_TRUE(it2->GetBucketIndex(&index));
-    EXPECT_EQ(static_cast<size_t>(i), index);
-  }
-  EXPECT_EQ(4, i);
-}
-
-TEST_F(SampleVectorTest, IterateDoneDeath) {
-  BucketRanges ranges(5);
-  ranges.set_range(0, 0);
-  ranges.set_range(1, 1);
-  ranges.set_range(2, 2);
-  ranges.set_range(3, 3);
-  ranges.set_range(4, INT_MAX);
-  SampleVector samples(1, &ranges);
-
-  std::unique_ptr<SampleCountIterator> it = samples.Iterator();
-
-  EXPECT_TRUE(it->Done());
-
-  HistogramBase::Sample min;
-  int64_t max;
-  HistogramBase::Count count;
-  EXPECT_DCHECK_DEATH(it->Get(&min, &max, &count));
-
-  EXPECT_DCHECK_DEATH(it->Next());
-
-  samples.Accumulate(2, 100);
-  it = samples.Iterator();
-  EXPECT_FALSE(it->Done());
-}
-
-TEST_F(SampleVectorTest, SingleSample) {
-  // Custom buckets: [1, 5) [5, 10)
-  BucketRanges ranges(3);
-  ranges.set_range(0, 1);
-  ranges.set_range(1, 5);
-  ranges.set_range(2, 10);
-  SampleVector samples(&ranges);
-
-  // Ensure that a single value accumulates correctly.
-  EXPECT_FALSE(GetSamplesCounts(samples));
-  samples.Accumulate(3, 200);
-  EXPECT_EQ(200, samples.GetCount(3));
-  EXPECT_FALSE(GetSamplesCounts(samples));
-  samples.Accumulate(3, 400);
-  EXPECT_EQ(600, samples.GetCount(3));
-  EXPECT_FALSE(GetSamplesCounts(samples));
-  EXPECT_EQ(3 * 600, samples.sum());
-  EXPECT_EQ(600, samples.TotalCount());
-  EXPECT_EQ(600, samples.redundant_count());
-
-  // Ensure that the iterator returns only one value.
-  HistogramBase::Sample min;
-  int64_t max;
-  HistogramBase::Count count;
-  std::unique_ptr<SampleCountIterator> it = samples.Iterator();
-  ASSERT_FALSE(it->Done());
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(1, min);
-  EXPECT_EQ(5, max);
-  EXPECT_EQ(600, count);
-  it->Next();
-  EXPECT_TRUE(it->Done());
-
-  // Ensure that it can be merged to another single-sample vector.
-  SampleVector samples_copy(&ranges);
-  samples_copy.Add(samples);
-  EXPECT_FALSE(GetSamplesCounts(samples_copy));
-  EXPECT_EQ(3 * 600, samples_copy.sum());
-  EXPECT_EQ(600, samples_copy.TotalCount());
-  EXPECT_EQ(600, samples_copy.redundant_count());
-
-  // A different value should cause creation of the counts array.
-  samples.Accumulate(8, 100);
-  EXPECT_TRUE(GetSamplesCounts(samples));
-  EXPECT_EQ(600, samples.GetCount(3));
-  EXPECT_EQ(100, samples.GetCount(8));
-  EXPECT_EQ(3 * 600 + 8 * 100, samples.sum());
-  EXPECT_EQ(600 + 100, samples.TotalCount());
-  EXPECT_EQ(600 + 100, samples.redundant_count());
-
-  // The iterator should now return both values.
-  it = samples.Iterator();
-  ASSERT_FALSE(it->Done());
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(1, min);
-  EXPECT_EQ(5, max);
-  EXPECT_EQ(600, count);
-  it->Next();
-  ASSERT_FALSE(it->Done());
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(5, min);
-  EXPECT_EQ(10, max);
-  EXPECT_EQ(100, count);
-  it->Next();
-  EXPECT_TRUE(it->Done());
-
-  // Ensure that it can merged to a single-sample vector.
-  samples_copy.Add(samples);
-  EXPECT_TRUE(GetSamplesCounts(samples_copy));
-  EXPECT_EQ(3 * 1200 + 8 * 100, samples_copy.sum());
-  EXPECT_EQ(1200 + 100, samples_copy.TotalCount());
-  EXPECT_EQ(1200 + 100, samples_copy.redundant_count());
-}
-
-TEST_F(SampleVectorTest, PersistentSampleVector) {
-  LocalPersistentMemoryAllocator allocator(64 << 10, 0, "");
-  std::atomic<PersistentMemoryAllocator::Reference> samples_ref;
-  samples_ref.store(0, std::memory_order_relaxed);
-  HistogramSamples::Metadata samples_meta;
-  memset(&samples_meta, 0, sizeof(samples_meta));
-
-  // Custom buckets: [1, 5) [5, 10)
-  BucketRanges ranges(3);
-  ranges.set_range(0, 1);
-  ranges.set_range(1, 5);
-  ranges.set_range(2, 10);
-
-  // Persistent allocation.
-  const size_t counts_bytes =
-      sizeof(HistogramBase::AtomicCount) * ranges.bucket_count();
-  const DelayedPersistentAllocation allocation(&allocator, &samples_ref, 1,
-                                               counts_bytes, false);
-
-  PersistentSampleVector samples1(0, &ranges, &samples_meta, allocation);
-  EXPECT_FALSE(GetSamplesCounts(samples1));
-  samples1.Accumulate(3, 200);
-  EXPECT_EQ(200, samples1.GetCount(3));
-  EXPECT_FALSE(GetSamplesCounts(samples1));
-  EXPECT_EQ(0, samples1.GetCount(8));
-  EXPECT_FALSE(GetSamplesCounts(samples1));
-
-  PersistentSampleVector samples2(0, &ranges, &samples_meta, allocation);
-  EXPECT_EQ(200, samples2.GetCount(3));
-  EXPECT_FALSE(GetSamplesCounts(samples2));
-
-  HistogramBase::Sample min;
-  int64_t max;
-  HistogramBase::Count count;
-  std::unique_ptr<SampleCountIterator> it = samples2.Iterator();
-  ASSERT_FALSE(it->Done());
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(1, min);
-  EXPECT_EQ(5, max);
-  EXPECT_EQ(200, count);
-  it->Next();
-  EXPECT_TRUE(it->Done());
-
-  samples1.Accumulate(8, 100);
-  EXPECT_TRUE(GetSamplesCounts(samples1));
-
-  EXPECT_FALSE(GetSamplesCounts(samples2));
-  EXPECT_EQ(200, samples2.GetCount(3));
-  EXPECT_EQ(100, samples2.GetCount(8));
-  EXPECT_TRUE(GetSamplesCounts(samples2));
-  EXPECT_EQ(3 * 200 + 8 * 100, samples2.sum());
-  EXPECT_EQ(300, samples2.TotalCount());
-  EXPECT_EQ(300, samples2.redundant_count());
-
-  it = samples2.Iterator();
-  ASSERT_FALSE(it->Done());
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(1, min);
-  EXPECT_EQ(5, max);
-  EXPECT_EQ(200, count);
-  it->Next();
-  ASSERT_FALSE(it->Done());
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(5, min);
-  EXPECT_EQ(10, max);
-  EXPECT_EQ(100, count);
-  it->Next();
-  EXPECT_TRUE(it->Done());
-
-  PersistentSampleVector samples3(0, &ranges, &samples_meta, allocation);
-  EXPECT_TRUE(GetSamplesCounts(samples2));
-  EXPECT_EQ(200, samples3.GetCount(3));
-  EXPECT_EQ(100, samples3.GetCount(8));
-  EXPECT_EQ(3 * 200 + 8 * 100, samples3.sum());
-  EXPECT_EQ(300, samples3.TotalCount());
-  EXPECT_EQ(300, samples3.redundant_count());
-
-  it = samples3.Iterator();
-  ASSERT_FALSE(it->Done());
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(1, min);
-  EXPECT_EQ(5, max);
-  EXPECT_EQ(200, count);
-  it->Next();
-  ASSERT_FALSE(it->Done());
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(5, min);
-  EXPECT_EQ(10, max);
-  EXPECT_EQ(100, count);
-  it->Next();
-  EXPECT_TRUE(it->Done());
-}
-
-TEST_F(SampleVectorTest, PersistentSampleVectorTestWithOutsideAlloc) {
-  LocalPersistentMemoryAllocator allocator(64 << 10, 0, "");
-  std::atomic<PersistentMemoryAllocator::Reference> samples_ref;
-  samples_ref.store(0, std::memory_order_relaxed);
-  HistogramSamples::Metadata samples_meta;
-  memset(&samples_meta, 0, sizeof(samples_meta));
-
-  // Custom buckets: [1, 5) [5, 10)
-  BucketRanges ranges(3);
-  ranges.set_range(0, 1);
-  ranges.set_range(1, 5);
-  ranges.set_range(2, 10);
-
-  // Persistent allocation.
-  const size_t counts_bytes =
-      sizeof(HistogramBase::AtomicCount) * ranges.bucket_count();
-  const DelayedPersistentAllocation allocation(&allocator, &samples_ref, 1,
-                                               counts_bytes, false);
-
-  PersistentSampleVector samples1(0, &ranges, &samples_meta, allocation);
-  EXPECT_FALSE(GetSamplesCounts(samples1));
-  samples1.Accumulate(3, 200);
-  EXPECT_EQ(200, samples1.GetCount(3));
-  EXPECT_FALSE(GetSamplesCounts(samples1));
-
-  // Because the delayed allocation can be shared with other objects (the
-  // |offset| parameter allows concatinating multiple data blocks into the
-  // same allocation), it's possible that the allocation gets realized from
-  // the outside even though the data block being accessed is all zero.
-  allocation.Get();
-  EXPECT_EQ(200, samples1.GetCount(3));
-  EXPECT_FALSE(GetSamplesCounts(samples1));
-
-  HistogramBase::Sample min;
-  int64_t max;
-  HistogramBase::Count count;
-  std::unique_ptr<SampleCountIterator> it = samples1.Iterator();
-  ASSERT_FALSE(it->Done());
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(1, min);
-  EXPECT_EQ(5, max);
-  EXPECT_EQ(200, count);
-  it->Next();
-  EXPECT_TRUE(it->Done());
-
-  // A duplicate samples object should still see the single-sample entry even
-  // when storage is available.
-  PersistentSampleVector samples2(0, &ranges, &samples_meta, allocation);
-  EXPECT_EQ(200, samples2.GetCount(3));
-
-  // New accumulations, in both directions, of the existing value should work.
-  samples1.Accumulate(3, 50);
-  EXPECT_EQ(250, samples1.GetCount(3));
-  EXPECT_EQ(250, samples2.GetCount(3));
-  samples2.Accumulate(3, 50);
-  EXPECT_EQ(300, samples1.GetCount(3));
-  EXPECT_EQ(300, samples2.GetCount(3));
-
-  it = samples1.Iterator();
-  ASSERT_FALSE(it->Done());
-  it->Get(&min, &max, &count);
-  EXPECT_EQ(1, min);
-  EXPECT_EQ(5, max);
-  EXPECT_EQ(300, count);
-  it->Next();
-  EXPECT_TRUE(it->Done());
-
-  samples1.Accumulate(8, 100);
-  EXPECT_TRUE(GetSamplesCounts(samples1));
-  EXPECT_EQ(300, samples1.GetCount(3));
-  EXPECT_EQ(300, samples2.GetCount(3));
-  EXPECT_EQ(100, samples1.GetCount(8));
-  EXPECT_EQ(100, samples2.GetCount(8));
-  samples2.Accumulate(8, 100);
-  EXPECT_EQ(300, samples1.GetCount(3));
-  EXPECT_EQ(300, samples2.GetCount(3));
-  EXPECT_EQ(200, samples1.GetCount(8));
-  EXPECT_EQ(200, samples2.GetCount(8));
-}
-
-}  // namespace base
diff --git a/base/metrics/single_sample_metrics_unittest.cc b/base/metrics/single_sample_metrics_unittest.cc
deleted file mode 100644
index 5a6d159..0000000
--- a/base/metrics/single_sample_metrics_unittest.cc
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/single_sample_metrics.h"
-
-#include "base/memory/ptr_util.h"
-#include "base/metrics/dummy_histogram.h"
-#include "base/test/gtest_util.h"
-#include "base/test/histogram_tester.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-const HistogramBase::Sample kMin = 1;
-const HistogramBase::Sample kMax = 10;
-const uint32_t kBucketCount = 10;
-const char kMetricName[] = "Single.Sample.Metric";
-
-class SingleSampleMetricsTest : public testing::Test {
- public:
-  SingleSampleMetricsTest() = default;
-
-  ~SingleSampleMetricsTest() override {
-    // Ensure we cleanup after ourselves.
-    SingleSampleMetricsFactory::DeleteFactoryForTesting();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SingleSampleMetricsTest);
-};
-
-}  // namespace
-
-TEST_F(SingleSampleMetricsTest, DefaultFactoryGetSet) {
-  SingleSampleMetricsFactory* factory = SingleSampleMetricsFactory::Get();
-  ASSERT_TRUE(factory);
-
-  // Same factory should be returned evermore.
-  EXPECT_EQ(factory, SingleSampleMetricsFactory::Get());
-
-  // Setting a factory after the default has been instantiated should fail.
-  EXPECT_DCHECK_DEATH(SingleSampleMetricsFactory::SetFactory(
-      WrapUnique<SingleSampleMetricsFactory>(nullptr)));
-}
-
-TEST_F(SingleSampleMetricsTest, CustomFactoryGetSet) {
-  SingleSampleMetricsFactory* factory = new DefaultSingleSampleMetricsFactory();
-  SingleSampleMetricsFactory::SetFactory(WrapUnique(factory));
-  EXPECT_EQ(factory, SingleSampleMetricsFactory::Get());
-}
-
-TEST_F(SingleSampleMetricsTest, DefaultSingleSampleMetricNoValue) {
-  SingleSampleMetricsFactory* factory = SingleSampleMetricsFactory::Get();
-
-  HistogramTester tester;
-  std::unique_ptr<SingleSampleMetric> metric =
-      factory->CreateCustomCountsMetric(kMetricName, kMin, kMax, kBucketCount);
-  metric.reset();
-
-  // Verify that no sample is recorded if SetSample() is never called.
-  tester.ExpectTotalCount(kMetricName, 0);
-}
-
-TEST_F(SingleSampleMetricsTest, DefaultSingleSampleMetricWithValue) {
-  SingleSampleMetricsFactory* factory = SingleSampleMetricsFactory::Get();
-
-  HistogramTester tester;
-  std::unique_ptr<SingleSampleMetric> metric =
-      factory->CreateCustomCountsMetric(kMetricName, kMin, kMax, kBucketCount);
-
-  const HistogramBase::Sample kLastSample = 9;
-  metric->SetSample(1);
-  metric->SetSample(3);
-  metric->SetSample(5);
-  metric->SetSample(kLastSample);
-  metric.reset();
-
-  // Verify only the last sample sent to SetSample() is recorded.
-  tester.ExpectUniqueSample(kMetricName, kLastSample, 1);
-
-  // Verify construction implicitly by requesting a histogram with the same
-  // parameters; this test relies on the fact that histogram objects are unique
-  // per name. Different parameters will result in a Dummy histogram returned.
-  EXPECT_EQ(
-      DummyHistogram::GetInstance(),
-      Histogram::FactoryGet(kMetricName, 1, 3, 3, HistogramBase::kNoFlags));
-  EXPECT_NE(DummyHistogram::GetInstance(),
-            Histogram::FactoryGet(kMetricName, kMin, kMax, kBucketCount,
-                                  HistogramBase::kUmaTargetedHistogramFlag));
-}
-
-TEST_F(SingleSampleMetricsTest, MultipleMetricsAreDistinct) {
-  SingleSampleMetricsFactory* factory = SingleSampleMetricsFactory::Get();
-
-  HistogramTester tester;
-  std::unique_ptr<SingleSampleMetric> metric =
-      factory->CreateCustomCountsMetric(kMetricName, kMin, kMax, kBucketCount);
-  std::unique_ptr<SingleSampleMetric> metric2 =
-      factory->CreateCustomCountsMetric(kMetricName, kMin, kMax, kBucketCount);
-  const char kMetricName2[] = "Single.Sample.Metric.2";
-  std::unique_ptr<SingleSampleMetric> metric3 =
-      factory->CreateCustomCountsMetric(kMetricName2, kMin, kMax, kBucketCount);
-
-  const HistogramBase::Sample kSample1 = 5;
-  metric->SetSample(kSample1);
-  metric2->SetSample(kSample1);
-
-  const HistogramBase::Sample kSample2 = 7;
-  metric3->SetSample(kSample2);
-
-  metric.reset();
-  tester.ExpectUniqueSample(kMetricName, kSample1, 1);
-
-  metric2.reset();
-  tester.ExpectUniqueSample(kMetricName, kSample1, 2);
-
-  metric3.reset();
-  tester.ExpectUniqueSample(kMetricName2, kSample2, 1);
-}
-
-}  // namespace base
diff --git a/base/metrics/sparse_histogram_unittest.cc b/base/metrics/sparse_histogram_unittest.cc
deleted file mode 100644
index 72dd905..0000000
--- a/base/metrics/sparse_histogram_unittest.cc
+++ /dev/null
@@ -1,388 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/sparse_histogram.h"
-
-#include <memory>
-#include <string>
-
-#include "base/metrics/histogram_base.h"
-#include "base/metrics/histogram_functions.h"
-#include "base/metrics/histogram_samples.h"
-#include "base/metrics/metrics_hashes.h"
-#include "base/metrics/persistent_histogram_allocator.h"
-#include "base/metrics/persistent_memory_allocator.h"
-#include "base/metrics/sample_map.h"
-#include "base/metrics/statistics_recorder.h"
-#include "base/pickle.h"
-#include "base/strings/stringprintf.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-// Test parameter indicates if a persistent memory allocator should be used
-// for histogram allocation. False will allocate histograms from the process
-// heap.
-class SparseHistogramTest : public testing::TestWithParam<bool> {
- protected:
-  const int32_t kAllocatorMemorySize = 8 << 20;  // 8 MiB
-
-  SparseHistogramTest() : use_persistent_histogram_allocator_(GetParam()) {}
-
-  void SetUp() override {
-    if (use_persistent_histogram_allocator_)
-      CreatePersistentMemoryAllocator();
-
-    // Each test will have a clean state (no Histogram / BucketRanges
-    // registered).
-    InitializeStatisticsRecorder();
-  }
-
-  void TearDown() override {
-    if (allocator_) {
-      ASSERT_FALSE(allocator_->IsFull());
-      ASSERT_FALSE(allocator_->IsCorrupt());
-    }
-    UninitializeStatisticsRecorder();
-    DestroyPersistentMemoryAllocator();
-  }
-
-  void InitializeStatisticsRecorder() {
-    DCHECK(!statistics_recorder_);
-    statistics_recorder_ = StatisticsRecorder::CreateTemporaryForTesting();
-  }
-
-  void UninitializeStatisticsRecorder() {
-    statistics_recorder_.reset();
-  }
-
-  void CreatePersistentMemoryAllocator() {
-    GlobalHistogramAllocator::CreateWithLocalMemory(
-        kAllocatorMemorySize, 0, "SparseHistogramAllocatorTest");
-    allocator_ = GlobalHistogramAllocator::Get()->memory_allocator();
-  }
-
-  void DestroyPersistentMemoryAllocator() {
-    allocator_ = nullptr;
-    GlobalHistogramAllocator::ReleaseForTesting();
-  }
-
-  std::unique_ptr<SparseHistogram> NewSparseHistogram(const char* name) {
-    // std::make_unique can't access protected ctor so do it manually. This
-    // test class is a friend so can access it.
-    return std::unique_ptr<SparseHistogram>(new SparseHistogram(name));
-  }
-
-  const bool use_persistent_histogram_allocator_;
-
-  std::unique_ptr<StatisticsRecorder> statistics_recorder_;
-  PersistentMemoryAllocator* allocator_ = nullptr;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SparseHistogramTest);
-};
-
-// Run all HistogramTest cases with both heap and persistent memory.
-INSTANTIATE_TEST_CASE_P(HeapAndPersistent,
-                        SparseHistogramTest,
-                        testing::Bool());
-
-
-TEST_P(SparseHistogramTest, BasicTest) {
-  std::unique_ptr<SparseHistogram> histogram(NewSparseHistogram("Sparse"));
-  std::unique_ptr<HistogramSamples> snapshot(histogram->SnapshotSamples());
-  EXPECT_EQ(0, snapshot->TotalCount());
-  EXPECT_EQ(0, snapshot->sum());
-
-  histogram->Add(100);
-  std::unique_ptr<HistogramSamples> snapshot1(histogram->SnapshotSamples());
-  EXPECT_EQ(1, snapshot1->TotalCount());
-  EXPECT_EQ(1, snapshot1->GetCount(100));
-
-  histogram->Add(100);
-  histogram->Add(101);
-  std::unique_ptr<HistogramSamples> snapshot2(histogram->SnapshotSamples());
-  EXPECT_EQ(3, snapshot2->TotalCount());
-  EXPECT_EQ(2, snapshot2->GetCount(100));
-  EXPECT_EQ(1, snapshot2->GetCount(101));
-}
-
-TEST_P(SparseHistogramTest, BasicTestAddCount) {
-  std::unique_ptr<SparseHistogram> histogram(NewSparseHistogram("Sparse"));
-  std::unique_ptr<HistogramSamples> snapshot(histogram->SnapshotSamples());
-  EXPECT_EQ(0, snapshot->TotalCount());
-  EXPECT_EQ(0, snapshot->sum());
-
-  histogram->AddCount(100, 15);
-  std::unique_ptr<HistogramSamples> snapshot1(histogram->SnapshotSamples());
-  EXPECT_EQ(15, snapshot1->TotalCount());
-  EXPECT_EQ(15, snapshot1->GetCount(100));
-
-  histogram->AddCount(100, 15);
-  histogram->AddCount(101, 25);
-  std::unique_ptr<HistogramSamples> snapshot2(histogram->SnapshotSamples());
-  EXPECT_EQ(55, snapshot2->TotalCount());
-  EXPECT_EQ(30, snapshot2->GetCount(100));
-  EXPECT_EQ(25, snapshot2->GetCount(101));
-}
-
-TEST_P(SparseHistogramTest, AddCount_LargeValuesDontOverflow) {
-  std::unique_ptr<SparseHistogram> histogram(NewSparseHistogram("Sparse"));
-  std::unique_ptr<HistogramSamples> snapshot(histogram->SnapshotSamples());
-  EXPECT_EQ(0, snapshot->TotalCount());
-  EXPECT_EQ(0, snapshot->sum());
-
-  histogram->AddCount(1000000000, 15);
-  std::unique_ptr<HistogramSamples> snapshot1(histogram->SnapshotSamples());
-  EXPECT_EQ(15, snapshot1->TotalCount());
-  EXPECT_EQ(15, snapshot1->GetCount(1000000000));
-
-  histogram->AddCount(1000000000, 15);
-  histogram->AddCount(1010000000, 25);
-  std::unique_ptr<HistogramSamples> snapshot2(histogram->SnapshotSamples());
-  EXPECT_EQ(55, snapshot2->TotalCount());
-  EXPECT_EQ(30, snapshot2->GetCount(1000000000));
-  EXPECT_EQ(25, snapshot2->GetCount(1010000000));
-  EXPECT_EQ(55250000000LL, snapshot2->sum());
-}
-
-// Make sure that counts returned by Histogram::SnapshotDelta do not overflow
-// even when a total count (returned by Histogram::SnapshotSample) does.
-TEST_P(SparseHistogramTest, AddCount_LargeCountsDontOverflow) {
-  std::unique_ptr<SparseHistogram> histogram(NewSparseHistogram("Sparse"));
-  std::unique_ptr<HistogramSamples> snapshot(histogram->SnapshotSamples());
-  EXPECT_EQ(0, snapshot->TotalCount());
-  EXPECT_EQ(0, snapshot->sum());
-
-  const int count = (1 << 30) - 1;
-
-  // Repeat N times to make sure that there is no internal value overflow.
-  for (int i = 0; i < 10; ++i) {
-    histogram->AddCount(42, count);
-    std::unique_ptr<HistogramSamples> samples = histogram->SnapshotDelta();
-    EXPECT_EQ(count, samples->TotalCount());
-    EXPECT_EQ(count, samples->GetCount(42));
-  }
-}
-
-TEST_P(SparseHistogramTest, MacroBasicTest) {
-  UmaHistogramSparse("Sparse", 100);
-  UmaHistogramSparse("Sparse", 200);
-  UmaHistogramSparse("Sparse", 100);
-
-  const StatisticsRecorder::Histograms histograms =
-      StatisticsRecorder::GetHistograms();
-
-  ASSERT_THAT(histograms, testing::SizeIs(1));
-  const HistogramBase* const sparse_histogram = histograms[0];
-
-  EXPECT_EQ(SPARSE_HISTOGRAM, sparse_histogram->GetHistogramType());
-  EXPECT_EQ("Sparse", StringPiece(sparse_histogram->histogram_name()));
-  EXPECT_EQ(
-      HistogramBase::kUmaTargetedHistogramFlag |
-          (use_persistent_histogram_allocator_ ? HistogramBase::kIsPersistent
-                                               : 0),
-      sparse_histogram->flags());
-
-  std::unique_ptr<HistogramSamples> samples =
-      sparse_histogram->SnapshotSamples();
-  EXPECT_EQ(3, samples->TotalCount());
-  EXPECT_EQ(2, samples->GetCount(100));
-  EXPECT_EQ(1, samples->GetCount(200));
-}
-
-TEST_P(SparseHistogramTest, MacroInLoopTest) {
-  // Unlike the macros in histogram.h, SparseHistogram macros can have a
-  // variable as histogram name.
-  for (int i = 0; i < 2; i++) {
-    UmaHistogramSparse(StringPrintf("Sparse%d", i), 100);
-  }
-
-  const StatisticsRecorder::Histograms histograms =
-      StatisticsRecorder::Sort(StatisticsRecorder::GetHistograms());
-  ASSERT_THAT(histograms, testing::SizeIs(2));
-  EXPECT_STREQ(histograms[0]->histogram_name(), "Sparse0");
-  EXPECT_STREQ(histograms[1]->histogram_name(), "Sparse1");
-}
-
-TEST_P(SparseHistogramTest, Serialize) {
-  std::unique_ptr<SparseHistogram> histogram(NewSparseHistogram("Sparse"));
-  histogram->SetFlags(HistogramBase::kIPCSerializationSourceFlag);
-
-  Pickle pickle;
-  histogram->SerializeInfo(&pickle);
-
-  PickleIterator iter(pickle);
-
-  int type;
-  EXPECT_TRUE(iter.ReadInt(&type));
-  EXPECT_EQ(SPARSE_HISTOGRAM, type);
-
-  std::string name;
-  EXPECT_TRUE(iter.ReadString(&name));
-  EXPECT_EQ("Sparse", name);
-
-  int flag;
-  EXPECT_TRUE(iter.ReadInt(&flag));
-  EXPECT_EQ(HistogramBase::kIPCSerializationSourceFlag, flag);
-
-  // No more data in the pickle.
-  EXPECT_FALSE(iter.SkipBytes(1));
-}
-
-// Ensure that race conditions that cause multiple, identical sparse histograms
-// to be created will safely resolve to a single one.
-TEST_P(SparseHistogramTest, DuplicationSafety) {
-  const char histogram_name[] = "Duplicated";
-  size_t histogram_count = StatisticsRecorder::GetHistogramCount();
-
-  // Create a histogram that we will later duplicate.
-  HistogramBase* original =
-      SparseHistogram::FactoryGet(histogram_name, HistogramBase::kNoFlags);
-  ++histogram_count;
-  DCHECK_EQ(histogram_count, StatisticsRecorder::GetHistogramCount());
-  original->Add(1);
-
-  // Create a duplicate. This has to happen differently depending on where the
-  // memory is taken from.
-  if (use_persistent_histogram_allocator_) {
-    // To allocate from persistent memory, clear the last_created reference in
-    // the GlobalHistogramAllocator. This will cause an Import to recreate
-    // the just-created histogram which will then be released as a duplicate.
-    GlobalHistogramAllocator::Get()->ClearLastCreatedReferenceForTesting();
-    // Creating a different histogram will first do an Import to ensure it
-    // hasn't been created elsewhere, triggering the duplication and release.
-    SparseHistogram::FactoryGet("something.new", HistogramBase::kNoFlags);
-    ++histogram_count;
-  } else {
-    // To allocate from the heap, just call the (private) constructor directly.
-    // Delete it immediately like would have happened within FactoryGet();
-    std::unique_ptr<SparseHistogram> something =
-        NewSparseHistogram(histogram_name);
-    DCHECK_NE(original, something.get());
-  }
-  DCHECK_EQ(histogram_count, StatisticsRecorder::GetHistogramCount());
-
-  // Re-creating the histogram via FactoryGet() will return the same one.
-  HistogramBase* duplicate =
-      SparseHistogram::FactoryGet(histogram_name, HistogramBase::kNoFlags);
-  DCHECK_EQ(original, duplicate);
-  DCHECK_EQ(histogram_count, StatisticsRecorder::GetHistogramCount());
-  duplicate->Add(2);
-
-  // Ensure that original histograms are still cross-functional.
-  original->Add(2);
-  duplicate->Add(1);
-  std::unique_ptr<HistogramSamples> snapshot_orig = original->SnapshotSamples();
-  std::unique_ptr<HistogramSamples> snapshot_dup = duplicate->SnapshotSamples();
-  DCHECK_EQ(2, snapshot_orig->GetCount(2));
-  DCHECK_EQ(2, snapshot_dup->GetCount(1));
-}
-
-TEST_P(SparseHistogramTest, FactoryTime) {
-  const int kTestCreateCount = 1 << 10;  // Must be power-of-2.
-  const int kTestLookupCount = 100000;
-  const int kTestAddCount = 100000;
-
-  // Create all histogram names in advance for accurate timing below.
-  std::vector<std::string> histogram_names;
-  for (int i = 0; i < kTestCreateCount; ++i) {
-    histogram_names.push_back(
-        StringPrintf("TestHistogram.%d", i % kTestCreateCount));
-  }
-
-  // Calculate cost of creating histograms.
-  TimeTicks create_start = TimeTicks::Now();
-  for (int i = 0; i < kTestCreateCount; ++i)
-    SparseHistogram::FactoryGet(histogram_names[i], HistogramBase::kNoFlags);
-  TimeDelta create_ticks = TimeTicks::Now() - create_start;
-  int64_t create_ms = create_ticks.InMilliseconds();
-
-  VLOG(1) << kTestCreateCount << " histogram creations took " << create_ms
-          << "ms or about "
-          << (create_ms * 1000000) / kTestCreateCount
-          << "ns each.";
-
-  // Calculate cost of looking up existing histograms.
-  TimeTicks lookup_start = TimeTicks::Now();
-  for (int i = 0; i < kTestLookupCount; ++i) {
-    // 6007 is co-prime with kTestCreateCount and so will do lookups in an
-    // order less likely to be cacheable (but still hit them all) should the
-    // underlying storage use the exact histogram name as the key.
-    const int i_mult = 6007;
-    static_assert(i_mult < INT_MAX / kTestCreateCount, "Multiplier too big");
-    int index = (i * i_mult) & (kTestCreateCount - 1);
-    SparseHistogram::FactoryGet(histogram_names[index],
-                                HistogramBase::kNoFlags);
-  }
-  TimeDelta lookup_ticks = TimeTicks::Now() - lookup_start;
-  int64_t lookup_ms = lookup_ticks.InMilliseconds();
-
-  VLOG(1) << kTestLookupCount << " histogram lookups took " << lookup_ms
-          << "ms or about "
-          << (lookup_ms * 1000000) / kTestLookupCount
-          << "ns each.";
-
-  // Calculate cost of accessing histograms.
-  HistogramBase* histogram =
-      SparseHistogram::FactoryGet(histogram_names[0], HistogramBase::kNoFlags);
-  ASSERT_TRUE(histogram);
-  TimeTicks add_start = TimeTicks::Now();
-  for (int i = 0; i < kTestAddCount; ++i)
-    histogram->Add(i & 127);
-  TimeDelta add_ticks = TimeTicks::Now() - add_start;
-  int64_t add_ms = add_ticks.InMilliseconds();
-
-  VLOG(1) << kTestAddCount << " histogram adds took " << add_ms
-          << "ms or about "
-          << (add_ms * 1000000) / kTestAddCount
-          << "ns each.";
-}
-
-TEST_P(SparseHistogramTest, ExtremeValues) {
-  static const struct {
-    Histogram::Sample sample;
-    int64_t expected_max;
-  } cases[] = {
-      // Note: We use -2147483647 - 1 rather than -2147483648 because the later
-      // is interpreted as - operator applied to 2147483648 and the latter can't
-      // be represented as an int32 and causes a warning.
-      {-2147483647 - 1, -2147483647LL},
-      {0, 1},
-      {2147483647, 2147483648LL},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    HistogramBase* histogram =
-        SparseHistogram::FactoryGet(StringPrintf("ExtremeValues_%zu", i),
-                                    HistogramBase::kUmaTargetedHistogramFlag);
-    histogram->Add(cases[i].sample);
-
-    std::unique_ptr<HistogramSamples> snapshot = histogram->SnapshotSamples();
-    std::unique_ptr<SampleCountIterator> it = snapshot->Iterator();
-    ASSERT_FALSE(it->Done());
-
-    base::Histogram::Sample min;
-    int64_t max;
-    base::Histogram::Count count;
-    it->Get(&min, &max, &count);
-
-    EXPECT_EQ(1, count);
-    EXPECT_EQ(cases[i].sample, min);
-    EXPECT_EQ(cases[i].expected_max, max);
-
-    it->Next();
-    EXPECT_TRUE(it->Done());
-  }
-}
-
-TEST_P(SparseHistogramTest, HistogramNameHash) {
-  const char kName[] = "TestName";
-  HistogramBase* histogram = SparseHistogram::FactoryGet(
-      kName, HistogramBase::kUmaTargetedHistogramFlag);
-  EXPECT_EQ(histogram->name_hash(), HashMetricName(kName));
-}
-
-}  // namespace base
diff --git a/base/metrics/statistics_recorder_unittest.cc b/base/metrics/statistics_recorder_unittest.cc
deleted file mode 100644
index 63ba136..0000000
--- a/base/metrics/statistics_recorder_unittest.cc
+++ /dev/null
@@ -1,718 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/metrics/statistics_recorder.h"
-
-#include <stddef.h>
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/json/json_reader.h"
-#include "base/logging.h"
-#include "base/memory/weak_ptr.h"
-#include "base/metrics/histogram_base.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/metrics/persistent_histogram_allocator.h"
-#include "base/metrics/record_histogram_checker.h"
-#include "base/metrics/sparse_histogram.h"
-#include "base/values.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-// Class to make sure any manipulations we do to the min log level are
-// contained (i.e., do not affect other unit tests).
-class LogStateSaver {
- public:
-  LogStateSaver() : old_min_log_level_(logging::GetMinLogLevel()) {}
-
-  ~LogStateSaver() { logging::SetMinLogLevel(old_min_log_level_); }
-
- private:
-  int old_min_log_level_;
-
-  DISALLOW_COPY_AND_ASSIGN(LogStateSaver);
-};
-
-// Test implementation of RecordHistogramChecker interface.
-class OddRecordHistogramChecker : public base::RecordHistogramChecker {
- public:
-  ~OddRecordHistogramChecker() override = default;
-
-  // base::RecordHistogramChecker:
-  bool ShouldRecord(uint64_t histogram_hash) const override {
-    return histogram_hash % 2;
-  }
-};
-
-}  // namespace
-
-namespace base {
-
-using testing::IsEmpty;
-using testing::SizeIs;
-using testing::UnorderedElementsAre;
-
-class StatisticsRecorderTest : public testing::TestWithParam<bool> {
- protected:
-  const int32_t kAllocatorMemorySize = 64 << 10;  // 64 KiB
-
-  StatisticsRecorderTest() : use_persistent_histogram_allocator_(GetParam()) {
-    // Each test will have a clean state (no Histogram / BucketRanges
-    // registered).
-    InitializeStatisticsRecorder();
-
-    // Use persistent memory for histograms if so indicated by test parameter.
-    if (use_persistent_histogram_allocator_) {
-      GlobalHistogramAllocator::CreateWithLocalMemory(kAllocatorMemorySize, 0,
-                                                      "StatisticsRecorderTest");
-    }
-  }
-
-  ~StatisticsRecorderTest() override {
-    GlobalHistogramAllocator::ReleaseForTesting();
-    UninitializeStatisticsRecorder();
-  }
-
-  void InitializeStatisticsRecorder() {
-    DCHECK(!statistics_recorder_);
-    statistics_recorder_ = StatisticsRecorder::CreateTemporaryForTesting();
-  }
-
-  // Deletes the global recorder if there is any. This is used by test
-  // NotInitialized to ensure a clean global state.
-  void UninitializeStatisticsRecorder() {
-    statistics_recorder_.reset();
-    delete StatisticsRecorder::top_;
-    DCHECK(!StatisticsRecorder::top_);
-  }
-
-  bool HasGlobalRecorder() { return StatisticsRecorder::top_ != nullptr; }
-
-  Histogram* CreateHistogram(const char* name,
-                             HistogramBase::Sample min,
-                             HistogramBase::Sample max,
-                             size_t bucket_count) {
-    BucketRanges* ranges = new BucketRanges(bucket_count + 1);
-    Histogram::InitializeBucketRanges(min, max, ranges);
-    const BucketRanges* registered_ranges =
-        StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges);
-    return new Histogram(name, min, max, registered_ranges);
-  }
-
-  void InitLogOnShutdown() { StatisticsRecorder::InitLogOnShutdown(); }
-
-  bool IsVLogInitialized() { return StatisticsRecorder::is_vlog_initialized_; }
-
-  void ResetVLogInitialized() {
-    UninitializeStatisticsRecorder();
-    StatisticsRecorder::is_vlog_initialized_ = false;
-  }
-
-  const bool use_persistent_histogram_allocator_;
-
-  std::unique_ptr<StatisticsRecorder> statistics_recorder_;
-  std::unique_ptr<GlobalHistogramAllocator> old_global_allocator_;
-
- private:
-  LogStateSaver log_state_saver_;
-
-  DISALLOW_COPY_AND_ASSIGN(StatisticsRecorderTest);
-};
-
-// Run all HistogramTest cases with both heap and persistent memory.
-INSTANTIATE_TEST_CASE_P(Allocator, StatisticsRecorderTest, testing::Bool());
-
-TEST_P(StatisticsRecorderTest, NotInitialized) {
-  UninitializeStatisticsRecorder();
-  EXPECT_FALSE(HasGlobalRecorder());
-
-  HistogramBase* const histogram =
-      CreateHistogram("TestHistogram", 1, 1000, 10);
-  EXPECT_EQ(StatisticsRecorder::RegisterOrDeleteDuplicate(histogram),
-            histogram);
-  EXPECT_TRUE(HasGlobalRecorder());
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(),
-              UnorderedElementsAre(histogram));
-
-  UninitializeStatisticsRecorder();
-  EXPECT_FALSE(HasGlobalRecorder());
-
-  BucketRanges* const ranges = new BucketRanges(3);
-  ranges->ResetChecksum();
-  EXPECT_EQ(StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges),
-            ranges);
-  EXPECT_TRUE(HasGlobalRecorder());
-  EXPECT_THAT(StatisticsRecorder::GetBucketRanges(),
-              UnorderedElementsAre(ranges));
-}
-
-TEST_P(StatisticsRecorderTest, RegisterBucketRanges) {
-  std::vector<const BucketRanges*> registered_ranges;
-
-  BucketRanges* ranges1 = new BucketRanges(3);
-  ranges1->ResetChecksum();
-  BucketRanges* ranges2 = new BucketRanges(4);
-  ranges2->ResetChecksum();
-
-  // Register new ranges.
-  EXPECT_EQ(ranges1,
-            StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges1));
-  EXPECT_EQ(ranges2,
-            StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges2));
-  EXPECT_THAT(StatisticsRecorder::GetBucketRanges(),
-              UnorderedElementsAre(ranges1, ranges2));
-
-  // Register some ranges again.
-  EXPECT_EQ(ranges1,
-            StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges1));
-  EXPECT_THAT(StatisticsRecorder::GetBucketRanges(),
-              UnorderedElementsAre(ranges1, ranges2));
-
-  // Make sure the ranges is still the one we know.
-  ASSERT_EQ(3u, ranges1->size());
-  EXPECT_EQ(0, ranges1->range(0));
-  EXPECT_EQ(0, ranges1->range(1));
-  EXPECT_EQ(0, ranges1->range(2));
-
-  // Register ranges with same values.
-  BucketRanges* ranges3 = new BucketRanges(3);
-  ranges3->ResetChecksum();
-  EXPECT_EQ(ranges1,  // returning ranges1
-            StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges3));
-  EXPECT_THAT(StatisticsRecorder::GetBucketRanges(),
-              UnorderedElementsAre(ranges1, ranges2));
-}
-
-TEST_P(StatisticsRecorderTest, RegisterHistogram) {
-  // Create a Histogram that was not registered.
-  Histogram* const histogram1 = CreateHistogram("TestHistogram1", 1, 1000, 10);
-
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(), IsEmpty());
-
-  // Register the Histogram.
-  EXPECT_EQ(histogram1,
-            StatisticsRecorder::RegisterOrDeleteDuplicate(histogram1));
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(),
-              UnorderedElementsAre(histogram1));
-
-  // Register the same Histogram again.
-  EXPECT_EQ(histogram1,
-            StatisticsRecorder::RegisterOrDeleteDuplicate(histogram1));
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(),
-              UnorderedElementsAre(histogram1));
-
-  // Register another Histogram with the same name.
-  Histogram* const histogram2 = CreateHistogram("TestHistogram1", 1, 1000, 10);
-  EXPECT_NE(histogram1, histogram2);
-  EXPECT_EQ(histogram1,
-            StatisticsRecorder::RegisterOrDeleteDuplicate(histogram2));
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(),
-              UnorderedElementsAre(histogram1));
-
-  // Register another Histogram with a different name.
-  Histogram* const histogram3 = CreateHistogram("TestHistogram0", 1, 1000, 10);
-  EXPECT_NE(histogram1, histogram3);
-  EXPECT_EQ(histogram3,
-            StatisticsRecorder::RegisterOrDeleteDuplicate(histogram3));
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(),
-              UnorderedElementsAre(histogram1, histogram3));
-}
-
-TEST_P(StatisticsRecorderTest, FindHistogram) {
-  HistogramBase* histogram1 = Histogram::FactoryGet(
-      "TestHistogram1", 1, 1000, 10, HistogramBase::kNoFlags);
-  HistogramBase* histogram2 = Histogram::FactoryGet(
-      "TestHistogram2", 1, 1000, 10, HistogramBase::kNoFlags);
-
-  EXPECT_EQ(histogram1, StatisticsRecorder::FindHistogram("TestHistogram1"));
-  EXPECT_EQ(histogram2, StatisticsRecorder::FindHistogram("TestHistogram2"));
-  EXPECT_FALSE(StatisticsRecorder::FindHistogram("TestHistogram"));
-
-  // Create a new global allocator using the same memory as the old one. Any
-  // old one is kept around so the memory doesn't get released.
-  old_global_allocator_ = GlobalHistogramAllocator::ReleaseForTesting();
-  if (use_persistent_histogram_allocator_) {
-    GlobalHistogramAllocator::CreateWithPersistentMemory(
-        const_cast<void*>(old_global_allocator_->data()),
-        old_global_allocator_->length(), 0, old_global_allocator_->Id(),
-        old_global_allocator_->Name());
-  }
-
-  // Reset statistics-recorder to validate operation from a clean start.
-  UninitializeStatisticsRecorder();
-  InitializeStatisticsRecorder();
-
-  if (use_persistent_histogram_allocator_) {
-    EXPECT_TRUE(StatisticsRecorder::FindHistogram("TestHistogram1"));
-    EXPECT_TRUE(StatisticsRecorder::FindHistogram("TestHistogram2"));
-  } else {
-    EXPECT_FALSE(StatisticsRecorder::FindHistogram("TestHistogram1"));
-    EXPECT_FALSE(StatisticsRecorder::FindHistogram("TestHistogram2"));
-  }
-  EXPECT_FALSE(StatisticsRecorder::FindHistogram("TestHistogram"));
-}
-
-TEST_P(StatisticsRecorderTest, WithName) {
-  Histogram::FactoryGet("TestHistogram1", 1, 1000, 10, Histogram::kNoFlags);
-  Histogram::FactoryGet("TestHistogram2", 1, 1000, 10, Histogram::kNoFlags);
-  Histogram::FactoryGet("TestHistogram3", 1, 1000, 10, Histogram::kNoFlags);
-
-  const auto histograms = StatisticsRecorder::GetHistograms();
-  EXPECT_THAT(histograms, SizeIs(3));
-  EXPECT_THAT(StatisticsRecorder::WithName(histograms, ""), SizeIs(3));
-  EXPECT_THAT(StatisticsRecorder::WithName(histograms, "Test"), SizeIs(3));
-  EXPECT_THAT(StatisticsRecorder::WithName(histograms, "1"), SizeIs(1));
-  EXPECT_THAT(StatisticsRecorder::WithName(histograms, "hello"), IsEmpty());
-}
-
-TEST_P(StatisticsRecorderTest, RegisterHistogramWithFactoryGet) {
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(), IsEmpty());
-
-  // Create a histogram.
-  HistogramBase* const histogram1 = Histogram::FactoryGet(
-      "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(),
-              UnorderedElementsAre(histogram1));
-
-  // Get an existing histogram.
-  HistogramBase* const histogram2 = Histogram::FactoryGet(
-      "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
-  EXPECT_EQ(histogram1, histogram2);
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(),
-              UnorderedElementsAre(histogram1));
-
-  // Create a LinearHistogram.
-  HistogramBase* const histogram3 = LinearHistogram::FactoryGet(
-      "TestLinearHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(),
-              UnorderedElementsAre(histogram1, histogram3));
-
-  // Create a BooleanHistogram.
-  HistogramBase* const histogram4 = BooleanHistogram::FactoryGet(
-      "TestBooleanHistogram", HistogramBase::kNoFlags);
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(),
-              UnorderedElementsAre(histogram1, histogram3, histogram4));
-
-  // Create a CustomHistogram.
-  std::vector<int> custom_ranges;
-  custom_ranges.push_back(1);
-  custom_ranges.push_back(5);
-  HistogramBase* const histogram5 = CustomHistogram::FactoryGet(
-      "TestCustomHistogram", custom_ranges, HistogramBase::kNoFlags);
-  EXPECT_THAT(
-      StatisticsRecorder::GetHistograms(),
-      UnorderedElementsAre(histogram1, histogram3, histogram4, histogram5));
-}
-
-TEST_P(StatisticsRecorderTest, RegisterHistogramWithMacros) {
-  // Macros cache pointers and so tests that use them can only be run once.
-  // Stop immediately if this test has run previously.
-  static bool already_run = false;
-  if (already_run)
-    return;
-  already_run = true;
-
-  StatisticsRecorder::Histograms registered_histograms;
-
-  HistogramBase* histogram = Histogram::FactoryGet(
-      "TestHistogramCounts", 1, 1000000, 50, HistogramBase::kNoFlags);
-
-  // The histogram we got from macro is the same as from FactoryGet.
-  LOCAL_HISTOGRAM_COUNTS("TestHistogramCounts", 30);
-  registered_histograms = StatisticsRecorder::GetHistograms();
-  ASSERT_EQ(1u, registered_histograms.size());
-  EXPECT_EQ(histogram, registered_histograms[0]);
-
-  LOCAL_HISTOGRAM_TIMES("TestHistogramTimes", TimeDelta::FromDays(1));
-  LOCAL_HISTOGRAM_ENUMERATION("TestHistogramEnumeration", 20, 200);
-
-  EXPECT_THAT(StatisticsRecorder::GetHistograms(), SizeIs(3));
-}
-
-TEST_P(StatisticsRecorderTest, BucketRangesSharing) {
-  EXPECT_THAT(StatisticsRecorder::GetBucketRanges(), IsEmpty());
-
-  Histogram::FactoryGet("Histogram", 1, 64, 8, HistogramBase::kNoFlags);
-  Histogram::FactoryGet("Histogram2", 1, 64, 8, HistogramBase::kNoFlags);
-  EXPECT_THAT(StatisticsRecorder::GetBucketRanges(), SizeIs(1));
-
-  Histogram::FactoryGet("Histogram3", 1, 64, 16, HistogramBase::kNoFlags);
-  EXPECT_THAT(StatisticsRecorder::GetBucketRanges(), SizeIs(2));
-}
-
-TEST_P(StatisticsRecorderTest, ToJSON) {
-  Histogram::FactoryGet("TestHistogram1", 1, 1000, 50, HistogramBase::kNoFlags)
-      ->Add(30);
-  Histogram::FactoryGet("TestHistogram1", 1, 1000, 50, HistogramBase::kNoFlags)
-      ->Add(40);
-  Histogram::FactoryGet("TestHistogram2", 1, 1000, 50, HistogramBase::kNoFlags)
-      ->Add(30);
-  Histogram::FactoryGet("TestHistogram2", 1, 1000, 50, HistogramBase::kNoFlags)
-      ->Add(40);
-
-  std::string json(StatisticsRecorder::ToJSON(JSON_VERBOSITY_LEVEL_FULL));
-
-  // Check for valid JSON.
-  std::unique_ptr<Value> root = JSONReader::Read(json);
-  ASSERT_TRUE(root.get());
-
-  DictionaryValue* root_dict = nullptr;
-  ASSERT_TRUE(root->GetAsDictionary(&root_dict));
-
-  // No query should be set.
-  ASSERT_FALSE(root_dict->HasKey("query"));
-
-  ListValue* histogram_list = nullptr;
-  ASSERT_TRUE(root_dict->GetList("histograms", &histogram_list));
-  ASSERT_EQ(2u, histogram_list->GetSize());
-
-  // Examine the first histogram.
-  DictionaryValue* histogram_dict = nullptr;
-  ASSERT_TRUE(histogram_list->GetDictionary(0, &histogram_dict));
-
-  int sample_count;
-  ASSERT_TRUE(histogram_dict->GetInteger("count", &sample_count));
-  EXPECT_EQ(2, sample_count);
-
-  ListValue* buckets_list = nullptr;
-  ASSERT_TRUE(histogram_dict->GetList("buckets", &buckets_list));
-  EXPECT_EQ(2u, buckets_list->GetList().size());
-
-  // Check the serialized JSON with a different verbosity level.
-  json = StatisticsRecorder::ToJSON(JSON_VERBOSITY_LEVEL_OMIT_BUCKETS);
-  root = JSONReader::Read(json);
-  ASSERT_TRUE(root.get());
-  root_dict = nullptr;
-  ASSERT_TRUE(root->GetAsDictionary(&root_dict));
-  histogram_list = nullptr;
-  ASSERT_TRUE(root_dict->GetList("histograms", &histogram_list));
-  ASSERT_EQ(2u, histogram_list->GetSize());
-  histogram_dict = nullptr;
-  ASSERT_TRUE(histogram_list->GetDictionary(0, &histogram_dict));
-  sample_count = 0;
-  ASSERT_TRUE(histogram_dict->GetInteger("count", &sample_count));
-  EXPECT_EQ(2, sample_count);
-  buckets_list = nullptr;
-  // Bucket information should be omitted.
-  ASSERT_FALSE(histogram_dict->GetList("buckets", &buckets_list));
-}
-
-TEST_P(StatisticsRecorderTest, IterationTest) {
-  Histogram::FactoryGet("IterationTest1", 1, 64, 16, HistogramBase::kNoFlags);
-  Histogram::FactoryGet("IterationTest2", 1, 64, 16, HistogramBase::kNoFlags);
-
-  auto histograms = StatisticsRecorder::GetHistograms();
-  EXPECT_THAT(histograms, SizeIs(2));
-  histograms = StatisticsRecorder::NonPersistent(std::move(histograms));
-  EXPECT_THAT(histograms, SizeIs(use_persistent_histogram_allocator_ ? 0 : 2));
-
-  // Create a new global allocator using the same memory as the old one. Any
-  // old one is kept around so the memory doesn't get released.
-  old_global_allocator_ = GlobalHistogramAllocator::ReleaseForTesting();
-  if (use_persistent_histogram_allocator_) {
-    GlobalHistogramAllocator::CreateWithPersistentMemory(
-        const_cast<void*>(old_global_allocator_->data()),
-        old_global_allocator_->length(), 0, old_global_allocator_->Id(),
-        old_global_allocator_->Name());
-  }
-
-  // Reset statistics-recorder to validate operation from a clean start.
-  UninitializeStatisticsRecorder();
-  InitializeStatisticsRecorder();
-
-  histograms = StatisticsRecorder::GetHistograms();
-  EXPECT_THAT(histograms, SizeIs(use_persistent_histogram_allocator_ ? 2 : 0));
-  histograms = StatisticsRecorder::NonPersistent(std::move(histograms));
-  EXPECT_THAT(histograms, IsEmpty());
-}
-
-namespace {
-
-// CallbackCheckWrapper is simply a convenient way to check and store that
-// a callback was actually run.
-struct CallbackCheckWrapper {
-  CallbackCheckWrapper() : called(false), last_histogram_value(0) {}
-
-  void OnHistogramChanged(base::HistogramBase::Sample histogram_value) {
-    called = true;
-    last_histogram_value = histogram_value;
-  }
-
-  bool called;
-  base::HistogramBase::Sample last_histogram_value;
-};
-
-}  // namespace
-
-// Check that you can't overwrite the callback with another.
-TEST_P(StatisticsRecorderTest, SetCallbackFailsWithoutHistogramTest) {
-  CallbackCheckWrapper callback_wrapper;
-
-  bool result = base::StatisticsRecorder::SetCallback(
-      "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
-                                  base::Unretained(&callback_wrapper)));
-  EXPECT_TRUE(result);
-
-  result = base::StatisticsRecorder::SetCallback(
-      "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
-                                  base::Unretained(&callback_wrapper)));
-  EXPECT_FALSE(result);
-}
-
-// Check that you can't overwrite the callback with another.
-TEST_P(StatisticsRecorderTest, SetCallbackFailsWithHistogramTest) {
-  HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10,
-                                                   HistogramBase::kNoFlags);
-  EXPECT_TRUE(histogram);
-
-  CallbackCheckWrapper callback_wrapper;
-
-  bool result = base::StatisticsRecorder::SetCallback(
-      "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
-                                  base::Unretained(&callback_wrapper)));
-  EXPECT_TRUE(result);
-  EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists,
-            base::HistogramBase::kCallbackExists);
-
-  result = base::StatisticsRecorder::SetCallback(
-      "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
-                                  base::Unretained(&callback_wrapper)));
-  EXPECT_FALSE(result);
-  EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists,
-            base::HistogramBase::kCallbackExists);
-
-  histogram->Add(1);
-
-  EXPECT_TRUE(callback_wrapper.called);
-}
-
-// Check that you can't overwrite the callback with another.
-TEST_P(StatisticsRecorderTest, ClearCallbackSuceedsWithHistogramTest) {
-  HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10,
-                                                   HistogramBase::kNoFlags);
-  EXPECT_TRUE(histogram);
-
-  CallbackCheckWrapper callback_wrapper;
-
-  bool result = base::StatisticsRecorder::SetCallback(
-      "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
-                                  base::Unretained(&callback_wrapper)));
-  EXPECT_TRUE(result);
-  EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists,
-            base::HistogramBase::kCallbackExists);
-
-  base::StatisticsRecorder::ClearCallback("TestHistogram");
-  EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, 0);
-
-  histogram->Add(1);
-
-  EXPECT_FALSE(callback_wrapper.called);
-}
-
-// Check that callback is used.
-TEST_P(StatisticsRecorderTest, CallbackUsedTest) {
-  {
-    HistogramBase* histogram = Histogram::FactoryGet(
-        "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
-    EXPECT_TRUE(histogram);
-
-    CallbackCheckWrapper callback_wrapper;
-
-    base::StatisticsRecorder::SetCallback(
-        "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
-                                    base::Unretained(&callback_wrapper)));
-
-    histogram->Add(1);
-
-    EXPECT_TRUE(callback_wrapper.called);
-    EXPECT_EQ(callback_wrapper.last_histogram_value, 1);
-  }
-
-  {
-    HistogramBase* linear_histogram = LinearHistogram::FactoryGet(
-        "TestLinearHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
-
-    CallbackCheckWrapper callback_wrapper;
-
-    base::StatisticsRecorder::SetCallback(
-        "TestLinearHistogram",
-        base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
-                   base::Unretained(&callback_wrapper)));
-
-    linear_histogram->Add(1);
-
-    EXPECT_TRUE(callback_wrapper.called);
-    EXPECT_EQ(callback_wrapper.last_histogram_value, 1);
-  }
-
-  {
-    std::vector<int> custom_ranges;
-    custom_ranges.push_back(1);
-    custom_ranges.push_back(5);
-    HistogramBase* custom_histogram = CustomHistogram::FactoryGet(
-        "TestCustomHistogram", custom_ranges, HistogramBase::kNoFlags);
-
-    CallbackCheckWrapper callback_wrapper;
-
-    base::StatisticsRecorder::SetCallback(
-        "TestCustomHistogram",
-        base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
-                   base::Unretained(&callback_wrapper)));
-
-    custom_histogram->Add(1);
-
-    EXPECT_TRUE(callback_wrapper.called);
-    EXPECT_EQ(callback_wrapper.last_histogram_value, 1);
-  }
-
-  {
-    HistogramBase* custom_histogram = SparseHistogram::FactoryGet(
-        "TestSparseHistogram", HistogramBase::kNoFlags);
-
-    CallbackCheckWrapper callback_wrapper;
-
-    base::StatisticsRecorder::SetCallback(
-        "TestSparseHistogram",
-        base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
-                   base::Unretained(&callback_wrapper)));
-
-    custom_histogram->Add(1);
-
-    EXPECT_TRUE(callback_wrapper.called);
-    EXPECT_EQ(callback_wrapper.last_histogram_value, 1);
-  }
-}
-
-// Check that setting a callback before the histogram exists works.
-TEST_P(StatisticsRecorderTest, CallbackUsedBeforeHistogramCreatedTest) {
-  CallbackCheckWrapper callback_wrapper;
-
-  base::StatisticsRecorder::SetCallback(
-      "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
-                                  base::Unretained(&callback_wrapper)));
-
-  HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10,
-                                                   HistogramBase::kNoFlags);
-  EXPECT_TRUE(histogram);
-  histogram->Add(1);
-
-  EXPECT_TRUE(callback_wrapper.called);
-  EXPECT_EQ(callback_wrapper.last_histogram_value, 1);
-}
-
-TEST_P(StatisticsRecorderTest, LogOnShutdownNotInitialized) {
-  ResetVLogInitialized();
-  logging::SetMinLogLevel(logging::LOG_WARNING);
-  InitializeStatisticsRecorder();
-  EXPECT_FALSE(VLOG_IS_ON(1));
-  EXPECT_FALSE(IsVLogInitialized());
-  InitLogOnShutdown();
-  EXPECT_FALSE(IsVLogInitialized());
-}
-
-TEST_P(StatisticsRecorderTest, LogOnShutdownInitializedExplicitly) {
-  ResetVLogInitialized();
-  logging::SetMinLogLevel(logging::LOG_WARNING);
-  InitializeStatisticsRecorder();
-  EXPECT_FALSE(VLOG_IS_ON(1));
-  EXPECT_FALSE(IsVLogInitialized());
-  logging::SetMinLogLevel(logging::LOG_VERBOSE);
-  EXPECT_TRUE(VLOG_IS_ON(1));
-  InitLogOnShutdown();
-  EXPECT_TRUE(IsVLogInitialized());
-}
-
-TEST_P(StatisticsRecorderTest, LogOnShutdownInitialized) {
-  ResetVLogInitialized();
-  logging::SetMinLogLevel(logging::LOG_VERBOSE);
-  InitializeStatisticsRecorder();
-  EXPECT_TRUE(VLOG_IS_ON(1));
-  EXPECT_TRUE(IsVLogInitialized());
-}
-
-class TestHistogramProvider : public StatisticsRecorder::HistogramProvider {
- public:
-  TestHistogramProvider(std::unique_ptr<PersistentHistogramAllocator> allocator)
-      : allocator_(std::move(allocator)), weak_factory_(this) {
-    StatisticsRecorder::RegisterHistogramProvider(weak_factory_.GetWeakPtr());
-  }
-
-  void MergeHistogramDeltas() override {
-    PersistentHistogramAllocator::Iterator hist_iter(allocator_.get());
-    while (true) {
-      std::unique_ptr<base::HistogramBase> histogram = hist_iter.GetNext();
-      if (!histogram)
-        break;
-      allocator_->MergeHistogramDeltaToStatisticsRecorder(histogram.get());
-    }
-  }
-
- private:
-  std::unique_ptr<PersistentHistogramAllocator> allocator_;
-  WeakPtrFactory<TestHistogramProvider> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestHistogramProvider);
-};
-
-TEST_P(StatisticsRecorderTest, ImportHistogramsTest) {
-  // Create a second SR to create some histograms for later import.
-  std::unique_ptr<StatisticsRecorder> temp_sr =
-      StatisticsRecorder::CreateTemporaryForTesting();
-
-  // Extract any existing global allocator so a new one can be created.
-  std::unique_ptr<GlobalHistogramAllocator> old_allocator =
-      GlobalHistogramAllocator::ReleaseForTesting();
-
-  // Create a histogram inside a new allocator for testing.
-  GlobalHistogramAllocator::CreateWithLocalMemory(kAllocatorMemorySize, 0, "");
-  HistogramBase* histogram = LinearHistogram::FactoryGet("Foo", 1, 10, 11, 0);
-  histogram->Add(3);
-
-  // Undo back to the starting point.
-  std::unique_ptr<GlobalHistogramAllocator> new_allocator =
-      GlobalHistogramAllocator::ReleaseForTesting();
-  GlobalHistogramAllocator::Set(std::move(old_allocator));
-  temp_sr.reset();
-
-  // Create a provider that can supply histograms to the current SR.
-  TestHistogramProvider provider(std::move(new_allocator));
-
-  // Verify that the created histogram is no longer known.
-  ASSERT_FALSE(StatisticsRecorder::FindHistogram(histogram->histogram_name()));
-
-  // Now test that it merges.
-  StatisticsRecorder::ImportProvidedHistograms();
-  HistogramBase* found =
-      StatisticsRecorder::FindHistogram(histogram->histogram_name());
-  ASSERT_TRUE(found);
-  EXPECT_NE(histogram, found);
-  std::unique_ptr<HistogramSamples> snapshot = found->SnapshotSamples();
-  EXPECT_EQ(1, snapshot->TotalCount());
-  EXPECT_EQ(1, snapshot->GetCount(3));
-
-  // Finally, verify that updates can also be merged.
-  histogram->Add(3);
-  histogram->Add(5);
-  StatisticsRecorder::ImportProvidedHistograms();
-  snapshot = found->SnapshotSamples();
-  EXPECT_EQ(3, snapshot->TotalCount());
-  EXPECT_EQ(2, snapshot->GetCount(3));
-  EXPECT_EQ(1, snapshot->GetCount(5));
-}
-
-TEST_P(StatisticsRecorderTest, RecordHistogramChecker) {
-  // Record checker isn't set
-  EXPECT_TRUE(base::StatisticsRecorder::ShouldRecordHistogram(0));
-  auto record_checker = std::make_unique<OddRecordHistogramChecker>();
-  base::StatisticsRecorder::SetRecordChecker(std::move(record_checker));
-  EXPECT_TRUE(base::StatisticsRecorder::ShouldRecordHistogram(1));
-  EXPECT_FALSE(base::StatisticsRecorder::ShouldRecordHistogram(2));
-}
-
-}  // namespace base
diff --git a/base/native_library_unittest.cc b/base/native_library_unittest.cc
deleted file mode 100644
index ac8ec5c..0000000
--- a/base/native_library_unittest.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/native_library.h"
-#include "base/path_service.h"
-#include "base/test/native_library_test_utils.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-const FilePath::CharType kDummyLibraryPath[] =
-    FILE_PATH_LITERAL("dummy_library");
-
-TEST(NativeLibraryTest, LoadFailure) {
-  NativeLibraryLoadError error;
-  EXPECT_FALSE(LoadNativeLibrary(FilePath(kDummyLibraryPath), &error));
-  EXPECT_FALSE(error.ToString().empty());
-}
-
-// |error| is optional and can be null.
-TEST(NativeLibraryTest, LoadFailureWithNullError) {
-  EXPECT_FALSE(LoadNativeLibrary(FilePath(kDummyLibraryPath), nullptr));
-}
-
-TEST(NativeLibraryTest, GetNativeLibraryName) {
-  const char kExpectedName[] =
-#if defined(OS_WIN)
-      "mylib.dll";
-#elif defined(OS_IOS)
-      "mylib";
-#elif defined(OS_MACOSX)
-      "libmylib.dylib";
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-      "libmylib.so";
-#endif
-  EXPECT_EQ(kExpectedName, GetNativeLibraryName("mylib"));
-}
-
-TEST(NativeLibraryTest, GetLoadableModuleName) {
-  const char kExpectedName[] =
-#if defined(OS_WIN)
-      "mylib.dll";
-#elif defined(OS_IOS)
-      "mylib";
-#elif defined(OS_MACOSX)
-      "mylib.so";
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-      "libmylib.so";
-#endif
-  EXPECT_EQ(kExpectedName, GetLoadableModuleName("mylib"));
-}
-
-// We don't support dynamic loading on iOS, and ASAN will complain about our
-// intentional ODR violation because of |g_native_library_exported_value| being
-// defined globally both here and in the shared library.
-#if !defined(OS_IOS) && !defined(ADDRESS_SANITIZER)
-
-const char kTestLibraryName[] =
-#if defined(OS_WIN)
-    "test_shared_library.dll";
-#elif defined(OS_MACOSX)
-    "libtest_shared_library.dylib";
-#elif defined(OS_ANDROID) && defined(COMPONENT_BUILD)
-    "libtest_shared_library.cr.so";
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-    "libtest_shared_library.so";
-#endif
-
-class TestLibrary {
- public:
-  TestLibrary() : TestLibrary(NativeLibraryOptions()) {}
-
-  explicit TestLibrary(const NativeLibraryOptions& options)
-    : library_(nullptr) {
-    base::FilePath exe_path;
-
-#if !defined(OS_FUCHSIA)
-    // Libraries do not sit alongside the executable in Fuchsia. NativeLibrary
-    // is aware of this and is able to resolve library paths correctly.
-    CHECK(base::PathService::Get(base::DIR_EXE, &exe_path));
-#endif
-
-    library_ = LoadNativeLibraryWithOptions(
-        exe_path.AppendASCII(kTestLibraryName), options, nullptr);
-    CHECK(library_);
-  }
-
-  ~TestLibrary() {
-    UnloadNativeLibrary(library_);
-  }
-
-  template <typename ReturnType, typename... Args>
-  ReturnType Call(const char* function_name, Args... args) {
-    return reinterpret_cast<ReturnType(*)(Args...)>(
-        GetFunctionPointerFromNativeLibrary(library_, function_name))(args...);
-  }
-
- private:
-  NativeLibrary library_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestLibrary);
-};
-
-// NativeLibraaryTest.LoadLibrary is failing on M tablets only.
-// crbug/641309
-#if !defined(OS_ANDROID)
-
-// Verifies that we can load a native library and resolve its exported symbols.
-TEST(NativeLibraryTest, LoadLibrary) {
-  TestLibrary library;
-  EXPECT_EQ(5, library.Call<int>("GetSimpleTestValue"));
-}
-
-#endif  // !defined(OS_ANDROID)
-
-// Android dlopen() requires further investigation, as it might vary across
-// versions with respect to symbol resolution scope.
-// TSan and MSan error out on RTLD_DEEPBIND, https://crbug.com/705255
-#if !defined(OS_ANDROID) && !defined(THREAD_SANITIZER) && \
-    !defined(MEMORY_SANITIZER)
-
-// Verifies that the |prefer_own_symbols| option satisfies its guarantee that
-// a loaded library will always prefer local symbol resolution before
-// considering global symbols.
-TEST(NativeLibraryTest, LoadLibraryPreferOwnSymbols) {
-  NativeLibraryOptions options;
-  options.prefer_own_symbols = true;
-  TestLibrary library(options);
-
-  // Verify that this binary and the DSO use different storage for
-  // |g_native_library_exported_value|.
-  g_native_library_exported_value = 1;
-  library.Call<void>("SetExportedValue", 2);
-  EXPECT_EQ(1, g_native_library_exported_value);
-  g_native_library_exported_value = 3;
-  EXPECT_EQ(2, library.Call<int>("GetExportedValue"));
-
-  // Both this binary and the library link against the
-  // native_library_test_utils source library, which in turn exports the
-  // NativeLibraryTestIncrement() function whose return value depends on some
-  // static internal state.
-  //
-  // The DSO's GetIncrementValue() forwards to that function inside the DSO.
-  //
-  // Here we verify that direct calls to NativeLibraryTestIncrement() in this
-  // binary return a sequence of values independent from the sequence returned
-  // by GetIncrementValue(), ensuring that the DSO is calling its own local
-  // definition of NativeLibraryTestIncrement().
-  EXPECT_EQ(1, library.Call<int>("GetIncrementValue"));
-  EXPECT_EQ(1, NativeLibraryTestIncrement());
-  EXPECT_EQ(2, library.Call<int>("GetIncrementValue"));
-  EXPECT_EQ(3, library.Call<int>("GetIncrementValue"));
-  EXPECT_EQ(4, library.Call<int>("NativeLibraryTestIncrement"));
-  EXPECT_EQ(2, NativeLibraryTestIncrement());
-  EXPECT_EQ(3, NativeLibraryTestIncrement());
-}
-
-#endif  // !defined(OS_ANDROID)
-
-#endif  // !defined(OS_IOS) && !defined(ADDRESS_SANITIZER)
-
-}  // namespace base
diff --git a/base/nix/xdg_util_unittest.cc b/base/nix/xdg_util_unittest.cc
deleted file mode 100644
index e195303..0000000
--- a/base/nix/xdg_util_unittest.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/nix/xdg_util.h"
-
-#include "base/environment.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::_;
-using ::testing::Eq;
-using ::testing::Return;
-using ::testing::SetArgPointee;
-
-namespace base {
-namespace nix {
-
-namespace {
-
-class MockEnvironment : public Environment {
- public:
-  MOCK_METHOD2(GetVar, bool(StringPiece, std::string* result));
-  MOCK_METHOD2(SetVar, bool(StringPiece, const std::string& new_value));
-  MOCK_METHOD1(UnSetVar, bool(StringPiece));
-};
-
-// Needs to be const char* to make gmock happy.
-const char* const kDesktopGnome = "gnome";
-const char* const kDesktopGnomeFallback = "gnome-fallback";
-const char* const kDesktopMATE = "mate";
-const char* const kDesktopKDE4 = "kde4";
-const char* const kDesktopKDE = "kde";
-const char* const kDesktopXFCE = "xfce";
-const char* const kXdgDesktopCinnamon = "X-Cinnamon";
-const char* const kXdgDesktopGNOME = "GNOME";
-const char* const kXdgDesktopKDE = "KDE";
-const char* const kXdgDesktopPantheon = "Pantheon";
-const char* const kXdgDesktopUnity = "Unity";
-const char* const kXdgDesktopUnity7 = "Unity:Unity7";
-const char* const kXdgDesktopUnity8 = "Unity:Unity8";
-const char* const kKDESessionKDE5 = "5";
-
-const char kDesktopSession[] = "DESKTOP_SESSION";
-const char kKDESession[] = "KDE_SESSION_VERSION";
-const char kXdgDesktop[] = "XDG_CURRENT_DESKTOP";
-
-}  // namespace
-
-TEST(XDGUtilTest, GetDesktopEnvironmentGnome) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kDesktopGnome), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetDesktopEnvironmentMATE) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kDesktopMATE), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetDesktopEnvironmentKDE4) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kDesktopKDE4), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_KDE4, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetDesktopEnvironmentKDE3) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kDesktopKDE), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_KDE3, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetDesktopEnvironmentXFCE) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kDesktopXFCE), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_XFCE, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetXdgDesktopCinnamon) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kXdgDesktop), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopCinnamon), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_CINNAMON, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetXdgDesktopGnome) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kXdgDesktop), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopGNOME), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetXdgDesktopGnomeFallback) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kXdgDesktop), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopUnity), Return(true)));
-  EXPECT_CALL(getter, GetVar(Eq(kDesktopSession), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kDesktopGnomeFallback), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_GNOME, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetXdgDesktopKDE5) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kXdgDesktop), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopKDE), Return(true)));
-  EXPECT_CALL(getter, GetVar(Eq(kKDESession), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kKDESessionKDE5), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_KDE5, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetXdgDesktopKDE4) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kXdgDesktop), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopKDE), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_KDE4, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetXdgDesktopPantheon) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kXdgDesktop), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopPantheon), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_PANTHEON, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetXdgDesktopUnity) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kXdgDesktop), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopUnity), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_UNITY, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetXdgDesktopUnity7) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kXdgDesktop), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopUnity7), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_UNITY, GetDesktopEnvironment(&getter));
-}
-
-TEST(XDGUtilTest, GetXdgDesktopUnity8) {
-  MockEnvironment getter;
-  EXPECT_CALL(getter, GetVar(_, _)).WillRepeatedly(Return(false));
-  EXPECT_CALL(getter, GetVar(Eq(kXdgDesktop), _))
-      .WillOnce(DoAll(SetArgPointee<1>(kXdgDesktopUnity8), Return(true)));
-
-  EXPECT_EQ(DESKTOP_ENVIRONMENT_UNITY, GetDesktopEnvironment(&getter));
-}
-
-}  // namespace nix
-}  // namespace base
diff --git a/base/no_destructor_unittest.cc b/base/no_destructor_unittest.cc
deleted file mode 100644
index c552a92..0000000
--- a/base/no_destructor_unittest.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/no_destructor.h"
-
-#include <string>
-#include <utility>
-
-#include "base/logging.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-struct CheckOnDestroy {
-  ~CheckOnDestroy() { CHECK(false); }
-};
-
-TEST(NoDestructorTest, SkipsDestructors) {
-  NoDestructor<CheckOnDestroy> destructor_should_not_run;
-}
-
-struct CopyOnly {
-  CopyOnly() = default;
-
-  CopyOnly(const CopyOnly&) = default;
-  CopyOnly& operator=(const CopyOnly&) = default;
-
-  CopyOnly(CopyOnly&&) = delete;
-  CopyOnly& operator=(CopyOnly&&) = delete;
-};
-
-struct MoveOnly {
-  MoveOnly() = default;
-
-  MoveOnly(const MoveOnly&) = delete;
-  MoveOnly& operator=(const MoveOnly&) = delete;
-
-  MoveOnly(MoveOnly&&) = default;
-  MoveOnly& operator=(MoveOnly&&) = default;
-};
-
-struct ForwardingTestStruct {
-  ForwardingTestStruct(const CopyOnly&, MoveOnly&&) {}
-};
-
-TEST(NoDestructorTest, ForwardsArguments) {
-  CopyOnly copy_only;
-  MoveOnly move_only;
-
-  static NoDestructor<ForwardingTestStruct> test_forwarding(
-      copy_only, std::move(move_only));
-}
-
-TEST(NoDestructorTest, Accessors) {
-  static NoDestructor<std::string> awesome("awesome");
-
-  EXPECT_EQ("awesome", *awesome);
-  EXPECT_EQ(0, awesome->compare("awesome"));
-  EXPECT_EQ(0, awesome.get()->compare("awesome"));
-}
-
-// Passing initializer list to a NoDestructor like in this test
-// is ambiguous in GCC.
-// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84849
-#if !defined(COMPILER_GCC) && !defined(__clang__)
-TEST(NoDestructorTest, InitializerList) {
-  static NoDestructor<std::vector<std::string>> vector({"a", "b", "c"});
-}
-#endif
-}  // namespace
-
-}  // namespace base
diff --git a/base/numerics/BUILD.gn b/base/numerics/BUILD.gn
deleted file mode 100644
index 0bb8dd1..0000000
--- a/base/numerics/BUILD.gn
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (c) 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-# This is a dependency-free, header-only, library, and it needs to stay that
-# way to facilitate pulling it into various third-party projects. So, this
-# file is here to protect against accidentally introducing external
-# dependencies or depending on internal implementation details.
-source_set("base_numerics") {
-  visibility = [ "//base/*" ]
-  sources = [
-    "checked_math_impl.h",
-    "clamped_math_impl.h",
-    "safe_conversions_arm_impl.h",
-    "safe_conversions_impl.h",
-    "safe_math_arm_impl.h",
-    "safe_math_clang_gcc_impl.h",
-    "safe_math_shared_impl.h",
-  ]
-  public = [
-    "checked_math.h",
-    "clamped_math.h",
-    "math_constants.h",
-    "ranges.h",
-    "safe_conversions.h",
-    "safe_math.h",
-  ]
-}
diff --git a/base/observer_list_unittest.cc b/base/observer_list_unittest.cc
deleted file mode 100644
index 37629ef..0000000
--- a/base/observer_list_unittest.cc
+++ /dev/null
@@ -1,1276 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/observer_list.h"
-#include "base/observer_list_threadsafe.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/location.h"
-#include "base/memory/weak_ptr.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/sequenced_task_runner.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/task_scheduler/task_scheduler.h"
-#include "base/test/gtest_util.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread_restrictions.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-class Foo {
- public:
-  virtual void Observe(int x) = 0;
-  virtual ~Foo() = default;
-  virtual int GetValue() const { return 0; }
-};
-
-class Adder : public Foo {
- public:
-  explicit Adder(int scaler) : total(0), scaler_(scaler) {}
-  ~Adder() override = default;
-
-  void Observe(int x) override { total += x * scaler_; }
-  int GetValue() const override { return total; }
-
-  int total;
-
- private:
-  int scaler_;
-};
-
-class Disrupter : public Foo {
- public:
-  Disrupter(ObserverList<Foo>* list, Foo* doomed, bool remove_self)
-      : list_(list), doomed_(doomed), remove_self_(remove_self) {}
-  Disrupter(ObserverList<Foo>* list, Foo* doomed)
-      : Disrupter(list, doomed, false) {}
-  Disrupter(ObserverList<Foo>* list, bool remove_self)
-      : Disrupter(list, nullptr, remove_self) {}
-
-  ~Disrupter() override = default;
-
-  void Observe(int x) override {
-    if (remove_self_)
-      list_->RemoveObserver(this);
-    if (doomed_)
-      list_->RemoveObserver(doomed_);
-  }
-
-  void SetDoomed(Foo* doomed) { doomed_ = doomed; }
-
- private:
-  ObserverList<Foo>* list_;
-  Foo* doomed_;
-  bool remove_self_;
-};
-
-template <typename ObserverListType>
-class AddInObserve : public Foo {
- public:
-  explicit AddInObserve(ObserverListType* observer_list)
-      : observer_list(observer_list), to_add_() {}
-
-  void SetToAdd(Foo* to_add) { to_add_ = to_add; }
-
-  void Observe(int x) override {
-    if (to_add_) {
-      observer_list->AddObserver(to_add_);
-      to_add_ = nullptr;
-    }
-  }
-
-  ObserverListType* observer_list;
-  Foo* to_add_;
-};
-
-
-static const int kThreadRunTime = 2000;  // ms to run the multi-threaded test.
-
-// A thread for use in the ThreadSafeObserver test
-// which will add and remove itself from the notification
-// list repeatedly.
-class AddRemoveThread : public PlatformThread::Delegate,
-                        public Foo {
- public:
-  AddRemoveThread(ObserverListThreadSafe<Foo>* list,
-                  bool notify,
-                  WaitableEvent* ready)
-      : list_(list),
-        loop_(nullptr),
-        in_list_(false),
-        start_(Time::Now()),
-        count_observes_(0),
-        count_addtask_(0),
-        do_notifies_(notify),
-        ready_(ready),
-        weak_factory_(this) {}
-
-  ~AddRemoveThread() override = default;
-
-  void ThreadMain() override {
-    loop_ = new MessageLoop();  // Fire up a message loop.
-    loop_->task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&AddRemoveThread::AddTask, weak_factory_.GetWeakPtr()));
-    ready_->Signal();
-    // After ready_ is signaled, loop_ is only accessed by the main test thread
-    // (i.e. not this thread) in particular by Quit() which causes Run() to
-    // return, and we "control" loop_ again.
-    RunLoop().Run();
-    delete loop_;
-    loop_ = reinterpret_cast<MessageLoop*>(0xdeadbeef);
-    delete this;
-  }
-
-  // This task just keeps posting to itself in an attempt
-  // to race with the notifier.
-  void AddTask() {
-    count_addtask_++;
-
-    if ((Time::Now() - start_).InMilliseconds() > kThreadRunTime) {
-      VLOG(1) << "DONE!";
-      return;
-    }
-
-    if (!in_list_) {
-      list_->AddObserver(this);
-      in_list_ = true;
-    }
-
-    if (do_notifies_) {
-      list_->Notify(FROM_HERE, &Foo::Observe, 10);
-    }
-
-    loop_->task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&AddRemoveThread::AddTask, weak_factory_.GetWeakPtr()));
-  }
-
-  // This function is only callable from the main thread.
-  void Quit() {
-    loop_->task_runner()->PostTask(
-        FROM_HERE, RunLoop::QuitCurrentWhenIdleClosureDeprecated());
-  }
-
-  void Observe(int x) override {
-    count_observes_++;
-
-    // If we're getting called after we removed ourselves from
-    // the list, that is very bad!
-    DCHECK(in_list_);
-
-    // This callback should fire on the appropriate thread
-    EXPECT_EQ(loop_, MessageLoop::current());
-
-    list_->RemoveObserver(this);
-    in_list_ = false;
-  }
-
- private:
-  ObserverListThreadSafe<Foo>* list_;
-  MessageLoop* loop_;
-  bool in_list_;        // Are we currently registered for notifications.
-                        // in_list_ is only used on |this| thread.
-  Time start_;          // The time we started the test.
-
-  int count_observes_;  // Number of times we observed.
-  int count_addtask_;   // Number of times thread AddTask was called
-  bool do_notifies_;    // Whether these threads should do notifications.
-  WaitableEvent* ready_;
-
-  base::WeakPtrFactory<AddRemoveThread> weak_factory_;
-};
-
-}  // namespace
-
-TEST(ObserverListTest, BasicTest) {
-  ObserverList<Foo> observer_list;
-  const ObserverList<Foo>& const_observer_list = observer_list;
-
-  {
-    const ObserverList<Foo>::const_iterator it1 = const_observer_list.begin();
-    EXPECT_EQ(it1, const_observer_list.end());
-    // Iterator copy.
-    const ObserverList<Foo>::const_iterator it2 = it1;
-    EXPECT_EQ(it2, it1);
-    // Iterator assignment.
-    ObserverList<Foo>::const_iterator it3;
-    it3 = it2;
-    EXPECT_EQ(it3, it1);
-    EXPECT_EQ(it3, it2);
-    // Self assignment.
-    it3 = *&it3;  // The *& defeats Clang's -Wself-assign warning.
-    EXPECT_EQ(it3, it1);
-    EXPECT_EQ(it3, it2);
-  }
-
-  {
-    const ObserverList<Foo>::iterator it1 = observer_list.begin();
-    EXPECT_EQ(it1, observer_list.end());
-    // Iterator copy.
-    const ObserverList<Foo>::iterator it2 = it1;
-    EXPECT_EQ(it2, it1);
-    // Iterator assignment.
-    ObserverList<Foo>::iterator it3;
-    it3 = it2;
-    EXPECT_EQ(it3, it1);
-    EXPECT_EQ(it3, it2);
-    // Self assignment.
-    it3 = *&it3;  // The *& defeats Clang's -Wself-assign warning.
-    EXPECT_EQ(it3, it1);
-    EXPECT_EQ(it3, it2);
-  }
-
-  Adder a(1), b(-1), c(1), d(-1), e(-1);
-  Disrupter evil(&observer_list, &c);
-
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-
-  EXPECT_TRUE(const_observer_list.HasObserver(&a));
-  EXPECT_FALSE(const_observer_list.HasObserver(&c));
-
-  {
-    const ObserverList<Foo>::const_iterator it1 = const_observer_list.begin();
-    EXPECT_NE(it1, const_observer_list.end());
-    // Iterator copy.
-    const ObserverList<Foo>::const_iterator it2 = it1;
-    EXPECT_EQ(it2, it1);
-    EXPECT_NE(it2, const_observer_list.end());
-    // Iterator assignment.
-    ObserverList<Foo>::const_iterator it3;
-    it3 = it2;
-    EXPECT_EQ(it3, it1);
-    EXPECT_EQ(it3, it2);
-    // Self assignment.
-    it3 = *&it3;  // The *& defeats Clang's -Wself-assign warning.
-    EXPECT_EQ(it3, it1);
-    EXPECT_EQ(it3, it2);
-    // Iterator post increment.
-    ObserverList<Foo>::const_iterator it4 = it3++;
-    EXPECT_EQ(it4, it1);
-    EXPECT_EQ(it4, it2);
-    EXPECT_NE(it4, it3);
-  }
-
-  {
-    const ObserverList<Foo>::iterator it1 = observer_list.begin();
-    EXPECT_NE(it1, observer_list.end());
-    // Iterator copy.
-    const ObserverList<Foo>::iterator it2 = it1;
-    EXPECT_EQ(it2, it1);
-    EXPECT_NE(it2, observer_list.end());
-    // Iterator assignment.
-    ObserverList<Foo>::iterator it3;
-    it3 = it2;
-    EXPECT_EQ(it3, it1);
-    EXPECT_EQ(it3, it2);
-    // Self assignment.
-    it3 = *&it3;  // The *& defeats Clang's -Wself-assign warning.
-    EXPECT_EQ(it3, it1);
-    EXPECT_EQ(it3, it2);
-    // Iterator post increment.
-    ObserverList<Foo>::iterator it4 = it3++;
-    EXPECT_EQ(it4, it1);
-    EXPECT_EQ(it4, it2);
-    EXPECT_NE(it4, it3);
-  }
-
-  for (auto& observer : observer_list)
-    observer.Observe(10);
-
-  observer_list.AddObserver(&evil);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&d);
-
-  // Removing an observer not in the list should do nothing.
-  observer_list.RemoveObserver(&e);
-
-  for (auto& observer : observer_list)
-    observer.Observe(10);
-
-  EXPECT_EQ(20, a.total);
-  EXPECT_EQ(-20, b.total);
-  EXPECT_EQ(0, c.total);
-  EXPECT_EQ(-10, d.total);
-  EXPECT_EQ(0, e.total);
-}
-
-TEST(ObserverListTest, CompactsWhenNoActiveIterator) {
-  ObserverList<const Foo> ol;
-  const ObserverList<const Foo>& col = ol;
-
-  const Adder a(1);
-  const Adder b(2);
-  const Adder c(3);
-
-  ol.AddObserver(&a);
-  ol.AddObserver(&b);
-
-  EXPECT_TRUE(col.HasObserver(&a));
-  EXPECT_FALSE(col.HasObserver(&c));
-
-  EXPECT_TRUE(col.might_have_observers());
-
-  using It = ObserverList<const Foo>::const_iterator;
-
-  {
-    It it = col.begin();
-    EXPECT_NE(it, col.end());
-    It ita = it;
-    EXPECT_EQ(ita, it);
-    EXPECT_NE(++it, col.end());
-    EXPECT_NE(ita, it);
-    It itb = it;
-    EXPECT_EQ(itb, it);
-    EXPECT_EQ(++it, col.end());
-
-    EXPECT_TRUE(col.might_have_observers());
-    EXPECT_EQ(&*ita, &a);
-    EXPECT_EQ(&*itb, &b);
-
-    ol.RemoveObserver(&a);
-    EXPECT_TRUE(col.might_have_observers());
-    EXPECT_FALSE(col.HasObserver(&a));
-    EXPECT_EQ(&*itb, &b);
-
-    ol.RemoveObserver(&b);
-    EXPECT_TRUE(col.might_have_observers());
-    EXPECT_FALSE(col.HasObserver(&a));
-    EXPECT_FALSE(col.HasObserver(&b));
-
-    it = It();
-    ita = It();
-    EXPECT_TRUE(col.might_have_observers());
-    ita = itb;
-    itb = It();
-    EXPECT_TRUE(col.might_have_observers());
-    ita = It();
-    EXPECT_FALSE(col.might_have_observers());
-  }
-
-  ol.AddObserver(&a);
-  ol.AddObserver(&b);
-  EXPECT_TRUE(col.might_have_observers());
-  ol.Clear();
-  EXPECT_FALSE(col.might_have_observers());
-
-  ol.AddObserver(&a);
-  ol.AddObserver(&b);
-  EXPECT_TRUE(col.might_have_observers());
-  {
-    const It it = col.begin();
-    ol.Clear();
-    EXPECT_TRUE(col.might_have_observers());
-  }
-  EXPECT_FALSE(col.might_have_observers());
-}
-
-TEST(ObserverListTest, DisruptSelf) {
-  ObserverList<Foo> observer_list;
-  Adder a(1), b(-1), c(1), d(-1);
-  Disrupter evil(&observer_list, true);
-
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-
-  for (auto& observer : observer_list)
-    observer.Observe(10);
-
-  observer_list.AddObserver(&evil);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&d);
-
-  for (auto& observer : observer_list)
-    observer.Observe(10);
-
-  EXPECT_EQ(20, a.total);
-  EXPECT_EQ(-20, b.total);
-  EXPECT_EQ(10, c.total);
-  EXPECT_EQ(-10, d.total);
-}
-
-TEST(ObserverListTest, DisruptBefore) {
-  ObserverList<Foo> observer_list;
-  Adder a(1), b(-1), c(1), d(-1);
-  Disrupter evil(&observer_list, &b);
-
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-  observer_list.AddObserver(&evil);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&d);
-
-  for (auto& observer : observer_list)
-    observer.Observe(10);
-  for (auto& observer : observer_list)
-    observer.Observe(10);
-
-  EXPECT_EQ(20, a.total);
-  EXPECT_EQ(-10, b.total);
-  EXPECT_EQ(20, c.total);
-  EXPECT_EQ(-20, d.total);
-}
-
-TEST(ObserverListThreadSafeTest, BasicTest) {
-  MessageLoop loop;
-
-  scoped_refptr<ObserverListThreadSafe<Foo> > observer_list(
-      new ObserverListThreadSafe<Foo>);
-  Adder a(1);
-  Adder b(-1);
-  Adder c(1);
-  Adder d(-1);
-
-  observer_list->AddObserver(&a);
-  observer_list->AddObserver(&b);
-
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 10);
-  RunLoop().RunUntilIdle();
-
-  observer_list->AddObserver(&c);
-  observer_list->AddObserver(&d);
-
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 10);
-  observer_list->RemoveObserver(&c);
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(20, a.total);
-  EXPECT_EQ(-20, b.total);
-  EXPECT_EQ(0, c.total);
-  EXPECT_EQ(-10, d.total);
-}
-
-TEST(ObserverListThreadSafeTest, RemoveObserver) {
-  MessageLoop loop;
-
-  scoped_refptr<ObserverListThreadSafe<Foo> > observer_list(
-      new ObserverListThreadSafe<Foo>);
-  Adder a(1), b(1);
-
-  // A workaround for the compiler bug. See http://crbug.com/121960.
-  EXPECT_NE(&a, &b);
-
-  // Should do nothing.
-  observer_list->RemoveObserver(&a);
-  observer_list->RemoveObserver(&b);
-
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 10);
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(0, a.total);
-  EXPECT_EQ(0, b.total);
-
-  observer_list->AddObserver(&a);
-
-  // Should also do nothing.
-  observer_list->RemoveObserver(&b);
-
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 10);
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(10, a.total);
-  EXPECT_EQ(0, b.total);
-}
-
-TEST(ObserverListThreadSafeTest, WithoutSequence) {
-  scoped_refptr<ObserverListThreadSafe<Foo> > observer_list(
-      new ObserverListThreadSafe<Foo>);
-
-  Adder a(1), b(1), c(1);
-
-  // No sequence, so these should not be added.
-  observer_list->AddObserver(&a);
-  observer_list->AddObserver(&b);
-
-  {
-    // Add c when there's a sequence.
-    MessageLoop loop;
-    observer_list->AddObserver(&c);
-
-    observer_list->Notify(FROM_HERE, &Foo::Observe, 10);
-    RunLoop().RunUntilIdle();
-
-    EXPECT_EQ(0, a.total);
-    EXPECT_EQ(0, b.total);
-    EXPECT_EQ(10, c.total);
-
-    // Now add a when there's a sequence.
-    observer_list->AddObserver(&a);
-
-    // Remove c when there's a sequence.
-    observer_list->RemoveObserver(&c);
-
-    // Notify again.
-    observer_list->Notify(FROM_HERE, &Foo::Observe, 20);
-    RunLoop().RunUntilIdle();
-
-    EXPECT_EQ(20, a.total);
-    EXPECT_EQ(0, b.total);
-    EXPECT_EQ(10, c.total);
-  }
-
-  // Removing should always succeed with or without a sequence.
-  observer_list->RemoveObserver(&a);
-
-  // Notifying should not fail but should also be a no-op.
-  MessageLoop loop;
-  observer_list->AddObserver(&b);
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 30);
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(20, a.total);
-  EXPECT_EQ(30, b.total);
-  EXPECT_EQ(10, c.total);
-}
-
-class FooRemover : public Foo {
- public:
-  explicit FooRemover(ObserverListThreadSafe<Foo>* list) : list_(list) {}
-  ~FooRemover() override = default;
-
-  void AddFooToRemove(Foo* foo) {
-    foos_.push_back(foo);
-  }
-
-  void Observe(int x) override {
-    std::vector<Foo*> tmp;
-    tmp.swap(foos_);
-    for (std::vector<Foo*>::iterator it = tmp.begin();
-         it != tmp.end(); ++it) {
-      list_->RemoveObserver(*it);
-    }
-  }
-
- private:
-  const scoped_refptr<ObserverListThreadSafe<Foo> > list_;
-  std::vector<Foo*> foos_;
-};
-
-TEST(ObserverListThreadSafeTest, RemoveMultipleObservers) {
-  MessageLoop loop;
-  scoped_refptr<ObserverListThreadSafe<Foo> > observer_list(
-      new ObserverListThreadSafe<Foo>);
-
-  FooRemover a(observer_list.get());
-  Adder b(1);
-
-  observer_list->AddObserver(&a);
-  observer_list->AddObserver(&b);
-
-  a.AddFooToRemove(&a);
-  a.AddFooToRemove(&b);
-
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 1);
-  RunLoop().RunUntilIdle();
-}
-
-// A test driver for a multi-threaded notification loop.  Runs a number
-// of observer threads, each of which constantly adds/removes itself
-// from the observer list.  Optionally, if cross_thread_notifies is set
-// to true, the observer threads will also trigger notifications to
-// all observers.
-static void ThreadSafeObserverHarness(int num_threads,
-                                      bool cross_thread_notifies) {
-  MessageLoop loop;
-
-  scoped_refptr<ObserverListThreadSafe<Foo> > observer_list(
-      new ObserverListThreadSafe<Foo>);
-  Adder a(1);
-  Adder b(-1);
-
-  observer_list->AddObserver(&a);
-  observer_list->AddObserver(&b);
-
-  std::vector<AddRemoveThread*> threaded_observer;
-  std::vector<base::PlatformThreadHandle> threads(num_threads);
-  std::vector<std::unique_ptr<base::WaitableEvent>> ready;
-  threaded_observer.reserve(num_threads);
-  ready.reserve(num_threads);
-  for (int index = 0; index < num_threads; index++) {
-    ready.push_back(std::make_unique<WaitableEvent>(
-        WaitableEvent::ResetPolicy::MANUAL,
-        WaitableEvent::InitialState::NOT_SIGNALED));
-    threaded_observer.push_back(new AddRemoveThread(
-        observer_list.get(), cross_thread_notifies, ready.back().get()));
-    EXPECT_TRUE(
-        PlatformThread::Create(0, threaded_observer.back(), &threads[index]));
-  }
-  ASSERT_EQ(static_cast<size_t>(num_threads), threaded_observer.size());
-  ASSERT_EQ(static_cast<size_t>(num_threads), ready.size());
-
-  // This makes sure that threaded_observer has gotten to set loop_, so that we
-  // can call Quit() below safe-ish-ly.
-  for (int i = 0; i < num_threads; ++i)
-    ready[i]->Wait();
-
-  Time start = Time::Now();
-  while (true) {
-    if ((Time::Now() - start).InMilliseconds() > kThreadRunTime)
-      break;
-
-    observer_list->Notify(FROM_HERE, &Foo::Observe, 10);
-
-    RunLoop().RunUntilIdle();
-  }
-
-  for (int index = 0; index < num_threads; index++) {
-    threaded_observer[index]->Quit();
-    PlatformThread::Join(threads[index]);
-  }
-}
-
-TEST(ObserverListThreadSafeTest, CrossThreadObserver) {
-  // Use 7 observer threads.  Notifications only come from
-  // the main thread.
-  ThreadSafeObserverHarness(7, false);
-}
-
-TEST(ObserverListThreadSafeTest, CrossThreadNotifications) {
-  // Use 3 observer threads.  Notifications will fire from
-  // the main thread and all 3 observer threads.
-  ThreadSafeObserverHarness(3, true);
-}
-
-TEST(ObserverListThreadSafeTest, OutlivesMessageLoop) {
-  MessageLoop* loop = new MessageLoop;
-  scoped_refptr<ObserverListThreadSafe<Foo> > observer_list(
-      new ObserverListThreadSafe<Foo>);
-
-  Adder a(1);
-  observer_list->AddObserver(&a);
-  delete loop;
-  // Test passes if we don't crash here.
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 1);
-}
-
-namespace {
-
-class SequenceVerificationObserver : public Foo {
- public:
-  explicit SequenceVerificationObserver(
-      scoped_refptr<SequencedTaskRunner> task_runner)
-      : task_runner_(std::move(task_runner)) {}
-  ~SequenceVerificationObserver() override = default;
-
-  void Observe(int x) override {
-    called_on_valid_sequence_ = task_runner_->RunsTasksInCurrentSequence();
-  }
-
-  bool called_on_valid_sequence() const { return called_on_valid_sequence_; }
-
- private:
-  const scoped_refptr<SequencedTaskRunner> task_runner_;
-  bool called_on_valid_sequence_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(SequenceVerificationObserver);
-};
-
-}  // namespace
-
-// Verify that observers are notified on the correct sequence.
-TEST(ObserverListThreadSafeTest, NotificationOnValidSequence) {
-  test::ScopedTaskEnvironment scoped_task_environment;
-
-  auto task_runner_1 = CreateSequencedTaskRunnerWithTraits(TaskTraits());
-  auto task_runner_2 = CreateSequencedTaskRunnerWithTraits(TaskTraits());
-
-  auto observer_list = MakeRefCounted<ObserverListThreadSafe<Foo>>();
-
-  SequenceVerificationObserver observer_1(task_runner_1);
-  SequenceVerificationObserver observer_2(task_runner_2);
-
-  task_runner_1->PostTask(FROM_HERE,
-                          BindOnce(&ObserverListThreadSafe<Foo>::AddObserver,
-                                   observer_list, Unretained(&observer_1)));
-  task_runner_2->PostTask(FROM_HERE,
-                          BindOnce(&ObserverListThreadSafe<Foo>::AddObserver,
-                                   observer_list, Unretained(&observer_2)));
-
-  TaskScheduler::GetInstance()->FlushForTesting();
-
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 1);
-
-  TaskScheduler::GetInstance()->FlushForTesting();
-
-  EXPECT_TRUE(observer_1.called_on_valid_sequence());
-  EXPECT_TRUE(observer_2.called_on_valid_sequence());
-}
-
-// Verify that when an observer is added to a NOTIFY_ALL ObserverListThreadSafe
-// from a notification, it is itself notified.
-TEST(ObserverListThreadSafeTest, AddObserverFromNotificationNotifyAll) {
-  test::ScopedTaskEnvironment scoped_task_environment;
-  auto observer_list = MakeRefCounted<ObserverListThreadSafe<Foo>>();
-
-  Adder observer_added_from_notification(1);
-
-  AddInObserve<ObserverListThreadSafe<Foo>> initial_observer(
-      observer_list.get());
-  initial_observer.SetToAdd(&observer_added_from_notification);
-  observer_list->AddObserver(&initial_observer);
-
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 1);
-
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(1, observer_added_from_notification.GetValue());
-}
-
-namespace {
-
-class RemoveWhileNotificationIsRunningObserver : public Foo {
- public:
-  RemoveWhileNotificationIsRunningObserver()
-      : notification_running_(WaitableEvent::ResetPolicy::AUTOMATIC,
-                              WaitableEvent::InitialState::NOT_SIGNALED),
-        barrier_(WaitableEvent::ResetPolicy::AUTOMATIC,
-                 WaitableEvent::InitialState::NOT_SIGNALED) {}
-  ~RemoveWhileNotificationIsRunningObserver() override = default;
-
-  void Observe(int x) override {
-    notification_running_.Signal();
-    ScopedAllowBaseSyncPrimitivesForTesting allow_base_sync_primitives;
-    barrier_.Wait();
-  }
-
-  void WaitForNotificationRunning() { notification_running_.Wait(); }
-  void Unblock() { barrier_.Signal(); }
-
- private:
-  WaitableEvent notification_running_;
-  WaitableEvent barrier_;
-
-  DISALLOW_COPY_AND_ASSIGN(RemoveWhileNotificationIsRunningObserver);
-};
-
-}  // namespace
-
-// Verify that there is no crash when an observer is removed while it is being
-// notified.
-TEST(ObserverListThreadSafeTest, RemoveWhileNotificationIsRunning) {
-  auto observer_list = MakeRefCounted<ObserverListThreadSafe<Foo>>();
-  RemoveWhileNotificationIsRunningObserver observer;
-
-  WaitableEvent task_running(WaitableEvent::ResetPolicy::AUTOMATIC,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent barrier(WaitableEvent::ResetPolicy::AUTOMATIC,
-                        WaitableEvent::InitialState::NOT_SIGNALED);
-
-  // This must be after the declaration of |barrier| so that tasks posted to
-  // TaskScheduler can safely use |barrier|.
-  test::ScopedTaskEnvironment scoped_task_environment;
-
-  CreateSequencedTaskRunnerWithTraits({})->PostTask(
-      FROM_HERE, base::BindOnce(&ObserverListThreadSafe<Foo>::AddObserver,
-                                observer_list, Unretained(&observer)));
-  TaskScheduler::GetInstance()->FlushForTesting();
-
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 1);
-  observer.WaitForNotificationRunning();
-  observer_list->RemoveObserver(&observer);
-
-  observer.Unblock();
-}
-
-TEST(ObserverListTest, Existing) {
-  ObserverList<Foo> observer_list(ObserverListPolicy::EXISTING_ONLY);
-  Adder a(1);
-  AddInObserve<ObserverList<Foo> > b(&observer_list);
-  Adder c(1);
-  b.SetToAdd(&c);
-
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-
-  for (auto& observer : observer_list)
-    observer.Observe(1);
-
-  EXPECT_FALSE(b.to_add_);
-  // B's adder should not have been notified because it was added during
-  // notification.
-  EXPECT_EQ(0, c.total);
-
-  // Notify again to make sure b's adder is notified.
-  for (auto& observer : observer_list)
-    observer.Observe(1);
-  EXPECT_EQ(1, c.total);
-}
-
-// Same as above, but for ObserverListThreadSafe
-TEST(ObserverListThreadSafeTest, Existing) {
-  MessageLoop loop;
-  scoped_refptr<ObserverListThreadSafe<Foo>> observer_list(
-      new ObserverListThreadSafe<Foo>(ObserverListPolicy::EXISTING_ONLY));
-  Adder a(1);
-  AddInObserve<ObserverListThreadSafe<Foo> > b(observer_list.get());
-  Adder c(1);
-  b.SetToAdd(&c);
-
-  observer_list->AddObserver(&a);
-  observer_list->AddObserver(&b);
-
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 1);
-  RunLoop().RunUntilIdle();
-
-  EXPECT_FALSE(b.to_add_);
-  // B's adder should not have been notified because it was added during
-  // notification.
-  EXPECT_EQ(0, c.total);
-
-  // Notify again to make sure b's adder is notified.
-  observer_list->Notify(FROM_HERE, &Foo::Observe, 1);
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ(1, c.total);
-}
-
-class AddInClearObserve : public Foo {
- public:
-  explicit AddInClearObserve(ObserverList<Foo>* list)
-      : list_(list), added_(false), adder_(1) {}
-
-  void Observe(int /* x */) override {
-    list_->Clear();
-    list_->AddObserver(&adder_);
-    added_ = true;
-  }
-
-  bool added() const { return added_; }
-  const Adder& adder() const { return adder_; }
-
- private:
-  ObserverList<Foo>* const list_;
-
-  bool added_;
-  Adder adder_;
-};
-
-TEST(ObserverListTest, ClearNotifyAll) {
-  ObserverList<Foo> observer_list;
-  AddInClearObserve a(&observer_list);
-
-  observer_list.AddObserver(&a);
-
-  for (auto& observer : observer_list)
-    observer.Observe(1);
-  EXPECT_TRUE(a.added());
-  EXPECT_EQ(1, a.adder().total)
-      << "Adder should observe once and have sum of 1.";
-}
-
-TEST(ObserverListTest, ClearNotifyExistingOnly) {
-  ObserverList<Foo> observer_list(ObserverListPolicy::EXISTING_ONLY);
-  AddInClearObserve a(&observer_list);
-
-  observer_list.AddObserver(&a);
-
-  for (auto& observer : observer_list)
-    observer.Observe(1);
-  EXPECT_TRUE(a.added());
-  EXPECT_EQ(0, a.adder().total)
-      << "Adder should not observe, so sum should still be 0.";
-}
-
-class ListDestructor : public Foo {
- public:
-  explicit ListDestructor(ObserverList<Foo>* list) : list_(list) {}
-  ~ListDestructor() override = default;
-
-  void Observe(int x) override { delete list_; }
-
- private:
-  ObserverList<Foo>* list_;
-};
-
-
-TEST(ObserverListTest, IteratorOutlivesList) {
-  ObserverList<Foo>* observer_list = new ObserverList<Foo>;
-  ListDestructor a(observer_list);
-  observer_list->AddObserver(&a);
-
-  for (auto& observer : *observer_list)
-    observer.Observe(0);
-
-  // There are no EXPECT* statements for this test, if we catch
-  // use-after-free errors for observer_list (eg with ASan) then
-  // this test has failed.  See http://crbug.com/85296.
-}
-
-TEST(ObserverListTest, BasicStdIterator) {
-  using FooList = ObserverList<Foo>;
-  FooList observer_list;
-
-  // An optimization: begin() and end() do not involve weak pointers on
-  // empty list.
-  EXPECT_FALSE(observer_list.begin().list_);
-  EXPECT_FALSE(observer_list.end().list_);
-
-  // Iterate over empty list: no effect, no crash.
-  for (auto& i : observer_list)
-    i.Observe(10);
-
-  Adder a(1), b(-1), c(1), d(-1);
-
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&d);
-
-  for (FooList::iterator i = observer_list.begin(), e = observer_list.end();
-       i != e; ++i)
-    i->Observe(1);
-
-  EXPECT_EQ(1, a.total);
-  EXPECT_EQ(-1, b.total);
-  EXPECT_EQ(1, c.total);
-  EXPECT_EQ(-1, d.total);
-
-  // Check an iteration over a 'const view' for a given container.
-  const FooList& const_list = observer_list;
-  for (FooList::const_iterator i = const_list.begin(), e = const_list.end();
-       i != e; ++i) {
-    EXPECT_EQ(1, std::abs(i->GetValue()));
-  }
-
-  for (const auto& o : const_list)
-    EXPECT_EQ(1, std::abs(o.GetValue()));
-}
-
-TEST(ObserverListTest, StdIteratorRemoveItself) {
-  ObserverList<Foo> observer_list;
-  Adder a(1), b(-1), c(1), d(-1);
-  Disrupter disrupter(&observer_list, true);
-
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-  observer_list.AddObserver(&disrupter);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&d);
-
-  for (auto& o : observer_list)
-    o.Observe(1);
-
-  for (auto& o : observer_list)
-    o.Observe(10);
-
-  EXPECT_EQ(11, a.total);
-  EXPECT_EQ(-11, b.total);
-  EXPECT_EQ(11, c.total);
-  EXPECT_EQ(-11, d.total);
-}
-
-TEST(ObserverListTest, StdIteratorRemoveBefore) {
-  ObserverList<Foo> observer_list;
-  Adder a(1), b(-1), c(1), d(-1);
-  Disrupter disrupter(&observer_list, &b);
-
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-  observer_list.AddObserver(&disrupter);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&d);
-
-  for (auto& o : observer_list)
-    o.Observe(1);
-
-  for (auto& o : observer_list)
-    o.Observe(10);
-
-  EXPECT_EQ(11, a.total);
-  EXPECT_EQ(-1, b.total);
-  EXPECT_EQ(11, c.total);
-  EXPECT_EQ(-11, d.total);
-}
-
-TEST(ObserverListTest, StdIteratorRemoveAfter) {
-  ObserverList<Foo> observer_list;
-  Adder a(1), b(-1), c(1), d(-1);
-  Disrupter disrupter(&observer_list, &c);
-
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-  observer_list.AddObserver(&disrupter);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&d);
-
-  for (auto& o : observer_list)
-    o.Observe(1);
-
-  for (auto& o : observer_list)
-    o.Observe(10);
-
-  EXPECT_EQ(11, a.total);
-  EXPECT_EQ(-11, b.total);
-  EXPECT_EQ(0, c.total);
-  EXPECT_EQ(-11, d.total);
-}
-
-TEST(ObserverListTest, StdIteratorRemoveAfterFront) {
-  ObserverList<Foo> observer_list;
-  Adder a(1), b(-1), c(1), d(-1);
-  Disrupter disrupter(&observer_list, &a);
-
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&disrupter);
-  observer_list.AddObserver(&b);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&d);
-
-  for (auto& o : observer_list)
-    o.Observe(1);
-
-  for (auto& o : observer_list)
-    o.Observe(10);
-
-  EXPECT_EQ(1, a.total);
-  EXPECT_EQ(-11, b.total);
-  EXPECT_EQ(11, c.total);
-  EXPECT_EQ(-11, d.total);
-}
-
-TEST(ObserverListTest, StdIteratorRemoveBeforeBack) {
-  ObserverList<Foo> observer_list;
-  Adder a(1), b(-1), c(1), d(-1);
-  Disrupter disrupter(&observer_list, &d);
-
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&disrupter);
-  observer_list.AddObserver(&d);
-
-  for (auto& o : observer_list)
-    o.Observe(1);
-
-  for (auto& o : observer_list)
-    o.Observe(10);
-
-  EXPECT_EQ(11, a.total);
-  EXPECT_EQ(-11, b.total);
-  EXPECT_EQ(11, c.total);
-  EXPECT_EQ(0, d.total);
-}
-
-TEST(ObserverListTest, StdIteratorRemoveFront) {
-  using FooList = ObserverList<Foo>;
-  FooList observer_list;
-  Adder a(1), b(-1), c(1), d(-1);
-  Disrupter disrupter(&observer_list, true);
-
-  observer_list.AddObserver(&disrupter);
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&d);
-
-  bool test_disruptor = true;
-  for (FooList::iterator i = observer_list.begin(), e = observer_list.end();
-       i != e; ++i) {
-    i->Observe(1);
-    // Check that second call to i->Observe() would crash here.
-    if (test_disruptor) {
-      EXPECT_FALSE(i.GetCurrent());
-      test_disruptor = false;
-    }
-  }
-
-  for (auto& o : observer_list)
-    o.Observe(10);
-
-  EXPECT_EQ(11, a.total);
-  EXPECT_EQ(-11, b.total);
-  EXPECT_EQ(11, c.total);
-  EXPECT_EQ(-11, d.total);
-}
-
-TEST(ObserverListTest, StdIteratorRemoveBack) {
-  ObserverList<Foo> observer_list;
-  Adder a(1), b(-1), c(1), d(-1);
-  Disrupter disrupter(&observer_list, true);
-
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&d);
-  observer_list.AddObserver(&disrupter);
-
-  for (auto& o : observer_list)
-    o.Observe(1);
-
-  for (auto& o : observer_list)
-    o.Observe(10);
-
-  EXPECT_EQ(11, a.total);
-  EXPECT_EQ(-11, b.total);
-  EXPECT_EQ(11, c.total);
-  EXPECT_EQ(-11, d.total);
-}
-
-TEST(ObserverListTest, NestedLoop) {
-  ObserverList<Foo> observer_list;
-  Adder a(1), b(-1), c(1), d(-1);
-  Disrupter disrupter(&observer_list, true);
-
-  observer_list.AddObserver(&disrupter);
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-  observer_list.AddObserver(&c);
-  observer_list.AddObserver(&d);
-
-  for (auto& o : observer_list) {
-    o.Observe(10);
-
-    for (auto& o : observer_list)
-      o.Observe(1);
-  }
-
-  EXPECT_EQ(15, a.total);
-  EXPECT_EQ(-15, b.total);
-  EXPECT_EQ(15, c.total);
-  EXPECT_EQ(-15, d.total);
-}
-
-TEST(ObserverListTest, NonCompactList) {
-  ObserverList<Foo> observer_list;
-  Adder a(1), b(-1);
-
-  Disrupter disrupter1(&observer_list, true);
-  Disrupter disrupter2(&observer_list, true);
-
-  // Disrupt itself and another one.
-  disrupter1.SetDoomed(&disrupter2);
-
-  observer_list.AddObserver(&disrupter1);
-  observer_list.AddObserver(&disrupter2);
-  observer_list.AddObserver(&a);
-  observer_list.AddObserver(&b);
-
-  for (auto& o : observer_list) {
-    // Get the { nullptr, nullptr, &a, &b } non-compact list
-    // on the first inner pass.
-    o.Observe(10);
-
-    for (auto& o : observer_list)
-      o.Observe(1);
-  }
-
-  EXPECT_EQ(13, a.total);
-  EXPECT_EQ(-13, b.total);
-}
-
-TEST(ObserverListTest, BecomesEmptyThanNonEmpty) {
-  ObserverList<Foo> observer_list;
-  Adder a(1), b(-1);
-
-  Disrupter disrupter1(&observer_list, true);
-  Disrupter disrupter2(&observer_list, true);
-
-  // Disrupt itself and another one.
-  disrupter1.SetDoomed(&disrupter2);
-
-  observer_list.AddObserver(&disrupter1);
-  observer_list.AddObserver(&disrupter2);
-
-  bool add_observers = true;
-  for (auto& o : observer_list) {
-    // Get the { nullptr, nullptr } empty list on the first inner pass.
-    o.Observe(10);
-
-    for (auto& o : observer_list)
-      o.Observe(1);
-
-    if (add_observers) {
-      observer_list.AddObserver(&a);
-      observer_list.AddObserver(&b);
-      add_observers = false;
-    }
-  }
-
-  EXPECT_EQ(12, a.total);
-  EXPECT_EQ(-12, b.total);
-}
-
-TEST(ObserverListTest, AddObserverInTheLastObserve) {
-  using FooList = ObserverList<Foo>;
-  FooList observer_list;
-
-  AddInObserve<FooList> a(&observer_list);
-  Adder b(-1);
-
-  a.SetToAdd(&b);
-  observer_list.AddObserver(&a);
-
-  auto it = observer_list.begin();
-  while (it != observer_list.end()) {
-    auto& observer = *it;
-    // Intentionally increment the iterator before calling Observe(). The
-    // ObserverList starts with only one observer, and it == observer_list.end()
-    // should be true after the next line.
-    ++it;
-    // However, the first Observe() call will add a second observer: at this
-    // point, it != observer_list.end() should be true, and Observe() should be
-    // called on the newly added observer on the next iteration of the loop.
-    observer.Observe(10);
-  }
-
-  EXPECT_EQ(-10, b.total);
-}
-
-class MockLogAssertHandler {
- public:
-  MOCK_METHOD4(
-      HandleLogAssert,
-      void(const char*, int, const base::StringPiece, const base::StringPiece));
-};
-
-#if DCHECK_IS_ON()
-TEST(ObserverListTest, NonReentrantObserverList) {
-  using ::testing::_;
-
-  ObserverList<Foo, /*check_empty=*/false, /*allow_reentrancy=*/false>
-      non_reentrant_observer_list;
-  Adder a(1);
-  non_reentrant_observer_list.AddObserver(&a);
-
-  EXPECT_DCHECK_DEATH({
-    for (const Foo& a : non_reentrant_observer_list) {
-      for (const Foo& b : non_reentrant_observer_list) {
-        std::ignore = a;
-        std::ignore = b;
-      }
-    }
-  });
-}
-
-TEST(ObserverListTest, ReentrantObserverList) {
-  using ::testing::_;
-
-  ReentrantObserverList<Foo> reentrant_observer_list;
-  Adder a(1);
-  reentrant_observer_list.AddObserver(&a);
-  bool passed = false;
-  for (const Foo& a : reentrant_observer_list) {
-    for (const Foo& b : reentrant_observer_list) {
-      std::ignore = a;
-      std::ignore = b;
-      passed = true;
-    }
-  }
-  EXPECT_TRUE(passed);
-}
-#endif
-
-}  // namespace base
diff --git a/base/optional_unittest.cc b/base/optional_unittest.cc
deleted file mode 100644
index 7bdb46b..0000000
--- a/base/optional_unittest.cc
+++ /dev/null
@@ -1,2185 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/optional.h"
-
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::ElementsAre;
-
-namespace base {
-
-namespace {
-
-// Object used to test complex object with Optional<T> in addition of the move
-// semantics.
-class TestObject {
- public:
-  enum class State {
-    DEFAULT_CONSTRUCTED,
-    VALUE_CONSTRUCTED,
-    COPY_CONSTRUCTED,
-    MOVE_CONSTRUCTED,
-    MOVED_FROM,
-    COPY_ASSIGNED,
-    MOVE_ASSIGNED,
-    SWAPPED,
-  };
-
-  TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {}
-
-  TestObject(int foo, double bar)
-      : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {}
-
-  TestObject(const TestObject& other)
-      : foo_(other.foo_),
-        bar_(other.bar_),
-        state_(State::COPY_CONSTRUCTED),
-        move_ctors_count_(other.move_ctors_count_) {}
-
-  TestObject(TestObject&& other)
-      : foo_(std::move(other.foo_)),
-        bar_(std::move(other.bar_)),
-        state_(State::MOVE_CONSTRUCTED),
-        move_ctors_count_(other.move_ctors_count_ + 1) {
-    other.state_ = State::MOVED_FROM;
-  }
-
-  TestObject& operator=(const TestObject& other) {
-    foo_ = other.foo_;
-    bar_ = other.bar_;
-    state_ = State::COPY_ASSIGNED;
-    move_ctors_count_ = other.move_ctors_count_;
-    return *this;
-  }
-
-  TestObject& operator=(TestObject&& other) {
-    foo_ = other.foo_;
-    bar_ = other.bar_;
-    state_ = State::MOVE_ASSIGNED;
-    move_ctors_count_ = other.move_ctors_count_;
-    other.state_ = State::MOVED_FROM;
-    return *this;
-  }
-
-  void Swap(TestObject* other) {
-    using std::swap;
-    swap(foo_, other->foo_);
-    swap(bar_, other->bar_);
-    swap(move_ctors_count_, other->move_ctors_count_);
-    state_ = State::SWAPPED;
-    other->state_ = State::SWAPPED;
-  }
-
-  bool operator==(const TestObject& other) const {
-    return std::tie(foo_, bar_) == std::tie(other.foo_, other.bar_);
-  }
-
-  bool operator!=(const TestObject& other) const { return !(*this == other); }
-
-  int foo() const { return foo_; }
-  State state() const { return state_; }
-  int move_ctors_count() const { return move_ctors_count_; }
-
- private:
-  int foo_;
-  double bar_;
-  State state_;
-  int move_ctors_count_ = 0;
-};
-
-// Implementing Swappable concept.
-void swap(TestObject& lhs, TestObject& rhs) {
-  lhs.Swap(&rhs);
-}
-
-class NonTriviallyDestructible {
-  ~NonTriviallyDestructible() {}
-};
-
-class DeletedDefaultConstructor {
- public:
-  DeletedDefaultConstructor() = delete;
-  DeletedDefaultConstructor(int foo) : foo_(foo) {}
-
-  int foo() const { return foo_; }
-
- private:
-  int foo_;
-};
-
-class DeletedCopy {
- public:
-  explicit DeletedCopy(int foo) : foo_(foo) {}
-  DeletedCopy(const DeletedCopy&) = delete;
-  DeletedCopy(DeletedCopy&&) = default;
-
-  DeletedCopy& operator=(const DeletedCopy&) = delete;
-  DeletedCopy& operator=(DeletedCopy&&) = default;
-
-  int foo() const { return foo_; }
-
- private:
-  int foo_;
-};
-
-class DeletedMove {
- public:
-  explicit DeletedMove(int foo) : foo_(foo) {}
-  DeletedMove(const DeletedMove&) = default;
-  DeletedMove(DeletedMove&&) = delete;
-
-  DeletedMove& operator=(const DeletedMove&) = default;
-  DeletedMove& operator=(DeletedMove&&) = delete;
-
-  int foo() const { return foo_; }
-
- private:
-  int foo_;
-};
-
-class NonTriviallyDestructibleDeletedCopyConstructor {
- public:
-  explicit NonTriviallyDestructibleDeletedCopyConstructor(int foo)
-      : foo_(foo) {}
-  NonTriviallyDestructibleDeletedCopyConstructor(
-      const NonTriviallyDestructibleDeletedCopyConstructor&) = delete;
-  NonTriviallyDestructibleDeletedCopyConstructor(
-      NonTriviallyDestructibleDeletedCopyConstructor&&) = default;
-
-  ~NonTriviallyDestructibleDeletedCopyConstructor() {}
-
-  int foo() const { return foo_; }
-
- private:
-  int foo_;
-};
-
-class DeleteNewOperators {
- public:
-  void* operator new(size_t) = delete;
-  void* operator new(size_t, void*) = delete;
-  void* operator new[](size_t) = delete;
-  void* operator new[](size_t, void*) = delete;
-};
-
-}  // anonymous namespace
-
-static_assert(std::is_trivially_destructible<Optional<int>>::value,
-              "OptionalIsTriviallyDestructible");
-
-static_assert(
-    !std::is_trivially_destructible<Optional<NonTriviallyDestructible>>::value,
-    "OptionalIsTriviallyDestructible");
-
-static_assert(sizeof(Optional<int>) == sizeof(internal::OptionalBase<int>),
-              "internal::{Copy,Move}{Constructible,Assignable} structs "
-              "should be 0-sized");
-
-TEST(OptionalTest, DefaultConstructor) {
-  {
-    constexpr Optional<float> o;
-    EXPECT_FALSE(o);
-  }
-
-  {
-    Optional<std::string> o;
-    EXPECT_FALSE(o);
-  }
-
-  {
-    Optional<TestObject> o;
-    EXPECT_FALSE(o);
-  }
-}
-
-TEST(OptionalTest, CopyConstructor) {
-  {
-    constexpr Optional<float> first(0.1f);
-    constexpr Optional<float> other(first);
-
-    EXPECT_TRUE(other);
-    EXPECT_EQ(other.value(), 0.1f);
-    EXPECT_EQ(first, other);
-  }
-
-  {
-    Optional<std::string> first("foo");
-    Optional<std::string> other(first);
-
-    EXPECT_TRUE(other);
-    EXPECT_EQ(other.value(), "foo");
-    EXPECT_EQ(first, other);
-  }
-
-  {
-    const Optional<std::string> first("foo");
-    Optional<std::string> other(first);
-
-    EXPECT_TRUE(other);
-    EXPECT_EQ(other.value(), "foo");
-    EXPECT_EQ(first, other);
-  }
-
-  {
-    Optional<TestObject> first(TestObject(3, 0.1));
-    Optional<TestObject> other(first);
-
-    EXPECT_TRUE(!!other);
-    EXPECT_TRUE(other.value() == TestObject(3, 0.1));
-    EXPECT_TRUE(first == other);
-  }
-}
-
-TEST(OptionalTest, ValueConstructor) {
-  {
-    constexpr float value = 0.1f;
-    constexpr Optional<float> o(value);
-
-    EXPECT_TRUE(o);
-    EXPECT_EQ(value, o.value());
-  }
-
-  {
-    std::string value("foo");
-    Optional<std::string> o(value);
-
-    EXPECT_TRUE(o);
-    EXPECT_EQ(value, o.value());
-  }
-
-  {
-    TestObject value(3, 0.1);
-    Optional<TestObject> o(value);
-
-    EXPECT_TRUE(o);
-    EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state());
-    EXPECT_EQ(value, o.value());
-  }
-}
-
-TEST(OptionalTest, MoveConstructor) {
-  {
-    constexpr Optional<float> first(0.1f);
-    constexpr Optional<float> second(std::move(first));
-
-    EXPECT_TRUE(second.has_value());
-    EXPECT_EQ(second.value(), 0.1f);
-
-    EXPECT_TRUE(first.has_value());
-  }
-
-  {
-    Optional<std::string> first("foo");
-    Optional<std::string> second(std::move(first));
-
-    EXPECT_TRUE(second.has_value());
-    EXPECT_EQ("foo", second.value());
-
-    EXPECT_TRUE(first.has_value());
-  }
-
-  {
-    Optional<TestObject> first(TestObject(3, 0.1));
-    Optional<TestObject> second(std::move(first));
-
-    EXPECT_TRUE(second.has_value());
-    EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
-    EXPECT_TRUE(TestObject(3, 0.1) == second.value());
-
-    EXPECT_TRUE(first.has_value());
-    EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
-  }
-
-  // Even if copy constructor is deleted, move constructor needs to work.
-  // Note that it couldn't be constexpr.
-  {
-    Optional<DeletedCopy> first(in_place, 42);
-    Optional<DeletedCopy> second(std::move(first));
-
-    EXPECT_TRUE(second.has_value());
-    EXPECT_EQ(42, second->foo());
-
-    EXPECT_TRUE(first.has_value());
-  }
-
-  {
-    Optional<DeletedMove> first(in_place, 42);
-    Optional<DeletedMove> second(std::move(first));
-
-    EXPECT_TRUE(second.has_value());
-    EXPECT_EQ(42, second->foo());
-
-    EXPECT_TRUE(first.has_value());
-  }
-
-  {
-    Optional<NonTriviallyDestructibleDeletedCopyConstructor> first(in_place,
-                                                                   42);
-    Optional<NonTriviallyDestructibleDeletedCopyConstructor> second(
-        std::move(first));
-
-    EXPECT_TRUE(second.has_value());
-    EXPECT_EQ(42, second->foo());
-
-    EXPECT_TRUE(first.has_value());
-  }
-}
-
-TEST(OptionalTest, MoveValueConstructor) {
-  {
-    constexpr float value = 0.1f;
-    constexpr Optional<float> o(std::move(value));
-
-    EXPECT_TRUE(o);
-    EXPECT_EQ(0.1f, o.value());
-  }
-
-  {
-    float value = 0.1f;
-    Optional<float> o(std::move(value));
-
-    EXPECT_TRUE(o);
-    EXPECT_EQ(0.1f, o.value());
-  }
-
-  {
-    std::string value("foo");
-    Optional<std::string> o(std::move(value));
-
-    EXPECT_TRUE(o);
-    EXPECT_EQ("foo", o.value());
-  }
-
-  {
-    TestObject value(3, 0.1);
-    Optional<TestObject> o(std::move(value));
-
-    EXPECT_TRUE(o);
-    EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, o->state());
-    EXPECT_EQ(TestObject(3, 0.1), o.value());
-  }
-}
-
-TEST(OptionalTest, ConvertingCopyConstructor) {
-  {
-    Optional<int> first(1);
-    Optional<double> second(first);
-    EXPECT_TRUE(second.has_value());
-    EXPECT_EQ(1.0, second.value());
-  }
-
-  // Make sure explicit is not marked for convertible case.
-  {
-    Optional<int> o(1);
-    ignore_result<Optional<double>>(o);
-  }
-}
-
-TEST(OptionalTest, ConvertingMoveConstructor) {
-  {
-    Optional<int> first(1);
-    Optional<double> second(std::move(first));
-    EXPECT_TRUE(second.has_value());
-    EXPECT_EQ(1.0, second.value());
-  }
-
-  // Make sure explicit is not marked for convertible case.
-  {
-    Optional<int> o(1);
-    ignore_result<Optional<double>>(std::move(o));
-  }
-
-  {
-    class Test1 {
-     public:
-      explicit Test1(int foo) : foo_(foo) {}
-
-      int foo() const { return foo_; }
-
-     private:
-      int foo_;
-    };
-
-    // Not copyable but convertible from Test1.
-    class Test2 {
-     public:
-      Test2(const Test2&) = delete;
-      explicit Test2(Test1&& other) : bar_(other.foo()) {}
-
-      double bar() const { return bar_; }
-
-     private:
-      double bar_;
-    };
-
-    Optional<Test1> first(in_place, 42);
-    Optional<Test2> second(std::move(first));
-    EXPECT_TRUE(second.has_value());
-    EXPECT_EQ(42.0, second->bar());
-  }
-}
-
-TEST(OptionalTest, ConstructorForwardArguments) {
-  {
-    constexpr Optional<float> a(base::in_place, 0.1f);
-    EXPECT_TRUE(a);
-    EXPECT_EQ(0.1f, a.value());
-  }
-
-  {
-    Optional<float> a(base::in_place, 0.1f);
-    EXPECT_TRUE(a);
-    EXPECT_EQ(0.1f, a.value());
-  }
-
-  {
-    Optional<std::string> a(base::in_place, "foo");
-    EXPECT_TRUE(a);
-    EXPECT_EQ("foo", a.value());
-  }
-
-  {
-    Optional<TestObject> a(base::in_place, 0, 0.1);
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(TestObject(0, 0.1) == a.value());
-  }
-}
-
-TEST(OptionalTest, ConstructorForwardInitListAndArguments) {
-  {
-    Optional<std::vector<int>> opt(in_place, {3, 1});
-    EXPECT_TRUE(opt);
-    EXPECT_THAT(*opt, ElementsAre(3, 1));
-    EXPECT_EQ(2u, opt->size());
-  }
-
-  {
-    Optional<std::vector<int>> opt(in_place, {3, 1}, std::allocator<int>());
-    EXPECT_TRUE(opt);
-    EXPECT_THAT(*opt, ElementsAre(3, 1));
-    EXPECT_EQ(2u, opt->size());
-  }
-}
-
-TEST(OptionalTest, ForwardConstructor) {
-  {
-    Optional<double> a(1);
-    EXPECT_TRUE(a.has_value());
-    EXPECT_EQ(1.0, a.value());
-  }
-
-  // Test that default type of 'U' is value_type.
-  {
-    struct TestData {
-      int a;
-      double b;
-      bool c;
-    };
-
-    Optional<TestData> a({1, 2.0, true});
-    EXPECT_TRUE(a.has_value());
-    EXPECT_EQ(1, a->a);
-    EXPECT_EQ(2.0, a->b);
-    EXPECT_TRUE(a->c);
-  }
-
-  // If T has a constructor with a param Optional<U>, and another ctor with a
-  // param U, then T(Optional<U>) should be used for Optional<T>(Optional<U>)
-  // constructor.
-  {
-    enum class ParamType {
-      DEFAULT_CONSTRUCTED,
-      COPY_CONSTRUCTED,
-      MOVE_CONSTRUCTED,
-      INT,
-      IN_PLACE,
-      OPTIONAL_INT,
-    };
-    struct Test {
-      Test() : param_type(ParamType::DEFAULT_CONSTRUCTED) {}
-      Test(const Test& param) : param_type(ParamType::COPY_CONSTRUCTED) {}
-      Test(Test&& param) : param_type(ParamType::MOVE_CONSTRUCTED) {}
-      explicit Test(int param) : param_type(ParamType::INT) {}
-      explicit Test(in_place_t param) : param_type(ParamType::IN_PLACE) {}
-      explicit Test(Optional<int> param)
-          : param_type(ParamType::OPTIONAL_INT) {}
-
-      ParamType param_type;
-    };
-
-    // Overload resolution with copy-conversion constructor.
-    {
-      const Optional<int> arg(in_place, 1);
-      Optional<Test> testee(arg);
-      EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
-    }
-
-    // Overload resolution with move conversion constructor.
-    {
-      Optional<Test> testee(Optional<int>(in_place, 1));
-      EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
-    }
-
-    // Default constructor should be used.
-    {
-      Optional<Test> testee(in_place);
-      EXPECT_EQ(ParamType::DEFAULT_CONSTRUCTED, testee->param_type);
-    }
-  }
-
-  {
-    struct Test {
-      Test(int a) {}  // NOLINT(runtime/explicit)
-    };
-    // If T is convertible from U, it is not marked as explicit.
-    static_assert(std::is_convertible<int, Test>::value,
-                  "Int should be convertible to Test.");
-    ([](Optional<Test> param) {})(1);
-  }
-}
-
-TEST(OptionalTest, NulloptConstructor) {
-  constexpr Optional<int> a(base::nullopt);
-  EXPECT_FALSE(a);
-}
-
-TEST(OptionalTest, AssignValue) {
-  {
-    Optional<float> a;
-    EXPECT_FALSE(a);
-    a = 0.1f;
-    EXPECT_TRUE(a);
-
-    Optional<float> b(0.1f);
-    EXPECT_TRUE(a == b);
-  }
-
-  {
-    Optional<std::string> a;
-    EXPECT_FALSE(a);
-    a = std::string("foo");
-    EXPECT_TRUE(a);
-
-    Optional<std::string> b(std::string("foo"));
-    EXPECT_EQ(a, b);
-  }
-
-  {
-    Optional<TestObject> a;
-    EXPECT_FALSE(!!a);
-    a = TestObject(3, 0.1);
-    EXPECT_TRUE(!!a);
-
-    Optional<TestObject> b(TestObject(3, 0.1));
-    EXPECT_TRUE(a == b);
-  }
-
-  {
-    Optional<TestObject> a = TestObject(4, 1.0);
-    EXPECT_TRUE(!!a);
-    a = TestObject(3, 0.1);
-    EXPECT_TRUE(!!a);
-
-    Optional<TestObject> b(TestObject(3, 0.1));
-    EXPECT_TRUE(a == b);
-  }
-}
-
-TEST(OptionalTest, AssignObject) {
-  {
-    Optional<float> a;
-    Optional<float> b(0.1f);
-    a = b;
-
-    EXPECT_TRUE(a);
-    EXPECT_EQ(a.value(), 0.1f);
-    EXPECT_EQ(a, b);
-  }
-
-  {
-    Optional<std::string> a;
-    Optional<std::string> b("foo");
-    a = b;
-
-    EXPECT_TRUE(a);
-    EXPECT_EQ(a.value(), "foo");
-    EXPECT_EQ(a, b);
-  }
-
-  {
-    Optional<TestObject> a;
-    Optional<TestObject> b(TestObject(3, 0.1));
-    a = b;
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(a.value() == TestObject(3, 0.1));
-    EXPECT_TRUE(a == b);
-  }
-
-  {
-    Optional<TestObject> a(TestObject(4, 1.0));
-    Optional<TestObject> b(TestObject(3, 0.1));
-    a = b;
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(a.value() == TestObject(3, 0.1));
-    EXPECT_TRUE(a == b);
-  }
-
-  {
-    Optional<DeletedMove> a(in_place, 42);
-    Optional<DeletedMove> b;
-    b = a;
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(a->foo(), b->foo());
-  }
-
-  {
-    Optional<DeletedMove> a(in_place, 42);
-    Optional<DeletedMove> b(in_place, 1);
-    b = a;
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(a->foo(), b->foo());
-  }
-
-  // Converting assignment.
-  {
-    Optional<int> a(in_place, 1);
-    Optional<double> b;
-    b = a;
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(1, a.value());
-    EXPECT_EQ(1.0, b.value());
-  }
-
-  {
-    Optional<int> a(in_place, 42);
-    Optional<double> b(in_place, 1);
-    b = a;
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(42, a.value());
-    EXPECT_EQ(42.0, b.value());
-  }
-
-  {
-    Optional<int> a;
-    Optional<double> b(in_place, 1);
-    b = a;
-    EXPECT_FALSE(!!a);
-    EXPECT_FALSE(!!b);
-  }
-}
-
-TEST(OptionalTest, AssignObject_rvalue) {
-  {
-    Optional<float> a;
-    Optional<float> b(0.1f);
-    a = std::move(b);
-
-    EXPECT_TRUE(a);
-    EXPECT_TRUE(b);
-    EXPECT_EQ(0.1f, a.value());
-  }
-
-  {
-    Optional<std::string> a;
-    Optional<std::string> b("foo");
-    a = std::move(b);
-
-    EXPECT_TRUE(a);
-    EXPECT_TRUE(b);
-    EXPECT_EQ("foo", a.value());
-  }
-
-  {
-    Optional<TestObject> a;
-    Optional<TestObject> b(TestObject(3, 0.1));
-    a = std::move(b);
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_TRUE(TestObject(3, 0.1) == a.value());
-
-    EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
-    EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
-  }
-
-  {
-    Optional<TestObject> a(TestObject(4, 1.0));
-    Optional<TestObject> b(TestObject(3, 0.1));
-    a = std::move(b);
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_TRUE(TestObject(3, 0.1) == a.value());
-
-    EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
-    EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
-  }
-
-  {
-    Optional<DeletedMove> a(in_place, 42);
-    Optional<DeletedMove> b;
-    b = std::move(a);
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(42, b->foo());
-  }
-
-  {
-    Optional<DeletedMove> a(in_place, 42);
-    Optional<DeletedMove> b(in_place, 1);
-    b = std::move(a);
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(42, b->foo());
-  }
-
-  // Converting assignment.
-  {
-    Optional<int> a(in_place, 1);
-    Optional<double> b;
-    b = std::move(a);
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(1.0, b.value());
-  }
-
-  {
-    Optional<int> a(in_place, 42);
-    Optional<double> b(in_place, 1);
-    b = std::move(a);
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(42.0, b.value());
-  }
-
-  {
-    Optional<int> a;
-    Optional<double> b(in_place, 1);
-    b = std::move(a);
-
-    EXPECT_FALSE(!!a);
-    EXPECT_FALSE(!!b);
-  }
-}
-
-TEST(OptionalTest, AssignNull) {
-  {
-    Optional<float> a(0.1f);
-    Optional<float> b(0.2f);
-    a = base::nullopt;
-    b = base::nullopt;
-    EXPECT_EQ(a, b);
-  }
-
-  {
-    Optional<std::string> a("foo");
-    Optional<std::string> b("bar");
-    a = base::nullopt;
-    b = base::nullopt;
-    EXPECT_EQ(a, b);
-  }
-
-  {
-    Optional<TestObject> a(TestObject(3, 0.1));
-    Optional<TestObject> b(TestObject(4, 1.0));
-    a = base::nullopt;
-    b = base::nullopt;
-    EXPECT_TRUE(a == b);
-  }
-}
-
-TEST(OptionalTest, AssignOverload) {
-  struct Test1 {
-    enum class State {
-      CONSTRUCTED,
-      MOVED,
-    };
-    State state = State::CONSTRUCTED;
-  };
-
-  // Here, Optional<Test2> can be assigned from Optioanl<Test1>.
-  // In case of move, marks MOVED to Test1 instance.
-  struct Test2 {
-    enum class State {
-      DEFAULT_CONSTRUCTED,
-      COPY_CONSTRUCTED_FROM_TEST1,
-      MOVE_CONSTRUCTED_FROM_TEST1,
-      COPY_ASSIGNED_FROM_TEST1,
-      MOVE_ASSIGNED_FROM_TEST1,
-    };
-
-    Test2() = default;
-    explicit Test2(const Test1& test1)
-        : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
-    explicit Test2(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
-      test1.state = Test1::State::MOVED;
-    }
-    Test2& operator=(const Test1& test1) {
-      state = State::COPY_ASSIGNED_FROM_TEST1;
-      return *this;
-    }
-    Test2& operator=(Test1&& test1) {
-      state = State::MOVE_ASSIGNED_FROM_TEST1;
-      test1.state = Test1::State::MOVED;
-      return *this;
-    }
-
-    State state = State::DEFAULT_CONSTRUCTED;
-  };
-
-  {
-    Optional<Test1> a(in_place);
-    Optional<Test2> b;
-
-    b = a;
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
-    EXPECT_EQ(Test2::State::COPY_CONSTRUCTED_FROM_TEST1, b->state);
-  }
-
-  {
-    Optional<Test1> a(in_place);
-    Optional<Test2> b(in_place);
-
-    b = a;
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
-    EXPECT_EQ(Test2::State::COPY_ASSIGNED_FROM_TEST1, b->state);
-  }
-
-  {
-    Optional<Test1> a(in_place);
-    Optional<Test2> b;
-
-    b = std::move(a);
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(Test1::State::MOVED, a->state);
-    EXPECT_EQ(Test2::State::MOVE_CONSTRUCTED_FROM_TEST1, b->state);
-  }
-
-  {
-    Optional<Test1> a(in_place);
-    Optional<Test2> b(in_place);
-
-    b = std::move(a);
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(Test1::State::MOVED, a->state);
-    EXPECT_EQ(Test2::State::MOVE_ASSIGNED_FROM_TEST1, b->state);
-  }
-
-  // Similar to Test2, but Test3 also has copy/move ctor and assign operators
-  // from Optional<Test1>, too. In this case, for a = b where a is
-  // Optional<Test3> and b is Optional<Test1>,
-  // Optional<T>::operator=(U&&) where U is Optional<Test1> should be used
-  // rather than Optional<T>::operator=(Optional<U>&&) where U is Test1.
-  struct Test3 {
-    enum class State {
-      DEFAULT_CONSTRUCTED,
-      COPY_CONSTRUCTED_FROM_TEST1,
-      MOVE_CONSTRUCTED_FROM_TEST1,
-      COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1,
-      MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1,
-      COPY_ASSIGNED_FROM_TEST1,
-      MOVE_ASSIGNED_FROM_TEST1,
-      COPY_ASSIGNED_FROM_OPTIONAL_TEST1,
-      MOVE_ASSIGNED_FROM_OPTIONAL_TEST1,
-    };
-
-    Test3() = default;
-    explicit Test3(const Test1& test1)
-        : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
-    explicit Test3(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
-      test1.state = Test1::State::MOVED;
-    }
-    explicit Test3(const Optional<Test1>& test1)
-        : state(State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1) {}
-    explicit Test3(Optional<Test1>&& test1)
-        : state(State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1) {
-      // In the following senarios, given |test1| should always have value.
-      DCHECK(test1.has_value());
-      test1->state = Test1::State::MOVED;
-    }
-    Test3& operator=(const Test1& test1) {
-      state = State::COPY_ASSIGNED_FROM_TEST1;
-      return *this;
-    }
-    Test3& operator=(Test1&& test1) {
-      state = State::MOVE_ASSIGNED_FROM_TEST1;
-      test1.state = Test1::State::MOVED;
-      return *this;
-    }
-    Test3& operator=(const Optional<Test1>& test1) {
-      state = State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1;
-      return *this;
-    }
-    Test3& operator=(Optional<Test1>&& test1) {
-      state = State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1;
-      // In the following senarios, given |test1| should always have value.
-      DCHECK(test1.has_value());
-      test1->state = Test1::State::MOVED;
-      return *this;
-    }
-
-    State state = State::DEFAULT_CONSTRUCTED;
-  };
-
-  {
-    Optional<Test1> a(in_place);
-    Optional<Test3> b;
-
-    b = a;
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
-    EXPECT_EQ(Test3::State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
-  }
-
-  {
-    Optional<Test1> a(in_place);
-    Optional<Test3> b(in_place);
-
-    b = a;
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
-    EXPECT_EQ(Test3::State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
-  }
-
-  {
-    Optional<Test1> a(in_place);
-    Optional<Test3> b;
-
-    b = std::move(a);
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(Test1::State::MOVED, a->state);
-    EXPECT_EQ(Test3::State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
-  }
-
-  {
-    Optional<Test1> a(in_place);
-    Optional<Test3> b(in_place);
-
-    b = std::move(a);
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(!!b);
-    EXPECT_EQ(Test1::State::MOVED, a->state);
-    EXPECT_EQ(Test3::State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
-  }
-}
-
-TEST(OptionalTest, OperatorStar) {
-  {
-    Optional<float> a(0.1f);
-    EXPECT_EQ(a.value(), *a);
-  }
-
-  {
-    Optional<std::string> a("foo");
-    EXPECT_EQ(a.value(), *a);
-  }
-
-  {
-    Optional<TestObject> a(TestObject(3, 0.1));
-    EXPECT_EQ(a.value(), *a);
-  }
-}
-
-TEST(OptionalTest, OperatorStar_rvalue) {
-  EXPECT_EQ(0.1f, *Optional<float>(0.1f));
-  EXPECT_EQ(std::string("foo"), *Optional<std::string>("foo"));
-  EXPECT_TRUE(TestObject(3, 0.1) == *Optional<TestObject>(TestObject(3, 0.1)));
-}
-
-TEST(OptionalTest, OperatorArrow) {
-  Optional<TestObject> a(TestObject(3, 0.1));
-  EXPECT_EQ(a->foo(), 3);
-}
-
-TEST(OptionalTest, Value_rvalue) {
-  EXPECT_EQ(0.1f, Optional<float>(0.1f).value());
-  EXPECT_EQ(std::string("foo"), Optional<std::string>("foo").value());
-  EXPECT_TRUE(TestObject(3, 0.1) ==
-              Optional<TestObject>(TestObject(3, 0.1)).value());
-}
-
-TEST(OptionalTest, ValueOr) {
-  {
-    Optional<float> a;
-    EXPECT_EQ(0.0f, a.value_or(0.0f));
-
-    a = 0.1f;
-    EXPECT_EQ(0.1f, a.value_or(0.0f));
-
-    a = base::nullopt;
-    EXPECT_EQ(0.0f, a.value_or(0.0f));
-  }
-
-  // value_or() can be constexpr.
-  {
-    constexpr Optional<int> a(in_place, 1);
-    constexpr int value = a.value_or(10);
-    EXPECT_EQ(1, value);
-  }
-  {
-    constexpr Optional<int> a;
-    constexpr int value = a.value_or(10);
-    EXPECT_EQ(10, value);
-  }
-
-  {
-    Optional<std::string> a;
-    EXPECT_EQ("bar", a.value_or("bar"));
-
-    a = std::string("foo");
-    EXPECT_EQ(std::string("foo"), a.value_or("bar"));
-
-    a = base::nullopt;
-    EXPECT_EQ(std::string("bar"), a.value_or("bar"));
-  }
-
-  {
-    Optional<TestObject> a;
-    EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
-
-    a = TestObject(3, 0.1);
-    EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
-
-    a = base::nullopt;
-    EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
-  }
-}
-
-TEST(OptionalTest, Swap_bothNoValue) {
-  Optional<TestObject> a, b;
-  a.swap(b);
-
-  EXPECT_FALSE(a);
-  EXPECT_FALSE(b);
-  EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
-  EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
-}
-
-TEST(OptionalTest, Swap_inHasValue) {
-  Optional<TestObject> a(TestObject(1, 0.3));
-  Optional<TestObject> b;
-  a.swap(b);
-
-  EXPECT_FALSE(a);
-
-  EXPECT_TRUE(!!b);
-  EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
-  EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
-}
-
-TEST(OptionalTest, Swap_outHasValue) {
-  Optional<TestObject> a;
-  Optional<TestObject> b(TestObject(1, 0.3));
-  a.swap(b);
-
-  EXPECT_TRUE(!!a);
-  EXPECT_FALSE(!!b);
-  EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
-  EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
-}
-
-TEST(OptionalTest, Swap_bothValue) {
-  Optional<TestObject> a(TestObject(0, 0.1));
-  Optional<TestObject> b(TestObject(1, 0.3));
-  a.swap(b);
-
-  EXPECT_TRUE(!!a);
-  EXPECT_TRUE(!!b);
-  EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
-  EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
-  EXPECT_EQ(TestObject::State::SWAPPED, a->state());
-  EXPECT_EQ(TestObject::State::SWAPPED, b->state());
-}
-
-TEST(OptionalTest, Emplace) {
-  {
-    Optional<float> a(0.1f);
-    EXPECT_EQ(0.3f, a.emplace(0.3f));
-
-    EXPECT_TRUE(a);
-    EXPECT_EQ(0.3f, a.value());
-  }
-
-  {
-    Optional<std::string> a("foo");
-    EXPECT_EQ("bar", a.emplace("bar"));
-
-    EXPECT_TRUE(a);
-    EXPECT_EQ("bar", a.value());
-  }
-
-  {
-    Optional<TestObject> a(TestObject(0, 0.1));
-    EXPECT_EQ(TestObject(1, 0.2), a.emplace(TestObject(1, 0.2)));
-
-    EXPECT_TRUE(!!a);
-    EXPECT_TRUE(TestObject(1, 0.2) == a.value());
-  }
-
-  {
-    Optional<std::vector<int>> a;
-    auto& ref = a.emplace({2, 3});
-    static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
-    EXPECT_TRUE(a);
-    EXPECT_THAT(*a, ElementsAre(2, 3));
-    EXPECT_EQ(&ref, &*a);
-  }
-
-  {
-    Optional<std::vector<int>> a;
-    auto& ref = a.emplace({4, 5}, std::allocator<int>());
-    static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
-    EXPECT_TRUE(a);
-    EXPECT_THAT(*a, ElementsAre(4, 5));
-    EXPECT_EQ(&ref, &*a);
-  }
-}
-
-TEST(OptionalTest, Equals_TwoEmpty) {
-  Optional<int> a;
-  Optional<int> b;
-
-  EXPECT_TRUE(a == b);
-}
-
-TEST(OptionalTest, Equals_TwoEquals) {
-  Optional<int> a(1);
-  Optional<int> b(1);
-
-  EXPECT_TRUE(a == b);
-}
-
-TEST(OptionalTest, Equals_OneEmpty) {
-  Optional<int> a;
-  Optional<int> b(1);
-
-  EXPECT_FALSE(a == b);
-}
-
-TEST(OptionalTest, Equals_TwoDifferent) {
-  Optional<int> a(0);
-  Optional<int> b(1);
-
-  EXPECT_FALSE(a == b);
-}
-
-TEST(OptionalTest, Equals_DifferentType) {
-  Optional<int> a(0);
-  Optional<double> b(0);
-
-  EXPECT_TRUE(a == b);
-}
-
-TEST(OptionalTest, NotEquals_TwoEmpty) {
-  Optional<int> a;
-  Optional<int> b;
-
-  EXPECT_FALSE(a != b);
-}
-
-TEST(OptionalTest, NotEquals_TwoEquals) {
-  Optional<int> a(1);
-  Optional<int> b(1);
-
-  EXPECT_FALSE(a != b);
-}
-
-TEST(OptionalTest, NotEquals_OneEmpty) {
-  Optional<int> a;
-  Optional<int> b(1);
-
-  EXPECT_TRUE(a != b);
-}
-
-TEST(OptionalTest, NotEquals_TwoDifferent) {
-  Optional<int> a(0);
-  Optional<int> b(1);
-
-  EXPECT_TRUE(a != b);
-}
-
-TEST(OptionalTest, NotEquals_DifferentType) {
-  Optional<int> a(0);
-  Optional<double> b(0.0);
-
-  EXPECT_FALSE(a != b);
-}
-
-TEST(OptionalTest, Less_LeftEmpty) {
-  Optional<int> l;
-  Optional<int> r(1);
-
-  EXPECT_TRUE(l < r);
-}
-
-TEST(OptionalTest, Less_RightEmpty) {
-  Optional<int> l(1);
-  Optional<int> r;
-
-  EXPECT_FALSE(l < r);
-}
-
-TEST(OptionalTest, Less_BothEmpty) {
-  Optional<int> l;
-  Optional<int> r;
-
-  EXPECT_FALSE(l < r);
-}
-
-TEST(OptionalTest, Less_BothValues) {
-  {
-    Optional<int> l(1);
-    Optional<int> r(2);
-
-    EXPECT_TRUE(l < r);
-  }
-  {
-    Optional<int> l(2);
-    Optional<int> r(1);
-
-    EXPECT_FALSE(l < r);
-  }
-  {
-    Optional<int> l(1);
-    Optional<int> r(1);
-
-    EXPECT_FALSE(l < r);
-  }
-}
-
-TEST(OptionalTest, Less_DifferentType) {
-  Optional<int> l(1);
-  Optional<double> r(2.0);
-
-  EXPECT_TRUE(l < r);
-}
-
-TEST(OptionalTest, LessEq_LeftEmpty) {
-  Optional<int> l;
-  Optional<int> r(1);
-
-  EXPECT_TRUE(l <= r);
-}
-
-TEST(OptionalTest, LessEq_RightEmpty) {
-  Optional<int> l(1);
-  Optional<int> r;
-
-  EXPECT_FALSE(l <= r);
-}
-
-TEST(OptionalTest, LessEq_BothEmpty) {
-  Optional<int> l;
-  Optional<int> r;
-
-  EXPECT_TRUE(l <= r);
-}
-
-TEST(OptionalTest, LessEq_BothValues) {
-  {
-    Optional<int> l(1);
-    Optional<int> r(2);
-
-    EXPECT_TRUE(l <= r);
-  }
-  {
-    Optional<int> l(2);
-    Optional<int> r(1);
-
-    EXPECT_FALSE(l <= r);
-  }
-  {
-    Optional<int> l(1);
-    Optional<int> r(1);
-
-    EXPECT_TRUE(l <= r);
-  }
-}
-
-TEST(OptionalTest, LessEq_DifferentType) {
-  Optional<int> l(1);
-  Optional<double> r(2.0);
-
-  EXPECT_TRUE(l <= r);
-}
-
-TEST(OptionalTest, Greater_BothEmpty) {
-  Optional<int> l;
-  Optional<int> r;
-
-  EXPECT_FALSE(l > r);
-}
-
-TEST(OptionalTest, Greater_LeftEmpty) {
-  Optional<int> l;
-  Optional<int> r(1);
-
-  EXPECT_FALSE(l > r);
-}
-
-TEST(OptionalTest, Greater_RightEmpty) {
-  Optional<int> l(1);
-  Optional<int> r;
-
-  EXPECT_TRUE(l > r);
-}
-
-TEST(OptionalTest, Greater_BothValue) {
-  {
-    Optional<int> l(1);
-    Optional<int> r(2);
-
-    EXPECT_FALSE(l > r);
-  }
-  {
-    Optional<int> l(2);
-    Optional<int> r(1);
-
-    EXPECT_TRUE(l > r);
-  }
-  {
-    Optional<int> l(1);
-    Optional<int> r(1);
-
-    EXPECT_FALSE(l > r);
-  }
-}
-
-TEST(OptionalTest, Greater_DifferentType) {
-  Optional<int> l(1);
-  Optional<double> r(2.0);
-
-  EXPECT_FALSE(l > r);
-}
-
-TEST(OptionalTest, GreaterEq_BothEmpty) {
-  Optional<int> l;
-  Optional<int> r;
-
-  EXPECT_TRUE(l >= r);
-}
-
-TEST(OptionalTest, GreaterEq_LeftEmpty) {
-  Optional<int> l;
-  Optional<int> r(1);
-
-  EXPECT_FALSE(l >= r);
-}
-
-TEST(OptionalTest, GreaterEq_RightEmpty) {
-  Optional<int> l(1);
-  Optional<int> r;
-
-  EXPECT_TRUE(l >= r);
-}
-
-TEST(OptionalTest, GreaterEq_BothValue) {
-  {
-    Optional<int> l(1);
-    Optional<int> r(2);
-
-    EXPECT_FALSE(l >= r);
-  }
-  {
-    Optional<int> l(2);
-    Optional<int> r(1);
-
-    EXPECT_TRUE(l >= r);
-  }
-  {
-    Optional<int> l(1);
-    Optional<int> r(1);
-
-    EXPECT_TRUE(l >= r);
-  }
-}
-
-TEST(OptionalTest, GreaterEq_DifferentType) {
-  Optional<int> l(1);
-  Optional<double> r(2.0);
-
-  EXPECT_FALSE(l >= r);
-}
-
-TEST(OptionalTest, OptNullEq) {
-  {
-    Optional<int> opt;
-    EXPECT_TRUE(opt == base::nullopt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(opt == base::nullopt);
-  }
-}
-
-TEST(OptionalTest, NullOptEq) {
-  {
-    Optional<int> opt;
-    EXPECT_TRUE(base::nullopt == opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(base::nullopt == opt);
-  }
-}
-
-TEST(OptionalTest, OptNullNotEq) {
-  {
-    Optional<int> opt;
-    EXPECT_FALSE(opt != base::nullopt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(opt != base::nullopt);
-  }
-}
-
-TEST(OptionalTest, NullOptNotEq) {
-  {
-    Optional<int> opt;
-    EXPECT_FALSE(base::nullopt != opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(base::nullopt != opt);
-  }
-}
-
-TEST(OptionalTest, OptNullLower) {
-  {
-    Optional<int> opt;
-    EXPECT_FALSE(opt < base::nullopt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(opt < base::nullopt);
-  }
-}
-
-TEST(OptionalTest, NullOptLower) {
-  {
-    Optional<int> opt;
-    EXPECT_FALSE(base::nullopt < opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(base::nullopt < opt);
-  }
-}
-
-TEST(OptionalTest, OptNullLowerEq) {
-  {
-    Optional<int> opt;
-    EXPECT_TRUE(opt <= base::nullopt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(opt <= base::nullopt);
-  }
-}
-
-TEST(OptionalTest, NullOptLowerEq) {
-  {
-    Optional<int> opt;
-    EXPECT_TRUE(base::nullopt <= opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(base::nullopt <= opt);
-  }
-}
-
-TEST(OptionalTest, OptNullGreater) {
-  {
-    Optional<int> opt;
-    EXPECT_FALSE(opt > base::nullopt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(opt > base::nullopt);
-  }
-}
-
-TEST(OptionalTest, NullOptGreater) {
-  {
-    Optional<int> opt;
-    EXPECT_FALSE(base::nullopt > opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(base::nullopt > opt);
-  }
-}
-
-TEST(OptionalTest, OptNullGreaterEq) {
-  {
-    Optional<int> opt;
-    EXPECT_TRUE(opt >= base::nullopt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(opt >= base::nullopt);
-  }
-}
-
-TEST(OptionalTest, NullOptGreaterEq) {
-  {
-    Optional<int> opt;
-    EXPECT_TRUE(base::nullopt >= opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(base::nullopt >= opt);
-  }
-}
-
-TEST(OptionalTest, ValueEq_Empty) {
-  Optional<int> opt;
-  EXPECT_FALSE(opt == 1);
-}
-
-TEST(OptionalTest, ValueEq_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_FALSE(opt == 1);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(opt == 1);
-  }
-}
-
-TEST(OptionalTest, ValueEq_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_TRUE(opt == 0.0);
-}
-
-TEST(OptionalTest, EqValue_Empty) {
-  Optional<int> opt;
-  EXPECT_FALSE(1 == opt);
-}
-
-TEST(OptionalTest, EqValue_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_FALSE(1 == opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(1 == opt);
-  }
-}
-
-TEST(OptionalTest, EqValue_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_TRUE(0.0 == opt);
-}
-
-TEST(OptionalTest, ValueNotEq_Empty) {
-  Optional<int> opt;
-  EXPECT_TRUE(opt != 1);
-}
-
-TEST(OptionalTest, ValueNotEq_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_TRUE(opt != 1);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(opt != 1);
-  }
-}
-
-TEST(OPtionalTest, ValueNotEq_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_FALSE(opt != 0.0);
-}
-
-TEST(OptionalTest, NotEqValue_Empty) {
-  Optional<int> opt;
-  EXPECT_TRUE(1 != opt);
-}
-
-TEST(OptionalTest, NotEqValue_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_TRUE(1 != opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(1 != opt);
-  }
-}
-
-TEST(OptionalTest, NotEqValue_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_FALSE(0.0 != opt);
-}
-
-TEST(OptionalTest, ValueLess_Empty) {
-  Optional<int> opt;
-  EXPECT_TRUE(opt < 1);
-}
-
-TEST(OptionalTest, ValueLess_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_TRUE(opt < 1);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(opt < 1);
-  }
-  {
-    Optional<int> opt(2);
-    EXPECT_FALSE(opt < 1);
-  }
-}
-
-TEST(OPtionalTest, ValueLess_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_TRUE(opt < 1.0);
-}
-
-TEST(OptionalTest, LessValue_Empty) {
-  Optional<int> opt;
-  EXPECT_FALSE(1 < opt);
-}
-
-TEST(OptionalTest, LessValue_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_FALSE(1 < opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(1 < opt);
-  }
-  {
-    Optional<int> opt(2);
-    EXPECT_TRUE(1 < opt);
-  }
-}
-
-TEST(OptionalTest, LessValue_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_FALSE(0.0 < opt);
-}
-
-TEST(OptionalTest, ValueLessEq_Empty) {
-  Optional<int> opt;
-  EXPECT_TRUE(opt <= 1);
-}
-
-TEST(OptionalTest, ValueLessEq_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_TRUE(opt <= 1);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(opt <= 1);
-  }
-  {
-    Optional<int> opt(2);
-    EXPECT_FALSE(opt <= 1);
-  }
-}
-
-TEST(OptionalTest, ValueLessEq_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_TRUE(opt <= 0.0);
-}
-
-TEST(OptionalTest, LessEqValue_Empty) {
-  Optional<int> opt;
-  EXPECT_FALSE(1 <= opt);
-}
-
-TEST(OptionalTest, LessEqValue_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_FALSE(1 <= opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(1 <= opt);
-  }
-  {
-    Optional<int> opt(2);
-    EXPECT_TRUE(1 <= opt);
-  }
-}
-
-TEST(OptionalTest, LessEqValue_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_TRUE(0.0 <= opt);
-}
-
-TEST(OptionalTest, ValueGreater_Empty) {
-  Optional<int> opt;
-  EXPECT_FALSE(opt > 1);
-}
-
-TEST(OptionalTest, ValueGreater_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_FALSE(opt > 1);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(opt > 1);
-  }
-  {
-    Optional<int> opt(2);
-    EXPECT_TRUE(opt > 1);
-  }
-}
-
-TEST(OptionalTest, ValueGreater_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_FALSE(opt > 0.0);
-}
-
-TEST(OptionalTest, GreaterValue_Empty) {
-  Optional<int> opt;
-  EXPECT_TRUE(1 > opt);
-}
-
-TEST(OptionalTest, GreaterValue_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_TRUE(1 > opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_FALSE(1 > opt);
-  }
-  {
-    Optional<int> opt(2);
-    EXPECT_FALSE(1 > opt);
-  }
-}
-
-TEST(OptionalTest, GreaterValue_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_FALSE(0.0 > opt);
-}
-
-TEST(OptionalTest, ValueGreaterEq_Empty) {
-  Optional<int> opt;
-  EXPECT_FALSE(opt >= 1);
-}
-
-TEST(OptionalTest, ValueGreaterEq_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_FALSE(opt >= 1);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(opt >= 1);
-  }
-  {
-    Optional<int> opt(2);
-    EXPECT_TRUE(opt >= 1);
-  }
-}
-
-TEST(OptionalTest, ValueGreaterEq_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_TRUE(opt <= 0.0);
-}
-
-TEST(OptionalTest, GreaterEqValue_Empty) {
-  Optional<int> opt;
-  EXPECT_TRUE(1 >= opt);
-}
-
-TEST(OptionalTest, GreaterEqValue_NotEmpty) {
-  {
-    Optional<int> opt(0);
-    EXPECT_TRUE(1 >= opt);
-  }
-  {
-    Optional<int> opt(1);
-    EXPECT_TRUE(1 >= opt);
-  }
-  {
-    Optional<int> opt(2);
-    EXPECT_FALSE(1 >= opt);
-  }
-}
-
-TEST(OptionalTest, GreaterEqValue_DifferentType) {
-  Optional<int> opt(0);
-  EXPECT_TRUE(0.0 >= opt);
-}
-
-TEST(OptionalTest, NotEquals) {
-  {
-    Optional<float> a(0.1f);
-    Optional<float> b(0.2f);
-    EXPECT_NE(a, b);
-  }
-
-  {
-    Optional<std::string> a("foo");
-    Optional<std::string> b("bar");
-    EXPECT_NE(a, b);
-  }
-
-  {
-    Optional<int> a(1);
-    Optional<double> b(2);
-    EXPECT_NE(a, b);
-  }
-
-  {
-    Optional<TestObject> a(TestObject(3, 0.1));
-    Optional<TestObject> b(TestObject(4, 1.0));
-    EXPECT_TRUE(a != b);
-  }
-}
-
-TEST(OptionalTest, NotEqualsNull) {
-  {
-    Optional<float> a(0.1f);
-    Optional<float> b(0.1f);
-    b = base::nullopt;
-    EXPECT_NE(a, b);
-  }
-
-  {
-    Optional<std::string> a("foo");
-    Optional<std::string> b("foo");
-    b = base::nullopt;
-    EXPECT_NE(a, b);
-  }
-
-  {
-    Optional<TestObject> a(TestObject(3, 0.1));
-    Optional<TestObject> b(TestObject(3, 0.1));
-    b = base::nullopt;
-    EXPECT_TRUE(a != b);
-  }
-}
-
-TEST(OptionalTest, MakeOptional) {
-  {
-    Optional<float> o = make_optional(32.f);
-    EXPECT_TRUE(o);
-    EXPECT_EQ(32.f, *o);
-
-    float value = 3.f;
-    o = make_optional(std::move(value));
-    EXPECT_TRUE(o);
-    EXPECT_EQ(3.f, *o);
-  }
-
-  {
-    Optional<std::string> o = make_optional(std::string("foo"));
-    EXPECT_TRUE(o);
-    EXPECT_EQ("foo", *o);
-
-    std::string value = "bar";
-    o = make_optional(std::move(value));
-    EXPECT_TRUE(o);
-    EXPECT_EQ(std::string("bar"), *o);
-  }
-
-  {
-    Optional<TestObject> o = make_optional(TestObject(3, 0.1));
-    EXPECT_TRUE(!!o);
-    EXPECT_TRUE(TestObject(3, 0.1) == *o);
-
-    TestObject value = TestObject(0, 0.42);
-    o = make_optional(std::move(value));
-    EXPECT_TRUE(!!o);
-    EXPECT_TRUE(TestObject(0, 0.42) == *o);
-    EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
-    EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
-
-    EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
-              base::make_optional(std::move(value))->state());
-  }
-
-  {
-    struct Test {
-      Test(int a, double b, bool c) : a(a), b(b), c(c) {}
-
-      int a;
-      double b;
-      bool c;
-    };
-
-    Optional<Test> o = make_optional<Test>(1, 2.0, true);
-    EXPECT_TRUE(!!o);
-    EXPECT_EQ(1, o->a);
-    EXPECT_EQ(2.0, o->b);
-    EXPECT_TRUE(o->c);
-  }
-
-  {
-    auto str1 = make_optional<std::string>({'1', '2', '3'});
-    EXPECT_EQ("123", *str1);
-
-    auto str2 =
-        make_optional<std::string>({'a', 'b', 'c'}, std::allocator<char>());
-    EXPECT_EQ("abc", *str2);
-  }
-}
-
-TEST(OptionalTest, NonMemberSwap_bothNoValue) {
-  Optional<TestObject> a, b;
-  base::swap(a, b);
-
-  EXPECT_FALSE(!!a);
-  EXPECT_FALSE(!!b);
-  EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
-  EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
-}
-
-TEST(OptionalTest, NonMemberSwap_inHasValue) {
-  Optional<TestObject> a(TestObject(1, 0.3));
-  Optional<TestObject> b;
-  base::swap(a, b);
-
-  EXPECT_FALSE(!!a);
-  EXPECT_TRUE(!!b);
-  EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
-  EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
-}
-
-TEST(OptionalTest, NonMemberSwap_outHasValue) {
-  Optional<TestObject> a;
-  Optional<TestObject> b(TestObject(1, 0.3));
-  base::swap(a, b);
-
-  EXPECT_TRUE(!!a);
-  EXPECT_FALSE(!!b);
-  EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
-  EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
-}
-
-TEST(OptionalTest, NonMemberSwap_bothValue) {
-  Optional<TestObject> a(TestObject(0, 0.1));
-  Optional<TestObject> b(TestObject(1, 0.3));
-  base::swap(a, b);
-
-  EXPECT_TRUE(!!a);
-  EXPECT_TRUE(!!b);
-  EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
-  EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
-  EXPECT_EQ(TestObject::State::SWAPPED, a->state());
-  EXPECT_EQ(TestObject::State::SWAPPED, b->state());
-}
-
-TEST(OptionalTest, Hash_OptionalReflectsInternal) {
-  {
-    std::hash<int> int_hash;
-    std::hash<Optional<int>> opt_int_hash;
-
-    EXPECT_EQ(int_hash(1), opt_int_hash(Optional<int>(1)));
-  }
-
-  {
-    std::hash<std::string> str_hash;
-    std::hash<Optional<std::string>> opt_str_hash;
-
-    EXPECT_EQ(str_hash(std::string("foobar")),
-              opt_str_hash(Optional<std::string>(std::string("foobar"))));
-  }
-}
-
-TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
-  std::hash<Optional<int>> opt_int_hash;
-  std::hash<Optional<std::string>> opt_str_hash;
-
-  EXPECT_EQ(opt_str_hash(Optional<std::string>()),
-            opt_int_hash(Optional<int>()));
-}
-
-TEST(OptionalTest, Hash_UseInSet) {
-  std::set<Optional<int>> setOptInt;
-
-  EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
-
-  setOptInt.insert(Optional<int>(3));
-  EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
-  EXPECT_NE(setOptInt.end(), setOptInt.find(3));
-}
-
-TEST(OptionalTest, HasValue) {
-  Optional<int> a;
-  EXPECT_FALSE(a.has_value());
-
-  a = 42;
-  EXPECT_TRUE(a.has_value());
-
-  a = nullopt;
-  EXPECT_FALSE(a.has_value());
-
-  a = 0;
-  EXPECT_TRUE(a.has_value());
-
-  a = Optional<int>();
-  EXPECT_FALSE(a.has_value());
-}
-
-TEST(OptionalTest, Reset_int) {
-  Optional<int> a(0);
-  EXPECT_TRUE(a.has_value());
-  EXPECT_EQ(0, a.value());
-
-  a.reset();
-  EXPECT_FALSE(a.has_value());
-  EXPECT_EQ(-1, a.value_or(-1));
-}
-
-TEST(OptionalTest, Reset_Object) {
-  Optional<TestObject> a(TestObject(0, 0.1));
-  EXPECT_TRUE(a.has_value());
-  EXPECT_EQ(TestObject(0, 0.1), a.value());
-
-  a.reset();
-  EXPECT_FALSE(a.has_value());
-  EXPECT_EQ(TestObject(42, 0.0), a.value_or(TestObject(42, 0.0)));
-}
-
-TEST(OptionalTest, Reset_NoOp) {
-  Optional<int> a;
-  EXPECT_FALSE(a.has_value());
-
-  a.reset();
-  EXPECT_FALSE(a.has_value());
-}
-
-TEST(OptionalTest, AssignFromRValue) {
-  Optional<TestObject> a;
-  EXPECT_FALSE(a.has_value());
-
-  TestObject obj;
-  a = std::move(obj);
-  EXPECT_TRUE(a.has_value());
-  EXPECT_EQ(1, a->move_ctors_count());
-}
-
-TEST(OptionalTest, DontCallDefaultCtor) {
-  Optional<DeletedDefaultConstructor> a;
-  EXPECT_FALSE(a.has_value());
-
-  a = base::make_optional<DeletedDefaultConstructor>(42);
-  EXPECT_TRUE(a.has_value());
-  EXPECT_EQ(42, a->foo());
-}
-
-TEST(OptionalTest, DontCallNewMemberFunction) {
-  Optional<DeleteNewOperators> a;
-  EXPECT_FALSE(a.has_value());
-
-  a = DeleteNewOperators();
-  EXPECT_TRUE(a.has_value());
-}
-
-TEST(OptionalTest, Noexcept) {
-  // Trivial copy ctor, non-trivial move ctor, nothrow move assign.
-  struct Test1 {
-    Test1(const Test1&) = default;
-    Test1(Test1&&) {}
-    Test1& operator=(Test1&&) = default;
-  };
-  // Non-trivial copy ctor, trivial move ctor, throw move assign.
-  struct Test2 {
-    Test2(const Test2&) {}
-    Test2(Test2&&) = default;
-    Test2& operator=(Test2&&) { return *this; }
-  };
-  // Trivial copy ctor, non-trivial nothrow move ctor.
-  struct Test3 {
-    Test3(const Test3&) = default;
-    Test3(Test3&&) noexcept {}
-  };
-  // Non-trivial copy ctor, non-trivial nothrow move ctor.
-  struct Test4 {
-    Test4(const Test4&) {}
-    Test4(Test4&&) noexcept {}
-  };
-  // Non-trivial copy ctor, non-trivial move ctor.
-  struct Test5 {
-    Test5(const Test5&) {}
-    Test5(Test5&&) {}
-  };
-
-  static_assert(
-      noexcept(Optional<int>(std::declval<Optional<int>>())),
-      "move constructor for noexcept move-constructible T must be noexcept "
-      "(trivial copy, trivial move)");
-  static_assert(
-      !noexcept(Optional<Test1>(std::declval<Optional<Test1>>())),
-      "move constructor for non-noexcept move-constructible T must not be "
-      "noexcept (trivial copy)");
-  static_assert(
-      noexcept(Optional<Test2>(std::declval<Optional<Test2>>())),
-      "move constructor for noexcept move-constructible T must be noexcept "
-      "(non-trivial copy, trivial move)");
-  static_assert(
-      noexcept(Optional<Test3>(std::declval<Optional<Test3>>())),
-      "move constructor for noexcept move-constructible T must be noexcept "
-      "(trivial copy, non-trivial move)");
-  static_assert(
-      noexcept(Optional<Test4>(std::declval<Optional<Test4>>())),
-      "move constructor for noexcept move-constructible T must be noexcept "
-      "(non-trivial copy, non-trivial move)");
-  static_assert(
-      !noexcept(Optional<Test5>(std::declval<Optional<Test5>>())),
-      "move constructor for non-noexcept move-constructible T must not be "
-      "noexcept (non-trivial copy)");
-
-  static_assert(
-      noexcept(std::declval<Optional<int>>() = std::declval<Optional<int>>()),
-      "move assign for noexcept move-constructible/move-assignable T "
-      "must be noexcept");
-  static_assert(
-      !noexcept(std::declval<Optional<Test1>>() =
-                    std::declval<Optional<Test1>>()),
-      "move assign for non-noexcept move-constructible T must not be noexcept");
-  static_assert(
-      !noexcept(std::declval<Optional<Test2>>() =
-                    std::declval<Optional<Test2>>()),
-      "move assign for non-noexcept move-assignable T must not be noexcept");
-}
-
-}  // namespace base
diff --git a/base/optional_unittest.nc b/base/optional_unittest.nc
deleted file mode 100644
index 62c0196..0000000
--- a/base/optional_unittest.nc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a "No Compile Test" suite.
-// http://dev.chromium.org/developers/testing/no-compile-tests
-
-#include <type_traits>
-
-#include "base/optional.h"
-
-namespace base {
-
-#if defined(NCTEST_EXPLICIT_CONVERTING_COPY_CONSTRUCTOR)  // [r"fatal error: no matching function for call to object of type"]
-
-// Optional<T>(const Optional<U>& arg) constructor is marked explicit if
-// T is not convertible from "const U&".
-void WontCompile() {
-  struct Test {
-    // Declares as explicit so that Test is still constructible from int,
-    // but not convertible.
-    explicit Test(int a) {}
-  };
-
-  static_assert(!std::is_convertible<const int&, Test>::value,
-                "const int& to Test is convertible");
-  const Optional<int> arg(in_place, 1);
-  ([](Optional<Test> param) {})(arg);
-}
-
-#elif defined(NCTEST_EXPLICIT_CONVERTING_MOVE_CONSTRUCTOR)  // [r"fatal error: no matching function for call to object of type"]
-
-// Optional<T>(Optional<U>&& arg) constructor is marked explicit if
-// T is not convertible from "U&&".
-void WontCompile() {
-  struct Test {
-    // Declares as explicit so that Test is still constructible from int,
-    // but not convertible.
-    explicit Test(int a) {}
-  };
-
-  static_assert(!std::is_convertible<int&&, Test>::value,
-                "int&& to Test is convertible");
-  ([](Optional<Test> param) {})(Optional<int>(in_place, 1));
-}
-
-#elif defined(NCTEST_EXPLICIT_VALUE_FORWARD_CONSTRUCTOR)  // [r"fatal error: no matching function for call to object of type"]
-
-// Optional<T>(U&&) constructor is marked explicit if T is not convertible
-// from U&&.
-void WontCompile() {
-  struct Test {
-    // Declares as explicit so that Test is still constructible from int,
-    // but not convertible.
-    explicit Test(int a) {}
-  };
-
-  static_assert(!std::is_convertible<int&&, Test>::value,
-                "int&& to Test is convertible");
-  ([](Optional<Test> param) {})(1);
-}
-
-#endif
-
-}  // namespace base
diff --git a/base/os_compat_android_unittest.cc b/base/os_compat_android_unittest.cc
deleted file mode 100644
index 7fbdc6d..0000000
--- a/base/os_compat_android_unittest.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/os_compat_android.h"
-
-#include "base/files/file_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-typedef testing::Test OsCompatAndroidTest;
-
-// Keep this Unittest DISABLED_ , because it actually creates a directory in the
-// device and it may be source of flakyness. For any changes in the mkdtemp
-// function, you should run this unittest in your local machine to check if it
-// passes.
-TEST_F(OsCompatAndroidTest, DISABLED_TestMkdTemp) {
-  FilePath tmp_dir;
-  EXPECT_TRUE(base::GetTempDir(&tmp_dir));
-
-  // Not six XXXXXX at the suffix of the path.
-  FilePath sub_dir = tmp_dir.Append("XX");
-  std::string sub_dir_string = sub_dir.value();
-  // this should be OK since mkdtemp just replaces characters in place
-  char* buffer = const_cast<char*>(sub_dir_string.c_str());
-  EXPECT_EQ(NULL, mkdtemp(buffer));
-
-  // Directory does not exist
-  char invalid_path2[] = "doesntoexist/foobarXXXXXX";
-  EXPECT_EQ(NULL, mkdtemp(invalid_path2));
-
-  // Successfully create a tmp dir.
-  FilePath sub_dir2 = tmp_dir.Append("XXXXXX");
-  std::string sub_dir2_string = sub_dir2.value();
-  // this should be OK since mkdtemp just replaces characters in place
-  char* buffer2 = const_cast<char*>(sub_dir2_string.c_str());
-  EXPECT_TRUE(mkdtemp(buffer2) != NULL);
-}
-
-}  // namespace base
diff --git a/base/path_service_unittest.cc b/base/path_service_unittest.cc
deleted file mode 100644
index 378064a..0000000
--- a/base/path_service_unittest.cc
+++ /dev/null
@@ -1,278 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/path_service.h"
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/strings/string_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest-spi.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
-namespace base {
-
-namespace {
-
-// Returns true if PathService::Get returns true and sets the path parameter
-// to non-empty for the given PathService::DirType enumeration value.
-bool ReturnsValidPath(int dir_type) {
-  FilePath path;
-  bool result = PathService::Get(dir_type, &path);
-
-  // Some paths might not exist on some platforms in which case confirming
-  // |result| is true and !path.empty() is the best we can do.
-  bool check_path_exists = true;
-#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
-  // If chromium has never been started on this account, the cache path may not
-  // exist.
-  if (dir_type == DIR_CACHE)
-    check_path_exists = false;
-#endif
-#if defined(OS_LINUX)
-  // On the linux try-bots: a path is returned (e.g. /home/chrome-bot/Desktop),
-  // but it doesn't exist.
-  if (dir_type == DIR_USER_DESKTOP)
-    check_path_exists = false;
-#endif
-#if defined(OS_IOS)
-  // Bundled unittests on iOS may not have Resources directory in the bundle.
-  if (dir_type == DIR_ASSETS)
-    check_path_exists = false;
-#endif
-#if defined(OS_MACOSX)
-  if (dir_type != DIR_EXE && dir_type != DIR_MODULE && dir_type != FILE_EXE &&
-      dir_type != FILE_MODULE) {
-    if (path.ReferencesParent())
-      return false;
-  }
-#else
-  if (path.ReferencesParent())
-    return false;
-#endif
-  return result && !path.empty() && (!check_path_exists || PathExists(path));
-}
-
-#if defined(OS_WIN)
-// Function to test any directory keys that are not supported on some versions
-// of Windows. Checks that the function fails and that the returned path is
-// empty.
-bool ReturnsInvalidPath(int dir_type) {
-  FilePath path;
-  bool result = PathService::Get(dir_type, &path);
-  return !result && path.empty();
-}
-#endif
-
-}  // namespace
-
-// On the Mac this winds up using some autoreleased objects, so we need to
-// be a PlatformTest.
-typedef PlatformTest PathServiceTest;
-
-// Test that all PathService::Get calls return a value and a true result
-// in the development environment.  (This test was created because a few
-// later changes to Get broke the semantics of the function and yielded the
-// correct value while returning false.)
-TEST_F(PathServiceTest, Get) {
-  for (int key = PATH_START + 1; key < PATH_END; ++key) {
-#if defined(OS_ANDROID)
-    if (key == FILE_MODULE || key == DIR_USER_DESKTOP ||
-        key == DIR_HOME)
-      continue;  // Android doesn't implement these.
-#elif defined(OS_IOS)
-    if (key == DIR_USER_DESKTOP)
-      continue;  // iOS doesn't implement DIR_USER_DESKTOP.
-#elif defined(OS_FUCHSIA)
-    if (key == DIR_USER_DESKTOP || key == FILE_MODULE || key == DIR_MODULE)
-      continue;  // Fuchsia doesn't implement DIR_USER_DESKTOP, FILE_MODULE and
-                 // DIR_MODULE.
-#endif
-    EXPECT_PRED1(ReturnsValidPath, key);
-  }
-#if defined(OS_WIN)
-  for (int key = PATH_WIN_START + 1; key < PATH_WIN_END; ++key) {
-    bool valid = true;
-    if (key == DIR_APP_SHORTCUTS)
-      valid = base::win::GetVersion() >= base::win::VERSION_WIN8;
-
-    if (valid)
-      EXPECT_TRUE(ReturnsValidPath(key)) << key;
-    else
-      EXPECT_TRUE(ReturnsInvalidPath(key)) << key;
-  }
-#elif defined(OS_MACOSX)
-  for (int key = PATH_MAC_START + 1; key < PATH_MAC_END; ++key) {
-    EXPECT_PRED1(ReturnsValidPath, key);
-  }
-#elif defined(OS_ANDROID)
-  for (int key = PATH_ANDROID_START + 1; key < PATH_ANDROID_END;
-       ++key) {
-    EXPECT_PRED1(ReturnsValidPath, key);
-  }
-#elif defined(OS_POSIX) && !defined(OS_FUCHSIA)
-  for (int key = PATH_POSIX_START + 1; key < PATH_POSIX_END;
-       ++key) {
-    EXPECT_PRED1(ReturnsValidPath, key);
-  }
-#endif
-}
-
-// Test that all versions of the Override function of PathService do what they
-// are supposed to do.
-TEST_F(PathServiceTest, Override) {
-  int my_special_key = 666;
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath fake_cache_dir(temp_dir.GetPath().AppendASCII("cache"));
-  // PathService::Override should always create the path provided if it doesn't
-  // exist.
-  EXPECT_TRUE(PathService::Override(my_special_key, fake_cache_dir));
-  EXPECT_TRUE(PathExists(fake_cache_dir));
-
-  FilePath fake_cache_dir2(temp_dir.GetPath().AppendASCII("cache2"));
-  // PathService::OverrideAndCreateIfNeeded should obey the |create| parameter.
-  PathService::OverrideAndCreateIfNeeded(my_special_key,
-                                         fake_cache_dir2,
-                                         false,
-                                         false);
-  EXPECT_FALSE(PathExists(fake_cache_dir2));
-  EXPECT_TRUE(PathService::OverrideAndCreateIfNeeded(my_special_key,
-                                                     fake_cache_dir2,
-                                                     false,
-                                                     true));
-  EXPECT_TRUE(PathExists(fake_cache_dir2));
-
-#if defined(OS_POSIX)
-  FilePath non_existent(
-      MakeAbsoluteFilePath(temp_dir.GetPath()).AppendASCII("non_existent"));
-  EXPECT_TRUE(non_existent.IsAbsolute());
-  EXPECT_FALSE(PathExists(non_existent));
-#if !defined(OS_ANDROID)
-  // This fails because MakeAbsoluteFilePath fails for non-existent files.
-  // Earlier versions of Bionic libc don't fail for non-existent files, so
-  // skip this check on Android.
-  EXPECT_FALSE(PathService::OverrideAndCreateIfNeeded(my_special_key,
-                                                      non_existent,
-                                                      false,
-                                                      false));
-#endif
-  // This works because indicating that |non_existent| is absolute skips the
-  // internal MakeAbsoluteFilePath call.
-  EXPECT_TRUE(PathService::OverrideAndCreateIfNeeded(my_special_key,
-                                                     non_existent,
-                                                     true,
-                                                     false));
-  // Check that the path has been overridden and no directory was created.
-  EXPECT_FALSE(PathExists(non_existent));
-  FilePath path;
-  EXPECT_TRUE(PathService::Get(my_special_key, &path));
-  EXPECT_EQ(non_existent, path);
-#endif
-}
-
-// Check if multiple overrides can co-exist.
-TEST_F(PathServiceTest, OverrideMultiple) {
-  int my_special_key = 666;
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath fake_cache_dir1(temp_dir.GetPath().AppendASCII("1"));
-  EXPECT_TRUE(PathService::Override(my_special_key, fake_cache_dir1));
-  EXPECT_TRUE(PathExists(fake_cache_dir1));
-  ASSERT_EQ(1, WriteFile(fake_cache_dir1.AppendASCII("t1"), ".", 1));
-
-  FilePath fake_cache_dir2(temp_dir.GetPath().AppendASCII("2"));
-  EXPECT_TRUE(PathService::Override(my_special_key + 1, fake_cache_dir2));
-  EXPECT_TRUE(PathExists(fake_cache_dir2));
-  ASSERT_EQ(1, WriteFile(fake_cache_dir2.AppendASCII("t2"), ".", 1));
-
-  FilePath result;
-  EXPECT_TRUE(PathService::Get(my_special_key, &result));
-  // Override might have changed the path representation but our test file
-  // should be still there.
-  EXPECT_TRUE(PathExists(result.AppendASCII("t1")));
-  EXPECT_TRUE(PathService::Get(my_special_key + 1, &result));
-  EXPECT_TRUE(PathExists(result.AppendASCII("t2")));
-}
-
-TEST_F(PathServiceTest, RemoveOverride) {
-  // Before we start the test we have to call RemoveOverride at least once to
-  // clear any overrides that might have been left from other tests.
-  PathService::RemoveOverride(DIR_TEMP);
-
-  FilePath original_user_data_dir;
-  EXPECT_TRUE(PathService::Get(DIR_TEMP, &original_user_data_dir));
-  EXPECT_FALSE(PathService::RemoveOverride(DIR_TEMP));
-
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  EXPECT_TRUE(PathService::Override(DIR_TEMP, temp_dir.GetPath()));
-  FilePath new_user_data_dir;
-  EXPECT_TRUE(PathService::Get(DIR_TEMP, &new_user_data_dir));
-  EXPECT_NE(original_user_data_dir, new_user_data_dir);
-
-  EXPECT_TRUE(PathService::RemoveOverride(DIR_TEMP));
-  EXPECT_TRUE(PathService::Get(DIR_TEMP, &new_user_data_dir));
-  EXPECT_EQ(original_user_data_dir, new_user_data_dir);
-}
-
-#if defined(OS_WIN)
-TEST_F(PathServiceTest, GetProgramFiles) {
-  FilePath programfiles_dir;
-#if defined(_WIN64)
-  // 64-bit on 64-bit.
-  EXPECT_TRUE(PathService::Get(DIR_PROGRAM_FILES,
-      &programfiles_dir));
-  EXPECT_EQ(programfiles_dir.value(),
-      FILE_PATH_LITERAL("C:\\Program Files"));
-  EXPECT_TRUE(PathService::Get(DIR_PROGRAM_FILESX86,
-      &programfiles_dir));
-  EXPECT_EQ(programfiles_dir.value(),
-      FILE_PATH_LITERAL("C:\\Program Files (x86)"));
-  EXPECT_TRUE(PathService::Get(DIR_PROGRAM_FILES6432,
-      &programfiles_dir));
-  EXPECT_EQ(programfiles_dir.value(),
-      FILE_PATH_LITERAL("C:\\Program Files"));
-#else
-  if (base::win::OSInfo::GetInstance()->wow64_status() ==
-      base::win::OSInfo::WOW64_ENABLED) {
-    // 32-bit on 64-bit.
-    EXPECT_TRUE(PathService::Get(DIR_PROGRAM_FILES,
-        &programfiles_dir));
-    EXPECT_EQ(programfiles_dir.value(),
-        FILE_PATH_LITERAL("C:\\Program Files (x86)"));
-    EXPECT_TRUE(PathService::Get(DIR_PROGRAM_FILESX86,
-        &programfiles_dir));
-    EXPECT_EQ(programfiles_dir.value(),
-        FILE_PATH_LITERAL("C:\\Program Files (x86)"));
-    EXPECT_TRUE(PathService::Get(DIR_PROGRAM_FILES6432,
-        &programfiles_dir));
-    EXPECT_EQ(programfiles_dir.value(),
-        FILE_PATH_LITERAL("C:\\Program Files"));
-  } else {
-    // 32-bit on 32-bit.
-    EXPECT_TRUE(PathService::Get(DIR_PROGRAM_FILES,
-        &programfiles_dir));
-    EXPECT_EQ(programfiles_dir.value(),
-        FILE_PATH_LITERAL("C:\\Program Files"));
-    EXPECT_TRUE(PathService::Get(DIR_PROGRAM_FILESX86,
-        &programfiles_dir));
-    EXPECT_EQ(programfiles_dir.value(),
-        FILE_PATH_LITERAL("C:\\Program Files"));
-    EXPECT_TRUE(PathService::Get(DIR_PROGRAM_FILES6432,
-        &programfiles_dir));
-    EXPECT_EQ(programfiles_dir.value(),
-        FILE_PATH_LITERAL("C:\\Program Files"));
-  }
-#endif
-}
-#endif
-
-}  // namespace base
diff --git a/base/pickle_unittest.cc b/base/pickle_unittest.cc
deleted file mode 100644
index 4563047..0000000
--- a/base/pickle_unittest.cc
+++ /dev/null
@@ -1,573 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/pickle.h"
-
-#include <limits.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-const bool testbool1 = false;
-const bool testbool2 = true;
-const int testint = 2'093'847'192;
-const long testlong = 1'093'847'192;
-const uint16_t testuint16 = 32123;
-const uint32_t testuint32 = 1593847192;
-const int64_t testint64 = -0x7E8CA925'3104BDFCLL;
-const uint64_t testuint64 = 0xCE8CA925'3104BDF7ULL;
-const float testfloat = 3.1415926935f;
-const double testdouble = 2.71828182845904523;
-const std::string teststring("Hello world");  // note non-aligned string length
-const std::wstring testwstring(L"Hello, world");
-const string16 teststring16(ASCIIToUTF16("Hello, world"));
-const char testrawstring[] = "Hello new world"; // Test raw string writing
-// Test raw char16 writing, assumes UTF16 encoding is ANSI for alpha chars.
-const char16 testrawstring16[] = {'A', 'l', 'o', 'h', 'a', 0};
-const char testdata[] = "AAA\0BBB\0";
-const int testdatalen = arraysize(testdata) - 1;
-
-// checks that the results can be read correctly from the Pickle
-void VerifyResult(const Pickle& pickle) {
-  PickleIterator iter(pickle);
-
-  bool outbool;
-  EXPECT_TRUE(iter.ReadBool(&outbool));
-  EXPECT_FALSE(outbool);
-  EXPECT_TRUE(iter.ReadBool(&outbool));
-  EXPECT_TRUE(outbool);
-
-  int outint;
-  EXPECT_TRUE(iter.ReadInt(&outint));
-  EXPECT_EQ(testint, outint);
-
-  long outlong;
-  EXPECT_TRUE(iter.ReadLong(&outlong));
-  EXPECT_EQ(testlong, outlong);
-
-  uint16_t outuint16;
-  EXPECT_TRUE(iter.ReadUInt16(&outuint16));
-  EXPECT_EQ(testuint16, outuint16);
-
-  uint32_t outuint32;
-  EXPECT_TRUE(iter.ReadUInt32(&outuint32));
-  EXPECT_EQ(testuint32, outuint32);
-
-  int64_t outint64;
-  EXPECT_TRUE(iter.ReadInt64(&outint64));
-  EXPECT_EQ(testint64, outint64);
-
-  uint64_t outuint64;
-  EXPECT_TRUE(iter.ReadUInt64(&outuint64));
-  EXPECT_EQ(testuint64, outuint64);
-
-  float outfloat;
-  EXPECT_TRUE(iter.ReadFloat(&outfloat));
-  EXPECT_EQ(testfloat, outfloat);
-
-  double outdouble;
-  EXPECT_TRUE(iter.ReadDouble(&outdouble));
-  EXPECT_EQ(testdouble, outdouble);
-
-  std::string outstring;
-  EXPECT_TRUE(iter.ReadString(&outstring));
-  EXPECT_EQ(teststring, outstring);
-
-  string16 outstring16;
-  EXPECT_TRUE(iter.ReadString16(&outstring16));
-  EXPECT_EQ(teststring16, outstring16);
-
-  StringPiece outstringpiece;
-  EXPECT_TRUE(iter.ReadStringPiece(&outstringpiece));
-  EXPECT_EQ(testrawstring, outstringpiece);
-
-  StringPiece16 outstringpiece16;
-  EXPECT_TRUE(iter.ReadStringPiece16(&outstringpiece16));
-  EXPECT_EQ(testrawstring16, outstringpiece16);
-
-  const char* outdata;
-  int outdatalen;
-  EXPECT_TRUE(iter.ReadData(&outdata, &outdatalen));
-  EXPECT_EQ(testdatalen, outdatalen);
-  EXPECT_EQ(memcmp(testdata, outdata, outdatalen), 0);
-
-  // reads past the end should fail
-  EXPECT_FALSE(iter.ReadInt(&outint));
-}
-
-}  // namespace
-
-TEST(PickleTest, EncodeDecode) {
-  Pickle pickle;
-
-  pickle.WriteBool(testbool1);
-  pickle.WriteBool(testbool2);
-  pickle.WriteInt(testint);
-  pickle.WriteLong(testlong);
-  pickle.WriteUInt16(testuint16);
-  pickle.WriteUInt32(testuint32);
-  pickle.WriteInt64(testint64);
-  pickle.WriteUInt64(testuint64);
-  pickle.WriteFloat(testfloat);
-  pickle.WriteDouble(testdouble);
-  pickle.WriteString(teststring);
-  pickle.WriteString16(teststring16);
-  pickle.WriteString(testrawstring);
-  pickle.WriteString16(testrawstring16);
-  pickle.WriteData(testdata, testdatalen);
-  VerifyResult(pickle);
-
-  // test copy constructor
-  Pickle pickle2(pickle);
-  VerifyResult(pickle2);
-
-  // test operator=
-  Pickle pickle3;
-  pickle3 = pickle;
-  VerifyResult(pickle3);
-}
-
-// Tests that reading/writing a long works correctly when the source process
-// is 64-bit.  We rely on having both 32- and 64-bit trybots to validate both
-// arms of the conditional in this test.
-TEST(PickleTest, LongFrom64Bit) {
-  Pickle pickle;
-  // Under the hood long is always written as a 64-bit value, so simulate a
-  // 64-bit long even on 32-bit architectures by explicitly writing an int64_t.
-  pickle.WriteInt64(testint64);
-
-  PickleIterator iter(pickle);
-  long outlong;
-  if (sizeof(long) < sizeof(int64_t)) {
-    // ReadLong() should return false when the original written value can't be
-    // represented as a long.
-#if GTEST_HAS_DEATH_TEST
-    EXPECT_DEATH(ignore_result(iter.ReadLong(&outlong)), "");
-#endif
-  } else {
-    EXPECT_TRUE(iter.ReadLong(&outlong));
-    EXPECT_EQ(testint64, outlong);
-  }
-}
-
-// Tests that we can handle really small buffers.
-TEST(PickleTest, SmallBuffer) {
-  std::unique_ptr<char[]> buffer(new char[1]);
-
-  // We should not touch the buffer.
-  Pickle pickle(buffer.get(), 1);
-
-  PickleIterator iter(pickle);
-  int data;
-  EXPECT_FALSE(iter.ReadInt(&data));
-}
-
-// Tests that we can handle improper headers.
-TEST(PickleTest, BigSize) {
-  int buffer[] = { 0x56035200, 25, 40, 50 };
-
-  Pickle pickle(reinterpret_cast<char*>(buffer), sizeof(buffer));
-
-  PickleIterator iter(pickle);
-  int data;
-  EXPECT_FALSE(iter.ReadInt(&data));
-}
-
-TEST(PickleTest, UnalignedSize) {
-  int buffer[] = { 10, 25, 40, 50 };
-
-  Pickle pickle(reinterpret_cast<char*>(buffer), sizeof(buffer));
-
-  PickleIterator iter(pickle);
-  int data;
-  EXPECT_FALSE(iter.ReadInt(&data));
-}
-
-TEST(PickleTest, ZeroLenStr) {
-  Pickle pickle;
-  pickle.WriteString(std::string());
-
-  PickleIterator iter(pickle);
-  std::string outstr;
-  EXPECT_TRUE(iter.ReadString(&outstr));
-  EXPECT_EQ("", outstr);
-}
-
-TEST(PickleTest, ZeroLenStr16) {
-  Pickle pickle;
-  pickle.WriteString16(string16());
-
-  PickleIterator iter(pickle);
-  std::string outstr;
-  EXPECT_TRUE(iter.ReadString(&outstr));
-  EXPECT_EQ("", outstr);
-}
-
-TEST(PickleTest, BadLenStr) {
-  Pickle pickle;
-  pickle.WriteInt(-2);
-
-  PickleIterator iter(pickle);
-  std::string outstr;
-  EXPECT_FALSE(iter.ReadString(&outstr));
-}
-
-TEST(PickleTest, BadLenStr16) {
-  Pickle pickle;
-  pickle.WriteInt(-1);
-
-  PickleIterator iter(pickle);
-  string16 outstr;
-  EXPECT_FALSE(iter.ReadString16(&outstr));
-}
-
-TEST(PickleTest, PeekNext) {
-  struct CustomHeader : base::Pickle::Header {
-    int cookies[10];
-  };
-
-  Pickle pickle(sizeof(CustomHeader));
-
-  pickle.WriteString("Goooooooooooogle");
-
-  const char* pickle_data = static_cast<const char*>(pickle.data());
-
-  size_t pickle_size;
-
-  // Data range doesn't contain header
-  EXPECT_FALSE(Pickle::PeekNext(
-      sizeof(CustomHeader),
-      pickle_data,
-      pickle_data + sizeof(CustomHeader) - 1,
-      &pickle_size));
-
-  // Data range contains header
-  EXPECT_TRUE(Pickle::PeekNext(
-      sizeof(CustomHeader),
-      pickle_data,
-      pickle_data + sizeof(CustomHeader),
-      &pickle_size));
-  EXPECT_EQ(pickle_size, pickle.size());
-
-  // Data range contains header and some other data
-  EXPECT_TRUE(Pickle::PeekNext(
-      sizeof(CustomHeader),
-      pickle_data,
-      pickle_data + sizeof(CustomHeader) + 1,
-      &pickle_size));
-  EXPECT_EQ(pickle_size, pickle.size());
-
-  // Data range contains full pickle
-  EXPECT_TRUE(Pickle::PeekNext(
-      sizeof(CustomHeader),
-      pickle_data,
-      pickle_data + pickle.size(),
-      &pickle_size));
-  EXPECT_EQ(pickle_size, pickle.size());
-}
-
-TEST(PickleTest, PeekNextOverflow) {
-  struct CustomHeader : base::Pickle::Header {
-    int cookies[10];
-  };
-
-  CustomHeader header;
-
-  // Check if we can wrap around at all
-  if (sizeof(size_t) > sizeof(header.payload_size))
-    return;
-
-  const char* pickle_data = reinterpret_cast<const char*>(&header);
-
-  size_t pickle_size;
-
-  // Wrapping around is detected and reported as maximum size_t value
-  header.payload_size = static_cast<uint32_t>(
-      1 - static_cast<int32_t>(sizeof(CustomHeader)));
-  EXPECT_TRUE(Pickle::PeekNext(
-      sizeof(CustomHeader),
-      pickle_data,
-      pickle_data + sizeof(CustomHeader),
-      &pickle_size));
-  EXPECT_EQ(pickle_size, std::numeric_limits<size_t>::max());
-
-  // Ridiculous pickle sizes are fine (callers are supposed to
-  // verify them)
-  header.payload_size =
-      std::numeric_limits<uint32_t>::max() / 2 - sizeof(CustomHeader);
-  EXPECT_TRUE(Pickle::PeekNext(
-      sizeof(CustomHeader),
-      pickle_data,
-      pickle_data + sizeof(CustomHeader),
-      &pickle_size));
-  EXPECT_EQ(pickle_size, std::numeric_limits<uint32_t>::max() / 2);
-}
-
-TEST(PickleTest, FindNext) {
-  Pickle pickle;
-  pickle.WriteInt(1);
-  pickle.WriteString("Domo");
-
-  const char* start = reinterpret_cast<const char*>(pickle.data());
-  const char* end = start + pickle.size();
-
-  EXPECT_EQ(end, Pickle::FindNext(pickle.header_size_, start, end));
-  EXPECT_EQ(nullptr, Pickle::FindNext(pickle.header_size_, start, end - 1));
-  EXPECT_EQ(end, Pickle::FindNext(pickle.header_size_, start, end + 1));
-}
-
-TEST(PickleTest, FindNextWithIncompleteHeader) {
-  size_t header_size = sizeof(Pickle::Header);
-  std::unique_ptr<char[]> buffer(new char[header_size - 1]);
-  memset(buffer.get(), 0x1, header_size - 1);
-
-  const char* start = buffer.get();
-  const char* end = start + header_size - 1;
-
-  EXPECT_EQ(nullptr, Pickle::FindNext(header_size, start, end));
-}
-
-#if defined(COMPILER_MSVC)
-#pragma warning(push)
-#pragma warning(disable: 4146)
-#endif
-TEST(PickleTest, FindNextOverflow) {
-  size_t header_size = sizeof(Pickle::Header);
-  size_t header_size2 = 2 * header_size;
-  size_t payload_received = 100;
-  std::unique_ptr<char[]> buffer(new char[header_size2 + payload_received]);
-  const char* start = buffer.get();
-  Pickle::Header* header = reinterpret_cast<Pickle::Header*>(buffer.get());
-  const char* end = start + header_size2 + payload_received;
-  // It is impossible to construct an overflow test otherwise.
-  if (sizeof(size_t) > sizeof(header->payload_size) ||
-      sizeof(uintptr_t) > sizeof(header->payload_size))
-    return;
-
-  header->payload_size = -(reinterpret_cast<uintptr_t>(start) + header_size2);
-  EXPECT_EQ(nullptr, Pickle::FindNext(header_size2, start, end));
-
-  header->payload_size = -header_size2;
-  EXPECT_EQ(nullptr, Pickle::FindNext(header_size2, start, end));
-
-  header->payload_size = 0;
-  end = start + header_size;
-  EXPECT_EQ(nullptr, Pickle::FindNext(header_size2, start, end));
-}
-#if defined(COMPILER_MSVC)
-#pragma warning(pop)
-#endif
-
-TEST(PickleTest, GetReadPointerAndAdvance) {
-  Pickle pickle;
-
-  PickleIterator iter(pickle);
-  EXPECT_FALSE(iter.GetReadPointerAndAdvance(1));
-
-  pickle.WriteInt(1);
-  pickle.WriteInt(2);
-  int bytes = sizeof(int) * 2;
-
-  EXPECT_TRUE(PickleIterator(pickle).GetReadPointerAndAdvance(0));
-  EXPECT_TRUE(PickleIterator(pickle).GetReadPointerAndAdvance(1));
-  EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(-1));
-  EXPECT_TRUE(PickleIterator(pickle).GetReadPointerAndAdvance(bytes));
-  EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(bytes + 1));
-  EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(INT_MAX));
-  EXPECT_FALSE(PickleIterator(pickle).GetReadPointerAndAdvance(INT_MIN));
-}
-
-TEST(PickleTest, Resize) {
-  size_t unit = Pickle::kPayloadUnit;
-  std::unique_ptr<char[]> data(new char[unit]);
-  char* data_ptr = data.get();
-  for (size_t i = 0; i < unit; i++)
-    data_ptr[i] = 'G';
-
-  // construct a message that will be exactly the size of one payload unit,
-  // note that any data will have a 4-byte header indicating the size
-  const size_t payload_size_after_header = unit - sizeof(uint32_t);
-  Pickle pickle;
-  pickle.WriteData(
-      data_ptr, static_cast<int>(payload_size_after_header - sizeof(uint32_t)));
-  size_t cur_payload = payload_size_after_header;
-
-  // note: we assume 'unit' is a power of 2
-  EXPECT_EQ(unit, pickle.capacity_after_header());
-  EXPECT_EQ(pickle.payload_size(), payload_size_after_header);
-
-  // fill out a full page (noting data header)
-  pickle.WriteData(data_ptr, static_cast<int>(unit - sizeof(uint32_t)));
-  cur_payload += unit;
-  EXPECT_EQ(unit * 2, pickle.capacity_after_header());
-  EXPECT_EQ(cur_payload, pickle.payload_size());
-
-  // one more byte should double the capacity
-  pickle.WriteData(data_ptr, 1);
-  cur_payload += 8;
-  EXPECT_EQ(unit * 4, pickle.capacity_after_header());
-  EXPECT_EQ(cur_payload, pickle.payload_size());
-}
-
-namespace {
-
-struct CustomHeader : Pickle::Header {
-  int blah;
-};
-
-}  // namespace
-
-TEST(PickleTest, HeaderPadding) {
-  const uint32_t kMagic = 0x12345678;
-
-  Pickle pickle(sizeof(CustomHeader));
-  pickle.WriteInt(kMagic);
-
-  // this should not overwrite the 'int' payload
-  pickle.headerT<CustomHeader>()->blah = 10;
-
-  PickleIterator iter(pickle);
-  int result;
-  ASSERT_TRUE(iter.ReadInt(&result));
-
-  EXPECT_EQ(static_cast<uint32_t>(result), kMagic);
-}
-
-TEST(PickleTest, EqualsOperator) {
-  Pickle source;
-  source.WriteInt(1);
-
-  Pickle copy_refs_source_buffer(static_cast<const char*>(source.data()),
-                                 source.size());
-  Pickle copy;
-  copy = copy_refs_source_buffer;
-  ASSERT_EQ(source.size(), copy.size());
-}
-
-TEST(PickleTest, EvilLengths) {
-  Pickle source;
-  std::string str(100000, 'A');
-  source.WriteData(str.c_str(), 100000);
-  // ReadString16 used to have its read buffer length calculation wrong leading
-  // to out-of-bounds reading.
-  PickleIterator iter(source);
-  string16 str16;
-  EXPECT_FALSE(iter.ReadString16(&str16));
-
-  // And check we didn't break ReadString16.
-  str16 = (wchar_t) 'A';
-  Pickle str16_pickle;
-  str16_pickle.WriteString16(str16);
-  iter = PickleIterator(str16_pickle);
-  EXPECT_TRUE(iter.ReadString16(&str16));
-  EXPECT_EQ(1U, str16.length());
-
-  // Check we don't fail in a length check with invalid String16 size.
-  // (1<<31) * sizeof(char16) == 0, so this is particularly evil.
-  Pickle bad_len;
-  bad_len.WriteInt(1 << 31);
-  iter = PickleIterator(bad_len);
-  EXPECT_FALSE(iter.ReadString16(&str16));
-}
-
-// Check we can write zero bytes of data and 'data' can be NULL.
-TEST(PickleTest, ZeroLength) {
-  Pickle pickle;
-  pickle.WriteData(nullptr, 0);
-
-  PickleIterator iter(pickle);
-  const char* outdata;
-  int outdatalen;
-  EXPECT_TRUE(iter.ReadData(&outdata, &outdatalen));
-  EXPECT_EQ(0, outdatalen);
-  // We can't assert that outdata is NULL.
-}
-
-// Check that ReadBytes works properly with an iterator initialized to NULL.
-TEST(PickleTest, ReadBytes) {
-  Pickle pickle;
-  int data = 0x7abcd;
-  pickle.WriteBytes(&data, sizeof(data));
-
-  PickleIterator iter(pickle);
-  const char* outdata_char = nullptr;
-  EXPECT_TRUE(iter.ReadBytes(&outdata_char, sizeof(data)));
-
-  int outdata;
-  memcpy(&outdata, outdata_char, sizeof(outdata));
-  EXPECT_EQ(data, outdata);
-}
-
-// Checks that when a pickle is deep-copied, the result is not larger than
-// needed.
-TEST(PickleTest, DeepCopyResize) {
-  Pickle pickle;
-  while (pickle.capacity_after_header() != pickle.payload_size())
-    pickle.WriteBool(true);
-
-  // Make a deep copy.
-  Pickle pickle2(pickle);
-
-  // Check that there isn't any extraneous capacity.
-  EXPECT_EQ(pickle.capacity_after_header(), pickle2.capacity_after_header());
-}
-
-namespace {
-
-// Publicly exposes the ClaimBytes interface for testing.
-class TestingPickle : public Pickle {
- public:
-  TestingPickle() = default;
-
-  void* ClaimBytes(size_t num_bytes) { return Pickle::ClaimBytes(num_bytes); }
-};
-
-}  // namespace
-
-// Checks that claimed bytes are zero-initialized.
-TEST(PickleTest, ClaimBytesInitialization) {
-  static const int kChunkSize = 64;
-  TestingPickle pickle;
-  const char* bytes = static_cast<const char*>(pickle.ClaimBytes(kChunkSize));
-  for (size_t i = 0; i < kChunkSize; ++i) {
-    EXPECT_EQ(0, bytes[i]);
-  }
-}
-
-// Checks that ClaimBytes properly advances the write offset.
-TEST(PickleTest, ClaimBytes) {
-  std::string data("Hello, world!");
-
-  TestingPickle pickle;
-  pickle.WriteUInt32(data.size());
-  void* bytes = pickle.ClaimBytes(data.size());
-  pickle.WriteInt(42);
-  memcpy(bytes, data.data(), data.size());
-
-  PickleIterator iter(pickle);
-  uint32_t out_data_length;
-  EXPECT_TRUE(iter.ReadUInt32(&out_data_length));
-  EXPECT_EQ(data.size(), out_data_length);
-
-  const char* out_data = nullptr;
-  EXPECT_TRUE(iter.ReadBytes(&out_data, out_data_length));
-  EXPECT_EQ(data, std::string(out_data, out_data_length));
-
-  int out_value;
-  EXPECT_TRUE(iter.ReadInt(&out_value));
-  EXPECT_EQ(42, out_value);
-}
-
-}  // namespace base
diff --git a/base/posix/file_descriptor_shuffle_unittest.cc b/base/posix/file_descriptor_shuffle_unittest.cc
deleted file mode 100644
index 3dfbf7e..0000000
--- a/base/posix/file_descriptor_shuffle_unittest.cc
+++ /dev/null
@@ -1,281 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/posix/file_descriptor_shuffle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-// 'Duplicated' file descriptors start at this number
-const int kDuplicateBase = 1000;
-
-}  // namespace
-
-namespace base {
-
-struct Action {
-  enum Type {
-    CLOSE,
-    MOVE,
-    DUPLICATE,
-  };
-
-  Action(Type in_type, int in_fd1, int in_fd2 = -1)
-      : type(in_type),
-        fd1(in_fd1),
-        fd2(in_fd2) {
-  }
-
-  bool operator==(const Action& other) const {
-    return other.type == type &&
-           other.fd1 == fd1 &&
-           other.fd2 == fd2;
-  }
-
-  Type type;
-  int fd1;
-  int fd2;
-};
-
-class InjectionTracer : public InjectionDelegate {
- public:
-  InjectionTracer()
-      : next_duplicate_(kDuplicateBase) {
-  }
-
-  bool Duplicate(int* result, int fd) override {
-    *result = next_duplicate_++;
-    actions_.push_back(Action(Action::DUPLICATE, *result, fd));
-    return true;
-  }
-
-  bool Move(int src, int dest) override {
-    actions_.push_back(Action(Action::MOVE, src, dest));
-    return true;
-  }
-
-  void Close(int fd) override { actions_.push_back(Action(Action::CLOSE, fd)); }
-
-  const std::vector<Action>& actions() const { return actions_; }
-
- private:
-  int next_duplicate_;
-  std::vector<Action> actions_;
-};
-
-TEST(FileDescriptorShuffleTest, Empty) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  EXPECT_EQ(0u, tracer.actions().size());
-}
-
-TEST(FileDescriptorShuffleTest, Noop) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 0, false));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  EXPECT_EQ(0u, tracer.actions().size());
-}
-
-TEST(FileDescriptorShuffleTest, NoopAndClose) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 0, true));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  EXPECT_EQ(0u, tracer.actions().size());
-}
-
-TEST(FileDescriptorShuffleTest, Simple1) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 1, false));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(1u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1));
-}
-
-TEST(FileDescriptorShuffleTest, Simple2) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 1, false));
-  map.push_back(InjectionArc(2, 3, false));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(2u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1));
-  EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 2, 3));
-}
-
-TEST(FileDescriptorShuffleTest, Simple3) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 1, true));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(2u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1));
-  EXPECT_TRUE(tracer.actions()[1] == Action(Action::CLOSE, 0));
-}
-
-TEST(FileDescriptorShuffleTest, Simple4) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(10, 0, true));
-  map.push_back(InjectionArc(1, 1, true));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(2u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 10, 0));
-  EXPECT_TRUE(tracer.actions()[1] == Action(Action::CLOSE, 10));
-}
-
-TEST(FileDescriptorShuffleTest, Cycle) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 1, false));
-  map.push_back(InjectionArc(1, 0, false));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(4u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] ==
-              Action(Action::DUPLICATE, kDuplicateBase, 1));
-  EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 1));
-  EXPECT_TRUE(tracer.actions()[2] == Action(Action::MOVE, kDuplicateBase, 0));
-  EXPECT_TRUE(tracer.actions()[3] == Action(Action::CLOSE, kDuplicateBase));
-}
-
-TEST(FileDescriptorShuffleTest, CycleAndClose1) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 1, true));
-  map.push_back(InjectionArc(1, 0, false));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(4u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] ==
-              Action(Action::DUPLICATE, kDuplicateBase, 1));
-  EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 1));
-  EXPECT_TRUE(tracer.actions()[2] == Action(Action::MOVE, kDuplicateBase, 0));
-  EXPECT_TRUE(tracer.actions()[3] == Action(Action::CLOSE, kDuplicateBase));
-}
-
-TEST(FileDescriptorShuffleTest, CycleAndClose2) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 1, false));
-  map.push_back(InjectionArc(1, 0, true));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(4u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] ==
-              Action(Action::DUPLICATE, kDuplicateBase, 1));
-  EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 1));
-  EXPECT_TRUE(tracer.actions()[2] == Action(Action::MOVE, kDuplicateBase, 0));
-  EXPECT_TRUE(tracer.actions()[3] == Action(Action::CLOSE, kDuplicateBase));
-}
-
-TEST(FileDescriptorShuffleTest, CycleAndClose3) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 1, true));
-  map.push_back(InjectionArc(1, 0, true));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(4u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] ==
-              Action(Action::DUPLICATE, kDuplicateBase, 1));
-  EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 1));
-  EXPECT_TRUE(tracer.actions()[2] == Action(Action::MOVE, kDuplicateBase, 0));
-  EXPECT_TRUE(tracer.actions()[3] == Action(Action::CLOSE, kDuplicateBase));
-}
-
-TEST(FileDescriptorShuffleTest, Fanout) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 1, false));
-  map.push_back(InjectionArc(0, 2, false));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(2u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1));
-  EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 2));
-}
-
-TEST(FileDescriptorShuffleTest, FanoutAndClose1) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 1, true));
-  map.push_back(InjectionArc(0, 2, false));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(3u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1));
-  EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 2));
-  EXPECT_TRUE(tracer.actions()[2] == Action(Action::CLOSE, 0));
-}
-
-TEST(FileDescriptorShuffleTest, FanoutAndClose2) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 1, false));
-  map.push_back(InjectionArc(0, 2, true));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(3u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1));
-  EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 2));
-  EXPECT_TRUE(tracer.actions()[2] == Action(Action::CLOSE, 0));
-}
-
-TEST(FileDescriptorShuffleTest, FanoutAndClose3) {
-  InjectiveMultimap map;
-  InjectionTracer tracer;
-  map.push_back(InjectionArc(0, 1, true));
-  map.push_back(InjectionArc(0, 2, true));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &tracer));
-  ASSERT_EQ(3u, tracer.actions().size());
-  EXPECT_TRUE(tracer.actions()[0] == Action(Action::MOVE, 0, 1));
-  EXPECT_TRUE(tracer.actions()[1] == Action(Action::MOVE, 0, 2));
-  EXPECT_TRUE(tracer.actions()[2] == Action(Action::CLOSE, 0));
-}
-
-class FailingDelegate : public InjectionDelegate {
- public:
-  bool Duplicate(int* result, int fd) override { return false; }
-
-  bool Move(int src, int dest) override { return false; }
-
-  void Close(int fd) override {}
-};
-
-TEST(FileDescriptorShuffleTest, EmptyWithFailure) {
-  InjectiveMultimap map;
-  FailingDelegate failing;
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &failing));
-}
-
-TEST(FileDescriptorShuffleTest, NoopWithFailure) {
-  InjectiveMultimap map;
-  FailingDelegate failing;
-  map.push_back(InjectionArc(0, 0, false));
-
-  EXPECT_TRUE(PerformInjectiveMultimap(map, &failing));
-}
-
-TEST(FileDescriptorShuffleTest, Simple1WithFailure) {
-  InjectiveMultimap map;
-  FailingDelegate failing;
-  map.push_back(InjectionArc(0, 1, false));
-
-  EXPECT_FALSE(PerformInjectiveMultimap(map, &failing));
-}
-
-}  // namespace base
diff --git a/base/posix/unix_domain_socket_unittest.cc b/base/posix/unix_domain_socket_unittest.cc
deleted file mode 100644
index f626de5..0000000
--- a/base/posix/unix_domain_socket_unittest.cc
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "build_config.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/location.h"
-#include "base/pickle.h"
-#include "base/posix/unix_domain_socket.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-// Callers should use ASSERT_NO_FATAL_FAILURE with this function, to
-// ensure that execution is aborted if the function has assertion failure.
-void CreateSocketPair(int fds[2]) {
-#if defined(OS_MACOSX)
-  // Mac OS does not support SOCK_SEQPACKET.
-  int flags = SOCK_STREAM;
-#else
-  int flags = SOCK_SEQPACKET;
-#endif
-  ASSERT_EQ(0, socketpair(AF_UNIX, flags, 0, fds));
-#if defined(OS_MACOSX)
-  // On OSX an attempt to read or write to a closed socket may generate a
-  // SIGPIPE rather than returning -1, corrected with SO_NOSIGPIPE option.
-  int nosigpipe = 1;
-  ASSERT_EQ(0, setsockopt(fds[0], SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe,
-                          sizeof(nosigpipe)));
-  ASSERT_EQ(0, setsockopt(fds[1], SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe,
-                          sizeof(nosigpipe)));
-#endif
-}
-
-TEST(UnixDomainSocketTest, SendRecvMsgAbortOnReplyFDClose) {
-  Thread message_thread("UnixDomainSocketTest");
-  ASSERT_TRUE(message_thread.Start());
-  int fds[2];
-  ASSERT_NO_FATAL_FAILURE(CreateSocketPair(fds));
-  ScopedFD scoped_fd0(fds[0]);
-  ScopedFD scoped_fd1(fds[1]);
-
-  // Have the thread send a synchronous message via the socket.
-  Pickle request;
-  message_thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(IgnoreResult(&UnixDomainSocket::SendRecvMsg), fds[1],
-                          nullptr, 0U, nullptr, request));
-
-  // Receive the message.
-  std::vector<ScopedFD> message_fds;
-  uint8_t buffer[16];
-  ASSERT_EQ(
-      static_cast<int>(request.size()),
-      UnixDomainSocket::RecvMsg(fds[0], buffer, sizeof(buffer), &message_fds));
-  ASSERT_EQ(1U, message_fds.size());
-
-  // Close the reply FD.
-  message_fds.clear();
-
-  // Check that the thread didn't get blocked.
-  WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  message_thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&event)));
-  ASSERT_TRUE(event.TimedWait(TimeDelta::FromMilliseconds(5000)));
-}
-
-TEST(UnixDomainSocketTest, SendRecvMsgAvoidsSIGPIPE) {
-  // Make sure SIGPIPE isn't being ignored.
-  struct sigaction act = {}, oldact;
-  act.sa_handler = SIG_DFL;
-  ASSERT_EQ(0, sigaction(SIGPIPE, &act, &oldact));
-  int fds[2];
-  ASSERT_NO_FATAL_FAILURE(CreateSocketPair(fds));
-  ScopedFD scoped_fd1(fds[1]);
-  ASSERT_EQ(0, IGNORE_EINTR(close(fds[0])));
-
-  // Have the thread send a synchronous message via the socket. Unless the
-  // message is sent with MSG_NOSIGNAL, this shall result in SIGPIPE.
-  Pickle request;
-  ASSERT_EQ(
-      -1, UnixDomainSocket::SendRecvMsg(fds[1], nullptr, 0U, nullptr, request));
-  ASSERT_EQ(EPIPE, errno);
-  // Restore the SIGPIPE handler.
-  ASSERT_EQ(0, sigaction(SIGPIPE, &oldact, nullptr));
-}
-
-// Simple sanity check within a single process that receiving PIDs works.
-TEST(UnixDomainSocketTest, RecvPid) {
-  int fds[2];
-  ASSERT_NO_FATAL_FAILURE(CreateSocketPair(fds));
-  ScopedFD recv_sock(fds[0]);
-  ScopedFD send_sock(fds[1]);
-
-  ASSERT_TRUE(UnixDomainSocket::EnableReceiveProcessId(recv_sock.get()));
-
-  static const char kHello[] = "hello";
-  ASSERT_TRUE(UnixDomainSocket::SendMsg(send_sock.get(), kHello, sizeof(kHello),
-                                        std::vector<int>()));
-
-  // Extra receiving buffer space to make sure we really received only
-  // sizeof(kHello) bytes and it wasn't just truncated to fit the buffer.
-  char buf[sizeof(kHello) + 1];
-  ProcessId sender_pid;
-  std::vector<ScopedFD> fd_vec;
-  const ssize_t nread = UnixDomainSocket::RecvMsgWithPid(
-      recv_sock.get(), buf, sizeof(buf), &fd_vec, &sender_pid);
-  ASSERT_EQ(sizeof(kHello), static_cast<size_t>(nread));
-  ASSERT_EQ(0, memcmp(buf, kHello, sizeof(kHello)));
-  ASSERT_EQ(0U, fd_vec.size());
-
-  ASSERT_EQ(getpid(), sender_pid);
-}
-
-// Same as above, but send the max number of file descriptors too.
-TEST(UnixDomainSocketTest, RecvPidWithMaxDescriptors) {
-  int fds[2];
-  ASSERT_NO_FATAL_FAILURE(CreateSocketPair(fds));
-  ScopedFD recv_sock(fds[0]);
-  ScopedFD send_sock(fds[1]);
-
-  ASSERT_TRUE(UnixDomainSocket::EnableReceiveProcessId(recv_sock.get()));
-
-  static const char kHello[] = "hello";
-  std::vector<int> send_fds(UnixDomainSocket::kMaxFileDescriptors,
-                            send_sock.get());
-  ASSERT_TRUE(UnixDomainSocket::SendMsg(send_sock.get(), kHello, sizeof(kHello),
-                                        send_fds));
-
-  // Extra receiving buffer space to make sure we really received only
-  // sizeof(kHello) bytes and it wasn't just truncated to fit the buffer.
-  char buf[sizeof(kHello) + 1];
-  ProcessId sender_pid;
-  std::vector<ScopedFD> recv_fds;
-  const ssize_t nread = UnixDomainSocket::RecvMsgWithPid(
-      recv_sock.get(), buf, sizeof(buf), &recv_fds, &sender_pid);
-  ASSERT_EQ(sizeof(kHello), static_cast<size_t>(nread));
-  ASSERT_EQ(0, memcmp(buf, kHello, sizeof(kHello)));
-  ASSERT_EQ(UnixDomainSocket::kMaxFileDescriptors, recv_fds.size());
-
-  ASSERT_EQ(getpid(), sender_pid);
-}
-
-// Check that RecvMsgWithPid doesn't DCHECK fail when reading EOF from a
-// disconnected socket.
-TEST(UnixDomianSocketTest, RecvPidDisconnectedSocket) {
-  int fds[2];
-  ASSERT_NO_FATAL_FAILURE(CreateSocketPair(fds));
-  ScopedFD recv_sock(fds[0]);
-  ScopedFD send_sock(fds[1]);
-
-  ASSERT_TRUE(UnixDomainSocket::EnableReceiveProcessId(recv_sock.get()));
-
-  send_sock.reset();
-
-  char ch;
-  ProcessId sender_pid;
-  std::vector<ScopedFD> recv_fds;
-  const ssize_t nread = UnixDomainSocket::RecvMsgWithPid(
-      recv_sock.get(), &ch, sizeof(ch), &recv_fds, &sender_pid);
-  ASSERT_EQ(0, nread);
-  ASSERT_EQ(-1, sender_pid);
-  ASSERT_EQ(0U, recv_fds.size());
-}
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/power_monitor/power_monitor_unittest.cc b/base/power_monitor/power_monitor_unittest.cc
deleted file mode 100644
index 7f2a84b..0000000
--- a/base/power_monitor/power_monitor_unittest.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/power_monitor/power_monitor.h"
-#include "base/test/power_monitor_test_base.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-class PowerMonitorTest : public testing::Test {
- protected:
-  PowerMonitorTest() {
-    power_monitor_source_ = new PowerMonitorTestSource();
-    power_monitor_.reset(new PowerMonitor(
-        std::unique_ptr<PowerMonitorSource>(power_monitor_source_)));
-  }
-  ~PowerMonitorTest() override = default;
-
-  PowerMonitorTestSource* source() { return power_monitor_source_; }
-  PowerMonitor* monitor() { return power_monitor_.get(); }
-
- private:
-  base::MessageLoop message_loop_;
-  PowerMonitorTestSource* power_monitor_source_;
-  std::unique_ptr<PowerMonitor> power_monitor_;
-
-  DISALLOW_COPY_AND_ASSIGN(PowerMonitorTest);
-};
-
-// PowerMonitorSource is tightly coupled with the PowerMonitor, so this test
-// Will cover both classes
-TEST_F(PowerMonitorTest, PowerNotifications) {
-  const int kObservers = 5;
-
-  PowerMonitorTestObserver observers[kObservers];
-  for (int index = 0; index < kObservers; ++index)
-    monitor()->AddObserver(&observers[index]);
-
-  // Sending resume when not suspended should have no effect.
-  source()->GenerateResumeEvent();
-  EXPECT_EQ(observers[0].resumes(), 0);
-
-  // Pretend we suspended.
-  source()->GenerateSuspendEvent();
-  // Ensure all observers were notified of the event
-  for (int index = 0; index < kObservers; ++index)
-    EXPECT_EQ(observers[index].suspends(), 1);
-
-  // Send a second suspend notification.  This should be suppressed.
-  source()->GenerateSuspendEvent();
-  EXPECT_EQ(observers[0].suspends(), 1);
-
-  // Pretend we were awakened.
-  source()->GenerateResumeEvent();
-  EXPECT_EQ(observers[0].resumes(), 1);
-
-  // Send a duplicate resume notification.  This should be suppressed.
-  source()->GenerateResumeEvent();
-  EXPECT_EQ(observers[0].resumes(), 1);
-
-  // Pretend the device has gone on battery power
-  source()->GeneratePowerStateEvent(true);
-  EXPECT_EQ(observers[0].power_state_changes(), 1);
-  EXPECT_EQ(observers[0].last_power_state(), true);
-
-  // Repeated indications the device is on battery power should be suppressed.
-  source()->GeneratePowerStateEvent(true);
-  EXPECT_EQ(observers[0].power_state_changes(), 1);
-
-  // Pretend the device has gone off battery power
-  source()->GeneratePowerStateEvent(false);
-  EXPECT_EQ(observers[0].power_state_changes(), 2);
-  EXPECT_EQ(observers[0].last_power_state(), false);
-
-  // Repeated indications the device is off battery power should be suppressed.
-  source()->GeneratePowerStateEvent(false);
-  EXPECT_EQ(observers[0].power_state_changes(), 2);
-}
-
-}  // namespace base
diff --git a/base/process/memory_unittest.cc b/base/process/memory_unittest.cc
deleted file mode 100644
index 3a565ee..0000000
--- a/base/process/memory_unittest.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#define _CRT_SECURE_NO_WARNINGS
-
-#include "base/process/memory.h"
-
-#include <stddef.h>
-
-#include <limits>
-
-#include "base/allocator/allocator_check.h"
-#include "base/compiler_specific.h"
-#include "base/debug/alias.h"
-#include "base/memory/aligned_memory.h"
-#include "base/strings/stringprintf.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-#if defined(OS_POSIX)
-#include <errno.h>
-#endif
-#if defined(OS_MACOSX)
-#include <malloc/malloc.h>
-#include "base/allocator/allocator_interception_mac.h"
-#include "base/allocator/allocator_shim.h"
-#include "base/process/memory_unittest_mac.h"
-#endif
-#if defined(OS_LINUX)
-#include <malloc.h>
-#include "base/test/malloc_wrapper.h"
-#endif
-
-#if defined(OS_WIN)
-
-#if defined(COMPILER_MSVC)
-// ssize_t needed for OutOfMemoryTest.
-#if defined(_WIN64)
-typedef __int64 ssize_t;
-#else
-typedef long ssize_t;
-#endif
-#endif
-
-// HeapQueryInformation function pointer.
-typedef BOOL (WINAPI* HeapQueryFn)  \
-    (HANDLE, HEAP_INFORMATION_CLASS, PVOID, SIZE_T, PSIZE_T);
-
-#endif  // defined(OS_WIN)
-
-#if defined(OS_MACOSX)
-
-// For the following Mac tests:
-// Note that base::EnableTerminationOnHeapCorruption() is called as part of
-// test suite setup and does not need to be done again, else mach_override
-// will fail.
-
-TEST(ProcessMemoryTest, MacTerminateOnHeapCorruption) {
-  // Assert that freeing an unallocated pointer will crash the process.
-  char buf[9];
-  asm("" : "=r" (buf));  // Prevent clang from being too smart.
-#if ARCH_CPU_64_BITS
-  // On 64 bit Macs, the malloc system automatically abort()s on heap corruption
-  // but does not output anything.
-  ASSERT_DEATH(free(buf), "");
-#elif defined(ADDRESS_SANITIZER)
-  // AddressSanitizer replaces malloc() and prints a different error message on
-  // heap corruption.
-  ASSERT_DEATH(free(buf), "attempting free on address which "
-      "was not malloc\\(\\)-ed");
-#else
-  ADD_FAILURE() << "This test is not supported in this build configuration.";
-#endif
-}
-
-#endif  // defined(OS_MACOSX)
-
-TEST(MemoryTest, AllocatorShimWorking) {
-#if defined(OS_MACOSX)
-  base::allocator::InterceptAllocationsMac();
-#endif
-  ASSERT_TRUE(base::allocator::IsAllocatorInitialized());
-
-#if defined(OS_MACOSX)
-  base::allocator::UninterceptMallocZonesForTesting();
-#endif
-}
diff --git a/base/process/process_info_unittest.cc b/base/process/process_info_unittest.cc
deleted file mode 100644
index 51b15b9..0000000
--- a/base/process/process_info_unittest.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/process/process_info.h"
-
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-// See https://crbug.com/726484 for Fuchsia.
-// Cannot read boot time on Android O, crbug.com/788870.
-#if !defined(OS_IOS) && !defined(OS_FUCHSIA) && !defined(OS_ANDROID)
-TEST(ProcessInfoTest, CreationTime) {
-  Time creation_time = CurrentProcessInfo::CreationTime();
-  ASSERT_FALSE(creation_time.is_null());
-}
-#endif  // !defined(OS_IOS) && !defined(OS_FUCHSIA) && !defined(OS_ANDROID)
-
-}  // namespace base
diff --git a/base/process/process_metrics_unittest.cc b/base/process/process_metrics_unittest.cc
deleted file mode 100644
index aec7be1..0000000
--- a/base/process/process_metrics_unittest.cc
+++ /dev/null
@@ -1,633 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/process/process_metrics.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/files/file.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/macros.h"
-#include "base/memory/shared_memory.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/sys_info.h"
-#include "base/test/multiprocess_test.h"
-#include "base/threading/thread.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-
-#if defined(OS_MACOSX)
-#include <sys/mman.h>
-#endif
-
-namespace base {
-namespace debug {
-
-#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_WIN)
-namespace {
-
-void BusyWork(std::vector<std::string>* vec) {
-  int64_t test_value = 0;
-  for (int i = 0; i < 100000; ++i) {
-    ++test_value;
-    vec->push_back(Int64ToString(test_value));
-  }
-}
-
-}  // namespace
-#endif  // defined(OS_LINUX) || defined(OS_CHROMEOS)
-
-// Tests for SystemMetrics.
-// Exists as a class so it can be a friend of SystemMetrics.
-class SystemMetricsTest : public testing::Test {
- public:
-  SystemMetricsTest() = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SystemMetricsTest);
-};
-
-#if defined(OS_LINUX) || defined(OS_ANDROID)
-TEST_F(SystemMetricsTest, IsValidDiskName) {
-  const char invalid_input1[] = "";
-  const char invalid_input2[] = "s";
-  const char invalid_input3[] = "sdz+";
-  const char invalid_input4[] = "hda0";
-  const char invalid_input5[] = "mmcbl";
-  const char invalid_input6[] = "mmcblka";
-  const char invalid_input7[] = "mmcblkb";
-  const char invalid_input8[] = "mmmblk0";
-
-  EXPECT_FALSE(IsValidDiskName(invalid_input1));
-  EXPECT_FALSE(IsValidDiskName(invalid_input2));
-  EXPECT_FALSE(IsValidDiskName(invalid_input3));
-  EXPECT_FALSE(IsValidDiskName(invalid_input4));
-  EXPECT_FALSE(IsValidDiskName(invalid_input5));
-  EXPECT_FALSE(IsValidDiskName(invalid_input6));
-  EXPECT_FALSE(IsValidDiskName(invalid_input7));
-  EXPECT_FALSE(IsValidDiskName(invalid_input8));
-
-  const char valid_input1[] = "sda";
-  const char valid_input2[] = "sdaaaa";
-  const char valid_input3[] = "hdz";
-  const char valid_input4[] = "mmcblk0";
-  const char valid_input5[] = "mmcblk999";
-
-  EXPECT_TRUE(IsValidDiskName(valid_input1));
-  EXPECT_TRUE(IsValidDiskName(valid_input2));
-  EXPECT_TRUE(IsValidDiskName(valid_input3));
-  EXPECT_TRUE(IsValidDiskName(valid_input4));
-  EXPECT_TRUE(IsValidDiskName(valid_input5));
-}
-
-TEST_F(SystemMetricsTest, ParseMeminfo) {
-  SystemMemoryInfoKB meminfo;
-  const char invalid_input1[] = "abc";
-  const char invalid_input2[] = "MemTotal:";
-  // Partial file with no MemTotal
-  const char invalid_input3[] =
-      "MemFree:         3913968 kB\n"
-      "Buffers:         2348340 kB\n"
-      "Cached:         49071596 kB\n"
-      "SwapCached:           12 kB\n"
-      "Active:         36393900 kB\n"
-      "Inactive:       21221496 kB\n"
-      "Active(anon):    5674352 kB\n"
-      "Inactive(anon):   633992 kB\n";
-  EXPECT_FALSE(ParseProcMeminfo(invalid_input1, &meminfo));
-  EXPECT_FALSE(ParseProcMeminfo(invalid_input2, &meminfo));
-  EXPECT_FALSE(ParseProcMeminfo(invalid_input3, &meminfo));
-
-  const char valid_input1[] =
-      "MemTotal:        3981504 kB\n"
-      "MemFree:          140764 kB\n"
-      "MemAvailable:     535413 kB\n"
-      "Buffers:          116480 kB\n"
-      "Cached:           406160 kB\n"
-      "SwapCached:        21304 kB\n"
-      "Active:          3152040 kB\n"
-      "Inactive:         472856 kB\n"
-      "Active(anon):    2972352 kB\n"
-      "Inactive(anon):   270108 kB\n"
-      "Active(file):     179688 kB\n"
-      "Inactive(file):   202748 kB\n"
-      "Unevictable:           0 kB\n"
-      "Mlocked:               0 kB\n"
-      "SwapTotal:       5832280 kB\n"
-      "SwapFree:        3672368 kB\n"
-      "Dirty:               184 kB\n"
-      "Writeback:             0 kB\n"
-      "AnonPages:       3101224 kB\n"
-      "Mapped:           142296 kB\n"
-      "Shmem:            140204 kB\n"
-      "Slab:              54212 kB\n"
-      "SReclaimable:      30936 kB\n"
-      "SUnreclaim:        23276 kB\n"
-      "KernelStack:        2464 kB\n"
-      "PageTables:        24812 kB\n"
-      "NFS_Unstable:          0 kB\n"
-      "Bounce:                0 kB\n"
-      "WritebackTmp:          0 kB\n"
-      "CommitLimit:     7823032 kB\n"
-      "Committed_AS:    7973536 kB\n"
-      "VmallocTotal:   34359738367 kB\n"
-      "VmallocUsed:      375940 kB\n"
-      "VmallocChunk:   34359361127 kB\n"
-      "DirectMap4k:       72448 kB\n"
-      "DirectMap2M:     4061184 kB\n";
-  // output from a much older kernel where the Active and Inactive aren't
-  // broken down into anon and file and Huge Pages are enabled
-  const char valid_input2[] =
-      "MemTotal:       255908 kB\n"
-      "MemFree:         69936 kB\n"
-      "Buffers:         15812 kB\n"
-      "Cached:         115124 kB\n"
-      "SwapCached:          0 kB\n"
-      "Active:          92700 kB\n"
-      "Inactive:        63792 kB\n"
-      "HighTotal:           0 kB\n"
-      "HighFree:            0 kB\n"
-      "LowTotal:       255908 kB\n"
-      "LowFree:         69936 kB\n"
-      "SwapTotal:      524280 kB\n"
-      "SwapFree:       524200 kB\n"
-      "Dirty:               4 kB\n"
-      "Writeback:           0 kB\n"
-      "Mapped:          42236 kB\n"
-      "Slab:            25912 kB\n"
-      "Committed_AS:   118680 kB\n"
-      "PageTables:       1236 kB\n"
-      "VmallocTotal:  3874808 kB\n"
-      "VmallocUsed:      1416 kB\n"
-      "VmallocChunk:  3872908 kB\n"
-      "HugePages_Total:     0\n"
-      "HugePages_Free:      0\n"
-      "Hugepagesize:     4096 kB\n";
-
-  EXPECT_TRUE(ParseProcMeminfo(valid_input1, &meminfo));
-  EXPECT_EQ(meminfo.total, 3981504);
-  EXPECT_EQ(meminfo.free, 140764);
-  EXPECT_EQ(meminfo.available, 535413);
-  EXPECT_EQ(meminfo.buffers, 116480);
-  EXPECT_EQ(meminfo.cached, 406160);
-  EXPECT_EQ(meminfo.active_anon, 2972352);
-  EXPECT_EQ(meminfo.active_file, 179688);
-  EXPECT_EQ(meminfo.inactive_anon, 270108);
-  EXPECT_EQ(meminfo.inactive_file, 202748);
-  EXPECT_EQ(meminfo.swap_total, 5832280);
-  EXPECT_EQ(meminfo.swap_free, 3672368);
-  EXPECT_EQ(meminfo.dirty, 184);
-  EXPECT_EQ(meminfo.reclaimable, 30936);
-#if defined(OS_CHROMEOS)
-  EXPECT_EQ(meminfo.shmem, 140204);
-  EXPECT_EQ(meminfo.slab, 54212);
-#endif
-  EXPECT_EQ(355725,
-            base::SysInfo::AmountOfAvailablePhysicalMemory(meminfo) / 1024);
-  // Simulate as if there is no MemAvailable.
-  meminfo.available = 0;
-  EXPECT_EQ(374448,
-            base::SysInfo::AmountOfAvailablePhysicalMemory(meminfo) / 1024);
-  meminfo = {};
-  EXPECT_TRUE(ParseProcMeminfo(valid_input2, &meminfo));
-  EXPECT_EQ(meminfo.total, 255908);
-  EXPECT_EQ(meminfo.free, 69936);
-  EXPECT_EQ(meminfo.available, 0);
-  EXPECT_EQ(meminfo.buffers, 15812);
-  EXPECT_EQ(meminfo.cached, 115124);
-  EXPECT_EQ(meminfo.swap_total, 524280);
-  EXPECT_EQ(meminfo.swap_free, 524200);
-  EXPECT_EQ(meminfo.dirty, 4);
-  EXPECT_EQ(69936,
-            base::SysInfo::AmountOfAvailablePhysicalMemory(meminfo) / 1024);
-}
-
-TEST_F(SystemMetricsTest, ParseVmstat) {
-  VmStatInfo vmstat;
-  // part of vmstat from a 3.2 kernel with numa enabled
-  const char valid_input1[] =
-      "nr_free_pages 905104\n"
-      "nr_inactive_anon 142478"
-      "nr_active_anon 1520046\n"
-      "nr_inactive_file 4481001\n"
-      "nr_active_file 8313439\n"
-      "nr_unevictable 5044\n"
-      "nr_mlock 5044\n"
-      "nr_anon_pages 1633780\n"
-      "nr_mapped 104742\n"
-      "nr_file_pages 12828218\n"
-      "nr_dirty 245\n"
-      "nr_writeback 0\n"
-      "nr_slab_reclaimable 831609\n"
-      "nr_slab_unreclaimable 41164\n"
-      "nr_page_table_pages 31470\n"
-      "nr_kernel_stack 1735\n"
-      "nr_unstable 0\n"
-      "nr_bounce 0\n"
-      "nr_vmscan_write 406\n"
-      "nr_vmscan_immediate_reclaim 281\n"
-      "nr_writeback_temp 0\n"
-      "nr_isolated_anon 0\n"
-      "nr_isolated_file 0\n"
-      "nr_shmem 28820\n"
-      "nr_dirtied 84674644\n"
-      "nr_written 75307109\n"
-      "nr_anon_transparent_hugepages 0\n"
-      "nr_dirty_threshold 1536206\n"
-      "nr_dirty_background_threshold 768103\n"
-      "pgpgin 30777108\n"
-      "pgpgout 319023278\n"
-      "pswpin 179\n"
-      "pswpout 406\n"
-      "pgalloc_dma 0\n"
-      "pgalloc_dma32 20833399\n"
-      "pgalloc_normal 1622609290\n"
-      "pgalloc_movable 0\n"
-      "pgfree 1644355583\n"
-      "pgactivate 75391882\n"
-      "pgdeactivate 4121019\n"
-      "pgfault 2542879679\n"
-      "pgmajfault 487192\n";
-  const char valid_input2[] =
-      "nr_free_pages 180125\n"
-      "nr_inactive_anon 51\n"
-      "nr_active_anon 38832\n"
-      "nr_inactive_file 50171\n"
-      "nr_active_file 47510\n"
-      "nr_unevictable 0\n"
-      "nr_mlock 0\n"
-      "nr_anon_pages 38825\n"
-      "nr_mapped 24043\n"
-      "nr_file_pages 97733\n"
-      "nr_dirty 0\n"
-      "nr_writeback 0\n"
-      "nr_slab_reclaimable 4032\n"
-      "nr_slab_unreclaimable 2848\n"
-      "nr_page_table_pages 1505\n"
-      "nr_kernel_stack 626\n"
-      "nr_unstable 0\n"
-      "nr_bounce 0\n"
-      "nr_vmscan_write 0\n"
-      "nr_vmscan_immediate_reclaim 0\n"
-      "nr_writeback_temp 0\n"
-      "nr_isolated_anon 0\n"
-      "nr_isolated_file 0\n"
-      "nr_shmem 58\n"
-      "nr_dirtied 435358\n"
-      "nr_written 401258\n"
-      "nr_anon_transparent_hugepages 0\n"
-      "nr_dirty_threshold 18566\n"
-      "nr_dirty_background_threshold 4641\n"
-      "pgpgin 299464\n"
-      "pgpgout 2437788\n"
-      "pswpin 12\n"
-      "pswpout 901\n"
-      "pgalloc_normal 144213030\n"
-      "pgalloc_high 164501274\n"
-      "pgalloc_movable 0\n"
-      "pgfree 308894908\n"
-      "pgactivate 239320\n"
-      "pgdeactivate 1\n"
-      "pgfault 716044601\n"
-      "pgmajfault 2023\n"
-      "pgrefill_normal 0\n"
-      "pgrefill_high 0\n"
-      "pgrefill_movable 0\n";
-  EXPECT_TRUE(ParseProcVmstat(valid_input1, &vmstat));
-  EXPECT_EQ(179LU, vmstat.pswpin);
-  EXPECT_EQ(406LU, vmstat.pswpout);
-  EXPECT_EQ(487192LU, vmstat.pgmajfault);
-  EXPECT_TRUE(ParseProcVmstat(valid_input2, &vmstat));
-  EXPECT_EQ(12LU, vmstat.pswpin);
-  EXPECT_EQ(901LU, vmstat.pswpout);
-  EXPECT_EQ(2023LU, vmstat.pgmajfault);
-
-  const char missing_pgmajfault_input[] =
-      "pswpin 12\n"
-      "pswpout 901\n";
-  EXPECT_FALSE(ParseProcVmstat(missing_pgmajfault_input, &vmstat));
-  const char empty_input[] = "";
-  EXPECT_FALSE(ParseProcVmstat(empty_input, &vmstat));
-}
-#endif  // defined(OS_LINUX) || defined(OS_ANDROID)
-
-#if defined(OS_LINUX) || defined(OS_CHROMEOS) || defined(OS_WIN)
-
-// Test that ProcessMetrics::GetPlatformIndependentCPUUsage() doesn't return
-// negative values when the number of threads running on the process decreases
-// between two successive calls to it.
-TEST_F(SystemMetricsTest, TestNoNegativeCpuUsage) {
-  ProcessHandle handle = GetCurrentProcessHandle();
-  std::unique_ptr<ProcessMetrics> metrics(
-      ProcessMetrics::CreateProcessMetrics(handle));
-
-  EXPECT_GE(metrics->GetPlatformIndependentCPUUsage(), 0.0);
-  Thread thread1("thread1");
-  Thread thread2("thread2");
-  Thread thread3("thread3");
-
-  thread1.StartAndWaitForTesting();
-  thread2.StartAndWaitForTesting();
-  thread3.StartAndWaitForTesting();
-
-  ASSERT_TRUE(thread1.IsRunning());
-  ASSERT_TRUE(thread2.IsRunning());
-  ASSERT_TRUE(thread3.IsRunning());
-
-  std::vector<std::string> vec1;
-  std::vector<std::string> vec2;
-  std::vector<std::string> vec3;
-
-  thread1.task_runner()->PostTask(FROM_HERE, BindOnce(&BusyWork, &vec1));
-  thread2.task_runner()->PostTask(FROM_HERE, BindOnce(&BusyWork, &vec2));
-  thread3.task_runner()->PostTask(FROM_HERE, BindOnce(&BusyWork, &vec3));
-
-  TimeDelta prev_cpu_usage = metrics->GetCumulativeCPUUsage();
-  EXPECT_GE(prev_cpu_usage, TimeDelta());
-  EXPECT_GE(metrics->GetPlatformIndependentCPUUsage(), 0.0);
-
-  thread1.Stop();
-  TimeDelta current_cpu_usage = metrics->GetCumulativeCPUUsage();
-  EXPECT_GE(current_cpu_usage, prev_cpu_usage);
-  prev_cpu_usage = current_cpu_usage;
-  EXPECT_GE(metrics->GetPlatformIndependentCPUUsage(), 0.0);
-
-  thread2.Stop();
-  current_cpu_usage = metrics->GetCumulativeCPUUsage();
-  EXPECT_GE(current_cpu_usage, prev_cpu_usage);
-  prev_cpu_usage = current_cpu_usage;
-  EXPECT_GE(metrics->GetPlatformIndependentCPUUsage(), 0.0);
-
-  thread3.Stop();
-  current_cpu_usage = metrics->GetCumulativeCPUUsage();
-  EXPECT_GE(current_cpu_usage, prev_cpu_usage);
-  EXPECT_GE(metrics->GetPlatformIndependentCPUUsage(), 0.0);
-}
-
-#endif  // defined(OS_LINUX) || defined(OS_CHROMEOS)
-
-#if defined(OS_CHROMEOS)
-TEST_F(SystemMetricsTest, ParseZramMmStat) {
-  SwapInfo swapinfo;
-
-  const char invalid_input1[] = "aaa";
-  const char invalid_input2[] = "1 2 3 4 5 6";
-  const char invalid_input3[] = "a 2 3 4 5 6 7";
-  EXPECT_FALSE(ParseZramMmStat(invalid_input1, &swapinfo));
-  EXPECT_FALSE(ParseZramMmStat(invalid_input2, &swapinfo));
-  EXPECT_FALSE(ParseZramMmStat(invalid_input3, &swapinfo));
-
-  const char valid_input1[] =
-      "17715200 5008166 566062  0 1225715712  127 183842";
-  EXPECT_TRUE(ParseZramMmStat(valid_input1, &swapinfo));
-  EXPECT_EQ(17715200ULL, swapinfo.orig_data_size);
-  EXPECT_EQ(5008166ULL, swapinfo.compr_data_size);
-  EXPECT_EQ(566062ULL, swapinfo.mem_used_total);
-}
-
-TEST_F(SystemMetricsTest, ParseZramStat) {
-  SwapInfo swapinfo;
-
-  const char invalid_input1[] = "aaa";
-  const char invalid_input2[] = "1 2 3 4 5 6 7 8 9 10";
-  const char invalid_input3[] = "a 2 3 4 5 6 7 8 9 10 11";
-  EXPECT_FALSE(ParseZramStat(invalid_input1, &swapinfo));
-  EXPECT_FALSE(ParseZramStat(invalid_input2, &swapinfo));
-  EXPECT_FALSE(ParseZramStat(invalid_input3, &swapinfo));
-
-  const char valid_input1[] =
-      "299    0    2392    0    1    0    8    0    0    0    0";
-  EXPECT_TRUE(ParseZramStat(valid_input1, &swapinfo));
-  EXPECT_EQ(299ULL, swapinfo.num_reads);
-  EXPECT_EQ(1ULL, swapinfo.num_writes);
-}
-#endif  // defined(OS_CHROMEOS)
-
-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) || \
-    defined(OS_ANDROID)
-TEST(SystemMetrics2Test, GetSystemMemoryInfo) {
-  SystemMemoryInfoKB info;
-  EXPECT_TRUE(GetSystemMemoryInfo(&info));
-
-  // Ensure each field received a value.
-  EXPECT_GT(info.total, 0);
-#if defined(OS_WIN)
-  EXPECT_GT(info.avail_phys, 0);
-#else
-  EXPECT_GT(info.free, 0);
-#endif
-#if defined(OS_LINUX) || defined(OS_ANDROID)
-  EXPECT_GT(info.buffers, 0);
-  EXPECT_GT(info.cached, 0);
-  EXPECT_GT(info.active_anon, 0);
-  EXPECT_GT(info.inactive_anon, 0);
-  EXPECT_GT(info.active_file, 0);
-  EXPECT_GT(info.inactive_file, 0);
-#endif  // defined(OS_LINUX) || defined(OS_ANDROID)
-
-  // All the values should be less than the total amount of memory.
-#if !defined(OS_WIN) && !defined(OS_IOS)
-  // TODO(crbug.com/711450): re-enable the following assertion on iOS.
-  EXPECT_LT(info.free, info.total);
-#endif
-#if defined(OS_LINUX) || defined(OS_ANDROID)
-  EXPECT_LT(info.buffers, info.total);
-  EXPECT_LT(info.cached, info.total);
-  EXPECT_LT(info.active_anon, info.total);
-  EXPECT_LT(info.inactive_anon, info.total);
-  EXPECT_LT(info.active_file, info.total);
-  EXPECT_LT(info.inactive_file, info.total);
-#endif  // defined(OS_LINUX) || defined(OS_ANDROID)
-
-#if defined(OS_MACOSX) || defined(OS_IOS)
-  EXPECT_GT(info.file_backed, 0);
-#endif
-
-#if defined(OS_CHROMEOS)
-  // Chrome OS exposes shmem.
-  EXPECT_GT(info.shmem, 0);
-  EXPECT_LT(info.shmem, info.total);
-  // Chrome unit tests are not run on actual Chrome OS hardware, so gem_objects
-  // and gem_size cannot be tested here.
-#endif
-}
-#endif  // defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) ||
-        // defined(OS_ANDROID)
-
-#if defined(OS_LINUX) || defined(OS_ANDROID)
-TEST(ProcessMetricsTest, ParseProcStatCPU) {
-  // /proc/self/stat for a process running "top".
-  const char kTopStat[] = "960 (top) S 16230 960 16230 34818 960 "
-      "4202496 471 0 0 0 "
-      "12 16 0 0 "  // <- These are the goods.
-      "20 0 1 0 121946157 15077376 314 18446744073709551615 4194304 "
-      "4246868 140733983044336 18446744073709551615 140244213071219 "
-      "0 0 0 138047495 0 0 0 17 1 0 0 0 0 0";
-  EXPECT_EQ(12 + 16, ParseProcStatCPU(kTopStat));
-
-  // cat /proc/self/stat on a random other machine I have.
-  const char kSelfStat[] = "5364 (cat) R 5354 5364 5354 34819 5364 "
-      "0 142 0 0 0 "
-      "0 0 0 0 "  // <- No CPU, apparently.
-      "16 0 1 0 1676099790 2957312 114 4294967295 134512640 134528148 "
-      "3221224832 3221224344 3086339742 0 0 0 0 0 0 0 17 0 0 0";
-
-  EXPECT_EQ(0, ParseProcStatCPU(kSelfStat));
-
-  // Some weird long-running process with a weird name that I created for the
-  // purposes of this test.
-  const char kWeirdNameStat[] = "26115 (Hello) You ()))  ) R 24614 26115 24614"
-      " 34839 26115 4218880 227 0 0 0 "
-      "5186 11 0 0 "
-      "20 0 1 0 36933953 4296704 90 18446744073709551615 4194304 4196116 "
-      "140735857761568 140735857761160 4195644 0 0 0 0 0 0 0 17 14 0 0 0 0 0 "
-      "6295056 6295616 16519168 140735857770710 140735857770737 "
-      "140735857770737 140735857774557 0";
-  EXPECT_EQ(5186 + 11, ParseProcStatCPU(kWeirdNameStat));
-}
-#endif  // defined(OS_LINUX) || defined(OS_ANDROID)
-
-// Disable on Android because base_unittests runs inside a Dalvik VM that
-// starts and stop threads (crbug.com/175563).
-#if defined(OS_LINUX)
-// http://crbug.com/396455
-TEST(ProcessMetricsTest, DISABLED_GetNumberOfThreads) {
-  const ProcessHandle current = GetCurrentProcessHandle();
-  const int initial_threads = GetNumberOfThreads(current);
-  ASSERT_GT(initial_threads, 0);
-  const int kNumAdditionalThreads = 10;
-  {
-    std::unique_ptr<Thread> my_threads[kNumAdditionalThreads];
-    for (int i = 0; i < kNumAdditionalThreads; ++i) {
-      my_threads[i].reset(new Thread("GetNumberOfThreadsTest"));
-      my_threads[i]->Start();
-      ASSERT_EQ(GetNumberOfThreads(current), initial_threads + 1 + i);
-    }
-  }
-  // The Thread destructor will stop them.
-  ASSERT_EQ(initial_threads, GetNumberOfThreads(current));
-}
-#endif  // defined(OS_LINUX)
-
-#if defined(OS_LINUX)
-namespace {
-
-// Keep these in sync so the GetChildOpenFdCount test can refer to correct test
-// main.
-#define ChildMain ChildFdCount
-#define ChildMainString "ChildFdCount"
-
-// Command line flag name and file name used for synchronization.
-const char kTempDirFlag[] = "temp-dir";
-const char kSignalClosed[] = "closed";
-
-bool SignalEvent(const FilePath& signal_dir, const char* signal_file) {
-  File file(signal_dir.AppendASCII(signal_file),
-            File::FLAG_CREATE | File::FLAG_WRITE);
-  return file.IsValid();
-}
-
-// Check whether an event was signaled.
-bool CheckEvent(const FilePath& signal_dir, const char* signal_file) {
-  File file(signal_dir.AppendASCII(signal_file),
-            File::FLAG_OPEN | File::FLAG_READ);
-  return file.IsValid();
-}
-
-// Busy-wait for an event to be signaled.
-void WaitForEvent(const FilePath& signal_dir, const char* signal_file) {
-  while (!CheckEvent(signal_dir, signal_file))
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(10));
-}
-
-// Subprocess to test the number of open file descriptors.
-MULTIPROCESS_TEST_MAIN(ChildMain) {
-  CommandLine* command_line = CommandLine::ForCurrentProcess();
-  const FilePath temp_path = command_line->GetSwitchValuePath(kTempDirFlag);
-  CHECK(DirectoryExists(temp_path));
-
-  // Try to close all the file descriptors, so the open count goes to 0.
-  for (size_t i = 0; i < 1000; ++i)
-    close(i);
-  CHECK(SignalEvent(temp_path, kSignalClosed));
-
-  // Wait to be terminated.
-  while (true)
-    PlatformThread::Sleep(TimeDelta::FromSeconds(1));
-  return 0;
-}
-
-}  // namespace
-
-TEST(ProcessMetricsTest, GetChildOpenFdCount) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  const FilePath temp_path = temp_dir.GetPath();
-  CommandLine child_command_line(GetMultiProcessTestChildBaseCommandLine());
-  child_command_line.AppendSwitchPath(kTempDirFlag, temp_path);
-  Process child = SpawnMultiProcessTestChild(
-      ChildMainString, child_command_line, LaunchOptions());
-  ASSERT_TRUE(child.IsValid());
-  WaitForEvent(temp_path, kSignalClosed);
-
-  std::unique_ptr<ProcessMetrics> metrics(
-      ProcessMetrics::CreateProcessMetrics(child.Handle()));
-  EXPECT_EQ(0, metrics->GetOpenFdCount());
-  ASSERT_TRUE(child.Terminate(0, true));
-}
-#endif  // defined(OS_LINUX)
-
-#if defined(OS_ANDROID) || defined(OS_LINUX)
-
-TEST(ProcessMetricsTest, GetOpenFdCount) {
-  std::unique_ptr<base::ProcessMetrics> metrics(
-      base::ProcessMetrics::CreateProcessMetrics(
-          base::GetCurrentProcessHandle()));
-  int fd_count = metrics->GetOpenFdCount();
-  EXPECT_GT(fd_count, 0);
-  ScopedFILE file(fopen("/proc/self/statm", "r"));
-  EXPECT_TRUE(file);
-  int new_fd_count = metrics->GetOpenFdCount();
-  EXPECT_GT(new_fd_count, 0);
-  EXPECT_EQ(new_fd_count, fd_count + 1);
-}
-
-TEST(ProcessMetricsTestLinux, GetPageFaultCounts) {
-  std::unique_ptr<base::ProcessMetrics> process_metrics(
-      base::ProcessMetrics::CreateProcessMetrics(
-          base::GetCurrentProcessHandle()));
-
-  PageFaultCounts counts;
-  ASSERT_TRUE(process_metrics->GetPageFaultCounts(&counts));
-  ASSERT_GT(counts.minor, 0);
-  ASSERT_GE(counts.major, 0);
-
-  {
-    // Allocate and touch memory. Touching it is required to make sure that the
-    // page fault count goes up, as memory is typically mapped lazily.
-    const size_t kMappedSize = 4 * (1 << 20);
-    SharedMemory memory;
-    ASSERT_TRUE(memory.CreateAndMapAnonymous(kMappedSize));
-    memset(memory.memory(), 42, kMappedSize);
-    memory.Unmap();
-  }
-
-  PageFaultCounts counts_after;
-  ASSERT_TRUE(process_metrics->GetPageFaultCounts(&counts_after));
-  ASSERT_GT(counts_after.minor, counts.minor);
-  ASSERT_GE(counts_after.major, counts.major);
-}
-#endif  // defined(OS_ANDROID) || defined(OS_LINUX)
-
-}  // namespace debug
-}  // namespace base
diff --git a/base/process/process_unittest.cc b/base/process/process_unittest.cc
deleted file mode 100644
index 0f05d24..0000000
--- a/base/process/process_unittest.cc
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/process/process.h"
-
-#include <utility>
-
-#include "base/at_exit.h"
-#include "base/process/kill.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread_local.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-
-namespace {
-
-#if defined(OS_WIN)
-const int kExpectedStillRunningExitCode = 0x102;
-#else
-const int kExpectedStillRunningExitCode = 0;
-#endif
-
-#if defined(OS_MACOSX)
-// Fake port provider that returns the calling process's
-// task port, ignoring its argument.
-class FakePortProvider : public base::PortProvider {
-  mach_port_t TaskForPid(base::ProcessHandle process) const override {
-    return mach_task_self();
-  }
-};
-#endif
-
-}  // namespace
-
-namespace base {
-
-class ProcessTest : public MultiProcessTest {
-};
-
-TEST_F(ProcessTest, Create) {
-  Process process(SpawnChild("SimpleChildProcess"));
-  ASSERT_TRUE(process.IsValid());
-  ASSERT_FALSE(process.is_current());
-  EXPECT_NE(process.Pid(), kNullProcessId);
-  process.Close();
-  ASSERT_FALSE(process.IsValid());
-}
-
-TEST_F(ProcessTest, CreateCurrent) {
-  Process process = Process::Current();
-  ASSERT_TRUE(process.IsValid());
-  ASSERT_TRUE(process.is_current());
-  EXPECT_NE(process.Pid(), kNullProcessId);
-  process.Close();
-  ASSERT_FALSE(process.IsValid());
-}
-
-TEST_F(ProcessTest, Move) {
-  Process process1(SpawnChild("SimpleChildProcess"));
-  EXPECT_TRUE(process1.IsValid());
-
-  Process process2;
-  EXPECT_FALSE(process2.IsValid());
-
-  process2 = std::move(process1);
-  EXPECT_TRUE(process2.IsValid());
-  EXPECT_FALSE(process1.IsValid());
-  EXPECT_FALSE(process2.is_current());
-
-  Process process3 = Process::Current();
-  process2 = std::move(process3);
-  EXPECT_TRUE(process2.is_current());
-  EXPECT_TRUE(process2.IsValid());
-  EXPECT_FALSE(process3.IsValid());
-}
-
-TEST_F(ProcessTest, Duplicate) {
-  Process process1(SpawnChild("SimpleChildProcess"));
-  ASSERT_TRUE(process1.IsValid());
-
-  Process process2 = process1.Duplicate();
-  ASSERT_TRUE(process1.IsValid());
-  ASSERT_TRUE(process2.IsValid());
-  EXPECT_EQ(process1.Pid(), process2.Pid());
-  EXPECT_FALSE(process1.is_current());
-  EXPECT_FALSE(process2.is_current());
-
-  process1.Close();
-  ASSERT_TRUE(process2.IsValid());
-}
-
-TEST_F(ProcessTest, DuplicateCurrent) {
-  Process process1 = Process::Current();
-  ASSERT_TRUE(process1.IsValid());
-
-  Process process2 = process1.Duplicate();
-  ASSERT_TRUE(process1.IsValid());
-  ASSERT_TRUE(process2.IsValid());
-  EXPECT_EQ(process1.Pid(), process2.Pid());
-  EXPECT_TRUE(process1.is_current());
-  EXPECT_TRUE(process2.is_current());
-
-  process1.Close();
-  ASSERT_TRUE(process2.IsValid());
-}
-
-TEST_F(ProcessTest, DeprecatedGetProcessFromHandle) {
-  Process process1(SpawnChild("SimpleChildProcess"));
-  ASSERT_TRUE(process1.IsValid());
-
-  Process process2 = Process::DeprecatedGetProcessFromHandle(process1.Handle());
-  ASSERT_TRUE(process1.IsValid());
-  ASSERT_TRUE(process2.IsValid());
-  EXPECT_EQ(process1.Pid(), process2.Pid());
-  EXPECT_FALSE(process1.is_current());
-  EXPECT_FALSE(process2.is_current());
-
-  process1.Close();
-  ASSERT_TRUE(process2.IsValid());
-}
-
-MULTIPROCESS_TEST_MAIN(SleepyChildProcess) {
-  PlatformThread::Sleep(TestTimeouts::action_max_timeout());
-  return 0;
-}
-
-TEST_F(ProcessTest, Terminate) {
-  Process process(SpawnChild("SleepyChildProcess"));
-  ASSERT_TRUE(process.IsValid());
-
-  const int kDummyExitCode = 42;
-  int exit_code = kDummyExitCode;
-  EXPECT_EQ(TERMINATION_STATUS_STILL_RUNNING,
-            GetTerminationStatus(process.Handle(), &exit_code));
-  EXPECT_EQ(kExpectedStillRunningExitCode, exit_code);
-
-  exit_code = kDummyExitCode;
-  int kExpectedExitCode = 250;
-  process.Terminate(kExpectedExitCode, false);
-  process.WaitForExitWithTimeout(TestTimeouts::action_max_timeout(),
-                                 &exit_code);
-
-  EXPECT_NE(TERMINATION_STATUS_STILL_RUNNING,
-            GetTerminationStatus(process.Handle(), &exit_code));
-#if !defined(OS_POSIX) && !defined(OS_FUCHSIA)
-  // The POSIX implementation actually ignores the exit_code.
-  EXPECT_EQ(kExpectedExitCode, exit_code);
-#endif
-}
-
-void AtExitHandler(void*) {
-  // At-exit handler should not be called at
-  // Process::TerminateCurrentProcessImmediately.
-  DCHECK(false);
-}
-
-class ThreadLocalObject {
-  ~ThreadLocalObject() {
-    // Thread-local storage should not be destructed at
-    // Process::TerminateCurrentProcessImmediately.
-    DCHECK(false);
-  }
-};
-
-MULTIPROCESS_TEST_MAIN(TerminateCurrentProcessImmediatelyWithCode0) {
-  base::ThreadLocalPointer<ThreadLocalObject> object;
-  base::AtExitManager::RegisterCallback(&AtExitHandler, nullptr);
-  Process::TerminateCurrentProcessImmediately(0);
-}
-
-TEST_F(ProcessTest, TerminateCurrentProcessImmediatelyWithZeroExitCode) {
-  Process process(SpawnChild("TerminateCurrentProcessImmediatelyWithCode0"));
-  ASSERT_TRUE(process.IsValid());
-  int exit_code = 42;
-  ASSERT_TRUE(process.WaitForExitWithTimeout(TestTimeouts::action_max_timeout(),
-                                             &exit_code));
-  EXPECT_EQ(0, exit_code);
-}
-
-MULTIPROCESS_TEST_MAIN(TerminateCurrentProcessImmediatelyWithCode250) {
-  Process::TerminateCurrentProcessImmediately(250);
-}
-
-TEST_F(ProcessTest, TerminateCurrentProcessImmediatelyWithNonZeroExitCode) {
-  Process process(SpawnChild("TerminateCurrentProcessImmediatelyWithCode250"));
-  ASSERT_TRUE(process.IsValid());
-  int exit_code = 42;
-  ASSERT_TRUE(process.WaitForExitWithTimeout(TestTimeouts::action_max_timeout(),
-                                             &exit_code));
-  EXPECT_EQ(250, exit_code);
-}
-
-MULTIPROCESS_TEST_MAIN(FastSleepyChildProcess) {
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout() * 10);
-  return 0;
-}
-
-TEST_F(ProcessTest, WaitForExit) {
-  Process process(SpawnChild("FastSleepyChildProcess"));
-  ASSERT_TRUE(process.IsValid());
-
-  const int kDummyExitCode = 42;
-  int exit_code = kDummyExitCode;
-  EXPECT_TRUE(process.WaitForExit(&exit_code));
-  EXPECT_EQ(0, exit_code);
-}
-
-TEST_F(ProcessTest, WaitForExitWithTimeout) {
-  Process process(SpawnChild("SleepyChildProcess"));
-  ASSERT_TRUE(process.IsValid());
-
-  const int kDummyExitCode = 42;
-  int exit_code = kDummyExitCode;
-  TimeDelta timeout = TestTimeouts::tiny_timeout();
-  EXPECT_FALSE(process.WaitForExitWithTimeout(timeout, &exit_code));
-  EXPECT_EQ(kDummyExitCode, exit_code);
-
-  process.Terminate(kDummyExitCode, false);
-}
-
-// Ensure that the priority of a process is restored correctly after
-// backgrounding and restoring.
-// Note: a platform may not be willing or able to lower the priority of
-// a process. The calls to SetProcessBackground should be noops then.
-TEST_F(ProcessTest, SetProcessBackgrounded) {
-  if (!Process::CanBackgroundProcesses())
-    return;
-  Process process(SpawnChild("SimpleChildProcess"));
-  int old_priority = process.GetPriority();
-#if defined(OS_WIN)
-  EXPECT_TRUE(process.SetProcessBackgrounded(true));
-  EXPECT_TRUE(process.IsProcessBackgrounded());
-  EXPECT_TRUE(process.SetProcessBackgrounded(false));
-  EXPECT_FALSE(process.IsProcessBackgrounded());
-#elif defined(OS_MACOSX)
-  // On the Mac, backgrounding a process requires a port to that process.
-  // In the browser it's available through the MachBroker class, which is not
-  // part of base. Additionally, there is an indefinite amount of time between
-  // spawning a process and receiving its port. Because this test just checks
-  // the ability to background/foreground a process, we can use the current
-  // process's port instead.
-  FakePortProvider provider;
-  EXPECT_TRUE(process.SetProcessBackgrounded(&provider, true));
-  EXPECT_TRUE(process.IsProcessBackgrounded(&provider));
-  EXPECT_TRUE(process.SetProcessBackgrounded(&provider, false));
-  EXPECT_FALSE(process.IsProcessBackgrounded(&provider));
-
-#else
-  process.SetProcessBackgrounded(true);
-  process.SetProcessBackgrounded(false);
-#endif
-  int new_priority = process.GetPriority();
-  EXPECT_EQ(old_priority, new_priority);
-}
-
-// Same as SetProcessBackgrounded but to this very process. It uses
-// a different code path at least for Windows.
-TEST_F(ProcessTest, SetProcessBackgroundedSelf) {
-  if (!Process::CanBackgroundProcesses())
-    return;
-  Process process = Process::Current();
-  int old_priority = process.GetPriority();
-#if defined(OS_WIN)
-  EXPECT_TRUE(process.SetProcessBackgrounded(true));
-  EXPECT_TRUE(process.IsProcessBackgrounded());
-  EXPECT_TRUE(process.SetProcessBackgrounded(false));
-  EXPECT_FALSE(process.IsProcessBackgrounded());
-#elif defined(OS_MACOSX)
-  FakePortProvider provider;
-  EXPECT_TRUE(process.SetProcessBackgrounded(&provider, true));
-  EXPECT_TRUE(process.IsProcessBackgrounded(&provider));
-  EXPECT_TRUE(process.SetProcessBackgrounded(&provider, false));
-  EXPECT_FALSE(process.IsProcessBackgrounded(&provider));
-#else
-  process.SetProcessBackgrounded(true);
-  process.SetProcessBackgrounded(false);
-#endif
-  int new_priority = process.GetPriority();
-  EXPECT_EQ(old_priority, new_priority);
-}
-
-// Consumers can use WaitForExitWithTimeout(base::TimeDelta(), nullptr) to check
-// whether the process is still running. This may not be safe because of the
-// potential reusing of the process id. So we won't export Process::IsRunning()
-// on all platforms. But for the controllable scenario in the test cases, the
-// behavior should be guaranteed.
-TEST_F(ProcessTest, CurrentProcessIsRunning) {
-  EXPECT_FALSE(Process::Current().WaitForExitWithTimeout(
-      base::TimeDelta(), nullptr));
-}
-
-#if defined(OS_MACOSX)
-// On Mac OSX, we can detect whether a non-child process is running.
-TEST_F(ProcessTest, PredefinedProcessIsRunning) {
-  // Process 1 is the /sbin/launchd, it should be always running.
-  EXPECT_FALSE(Process::Open(1).WaitForExitWithTimeout(
-      base::TimeDelta(), nullptr));
-}
-#endif
-
-TEST_F(ProcessTest, ChildProcessIsRunning) {
-  Process process(SpawnChild("SleepyChildProcess"));
-  EXPECT_FALSE(process.WaitForExitWithTimeout(
-      base::TimeDelta(), nullptr));
-  process.Terminate(0, true);
-  EXPECT_TRUE(process.WaitForExitWithTimeout(
-      base::TimeDelta(), nullptr));
-}
-
-#if defined(OS_CHROMEOS)
-
-// Tests that the function IsProcessBackgroundedCGroup() can parse the contents
-// of the /proc/<pid>/cgroup file successfully.
-TEST_F(ProcessTest, TestIsProcessBackgroundedCGroup) {
-  const char kNotBackgrounded[] = "5:cpuacct,cpu,cpuset:/daemons\n";
-  const char kBackgrounded[] =
-      "2:freezer:/chrome_renderers/to_be_frozen\n"
-      "1:cpu:/chrome_renderers/background\n";
-
-  EXPECT_FALSE(IsProcessBackgroundedCGroup(kNotBackgrounded));
-  EXPECT_TRUE(IsProcessBackgroundedCGroup(kBackgrounded));
-}
-
-#endif  // defined(OS_CHROMEOS)
-
-}  // namespace base
diff --git a/base/process/process_util_unittest.cc b/base/process/process_util_unittest.cc
deleted file mode 100644
index 81c31b2..0000000
--- a/base/process/process_util_unittest.cc
+++ /dev/null
@@ -1,1140 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#define _CRT_SECURE_NO_WARNINGS
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-
-#include "base/command_line.h"
-#include "base/debug/alias.h"
-#include "base/debug/stack_trace.h"
-#include "base/files/file_enumerator.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/path_service.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/process/kill.h"
-#include "base/process/launch.h"
-#include "base/process/memory.h"
-#include "base/process/process.h"
-#include "base/process/process_metrics.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-
-#if defined(OS_LINUX)
-#include <malloc.h>
-#include <sched.h>
-#include <sys/syscall.h>
-#endif
-#if defined(OS_POSIX)
-#include <sys/resource.h>
-#endif
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-#include <dlfcn.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <sched.h>
-#include <signal.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <unistd.h>
-#endif
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-#if defined(OS_MACOSX)
-#include <mach/vm_param.h>
-#include <malloc/malloc.h>
-#endif
-#if defined(OS_ANDROID)
-#include "third_party/lss/linux_syscall_support.h"
-#endif
-#if defined(OS_FUCHSIA)
-#include <fdio/limits.h>
-#include <zircon/process.h>
-#include <zircon/processargs.h>
-#include <zircon/syscalls.h>
-#include "base/base_paths_fuchsia.h"
-#endif
-
-namespace base {
-
-namespace {
-
-const char kSignalFileSlow[] = "SlowChildProcess.die";
-const char kSignalFileKill[] = "KilledChildProcess.die";
-const char kTestHelper[] = "test_child_process";
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-const char kSignalFileTerm[] = "TerminatedChildProcess.die";
-#endif
-
-#if defined(OS_FUCHSIA)
-const char kSignalFileClone[] = "ClonedTmpDir.die";
-#endif
-
-#if defined(OS_WIN)
-const int kExpectedStillRunningExitCode = 0x102;
-const int kExpectedKilledExitCode = 1;
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-const int kExpectedStillRunningExitCode = 0;
-#endif
-
-// Sleeps until file filename is created.
-void WaitToDie(const char* filename) {
-  FILE* fp;
-  do {
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(10));
-    fp = fopen(filename, "r");
-  } while (!fp);
-  fclose(fp);
-}
-
-// Signals children they should die now.
-void SignalChildren(const char* filename) {
-  FILE* fp = fopen(filename, "w");
-  fclose(fp);
-}
-
-// Using a pipe to the child to wait for an event was considered, but
-// there were cases in the past where pipes caused problems (other
-// libraries closing the fds, child deadlocking). This is a simple
-// case, so it's not worth the risk.  Using wait loops is discouraged
-// in most instances.
-TerminationStatus WaitForChildTermination(ProcessHandle handle,
-                                          int* exit_code) {
-  // Now we wait until the result is something other than STILL_RUNNING.
-  TerminationStatus status = TERMINATION_STATUS_STILL_RUNNING;
-  const TimeDelta kInterval = TimeDelta::FromMilliseconds(20);
-  TimeDelta waited;
-  do {
-    status = GetTerminationStatus(handle, exit_code);
-    PlatformThread::Sleep(kInterval);
-    waited += kInterval;
-  } while (status == TERMINATION_STATUS_STILL_RUNNING &&
-           waited < TestTimeouts::action_max_timeout());
-
-  return status;
-}
-
-}  // namespace
-
-const int kSuccess = 0;
-
-class ProcessUtilTest : public MultiProcessTest {
- public:
-  void SetUp() override {
-    ASSERT_TRUE(PathService::Get(DIR_ASSETS, &test_helper_path_));
-    test_helper_path_ = test_helper_path_.AppendASCII(kTestHelper);
-  }
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-  // Spawn a child process that counts how many file descriptors are open.
-  int CountOpenFDsInChild();
-#endif
-  // Converts the filename to a platform specific filepath.
-  // On Android files can not be created in arbitrary directories.
-  static std::string GetSignalFilePath(const char* filename);
-
- protected:
-  base::FilePath test_helper_path_;
-};
-
-std::string ProcessUtilTest::GetSignalFilePath(const char* filename) {
-#if defined(OS_ANDROID) || defined(OS_FUCHSIA)
-  FilePath tmp_dir;
-  PathService::Get(DIR_TEMP, &tmp_dir);
-  tmp_dir = tmp_dir.Append(filename);
-  return tmp_dir.value();
-#else
-  return filename;
-#endif
-}
-
-MULTIPROCESS_TEST_MAIN(SimpleChildProcess) {
-  return kSuccess;
-}
-
-// TODO(viettrungluu): This should be in a "MultiProcessTestTest".
-TEST_F(ProcessUtilTest, SpawnChild) {
-  Process process = SpawnChild("SimpleChildProcess");
-  ASSERT_TRUE(process.IsValid());
-  int exit_code;
-  EXPECT_TRUE(process.WaitForExitWithTimeout(TestTimeouts::action_max_timeout(),
-                                             &exit_code));
-}
-
-MULTIPROCESS_TEST_MAIN(SlowChildProcess) {
-  WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileSlow).c_str());
-  return kSuccess;
-}
-
-TEST_F(ProcessUtilTest, KillSlowChild) {
-  const std::string signal_file =
-      ProcessUtilTest::GetSignalFilePath(kSignalFileSlow);
-  remove(signal_file.c_str());
-  Process process = SpawnChild("SlowChildProcess");
-  ASSERT_TRUE(process.IsValid());
-  SignalChildren(signal_file.c_str());
-  int exit_code;
-  EXPECT_TRUE(process.WaitForExitWithTimeout(TestTimeouts::action_max_timeout(),
-                                             &exit_code));
-  remove(signal_file.c_str());
-}
-
-// Times out on Linux and Win, flakes on other platforms, http://crbug.com/95058
-TEST_F(ProcessUtilTest, DISABLED_GetTerminationStatusExit) {
-  const std::string signal_file =
-      ProcessUtilTest::GetSignalFilePath(kSignalFileSlow);
-  remove(signal_file.c_str());
-  Process process = SpawnChild("SlowChildProcess");
-  ASSERT_TRUE(process.IsValid());
-
-  int exit_code = 42;
-  EXPECT_EQ(TERMINATION_STATUS_STILL_RUNNING,
-            GetTerminationStatus(process.Handle(), &exit_code));
-  EXPECT_EQ(kExpectedStillRunningExitCode, exit_code);
-
-  SignalChildren(signal_file.c_str());
-  exit_code = 42;
-  TerminationStatus status =
-      WaitForChildTermination(process.Handle(), &exit_code);
-  EXPECT_EQ(TERMINATION_STATUS_NORMAL_TERMINATION, status);
-  EXPECT_EQ(kSuccess, exit_code);
-  remove(signal_file.c_str());
-}
-
-#if defined(OS_FUCHSIA)
-
-MULTIPROCESS_TEST_MAIN(CheckTmpFileExists) {
-  // Look through the filesystem to ensure that no other directories
-  // besides "tmp" are in the namespace.
-  base::FileEnumerator enumerator(
-      base::FilePath("/"), false,
-      base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES);
-  base::FilePath next_path;
-  while (!(next_path = enumerator.Next()).empty()) {
-    if (next_path != base::FilePath("/tmp")) {
-      LOG(ERROR) << "Clone policy violation: found non-tmp directory "
-                 << next_path.MaybeAsASCII();
-      return 1;
-    }
-  }
-  WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileClone).c_str());
-  return kSuccess;
-}
-
-TEST_F(ProcessUtilTest, SelectivelyClonedDir) {
-  const std::string signal_file =
-      ProcessUtilTest::GetSignalFilePath(kSignalFileClone);
-  remove(signal_file.c_str());
-
-  LaunchOptions options;
-  options.paths_to_map.push_back(base::FilePath("/tmp"));
-  options.clone_flags = LP_CLONE_FDIO_STDIO;
-
-  Process process(SpawnChildWithOptions("CheckTmpFileExists", options));
-  ASSERT_TRUE(process.IsValid());
-
-  SignalChildren(signal_file.c_str());
-
-  int exit_code = 42;
-  EXPECT_TRUE(process.WaitForExit(&exit_code));
-  EXPECT_EQ(kSuccess, exit_code);
-}
-
-// Test that we can clone other directories. CheckTmpFileExists will return an
-// error code if it detects a directory other than "/tmp", so we can use that as
-// a signal that it successfully detected another entry in the root namespace.
-TEST_F(ProcessUtilTest, CloneAlternateDir) {
-  const std::string signal_file =
-      ProcessUtilTest::GetSignalFilePath(kSignalFileClone);
-  remove(signal_file.c_str());
-
-  LaunchOptions options;
-  options.paths_to_map.push_back(base::FilePath("/tmp"));
-  options.paths_to_map.push_back(base::FilePath("/data"));
-  options.clone_flags = LP_CLONE_FDIO_STDIO;
-
-  Process process(SpawnChildWithOptions("CheckTmpFileExists", options));
-  ASSERT_TRUE(process.IsValid());
-
-  SignalChildren(signal_file.c_str());
-
-  int exit_code = 42;
-  EXPECT_TRUE(process.WaitForExit(&exit_code));
-  EXPECT_EQ(1, exit_code);
-}
-
-#endif  // defined(OS_FUCHSIA)
-
-// On Android SpawnProcess() doesn't use LaunchProcess() and doesn't support
-// LaunchOptions::current_directory.
-#if !defined(OS_ANDROID)
-MULTIPROCESS_TEST_MAIN(CheckCwdProcess) {
-  FilePath expected;
-  CHECK(GetTempDir(&expected));
-  expected = MakeAbsoluteFilePath(expected);
-  CHECK(!expected.empty());
-
-  FilePath actual;
-  CHECK(GetCurrentDirectory(&actual));
-  actual = MakeAbsoluteFilePath(actual);
-  CHECK(!actual.empty());
-
-  CHECK(expected == actual) << "Expected: " << expected.value()
-                            << "  Actual: " << actual.value();
-  return kSuccess;
-}
-
-TEST_F(ProcessUtilTest, CurrentDirectory) {
-  // TODO(rickyz): Add support for passing arguments to multiprocess children,
-  // then create a special directory for this test.
-  FilePath tmp_dir;
-  ASSERT_TRUE(GetTempDir(&tmp_dir));
-
-  LaunchOptions options;
-  options.current_directory = tmp_dir;
-
-  Process process(SpawnChildWithOptions("CheckCwdProcess", options));
-  ASSERT_TRUE(process.IsValid());
-
-  int exit_code = 42;
-  EXPECT_TRUE(process.WaitForExit(&exit_code));
-  EXPECT_EQ(kSuccess, exit_code);
-}
-#endif  // !defined(OS_ANDROID)
-
-#if defined(OS_WIN)
-// TODO(cpu): figure out how to test this in other platforms.
-TEST_F(ProcessUtilTest, GetProcId) {
-  ProcessId id1 = GetProcId(GetCurrentProcess());
-  EXPECT_NE(0ul, id1);
-  Process process = SpawnChild("SimpleChildProcess");
-  ASSERT_TRUE(process.IsValid());
-  ProcessId id2 = process.Pid();
-  EXPECT_NE(0ul, id2);
-  EXPECT_NE(id1, id2);
-}
-#endif  // defined(OS_WIN)
-
-#if !defined(OS_MACOSX) && !defined(OS_ANDROID)
-// This test is disabled on Mac, since it's flaky due to ReportCrash
-// taking a variable amount of time to parse and load the debug and
-// symbol data for this unit test's executable before firing the
-// signal handler.
-//
-// TODO(gspencer): turn this test process into a very small program
-// with no symbols (instead of using the multiprocess testing
-// framework) to reduce the ReportCrash overhead.
-//
-// It is disabled on Android as MultiprocessTests are started as services that
-// the framework restarts on crashes.
-const char kSignalFileCrash[] = "CrashingChildProcess.die";
-
-MULTIPROCESS_TEST_MAIN(CrashingChildProcess) {
-  WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileCrash).c_str());
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-  // Have to disable to signal handler for segv so we can get a crash
-  // instead of an abnormal termination through the crash dump handler.
-  ::signal(SIGSEGV, SIG_DFL);
-#endif
-  // Make this process have a segmentation fault.
-  volatile int* oops = nullptr;
-  *oops = 0xDEAD;
-  return 1;
-}
-
-// This test intentionally crashes, so we don't need to run it under
-// AddressSanitizer.
-#if defined(ADDRESS_SANITIZER)
-#define MAYBE_GetTerminationStatusCrash DISABLED_GetTerminationStatusCrash
-#else
-#define MAYBE_GetTerminationStatusCrash GetTerminationStatusCrash
-#endif
-TEST_F(ProcessUtilTest, MAYBE_GetTerminationStatusCrash) {
-  const std::string signal_file =
-    ProcessUtilTest::GetSignalFilePath(kSignalFileCrash);
-  remove(signal_file.c_str());
-  Process process = SpawnChild("CrashingChildProcess");
-  ASSERT_TRUE(process.IsValid());
-
-  int exit_code = 42;
-  EXPECT_EQ(TERMINATION_STATUS_STILL_RUNNING,
-            GetTerminationStatus(process.Handle(), &exit_code));
-  EXPECT_EQ(kExpectedStillRunningExitCode, exit_code);
-
-  SignalChildren(signal_file.c_str());
-  exit_code = 42;
-  TerminationStatus status =
-      WaitForChildTermination(process.Handle(), &exit_code);
-  EXPECT_EQ(TERMINATION_STATUS_PROCESS_CRASHED, status);
-
-#if defined(OS_WIN)
-  EXPECT_EQ(static_cast<int>(0xc0000005), exit_code);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  int signaled = WIFSIGNALED(exit_code);
-  EXPECT_NE(0, signaled);
-  int signal = WTERMSIG(exit_code);
-  EXPECT_EQ(SIGSEGV, signal);
-#endif
-
-  // Reset signal handlers back to "normal".
-  debug::EnableInProcessStackDumping();
-  remove(signal_file.c_str());
-}
-#endif  // !defined(OS_MACOSX) && !defined(OS_ANDROID)
-
-MULTIPROCESS_TEST_MAIN(KilledChildProcess) {
-  WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileKill).c_str());
-#if defined(OS_WIN)
-  // Kill ourselves.
-  HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS, 0, ::GetCurrentProcessId());
-  ::TerminateProcess(handle, kExpectedKilledExitCode);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  // Send a SIGKILL to this process, just like the OOM killer would.
-  ::kill(getpid(), SIGKILL);
-#endif
-  return 1;
-}
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-MULTIPROCESS_TEST_MAIN(TerminatedChildProcess) {
-  WaitToDie(ProcessUtilTest::GetSignalFilePath(kSignalFileTerm).c_str());
-  // Send a SIGTERM to this process.
-  ::kill(getpid(), SIGTERM);
-  return 1;
-}
-#endif  // defined(OS_POSIX) || defined(OS_FUCHSIA)
-
-TEST_F(ProcessUtilTest, GetTerminationStatusSigKill) {
-  const std::string signal_file =
-    ProcessUtilTest::GetSignalFilePath(kSignalFileKill);
-  remove(signal_file.c_str());
-  Process process = SpawnChild("KilledChildProcess");
-  ASSERT_TRUE(process.IsValid());
-
-  int exit_code = 42;
-  EXPECT_EQ(TERMINATION_STATUS_STILL_RUNNING,
-            GetTerminationStatus(process.Handle(), &exit_code));
-  EXPECT_EQ(kExpectedStillRunningExitCode, exit_code);
-
-  SignalChildren(signal_file.c_str());
-  exit_code = 42;
-  TerminationStatus status =
-      WaitForChildTermination(process.Handle(), &exit_code);
-#if defined(OS_CHROMEOS)
-  EXPECT_EQ(TERMINATION_STATUS_PROCESS_WAS_KILLED_BY_OOM, status);
-#else
-  EXPECT_EQ(TERMINATION_STATUS_PROCESS_WAS_KILLED, status);
-#endif
-
-#if defined(OS_WIN)
-  EXPECT_EQ(kExpectedKilledExitCode, exit_code);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  int signaled = WIFSIGNALED(exit_code);
-  EXPECT_NE(0, signaled);
-  int signal = WTERMSIG(exit_code);
-  EXPECT_EQ(SIGKILL, signal);
-#endif
-  remove(signal_file.c_str());
-}
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-TEST_F(ProcessUtilTest, GetTerminationStatusSigTerm) {
-  const std::string signal_file =
-    ProcessUtilTest::GetSignalFilePath(kSignalFileTerm);
-  remove(signal_file.c_str());
-  Process process = SpawnChild("TerminatedChildProcess");
-  ASSERT_TRUE(process.IsValid());
-
-  int exit_code = 42;
-  EXPECT_EQ(TERMINATION_STATUS_STILL_RUNNING,
-            GetTerminationStatus(process.Handle(), &exit_code));
-  EXPECT_EQ(kExpectedStillRunningExitCode, exit_code);
-
-  SignalChildren(signal_file.c_str());
-  exit_code = 42;
-  TerminationStatus status =
-      WaitForChildTermination(process.Handle(), &exit_code);
-  EXPECT_EQ(TERMINATION_STATUS_PROCESS_WAS_KILLED, status);
-
-  int signaled = WIFSIGNALED(exit_code);
-  EXPECT_NE(0, signaled);
-  int signal = WTERMSIG(exit_code);
-  EXPECT_EQ(SIGTERM, signal);
-  remove(signal_file.c_str());
-}
-#endif  // defined(OS_POSIX) || defined(OS_FUCHSIA)
-
-TEST_F(ProcessUtilTest, EnsureTerminationUndying) {
-  test::ScopedTaskEnvironment task_environment;
-
-  Process child_process = SpawnChild("process_util_test_never_die");
-  ASSERT_TRUE(child_process.IsValid());
-
-  EnsureProcessTerminated(child_process.Duplicate());
-
-  // Allow a generous timeout, to cope with slow/loaded test bots.
-  EXPECT_TRUE(child_process.WaitForExitWithTimeout(
-      TestTimeouts::action_max_timeout(), nullptr));
-}
-
-MULTIPROCESS_TEST_MAIN(process_util_test_never_die) {
-  while (1) {
-    PlatformThread::Sleep(TimeDelta::FromSeconds(500));
-  }
-  return kSuccess;
-}
-
-TEST_F(ProcessUtilTest, EnsureTerminationGracefulExit) {
-  test::ScopedTaskEnvironment task_environment;
-
-  Process child_process = SpawnChild("process_util_test_die_immediately");
-  ASSERT_TRUE(child_process.IsValid());
-
-  // Wait for the child process to actually exit.
-  child_process.Duplicate().WaitForExitWithTimeout(
-      TestTimeouts::action_max_timeout(), nullptr);
-
-  EnsureProcessTerminated(child_process.Duplicate());
-
-  // Verify that the process is really, truly gone.
-  EXPECT_TRUE(child_process.WaitForExitWithTimeout(
-      TestTimeouts::action_max_timeout(), nullptr));
-}
-
-MULTIPROCESS_TEST_MAIN(process_util_test_die_immediately) {
-  return kSuccess;
-}
-
-#if defined(OS_WIN)
-// TODO(estade): if possible, port this test.
-TEST_F(ProcessUtilTest, LaunchAsUser) {
-  UserTokenHandle token;
-  ASSERT_TRUE(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &token));
-  LaunchOptions options;
-  options.as_user = token;
-  EXPECT_TRUE(
-      LaunchProcess(MakeCmdLine("SimpleChildProcess"), options).IsValid());
-}
-
-static const char kEventToTriggerHandleSwitch[] = "event-to-trigger-handle";
-
-MULTIPROCESS_TEST_MAIN(TriggerEventChildProcess) {
-  std::string handle_value_string =
-      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          kEventToTriggerHandleSwitch);
-  CHECK(!handle_value_string.empty());
-
-  uint64_t handle_value_uint64;
-  CHECK(StringToUint64(handle_value_string, &handle_value_uint64));
-  // Give ownership of the handle to |event|.
-  WaitableEvent event(
-      win::ScopedHandle(reinterpret_cast<HANDLE>(handle_value_uint64)));
-
-  event.Signal();
-
-  return 0;
-}
-
-TEST_F(ProcessUtilTest, InheritSpecifiedHandles) {
-  // Manually create the event, so that it can be inheritable.
-  SECURITY_ATTRIBUTES security_attributes = {};
-  security_attributes.nLength = static_cast<DWORD>(sizeof(security_attributes));
-  security_attributes.lpSecurityDescriptor = NULL;
-  security_attributes.bInheritHandle = true;
-
-  // Takes ownership of the event handle.
-  WaitableEvent event(
-      win::ScopedHandle(CreateEvent(&security_attributes, true, false, NULL)));
-  LaunchOptions options;
-  options.handles_to_inherit.emplace_back(event.handle());
-
-  CommandLine cmd_line = MakeCmdLine("TriggerEventChildProcess");
-  cmd_line.AppendSwitchASCII(
-      kEventToTriggerHandleSwitch,
-      NumberToString(reinterpret_cast<uint64_t>(event.handle())));
-
-  // Launch the process and wait for it to trigger the event.
-  ASSERT_TRUE(LaunchProcess(cmd_line, options).IsValid());
-  EXPECT_TRUE(event.TimedWait(TestTimeouts::action_max_timeout()));
-}
-#endif  // defined(OS_WIN)
-
-TEST_F(ProcessUtilTest, GetAppOutput) {
-  base::CommandLine command(test_helper_path_);
-  command.AppendArg("hello");
-  command.AppendArg("there");
-  command.AppendArg("good");
-  command.AppendArg("people");
-  std::string output;
-  EXPECT_TRUE(GetAppOutput(command, &output));
-  EXPECT_EQ("hello there good people", output);
-  output.clear();
-
-  const char* kEchoMessage = "blah";
-  command = base::CommandLine(test_helper_path_);
-  command.AppendArg("-x");
-  command.AppendArg("28");
-  command.AppendArg(kEchoMessage);
-  EXPECT_FALSE(GetAppOutput(command, &output));
-  EXPECT_EQ(kEchoMessage, output);
-}
-
-TEST_F(ProcessUtilTest, GetAppOutputWithExitCode) {
-  const char* kEchoMessage1 = "doge";
-  int exit_code = -1;
-  base::CommandLine command(test_helper_path_);
-  command.AppendArg(kEchoMessage1);
-  std::string output;
-  EXPECT_TRUE(GetAppOutputWithExitCode(command, &output, &exit_code));
-  EXPECT_EQ(kEchoMessage1, output);
-  EXPECT_EQ(0, exit_code);
-  output.clear();
-
-  const char* kEchoMessage2 = "pupper";
-  const int kExpectedExitCode = 42;
-  command = base::CommandLine(test_helper_path_);
-  command.AppendArg("-x");
-  command.AppendArg(base::IntToString(kExpectedExitCode));
-  command.AppendArg(kEchoMessage2);
-#if defined(OS_WIN)
-  // On Windows, anything that quits with a nonzero status code is handled as a
-  // "crash", so just ignore GetAppOutputWithExitCode's return value.
-  GetAppOutputWithExitCode(command, &output, &exit_code);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  EXPECT_TRUE(GetAppOutputWithExitCode(command, &output, &exit_code));
-#endif
-  EXPECT_EQ(kEchoMessage2, output);
-  EXPECT_EQ(kExpectedExitCode, exit_code);
-}
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-
-namespace {
-
-// Returns the maximum number of files that a process can have open.
-// Returns 0 on error.
-int GetMaxFilesOpenInProcess() {
-#if defined(OS_FUCHSIA)
-  return FDIO_MAX_FD;
-#else
-  struct rlimit rlim;
-  if (getrlimit(RLIMIT_NOFILE, &rlim) != 0) {
-    return 0;
-  }
-
-  // rlim_t is a uint64_t - clip to maxint. We do this since FD #s are ints
-  // which are all 32 bits on the supported platforms.
-  rlim_t max_int = static_cast<rlim_t>(std::numeric_limits<int32_t>::max());
-  if (rlim.rlim_cur > max_int) {
-    return max_int;
-  }
-
-  return rlim.rlim_cur;
-#endif  // defined(OS_FUCHSIA)
-}
-
-const int kChildPipe = 20;  // FD # for write end of pipe in child process.
-
-#if defined(OS_MACOSX)
-
-// <http://opensource.apple.com/source/xnu/xnu-2422.1.72/bsd/sys/guarded.h>
-#if !defined(_GUARDID_T)
-#define _GUARDID_T
-typedef __uint64_t guardid_t;
-#endif  // _GUARDID_T
-
-// From .../MacOSX10.9.sdk/usr/include/sys/syscall.h
-#if !defined(SYS_change_fdguard_np)
-#define SYS_change_fdguard_np 444
-#endif
-
-// <http://opensource.apple.com/source/xnu/xnu-2422.1.72/bsd/sys/guarded.h>
-#if !defined(GUARD_DUP)
-#define GUARD_DUP (1u << 1)
-#endif
-
-// <http://opensource.apple.com/source/xnu/xnu-2422.1.72/bsd/kern/kern_guarded.c?txt>
-//
-// Atomically replaces |guard|/|guardflags| with |nguard|/|nguardflags| on |fd|.
-int change_fdguard_np(int fd,
-                      const guardid_t *guard, u_int guardflags,
-                      const guardid_t *nguard, u_int nguardflags,
-                      int *fdflagsp) {
-  return syscall(SYS_change_fdguard_np, fd, guard, guardflags,
-                 nguard, nguardflags, fdflagsp);
-}
-
-// Attempt to set a file-descriptor guard on |fd|.  In case of success, remove
-// it and return |true| to indicate that it can be guarded.  Returning |false|
-// means either that |fd| is guarded by some other code, or more likely EBADF.
-//
-// Starting with 10.9, libdispatch began setting GUARD_DUP on a file descriptor.
-// Unfortunately, it is spun up as part of +[NSApplication initialize], which is
-// not really something that Chromium can avoid using on OSX.  See
-// <http://crbug.com/338157>.  This function allows querying whether the file
-// descriptor is guarded before attempting to close it.
-bool CanGuardFd(int fd) {
-  // Saves the original flags to reset later.
-  int original_fdflags = 0;
-
-  // This can be any value at all, it just has to match up between the two
-  // calls.
-  const guardid_t kGuard = 15;
-
-  // Attempt to change the guard.  This can fail with EBADF if the file
-  // descriptor is bad, or EINVAL if the fd already has a guard set.
-  int ret =
-      change_fdguard_np(fd, NULL, 0, &kGuard, GUARD_DUP, &original_fdflags);
-  if (ret == -1)
-    return false;
-
-  // Remove the guard.  It should not be possible to fail in removing the guard
-  // just added.
-  ret = change_fdguard_np(fd, &kGuard, GUARD_DUP, NULL, 0, &original_fdflags);
-  DPCHECK(ret == 0);
-
-  return true;
-}
-#endif  // defined(OS_MACOSX)
-
-}  // namespace
-
-MULTIPROCESS_TEST_MAIN(ProcessUtilsLeakFDChildProcess) {
-  // This child process counts the number of open FDs, it then writes that
-  // number out to a pipe connected to the parent.
-  int num_open_files = 0;
-  int write_pipe = kChildPipe;
-  int max_files = GetMaxFilesOpenInProcess();
-  for (int i = STDERR_FILENO + 1; i < max_files; i++) {
-#if defined(OS_MACOSX)
-    // Ignore guarded or invalid file descriptors.
-    if (!CanGuardFd(i))
-      continue;
-#endif
-
-    if (i != kChildPipe) {
-      int fd;
-      if ((fd = HANDLE_EINTR(dup(i))) != -1) {
-        close(fd);
-        num_open_files += 1;
-      }
-    }
-  }
-
-  int written = HANDLE_EINTR(write(write_pipe, &num_open_files,
-                                   sizeof(num_open_files)));
-  DCHECK_EQ(static_cast<size_t>(written), sizeof(num_open_files));
-  int ret = IGNORE_EINTR(close(write_pipe));
-  DPCHECK(ret == 0);
-
-  return 0;
-}
-
-int ProcessUtilTest::CountOpenFDsInChild() {
-  int fds[2];
-  if (pipe(fds) < 0)
-    NOTREACHED();
-
-  LaunchOptions options;
-  options.fds_to_remap.emplace_back(fds[1], kChildPipe);
-  Process process =
-      SpawnChildWithOptions("ProcessUtilsLeakFDChildProcess", options);
-  CHECK(process.IsValid());
-  int ret = IGNORE_EINTR(close(fds[1]));
-  DPCHECK(ret == 0);
-
-  // Read number of open files in client process from pipe;
-  int num_open_files = -1;
-  ssize_t bytes_read =
-      HANDLE_EINTR(read(fds[0], &num_open_files, sizeof(num_open_files)));
-  CHECK_EQ(bytes_read, static_cast<ssize_t>(sizeof(num_open_files)));
-
-#if defined(THREAD_SANITIZER)
-  // Compiler-based ThreadSanitizer makes this test slow.
-  TimeDelta timeout = TimeDelta::FromSeconds(3);
-#else
-  TimeDelta timeout = TimeDelta::FromSeconds(1);
-#endif
-  int exit_code;
-  CHECK(process.WaitForExitWithTimeout(timeout, &exit_code));
-  ret = IGNORE_EINTR(close(fds[0]));
-  DPCHECK(ret == 0);
-
-  return num_open_files;
-}
-
-#if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER)
-// ProcessUtilTest.FDRemapping is flaky when ran under xvfb-run on Precise.
-// The problem is 100% reproducible with both ASan and TSan.
-// See http://crbug.com/136720.
-#define MAYBE_FDRemapping DISABLED_FDRemapping
-#else
-#define MAYBE_FDRemapping FDRemapping
-#endif  // defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER)
-TEST_F(ProcessUtilTest, MAYBE_FDRemapping) {
-  int fds_before = CountOpenFDsInChild();
-
-  // open some dummy fds to make sure they don't propagate over to the
-  // child process.
-  int dev_null = open("/dev/null", O_RDONLY);
-  DPCHECK(dev_null != -1);
-  int sockets[2];
-  int ret = socketpair(AF_UNIX, SOCK_STREAM, 0, sockets);
-  DPCHECK(ret == 0);
-
-  int fds_after = CountOpenFDsInChild();
-
-  ASSERT_EQ(fds_after, fds_before);
-
-  ret = IGNORE_EINTR(close(sockets[0]));
-  DPCHECK(ret == 0);
-  ret = IGNORE_EINTR(close(sockets[1]));
-  DPCHECK(ret == 0);
-  ret = IGNORE_EINTR(close(dev_null));
-  DPCHECK(ret == 0);
-}
-
-const char kPipeValue = '\xcc';
-MULTIPROCESS_TEST_MAIN(ProcessUtilsVerifyStdio) {
-  // Write to stdio so the parent process can observe output.
-  CHECK_EQ(1, HANDLE_EINTR(write(STDOUT_FILENO, &kPipeValue, 1)));
-
-  // Close all of the handles, to verify they are valid.
-  CHECK_EQ(0, IGNORE_EINTR(close(STDIN_FILENO)));
-  CHECK_EQ(0, IGNORE_EINTR(close(STDOUT_FILENO)));
-  CHECK_EQ(0, IGNORE_EINTR(close(STDERR_FILENO)));
-  return 0;
-}
-
-TEST_F(ProcessUtilTest, FDRemappingIncludesStdio) {
-  int dev_null = open("/dev/null", O_RDONLY);
-  ASSERT_LT(2, dev_null);
-
-  // Backup stdio and replace it with the write end of a pipe, for our
-  // child process to inherit.
-  int pipe_fds[2];
-  int result = pipe(pipe_fds);
-  ASSERT_EQ(0, result);
-  int backup_stdio = HANDLE_EINTR(dup(STDOUT_FILENO));
-  ASSERT_LE(0, backup_stdio);
-  result = dup2(pipe_fds[1], STDOUT_FILENO);
-  ASSERT_EQ(STDOUT_FILENO, result);
-
-  // Launch the test process, which should inherit our pipe stdio.
-  LaunchOptions options;
-  options.fds_to_remap.emplace_back(dev_null, dev_null);
-  Process process = SpawnChildWithOptions("ProcessUtilsVerifyStdio", options);
-  ASSERT_TRUE(process.IsValid());
-
-  // Restore stdio, so we can output stuff.
-  result = dup2(backup_stdio, STDOUT_FILENO);
-  ASSERT_EQ(STDOUT_FILENO, result);
-
-  // Close our copy of the write end of the pipe, so that the read()
-  // from the other end will see EOF if it wasn't copied to the child.
-  result = IGNORE_EINTR(close(pipe_fds[1]));
-  ASSERT_EQ(0, result);
-
-  result = IGNORE_EINTR(close(backup_stdio));
-  ASSERT_EQ(0, result);
-  result = IGNORE_EINTR(close(dev_null));
-  ASSERT_EQ(0, result);
-
-  // Read from the pipe to verify that it is connected to the child
-  // process' stdio.
-  char buf[16] = {};
-  EXPECT_EQ(1, HANDLE_EINTR(read(pipe_fds[0], buf, sizeof(buf))));
-  EXPECT_EQ(kPipeValue, buf[0]);
-
-  result = IGNORE_EINTR(close(pipe_fds[0]));
-  ASSERT_EQ(0, result);
-
-  int exit_code;
-  ASSERT_TRUE(
-      process.WaitForExitWithTimeout(TimeDelta::FromSeconds(5), &exit_code));
-  EXPECT_EQ(0, exit_code);
-}
-
-#if defined(OS_FUCHSIA)
-
-const uint16_t kStartupHandleId = 43;
-MULTIPROCESS_TEST_MAIN(ProcessUtilsVerifyHandle) {
-  zx_handle_t handle =
-      zx_get_startup_handle(PA_HND(PA_USER0, kStartupHandleId));
-  CHECK_NE(ZX_HANDLE_INVALID, handle);
-
-  // Write to the pipe so the parent process can observe output.
-  size_t bytes_written = 0;
-  zx_status_t result = zx_socket_write(handle, 0, &kPipeValue,
-                                       sizeof(kPipeValue), &bytes_written);
-  CHECK_EQ(ZX_OK, result);
-  CHECK_EQ(1u, bytes_written);
-
-  CHECK_EQ(ZX_OK, zx_handle_close(handle));
-  return 0;
-}
-
-TEST_F(ProcessUtilTest, LaunchWithHandleTransfer) {
-  // Create a pipe to pass to the child process.
-  zx_handle_t handles[2];
-  zx_status_t result =
-      zx_socket_create(ZX_SOCKET_STREAM, &handles[0], &handles[1]);
-  ASSERT_EQ(ZX_OK, result);
-
-  // Launch the test process, and pass it one end of the pipe.
-  LaunchOptions options;
-  options.handles_to_transfer.push_back(
-      {PA_HND(PA_USER0, kStartupHandleId), handles[0]});
-  Process process = SpawnChildWithOptions("ProcessUtilsVerifyHandle", options);
-  ASSERT_TRUE(process.IsValid());
-
-  // Read from the pipe to verify that the child received it.
-  zx_signals_t signals = 0;
-  result = zx_object_wait_one(
-      handles[1], ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED,
-      (base::TimeTicks::Now() + TestTimeouts::action_timeout()).ToZxTime(),
-      &signals);
-  ASSERT_EQ(ZX_OK, result);
-  ASSERT_TRUE(signals & ZX_SOCKET_READABLE);
-
-  size_t bytes_read = 0;
-  char buf[16] = {0};
-  result = zx_socket_read(handles[1], 0, buf, sizeof(buf), &bytes_read);
-  EXPECT_EQ(ZX_OK, result);
-  EXPECT_EQ(1u, bytes_read);
-  EXPECT_EQ(kPipeValue, buf[0]);
-
-  CHECK_EQ(ZX_OK, zx_handle_close(handles[1]));
-
-  int exit_code;
-  ASSERT_TRUE(process.WaitForExitWithTimeout(TestTimeouts::action_timeout(),
-                                             &exit_code));
-  EXPECT_EQ(0, exit_code);
-}
-
-#endif  // defined(OS_FUCHSIA)
-
-namespace {
-
-std::string TestLaunchProcess(const std::vector<std::string>& args,
-                              const EnvironmentMap& env_changes,
-                              const bool clear_environ,
-                              const int clone_flags) {
-  int fds[2];
-  PCHECK(pipe(fds) == 0);
-
-  LaunchOptions options;
-  options.wait = true;
-  options.environ = env_changes;
-  options.clear_environ = clear_environ;
-  options.fds_to_remap.emplace_back(fds[1], 1);
-#if defined(OS_LINUX)
-  options.clone_flags = clone_flags;
-#else
-  CHECK_EQ(0, clone_flags);
-#endif  // defined(OS_LINUX)
-  EXPECT_TRUE(LaunchProcess(args, options).IsValid());
-  PCHECK(IGNORE_EINTR(close(fds[1])) == 0);
-
-  char buf[512];
-  const ssize_t n = HANDLE_EINTR(read(fds[0], buf, sizeof(buf)));
-
-  PCHECK(IGNORE_EINTR(close(fds[0])) == 0);
-
-  return std::string(buf, n);
-}
-
-const char kLargeString[] =
-    "0123456789012345678901234567890123456789012345678901234567890123456789"
-    "0123456789012345678901234567890123456789012345678901234567890123456789"
-    "0123456789012345678901234567890123456789012345678901234567890123456789"
-    "0123456789012345678901234567890123456789012345678901234567890123456789"
-    "0123456789012345678901234567890123456789012345678901234567890123456789"
-    "0123456789012345678901234567890123456789012345678901234567890123456789"
-    "0123456789012345678901234567890123456789012345678901234567890123456789";
-
-}  // namespace
-
-TEST_F(ProcessUtilTest, LaunchProcess) {
-  const int no_clone_flags = 0;
-  const bool no_clear_environ = false;
-  const char kBaseTest[] = "BASE_TEST";
-  const std::vector<std::string> kPrintEnvCommand = {test_helper_path_.value(),
-                                                     "-e", kBaseTest};
-
-  EnvironmentMap env_changes;
-  env_changes[kBaseTest] = "bar";
-  EXPECT_EQ("bar", TestLaunchProcess(kPrintEnvCommand, env_changes,
-                                     no_clear_environ, no_clone_flags));
-  env_changes.clear();
-
-  EXPECT_EQ(0, setenv(kBaseTest, "testing", 1 /* override */));
-  EXPECT_EQ("testing", TestLaunchProcess(kPrintEnvCommand, env_changes,
-                                         no_clear_environ, no_clone_flags));
-
-  env_changes[kBaseTest] = std::string();
-  EXPECT_EQ("", TestLaunchProcess(kPrintEnvCommand, env_changes,
-                                  no_clear_environ, no_clone_flags));
-
-  env_changes[kBaseTest] = "foo";
-  EXPECT_EQ("foo", TestLaunchProcess(kPrintEnvCommand, env_changes,
-                                     no_clear_environ, no_clone_flags));
-
-  env_changes.clear();
-  EXPECT_EQ(0, setenv(kBaseTest, kLargeString, 1 /* override */));
-  EXPECT_EQ(std::string(kLargeString),
-            TestLaunchProcess(kPrintEnvCommand, env_changes, no_clear_environ,
-                              no_clone_flags));
-
-  env_changes[kBaseTest] = "wibble";
-  EXPECT_EQ("wibble", TestLaunchProcess(kPrintEnvCommand, env_changes,
-                                        no_clear_environ, no_clone_flags));
-
-#if defined(OS_LINUX)
-  // Test a non-trival value for clone_flags.
-  EXPECT_EQ("wibble", TestLaunchProcess(kPrintEnvCommand, env_changes,
-                                        no_clear_environ, CLONE_FS));
-
-  EXPECT_EQ("wibble",
-            TestLaunchProcess(kPrintEnvCommand, env_changes,
-                              true /* clear_environ */, no_clone_flags));
-  env_changes.clear();
-  EXPECT_EQ("", TestLaunchProcess(kPrintEnvCommand, env_changes,
-                                  true /* clear_environ */, no_clone_flags));
-#endif  // defined(OS_LINUX)
-}
-
-// There's no such thing as a parent process id on Fuchsia.
-#if !defined(OS_FUCHSIA)
-TEST_F(ProcessUtilTest, GetParentProcessId) {
-  ProcessId ppid = GetParentProcessId(GetCurrentProcessHandle());
-  EXPECT_EQ(ppid, static_cast<ProcessId>(getppid()));
-}
-#endif  // !defined(OS_FUCHSIA)
-
-#if !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
-class WriteToPipeDelegate : public LaunchOptions::PreExecDelegate {
- public:
-  explicit WriteToPipeDelegate(int fd) : fd_(fd) {}
-  ~WriteToPipeDelegate() override = default;
-  void RunAsyncSafe() override {
-    RAW_CHECK(HANDLE_EINTR(write(fd_, &kPipeValue, 1)) == 1);
-    RAW_CHECK(IGNORE_EINTR(close(fd_)) == 0);
-  }
-
- private:
-  int fd_;
-  DISALLOW_COPY_AND_ASSIGN(WriteToPipeDelegate);
-};
-
-TEST_F(ProcessUtilTest, PreExecHook) {
-  int pipe_fds[2];
-  ASSERT_EQ(0, pipe(pipe_fds));
-
-  ScopedFD read_fd(pipe_fds[0]);
-  ScopedFD write_fd(pipe_fds[1]);
-
-  WriteToPipeDelegate write_to_pipe_delegate(write_fd.get());
-  LaunchOptions options;
-  options.fds_to_remap.emplace_back(write_fd.get(), write_fd.get());
-  options.pre_exec_delegate = &write_to_pipe_delegate;
-  Process process(SpawnChildWithOptions("SimpleChildProcess", options));
-  ASSERT_TRUE(process.IsValid());
-
-  write_fd.reset();
-  char c;
-  ASSERT_EQ(1, HANDLE_EINTR(read(read_fd.get(), &c, 1)));
-  EXPECT_EQ(c, kPipeValue);
-
-  int exit_code = 42;
-  EXPECT_TRUE(process.WaitForExit(&exit_code));
-  EXPECT_EQ(0, exit_code);
-}
-#endif  // !defined(OS_ANDROID) && !defined(OS_FUCHSIA)
-
-#endif  // !defined(OS_MACOSX) && !defined(OS_ANDROID)
-
-#if defined(OS_LINUX)
-MULTIPROCESS_TEST_MAIN(CheckPidProcess) {
-  const pid_t kInitPid = 1;
-  const pid_t pid = syscall(__NR_getpid);
-  CHECK(pid == kInitPid);
-  CHECK(getpid() == pid);
-  return kSuccess;
-}
-
-#if defined(CLONE_NEWUSER) && defined(CLONE_NEWPID)
-TEST_F(ProcessUtilTest, CloneFlags) {
-  if (!PathExists(FilePath("/proc/self/ns/user")) ||
-      !PathExists(FilePath("/proc/self/ns/pid"))) {
-    // User or PID namespaces are not supported.
-    return;
-  }
-
-  LaunchOptions options;
-  options.clone_flags = CLONE_NEWUSER | CLONE_NEWPID;
-
-  Process process(SpawnChildWithOptions("CheckPidProcess", options));
-  ASSERT_TRUE(process.IsValid());
-
-  int exit_code = 42;
-  EXPECT_TRUE(process.WaitForExit(&exit_code));
-  EXPECT_EQ(kSuccess, exit_code);
-}
-#endif  // defined(CLONE_NEWUSER) && defined(CLONE_NEWPID)
-
-TEST(ForkWithFlagsTest, UpdatesPidCache) {
-  // Warm up the libc pid cache, if there is one.
-  ASSERT_EQ(syscall(__NR_getpid), getpid());
-
-  pid_t ctid = 0;
-  const pid_t pid = ForkWithFlags(SIGCHLD | CLONE_CHILD_SETTID, nullptr, &ctid);
-  if (pid == 0) {
-    // In child.  Check both the raw getpid syscall and the libc getpid wrapper
-    // (which may rely on a pid cache).
-    RAW_CHECK(syscall(__NR_getpid) == ctid);
-    RAW_CHECK(getpid() == ctid);
-    _exit(kSuccess);
-  }
-
-  ASSERT_NE(-1, pid);
-  int status = 42;
-  ASSERT_EQ(pid, HANDLE_EINTR(waitpid(pid, &status, 0)));
-  ASSERT_TRUE(WIFEXITED(status));
-  EXPECT_EQ(kSuccess, WEXITSTATUS(status));
-}
-
-TEST_F(ProcessUtilTest, InvalidCurrentDirectory) {
-  LaunchOptions options;
-  options.current_directory = FilePath("/dev/null");
-
-  Process process(SpawnChildWithOptions("SimpleChildProcess", options));
-  ASSERT_TRUE(process.IsValid());
-
-  int exit_code = kSuccess;
-  EXPECT_TRUE(process.WaitForExit(&exit_code));
-  EXPECT_NE(kSuccess, exit_code);
-}
-#endif  // defined(OS_LINUX)
-
-}  // namespace base
diff --git a/base/profiler/stack_sampling_profiler_unittest.cc b/base/profiler/stack_sampling_profiler_unittest.cc
deleted file mode 100644
index b25943f..0000000
--- a/base/profiler/stack_sampling_profiler_unittest.cc
+++ /dev/null
@@ -1,1506 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <cstdlib>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/files/file_util.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/native_library.h"
-#include "base/path_service.h"
-#include "base/profiler/native_stack_sampler.h"
-#include "base/profiler/stack_sampling_profiler.h"
-#include "base/run_loop.h"
-#include "base/scoped_native_library.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include <intrin.h>
-#include <malloc.h>
-#include <windows.h>
-#else
-#include <alloca.h>
-#endif
-
-// STACK_SAMPLING_PROFILER_SUPPORTED is used to conditionally enable the tests
-// below for supported platforms (currently Win x64 and Mac x64).
-#if defined(_WIN64) || (defined(OS_MACOSX) && !defined(OS_IOS))
-#define STACK_SAMPLING_PROFILER_SUPPORTED 1
-#endif
-
-#if defined(OS_WIN)
-#pragma intrinsic(_ReturnAddress)
-#endif
-
-namespace base {
-
-#if defined(STACK_SAMPLING_PROFILER_SUPPORTED)
-#define PROFILER_TEST_F(TestClass, TestName) TEST_F(TestClass, TestName)
-#else
-#define PROFILER_TEST_F(TestClass, TestName) \
-  TEST_F(TestClass, DISABLED_##TestName)
-#endif
-
-using SamplingParams = StackSamplingProfiler::SamplingParams;
-using Frame = StackSamplingProfiler::Frame;
-using Frames = std::vector<StackSamplingProfiler::Frame>;
-using Module = StackSamplingProfiler::Module;
-using Sample = StackSamplingProfiler::Sample;
-using CallStackProfile = StackSamplingProfiler::CallStackProfile;
-using CallStackProfiles = StackSamplingProfiler::CallStackProfiles;
-
-namespace {
-
-// Configuration for the frames that appear on the stack.
-struct StackConfiguration {
-  enum Config { NORMAL, WITH_ALLOCA, WITH_OTHER_LIBRARY };
-
-  explicit StackConfiguration(Config config)
-      : StackConfiguration(config, nullptr) {
-    EXPECT_NE(config, WITH_OTHER_LIBRARY);
-  }
-
-  StackConfiguration(Config config, NativeLibrary library)
-      : config(config), library(library) {
-    EXPECT_TRUE(config != WITH_OTHER_LIBRARY || library);
-  }
-
-  Config config;
-
-  // Only used if config == WITH_OTHER_LIBRARY.
-  NativeLibrary library;
-};
-
-// Signature for a target function that is expected to appear in the stack. See
-// SignalAndWaitUntilSignaled() below. The return value should be a program
-// counter pointer near the end of the function.
-using TargetFunction = const void*(*)(WaitableEvent*, WaitableEvent*,
-                                      const StackConfiguration*);
-
-// A thread to target for profiling, whose stack is guaranteed to contain
-// SignalAndWaitUntilSignaled() when coordinated with the main thread.
-class TargetThread : public PlatformThread::Delegate {
- public:
-  explicit TargetThread(const StackConfiguration& stack_config);
-
-  // PlatformThread::Delegate:
-  void ThreadMain() override;
-
-  // Waits for the thread to have started and be executing in
-  // SignalAndWaitUntilSignaled().
-  void WaitForThreadStart();
-
-  // Allows the thread to return from SignalAndWaitUntilSignaled() and finish
-  // execution.
-  void SignalThreadToFinish();
-
-  // This function is guaranteed to be executing between calls to
-  // WaitForThreadStart() and SignalThreadToFinish() when invoked with
-  // |thread_started_event_| and |finish_event_|. Returns a program counter
-  // value near the end of the function. May be invoked with null WaitableEvents
-  // to just return the program counter.
-  //
-  // This function is static so that we can get a straightforward address
-  // for it in one of the tests below, rather than dealing with the complexity
-  // of a member function pointer representation.
-  static const void* SignalAndWaitUntilSignaled(
-      WaitableEvent* thread_started_event,
-      WaitableEvent* finish_event,
-      const StackConfiguration* stack_config);
-
-  // Calls into SignalAndWaitUntilSignaled() after allocating memory on the
-  // stack with alloca.
-  static const void* CallWithAlloca(WaitableEvent* thread_started_event,
-                                    WaitableEvent* finish_event,
-                                    const StackConfiguration* stack_config);
-
-  // Calls into SignalAndWaitUntilSignaled() via a function in
-  // base_profiler_test_support_library.
-  static const void* CallThroughOtherLibrary(
-      WaitableEvent* thread_started_event,
-      WaitableEvent* finish_event,
-      const StackConfiguration* stack_config);
-
-  PlatformThreadId id() const { return id_; }
-
- private:
-  struct TargetFunctionArgs {
-    WaitableEvent* thread_started_event;
-    WaitableEvent* finish_event;
-    const StackConfiguration* stack_config;
-  };
-
-  // Callback function to be provided when calling through the other library.
-  static void OtherLibraryCallback(void *arg);
-
-  // Returns the current program counter, or a value very close to it.
-  static const void* GetProgramCounter();
-
-  WaitableEvent thread_started_event_;
-  WaitableEvent finish_event_;
-  PlatformThreadId id_;
-  const StackConfiguration stack_config_;
-
-  DISALLOW_COPY_AND_ASSIGN(TargetThread);
-};
-
-TargetThread::TargetThread(const StackConfiguration& stack_config)
-    : thread_started_event_(WaitableEvent::ResetPolicy::AUTOMATIC,
-                            WaitableEvent::InitialState::NOT_SIGNALED),
-      finish_event_(WaitableEvent::ResetPolicy::AUTOMATIC,
-                    WaitableEvent::InitialState::NOT_SIGNALED),
-      id_(0),
-      stack_config_(stack_config) {}
-
-void TargetThread::ThreadMain() {
-  id_ = PlatformThread::CurrentId();
-  switch (stack_config_.config) {
-    case StackConfiguration::NORMAL:
-      SignalAndWaitUntilSignaled(&thread_started_event_, &finish_event_,
-                                 &stack_config_);
-      break;
-
-    case StackConfiguration::WITH_ALLOCA:
-      CallWithAlloca(&thread_started_event_, &finish_event_, &stack_config_);
-      break;
-
-    case StackConfiguration::WITH_OTHER_LIBRARY:
-      CallThroughOtherLibrary(&thread_started_event_, &finish_event_,
-                              &stack_config_);
-      break;
-  }
-}
-
-void TargetThread::WaitForThreadStart() {
-  thread_started_event_.Wait();
-}
-
-void TargetThread::SignalThreadToFinish() {
-  finish_event_.Signal();
-}
-
-// static
-// Disable inlining for this function so that it gets its own stack frame.
-NOINLINE const void* TargetThread::SignalAndWaitUntilSignaled(
-    WaitableEvent* thread_started_event,
-    WaitableEvent* finish_event,
-    const StackConfiguration* stack_config) {
-  if (thread_started_event && finish_event) {
-    thread_started_event->Signal();
-    finish_event->Wait();
-  }
-
-  // Volatile to prevent a tail call to GetProgramCounter().
-  const void* volatile program_counter = GetProgramCounter();
-  return program_counter;
-}
-
-// static
-// Disable inlining for this function so that it gets its own stack frame.
-NOINLINE const void* TargetThread::CallWithAlloca(
-    WaitableEvent* thread_started_event,
-    WaitableEvent* finish_event,
-    const StackConfiguration* stack_config) {
-  const size_t alloca_size = 100;
-  // Memset to 0 to generate a clean failure.
-  std::memset(alloca(alloca_size), 0, alloca_size);
-
-  SignalAndWaitUntilSignaled(thread_started_event, finish_event, stack_config);
-
-  // Volatile to prevent a tail call to GetProgramCounter().
-  const void* volatile program_counter = GetProgramCounter();
-  return program_counter;
-}
-
-// static
-NOINLINE const void* TargetThread::CallThroughOtherLibrary(
-    WaitableEvent* thread_started_event,
-    WaitableEvent* finish_event,
-    const StackConfiguration* stack_config) {
-  if (stack_config) {
-    // A function whose arguments are a function accepting void*, and a void*.
-    using InvokeCallbackFunction = void(*)(void (*)(void*), void*);
-    EXPECT_TRUE(stack_config->library);
-    InvokeCallbackFunction function = reinterpret_cast<InvokeCallbackFunction>(
-        GetFunctionPointerFromNativeLibrary(stack_config->library,
-                                            "InvokeCallbackFunction"));
-    EXPECT_TRUE(function);
-
-    TargetFunctionArgs args = {
-      thread_started_event,
-      finish_event,
-      stack_config
-    };
-    (*function)(&OtherLibraryCallback, &args);
-  }
-
-  // Volatile to prevent a tail call to GetProgramCounter().
-  const void* volatile program_counter = GetProgramCounter();
-  return program_counter;
-}
-
-// static
-void TargetThread::OtherLibraryCallback(void *arg) {
-  const TargetFunctionArgs* args = static_cast<TargetFunctionArgs*>(arg);
-  SignalAndWaitUntilSignaled(args->thread_started_event, args->finish_event,
-                             args->stack_config);
-  // Prevent tail call.
-  volatile int i = 0;
-  ALLOW_UNUSED_LOCAL(i);
-}
-
-// static
-// Disable inlining for this function so that it gets its own stack frame.
-NOINLINE const void* TargetThread::GetProgramCounter() {
-#if defined(OS_WIN)
-  return _ReturnAddress();
-#else
-  return __builtin_return_address(0);
-#endif
-}
-
-// Loads the other library, which defines a function to be called in the
-// WITH_OTHER_LIBRARY configuration.
-NativeLibrary LoadOtherLibrary() {
-  // The lambda gymnastics works around the fact that we can't use ASSERT_*
-  // macros in a function returning non-null.
-  const auto load = [](NativeLibrary* library) {
-    FilePath other_library_path;
-    ASSERT_TRUE(PathService::Get(DIR_EXE, &other_library_path));
-    other_library_path = other_library_path.AppendASCII(
-        GetNativeLibraryName("base_profiler_test_support_library"));
-    NativeLibraryLoadError load_error;
-    *library = LoadNativeLibrary(other_library_path, &load_error);
-    ASSERT_TRUE(*library) << "error loading " << other_library_path.value()
-                          << ": " << load_error.ToString();
-  };
-
-  NativeLibrary library = nullptr;
-  load(&library);
-  return library;
-}
-
-// Unloads |library| and returns when it has completed unloading. Unloading a
-// library is asynchronous on Windows, so simply calling UnloadNativeLibrary()
-// is insufficient to ensure it's been unloaded.
-void SynchronousUnloadNativeLibrary(NativeLibrary library) {
-  UnloadNativeLibrary(library);
-#if defined(OS_WIN)
-  // NativeLibrary is a typedef for HMODULE, which is actually the base address
-  // of the module.
-  uintptr_t module_base_address = reinterpret_cast<uintptr_t>(library);
-  HMODULE module_handle;
-  // Keep trying to get the module handle until the call fails.
-  while (::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
-                             GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
-                             reinterpret_cast<LPCTSTR>(module_base_address),
-                             &module_handle) ||
-         ::GetLastError() != ERROR_MOD_NOT_FOUND) {
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(1));
-  }
-#elif defined(OS_MACOSX)
-// Unloading a library on the Mac is synchronous.
-#else
-  NOTIMPLEMENTED();
-#endif
-}
-
-// Called on the profiler thread when complete, to collect profiles.
-void SaveProfiles(CallStackProfiles* profiles,
-                  CallStackProfiles pending_profiles) {
-  *profiles = std::move(pending_profiles);
-}
-
-// Called on the profiler thread when complete. Collects profiles produced by
-// the profiler, and signals an event to allow the main thread to know that that
-// the profiler is done.
-void SaveProfilesAndSignalEvent(CallStackProfiles* profiles,
-                                WaitableEvent* event,
-                                CallStackProfiles pending_profiles) {
-  *profiles = std::move(pending_profiles);
-  event->Signal();
-}
-
-// Executes the function with the target thread running and executing within
-// SignalAndWaitUntilSignaled(). Performs all necessary target thread startup
-// and shutdown work before and afterward.
-template <class Function>
-void WithTargetThread(Function function,
-                      const StackConfiguration& stack_config) {
-  TargetThread target_thread(stack_config);
-  PlatformThreadHandle target_thread_handle;
-  EXPECT_TRUE(PlatformThread::Create(0, &target_thread, &target_thread_handle));
-
-  target_thread.WaitForThreadStart();
-
-  function(target_thread.id());
-
-  target_thread.SignalThreadToFinish();
-
-  PlatformThread::Join(target_thread_handle);
-}
-
-template <class Function>
-void WithTargetThread(Function function) {
-  WithTargetThread(function, StackConfiguration(StackConfiguration::NORMAL));
-}
-
-struct TestProfilerInfo {
-  TestProfilerInfo(PlatformThreadId thread_id,
-                   const SamplingParams& params,
-                   NativeStackSamplerTestDelegate* delegate = nullptr)
-      : completed(WaitableEvent::ResetPolicy::MANUAL,
-                  WaitableEvent::InitialState::NOT_SIGNALED),
-        profiler(thread_id,
-                 params,
-                 Bind(&SaveProfilesAndSignalEvent,
-                      Unretained(&profiles),
-                      Unretained(&completed)),
-                 delegate) {}
-
-  // The order here is important to ensure objects being referenced don't get
-  // destructed until after the objects referencing them.
-  CallStackProfiles profiles;
-  WaitableEvent completed;
-  StackSamplingProfiler profiler;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestProfilerInfo);
-};
-
-// Creates multiple profilers based on a vector of parameters.
-std::vector<std::unique_ptr<TestProfilerInfo>> CreateProfilers(
-    PlatformThreadId target_thread_id,
-    const std::vector<SamplingParams>& params) {
-  DCHECK(!params.empty());
-
-  std::vector<std::unique_ptr<TestProfilerInfo>> profilers;
-  for (size_t i = 0; i < params.size(); ++i) {
-    profilers.push_back(
-        std::make_unique<TestProfilerInfo>(target_thread_id, params[i]));
-  }
-
-  return profilers;
-}
-
-// Captures profiles as specified by |params| on the TargetThread, and returns
-// them in |profiles|. Waits up to |profiler_wait_time| for the profiler to
-// complete.
-void CaptureProfiles(const SamplingParams& params, TimeDelta profiler_wait_time,
-                     CallStackProfiles* profiles) {
-  WithTargetThread([&params, profiles,
-                    profiler_wait_time](PlatformThreadId target_thread_id) {
-    TestProfilerInfo info(target_thread_id, params);
-    info.profiler.Start();
-    info.completed.TimedWait(profiler_wait_time);
-    info.profiler.Stop();
-    info.completed.Wait();
-
-    *profiles = std::move(info.profiles);
-  });
-}
-
-// Waits for one of multiple samplings to complete.
-size_t WaitForSamplingComplete(
-    const std::vector<std::unique_ptr<TestProfilerInfo>>& infos) {
-  // Map unique_ptrs to something that WaitMany can accept.
-  std::vector<WaitableEvent*> sampling_completed_rawptrs(infos.size());
-  std::transform(infos.begin(), infos.end(), sampling_completed_rawptrs.begin(),
-                 [](const std::unique_ptr<TestProfilerInfo>& info) {
-                   return &info.get()->completed;
-                 });
-  // Wait for one profiler to finish.
-  return WaitableEvent::WaitMany(sampling_completed_rawptrs.data(),
-                                 sampling_completed_rawptrs.size());
-}
-
-// If this executable was linked with /INCREMENTAL (the default for non-official
-// debug and release builds on Windows), function addresses do not correspond to
-// function code itself, but instead to instructions in the Incremental Link
-// Table that jump to the functions. Checks for a jump instruction and if
-// present does a little decompilation to find the function's actual starting
-// address.
-const void* MaybeFixupFunctionAddressForILT(const void* function_address) {
-#if defined(_WIN64)
-  const unsigned char* opcode =
-      reinterpret_cast<const unsigned char*>(function_address);
-  if (*opcode == 0xe9) {
-    // This is a relative jump instruction. Assume we're in the ILT and compute
-    // the function start address from the instruction offset.
-    const int32_t* offset = reinterpret_cast<const int32_t*>(opcode + 1);
-    const unsigned char* next_instruction =
-        reinterpret_cast<const unsigned char*>(offset + 1);
-    return next_instruction + *offset;
-  }
-#endif
-  return function_address;
-}
-
-// Searches through the frames in |sample|, returning an iterator to the first
-// frame that has an instruction pointer within |target_function|. Returns
-// sample.end() if no such frames are found.
-Frames::const_iterator FindFirstFrameWithinFunction(
-    const Sample& sample,
-    TargetFunction target_function) {
-  uintptr_t function_start = reinterpret_cast<uintptr_t>(
-      MaybeFixupFunctionAddressForILT(reinterpret_cast<const void*>(
-          target_function)));
-  uintptr_t function_end =
-      reinterpret_cast<uintptr_t>(target_function(nullptr, nullptr, nullptr));
-  for (auto it = sample.frames.begin(); it != sample.frames.end(); ++it) {
-    if ((it->instruction_pointer >= function_start) &&
-        (it->instruction_pointer <= function_end))
-      return it;
-  }
-  return sample.frames.end();
-}
-
-// Formats a sample into a string that can be output for test diagnostics.
-std::string FormatSampleForDiagnosticOutput(
-    const Sample& sample,
-    const std::vector<Module>& modules) {
-  std::string output;
-  for (const Frame& frame : sample.frames) {
-    output += StringPrintf(
-        "0x%p %s\n", reinterpret_cast<const void*>(frame.instruction_pointer),
-        modules[frame.module_index].filename.AsUTF8Unsafe().c_str());
-  }
-  return output;
-}
-
-// Returns a duration that is longer than the test timeout. We would use
-// TimeDelta::Max() but https://crbug.com/465948.
-TimeDelta AVeryLongTimeDelta() { return TimeDelta::FromDays(1); }
-
-// Tests the scenario where the library is unloaded after copying the stack, but
-// before walking it. If |wait_until_unloaded| is true, ensures that the
-// asynchronous library loading has completed before walking the stack. If
-// false, the unloading may still be occurring during the stack walk.
-void TestLibraryUnload(bool wait_until_unloaded) {
-  // Test delegate that supports intervening between the copying of the stack
-  // and the walking of the stack.
-  class StackCopiedSignaler : public NativeStackSamplerTestDelegate {
-   public:
-    StackCopiedSignaler(WaitableEvent* stack_copied,
-                        WaitableEvent* start_stack_walk,
-                        bool wait_to_walk_stack)
-        : stack_copied_(stack_copied),
-          start_stack_walk_(start_stack_walk),
-          wait_to_walk_stack_(wait_to_walk_stack) {}
-
-    void OnPreStackWalk() override {
-      stack_copied_->Signal();
-      if (wait_to_walk_stack_)
-        start_stack_walk_->Wait();
-    }
-
-   private:
-    WaitableEvent* const stack_copied_;
-    WaitableEvent* const start_stack_walk_;
-    const bool wait_to_walk_stack_;
-  };
-
-  SamplingParams params;
-  params.sampling_interval = TimeDelta::FromMilliseconds(0);
-  params.samples_per_burst = 1;
-
-  NativeLibrary other_library = LoadOtherLibrary();
-  TargetThread target_thread(StackConfiguration(
-      StackConfiguration::WITH_OTHER_LIBRARY,
-      other_library));
-
-  PlatformThreadHandle target_thread_handle;
-  EXPECT_TRUE(PlatformThread::Create(0, &target_thread, &target_thread_handle));
-
-  target_thread.WaitForThreadStart();
-
-  WaitableEvent sampling_thread_completed(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  std::vector<CallStackProfile> profiles;
-  const StackSamplingProfiler::CompletedCallback callback =
-      Bind(&SaveProfilesAndSignalEvent, Unretained(&profiles),
-           Unretained(&sampling_thread_completed));
-  WaitableEvent stack_copied(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent start_stack_walk(WaitableEvent::ResetPolicy::MANUAL,
-                                 WaitableEvent::InitialState::NOT_SIGNALED);
-  StackCopiedSignaler test_delegate(&stack_copied, &start_stack_walk,
-                                    wait_until_unloaded);
-  StackSamplingProfiler profiler(target_thread.id(), params, callback,
-                                 &test_delegate);
-
-  profiler.Start();
-
-  // Wait for the stack to be copied and the target thread to be resumed.
-  stack_copied.Wait();
-
-  // Cause the target thread to finish, so that it's no longer executing code in
-  // the library we're about to unload.
-  target_thread.SignalThreadToFinish();
-  PlatformThread::Join(target_thread_handle);
-
-  // Unload the library now that it's not being used.
-  if (wait_until_unloaded)
-    SynchronousUnloadNativeLibrary(other_library);
-  else
-    UnloadNativeLibrary(other_library);
-
-  // Let the stack walk commence after unloading the library, if we're waiting
-  // on that event.
-  start_stack_walk.Signal();
-
-  // Wait for the sampling thread to complete and fill out |profiles|.
-  sampling_thread_completed.Wait();
-
-  // Look up the sample.
-  ASSERT_EQ(1u, profiles.size());
-  const CallStackProfile& profile = profiles[0];
-  ASSERT_EQ(1u, profile.samples.size());
-  const Sample& sample = profile.samples[0];
-
-  // Check that the stack contains a frame for
-  // TargetThread::SignalAndWaitUntilSignaled().
-  Frames::const_iterator end_frame = FindFirstFrameWithinFunction(
-      sample, &TargetThread::SignalAndWaitUntilSignaled);
-  ASSERT_TRUE(end_frame != sample.frames.end())
-      << "Function at "
-      << MaybeFixupFunctionAddressForILT(reinterpret_cast<const void*>(
-             &TargetThread::SignalAndWaitUntilSignaled))
-      << " was not found in stack:\n"
-      << FormatSampleForDiagnosticOutput(sample, profile.modules);
-
-  if (wait_until_unloaded) {
-    // The stack should look like this, resulting one frame after
-    // SignalAndWaitUntilSignaled. The frame in the now-unloaded library is not
-    // recorded since we can't get module information.
-    //
-    // ... WaitableEvent and system frames ...
-    // TargetThread::SignalAndWaitUntilSignaled
-    // TargetThread::OtherLibraryCallback
-    EXPECT_EQ(2, sample.frames.end() - end_frame)
-        << "Stack:\n"
-        << FormatSampleForDiagnosticOutput(sample, profile.modules);
-  } else {
-    // We didn't wait for the asynchronous unloading to complete, so the results
-    // are non-deterministic: if the library finished unloading we should have
-    // the same stack as |wait_until_unloaded|, if not we should have the full
-    // stack. The important thing is that we should not crash.
-
-    if (sample.frames.end() - end_frame == 2) {
-      // This is the same case as |wait_until_unloaded|.
-      return;
-    }
-
-    // Check that the stack contains a frame for
-    // TargetThread::CallThroughOtherLibrary().
-    Frames::const_iterator other_library_frame = FindFirstFrameWithinFunction(
-        sample, &TargetThread::CallThroughOtherLibrary);
-    ASSERT_TRUE(other_library_frame != sample.frames.end())
-        << "Function at "
-        << MaybeFixupFunctionAddressForILT(reinterpret_cast<const void*>(
-               &TargetThread::CallThroughOtherLibrary))
-        << " was not found in stack:\n"
-        << FormatSampleForDiagnosticOutput(sample, profile.modules);
-
-    // The stack should look like this, resulting in three frames between
-    // SignalAndWaitUntilSignaled and CallThroughOtherLibrary:
-    //
-    // ... WaitableEvent and system frames ...
-    // TargetThread::SignalAndWaitUntilSignaled
-    // TargetThread::OtherLibraryCallback
-    // InvokeCallbackFunction (in other library)
-    // TargetThread::CallThroughOtherLibrary
-    EXPECT_EQ(3, other_library_frame - end_frame)
-        << "Stack:\n"
-        << FormatSampleForDiagnosticOutput(sample, profile.modules);
-  }
-}
-
-// Provide a suitable (and clean) environment for the tests below. All tests
-// must use this class to ensure that proper clean-up is done and thus be
-// usable in a later test.
-class StackSamplingProfilerTest : public testing::Test {
- public:
-  void SetUp() override {
-    // The idle-shutdown time is too long for convenient (and accurate) testing.
-    // That behavior is checked instead by artificially triggering it through
-    // the TestAPI.
-    StackSamplingProfiler::TestAPI::DisableIdleShutdown();
-  }
-
-  void TearDown() override {
-    // Be a good citizen and clean up after ourselves. This also re-enables the
-    // idle-shutdown behavior.
-    StackSamplingProfiler::TestAPI::Reset();
-  }
-};
-
-}  // namespace
-
-// Checks that the basic expected information is present in a sampled call stack
-// profile.
-// macOS ASAN is not yet supported - crbug.com/718628.
-#if !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX))
-#define MAYBE_Basic Basic
-#else
-#define MAYBE_Basic DISABLED_Basic
-#endif
-PROFILER_TEST_F(StackSamplingProfilerTest, MAYBE_Basic) {
-  SamplingParams params;
-  params.sampling_interval = TimeDelta::FromMilliseconds(0);
-  params.samples_per_burst = 1;
-
-  std::vector<CallStackProfile> profiles;
-  CaptureProfiles(params, AVeryLongTimeDelta(), &profiles);
-
-  // Check that the profile and samples sizes are correct, and the module
-  // indices are in range.
-  ASSERT_EQ(1u, profiles.size());
-  const CallStackProfile& profile = profiles[0];
-  ASSERT_EQ(1u, profile.samples.size());
-  EXPECT_EQ(params.sampling_interval, profile.sampling_period);
-  const Sample& sample = profile.samples[0];
-  EXPECT_EQ(0u, sample.process_milestones);
-  for (const auto& frame : sample.frames) {
-    ASSERT_GE(frame.module_index, 0u);
-    ASSERT_LT(frame.module_index, profile.modules.size());
-  }
-
-  // Check that the stack contains a frame for
-  // TargetThread::SignalAndWaitUntilSignaled() and that the frame has this
-  // executable's module.
-  Frames::const_iterator loc = FindFirstFrameWithinFunction(
-      sample, &TargetThread::SignalAndWaitUntilSignaled);
-  ASSERT_TRUE(loc != sample.frames.end())
-      << "Function at "
-      << MaybeFixupFunctionAddressForILT(reinterpret_cast<const void*>(
-             &TargetThread::SignalAndWaitUntilSignaled))
-      << " was not found in stack:\n"
-      << FormatSampleForDiagnosticOutput(sample, profile.modules);
-  FilePath executable_path;
-  EXPECT_TRUE(PathService::Get(FILE_EXE, &executable_path));
-  EXPECT_EQ(executable_path,
-            MakeAbsoluteFilePath(profile.modules[loc->module_index].filename));
-}
-
-// Checks that annotations are recorded in samples.
-PROFILER_TEST_F(StackSamplingProfilerTest, Annotations) {
-  SamplingParams params;
-  params.sampling_interval = TimeDelta::FromMilliseconds(0);
-  params.samples_per_burst = 1;
-
-  // Check that a run picks up annotations.
-  StackSamplingProfiler::SetProcessMilestone(1);
-  std::vector<CallStackProfile> profiles1;
-  CaptureProfiles(params, AVeryLongTimeDelta(), &profiles1);
-  ASSERT_EQ(1u, profiles1.size());
-  const CallStackProfile& profile1 = profiles1[0];
-  ASSERT_EQ(1u, profile1.samples.size());
-  const Sample& sample1 = profile1.samples[0];
-  EXPECT_EQ(1u << 1, sample1.process_milestones);
-
-  // Run it a second time but with changed annotations. These annotations
-  // should appear in the first acquired sample.
-  StackSamplingProfiler::SetProcessMilestone(2);
-  std::vector<CallStackProfile> profiles2;
-  CaptureProfiles(params, AVeryLongTimeDelta(), &profiles2);
-  ASSERT_EQ(1u, profiles2.size());
-  const CallStackProfile& profile2 = profiles2[0];
-  ASSERT_EQ(1u, profile2.samples.size());
-  const Sample& sample2 = profile2.samples[0];
-  EXPECT_EQ(sample1.process_milestones | (1u << 2), sample2.process_milestones);
-}
-
-// Checks that the profiler handles stacks containing dynamically-allocated
-// stack memory.
-// macOS ASAN is not yet supported - crbug.com/718628.
-#if !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX))
-#define MAYBE_Alloca Alloca
-#else
-#define MAYBE_Alloca DISABLED_Alloca
-#endif
-PROFILER_TEST_F(StackSamplingProfilerTest, MAYBE_Alloca) {
-  SamplingParams params;
-  params.sampling_interval = TimeDelta::FromMilliseconds(0);
-  params.samples_per_burst = 1;
-
-  std::vector<CallStackProfile> profiles;
-  WithTargetThread(
-      [&params, &profiles](PlatformThreadId target_thread_id) {
-        WaitableEvent sampling_thread_completed(
-            WaitableEvent::ResetPolicy::MANUAL,
-            WaitableEvent::InitialState::NOT_SIGNALED);
-        const StackSamplingProfiler::CompletedCallback callback =
-            Bind(&SaveProfilesAndSignalEvent, Unretained(&profiles),
-                 Unretained(&sampling_thread_completed));
-        StackSamplingProfiler profiler(target_thread_id, params, callback);
-        profiler.Start();
-        sampling_thread_completed.Wait();
-      },
-      StackConfiguration(StackConfiguration::WITH_ALLOCA));
-
-  // Look up the sample.
-  ASSERT_EQ(1u, profiles.size());
-  const CallStackProfile& profile = profiles[0];
-  ASSERT_EQ(1u, profile.samples.size());
-  const Sample& sample = profile.samples[0];
-
-  // Check that the stack contains a frame for
-  // TargetThread::SignalAndWaitUntilSignaled().
-  Frames::const_iterator end_frame = FindFirstFrameWithinFunction(
-      sample, &TargetThread::SignalAndWaitUntilSignaled);
-  ASSERT_TRUE(end_frame != sample.frames.end())
-      << "Function at "
-      << MaybeFixupFunctionAddressForILT(reinterpret_cast<const void*>(
-             &TargetThread::SignalAndWaitUntilSignaled))
-      << " was not found in stack:\n"
-      << FormatSampleForDiagnosticOutput(sample, profile.modules);
-
-  // Check that the stack contains a frame for TargetThread::CallWithAlloca().
-  Frames::const_iterator alloca_frame =
-      FindFirstFrameWithinFunction(sample, &TargetThread::CallWithAlloca);
-  ASSERT_TRUE(alloca_frame != sample.frames.end())
-      << "Function at "
-      << MaybeFixupFunctionAddressForILT(
-             reinterpret_cast<const void*>(&TargetThread::CallWithAlloca))
-      << " was not found in stack:\n"
-      << FormatSampleForDiagnosticOutput(sample, profile.modules);
-
-  // These frames should be adjacent on the stack.
-  EXPECT_EQ(1, alloca_frame - end_frame)
-      << "Stack:\n"
-      << FormatSampleForDiagnosticOutput(sample, profile.modules);
-}
-
-// Checks that the expected number of profiles and samples are present in the
-// call stack profiles produced.
-PROFILER_TEST_F(StackSamplingProfilerTest, MultipleProfilesAndSamples) {
-  SamplingParams params;
-  params.burst_interval = params.sampling_interval =
-      TimeDelta::FromMilliseconds(0);
-  params.bursts = 2;
-  params.samples_per_burst = 3;
-
-  std::vector<CallStackProfile> profiles;
-  CaptureProfiles(params, AVeryLongTimeDelta(), &profiles);
-
-  ASSERT_EQ(2u, profiles.size());
-  EXPECT_EQ(3u, profiles[0].samples.size());
-  EXPECT_EQ(3u, profiles[1].samples.size());
-}
-
-// Checks that a profiler can stop/destruct without ever having started.
-PROFILER_TEST_F(StackSamplingProfilerTest, StopWithoutStarting) {
-  WithTargetThread([](PlatformThreadId target_thread_id) {
-    SamplingParams params;
-    params.sampling_interval = TimeDelta::FromMilliseconds(0);
-    params.samples_per_burst = 1;
-
-    CallStackProfiles profiles;
-    WaitableEvent sampling_completed(WaitableEvent::ResetPolicy::MANUAL,
-                                     WaitableEvent::InitialState::NOT_SIGNALED);
-    const StackSamplingProfiler::CompletedCallback callback =
-        Bind(&SaveProfilesAndSignalEvent, Unretained(&profiles),
-             Unretained(&sampling_completed));
-    StackSamplingProfiler profiler(target_thread_id, params, callback);
-
-    profiler.Stop();  // Constructed but never started.
-    EXPECT_FALSE(sampling_completed.IsSignaled());
-  });
-}
-
-// Checks that its okay to stop a profiler before it finishes even when the
-// sampling thread continues to run.
-PROFILER_TEST_F(StackSamplingProfilerTest, StopSafely) {
-  // Test delegate that counts samples.
-  class SampleRecordedCounter : public NativeStackSamplerTestDelegate {
-   public:
-    SampleRecordedCounter() = default;
-
-    void OnPreStackWalk() override {
-      AutoLock lock(lock_);
-      ++count_;
-    }
-
-    size_t Get() {
-      AutoLock lock(lock_);
-      return count_;
-    }
-
-   private:
-    Lock lock_;
-    size_t count_ = 0;
-  };
-
-  WithTargetThread([](PlatformThreadId target_thread_id) {
-    SamplingParams params[2];
-
-    // Providing an initial delay makes it more likely that both will be
-    // scheduled before either starts to run. Once started, samples will
-    // run ordered by their scheduled, interleaved times regardless of
-    // whatever interval the thread wakes up.
-    params[0].initial_delay = TimeDelta::FromMilliseconds(10);
-    params[0].sampling_interval = TimeDelta::FromMilliseconds(1);
-    params[0].samples_per_burst = 100000;
-
-    params[1].initial_delay = TimeDelta::FromMilliseconds(10);
-    params[1].sampling_interval = TimeDelta::FromMilliseconds(1);
-    params[1].samples_per_burst = 100000;
-
-    SampleRecordedCounter samples_recorded[arraysize(params)];
-
-    TestProfilerInfo profiler_info0(target_thread_id, params[0],
-                                    &samples_recorded[0]);
-    TestProfilerInfo profiler_info1(target_thread_id, params[1],
-                                    &samples_recorded[1]);
-
-    profiler_info0.profiler.Start();
-    profiler_info1.profiler.Start();
-
-    // Wait for both to start accumulating samples. Using a WaitableEvent is
-    // possible but gets complicated later on because there's no way of knowing
-    // if 0 or 1 additional sample will be taken after Stop() and thus no way
-    // of knowing how many Wait() calls to make on it.
-    while (samples_recorded[0].Get() == 0 || samples_recorded[1].Get() == 0)
-      PlatformThread::Sleep(TimeDelta::FromMilliseconds(1));
-
-    // Ensure that the first sampler can be safely stopped while the second
-    // continues to run. The stopped first profiler will still have a
-    // PerformCollectionTask pending that will do nothing when executed because
-    // the collection will have been removed by Stop().
-    profiler_info0.profiler.Stop();
-    profiler_info0.completed.Wait();
-    size_t count0 = samples_recorded[0].Get();
-    size_t count1 = samples_recorded[1].Get();
-
-    // Waiting for the second sampler to collect a couple samples ensures that
-    // the pending PerformCollectionTask for the first has executed because
-    // tasks are always ordered by their next scheduled time.
-    while (samples_recorded[1].Get() < count1 + 2)
-      PlatformThread::Sleep(TimeDelta::FromMilliseconds(1));
-
-    // Ensure that the first profiler didn't do anything since it was stopped.
-    EXPECT_EQ(count0, samples_recorded[0].Get());
-  });
-}
-
-// Checks that no call stack profiles are captured if the profiling is stopped
-// during the initial delay.
-PROFILER_TEST_F(StackSamplingProfilerTest, StopDuringInitialDelay) {
-  SamplingParams params;
-  params.initial_delay = TimeDelta::FromSeconds(60);
-
-  std::vector<CallStackProfile> profiles;
-  CaptureProfiles(params, TimeDelta::FromMilliseconds(0), &profiles);
-
-  EXPECT_TRUE(profiles.empty());
-}
-
-// Checks that the single completed call stack profile is captured if the
-// profiling is stopped between bursts.
-PROFILER_TEST_F(StackSamplingProfilerTest, StopDuringInterBurstInterval) {
-  SamplingParams params;
-  params.sampling_interval = TimeDelta::FromMilliseconds(0);
-  params.burst_interval = TimeDelta::FromSeconds(60);
-  params.bursts = 2;
-  params.samples_per_burst = 1;
-
-  std::vector<CallStackProfile> profiles;
-  CaptureProfiles(params, TimeDelta::FromMilliseconds(50), &profiles);
-
-  ASSERT_EQ(1u, profiles.size());
-  EXPECT_EQ(1u, profiles[0].samples.size());
-}
-
-// Checks that tasks can be stopped before completion and incomplete call stack
-// profiles are captured.
-PROFILER_TEST_F(StackSamplingProfilerTest, StopDuringInterSampleInterval) {
-  // Test delegate that counts samples.
-  class SampleRecordedEvent : public NativeStackSamplerTestDelegate {
-   public:
-    SampleRecordedEvent()
-        : sample_recorded_(WaitableEvent::ResetPolicy::MANUAL,
-                           WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-    void OnPreStackWalk() override { sample_recorded_.Signal(); }
-
-    void WaitForSample() { sample_recorded_.Wait(); }
-
-   private:
-    WaitableEvent sample_recorded_;
-  };
-
-  WithTargetThread([](PlatformThreadId target_thread_id) {
-    SamplingParams params;
-
-    params.sampling_interval = AVeryLongTimeDelta();
-    params.samples_per_burst = 2;
-
-    SampleRecordedEvent samples_recorded;
-    TestProfilerInfo profiler_info(target_thread_id, params, &samples_recorded);
-
-    profiler_info.profiler.Start();
-
-    // Wait for profiler to start accumulating samples.
-    samples_recorded.WaitForSample();
-
-    // Ensure that it can stop safely.
-    profiler_info.profiler.Stop();
-    profiler_info.completed.Wait();
-
-    ASSERT_EQ(1u, profiler_info.profiles.size());
-    EXPECT_EQ(1u, profiler_info.profiles[0].samples.size());
-  });
-}
-
-// Checks that we can destroy the profiler while profiling.
-PROFILER_TEST_F(StackSamplingProfilerTest, DestroyProfilerWhileProfiling) {
-  SamplingParams params;
-  params.sampling_interval = TimeDelta::FromMilliseconds(10);
-
-  CallStackProfiles profiles;
-  WithTargetThread([&params, &profiles](PlatformThreadId target_thread_id) {
-    std::unique_ptr<StackSamplingProfiler> profiler;
-    profiler.reset(new StackSamplingProfiler(
-        target_thread_id, params, Bind(&SaveProfiles, Unretained(&profiles))));
-    profiler->Start();
-    profiler.reset();
-
-    // Wait longer than a sample interval to catch any use-after-free actions by
-    // the profiler thread.
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(50));
-  });
-}
-
-// Checks that the same profiler may be run multiple times.
-PROFILER_TEST_F(StackSamplingProfilerTest, CanRunMultipleTimes) {
-  WithTargetThread([](PlatformThreadId target_thread_id) {
-    SamplingParams params;
-    params.sampling_interval = TimeDelta::FromMilliseconds(0);
-    params.samples_per_burst = 1;
-
-    CallStackProfiles profiles;
-    WaitableEvent sampling_completed(WaitableEvent::ResetPolicy::MANUAL,
-                                     WaitableEvent::InitialState::NOT_SIGNALED);
-    const StackSamplingProfiler::CompletedCallback callback =
-        Bind(&SaveProfilesAndSignalEvent, Unretained(&profiles),
-             Unretained(&sampling_completed));
-    StackSamplingProfiler profiler(target_thread_id, params, callback);
-
-    // Just start and stop to execute code paths.
-    profiler.Start();
-    profiler.Stop();
-    sampling_completed.Wait();
-
-    // Ensure a second request will run and not block.
-    sampling_completed.Reset();
-    profiles.clear();
-    profiler.Start();
-    sampling_completed.Wait();
-    profiler.Stop();
-    ASSERT_EQ(1u, profiles.size());
-  });
-}
-
-// Checks that the different profilers may be run.
-PROFILER_TEST_F(StackSamplingProfilerTest, CanRunMultipleProfilers) {
-  SamplingParams params;
-  params.sampling_interval = TimeDelta::FromMilliseconds(0);
-  params.samples_per_burst = 1;
-
-  std::vector<CallStackProfile> profiles;
-  CaptureProfiles(params, AVeryLongTimeDelta(), &profiles);
-  ASSERT_EQ(1u, profiles.size());
-
-  profiles.clear();
-  CaptureProfiles(params, AVeryLongTimeDelta(), &profiles);
-  ASSERT_EQ(1u, profiles.size());
-}
-
-// Checks that a sampler can be started while another is running.
-PROFILER_TEST_F(StackSamplingProfilerTest, MultipleStart) {
-  WithTargetThread([](PlatformThreadId target_thread_id) {
-    std::vector<SamplingParams> params(2);
-
-    params[0].initial_delay = AVeryLongTimeDelta();
-    params[0].samples_per_burst = 1;
-
-    params[1].sampling_interval = TimeDelta::FromMilliseconds(1);
-    params[1].samples_per_burst = 1;
-
-    std::vector<std::unique_ptr<TestProfilerInfo>> profiler_infos =
-        CreateProfilers(target_thread_id, params);
-
-    profiler_infos[0]->profiler.Start();
-    profiler_infos[1]->profiler.Start();
-    profiler_infos[1]->completed.Wait();
-    EXPECT_EQ(1u, profiler_infos[1]->profiles.size());
-  });
-}
-
-// Checks that the sampling thread can shut down.
-PROFILER_TEST_F(StackSamplingProfilerTest, SamplerIdleShutdown) {
-  SamplingParams params;
-  params.sampling_interval = TimeDelta::FromMilliseconds(0);
-  params.samples_per_burst = 1;
-
-  std::vector<CallStackProfile> profiles;
-  CaptureProfiles(params, AVeryLongTimeDelta(), &profiles);
-  ASSERT_EQ(1u, profiles.size());
-
-  // Capture thread should still be running at this point.
-  ASSERT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning());
-
-  // Initiate an "idle" shutdown and ensure it happens. Idle-shutdown was
-  // disabled by the test fixture so the test will fail due to a timeout if
-  // it does not exit.
-  StackSamplingProfiler::TestAPI::PerformSamplingThreadIdleShutdown(false);
-
-  // While the shutdown has been initiated, the actual exit of the thread still
-  // happens asynchronously. Watch until the thread actually exits. This test
-  // will time-out in the case of failure.
-  while (StackSamplingProfiler::TestAPI::IsSamplingThreadRunning())
-    PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
-}
-
-// Checks that additional requests will restart a stopped profiler.
-PROFILER_TEST_F(StackSamplingProfilerTest,
-                WillRestartSamplerAfterIdleShutdown) {
-  SamplingParams params;
-  params.sampling_interval = TimeDelta::FromMilliseconds(0);
-  params.samples_per_burst = 1;
-
-  std::vector<CallStackProfile> profiles;
-  CaptureProfiles(params, AVeryLongTimeDelta(), &profiles);
-  ASSERT_EQ(1u, profiles.size());
-
-  // Capture thread should still be running at this point.
-  ASSERT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning());
-
-  // Post a ShutdownTask on the sampling thread which, when executed, will
-  // mark the thread as EXITING and begin shut down of the thread.
-  StackSamplingProfiler::TestAPI::PerformSamplingThreadIdleShutdown(false);
-
-  // Ensure another capture will start the sampling thread and run.
-  profiles.clear();
-  CaptureProfiles(params, AVeryLongTimeDelta(), &profiles);
-  ASSERT_EQ(1u, profiles.size());
-  EXPECT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning());
-}
-
-// Checks that it's safe to stop a task after it's completed and the sampling
-// thread has shut-down for being idle.
-PROFILER_TEST_F(StackSamplingProfilerTest, StopAfterIdleShutdown) {
-  WithTargetThread([](PlatformThreadId target_thread_id) {
-    SamplingParams params;
-
-    params.sampling_interval = TimeDelta::FromMilliseconds(1);
-    params.samples_per_burst = 1;
-
-    TestProfilerInfo profiler_info(target_thread_id, params);
-
-    profiler_info.profiler.Start();
-    profiler_info.completed.Wait();
-
-    // Capture thread should still be running at this point.
-    ASSERT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning());
-
-    // Perform an idle shutdown.
-    StackSamplingProfiler::TestAPI::PerformSamplingThreadIdleShutdown(false);
-
-    // Stop should be safe though its impossible to know at this moment if the
-    // sampling thread has completely exited or will just "stop soon".
-    profiler_info.profiler.Stop();
-  });
-}
-
-// Checks that profilers can run both before and after the sampling thread has
-// started.
-PROFILER_TEST_F(StackSamplingProfilerTest,
-                ProfileBeforeAndAfterSamplingThreadRunning) {
-  WithTargetThread([](PlatformThreadId target_thread_id) {
-    std::vector<SamplingParams> params(2);
-
-    params[0].initial_delay = AVeryLongTimeDelta();
-    params[0].sampling_interval = TimeDelta::FromMilliseconds(1);
-    params[0].samples_per_burst = 1;
-
-    params[1].initial_delay = TimeDelta::FromMilliseconds(0);
-    params[1].sampling_interval = TimeDelta::FromMilliseconds(1);
-    params[1].samples_per_burst = 1;
-
-    std::vector<std::unique_ptr<TestProfilerInfo>> profiler_infos =
-        CreateProfilers(target_thread_id, params);
-
-    // First profiler is started when there has never been a sampling thread.
-    EXPECT_FALSE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning());
-    profiler_infos[0]->profiler.Start();
-    // Second profiler is started when sampling thread is already running.
-    EXPECT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning());
-    profiler_infos[1]->profiler.Start();
-
-    // Only the second profiler should finish before test times out.
-    size_t completed_profiler = WaitForSamplingComplete(profiler_infos);
-    EXPECT_EQ(1U, completed_profiler);
-  });
-}
-
-// Checks that an idle-shutdown task will abort if a new profiler starts
-// between when it was posted and when it runs.
-PROFILER_TEST_F(StackSamplingProfilerTest, IdleShutdownAbort) {
-  WithTargetThread([](PlatformThreadId target_thread_id) {
-    SamplingParams params;
-
-    params.sampling_interval = TimeDelta::FromMilliseconds(1);
-    params.samples_per_burst = 1;
-
-    TestProfilerInfo profiler_info(target_thread_id, params);
-
-    profiler_info.profiler.Start();
-    profiler_info.completed.Wait();
-    EXPECT_EQ(1u, profiler_info.profiles.size());
-
-    // Perform an idle shutdown but simulate that a new capture is started
-    // before it can actually run.
-    StackSamplingProfiler::TestAPI::PerformSamplingThreadIdleShutdown(true);
-
-    // Though the shutdown-task has been executed, any actual exit of the
-    // thread is asynchronous so there is no way to detect that *didn't* exit
-    // except to wait a reasonable amount of time and then check. Since the
-    // thread was just running ("perform" blocked until it was), it should
-    // finish almost immediately and without any waiting for tasks or events.
-    PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(200));
-    EXPECT_TRUE(StackSamplingProfiler::TestAPI::IsSamplingThreadRunning());
-
-    // Ensure that it's still possible to run another sampler.
-    TestProfilerInfo another_info(target_thread_id, params);
-    another_info.profiler.Start();
-    another_info.completed.Wait();
-    EXPECT_EQ(1u, another_info.profiles.size());
-  });
-}
-
-// Checks that synchronized multiple sampling requests execute in parallel.
-PROFILER_TEST_F(StackSamplingProfilerTest, ConcurrentProfiling_InSync) {
-  WithTargetThread([](PlatformThreadId target_thread_id) {
-    std::vector<SamplingParams> params(2);
-
-    // Providing an initial delay makes it more likely that both will be
-    // scheduled before either starts to run. Once started, samples will
-    // run ordered by their scheduled, interleaved times regardless of
-    // whatever interval the thread wakes up. Thus, total execution time
-    // will be 10ms (delay) + 10x1ms (sampling) + 1/2 timer minimum interval.
-    params[0].initial_delay = TimeDelta::FromMilliseconds(10);
-    params[0].sampling_interval = TimeDelta::FromMilliseconds(1);
-    params[0].samples_per_burst = 9;
-
-    params[1].initial_delay = TimeDelta::FromMilliseconds(11);
-    params[1].sampling_interval = TimeDelta::FromMilliseconds(1);
-    params[1].samples_per_burst = 8;
-
-    std::vector<std::unique_ptr<TestProfilerInfo>> profiler_infos =
-        CreateProfilers(target_thread_id, params);
-
-    profiler_infos[0]->profiler.Start();
-    profiler_infos[1]->profiler.Start();
-
-    // Wait for one profiler to finish.
-    size_t completed_profiler = WaitForSamplingComplete(profiler_infos);
-    ASSERT_EQ(1u, profiler_infos[completed_profiler]->profiles.size());
-
-    size_t other_profiler = 1 - completed_profiler;
-    // Wait for the other profiler to finish.
-    profiler_infos[other_profiler]->completed.Wait();
-    ASSERT_EQ(1u, profiler_infos[other_profiler]->profiles.size());
-
-    // Ensure each got the correct number of samples.
-    EXPECT_EQ(9u, profiler_infos[0]->profiles[0].samples.size());
-    EXPECT_EQ(8u, profiler_infos[1]->profiles[0].samples.size());
-  });
-}
-
-// Checks that several mixed sampling requests execute in parallel.
-PROFILER_TEST_F(StackSamplingProfilerTest, ConcurrentProfiling_Mixed) {
-  WithTargetThread([](PlatformThreadId target_thread_id) {
-    std::vector<SamplingParams> params(3);
-
-    params[0].initial_delay = TimeDelta::FromMilliseconds(8);
-    params[0].sampling_interval = TimeDelta::FromMilliseconds(4);
-    params[0].samples_per_burst = 10;
-
-    params[1].initial_delay = TimeDelta::FromMilliseconds(9);
-    params[1].sampling_interval = TimeDelta::FromMilliseconds(3);
-    params[1].samples_per_burst = 10;
-
-    params[2].initial_delay = TimeDelta::FromMilliseconds(10);
-    params[2].sampling_interval = TimeDelta::FromMilliseconds(2);
-    params[2].samples_per_burst = 10;
-
-    std::vector<std::unique_ptr<TestProfilerInfo>> profiler_infos =
-        CreateProfilers(target_thread_id, params);
-
-    for (size_t i = 0; i < profiler_infos.size(); ++i)
-      profiler_infos[i]->profiler.Start();
-
-    // Wait for one profiler to finish.
-    size_t completed_profiler = WaitForSamplingComplete(profiler_infos);
-    EXPECT_EQ(1u, profiler_infos[completed_profiler]->profiles.size());
-    // Stop and destroy all profilers, always in the same order. Don't crash.
-    for (size_t i = 0; i < profiler_infos.size(); ++i)
-      profiler_infos[i]->profiler.Stop();
-    for (size_t i = 0; i < profiler_infos.size(); ++i)
-      profiler_infos[i].reset();
-  });
-}
-
-// Checks that a stack that runs through another library produces a stack with
-// the expected functions.
-// macOS ASAN is not yet supported - crbug.com/718628.
-#if !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX))
-#define MAYBE_OtherLibrary OtherLibrary
-#else
-#define MAYBE_OtherLibrary DISABLED_OtherLibrary
-#endif
-PROFILER_TEST_F(StackSamplingProfilerTest, MAYBE_OtherLibrary) {
-  SamplingParams params;
-  params.sampling_interval = TimeDelta::FromMilliseconds(0);
-  params.samples_per_burst = 1;
-
-  std::vector<CallStackProfile> profiles;
-  {
-    ScopedNativeLibrary other_library(LoadOtherLibrary());
-    WithTargetThread(
-        [&params, &profiles](PlatformThreadId target_thread_id) {
-          WaitableEvent sampling_thread_completed(
-              WaitableEvent::ResetPolicy::MANUAL,
-              WaitableEvent::InitialState::NOT_SIGNALED);
-          const StackSamplingProfiler::CompletedCallback callback =
-              Bind(&SaveProfilesAndSignalEvent, Unretained(&profiles),
-                   Unretained(&sampling_thread_completed));
-          StackSamplingProfiler profiler(target_thread_id, params, callback);
-          profiler.Start();
-          sampling_thread_completed.Wait();
-        },
-        StackConfiguration(StackConfiguration::WITH_OTHER_LIBRARY,
-                           other_library.get()));
-  }
-
-  // Look up the sample.
-  ASSERT_EQ(1u, profiles.size());
-  const CallStackProfile& profile = profiles[0];
-  ASSERT_EQ(1u, profile.samples.size());
-  const Sample& sample = profile.samples[0];
-
-  // Check that the stack contains a frame for
-  // TargetThread::CallThroughOtherLibrary().
-  Frames::const_iterator other_library_frame = FindFirstFrameWithinFunction(
-      sample, &TargetThread::CallThroughOtherLibrary);
-  ASSERT_TRUE(other_library_frame != sample.frames.end())
-      << "Function at "
-      << MaybeFixupFunctionAddressForILT(reinterpret_cast<const void*>(
-             &TargetThread::CallThroughOtherLibrary))
-      << " was not found in stack:\n"
-      << FormatSampleForDiagnosticOutput(sample, profile.modules);
-
-  // Check that the stack contains a frame for
-  // TargetThread::SignalAndWaitUntilSignaled().
-  Frames::const_iterator end_frame = FindFirstFrameWithinFunction(
-      sample, &TargetThread::SignalAndWaitUntilSignaled);
-  ASSERT_TRUE(end_frame != sample.frames.end())
-      << "Function at "
-      << MaybeFixupFunctionAddressForILT(reinterpret_cast<const void*>(
-             &TargetThread::SignalAndWaitUntilSignaled))
-      << " was not found in stack:\n"
-      << FormatSampleForDiagnosticOutput(sample, profile.modules);
-
-  // The stack should look like this, resulting in three frames between
-  // SignalAndWaitUntilSignaled and CallThroughOtherLibrary:
-  //
-  // ... WaitableEvent and system frames ...
-  // TargetThread::SignalAndWaitUntilSignaled
-  // TargetThread::OtherLibraryCallback
-  // InvokeCallbackFunction (in other library)
-  // TargetThread::CallThroughOtherLibrary
-  EXPECT_EQ(3, other_library_frame - end_frame)
-      << "Stack:\n" << FormatSampleForDiagnosticOutput(sample, profile.modules);
-}
-
-// Checks that a stack that runs through a library that is unloading produces a
-// stack, and doesn't crash.
-// Unloading is synchronous on the Mac, so this test is inapplicable.
-#if !defined(OS_MACOSX)
-#define MAYBE_UnloadingLibrary UnloadingLibrary
-#else
-#define MAYBE_UnloadingLibrary DISABLED_UnloadingLibrary
-#endif
-PROFILER_TEST_F(StackSamplingProfilerTest, MAYBE_UnloadingLibrary) {
-  TestLibraryUnload(false);
-}
-
-// Checks that a stack that runs through a library that has been unloaded
-// produces a stack, and doesn't crash.
-// macOS ASAN is not yet supported - crbug.com/718628.
-#if !(defined(ADDRESS_SANITIZER) && defined(OS_MACOSX))
-#define MAYBE_UnloadedLibrary UnloadedLibrary
-#else
-#define MAYBE_UnloadedLibrary DISABLED_UnloadedLibrary
-#endif
-PROFILER_TEST_F(StackSamplingProfilerTest, MAYBE_UnloadedLibrary) {
-  TestLibraryUnload(true);
-}
-
-// Checks that different threads can be sampled in parallel.
-PROFILER_TEST_F(StackSamplingProfilerTest, MultipleSampledThreads) {
-  // Create target threads. The extra parethesis around the StackConfiguration
-  // call are to avoid the most-vexing-parse problem.
-  TargetThread target_thread1((StackConfiguration(StackConfiguration::NORMAL)));
-  TargetThread target_thread2((StackConfiguration(StackConfiguration::NORMAL)));
-  PlatformThreadHandle target_thread_handle1, target_thread_handle2;
-  EXPECT_TRUE(
-      PlatformThread::Create(0, &target_thread1, &target_thread_handle1));
-  EXPECT_TRUE(
-      PlatformThread::Create(0, &target_thread2, &target_thread_handle2));
-  target_thread1.WaitForThreadStart();
-  target_thread2.WaitForThreadStart();
-
-  // Providing an initial delay makes it more likely that both will be
-  // scheduled before either starts to run. Once started, samples will
-  // run ordered by their scheduled, interleaved times regardless of
-  // whatever interval the thread wakes up.
-  SamplingParams params1, params2;
-  params1.initial_delay = TimeDelta::FromMilliseconds(10);
-  params1.sampling_interval = TimeDelta::FromMilliseconds(1);
-  params1.samples_per_burst = 9;
-  params2.initial_delay = TimeDelta::FromMilliseconds(10);
-  params2.sampling_interval = TimeDelta::FromMilliseconds(1);
-  params2.samples_per_burst = 8;
-
-  std::vector<CallStackProfile> profiles1, profiles2;
-
-  WaitableEvent sampling_thread_completed1(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  const StackSamplingProfiler::CompletedCallback callback1 =
-      Bind(&SaveProfilesAndSignalEvent, Unretained(&profiles1),
-           Unretained(&sampling_thread_completed1));
-  StackSamplingProfiler profiler1(target_thread1.id(), params1, callback1);
-
-  WaitableEvent sampling_thread_completed2(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  const StackSamplingProfiler::CompletedCallback callback2 =
-      Bind(&SaveProfilesAndSignalEvent, Unretained(&profiles2),
-           Unretained(&sampling_thread_completed2));
-  StackSamplingProfiler profiler2(target_thread2.id(), params2, callback2);
-
-  // Finally the real work.
-  profiler1.Start();
-  profiler2.Start();
-  sampling_thread_completed1.Wait();
-  sampling_thread_completed2.Wait();
-  ASSERT_EQ(1u, profiles1.size());
-  EXPECT_EQ(9u, profiles1[0].samples.size());
-  ASSERT_EQ(1u, profiles2.size());
-  EXPECT_EQ(8u, profiles2[0].samples.size());
-
-  target_thread1.SignalThreadToFinish();
-  target_thread2.SignalThreadToFinish();
-  PlatformThread::Join(target_thread_handle1);
-  PlatformThread::Join(target_thread_handle2);
-}
-
-// A simple thread that runs a profiler on another thread.
-class ProfilerThread : public SimpleThread {
- public:
-  ProfilerThread(const std::string& name,
-                 PlatformThreadId thread_id,
-                 const SamplingParams& params)
-      : SimpleThread(name, Options()),
-        run_(WaitableEvent::ResetPolicy::MANUAL,
-             WaitableEvent::InitialState::NOT_SIGNALED),
-        completed_(WaitableEvent::ResetPolicy::MANUAL,
-                   WaitableEvent::InitialState::NOT_SIGNALED),
-        profiler_(thread_id,
-                  params,
-                  Bind(&SaveProfilesAndSignalEvent,
-                       Unretained(&profiles_),
-                       Unretained(&completed_))) {}
-
-  void Run() override {
-    run_.Wait();
-    profiler_.Start();
-  }
-
-  void Go() { run_.Signal(); }
-
-  void Wait() { completed_.Wait(); }
-
-  CallStackProfiles& profiles() { return profiles_; }
-
- private:
-  WaitableEvent run_;
-
-  CallStackProfiles profiles_;
-  WaitableEvent completed_;
-  StackSamplingProfiler profiler_;
-};
-
-// Checks that different threads can run samplers in parallel.
-PROFILER_TEST_F(StackSamplingProfilerTest, MultipleProfilerThreads) {
-  WithTargetThread([](PlatformThreadId target_thread_id) {
-    // Providing an initial delay makes it more likely that both will be
-    // scheduled before either starts to run. Once started, samples will
-    // run ordered by their scheduled, interleaved times regardless of
-    // whatever interval the thread wakes up.
-    SamplingParams params1, params2;
-    params1.initial_delay = TimeDelta::FromMilliseconds(10);
-    params1.sampling_interval = TimeDelta::FromMilliseconds(1);
-    params1.samples_per_burst = 9;
-    params2.initial_delay = TimeDelta::FromMilliseconds(10);
-    params2.sampling_interval = TimeDelta::FromMilliseconds(1);
-    params2.samples_per_burst = 8;
-
-    // Start the profiler threads and give them a moment to get going.
-    ProfilerThread profiler_thread1("profiler1", target_thread_id, params1);
-    ProfilerThread profiler_thread2("profiler2", target_thread_id, params2);
-    profiler_thread1.Start();
-    profiler_thread2.Start();
-    PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
-
-    // This will (approximately) synchronize the two threads.
-    profiler_thread1.Go();
-    profiler_thread2.Go();
-
-    // Wait for them both to finish and validate collection.
-    profiler_thread1.Wait();
-    profiler_thread2.Wait();
-    ASSERT_EQ(1u, profiler_thread1.profiles().size());
-    EXPECT_EQ(9u, profiler_thread1.profiles()[0].samples.size());
-    ASSERT_EQ(1u, profiler_thread2.profiles().size());
-    EXPECT_EQ(8u, profiler_thread2.profiles()[0].samples.size());
-
-    profiler_thread1.Join();
-    profiler_thread2.Join();
-  });
-}
-
-}  // namespace base
diff --git a/base/profiler/win32_stack_frame_unwinder_unittest.cc b/base/profiler/win32_stack_frame_unwinder_unittest.cc
deleted file mode 100644
index cecfe22..0000000
--- a/base/profiler/win32_stack_frame_unwinder_unittest.cc
+++ /dev/null
@@ -1,223 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/profiler/win32_stack_frame_unwinder.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class TestUnwindFunctions : public Win32StackFrameUnwinder::UnwindFunctions {
- public:
-  TestUnwindFunctions();
-
-  PRUNTIME_FUNCTION LookupFunctionEntry(DWORD64 program_counter,
-                                        PDWORD64 image_base) override;
-  void VirtualUnwind(DWORD64 image_base,
-                     DWORD64 program_counter,
-                     PRUNTIME_FUNCTION runtime_function,
-                     CONTEXT* context) override;
-  ScopedModuleHandle GetModuleForProgramCounter(
-      DWORD64 program_counter) override;
-
-  // Instructs GetModuleForProgramCounter to return null on the next call.
-  void SetUnloadedModule();
-
-  // These functions set whether the next frame will have a RUNTIME_FUNCTION.
-  void SetHasRuntimeFunction(CONTEXT* context);
-  void SetNoRuntimeFunction(CONTEXT* context);
-
- private:
-  enum { kImageBaseIncrement = 1 << 20 };
-
-  static RUNTIME_FUNCTION* const kInvalidRuntimeFunction;
-
-  bool module_is_loaded_;
-  DWORD64 expected_program_counter_;
-  DWORD64 next_image_base_;
-  DWORD64 expected_image_base_;
-  RUNTIME_FUNCTION* next_runtime_function_;
-  std::vector<RUNTIME_FUNCTION> runtime_functions_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestUnwindFunctions);
-};
-
-RUNTIME_FUNCTION* const TestUnwindFunctions::kInvalidRuntimeFunction =
-    reinterpret_cast<RUNTIME_FUNCTION*>(static_cast<uintptr_t>(-1));
-
-TestUnwindFunctions::TestUnwindFunctions()
-    : module_is_loaded_(true),
-      expected_program_counter_(0),
-      next_image_base_(kImageBaseIncrement),
-      expected_image_base_(0),
-      next_runtime_function_(kInvalidRuntimeFunction) {
-}
-
-PRUNTIME_FUNCTION TestUnwindFunctions::LookupFunctionEntry(
-    DWORD64 program_counter,
-    PDWORD64 image_base) {
-  EXPECT_EQ(expected_program_counter_, program_counter);
-  *image_base = expected_image_base_ = next_image_base_;
-  next_image_base_ += kImageBaseIncrement;
-  RUNTIME_FUNCTION* return_value = next_runtime_function_;
-  next_runtime_function_ = kInvalidRuntimeFunction;
-  return return_value;
-}
-
-void TestUnwindFunctions::VirtualUnwind(DWORD64 image_base,
-                                        DWORD64 program_counter,
-                                        PRUNTIME_FUNCTION runtime_function,
-                                        CONTEXT* context) {
-  ASSERT_NE(kInvalidRuntimeFunction, runtime_function)
-      << "expected call to SetHasRuntimeFunction() or SetNoRuntimeFunction() "
-      << "before invoking TryUnwind()";
-  EXPECT_EQ(expected_image_base_, image_base);
-  expected_image_base_ = 0;
-  EXPECT_EQ(expected_program_counter_, program_counter);
-  expected_program_counter_ = 0;
-  // This function should only be called when LookupFunctionEntry returns
-  // a RUNTIME_FUNCTION.
-  EXPECT_EQ(&runtime_functions_.back(), runtime_function);
-}
-
-ScopedModuleHandle TestUnwindFunctions::GetModuleForProgramCounter(
-    DWORD64 program_counter) {
-  bool return_non_null_value = module_is_loaded_;
-  module_is_loaded_ = true;
-  return ScopedModuleHandle(return_non_null_value ?
-                            ModuleHandleTraits::kNonNullModuleForTesting :
-                            nullptr);
-}
-
-void TestUnwindFunctions::SetUnloadedModule() {
-  module_is_loaded_ = false;
-}
-
-void TestUnwindFunctions::SetHasRuntimeFunction(CONTEXT* context) {
-  RUNTIME_FUNCTION runtime_function = {};
-  runtime_function.BeginAddress = 16;
-  runtime_function.EndAddress = runtime_function.BeginAddress + 256;
-  runtime_functions_.push_back(runtime_function);
-  next_runtime_function_ = &runtime_functions_.back();
-
-  expected_program_counter_ = context->Rip =
-      next_image_base_ + runtime_function.BeginAddress + 8;
-}
-
-void TestUnwindFunctions::SetNoRuntimeFunction(CONTEXT* context) {
-  expected_program_counter_ = context->Rip = 100;
-  next_runtime_function_ = nullptr;
-}
-
-}  // namespace
-
-class Win32StackFrameUnwinderTest : public testing::Test {
- protected:
-  Win32StackFrameUnwinderTest() {}
-
-  // This exists so that Win32StackFrameUnwinder's constructor can be private
-  // with a single friend declaration of this test fixture.
-  std::unique_ptr<Win32StackFrameUnwinder> CreateUnwinder();
-
-  // Weak pointer to the unwind functions used by last created unwinder.
-  TestUnwindFunctions* unwind_functions_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(Win32StackFrameUnwinderTest);
-};
-
-std::unique_ptr<Win32StackFrameUnwinder>
-Win32StackFrameUnwinderTest::CreateUnwinder() {
-  std::unique_ptr<TestUnwindFunctions> unwind_functions(
-      new TestUnwindFunctions);
-  unwind_functions_ = unwind_functions.get();
-  return WrapUnique(
-      new Win32StackFrameUnwinder(std::move(unwind_functions)));
-}
-
-// Checks the case where all frames have unwind information.
-TEST_F(Win32StackFrameUnwinderTest, FramesWithUnwindInfo) {
-  std::unique_ptr<Win32StackFrameUnwinder> unwinder = CreateUnwinder();
-  CONTEXT context = {0};
-  ScopedModuleHandle module;
-
-  unwind_functions_->SetHasRuntimeFunction(&context);
-  EXPECT_TRUE(unwinder->TryUnwind(&context, &module));
-  EXPECT_TRUE(module.IsValid());
-
-  unwind_functions_->SetHasRuntimeFunction(&context);
-  module.Set(nullptr);
-  EXPECT_TRUE(unwinder->TryUnwind(&context, &module));
-  EXPECT_TRUE(module.IsValid());
-
-  unwind_functions_->SetHasRuntimeFunction(&context);
-  module.Set(nullptr);
-  EXPECT_TRUE(unwinder->TryUnwind(&context, &module));
-  EXPECT_TRUE(module.IsValid());
-}
-
-// Checks that an instruction pointer in an unloaded module fails to unwind.
-TEST_F(Win32StackFrameUnwinderTest, UnloadedModule) {
-  std::unique_ptr<Win32StackFrameUnwinder> unwinder = CreateUnwinder();
-  CONTEXT context = {0};
-  ScopedModuleHandle module;
-
-  unwind_functions_->SetUnloadedModule();
-  EXPECT_FALSE(unwinder->TryUnwind(&context, &module));
-}
-
-// Checks that the CONTEXT's stack pointer gets popped when the top frame has no
-// unwind information.
-TEST_F(Win32StackFrameUnwinderTest, FrameAtTopWithoutUnwindInfo) {
-  std::unique_ptr<Win32StackFrameUnwinder> unwinder = CreateUnwinder();
-  CONTEXT context = {0};
-  ScopedModuleHandle module;
-  DWORD64 next_ip = 0x0123456789abcdef;
-  DWORD64 original_rsp = reinterpret_cast<DWORD64>(&next_ip);
-  context.Rsp = original_rsp;
-
-  unwind_functions_->SetNoRuntimeFunction(&context);
-  EXPECT_TRUE(unwinder->TryUnwind(&context, &module));
-  EXPECT_EQ(next_ip, context.Rip);
-  EXPECT_EQ(original_rsp + 8, context.Rsp);
-  EXPECT_TRUE(module.IsValid());
-
-  unwind_functions_->SetHasRuntimeFunction(&context);
-  module.Set(nullptr);
-  EXPECT_TRUE(unwinder->TryUnwind(&context, &module));
-  EXPECT_TRUE(module.IsValid());
-
-  unwind_functions_->SetHasRuntimeFunction(&context);
-  module.Set(nullptr);
-  EXPECT_TRUE(unwinder->TryUnwind(&context, &module));
-  EXPECT_TRUE(module.IsValid());
-}
-
-// Checks that a frame below the top of the stack with missing unwind info
-// terminates the unwinding.
-TEST_F(Win32StackFrameUnwinderTest, FrameBelowTopWithoutUnwindInfo) {
-  {
-    // First stack, with a bad function below the top of the stack.
-    std::unique_ptr<Win32StackFrameUnwinder> unwinder = CreateUnwinder();
-    CONTEXT context = {0};
-    ScopedModuleHandle module;
-    unwind_functions_->SetHasRuntimeFunction(&context);
-    EXPECT_TRUE(unwinder->TryUnwind(&context, &module));
-    EXPECT_TRUE(module.IsValid());
-
-    unwind_functions_->SetNoRuntimeFunction(&context);
-    EXPECT_FALSE(unwinder->TryUnwind(&context, &module));
-  }
-}
-
-}  // namespace base
diff --git a/base/rand_util_unittest.cc b/base/rand_util_unittest.cc
deleted file mode 100644
index 11a118a..0000000
--- a/base/rand_util_unittest.cc
+++ /dev/null
@@ -1,170 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/rand_util.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <limits>
-#include <memory>
-
-#include "base/logging.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-const int kIntMin = std::numeric_limits<int>::min();
-const int kIntMax = std::numeric_limits<int>::max();
-
-}  // namespace
-
-TEST(RandUtilTest, RandInt) {
-  EXPECT_EQ(base::RandInt(0, 0), 0);
-  EXPECT_EQ(base::RandInt(kIntMin, kIntMin), kIntMin);
-  EXPECT_EQ(base::RandInt(kIntMax, kIntMax), kIntMax);
-
-  // Check that the DCHECKS in RandInt() don't fire due to internal overflow.
-  // There was a 50% chance of that happening, so calling it 40 times means
-  // the chances of this passing by accident are tiny (9e-13).
-  for (int i = 0; i < 40; ++i)
-    base::RandInt(kIntMin, kIntMax);
-}
-
-TEST(RandUtilTest, RandDouble) {
-  // Force 64-bit precision, making sure we're not in a 80-bit FPU register.
-  volatile double number = base::RandDouble();
-  EXPECT_GT(1.0, number);
-  EXPECT_LE(0.0, number);
-}
-
-TEST(RandUtilTest, RandBytes) {
-  const size_t buffer_size = 50;
-  char buffer[buffer_size];
-  memset(buffer, 0, buffer_size);
-  base::RandBytes(buffer, buffer_size);
-  std::sort(buffer, buffer + buffer_size);
-  // Probability of occurrence of less than 25 unique bytes in 50 random bytes
-  // is below 10^-25.
-  EXPECT_GT(std::unique(buffer, buffer + buffer_size) - buffer, 25);
-}
-
-// Verify that calling base::RandBytes with an empty buffer doesn't fail.
-TEST(RandUtilTest, RandBytes0) {
-  base::RandBytes(nullptr, 0);
-}
-
-TEST(RandUtilTest, RandBytesAsString) {
-  std::string random_string = base::RandBytesAsString(1);
-  EXPECT_EQ(1U, random_string.size());
-  random_string = base::RandBytesAsString(145);
-  EXPECT_EQ(145U, random_string.size());
-  char accumulator = 0;
-  for (size_t i = 0; i < random_string.size(); ++i)
-    accumulator |= random_string[i];
-  // In theory this test can fail, but it won't before the universe dies of
-  // heat death.
-  EXPECT_NE(0, accumulator);
-}
-
-// Make sure that it is still appropriate to use RandGenerator in conjunction
-// with std::random_shuffle().
-TEST(RandUtilTest, RandGeneratorForRandomShuffle) {
-  EXPECT_EQ(base::RandGenerator(1), 0U);
-  EXPECT_LE(std::numeric_limits<ptrdiff_t>::max(),
-            std::numeric_limits<int64_t>::max());
-}
-
-TEST(RandUtilTest, RandGeneratorIsUniform) {
-  // Verify that RandGenerator has a uniform distribution. This is a
-  // regression test that consistently failed when RandGenerator was
-  // implemented this way:
-  //
-  //   return base::RandUint64() % max;
-  //
-  // A degenerate case for such an implementation is e.g. a top of
-  // range that is 2/3rds of the way to MAX_UINT64, in which case the
-  // bottom half of the range would be twice as likely to occur as the
-  // top half. A bit of calculus care of jar@ shows that the largest
-  // measurable delta is when the top of the range is 3/4ths of the
-  // way, so that's what we use in the test.
-  const uint64_t kTopOfRange =
-      (std::numeric_limits<uint64_t>::max() / 4ULL) * 3ULL;
-  const uint64_t kExpectedAverage = kTopOfRange / 2ULL;
-  const uint64_t kAllowedVariance = kExpectedAverage / 50ULL;  // +/- 2%
-  const int kMinAttempts = 1000;
-  const int kMaxAttempts = 1000000;
-
-  double cumulative_average = 0.0;
-  int count = 0;
-  while (count < kMaxAttempts) {
-    uint64_t value = base::RandGenerator(kTopOfRange);
-    cumulative_average = (count * cumulative_average + value) / (count + 1);
-
-    // Don't quit too quickly for things to start converging, or we may have
-    // a false positive.
-    if (count > kMinAttempts &&
-        kExpectedAverage - kAllowedVariance < cumulative_average &&
-        cumulative_average < kExpectedAverage + kAllowedVariance) {
-      break;
-    }
-
-    ++count;
-  }
-
-  ASSERT_LT(count, kMaxAttempts) << "Expected average was " <<
-      kExpectedAverage << ", average ended at " << cumulative_average;
-}
-
-TEST(RandUtilTest, RandUint64ProducesBothValuesOfAllBits) {
-  // This tests to see that our underlying random generator is good
-  // enough, for some value of good enough.
-  uint64_t kAllZeros = 0ULL;
-  uint64_t kAllOnes = ~kAllZeros;
-  uint64_t found_ones = kAllZeros;
-  uint64_t found_zeros = kAllOnes;
-
-  for (size_t i = 0; i < 1000; ++i) {
-    uint64_t value = base::RandUint64();
-    found_ones |= value;
-    found_zeros &= value;
-
-    if (found_zeros == kAllZeros && found_ones == kAllOnes)
-      return;
-  }
-
-  FAIL() << "Didn't achieve all bit values in maximum number of tries.";
-}
-
-TEST(RandUtilTest, RandBytesLonger) {
-  // Fuchsia can only retrieve 256 bytes of entropy at a time, so make sure we
-  // handle longer requests than that.
-  std::string random_string0 = base::RandBytesAsString(255);
-  EXPECT_EQ(255u, random_string0.size());
-  std::string random_string1 = base::RandBytesAsString(1023);
-  EXPECT_EQ(1023u, random_string1.size());
-  std::string random_string2 = base::RandBytesAsString(4097);
-  EXPECT_EQ(4097u, random_string2.size());
-}
-
-// Benchmark test for RandBytes().  Disabled since it's intentionally slow and
-// does not test anything that isn't already tested by the existing RandBytes()
-// tests.
-TEST(RandUtilTest, DISABLED_RandBytesPerf) {
-  // Benchmark the performance of |kTestIterations| of RandBytes() using a
-  // buffer size of |kTestBufferSize|.
-  const int kTestIterations = 10;
-  const size_t kTestBufferSize = 1 * 1024 * 1024;
-
-  std::unique_ptr<uint8_t[]> buffer(new uint8_t[kTestBufferSize]);
-  const base::TimeTicks now = base::TimeTicks::Now();
-  for (int i = 0; i < kTestIterations; ++i)
-    base::RandBytes(buffer.get(), kTestBufferSize);
-  const base::TimeTicks end = base::TimeTicks::Now();
-
-  LOG(INFO) << "RandBytes(" << kTestBufferSize << ") took: "
-            << (end - now).InMicroseconds() << "µs";
-}
diff --git a/base/run_loop_unittest.cc b/base/run_loop_unittest.cc
deleted file mode 100644
index 3564a2e..0000000
--- a/base/run_loop_unittest.cc
+++ /dev/null
@@ -1,636 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/run_loop.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/containers/queue.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/gtest_util.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_checker_impl.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "build_config.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-void QuitWhenIdleTask(RunLoop* run_loop, int* counter) {
-  run_loop->QuitWhenIdle();
-  ++(*counter);
-}
-
-void ShouldRunTask(int* counter) {
-  ++(*counter);
-}
-
-void ShouldNotRunTask() {
-  ADD_FAILURE() << "Ran a task that shouldn't run.";
-}
-
-void RunNestedLoopTask(int* counter) {
-  RunLoop nested_run_loop(RunLoop::Type::kNestableTasksAllowed);
-
-  // This task should quit |nested_run_loop| but not the main RunLoop.
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&QuitWhenIdleTask, Unretained(&nested_run_loop),
-                          Unretained(counter)));
-
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, BindOnce(&ShouldNotRunTask), TimeDelta::FromDays(1));
-
-  nested_run_loop.Run();
-
-  ++(*counter);
-}
-
-// A simple SingleThreadTaskRunner that just queues undelayed tasks (and ignores
-// delayed tasks). Tasks can then be processed one by one by ProcessTask() which
-// will return true if it processed a task and false otherwise.
-class SimpleSingleThreadTaskRunner : public SingleThreadTaskRunner {
- public:
-  SimpleSingleThreadTaskRunner() = default;
-
-  bool PostDelayedTask(const Location& from_here,
-                       OnceClosure task,
-                       base::TimeDelta delay) override {
-    if (delay > base::TimeDelta())
-      return false;
-    AutoLock auto_lock(tasks_lock_);
-    pending_tasks_.push(std::move(task));
-    return true;
-  }
-
-  bool PostNonNestableDelayedTask(const Location& from_here,
-                                  OnceClosure task,
-                                  base::TimeDelta delay) override {
-    return PostDelayedTask(from_here, std::move(task), delay);
-  }
-
-  bool RunsTasksInCurrentSequence() const override {
-    return origin_thread_checker_.CalledOnValidThread();
-  }
-
-  bool ProcessSingleTask() {
-    OnceClosure task;
-    {
-      AutoLock auto_lock(tasks_lock_);
-      if (pending_tasks_.empty())
-        return false;
-      task = std::move(pending_tasks_.front());
-      pending_tasks_.pop();
-    }
-    // It's important to Run() after pop() and outside the lock as |task| may
-    // run a nested loop which will re-enter ProcessSingleTask().
-    std::move(task).Run();
-    return true;
-  }
-
- private:
-  ~SimpleSingleThreadTaskRunner() override = default;
-
-  Lock tasks_lock_;
-  base::queue<OnceClosure> pending_tasks_;
-
-  // RunLoop relies on RunsTasksInCurrentSequence() signal. Use a
-  // ThreadCheckerImpl to be able to reliably provide that signal even in
-  // non-dcheck builds.
-  ThreadCheckerImpl origin_thread_checker_;
-
-  DISALLOW_COPY_AND_ASSIGN(SimpleSingleThreadTaskRunner);
-};
-
-// The basis of all TestDelegates, allows safely injecting a OnceClosure to be
-// run in the next idle phase of this delegate's Run() implementation. This can
-// be used to have code run on a thread that is otherwise livelocked in an idle
-// phase (sometimes a simple PostTask() won't do it -- e.g. when processing
-// application tasks is disallowed).
-class InjectableTestDelegate : public RunLoop::Delegate {
- public:
-  void InjectClosureOnDelegate(OnceClosure closure) {
-    AutoLock auto_lock(closure_lock_);
-    closure_ = std::move(closure);
-  }
-
-  bool RunInjectedClosure() {
-    AutoLock auto_lock(closure_lock_);
-    if (closure_.is_null())
-      return false;
-    std::move(closure_).Run();
-    return true;
-  }
-
- private:
-  Lock closure_lock_;
-  OnceClosure closure_;
-};
-
-// A simple test RunLoop::Delegate to exercise Runloop logic independent of any
-// other base constructs. BindToCurrentThread() must be called before this
-// TestBoundDelegate is operational.
-class TestBoundDelegate final : public InjectableTestDelegate {
- public:
-  TestBoundDelegate() = default;
-
-  // Makes this TestBoundDelegate become the RunLoop::Delegate and
-  // ThreadTaskRunnerHandle for this thread.
-  void BindToCurrentThread() {
-    thread_task_runner_handle_ =
-        std::make_unique<ThreadTaskRunnerHandle>(simple_task_runner_);
-    RunLoop::RegisterDelegateForCurrentThread(this);
-  }
-
- private:
-  void Run(bool application_tasks_allowed) override {
-    if (nested_run_allowing_tasks_incoming_) {
-      EXPECT_TRUE(RunLoop::IsNestedOnCurrentThread());
-      EXPECT_TRUE(application_tasks_allowed);
-    } else if (RunLoop::IsNestedOnCurrentThread()) {
-      EXPECT_FALSE(application_tasks_allowed);
-    }
-    nested_run_allowing_tasks_incoming_ = false;
-
-    while (!should_quit_) {
-      if (application_tasks_allowed && simple_task_runner_->ProcessSingleTask())
-        continue;
-
-      if (ShouldQuitWhenIdle())
-        break;
-
-      if (RunInjectedClosure())
-        continue;
-
-      PlatformThread::YieldCurrentThread();
-    }
-    should_quit_ = false;
-  }
-
-  void Quit() override { should_quit_ = true; }
-
-  void EnsureWorkScheduled() override {
-    nested_run_allowing_tasks_incoming_ = true;
-  }
-
-  // True if the next invocation of Run() is expected to be from a
-  // kNestableTasksAllowed RunLoop.
-  bool nested_run_allowing_tasks_incoming_ = false;
-
-  scoped_refptr<SimpleSingleThreadTaskRunner> simple_task_runner_ =
-      MakeRefCounted<SimpleSingleThreadTaskRunner>();
-
-  std::unique_ptr<ThreadTaskRunnerHandle> thread_task_runner_handle_;
-
-  bool should_quit_ = false;
-};
-
-enum class RunLoopTestType {
-  // Runs all RunLoopTests under a ScopedTaskEnvironment to make sure real world
-  // scenarios work.
-  kRealEnvironment,
-
-  // Runs all RunLoopTests under a test RunLoop::Delegate to make sure the
-  // delegate interface fully works standalone.
-  kTestDelegate,
-};
-
-// The task environment for the RunLoopTest of a given type. A separate class
-// so it can be instantiated on the stack in the RunLoopTest fixture.
-class RunLoopTestEnvironment {
- public:
-  RunLoopTestEnvironment(RunLoopTestType type) {
-    switch (type) {
-      case RunLoopTestType::kRealEnvironment: {
-        task_environment_ = std::make_unique<test::ScopedTaskEnvironment>();
-        break;
-      }
-      case RunLoopTestType::kTestDelegate: {
-        auto test_delegate = std::make_unique<TestBoundDelegate>();
-        test_delegate->BindToCurrentThread();
-        test_delegate_ = std::move(test_delegate);
-        break;
-      }
-    }
-  }
-
- private:
-  // Instantiates one or the other based on the RunLoopTestType.
-  std::unique_ptr<test::ScopedTaskEnvironment> task_environment_;
-  std::unique_ptr<InjectableTestDelegate> test_delegate_;
-};
-
-class RunLoopTest : public testing::TestWithParam<RunLoopTestType> {
- protected:
-  RunLoopTest() : test_environment_(GetParam()) {}
-
-  RunLoopTestEnvironment test_environment_;
-  RunLoop run_loop_;
-  int counter_ = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(RunLoopTest);
-};
-
-}  // namespace
-
-TEST_P(RunLoopTest, QuitWhenIdle) {
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&QuitWhenIdleTask, Unretained(&run_loop_),
-                          Unretained(&counter_)));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&ShouldRunTask, Unretained(&counter_)));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, BindOnce(&ShouldNotRunTask), TimeDelta::FromDays(1));
-
-  run_loop_.Run();
-  EXPECT_EQ(2, counter_);
-}
-
-TEST_P(RunLoopTest, QuitWhenIdleNestedLoop) {
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&RunNestedLoopTask, Unretained(&counter_)));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&QuitWhenIdleTask, Unretained(&run_loop_),
-                          Unretained(&counter_)));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&ShouldRunTask, Unretained(&counter_)));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, BindOnce(&ShouldNotRunTask), TimeDelta::FromDays(1));
-
-  run_loop_.Run();
-  EXPECT_EQ(4, counter_);
-}
-
-TEST_P(RunLoopTest, QuitWhenIdleClosure) {
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          run_loop_.QuitWhenIdleClosure());
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&ShouldRunTask, Unretained(&counter_)));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, BindOnce(&ShouldNotRunTask), TimeDelta::FromDays(1));
-
-  run_loop_.Run();
-  EXPECT_EQ(1, counter_);
-}
-
-// Verify that the QuitWhenIdleClosure() can run after the RunLoop has been
-// deleted. It should have no effect.
-TEST_P(RunLoopTest, QuitWhenIdleClosureAfterRunLoopScope) {
-  Closure quit_when_idle_closure;
-  {
-    RunLoop run_loop;
-    quit_when_idle_closure = run_loop.QuitWhenIdleClosure();
-    run_loop.RunUntilIdle();
-  }
-  quit_when_idle_closure.Run();
-}
-
-// Verify that Quit can be executed from another sequence.
-TEST_P(RunLoopTest, QuitFromOtherSequence) {
-  Thread other_thread("test");
-  other_thread.Start();
-  scoped_refptr<SequencedTaskRunner> other_sequence =
-      other_thread.task_runner();
-
-  // Always expected to run before asynchronous Quit() kicks in.
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&ShouldRunTask, Unretained(&counter_)));
-
-  WaitableEvent loop_was_quit(WaitableEvent::ResetPolicy::MANUAL,
-                              WaitableEvent::InitialState::NOT_SIGNALED);
-  other_sequence->PostTask(
-      FROM_HERE, base::BindOnce([](RunLoop* run_loop) { run_loop->Quit(); },
-                                Unretained(&run_loop_)));
-  other_sequence->PostTask(
-      FROM_HERE,
-      base::BindOnce(&WaitableEvent::Signal, base::Unretained(&loop_was_quit)));
-
-  // Anything that's posted after the Quit closure was posted back to this
-  // sequence shouldn't get a chance to run.
-  loop_was_quit.Wait();
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          base::BindOnce(&ShouldNotRunTask));
-
-  run_loop_.Run();
-
-  EXPECT_EQ(1, counter_);
-}
-
-// Verify that QuitClosure can be executed from another sequence.
-TEST_P(RunLoopTest, QuitFromOtherSequenceWithClosure) {
-  Thread other_thread("test");
-  other_thread.Start();
-  scoped_refptr<SequencedTaskRunner> other_sequence =
-      other_thread.task_runner();
-
-  // Always expected to run before asynchronous Quit() kicks in.
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&ShouldRunTask, Unretained(&counter_)));
-
-  WaitableEvent loop_was_quit(WaitableEvent::ResetPolicy::MANUAL,
-                              WaitableEvent::InitialState::NOT_SIGNALED);
-  other_sequence->PostTask(FROM_HERE, run_loop_.QuitClosure());
-  other_sequence->PostTask(
-      FROM_HERE,
-      base::BindOnce(&WaitableEvent::Signal, base::Unretained(&loop_was_quit)));
-
-  // Anything that's posted after the Quit closure was posted back to this
-  // sequence shouldn't get a chance to run.
-  loop_was_quit.Wait();
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                          base::BindOnce(&ShouldNotRunTask));
-
-  run_loop_.Run();
-
-  EXPECT_EQ(1, counter_);
-}
-
-// Verify that Quit can be executed from another sequence even when the
-// Quit is racing with Run() -- i.e. forgo the WaitableEvent used above.
-TEST_P(RunLoopTest, QuitFromOtherSequenceRacy) {
-  Thread other_thread("test");
-  other_thread.Start();
-  scoped_refptr<SequencedTaskRunner> other_sequence =
-      other_thread.task_runner();
-
-  // Always expected to run before asynchronous Quit() kicks in.
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&ShouldRunTask, Unretained(&counter_)));
-
-  other_sequence->PostTask(
-      FROM_HERE, base::BindOnce([](RunLoop* run_loop) { run_loop->Quit(); },
-                                Unretained(&run_loop_)));
-
-  run_loop_.Run();
-
-  EXPECT_EQ(1, counter_);
-}
-
-// Verify that QuitClosure can be executed from another sequence even when the
-// Quit is racing with Run() -- i.e. forgo the WaitableEvent used above.
-TEST_P(RunLoopTest, QuitFromOtherSequenceRacyWithClosure) {
-  Thread other_thread("test");
-  other_thread.Start();
-  scoped_refptr<SequencedTaskRunner> other_sequence =
-      other_thread.task_runner();
-
-  // Always expected to run before asynchronous Quit() kicks in.
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&ShouldRunTask, Unretained(&counter_)));
-
-  other_sequence->PostTask(FROM_HERE, run_loop_.QuitClosure());
-
-  run_loop_.Run();
-
-  EXPECT_EQ(1, counter_);
-}
-
-// Verify that QuitWhenIdle can be executed from another sequence.
-TEST_P(RunLoopTest, QuitWhenIdleFromOtherSequence) {
-  Thread other_thread("test");
-  other_thread.Start();
-  scoped_refptr<SequencedTaskRunner> other_sequence =
-      other_thread.task_runner();
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&ShouldRunTask, Unretained(&counter_)));
-
-  other_sequence->PostTask(
-      FROM_HERE,
-      base::BindOnce([](RunLoop* run_loop) { run_loop->QuitWhenIdle(); },
-                     Unretained(&run_loop_)));
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&ShouldRunTask, Unretained(&counter_)));
-
-  run_loop_.Run();
-
-  // Regardless of the outcome of the race this thread shouldn't have been idle
-  // until the counter was ticked twice.
-  EXPECT_EQ(2, counter_);
-}
-
-// Verify that QuitWhenIdleClosure can be executed from another sequence.
-TEST_P(RunLoopTest, QuitWhenIdleFromOtherSequenceWithClosure) {
-  Thread other_thread("test");
-  other_thread.Start();
-  scoped_refptr<SequencedTaskRunner> other_sequence =
-      other_thread.task_runner();
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&ShouldRunTask, Unretained(&counter_)));
-
-  other_sequence->PostTask(FROM_HERE, run_loop_.QuitWhenIdleClosure());
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&ShouldRunTask, Unretained(&counter_)));
-
-  run_loop_.Run();
-
-  // Regardless of the outcome of the race this thread shouldn't have been idle
-  // until the counter was ticked twice.
-  EXPECT_EQ(2, counter_);
-}
-
-TEST_P(RunLoopTest, IsRunningOnCurrentThread) {
-  EXPECT_FALSE(RunLoop::IsRunningOnCurrentThread());
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      BindOnce([]() { EXPECT_TRUE(RunLoop::IsRunningOnCurrentThread()); }));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, run_loop_.QuitClosure());
-  run_loop_.Run();
-}
-
-TEST_P(RunLoopTest, IsNestedOnCurrentThread) {
-  EXPECT_FALSE(RunLoop::IsNestedOnCurrentThread());
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce([]() {
-        EXPECT_FALSE(RunLoop::IsNestedOnCurrentThread());
-
-        RunLoop nested_run_loop(RunLoop::Type::kNestableTasksAllowed);
-
-        ThreadTaskRunnerHandle::Get()->PostTask(
-            FROM_HERE, BindOnce([]() {
-              EXPECT_TRUE(RunLoop::IsNestedOnCurrentThread());
-            }));
-        ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                nested_run_loop.QuitClosure());
-
-        EXPECT_FALSE(RunLoop::IsNestedOnCurrentThread());
-        nested_run_loop.Run();
-        EXPECT_FALSE(RunLoop::IsNestedOnCurrentThread());
-      }));
-
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, run_loop_.QuitClosure());
-  run_loop_.Run();
-}
-
-namespace {
-
-class MockNestingObserver : public RunLoop::NestingObserver {
- public:
-  MockNestingObserver() = default;
-
-  // RunLoop::NestingObserver:
-  MOCK_METHOD0(OnBeginNestedRunLoop, void());
-  MOCK_METHOD0(OnExitNestedRunLoop, void());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockNestingObserver);
-};
-
-class MockTask {
- public:
-  MockTask() = default;
-  MOCK_METHOD0(Task, void());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockTask);
-};
-
-}  // namespace
-
-TEST_P(RunLoopTest, NestingObservers) {
-  testing::StrictMock<MockNestingObserver> nesting_observer;
-  testing::StrictMock<MockTask> mock_task_a;
-  testing::StrictMock<MockTask> mock_task_b;
-
-  RunLoop::AddNestingObserverOnCurrentThread(&nesting_observer);
-
-  const RepeatingClosure run_nested_loop = Bind([]() {
-    RunLoop nested_run_loop(RunLoop::Type::kNestableTasksAllowed);
-    ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                            nested_run_loop.QuitClosure());
-    nested_run_loop.Run();
-  });
-
-  // Generate a stack of nested RunLoops. OnBeginNestedRunLoop() is expected
-  // when beginning each nesting depth and OnExitNestedRunLoop() is expected
-  // when exiting each nesting depth. Each one of these tasks is ahead of the
-  // QuitClosures as those are only posted at the end of the queue when
-  // |run_nested_loop| is executed.
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, run_nested_loop);
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&MockTask::Task, base::Unretained(&mock_task_a)));
-  ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, run_nested_loop);
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&MockTask::Task, base::Unretained(&mock_task_b)));
-
-  {
-    testing::InSequence in_sequence;
-    EXPECT_CALL(nesting_observer, OnBeginNestedRunLoop());
-    EXPECT_CALL(mock_task_a, Task());
-    EXPECT_CALL(nesting_observer, OnBeginNestedRunLoop());
-    EXPECT_CALL(mock_task_b, Task());
-    EXPECT_CALL(nesting_observer, OnExitNestedRunLoop()).Times(2);
-  }
-  run_loop_.RunUntilIdle();
-
-  RunLoop::RemoveNestingObserverOnCurrentThread(&nesting_observer);
-}
-
-TEST_P(RunLoopTest, DisallowRunningForTesting) {
-  RunLoop::ScopedDisallowRunningForTesting disallow_running;
-  EXPECT_DCHECK_DEATH({ run_loop_.RunUntilIdle(); });
-}
-
-TEST_P(RunLoopTest, ExpiredDisallowRunningForTesting) {
-  { RunLoop::ScopedDisallowRunningForTesting disallow_running; }
-  // Running should be fine after |disallow_running| goes out of scope.
-  run_loop_.RunUntilIdle();
-}
-
-INSTANTIATE_TEST_CASE_P(Real,
-                        RunLoopTest,
-                        testing::Values(RunLoopTestType::kRealEnvironment));
-INSTANTIATE_TEST_CASE_P(Mock,
-                        RunLoopTest,
-                        testing::Values(RunLoopTestType::kTestDelegate));
-
-TEST(RunLoopDeathTest, MustRegisterBeforeInstantiating) {
-  TestBoundDelegate unbound_test_delegate_;
-  // RunLoop::RunLoop() should CHECK fetching the ThreadTaskRunnerHandle.
-  EXPECT_DEATH_IF_SUPPORTED({ RunLoop(); }, "");
-}
-
-TEST(RunLoopDelegateTest, NestableTasksDontRunInDefaultNestedLoops) {
-  TestBoundDelegate test_delegate;
-  test_delegate.BindToCurrentThread();
-
-  base::Thread other_thread("test");
-  other_thread.Start();
-
-  RunLoop main_loop;
-  // A nested run loop which isn't kNestableTasksAllowed.
-  RunLoop nested_run_loop(RunLoop::Type::kDefault);
-
-  bool nested_run_loop_ended = false;
-
-  // The first task on the main loop will result in a nested run loop. Since
-  // it's not kNestableTasksAllowed, no further task should be processed until
-  // it's quit.
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      BindOnce([](RunLoop* nested_run_loop) { nested_run_loop->Run(); },
-               Unretained(&nested_run_loop)));
-
-  // Post a task that will fail if it runs inside the nested run loop.
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(
-                     [](const bool& nested_run_loop_ended,
-                        OnceClosure continuation_callback) {
-                       EXPECT_TRUE(nested_run_loop_ended);
-                       EXPECT_FALSE(RunLoop::IsNestedOnCurrentThread());
-                       std::move(continuation_callback).Run();
-                     },
-                     ConstRef(nested_run_loop_ended), main_loop.QuitClosure()));
-
-  // Post a task flipping the boolean bit for extra verification right before
-  // quitting |nested_run_loop|.
-  other_thread.task_runner()->PostDelayedTask(
-      FROM_HERE,
-      BindOnce(
-          [](bool* nested_run_loop_ended) {
-            EXPECT_FALSE(*nested_run_loop_ended);
-            *nested_run_loop_ended = true;
-          },
-          Unretained(&nested_run_loop_ended)),
-      TestTimeouts::tiny_timeout());
-  // Post an async delayed task to exit the run loop when idle. This confirms
-  // that (1) the test task only ran in the main loop after the nested loop
-  // exited and (2) the nested run loop actually considers itself idle while
-  // spinning. Note: The quit closure needs to be injected directly on the
-  // delegate as invoking QuitWhenIdle() off-thread results in a thread bounce
-  // which will not processed because of the very logic under test (nestable
-  // tasks don't run in |nested_run_loop|).
-  other_thread.task_runner()->PostDelayedTask(
-      FROM_HERE,
-      BindOnce(
-          [](TestBoundDelegate* test_delegate, OnceClosure injected_closure) {
-            test_delegate->InjectClosureOnDelegate(std::move(injected_closure));
-          },
-          Unretained(&test_delegate), nested_run_loop.QuitWhenIdleClosure()),
-      TestTimeouts::tiny_timeout());
-
-  main_loop.Run();
-}
-
-}  // namespace base
diff --git a/base/safe_numerics_unittest.cc b/base/safe_numerics_unittest.cc
deleted file mode 100644
index 7fcc5d1..0000000
--- a/base/safe_numerics_unittest.cc
+++ /dev/null
@@ -1,1640 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <limits>
-#include <type_traits>
-
-#include "base/compiler_specific.h"
-
-// WARNING: This block must come before the base/numerics headers are included.
-// These tests deliberately cause arithmetic boundary errors. If the compiler is
-// aggressive enough, it can const detect these errors, so we disable warnings.
-#if defined(OS_WIN)
-#pragma warning(disable : 4756)  // Arithmetic overflow.
-#pragma warning(disable : 4293)  // Invalid shift.
-#endif
-
-// This may not need to come before the base/numerics headers, but let's keep
-// it close to the MSVC equivalent.
-#if defined(__clang__)
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Winteger-overflow"
-#endif
-
-#include "base/logging.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/numerics/safe_math.h"
-#include "base/test/gtest_util.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(COMPILER_MSVC) && defined(ARCH_CPU_32_BITS)
-#include <mmintrin.h>
-#endif
-
-namespace base {
-namespace internal {
-
-using std::numeric_limits;
-
-// This is a helper function for finding the maximum value in Src that can be
-// wholy represented as the destination floating-point type.
-template <typename Dst, typename Src>
-Dst GetMaxConvertibleToFloat() {
-  using DstLimits = numeric_limits<Dst>;
-  using SrcLimits = numeric_limits<Src>;
-  static_assert(SrcLimits::is_specialized, "Source must be numeric.");
-  static_assert(DstLimits::is_specialized, "Destination must be numeric.");
-  CHECK(DstLimits::is_iec559);
-
-  if (SrcLimits::digits <= DstLimits::digits &&
-      MaxExponent<Src>::value <= MaxExponent<Dst>::value)
-    return SrcLimits::max();
-  Src max = SrcLimits::max() / 2 + (SrcLimits::is_integer ? 1 : 0);
-  while (max != static_cast<Src>(static_cast<Dst>(max))) {
-    max /= 2;
-  }
-  return static_cast<Dst>(max);
-}
-
-// Test corner case promotions used
-static_assert(IsIntegerArithmeticSafe<int32_t, int8_t, int8_t>::value, "");
-static_assert(IsIntegerArithmeticSafe<int32_t, int16_t, int8_t>::value, "");
-static_assert(IsIntegerArithmeticSafe<int32_t, int8_t, int16_t>::value, "");
-static_assert(!IsIntegerArithmeticSafe<int32_t, int32_t, int8_t>::value, "");
-static_assert(BigEnoughPromotion<int16_t, int8_t>::is_contained, "");
-static_assert(BigEnoughPromotion<int32_t, uint32_t>::is_contained, "");
-static_assert(BigEnoughPromotion<intmax_t, int8_t>::is_contained, "");
-static_assert(!BigEnoughPromotion<uintmax_t, int8_t>::is_contained, "");
-static_assert(
-    std::is_same<BigEnoughPromotion<int16_t, int8_t>::type, int16_t>::value,
-    "");
-static_assert(
-    std::is_same<BigEnoughPromotion<int32_t, uint32_t>::type, int64_t>::value,
-    "");
-static_assert(
-    std::is_same<BigEnoughPromotion<intmax_t, int8_t>::type, intmax_t>::value,
-    "");
-static_assert(
-    std::is_same<BigEnoughPromotion<uintmax_t, int8_t>::type, uintmax_t>::value,
-    "");
-static_assert(BigEnoughPromotion<int16_t, int8_t>::is_contained, "");
-static_assert(BigEnoughPromotion<int32_t, uint32_t>::is_contained, "");
-static_assert(BigEnoughPromotion<intmax_t, int8_t>::is_contained, "");
-static_assert(!BigEnoughPromotion<uintmax_t, int8_t>::is_contained, "");
-static_assert(
-    std::is_same<FastIntegerArithmeticPromotion<int16_t, int8_t>::type,
-                 int32_t>::value,
-    "");
-static_assert(
-    std::is_same<FastIntegerArithmeticPromotion<int32_t, uint32_t>::type,
-                 int64_t>::value,
-    "");
-static_assert(
-    std::is_same<FastIntegerArithmeticPromotion<intmax_t, int8_t>::type,
-                 intmax_t>::value,
-    "");
-static_assert(
-    std::is_same<FastIntegerArithmeticPromotion<uintmax_t, int8_t>::type,
-                 uintmax_t>::value,
-    "");
-static_assert(FastIntegerArithmeticPromotion<int16_t, int8_t>::is_contained,
-              "");
-static_assert(FastIntegerArithmeticPromotion<int32_t, uint32_t>::is_contained,
-              "");
-static_assert(!FastIntegerArithmeticPromotion<intmax_t, int8_t>::is_contained,
-              "");
-static_assert(!FastIntegerArithmeticPromotion<uintmax_t, int8_t>::is_contained,
-              "");
-
-template <typename U>
-U GetNumericValueForTest(const CheckedNumeric<U>& src) {
-  return src.state_.value();
-}
-
-template <typename U>
-U GetNumericValueForTest(const ClampedNumeric<U>& src) {
-  return static_cast<U>(src);
-}
-
-template <typename U>
-U GetNumericValueForTest(const U& src) {
-  return src;
-}
-
-// Logs the ValueOrDie() failure instead of crashing.
-struct LogOnFailure {
-  template <typename T>
-  static T HandleFailure() {
-    LOG(WARNING) << "ValueOrDie() failed unexpectedly.";
-    return T();
-  }
-};
-
-template <typename T>
-constexpr T GetValue(const T& src) {
-  return src;
-}
-
-template <typename T, typename U>
-constexpr T GetValueAsDest(const U& src) {
-  return static_cast<T>(src);
-}
-
-template <typename T>
-constexpr T GetValue(const CheckedNumeric<T>& src) {
-  return src.template ValueOrDie<T, LogOnFailure>();
-}
-
-template <typename T, typename U>
-constexpr T GetValueAsDest(const CheckedNumeric<U>& src) {
-  return src.template ValueOrDie<T, LogOnFailure>();
-}
-
-template <typename T>
-constexpr T GetValue(const ClampedNumeric<T>& src) {
-  return static_cast<T>(src);
-}
-
-template <typename T, typename U>
-constexpr T GetValueAsDest(const ClampedNumeric<U>& src) {
-  return static_cast<T>(src);
-}
-
-// Helper macros to wrap displaying the conversion types and line numbers.
-#define TEST_EXPECTED_VALIDITY(expected, actual)                           \
-  EXPECT_EQ(expected, (actual).template Cast<Dst>().IsValid())             \
-      << "Result test: Value " << GetNumericValueForTest(actual) << " as " \
-      << dst << " on line " << line
-
-#define TEST_EXPECTED_SUCCESS(actual) TEST_EXPECTED_VALIDITY(true, actual)
-#define TEST_EXPECTED_FAILURE(actual) TEST_EXPECTED_VALIDITY(false, actual)
-
-// We have to handle promotions, so infer the underlying type below from actual.
-#define TEST_EXPECTED_VALUE(expected, actual)                               \
-  EXPECT_EQ(GetValue(expected), GetValueAsDest<decltype(expected)>(actual)) \
-      << "Result test: Value " << GetNumericValueForTest(actual) << " as "  \
-      << dst << " on line " << line
-
-// Test the simple pointer arithmetic overrides.
-template <typename Dst>
-void TestStrictPointerMath() {
-  Dst dummy_value = 0;
-  Dst* dummy_ptr = &dummy_value;
-  static const Dst kDummyOffset = 2;  // Don't want to go too far.
-  EXPECT_EQ(dummy_ptr + kDummyOffset,
-            dummy_ptr + StrictNumeric<Dst>(kDummyOffset));
-  EXPECT_EQ(dummy_ptr - kDummyOffset,
-            dummy_ptr - StrictNumeric<Dst>(kDummyOffset));
-  EXPECT_NE(dummy_ptr, dummy_ptr + StrictNumeric<Dst>(kDummyOffset));
-  EXPECT_NE(dummy_ptr, dummy_ptr - StrictNumeric<Dst>(kDummyOffset));
-  EXPECT_DEATH_IF_SUPPORTED(
-      dummy_ptr + StrictNumeric<size_t>(std::numeric_limits<size_t>::max()),
-      "");
-}
-
-// Signed integer arithmetic.
-template <typename Dst>
-static void TestSpecializedArithmetic(
-    const char* dst,
-    int line,
-    typename std::enable_if<numeric_limits<Dst>::is_integer &&
-                                numeric_limits<Dst>::is_signed,
-                            int>::type = 0) {
-  using DstLimits = SaturationDefaultLimits<Dst>;
-  TEST_EXPECTED_FAILURE(-CheckedNumeric<Dst>(DstLimits::lowest()));
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()).Abs());
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs());
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      MakeCheckedNum(-DstLimits::max()).Abs());
-
-  TEST_EXPECTED_VALUE(DstLimits::Overflow(),
-                      -ClampedNumeric<Dst>(DstLimits::lowest()));
-  TEST_EXPECTED_VALUE(DstLimits::Overflow(),
-                      ClampedNumeric<Dst>(DstLimits::lowest()).Abs());
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(-1).Abs());
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      MakeClampedNum(-DstLimits::max()).Abs());
-
-  TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + -1);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) +
-                        DstLimits::lowest());
-
-  TEST_EXPECTED_VALUE(DstLimits::max() - 1,
-                      ClampedNumeric<Dst>(DstLimits::max()) + -1);
-  TEST_EXPECTED_VALUE(DstLimits::Underflow(),
-                      ClampedNumeric<Dst>(DstLimits::lowest()) + -1);
-  TEST_EXPECTED_VALUE(
-      DstLimits::Underflow(),
-      ClampedNumeric<Dst>(DstLimits::lowest()) + DstLimits::lowest());
-
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1);
-  TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) - -1);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) -
-                        DstLimits::lowest());
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) -
-                        DstLimits::max());
-
-  TEST_EXPECTED_VALUE(DstLimits::Underflow(),
-                      ClampedNumeric<Dst>(DstLimits::lowest()) - 1);
-  TEST_EXPECTED_VALUE(DstLimits::lowest() + 1,
-                      ClampedNumeric<Dst>(DstLimits::lowest()) - -1);
-  TEST_EXPECTED_VALUE(
-      DstLimits::Overflow(),
-      ClampedNumeric<Dst>(DstLimits::max()) - DstLimits::lowest());
-  TEST_EXPECTED_VALUE(
-      DstLimits::Underflow(),
-      ClampedNumeric<Dst>(DstLimits::lowest()) - DstLimits::max());
-
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * 2);
-  TEST_EXPECTED_VALUE(DstLimits::Underflow(),
-                      ClampedNumeric<Dst>(DstLimits::lowest()) * 2);
-
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) / -1);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * -1);
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      CheckedNumeric<Dst>(DstLimits::lowest() + 1) * Dst(-1));
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      CheckedNumeric<Dst>(-1) * Dst(DstLimits::lowest() + 1));
-  TEST_EXPECTED_VALUE(DstLimits::lowest(),
-                      CheckedNumeric<Dst>(DstLimits::lowest()) * Dst(1));
-  TEST_EXPECTED_VALUE(DstLimits::lowest(),
-                      CheckedNumeric<Dst>(1) * Dst(DstLimits::lowest()));
-  TEST_EXPECTED_VALUE(
-      typename std::make_unsigned<Dst>::type(0) - DstLimits::lowest(),
-      MakeCheckedNum(DstLimits::lowest()).UnsignedAbs());
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      MakeCheckedNum(DstLimits::max()).UnsignedAbs());
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0).UnsignedAbs());
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).UnsignedAbs());
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).UnsignedAbs());
-
-  TEST_EXPECTED_VALUE(DstLimits::Overflow(),
-                      ClampedNumeric<Dst>(DstLimits::lowest()) / -1);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(-1) / 2);
-  TEST_EXPECTED_VALUE(DstLimits::Overflow(),
-                      ClampedNumeric<Dst>(DstLimits::lowest()) * -1);
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      ClampedNumeric<Dst>(DstLimits::lowest() + 1) * Dst(-1));
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      ClampedNumeric<Dst>(-1) * Dst(DstLimits::lowest() + 1));
-  TEST_EXPECTED_VALUE(DstLimits::lowest(),
-                      ClampedNumeric<Dst>(DstLimits::lowest()) * Dst(1));
-  TEST_EXPECTED_VALUE(DstLimits::lowest(),
-                      ClampedNumeric<Dst>(1) * Dst(DstLimits::lowest()));
-  TEST_EXPECTED_VALUE(
-      typename std::make_unsigned<Dst>::type(0) - DstLimits::lowest(),
-      MakeClampedNum(DstLimits::lowest()).UnsignedAbs());
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      MakeClampedNum(DstLimits::max()).UnsignedAbs());
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0).UnsignedAbs());
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1).UnsignedAbs());
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(-1).UnsignedAbs());
-
-  // Modulus is legal only for integers.
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
-  TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2);
-  TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % -2);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2);
-  // Test all the different modulus combinations.
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
-  CheckedNumeric<Dst> checked_dst = 1;
-  TEST_EXPECTED_VALUE(0, checked_dst %= 1);
-  // Test that div by 0 is avoided but returns invalid result.
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) % 0);
-  // Test bit shifts.
-  volatile Dst negative_one = -1;
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) << negative_one);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1)
-                        << (IntegerBitsPlusSign<Dst>::value - 1));
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(0)
-                        << IntegerBitsPlusSign<Dst>::value);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1);
-  TEST_EXPECTED_VALUE(
-      static_cast<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 2),
-      CheckedNumeric<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 2));
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0)
-                             << (IntegerBitsPlusSign<Dst>::value - 1));
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0);
-  TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >>
-                        IntegerBitsPlusSign<Dst>::value);
-  TEST_EXPECTED_VALUE(
-      0, CheckedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value - 1));
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> negative_one);
-
-  // Modulus is legal only for integers.
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>() % 1);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % 1);
-  TEST_EXPECTED_VALUE(-1, ClampedNumeric<Dst>(-1) % 2);
-  TEST_EXPECTED_VALUE(-1, ClampedNumeric<Dst>(-1) % -2);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(DstLimits::lowest()) % 2);
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(DstLimits::max()) % 2);
-  // Test all the different modulus combinations.
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, 1 % ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % 1);
-  ClampedNumeric<Dst> clamped_dst = 1;
-  TEST_EXPECTED_VALUE(0, clamped_dst %= 1);
-  TEST_EXPECTED_VALUE(Dst(1), ClampedNumeric<Dst>(1) % 0);
-  // Test bit shifts.
-  TEST_EXPECTED_VALUE(DstLimits::Overflow(),
-                      ClampedNumeric<Dst>(1)
-                          << (IntegerBitsPlusSign<Dst>::value - 1U));
-  TEST_EXPECTED_VALUE(Dst(0), ClampedNumeric<Dst>(0)
-                                  << (IntegerBitsPlusSign<Dst>::value + 0U));
-  TEST_EXPECTED_VALUE(DstLimits::Overflow(),
-                      ClampedNumeric<Dst>(DstLimits::max()) << 1U);
-  TEST_EXPECTED_VALUE(
-      static_cast<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 2U),
-      ClampedNumeric<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 2U));
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0)
-                             << (IntegerBitsPlusSign<Dst>::value - 1U));
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) << 0U);
-  TEST_EXPECTED_VALUE(2, ClampedNumeric<Dst>(1) << 1U);
-  TEST_EXPECTED_VALUE(
-      0, ClampedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value + 0U));
-  TEST_EXPECTED_VALUE(
-      0, ClampedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value - 1U));
-  TEST_EXPECTED_VALUE(
-      -1, ClampedNumeric<Dst>(-1) >> (IntegerBitsPlusSign<Dst>::value - 1U));
-  TEST_EXPECTED_VALUE(-1, ClampedNumeric<Dst>(DstLimits::lowest()) >>
-                              (IntegerBitsPlusSign<Dst>::value - 0U));
-
-  TestStrictPointerMath<Dst>();
-}
-
-// Unsigned integer arithmetic.
-template <typename Dst>
-static void TestSpecializedArithmetic(
-    const char* dst,
-    int line,
-    typename std::enable_if<numeric_limits<Dst>::is_integer &&
-                                !numeric_limits<Dst>::is_signed,
-                            int>::type = 0) {
-  using DstLimits = SaturationDefaultLimits<Dst>;
-  TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::lowest()));
-  TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).Abs());
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) + -1);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) - 1);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) * 2);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2);
-  TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).UnsignedAbs());
-  TEST_EXPECTED_SUCCESS(
-      CheckedNumeric<typename std::make_signed<Dst>::type>(
-          std::numeric_limits<typename std::make_signed<Dst>::type>::lowest())
-          .UnsignedAbs());
-  TEST_EXPECTED_VALUE(DstLimits::lowest(),
-                      MakeCheckedNum(DstLimits::lowest()).UnsignedAbs());
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      MakeCheckedNum(DstLimits::max()).UnsignedAbs());
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0).UnsignedAbs());
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).UnsignedAbs());
-
-  TEST_EXPECTED_VALUE(0, -ClampedNumeric<Dst>(DstLimits::lowest()));
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(DstLimits::lowest()).Abs());
-  TEST_EXPECTED_VALUE(DstLimits::Underflow(),
-                      ClampedNumeric<Dst>(DstLimits::lowest()) + -1);
-  TEST_EXPECTED_VALUE(DstLimits::Underflow(),
-                      ClampedNumeric<Dst>(DstLimits::lowest()) - 1);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(DstLimits::lowest()) * 2);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) / 2);
-  TEST_EXPECTED_VALUE(0,
-                      ClampedNumeric<Dst>(DstLimits::lowest()).UnsignedAbs());
-  TEST_EXPECTED_VALUE(
-      as_unsigned(
-          std::numeric_limits<typename std::make_signed<Dst>::type>::lowest()),
-      ClampedNumeric<typename std::make_signed<Dst>::type>(
-          std::numeric_limits<typename std::make_signed<Dst>::type>::lowest())
-          .UnsignedAbs());
-  TEST_EXPECTED_VALUE(DstLimits::lowest(),
-                      MakeClampedNum(DstLimits::lowest()).UnsignedAbs());
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      MakeClampedNum(DstLimits::max()).UnsignedAbs());
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0).UnsignedAbs());
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1).UnsignedAbs());
-
-  // Modulus is legal only for integers.
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::lowest()) % 2);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2);
-  // Test all the different modulus combinations.
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
-  CheckedNumeric<Dst> checked_dst = 1;
-  TEST_EXPECTED_VALUE(0, checked_dst %= 1);
-  // Test that div by 0 is avoided but returns invalid result.
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) % 0);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1)
-                        << IntegerBitsPlusSign<Dst>::value);
-  // Test bit shifts.
-  volatile int negative_one = -1;
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) << negative_one);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1)
-                        << IntegerBitsPlusSign<Dst>::value);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(0)
-                        << IntegerBitsPlusSign<Dst>::value);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) << 1);
-  TEST_EXPECTED_VALUE(
-      static_cast<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 1),
-      CheckedNumeric<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 1));
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) << 0);
-  TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) << 1);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >>
-                        IntegerBitsPlusSign<Dst>::value);
-  TEST_EXPECTED_VALUE(
-      0, CheckedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value - 1));
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) >> negative_one);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) & 1);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & 0);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) & 1);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) & 0);
-  TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
-                      MakeCheckedNum(DstLimits::max()) & -1);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | 1);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) | 0);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) | 1);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) | 0);
-  TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
-                      CheckedNumeric<Dst>(0) | static_cast<Dst>(-1));
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) ^ 1);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) ^ 0);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(0) ^ 1);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(0) ^ 0);
-  TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
-                      CheckedNumeric<Dst>(0) ^ static_cast<Dst>(-1));
-  TEST_EXPECTED_VALUE(DstLimits::max(), ~CheckedNumeric<Dst>(0));
-
-  // Modulus is legal only for integers.
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>() % 1);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % 1);
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) % 2);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(DstLimits::lowest()) % 2);
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(DstLimits::max()) % 2);
-  // Test all the different modulus combinations.
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, 1 % ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) % 1);
-  ClampedNumeric<Dst> clamped_dst = 1;
-  TEST_EXPECTED_VALUE(0, clamped_dst %= 1);
-  // Test that div by 0 is avoided but returns invalid result.
-  TEST_EXPECTED_VALUE(Dst(1), ClampedNumeric<Dst>(1) % 0);
-  // Test bit shifts.
-  TEST_EXPECTED_VALUE(DstLimits::Overflow(),
-                      ClampedNumeric<Dst>(1)
-                          << as_unsigned(IntegerBitsPlusSign<Dst>::value));
-  TEST_EXPECTED_VALUE(Dst(0), ClampedNumeric<Dst>(0) << as_unsigned(
-                                  IntegerBitsPlusSign<Dst>::value));
-  TEST_EXPECTED_VALUE(DstLimits::Overflow(),
-                      ClampedNumeric<Dst>(DstLimits::max()) << 1U);
-  TEST_EXPECTED_VALUE(
-      static_cast<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 1U),
-      ClampedNumeric<Dst>(1) << (IntegerBitsPlusSign<Dst>::value - 1U));
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) << 0U);
-  TEST_EXPECTED_VALUE(2, ClampedNumeric<Dst>(1) << 1U);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) >>
-                             as_unsigned(IntegerBitsPlusSign<Dst>::value));
-  TEST_EXPECTED_VALUE(
-      0, ClampedNumeric<Dst>(1) >> (IntegerBitsPlusSign<Dst>::value - 1U));
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) & 1);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) & 0);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0) & 1);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) & 0);
-  TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
-                      MakeClampedNum(DstLimits::max()) & -1);
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) | 1);
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) | 0);
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(0) | 1);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0) | 0);
-  TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
-                      ClampedNumeric<Dst>(0) | static_cast<Dst>(-1));
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) ^ 1);
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) ^ 0);
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(0) ^ 1);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0) ^ 0);
-  TEST_EXPECTED_VALUE(std::numeric_limits<Dst>::max(),
-                      ClampedNumeric<Dst>(0) ^ static_cast<Dst>(-1));
-  TEST_EXPECTED_VALUE(DstLimits::max(), ~ClampedNumeric<Dst>(0));
-
-  TestStrictPointerMath<Dst>();
-}
-
-// Floating point arithmetic.
-template <typename Dst>
-void TestSpecializedArithmetic(
-    const char* dst,
-    int line,
-    typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0) {
-  using DstLimits = SaturationDefaultLimits<Dst>;
-  TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::lowest()));
-
-  TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()).Abs());
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs());
-
-  TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) + -1);
-  TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + 1);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) +
-                        DstLimits::lowest());
-
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) -
-                        DstLimits::lowest());
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) -
-                        DstLimits::max());
-
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::lowest()) * 2);
-
-  TEST_EXPECTED_VALUE(-0.5, CheckedNumeric<Dst>(-1.0) / 2);
-
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      -ClampedNumeric<Dst>(DstLimits::lowest()));
-
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      ClampedNumeric<Dst>(DstLimits::lowest()).Abs());
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(-1).Abs());
-
-  TEST_EXPECTED_VALUE(DstLimits::lowest() - 1,
-                      ClampedNumeric<Dst>(DstLimits::lowest()) + -1);
-  TEST_EXPECTED_VALUE(DstLimits::max() + 1,
-                      ClampedNumeric<Dst>(DstLimits::max()) + 1);
-  TEST_EXPECTED_VALUE(
-      DstLimits::Underflow(),
-      ClampedNumeric<Dst>(DstLimits::lowest()) + DstLimits::lowest());
-
-  TEST_EXPECTED_VALUE(
-      DstLimits::Overflow(),
-      ClampedNumeric<Dst>(DstLimits::max()) - DstLimits::lowest());
-  TEST_EXPECTED_VALUE(
-      DstLimits::Underflow(),
-      ClampedNumeric<Dst>(DstLimits::lowest()) - DstLimits::max());
-
-  TEST_EXPECTED_VALUE(DstLimits::Underflow(),
-                      ClampedNumeric<Dst>(DstLimits::lowest()) * 2);
-
-  TEST_EXPECTED_VALUE(-0.5, ClampedNumeric<Dst>(-1.0) / 2);
-}
-
-// Generic arithmetic tests.
-template <typename Dst>
-static void TestArithmetic(const char* dst, int line) {
-  using DstLimits = SaturationDefaultLimits<Dst>;
-
-  EXPECT_EQ(true, CheckedNumeric<Dst>().IsValid());
-  EXPECT_EQ(false, CheckedNumeric<Dst>(CheckedNumeric<Dst>(DstLimits::max()) *
-                                       DstLimits::max())
-                       .IsValid());
-  EXPECT_EQ(static_cast<Dst>(0), CheckedNumeric<Dst>().ValueOrDie());
-  EXPECT_EQ(static_cast<Dst>(0), CheckedNumeric<Dst>().ValueOrDefault(1));
-  EXPECT_EQ(static_cast<Dst>(1),
-            CheckedNumeric<Dst>(CheckedNumeric<Dst>(DstLimits::max()) *
-                                DstLimits::max())
-                .ValueOrDefault(1));
-
-  // Test the operator combinations.
-  TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) + CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) - CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) * CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(2, 1 + CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, 1 - CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(1, 1 * CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(1, 1 / CheckedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) + 1);
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) - 1);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) * 1);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1);
-  CheckedNumeric<Dst> checked_dst = 1;
-  TEST_EXPECTED_VALUE(2, checked_dst += 1);
-  checked_dst = 1;
-  TEST_EXPECTED_VALUE(0, checked_dst -= 1);
-  checked_dst = 1;
-  TEST_EXPECTED_VALUE(1, checked_dst *= 1);
-  checked_dst = 1;
-  TEST_EXPECTED_VALUE(1, checked_dst /= 1);
-
-  TEST_EXPECTED_VALUE(2, ClampedNumeric<Dst>(1) + ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) - ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) * ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) / ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(2, 1 + ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(0, 1 - ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(1, 1 * ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(1, 1 / ClampedNumeric<Dst>(1));
-  TEST_EXPECTED_VALUE(2, ClampedNumeric<Dst>(1) + 1);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(1) - 1);
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) * 1);
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) / 1);
-  ClampedNumeric<Dst> clamped_dst = 1;
-  TEST_EXPECTED_VALUE(2, clamped_dst += 1);
-  clamped_dst = 1;
-  TEST_EXPECTED_VALUE(0, clamped_dst -= 1);
-  clamped_dst = 1;
-  TEST_EXPECTED_VALUE(1, clamped_dst *= 1);
-  clamped_dst = 1;
-  TEST_EXPECTED_VALUE(1, clamped_dst /= 1);
-
-  // Generic negation.
-  if (DstLimits::is_signed) {
-    TEST_EXPECTED_VALUE(0, -CheckedNumeric<Dst>());
-    TEST_EXPECTED_VALUE(-1, -CheckedNumeric<Dst>(1));
-    TEST_EXPECTED_VALUE(1, -CheckedNumeric<Dst>(-1));
-    TEST_EXPECTED_VALUE(static_cast<Dst>(DstLimits::max() * -1),
-                        -CheckedNumeric<Dst>(DstLimits::max()));
-
-    TEST_EXPECTED_VALUE(0, -ClampedNumeric<Dst>());
-    TEST_EXPECTED_VALUE(-1, -ClampedNumeric<Dst>(1));
-    TEST_EXPECTED_VALUE(1, -ClampedNumeric<Dst>(-1));
-    TEST_EXPECTED_VALUE(static_cast<Dst>(DstLimits::max() * -1),
-                        -ClampedNumeric<Dst>(DstLimits::max()));
-
-    // The runtime paths for saturated negation differ significantly from what
-    // gets evaluated at compile-time. Making this test volatile forces the
-    // compiler to generate code rather than fold constant expressions.
-    volatile Dst value = Dst(0);
-    TEST_EXPECTED_VALUE(0, -MakeClampedNum(value));
-    value = Dst(1);
-    TEST_EXPECTED_VALUE(-1, -MakeClampedNum(value));
-    value = Dst(2);
-    TEST_EXPECTED_VALUE(-2, -MakeClampedNum(value));
-    value = Dst(-1);
-    TEST_EXPECTED_VALUE(1, -MakeClampedNum(value));
-    value = Dst(-2);
-    TEST_EXPECTED_VALUE(2, -MakeClampedNum(value));
-    value = DstLimits::max();
-    TEST_EXPECTED_VALUE(Dst(DstLimits::max() * -1), -MakeClampedNum(value));
-    value = Dst(-1 * DstLimits::max());
-    TEST_EXPECTED_VALUE(DstLimits::max(), -MakeClampedNum(value));
-    value = DstLimits::lowest();
-    TEST_EXPECTED_VALUE(DstLimits::max(), -MakeClampedNum(value));
-  }
-
-  // Generic absolute value.
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>().Abs());
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).Abs());
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      CheckedNumeric<Dst>(DstLimits::max()).Abs());
-
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>().Abs());
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1).Abs());
-  TEST_EXPECTED_VALUE(DstLimits::max(),
-                      ClampedNumeric<Dst>(DstLimits::max()).Abs());
-
-  // Generic addition.
-  TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1));
-  TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1));
-  if (numeric_limits<Dst>::is_signed)
-    TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1));
-  TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::lowest()) + 1);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) +
-                        DstLimits::max());
-
-  TEST_EXPECTED_VALUE(1, (ClampedNumeric<Dst>() + 1));
-  TEST_EXPECTED_VALUE(2, (ClampedNumeric<Dst>(1) + 1));
-  if (numeric_limits<Dst>::is_signed)
-    TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>(-1) + 1));
-  TEST_EXPECTED_VALUE(DstLimits::lowest() + 1,
-                      ClampedNumeric<Dst>(DstLimits::lowest()) + 1);
-  TEST_EXPECTED_VALUE(DstLimits::Overflow(),
-                      ClampedNumeric<Dst>(DstLimits::max()) + DstLimits::max());
-
-  // Generic subtraction.
-  TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1));
-  TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) - 1);
-  if (numeric_limits<Dst>::is_signed) {
-    TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1));
-    TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1));
-  } else {
-    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) - -1);
-  }
-
-  TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>(1) - 1));
-  TEST_EXPECTED_VALUE(DstLimits::max() - 1,
-                      ClampedNumeric<Dst>(DstLimits::max()) - 1);
-  if (numeric_limits<Dst>::is_signed) {
-    TEST_EXPECTED_VALUE(-1, (ClampedNumeric<Dst>() - 1));
-    TEST_EXPECTED_VALUE(-2, (ClampedNumeric<Dst>(-1) - 1));
-  } else {
-    TEST_EXPECTED_VALUE(DstLimits::max(),
-                        ClampedNumeric<Dst>(DstLimits::max()) - -1);
-  }
-
-  // Generic multiplication.
-  TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1));
-  TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1));
-  TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0));
-  if (numeric_limits<Dst>::is_signed) {
-    TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0));
-    TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1));
-    TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2));
-  } else {
-    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) * -2);
-    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) *
-                          CheckedNumeric<uintmax_t>(-2));
-  }
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) *
-                        DstLimits::max());
-
-  TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>() * 1));
-  TEST_EXPECTED_VALUE(1, (ClampedNumeric<Dst>(1) * 1));
-  TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>(0) * 0));
-  if (numeric_limits<Dst>::is_signed) {
-    TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>(-1) * 0));
-    TEST_EXPECTED_VALUE(0, (ClampedNumeric<Dst>(0) * -1));
-    TEST_EXPECTED_VALUE(-2, (ClampedNumeric<Dst>(-1) * 2));
-  } else {
-    TEST_EXPECTED_VALUE(DstLimits::Underflow(),
-                        ClampedNumeric<Dst>(DstLimits::max()) * -2);
-    TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(DstLimits::max()) *
-                               ClampedNumeric<uintmax_t>(-2));
-  }
-  TEST_EXPECTED_VALUE(DstLimits::Overflow(),
-                      ClampedNumeric<Dst>(DstLimits::max()) * DstLimits::max());
-
-  // Generic division.
-  TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1);
-  TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1);
-  TEST_EXPECTED_VALUE(DstLimits::lowest() / 2,
-                      CheckedNumeric<Dst>(DstLimits::lowest()) / 2);
-  TEST_EXPECTED_VALUE(DstLimits::max() / 2,
-                      CheckedNumeric<Dst>(DstLimits::max()) / 2);
-  TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(1) / 0);
-
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>() / 1);
-  TEST_EXPECTED_VALUE(1, ClampedNumeric<Dst>(1) / 1);
-  TEST_EXPECTED_VALUE(DstLimits::lowest() / 2,
-                      ClampedNumeric<Dst>(DstLimits::lowest()) / 2);
-  TEST_EXPECTED_VALUE(DstLimits::max() / 2,
-                      ClampedNumeric<Dst>(DstLimits::max()) / 2);
-  TEST_EXPECTED_VALUE(DstLimits::Overflow(), ClampedNumeric<Dst>(1) / 0);
-  TEST_EXPECTED_VALUE(DstLimits::Underflow(), ClampedNumeric<Dst>(-1) / 0);
-  TEST_EXPECTED_VALUE(0, ClampedNumeric<Dst>(0) / 0);
-
-  TestSpecializedArithmetic<Dst>(dst, line);
-}
-
-// Helper macro to wrap displaying the conversion types and line numbers.
-#define TEST_ARITHMETIC(Dst) TestArithmetic<Dst>(#Dst, __LINE__)
-
-TEST(SafeNumerics, SignedIntegerMath) {
-  TEST_ARITHMETIC(int8_t);
-  TEST_ARITHMETIC(int16_t);
-  TEST_ARITHMETIC(int);
-  TEST_ARITHMETIC(intptr_t);
-  TEST_ARITHMETIC(intmax_t);
-}
-
-TEST(SafeNumerics, UnsignedIntegerMath) {
-  TEST_ARITHMETIC(uint8_t);
-  TEST_ARITHMETIC(uint16_t);
-  TEST_ARITHMETIC(unsigned int);
-  TEST_ARITHMETIC(uintptr_t);
-  TEST_ARITHMETIC(uintmax_t);
-}
-
-TEST(SafeNumerics, FloatingPointMath) {
-  TEST_ARITHMETIC(float);
-  TEST_ARITHMETIC(double);
-}
-
-// Enumerates the five different conversions types we need to test.
-enum NumericConversionType {
-  SIGN_PRESERVING_VALUE_PRESERVING,
-  SIGN_PRESERVING_NARROW,
-  SIGN_TO_UNSIGN_WIDEN_OR_EQUAL,
-  SIGN_TO_UNSIGN_NARROW,
-  UNSIGN_TO_SIGN_NARROW_OR_EQUAL,
-};
-
-// Template covering the different conversion tests.
-template <typename Dst, typename Src, NumericConversionType conversion>
-struct TestNumericConversion {};
-
-enum RangeConstraint {
-  RANGE_VALID = 0x0,      // Value can be represented by the destination type.
-  RANGE_UNDERFLOW = 0x1,  // Value would underflow.
-  RANGE_OVERFLOW = 0x2,   // Value would overflow.
-  RANGE_INVALID = RANGE_UNDERFLOW | RANGE_OVERFLOW  // Invalid (i.e. NaN).
-};
-
-// These are some wrappers to make the tests a bit cleaner.
-constexpr RangeConstraint RangeCheckToEnum(const RangeCheck constraint) {
-  return static_cast<RangeConstraint>(
-      static_cast<int>(constraint.IsOverflowFlagSet()) << 1 |
-      static_cast<int>(constraint.IsUnderflowFlagSet()));
-}
-
-// EXPECT_EQ wrappers providing specific detail on test failures.
-#define TEST_EXPECTED_RANGE(expected, actual)                               \
-  EXPECT_EQ(expected,                                                       \
-            RangeCheckToEnum(DstRangeRelationToSrcRange<Dst>(actual)))      \
-      << "Conversion test: " << src << " value " << actual << " to " << dst \
-      << " on line " << line
-
-template <typename Dst, typename Src>
-void TestStrictComparison(const char* dst, const char* src, int line) {
-  using DstLimits = numeric_limits<Dst>;
-  using SrcLimits = numeric_limits<Src>;
-  static_assert(StrictNumeric<Src>(SrcLimits::lowest()) < DstLimits::max(), "");
-  static_assert(StrictNumeric<Src>(SrcLimits::lowest()) < SrcLimits::max(), "");
-  static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) >= DstLimits::max()),
-                "");
-  static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) >= SrcLimits::max()),
-                "");
-  static_assert(StrictNumeric<Src>(SrcLimits::lowest()) <= DstLimits::max(),
-                "");
-  static_assert(StrictNumeric<Src>(SrcLimits::lowest()) <= SrcLimits::max(),
-                "");
-  static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) > DstLimits::max()),
-                "");
-  static_assert(!(StrictNumeric<Src>(SrcLimits::lowest()) > SrcLimits::max()),
-                "");
-  static_assert(StrictNumeric<Src>(SrcLimits::max()) > DstLimits::lowest(), "");
-  static_assert(StrictNumeric<Src>(SrcLimits::max()) > SrcLimits::lowest(), "");
-  static_assert(!(StrictNumeric<Src>(SrcLimits::max()) <= DstLimits::lowest()),
-                "");
-  static_assert(!(StrictNumeric<Src>(SrcLimits::max()) <= SrcLimits::lowest()),
-                "");
-  static_assert(StrictNumeric<Src>(SrcLimits::max()) >= DstLimits::lowest(),
-                "");
-  static_assert(StrictNumeric<Src>(SrcLimits::max()) >= SrcLimits::lowest(),
-                "");
-  static_assert(!(StrictNumeric<Src>(SrcLimits::max()) < DstLimits::lowest()),
-                "");
-  static_assert(!(StrictNumeric<Src>(SrcLimits::max()) < SrcLimits::lowest()),
-                "");
-  static_assert(StrictNumeric<Src>(static_cast<Src>(1)) == static_cast<Dst>(1),
-                "");
-  static_assert(StrictNumeric<Src>(static_cast<Src>(1)) != static_cast<Dst>(0),
-                "");
-  static_assert(StrictNumeric<Src>(SrcLimits::max()) != static_cast<Dst>(0),
-                "");
-  static_assert(StrictNumeric<Src>(SrcLimits::max()) != DstLimits::lowest(),
-                "");
-  static_assert(
-      !(StrictNumeric<Src>(static_cast<Src>(1)) != static_cast<Dst>(1)), "");
-  static_assert(
-      !(StrictNumeric<Src>(static_cast<Src>(1)) == static_cast<Dst>(0)), "");
-
-  // Due to differences in float handling between compilers, these aren't
-  // compile-time constants everywhere. So, we use run-time tests.
-  EXPECT_EQ(
-      SrcLimits::max(),
-      MakeCheckedNum(SrcLimits::max()).Max(DstLimits::lowest()).ValueOrDie());
-  EXPECT_EQ(
-      DstLimits::max(),
-      MakeCheckedNum(SrcLimits::lowest()).Max(DstLimits::max()).ValueOrDie());
-  EXPECT_EQ(
-      DstLimits::lowest(),
-      MakeCheckedNum(SrcLimits::max()).Min(DstLimits::lowest()).ValueOrDie());
-  EXPECT_EQ(
-      SrcLimits::lowest(),
-      MakeCheckedNum(SrcLimits::lowest()).Min(DstLimits::max()).ValueOrDie());
-  EXPECT_EQ(SrcLimits::lowest(), CheckMin(MakeStrictNum(1), MakeCheckedNum(0),
-                                          DstLimits::max(), SrcLimits::lowest())
-                                     .ValueOrDie());
-  EXPECT_EQ(DstLimits::max(), CheckMax(MakeStrictNum(1), MakeCheckedNum(0),
-                                       DstLimits::max(), SrcLimits::lowest())
-                                  .ValueOrDie());
-
-  EXPECT_EQ(SrcLimits::max(),
-            MakeClampedNum(SrcLimits::max()).Max(DstLimits::lowest()));
-  EXPECT_EQ(DstLimits::max(),
-            MakeClampedNum(SrcLimits::lowest()).Max(DstLimits::max()));
-  EXPECT_EQ(DstLimits::lowest(),
-            MakeClampedNum(SrcLimits::max()).Min(DstLimits::lowest()));
-  EXPECT_EQ(SrcLimits::lowest(),
-            MakeClampedNum(SrcLimits::lowest()).Min(DstLimits::max()));
-  EXPECT_EQ(SrcLimits::lowest(),
-            ClampMin(MakeStrictNum(1), MakeClampedNum(0), DstLimits::max(),
-                     SrcLimits::lowest()));
-  EXPECT_EQ(DstLimits::max(), ClampMax(MakeStrictNum(1), MakeClampedNum(0),
-                                       DstLimits::max(), SrcLimits::lowest()));
-
-  if (IsValueInRangeForNumericType<Dst>(SrcLimits::max())) {
-    TEST_EXPECTED_VALUE(Dst(SrcLimits::max()), (CommonMax<Dst, Src>()));
-    TEST_EXPECTED_VALUE(Dst(SrcLimits::max()),
-                        (CommonMaxOrMin<Dst, Src>(false)));
-  } else {
-    TEST_EXPECTED_VALUE(DstLimits::max(), (CommonMax<Dst, Src>()));
-    TEST_EXPECTED_VALUE(DstLimits::max(), (CommonMaxOrMin<Dst, Src>(false)));
-  }
-
-  if (IsValueInRangeForNumericType<Dst>(SrcLimits::lowest())) {
-    TEST_EXPECTED_VALUE(Dst(SrcLimits::lowest()), (CommonMin<Dst, Src>()));
-    TEST_EXPECTED_VALUE(Dst(SrcLimits::lowest()),
-                        (CommonMaxOrMin<Dst, Src>(true)));
-  } else {
-    TEST_EXPECTED_VALUE(DstLimits::lowest(), (CommonMin<Dst, Src>()));
-    TEST_EXPECTED_VALUE(DstLimits::lowest(), (CommonMaxOrMin<Dst, Src>(true)));
-  }
-}
-
-template <typename Dst, typename Src>
-struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_VALUE_PRESERVING> {
-  static void Test(const char* dst, const char* src, int line) {
-    using SrcLimits = SaturationDefaultLimits<Src>;
-    using DstLimits = SaturationDefaultLimits<Dst>;
-    // Integral to floating.
-    static_assert((DstLimits::is_iec559 && SrcLimits::is_integer) ||
-                      // Not floating to integral and...
-                      (!(DstLimits::is_integer && SrcLimits::is_iec559) &&
-                       // Same sign, same numeric, source is narrower or same.
-                       ((SrcLimits::is_signed == DstLimits::is_signed &&
-                         MaxExponent<Dst>::value >= MaxExponent<Src>::value) ||
-                        // Or signed destination and source is smaller
-                        (DstLimits::is_signed &&
-                         MaxExponent<Dst>::value >= MaxExponent<Src>::value))),
-                  "Comparison must be sign preserving and value preserving");
-
-    TestStrictComparison<Dst, Src>(dst, src, line);
-
-    const CheckedNumeric<Dst> checked_dst = SrcLimits::max();
-    const ClampedNumeric<Dst> clamped_dst = SrcLimits::max();
-    TEST_EXPECTED_SUCCESS(checked_dst);
-    TEST_EXPECTED_VALUE(Dst(SrcLimits::max()), clamped_dst);
-    if (MaxExponent<Dst>::value > MaxExponent<Src>::value) {
-      if (MaxExponent<Dst>::value >= MaxExponent<Src>::value * 2 - 1) {
-        // At least twice larger type.
-        TEST_EXPECTED_SUCCESS(SrcLimits::max() * checked_dst);
-        TEST_EXPECTED_VALUE(SrcLimits::max() * clamped_dst,
-                            Dst(SrcLimits::max()) * SrcLimits::max());
-      } else {  // Larger, but not at least twice as large.
-        TEST_EXPECTED_FAILURE(SrcLimits::max() * checked_dst);
-        TEST_EXPECTED_SUCCESS(checked_dst + 1);
-        TEST_EXPECTED_VALUE(DstLimits::Overflow(),
-                            SrcLimits::max() * clamped_dst);
-        TEST_EXPECTED_VALUE(Dst(SrcLimits::max()) + Dst(1),
-                            clamped_dst + Dst(1));
-      }
-    } else {  // Same width type.
-      TEST_EXPECTED_FAILURE(checked_dst + 1);
-      TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst + Dst(1));
-    }
-
-    TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max());
-    TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
-    if (SrcLimits::is_iec559) {
-      TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max() * static_cast<Src>(-1));
-      TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
-      TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
-      TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
-    } else if (numeric_limits<Src>::is_signed) {
-      // This block reverses the Src to Dst relationship so we don't have to
-      // complicate the test macros.
-      if (!std::is_same<Src, Dst>::value) {
-        TEST_EXPECTED_SUCCESS(CheckDiv(SrcLimits::lowest(), Dst(-1)));
-      }
-      TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
-      TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest());
-    }
-  }
-};
-
-template <typename Dst, typename Src>
-struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_NARROW> {
-  static void Test(const char* dst, const char* src, int line) {
-    using SrcLimits = SaturationDefaultLimits<Src>;
-    using DstLimits = SaturationDefaultLimits<Dst>;
-    static_assert(SrcLimits::is_signed == DstLimits::is_signed,
-                  "Destination and source sign must be the same");
-    static_assert(MaxExponent<Dst>::value <= MaxExponent<Src>::value,
-                  "Destination must be narrower than source");
-
-    TestStrictComparison<Dst, Src>(dst, src, line);
-
-    const CheckedNumeric<Dst> checked_dst;
-    TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
-    TEST_EXPECTED_VALUE(1, checked_dst + Src(1));
-    TEST_EXPECTED_FAILURE(checked_dst - SrcLimits::max());
-
-    ClampedNumeric<Dst> clamped_dst;
-    TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst + SrcLimits::max());
-    TEST_EXPECTED_VALUE(1, clamped_dst + Src(1));
-    TEST_EXPECTED_VALUE(DstLimits::Underflow(), clamped_dst - SrcLimits::max());
-    clamped_dst += SrcLimits::max();
-    TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst);
-    clamped_dst = DstLimits::max();
-    clamped_dst += SrcLimits::max();
-    TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst);
-    clamped_dst = DstLimits::max();
-    clamped_dst -= SrcLimits::max();
-    TEST_EXPECTED_VALUE(DstLimits::Underflow(), clamped_dst);
-    clamped_dst = 0;
-
-    TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
-    TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
-    if (SrcLimits::is_iec559) {
-      TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1);
-      TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
-      TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
-      TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
-      TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
-      if (DstLimits::is_integer) {
-        if (SrcLimits::digits < DstLimits::digits) {
-          TEST_EXPECTED_RANGE(RANGE_OVERFLOW,
-                              static_cast<Src>(DstLimits::max()));
-        } else {
-          TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max()));
-        }
-        TEST_EXPECTED_RANGE(
-            RANGE_VALID,
-            static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>()));
-        TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::lowest()));
-      }
-    } else if (SrcLimits::is_signed) {
-      TEST_EXPECTED_VALUE(-1, checked_dst - static_cast<Src>(1));
-      TEST_EXPECTED_VALUE(-1, clamped_dst - static_cast<Src>(1));
-      TEST_EXPECTED_VALUE(Src(Src(0) - DstLimits::lowest()),
-                          ClampDiv(DstLimits::lowest(), Src(-1)));
-      TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::lowest());
-      TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
-    } else {
-      TEST_EXPECTED_FAILURE(checked_dst - static_cast<Src>(1));
-      TEST_EXPECTED_VALUE(Dst(0), clamped_dst - static_cast<Src>(1));
-      TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest());
-    }
-  }
-};
-
-template <typename Dst, typename Src>
-struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL> {
-  static void Test(const char* dst, const char* src, int line) {
-    using SrcLimits = SaturationDefaultLimits<Src>;
-    using DstLimits = SaturationDefaultLimits<Dst>;
-    static_assert(MaxExponent<Dst>::value >= MaxExponent<Src>::value,
-                  "Destination must be equal or wider than source.");
-    static_assert(SrcLimits::is_signed, "Source must be signed");
-    static_assert(!DstLimits::is_signed, "Destination must be unsigned");
-
-    TestStrictComparison<Dst, Src>(dst, src, line);
-
-    const CheckedNumeric<Dst> checked_dst;
-    TEST_EXPECTED_VALUE(SrcLimits::max(), checked_dst + SrcLimits::max());
-    TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1));
-    TEST_EXPECTED_SUCCESS(checked_dst * static_cast<Src>(-1));
-    TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::lowest());
-    TEST_EXPECTED_VALUE(Dst(0), CheckDiv(Dst(0), Src(-1)));
-
-    const ClampedNumeric<Dst> clamped_dst;
-    TEST_EXPECTED_VALUE(SrcLimits::max(), clamped_dst + SrcLimits::max());
-    TEST_EXPECTED_VALUE(DstLimits::Underflow(),
-                        clamped_dst + static_cast<Src>(-1));
-    TEST_EXPECTED_VALUE(0, clamped_dst * static_cast<Src>(-1));
-    TEST_EXPECTED_VALUE(DstLimits::Underflow(),
-                        clamped_dst + SrcLimits::lowest());
-
-    TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::lowest());
-    TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max());
-    TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
-    TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1));
-  }
-};
-
-template <typename Dst, typename Src>
-struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_NARROW> {
-  static void Test(const char* dst, const char* src, int line) {
-    using SrcLimits = SaturationDefaultLimits<Src>;
-    using DstLimits = SaturationDefaultLimits<Dst>;
-    static_assert(MaxExponent<Dst>::value < MaxExponent<Src>::value,
-                  "Destination must be narrower than source.");
-    static_assert(SrcLimits::is_signed, "Source must be signed.");
-    static_assert(!DstLimits::is_signed, "Destination must be unsigned.");
-
-    TestStrictComparison<Dst, Src>(dst, src, line);
-
-    const CheckedNumeric<Dst> checked_dst;
-    TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
-    TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
-    TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1));
-    TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::lowest());
-
-    ClampedNumeric<Dst> clamped_dst;
-    TEST_EXPECTED_VALUE(1, clamped_dst + static_cast<Src>(1));
-    TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst + SrcLimits::max());
-    TEST_EXPECTED_VALUE(DstLimits::Underflow(),
-                        clamped_dst + static_cast<Src>(-1));
-    TEST_EXPECTED_VALUE(DstLimits::Underflow(),
-                        clamped_dst + SrcLimits::lowest());
-    clamped_dst += SrcLimits::max();
-    TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst);
-    clamped_dst = DstLimits::max();
-    clamped_dst += SrcLimits::max();
-    TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst);
-    clamped_dst = DstLimits::max();
-    clamped_dst -= SrcLimits::max();
-    TEST_EXPECTED_VALUE(DstLimits::Underflow(), clamped_dst);
-    clamped_dst = 0;
-
-    TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
-    TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
-    TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1));
-
-    // Additional saturation tests.
-    EXPECT_EQ(DstLimits::max(), saturated_cast<Dst>(SrcLimits::max()));
-    EXPECT_EQ(DstLimits::lowest(), saturated_cast<Dst>(SrcLimits::lowest()));
-
-    if (SrcLimits::is_iec559) {
-      EXPECT_EQ(Dst(0), saturated_cast<Dst>(SrcLimits::quiet_NaN()));
-
-      TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1);
-      TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
-      TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
-      TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
-      if (DstLimits::is_integer) {
-        if (SrcLimits::digits < DstLimits::digits) {
-          TEST_EXPECTED_RANGE(RANGE_OVERFLOW,
-                              static_cast<Src>(DstLimits::max()));
-        } else {
-          TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max()));
-        }
-        TEST_EXPECTED_RANGE(
-            RANGE_VALID,
-            static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>()));
-        TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::lowest()));
-      }
-    } else {
-      TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::lowest());
-    }
-  }
-};
-
-template <typename Dst, typename Src>
-struct TestNumericConversion<Dst, Src, UNSIGN_TO_SIGN_NARROW_OR_EQUAL> {
-  static void Test(const char* dst, const char* src, int line) {
-    using SrcLimits = SaturationDefaultLimits<Src>;
-    using DstLimits = SaturationDefaultLimits<Dst>;
-    static_assert(MaxExponent<Dst>::value <= MaxExponent<Src>::value,
-                  "Destination must be narrower or equal to source.");
-    static_assert(!SrcLimits::is_signed, "Source must be unsigned.");
-    static_assert(DstLimits::is_signed, "Destination must be signed.");
-
-    TestStrictComparison<Dst, Src>(dst, src, line);
-
-    const CheckedNumeric<Dst> checked_dst;
-    TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
-    TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
-    TEST_EXPECTED_VALUE(SrcLimits::lowest(), checked_dst + SrcLimits::lowest());
-
-    const ClampedNumeric<Dst> clamped_dst;
-    TEST_EXPECTED_VALUE(1, clamped_dst + static_cast<Src>(1));
-    TEST_EXPECTED_VALUE(DstLimits::Overflow(), clamped_dst + SrcLimits::max());
-    TEST_EXPECTED_VALUE(SrcLimits::lowest(), clamped_dst + SrcLimits::lowest());
-
-    TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::lowest());
-    TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
-    TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
-
-    // Additional saturation tests.
-    EXPECT_EQ(DstLimits::max(), saturated_cast<Dst>(SrcLimits::max()));
-    EXPECT_EQ(Dst(0), saturated_cast<Dst>(SrcLimits::lowest()));
-  }
-};
-
-// Helper macro to wrap displaying the conversion types and line numbers
-#define TEST_NUMERIC_CONVERSION(d, s, t) \
-  TestNumericConversion<d, s, t>::Test(#d, #s, __LINE__)
-
-TEST(SafeNumerics, IntMinOperations) {
-  TEST_NUMERIC_CONVERSION(int8_t, int8_t, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(uint8_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING);
-
-  TEST_NUMERIC_CONVERSION(int8_t, int16_t, SIGN_PRESERVING_NARROW);
-  TEST_NUMERIC_CONVERSION(int8_t, int, SIGN_PRESERVING_NARROW);
-  TEST_NUMERIC_CONVERSION(uint8_t, uint16_t, SIGN_PRESERVING_NARROW);
-  TEST_NUMERIC_CONVERSION(uint8_t, unsigned int, SIGN_PRESERVING_NARROW);
-  TEST_NUMERIC_CONVERSION(int8_t, float, SIGN_PRESERVING_NARROW);
-
-  TEST_NUMERIC_CONVERSION(uint8_t, int8_t, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);
-
-  TEST_NUMERIC_CONVERSION(uint8_t, int16_t, SIGN_TO_UNSIGN_NARROW);
-  TEST_NUMERIC_CONVERSION(uint8_t, int, SIGN_TO_UNSIGN_NARROW);
-  TEST_NUMERIC_CONVERSION(uint8_t, intmax_t, SIGN_TO_UNSIGN_NARROW);
-  TEST_NUMERIC_CONVERSION(uint8_t, float, SIGN_TO_UNSIGN_NARROW);
-
-  TEST_NUMERIC_CONVERSION(int8_t, uint16_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
-  TEST_NUMERIC_CONVERSION(int8_t, unsigned int, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
-  TEST_NUMERIC_CONVERSION(int8_t, uintmax_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
-}
-
-TEST(SafeNumerics, Int16Operations) {
-  TEST_NUMERIC_CONVERSION(int16_t, int16_t, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(uint16_t, uint16_t, SIGN_PRESERVING_VALUE_PRESERVING);
-
-  TEST_NUMERIC_CONVERSION(int16_t, int, SIGN_PRESERVING_NARROW);
-  TEST_NUMERIC_CONVERSION(uint16_t, unsigned int, SIGN_PRESERVING_NARROW);
-  TEST_NUMERIC_CONVERSION(int16_t, float, SIGN_PRESERVING_NARROW);
-
-  TEST_NUMERIC_CONVERSION(uint16_t, int16_t, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);
-
-  TEST_NUMERIC_CONVERSION(uint16_t, int, SIGN_TO_UNSIGN_NARROW);
-  TEST_NUMERIC_CONVERSION(uint16_t, intmax_t, SIGN_TO_UNSIGN_NARROW);
-  TEST_NUMERIC_CONVERSION(uint16_t, float, SIGN_TO_UNSIGN_NARROW);
-
-  TEST_NUMERIC_CONVERSION(int16_t, unsigned int,
-                          UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
-  TEST_NUMERIC_CONVERSION(int16_t, uintmax_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
-}
-
-TEST(SafeNumerics, IntOperations) {
-  TEST_NUMERIC_CONVERSION(int, int, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(unsigned int, unsigned int,
-                          SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(int, int8_t, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(unsigned int, uint8_t,
-                          SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(int, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING);
-
-  TEST_NUMERIC_CONVERSION(int, intmax_t, SIGN_PRESERVING_NARROW);
-  TEST_NUMERIC_CONVERSION(unsigned int, uintmax_t, SIGN_PRESERVING_NARROW);
-  TEST_NUMERIC_CONVERSION(int, float, SIGN_PRESERVING_NARROW);
-  TEST_NUMERIC_CONVERSION(int, double, SIGN_PRESERVING_NARROW);
-
-  TEST_NUMERIC_CONVERSION(unsigned int, int, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);
-  TEST_NUMERIC_CONVERSION(unsigned int, int8_t, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);
-
-  TEST_NUMERIC_CONVERSION(unsigned int, intmax_t, SIGN_TO_UNSIGN_NARROW);
-  TEST_NUMERIC_CONVERSION(unsigned int, float, SIGN_TO_UNSIGN_NARROW);
-  TEST_NUMERIC_CONVERSION(unsigned int, double, SIGN_TO_UNSIGN_NARROW);
-
-  TEST_NUMERIC_CONVERSION(int, unsigned int, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
-  TEST_NUMERIC_CONVERSION(int, uintmax_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
-}
-
-TEST(SafeNumerics, IntMaxOperations) {
-  TEST_NUMERIC_CONVERSION(intmax_t, intmax_t, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(uintmax_t, uintmax_t,
-                          SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(intmax_t, int, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(uintmax_t, unsigned int,
-                          SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(intmax_t, unsigned int,
-                          SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(intmax_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING);
-
-  TEST_NUMERIC_CONVERSION(intmax_t, float, SIGN_PRESERVING_NARROW);
-  TEST_NUMERIC_CONVERSION(intmax_t, double, SIGN_PRESERVING_NARROW);
-
-  TEST_NUMERIC_CONVERSION(uintmax_t, int, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);
-  TEST_NUMERIC_CONVERSION(uintmax_t, int8_t, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);
-
-  TEST_NUMERIC_CONVERSION(uintmax_t, float, SIGN_TO_UNSIGN_NARROW);
-  TEST_NUMERIC_CONVERSION(uintmax_t, double, SIGN_TO_UNSIGN_NARROW);
-
-  TEST_NUMERIC_CONVERSION(intmax_t, uintmax_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
-}
-
-TEST(SafeNumerics, FloatOperations) {
-  TEST_NUMERIC_CONVERSION(float, intmax_t, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(float, uintmax_t, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(float, int, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(float, unsigned int,
-                          SIGN_PRESERVING_VALUE_PRESERVING);
-
-  TEST_NUMERIC_CONVERSION(float, double, SIGN_PRESERVING_NARROW);
-}
-
-TEST(SafeNumerics, DoubleOperations) {
-  TEST_NUMERIC_CONVERSION(double, intmax_t, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(double, uintmax_t, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(double, int, SIGN_PRESERVING_VALUE_PRESERVING);
-  TEST_NUMERIC_CONVERSION(double, unsigned int,
-                          SIGN_PRESERVING_VALUE_PRESERVING);
-}
-
-TEST(SafeNumerics, SizeTOperations) {
-  TEST_NUMERIC_CONVERSION(size_t, int, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);
-  TEST_NUMERIC_CONVERSION(int, size_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
-}
-
-// A one-off test to ensure StrictNumeric won't resolve to an incorrect type.
-// If this fails we'll just get a compiler error on an ambiguous overload.
-int TestOverload(int) {  // Overload fails.
-  return 0;
-}
-uint8_t TestOverload(uint8_t) {  // Overload fails.
-  return 0;
-}
-size_t TestOverload(size_t) {  // Overload succeeds.
-  return 0;
-}
-
-static_assert(
-    std::is_same<decltype(TestOverload(StrictNumeric<int>())), int>::value,
-    "");
-static_assert(std::is_same<decltype(TestOverload(StrictNumeric<size_t>())),
-                           size_t>::value,
-              "");
-
-template <typename T>
-struct CastTest1 {
-  static constexpr T NaN() { return -1; }
-  static constexpr T max() { return numeric_limits<T>::max() - 1; }
-  static constexpr T Overflow() { return max(); }
-  static constexpr T lowest() { return numeric_limits<T>::lowest() + 1; }
-  static constexpr T Underflow() { return lowest(); }
-};
-
-template <typename T>
-struct CastTest2 {
-  static constexpr T NaN() { return 11; }
-  static constexpr T max() { return 10; }
-  static constexpr T Overflow() { return max(); }
-  static constexpr T lowest() { return 1; }
-  static constexpr T Underflow() { return lowest(); }
-};
-
-TEST(SafeNumerics, CastTests) {
-// MSVC catches and warns that we're forcing saturation in these tests.
-// Since that's intentional, we need to shut this warning off.
-#if defined(COMPILER_MSVC)
-#pragma warning(disable : 4756)
-#endif
-
-  int small_positive = 1;
-  int small_negative = -1;
-  double double_small = 1.0;
-  double double_large = numeric_limits<double>::max();
-  double double_infinity = numeric_limits<float>::infinity();
-  double double_large_int = numeric_limits<int>::max();
-  double double_small_int = numeric_limits<int>::lowest();
-
-  // Just test that the casts compile, since the other tests cover logic.
-  EXPECT_EQ(0, checked_cast<int>(static_cast<size_t>(0)));
-  EXPECT_EQ(0, strict_cast<int>(static_cast<char>(0)));
-  EXPECT_EQ(0, strict_cast<int>(static_cast<unsigned char>(0)));
-  EXPECT_EQ(0U, strict_cast<unsigned>(static_cast<unsigned char>(0)));
-  EXPECT_EQ(1ULL, static_cast<uint64_t>(StrictNumeric<size_t>(1U)));
-  EXPECT_EQ(1ULL, static_cast<uint64_t>(SizeT(1U)));
-  EXPECT_EQ(1U, static_cast<size_t>(StrictNumeric<unsigned>(1U)));
-
-  EXPECT_TRUE(CheckedNumeric<uint64_t>(StrictNumeric<unsigned>(1U)).IsValid());
-  EXPECT_TRUE(CheckedNumeric<int>(StrictNumeric<unsigned>(1U)).IsValid());
-  EXPECT_FALSE(CheckedNumeric<unsigned>(StrictNumeric<int>(-1)).IsValid());
-
-  EXPECT_TRUE(IsValueNegative(-1));
-  EXPECT_TRUE(IsValueNegative(numeric_limits<int>::lowest()));
-  EXPECT_FALSE(IsValueNegative(numeric_limits<unsigned>::lowest()));
-  EXPECT_TRUE(IsValueNegative(numeric_limits<double>::lowest()));
-  EXPECT_FALSE(IsValueNegative(0));
-  EXPECT_FALSE(IsValueNegative(1));
-  EXPECT_FALSE(IsValueNegative(0u));
-  EXPECT_FALSE(IsValueNegative(1u));
-  EXPECT_FALSE(IsValueNegative(numeric_limits<int>::max()));
-  EXPECT_FALSE(IsValueNegative(numeric_limits<unsigned>::max()));
-  EXPECT_FALSE(IsValueNegative(numeric_limits<double>::max()));
-
-  // These casts and coercions will fail to compile:
-  // EXPECT_EQ(0, strict_cast<int>(static_cast<size_t>(0)));
-  // EXPECT_EQ(0, strict_cast<size_t>(static_cast<int>(0)));
-  // EXPECT_EQ(1ULL, StrictNumeric<size_t>(1));
-  // EXPECT_EQ(1, StrictNumeric<size_t>(1U));
-
-  // Test various saturation corner cases.
-  EXPECT_EQ(saturated_cast<int>(small_negative),
-            static_cast<int>(small_negative));
-  EXPECT_EQ(saturated_cast<int>(small_positive),
-            static_cast<int>(small_positive));
-  EXPECT_EQ(saturated_cast<unsigned>(small_negative), static_cast<unsigned>(0));
-  EXPECT_EQ(saturated_cast<int>(double_small), static_cast<int>(double_small));
-  EXPECT_EQ(saturated_cast<int>(double_large), numeric_limits<int>::max());
-  EXPECT_EQ(saturated_cast<float>(double_large), double_infinity);
-  EXPECT_EQ(saturated_cast<float>(-double_large), -double_infinity);
-  EXPECT_EQ(numeric_limits<int>::lowest(),
-            saturated_cast<int>(double_small_int));
-  EXPECT_EQ(numeric_limits<int>::max(), saturated_cast<int>(double_large_int));
-
-  // Test the saturated cast overrides.
-  using FloatLimits = numeric_limits<float>;
-  using IntLimits = numeric_limits<int>;
-  EXPECT_EQ(-1, (saturated_cast<int, CastTest1>(FloatLimits::quiet_NaN())));
-  EXPECT_EQ(CastTest1<int>::max(),
-            (saturated_cast<int, CastTest1>(FloatLimits::infinity())));
-  EXPECT_EQ(CastTest1<int>::max(),
-            (saturated_cast<int, CastTest1>(FloatLimits::max())));
-  EXPECT_EQ(CastTest1<int>::max(),
-            (saturated_cast<int, CastTest1>(float(IntLimits::max()))));
-  EXPECT_EQ(CastTest1<int>::lowest(),
-            (saturated_cast<int, CastTest1>(-FloatLimits::infinity())));
-  EXPECT_EQ(CastTest1<int>::lowest(),
-            (saturated_cast<int, CastTest1>(FloatLimits::lowest())));
-  EXPECT_EQ(0, (saturated_cast<int, CastTest1>(0.0)));
-  EXPECT_EQ(1, (saturated_cast<int, CastTest1>(1.0)));
-  EXPECT_EQ(-1, (saturated_cast<int, CastTest1>(-1.0)));
-  EXPECT_EQ(0, (saturated_cast<int, CastTest1>(0)));
-  EXPECT_EQ(1, (saturated_cast<int, CastTest1>(1)));
-  EXPECT_EQ(-1, (saturated_cast<int, CastTest1>(-1)));
-  EXPECT_EQ(CastTest1<int>::lowest(),
-            (saturated_cast<int, CastTest1>(float(IntLimits::lowest()))));
-  EXPECT_EQ(11, (saturated_cast<int, CastTest2>(FloatLimits::quiet_NaN())));
-  EXPECT_EQ(10, (saturated_cast<int, CastTest2>(FloatLimits::infinity())));
-  EXPECT_EQ(10, (saturated_cast<int, CastTest2>(FloatLimits::max())));
-  EXPECT_EQ(1, (saturated_cast<int, CastTest2>(-FloatLimits::infinity())));
-  EXPECT_EQ(1, (saturated_cast<int, CastTest2>(FloatLimits::lowest())));
-  EXPECT_EQ(1, (saturated_cast<int, CastTest2>(0U)));
-
-  float not_a_number = std::numeric_limits<float>::infinity() -
-                       std::numeric_limits<float>::infinity();
-  EXPECT_TRUE(std::isnan(not_a_number));
-  EXPECT_EQ(0, saturated_cast<int>(not_a_number));
-
-  // Test the CheckedNumeric value extractions functions.
-  auto int8_min = MakeCheckedNum(numeric_limits<int8_t>::lowest());
-  auto int8_max = MakeCheckedNum(numeric_limits<int8_t>::max());
-  auto double_max = MakeCheckedNum(numeric_limits<double>::max());
-  static_assert(
-      std::is_same<int16_t,
-                   decltype(int8_min.ValueOrDie<int16_t>())::type>::value,
-      "ValueOrDie returning incorrect type.");
-  static_assert(
-      std::is_same<int16_t,
-                   decltype(int8_min.ValueOrDefault<int16_t>(0))::type>::value,
-      "ValueOrDefault returning incorrect type.");
-  EXPECT_FALSE(IsValidForType<uint8_t>(int8_min));
-  EXPECT_TRUE(IsValidForType<uint8_t>(int8_max));
-  EXPECT_EQ(static_cast<int>(numeric_limits<int8_t>::lowest()),
-            ValueOrDieForType<int>(int8_min));
-  EXPECT_TRUE(IsValidForType<uint32_t>(int8_max));
-  EXPECT_EQ(static_cast<int>(numeric_limits<int8_t>::max()),
-            ValueOrDieForType<int>(int8_max));
-  EXPECT_EQ(0, ValueOrDefaultForType<int>(double_max, 0));
-  uint8_t uint8_dest = 0;
-  int16_t int16_dest = 0;
-  double double_dest = 0;
-  EXPECT_TRUE(int8_max.AssignIfValid(&uint8_dest));
-  EXPECT_EQ(static_cast<uint8_t>(numeric_limits<int8_t>::max()), uint8_dest);
-  EXPECT_FALSE(int8_min.AssignIfValid(&uint8_dest));
-  EXPECT_TRUE(int8_max.AssignIfValid(&int16_dest));
-  EXPECT_EQ(static_cast<int16_t>(numeric_limits<int8_t>::max()), int16_dest);
-  EXPECT_TRUE(int8_min.AssignIfValid(&int16_dest));
-  EXPECT_EQ(static_cast<int16_t>(numeric_limits<int8_t>::lowest()), int16_dest);
-  EXPECT_FALSE(double_max.AssignIfValid(&uint8_dest));
-  EXPECT_FALSE(double_max.AssignIfValid(&int16_dest));
-  EXPECT_TRUE(double_max.AssignIfValid(&double_dest));
-  EXPECT_EQ(numeric_limits<double>::max(), double_dest);
-  EXPECT_EQ(1, checked_cast<int>(StrictNumeric<int>(1)));
-  EXPECT_EQ(1, saturated_cast<int>(StrictNumeric<int>(1)));
-  EXPECT_EQ(1, strict_cast<int>(StrictNumeric<int>(1)));
-
-  enum class EnumTest { kOne = 1 };
-  EXPECT_EQ(1, checked_cast<int>(EnumTest::kOne));
-  EXPECT_EQ(1, saturated_cast<int>(EnumTest::kOne));
-  EXPECT_EQ(1, strict_cast<int>(EnumTest::kOne));
-}
-
-TEST(SafeNumerics, IsValueInRangeForNumericType) {
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(0));
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(1));
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(2));
-  EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(-1));
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(0xffffffffu));
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(UINT64_C(0xffffffff)));
-  EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(UINT64_C(0x100000000)));
-  EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(UINT64_C(0x100000001)));
-  EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(
-      std::numeric_limits<int32_t>::lowest()));
-  EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(
-      std::numeric_limits<int64_t>::lowest()));
-
-  EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(0));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(1));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(2));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(-1));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(0x7fffffff));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(0x7fffffffu));
-  EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(0x80000000u));
-  EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(0xffffffffu));
-  EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(INT64_C(0x80000000)));
-  EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(INT64_C(0xffffffff)));
-  EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(INT64_C(0x100000000)));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(
-      std::numeric_limits<int32_t>::lowest()));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(
-      static_cast<int64_t>(std::numeric_limits<int32_t>::lowest())));
-  EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(
-      static_cast<int64_t>(std::numeric_limits<int32_t>::lowest()) - 1));
-  EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(
-      std::numeric_limits<int64_t>::lowest()));
-
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(0));
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(1));
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(2));
-  EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>(-1));
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(0xffffffffu));
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(UINT64_C(0xffffffff)));
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(UINT64_C(0x100000000)));
-  EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(UINT64_C(0x100000001)));
-  EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>(
-      std::numeric_limits<int32_t>::lowest()));
-  EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>(INT64_C(-1)));
-  EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>(
-      std::numeric_limits<int64_t>::lowest()));
-
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(1));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(2));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(-1));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0x7fffffff));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0x7fffffffu));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0x80000000u));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0xffffffffu));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(INT64_C(0x80000000)));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(INT64_C(0xffffffff)));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(INT64_C(0x100000000)));
-  EXPECT_TRUE(
-      IsValueInRangeForNumericType<int64_t>(INT64_C(0x7fffffffffffffff)));
-  EXPECT_TRUE(
-      IsValueInRangeForNumericType<int64_t>(UINT64_C(0x7fffffffffffffff)));
-  EXPECT_FALSE(
-      IsValueInRangeForNumericType<int64_t>(UINT64_C(0x8000000000000000)));
-  EXPECT_FALSE(
-      IsValueInRangeForNumericType<int64_t>(UINT64_C(0xffffffffffffffff)));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(
-      std::numeric_limits<int32_t>::lowest()));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(
-      static_cast<int64_t>(std::numeric_limits<int32_t>::lowest())));
-  EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(
-      std::numeric_limits<int64_t>::lowest()));
-}
-
-TEST(SafeNumerics, CompoundNumericOperations) {
-  CheckedNumeric<int> a = 1;
-  CheckedNumeric<int> b = 2;
-  CheckedNumeric<int> c = 3;
-  CheckedNumeric<int> d = 4;
-  a += b;
-  EXPECT_EQ(3, a.ValueOrDie());
-  a -= c;
-  EXPECT_EQ(0, a.ValueOrDie());
-  d /= b;
-  EXPECT_EQ(2, d.ValueOrDie());
-  d *= d;
-  EXPECT_EQ(4, d.ValueOrDie());
-
-  CheckedNumeric<int> too_large = std::numeric_limits<int>::max();
-  EXPECT_TRUE(too_large.IsValid());
-  too_large += d;
-  EXPECT_FALSE(too_large.IsValid());
-  too_large -= d;
-  EXPECT_FALSE(too_large.IsValid());
-  too_large /= d;
-  EXPECT_FALSE(too_large.IsValid());
-}
-
-TEST(SafeNumerics, VariadicNumericOperations) {
-  {  // Synthetic scope to avoid variable naming collisions.
-    auto a = CheckAdd(1, 2UL, MakeCheckedNum(3LL), 4).ValueOrDie();
-    EXPECT_EQ(static_cast<decltype(a)::type>(10), a);
-    auto b = CheckSub(MakeCheckedNum(20.0), 2UL, 4).ValueOrDie();
-    EXPECT_EQ(static_cast<decltype(b)::type>(14.0), b);
-    auto c = CheckMul(20.0, MakeCheckedNum(1), 5, 3UL).ValueOrDie();
-    EXPECT_EQ(static_cast<decltype(c)::type>(300.0), c);
-    auto d = CheckDiv(20.0, 2.0, MakeCheckedNum(5LL), -4).ValueOrDie();
-    EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d);
-    auto e = CheckMod(MakeCheckedNum(20), 3).ValueOrDie();
-    EXPECT_EQ(static_cast<decltype(e)::type>(2), e);
-    auto f = CheckLsh(1, MakeCheckedNum(2)).ValueOrDie();
-    EXPECT_EQ(static_cast<decltype(f)::type>(4), f);
-    auto g = CheckRsh(4, MakeCheckedNum(2)).ValueOrDie();
-    EXPECT_EQ(static_cast<decltype(g)::type>(1), g);
-    auto h = CheckRsh(CheckAdd(1, 1, 1, 1), CheckSub(4, 2)).ValueOrDie();
-    EXPECT_EQ(static_cast<decltype(h)::type>(1), h);
-  }
-
-  {
-    auto a = ClampAdd(1, 2UL, MakeClampedNum(3LL), 4);
-    EXPECT_EQ(static_cast<decltype(a)::type>(10), a);
-    auto b = ClampSub(MakeClampedNum(20.0), 2UL, 4);
-    EXPECT_EQ(static_cast<decltype(b)::type>(14.0), b);
-    auto c = ClampMul(20.0, MakeClampedNum(1), 5, 3UL);
-    EXPECT_EQ(static_cast<decltype(c)::type>(300.0), c);
-    auto d = ClampDiv(20.0, 2.0, MakeClampedNum(5LL), -4);
-    EXPECT_EQ(static_cast<decltype(d)::type>(-.5), d);
-    auto e = ClampMod(MakeClampedNum(20), 3);
-    EXPECT_EQ(static_cast<decltype(e)::type>(2), e);
-    auto f = ClampLsh(1, MakeClampedNum(2U));
-    EXPECT_EQ(static_cast<decltype(f)::type>(4), f);
-    auto g = ClampRsh(4, MakeClampedNum(2U));
-    EXPECT_EQ(static_cast<decltype(g)::type>(1), g);
-    auto h = ClampRsh(ClampAdd(1, 1, 1, 1), ClampSub(4U, 2));
-    EXPECT_EQ(static_cast<decltype(h)::type>(1), h);
-  }
-}
-
-#if defined(__clang__)
-#pragma clang diagnostic pop  // -Winteger-overflow
-#endif
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/sampling_heap_profiler/sampling_heap_profiler_unittest.cc b/base/sampling_heap_profiler/sampling_heap_profiler_unittest.cc
deleted file mode 100644
index d3bef90..0000000
--- a/base/sampling_heap_profiler/sampling_heap_profiler_unittest.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/sampling_heap_profiler/sampling_heap_profiler.h"
-
-#include <stdlib.h>
-#include <cinttypes>
-
-#include "base/allocator/allocator_shim.h"
-#include "base/debug/alias.h"
-#include "base/threading/simple_thread.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-class SamplingHeapProfilerTest : public ::testing::Test {
-#if defined(OS_MACOSX)
-  void SetUp() override { allocator::InitializeAllocatorShim(); }
-#endif
-};
-
-class SamplesCollector : public SamplingHeapProfiler::SamplesObserver {
- public:
-  explicit SamplesCollector(size_t watch_size) : watch_size_(watch_size) {}
-
-  void SampleAdded(uint32_t id, size_t size, size_t) override {
-    if (sample_added || size != watch_size_)
-      return;
-    sample_id_ = id;
-    sample_added = true;
-  }
-
-  void SampleRemoved(uint32_t id) override {
-    if (id == sample_id_)
-      sample_removed = true;
-  }
-
-  bool sample_added = false;
-  bool sample_removed = false;
-
- private:
-  size_t watch_size_;
-  uint32_t sample_id_ = 0;
-};
-
-TEST_F(SamplingHeapProfilerTest, CollectSamples) {
-  SamplingHeapProfiler::InitTLSSlot();
-  SamplesCollector collector(10000);
-  SamplingHeapProfiler* profiler = SamplingHeapProfiler::GetInstance();
-  profiler->SuppressRandomnessForTest(true);
-  profiler->SetSamplingInterval(1024);
-  profiler->Start();
-  profiler->AddSamplesObserver(&collector);
-  void* volatile p = malloc(10000);
-  free(p);
-  profiler->Stop();
-  profiler->RemoveSamplesObserver(&collector);
-  CHECK(collector.sample_added);
-  CHECK(collector.sample_removed);
-}
-
-const int kNumberOfAllocations = 10000;
-
-NOINLINE void Allocate1() {
-  void* p = malloc(400);
-  base::debug::Alias(&p);
-}
-
-NOINLINE void Allocate2() {
-  void* p = malloc(700);
-  base::debug::Alias(&p);
-}
-
-NOINLINE void Allocate3() {
-  void* p = malloc(20480);
-  base::debug::Alias(&p);
-}
-
-class MyThread1 : public SimpleThread {
- public:
-  MyThread1() : SimpleThread("MyThread1") {}
-  void Run() override {
-    for (int i = 0; i < kNumberOfAllocations; ++i)
-      Allocate1();
-  }
-};
-
-class MyThread2 : public SimpleThread {
- public:
-  MyThread2() : SimpleThread("MyThread2") {}
-  void Run() override {
-    for (int i = 0; i < kNumberOfAllocations; ++i)
-      Allocate2();
-  }
-};
-
-void CheckAllocationPattern(void (*allocate_callback)()) {
-  SamplingHeapProfiler::InitTLSSlot();
-  SamplingHeapProfiler* profiler = SamplingHeapProfiler::GetInstance();
-  profiler->SuppressRandomnessForTest(false);
-  profiler->SetSamplingInterval(10240);
-  base::TimeTicks t0 = base::TimeTicks::Now();
-  std::map<size_t, size_t> sums;
-  const int iterations = 40;
-  for (int i = 0; i < iterations; ++i) {
-    uint32_t id = profiler->Start();
-    allocate_callback();
-    std::vector<SamplingHeapProfiler::Sample> samples =
-        profiler->GetSamples(id);
-    profiler->Stop();
-    std::map<size_t, size_t> buckets;
-    for (auto& sample : samples) {
-      buckets[sample.size] += sample.total;
-    }
-    for (auto& it : buckets) {
-      if (it.first != 400 && it.first != 700 && it.first != 20480)
-        continue;
-      sums[it.first] += it.second;
-      printf("%zu,", it.second);
-    }
-    printf("\n");
-  }
-
-  printf("Time taken %" PRIu64 "ms\n",
-         (base::TimeTicks::Now() - t0).InMilliseconds());
-
-  for (auto sum : sums) {
-    intptr_t expected = sum.first * kNumberOfAllocations;
-    intptr_t actual = sum.second / iterations;
-    printf("%zu:\tmean: %zu\trelative error: %.2f%%\n", sum.first, actual,
-           100. * (actual - expected) / expected);
-  }
-}
-
-// Manual tests to check precision of the sampling profiler.
-// Yes, they do leak lots of memory.
-
-TEST_F(SamplingHeapProfilerTest, DISABLED_ParallelLargeSmallStats) {
-  CheckAllocationPattern([]() {
-    SimpleThread* t1 = new MyThread1();
-    SimpleThread* t2 = new MyThread2();
-    t1->Start();
-    t2->Start();
-    for (int i = 0; i < kNumberOfAllocations; ++i)
-      Allocate3();
-    t1->Join();
-    t2->Join();
-  });
-}
-
-TEST_F(SamplingHeapProfilerTest, DISABLED_SequentialLargeSmallStats) {
-  CheckAllocationPattern([]() {
-    for (int i = 0; i < kNumberOfAllocations; ++i) {
-      Allocate1();
-      Allocate2();
-      Allocate3();
-    }
-  });
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/scoped_clear_errno_unittest.cc b/base/scoped_clear_errno_unittest.cc
deleted file mode 100644
index 8afb33e..0000000
--- a/base/scoped_clear_errno_unittest.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <errno.h>
-
-#include "base/scoped_clear_errno.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(ScopedClearErrno, TestNoError) {
-  errno = 1;
-  {
-    ScopedClearErrno clear_error;
-    EXPECT_EQ(0, errno);
-  }
-  EXPECT_EQ(1, errno);
-}
-
-TEST(ScopedClearErrno, TestError) {
-  errno = 1;
-  {
-    ScopedClearErrno clear_error;
-    errno = 2;
-  }
-  EXPECT_EQ(2, errno);
-}
-
-}  // namespace base
diff --git a/base/scoped_generic_unittest.cc b/base/scoped_generic_unittest.cc
deleted file mode 100644
index 5a6abfb..0000000
--- a/base/scoped_generic_unittest.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/scoped_generic.h"
-
-#include <utility>
-#include <vector>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-struct IntTraits {
-  IntTraits(std::vector<int>* freed) : freed_ints(freed) {}
-
-  static int InvalidValue() {
-    return -1;
-  }
-  void Free(int value) {
-    freed_ints->push_back(value);
-  }
-
-  std::vector<int>* freed_ints;
-};
-
-typedef ScopedGeneric<int, IntTraits> ScopedInt;
-
-}  // namespace
-
-TEST(ScopedGenericTest, ScopedGeneric) {
-  std::vector<int> values_freed;
-  IntTraits traits(&values_freed);
-
-  // Invalid case, delete should not be called.
-  {
-    ScopedInt a(IntTraits::InvalidValue(), traits);
-  }
-  EXPECT_TRUE(values_freed.empty());
-
-  // Simple deleting case.
-  static const int kFirst = 0;
-  {
-    ScopedInt a(kFirst, traits);
-  }
-  ASSERT_EQ(1u, values_freed.size());
-  ASSERT_EQ(kFirst, values_freed[0]);
-  values_freed.clear();
-
-  // Release should return the right value and leave the object empty.
-  {
-    ScopedInt a(kFirst, traits);
-    EXPECT_EQ(kFirst, a.release());
-
-    ScopedInt b(IntTraits::InvalidValue(), traits);
-    EXPECT_EQ(IntTraits::InvalidValue(), b.release());
-  }
-  ASSERT_TRUE(values_freed.empty());
-
-  // Reset should free the old value, then the new one should go away when
-  // it goes out of scope.
-  static const int kSecond = 1;
-  {
-    ScopedInt b(kFirst, traits);
-    b.reset(kSecond);
-    ASSERT_EQ(1u, values_freed.size());
-    ASSERT_EQ(kFirst, values_freed[0]);
-  }
-  ASSERT_EQ(2u, values_freed.size());
-  ASSERT_EQ(kSecond, values_freed[1]);
-  values_freed.clear();
-
-  // Swap.
-  {
-    ScopedInt a(kFirst, traits);
-    ScopedInt b(kSecond, traits);
-    a.swap(b);
-    EXPECT_TRUE(values_freed.empty());  // Nothing should be freed.
-    EXPECT_EQ(kSecond, a.get());
-    EXPECT_EQ(kFirst, b.get());
-  }
-  // Values should be deleted in the opposite order.
-  ASSERT_EQ(2u, values_freed.size());
-  EXPECT_EQ(kFirst, values_freed[0]);
-  EXPECT_EQ(kSecond, values_freed[1]);
-  values_freed.clear();
-
-  // Move constructor.
-  {
-    ScopedInt a(kFirst, traits);
-    ScopedInt b(std::move(a));
-    EXPECT_TRUE(values_freed.empty());  // Nothing should be freed.
-    ASSERT_EQ(IntTraits::InvalidValue(), a.get());
-    ASSERT_EQ(kFirst, b.get());
-  }
-
-  ASSERT_EQ(1u, values_freed.size());
-  ASSERT_EQ(kFirst, values_freed[0]);
-  values_freed.clear();
-
-  // Move assign.
-  {
-    ScopedInt a(kFirst, traits);
-    ScopedInt b(kSecond, traits);
-    b = std::move(a);
-    ASSERT_EQ(1u, values_freed.size());
-    EXPECT_EQ(kSecond, values_freed[0]);
-    ASSERT_EQ(IntTraits::InvalidValue(), a.get());
-    ASSERT_EQ(kFirst, b.get());
-  }
-
-  ASSERT_EQ(2u, values_freed.size());
-  EXPECT_EQ(kFirst, values_freed[1]);
-  values_freed.clear();
-}
-
-TEST(ScopedGenericTest, Operators) {
-  std::vector<int> values_freed;
-  IntTraits traits(&values_freed);
-
-  static const int kFirst = 0;
-  static const int kSecond = 1;
-  {
-    ScopedInt a(kFirst, traits);
-    EXPECT_TRUE(a == kFirst);
-    EXPECT_FALSE(a != kFirst);
-    EXPECT_FALSE(a == kSecond);
-    EXPECT_TRUE(a != kSecond);
-
-    EXPECT_TRUE(kFirst == a);
-    EXPECT_FALSE(kFirst != a);
-    EXPECT_FALSE(kSecond == a);
-    EXPECT_TRUE(kSecond != a);
-  }
-
-  // is_valid().
-  {
-    ScopedInt a(kFirst, traits);
-    EXPECT_TRUE(a.is_valid());
-    a.reset();
-    EXPECT_FALSE(a.is_valid());
-  }
-}
-
-// Cheesy manual "no compile" test for manually validating changes.
-#if 0
-TEST(ScopedGenericTest, NoCompile) {
-  // Assignment shouldn't work.
-  /*{
-    ScopedInt a(kFirst, traits);
-    ScopedInt b(a);
-  }*/
-
-  // Comparison shouldn't work.
-  /*{
-    ScopedInt a(kFirst, traits);
-    ScopedInt b(kFirst, traits);
-    if (a == b) {
-    }
-  }*/
-
-  // Implicit conversion to bool shouldn't work.
-  /*{
-    ScopedInt a(kFirst, traits);
-    bool result = a;
-  }*/
-}
-#endif
-
-}  // namespace base
diff --git a/base/scoped_native_library_unittest.cc b/base/scoped_native_library_unittest.cc
deleted file mode 100644
index 261e9d1..0000000
--- a/base/scoped_native_library_unittest.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/scoped_native_library.h"
-
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include "base/files/file_path.h"
-#include "base/strings/utf_string_conversions.h"
-#endif
-
-namespace base {
-
-// Tests whether or not a function pointer retrieved via ScopedNativeLibrary
-// is available only in a scope.
-TEST(ScopedNativeLibrary, Basic) {
-#if defined(OS_WIN)
-  // Get the pointer to DirectDrawCreate() from "ddraw.dll" and verify it
-  // is valid only in this scope.
-  // FreeLibrary() doesn't actually unload a DLL until its reference count
-  // becomes zero, i.e. function pointer is still valid if the DLL used
-  // in this test is also used by another part of this executable.
-  // So, this test uses "ddraw.dll", which is not used by Chrome at all but
-  // installed on all versions of Windows.
-  const char kFunctionName[] = "DirectDrawCreate";
-  NativeLibrary native_library;
-  {
-    FilePath path(FilePath::FromUTF8Unsafe(GetNativeLibraryName("ddraw")));
-    native_library = LoadNativeLibrary(path, nullptr);
-    ScopedNativeLibrary library(native_library);
-    EXPECT_TRUE(library.is_valid());
-    EXPECT_EQ(native_library, library.get());
-    FARPROC test_function =
-        reinterpret_cast<FARPROC>(library.GetFunctionPointer(kFunctionName));
-    EXPECT_EQ(0, IsBadCodePtr(test_function));
-    EXPECT_EQ(
-        GetFunctionPointerFromNativeLibrary(native_library, kFunctionName),
-        test_function);
-  }
-  EXPECT_FALSE(
-      GetFunctionPointerFromNativeLibrary(native_library, kFunctionName));
-#endif
-}
-
-}  // namespace base
diff --git a/base/security_unittest.cc b/base/security_unittest.cc
deleted file mode 100644
index 9a3bc27..0000000
--- a/base/security_unittest.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright (c) 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <fcntl.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <algorithm>
-#include <limits>
-#include <memory>
-
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/memory/free_deleter.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_POSIX)
-#include <sys/mman.h>
-#include <unistd.h>
-#endif
-
-using std::nothrow;
-using std::numeric_limits;
-
-namespace {
-
-// This function acts as a compiler optimization barrier. We use it to
-// prevent the compiler from making an expression a compile-time constant.
-// We also use it so that the compiler doesn't discard certain return values
-// as something we don't need (see the comment with calloc below).
-template <typename Type>
-NOINLINE Type HideValueFromCompiler(volatile Type value) {
-#if defined(__GNUC__)
-  // In a GCC compatible compiler (GCC or Clang), make this compiler barrier
-  // more robust than merely using "volatile".
-  __asm__ volatile ("" : "+r" (value));
-#endif  // __GNUC__
-  return value;
-}
-
-// TCmalloc, currently supported only by Linux/CrOS, supports malloc limits.
-// - NO_TCMALLOC (should be defined if compiled with use_allocator!="tcmalloc")
-// - ADDRESS_SANITIZER it has its own memory allocator
-#if defined(OS_LINUX) && !defined(NO_TCMALLOC) && !defined(ADDRESS_SANITIZER)
-#define MALLOC_OVERFLOW_TEST(function) function
-#else
-#define MALLOC_OVERFLOW_TEST(function) DISABLED_##function
-#endif
-
-// There are platforms where these tests are known to fail. We would like to
-// be able to easily check the status on the bots, but marking tests as
-// FAILS_ is too clunky.
-void OverflowTestsSoftExpectTrue(bool overflow_detected) {
-  if (!overflow_detected) {
-#if defined(OS_LINUX) || defined(OS_ANDROID) || defined(OS_MACOSX)
-    // Sadly, on Linux, Android, and OSX we don't have a good story yet. Don't
-    // fail the test, but report.
-    printf("Platform has overflow: %s\n",
-           !overflow_detected ? "yes." : "no.");
-#else
-    // Otherwise, fail the test. (Note: EXPECT are ok in subfunctions, ASSERT
-    // aren't).
-    EXPECT_TRUE(overflow_detected);
-#endif
-  }
-}
-
-#if defined(OS_IOS) || defined(OS_FUCHSIA) || defined(ADDRESS_SANITIZER) || \
-    defined(THREAD_SANITIZER) || defined(MEMORY_SANITIZER)
-#define MAYBE_NewOverflow DISABLED_NewOverflow
-#else
-#define MAYBE_NewOverflow NewOverflow
-#endif
-// Test array[TooBig][X] and array[X][TooBig] allocations for int overflows.
-// IOS doesn't honor nothrow, so disable the test there.
-// TODO(https://crbug.com/828229): Fuchsia SDK exports an incorrect new[] that
-// gets picked up in Debug/component builds, breaking this test.
-// Disabled under XSan because asan aborts when new returns nullptr,
-// https://bugs.chromium.org/p/chromium/issues/detail?id=690271#c15
-TEST(SecurityTest, MAYBE_NewOverflow) {
-  const size_t kArraySize = 4096;
-  // We want something "dynamic" here, so that the compiler doesn't
-  // immediately reject crazy arrays.
-  const size_t kDynamicArraySize = HideValueFromCompiler(kArraySize);
-  const size_t kMaxSizeT = std::numeric_limits<size_t>::max();
-  const size_t kArraySize2 = kMaxSizeT / kArraySize + 10;
-  const size_t kDynamicArraySize2 = HideValueFromCompiler(kArraySize2);
-  {
-    std::unique_ptr<char[][kArraySize]> array_pointer(
-        new (nothrow) char[kDynamicArraySize2][kArraySize]);
-    // Prevent clang from optimizing away the whole test.
-    char* volatile p = reinterpret_cast<char*>(array_pointer.get());
-    OverflowTestsSoftExpectTrue(!p);
-  }
-  // On windows, the compiler prevents static array sizes of more than
-  // 0x7fffffff (error C2148).
-#if defined(OS_WIN) && defined(ARCH_CPU_64_BITS)
-  ALLOW_UNUSED_LOCAL(kDynamicArraySize);
-#else
-  {
-    std::unique_ptr<char[][kArraySize2]> array_pointer(
-        new (nothrow) char[kDynamicArraySize][kArraySize2]);
-    // Prevent clang from optimizing away the whole test.
-    char* volatile p = reinterpret_cast<char*>(array_pointer.get());
-    OverflowTestsSoftExpectTrue(!p);
-  }
-#endif  // !defined(OS_WIN) || !defined(ARCH_CPU_64_BITS)
-}
-
-#if defined(OS_LINUX) && defined(__x86_64__)
-// Check if ptr1 and ptr2 are separated by less than size chars.
-bool ArePointersToSameArea(void* ptr1, void* ptr2, size_t size) {
-  ptrdiff_t ptr_diff = reinterpret_cast<char*>(std::max(ptr1, ptr2)) -
-                       reinterpret_cast<char*>(std::min(ptr1, ptr2));
-  return static_cast<size_t>(ptr_diff) <= size;
-}
-
-// Check if TCMalloc uses an underlying random memory allocator.
-TEST(SecurityTest, MALLOC_OVERFLOW_TEST(RandomMemoryAllocations)) {
-  size_t kPageSize = 4096;  // We support x86_64 only.
-  // Check that malloc() returns an address that is neither the kernel's
-  // un-hinted mmap area, nor the current brk() area. The first malloc() may
-  // not be at a random address because TCMalloc will first exhaust any memory
-  // that it has allocated early on, before starting the sophisticated
-  // allocators.
-  void* default_mmap_heap_address =
-      mmap(nullptr, kPageSize, PROT_READ | PROT_WRITE,
-           MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-  ASSERT_NE(default_mmap_heap_address,
-            static_cast<void*>(MAP_FAILED));
-  ASSERT_EQ(munmap(default_mmap_heap_address, kPageSize), 0);
-  void* brk_heap_address = sbrk(0);
-  ASSERT_NE(brk_heap_address, reinterpret_cast<void*>(-1));
-  ASSERT_TRUE(brk_heap_address != nullptr);
-  // 1 MB should get us past what TCMalloc pre-allocated before initializing
-  // the sophisticated allocators.
-  size_t kAllocSize = 1<<20;
-  std::unique_ptr<char, base::FreeDeleter> ptr(
-      static_cast<char*>(malloc(kAllocSize)));
-  ASSERT_TRUE(ptr != nullptr);
-  // If two pointers are separated by less than 512MB, they are considered
-  // to be in the same area.
-  // Our random pointer could be anywhere within 0x3fffffffffff (46bits),
-  // and we are checking that it's not withing 1GB (30 bits) from two
-  // addresses (brk and mmap heap). We have roughly one chance out of
-  // 2^15 to flake.
-  const size_t kAreaRadius = 1<<29;
-  bool in_default_mmap_heap = ArePointersToSameArea(
-      ptr.get(), default_mmap_heap_address, kAreaRadius);
-  EXPECT_FALSE(in_default_mmap_heap);
-
-  bool in_default_brk_heap = ArePointersToSameArea(
-      ptr.get(), brk_heap_address, kAreaRadius);
-  EXPECT_FALSE(in_default_brk_heap);
-
-  // In the implementation, we always mask our random addresses with
-  // kRandomMask, so we use it as an additional detection mechanism.
-  const uintptr_t kRandomMask = 0x3fffffffffffULL;
-  bool impossible_random_address =
-      reinterpret_cast<uintptr_t>(ptr.get()) & ~kRandomMask;
-  EXPECT_FALSE(impossible_random_address);
-}
-
-#endif  // defined(OS_LINUX) && defined(__x86_64__)
-
-}  // namespace
diff --git a/base/sequence_checker_unittest.cc b/base/sequence_checker_unittest.cc
deleted file mode 100644
index 8d44f3e..0000000
--- a/base/sequence_checker_unittest.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/sequence_checker.h"
-
-#include <stddef.h>
-
-#include <memory>
-#include <string>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback_forward.h"
-#include "base/macros.h"
-#include "base/sequence_token.h"
-#include "base/single_thread_task_runner.h"
-#include "base/test/gtest_util.h"
-#include "base/threading/simple_thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-// Runs a callback on another thread.
-class RunCallbackThread : public SimpleThread {
- public:
-  explicit RunCallbackThread(const Closure& callback)
-      : SimpleThread("RunCallbackThread"), callback_(callback) {
-    Start();
-    Join();
-  }
-
- private:
-  // SimpleThread:
-  void Run() override { callback_.Run(); }
-
-  const Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(RunCallbackThread);
-};
-
-void ExpectCalledOnValidSequence(SequenceCheckerImpl* sequence_checker) {
-  ASSERT_TRUE(sequence_checker);
-
-  // This should bind |sequence_checker| to the current sequence if it wasn't
-  // already bound to a sequence.
-  EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
-
-  // Since |sequence_checker| is now bound to the current sequence, another call
-  // to CalledOnValidSequence() should return true.
-  EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
-}
-
-void ExpectCalledOnValidSequenceWithSequenceToken(
-    SequenceCheckerImpl* sequence_checker,
-    SequenceToken sequence_token) {
-  ScopedSetSequenceTokenForCurrentThread
-      scoped_set_sequence_token_for_current_thread(sequence_token);
-  ExpectCalledOnValidSequence(sequence_checker);
-}
-
-void ExpectNotCalledOnValidSequence(SequenceCheckerImpl* sequence_checker) {
-  ASSERT_TRUE(sequence_checker);
-  EXPECT_FALSE(sequence_checker->CalledOnValidSequence());
-}
-
-}  // namespace
-
-TEST(SequenceCheckerTest, CallsAllowedOnSameThreadNoSequenceToken) {
-  SequenceCheckerImpl sequence_checker;
-  EXPECT_TRUE(sequence_checker.CalledOnValidSequence());
-}
-
-TEST(SequenceCheckerTest, CallsAllowedOnSameThreadSameSequenceToken) {
-  ScopedSetSequenceTokenForCurrentThread
-      scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-  SequenceCheckerImpl sequence_checker;
-  EXPECT_TRUE(sequence_checker.CalledOnValidSequence());
-}
-
-TEST(SequenceCheckerTest, CallsDisallowedOnDifferentThreadsNoSequenceToken) {
-  SequenceCheckerImpl sequence_checker;
-  RunCallbackThread thread(
-      Bind(&ExpectNotCalledOnValidSequence, Unretained(&sequence_checker)));
-}
-
-TEST(SequenceCheckerTest, CallsAllowedOnDifferentThreadsSameSequenceToken) {
-  const SequenceToken sequence_token(SequenceToken::Create());
-
-  ScopedSetSequenceTokenForCurrentThread
-      scoped_set_sequence_token_for_current_thread(sequence_token);
-  SequenceCheckerImpl sequence_checker;
-  EXPECT_TRUE(sequence_checker.CalledOnValidSequence());
-
-  RunCallbackThread thread(Bind(&ExpectCalledOnValidSequenceWithSequenceToken,
-                                Unretained(&sequence_checker), sequence_token));
-}
-
-TEST(SequenceCheckerTest, CallsDisallowedOnSameThreadDifferentSequenceToken) {
-  std::unique_ptr<SequenceCheckerImpl> sequence_checker;
-
-  {
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-    sequence_checker.reset(new SequenceCheckerImpl);
-  }
-
-  {
-    // Different SequenceToken.
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-    EXPECT_FALSE(sequence_checker->CalledOnValidSequence());
-  }
-
-  // No SequenceToken.
-  EXPECT_FALSE(sequence_checker->CalledOnValidSequence());
-}
-
-TEST(SequenceCheckerTest, DetachFromSequence) {
-  std::unique_ptr<SequenceCheckerImpl> sequence_checker;
-
-  {
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-    sequence_checker.reset(new SequenceCheckerImpl);
-  }
-
-  sequence_checker->DetachFromSequence();
-
-  {
-    // Verify that CalledOnValidSequence() returns true when called with
-    // a different sequence token after a call to DetachFromSequence().
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-    EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
-  }
-}
-
-TEST(SequenceCheckerTest, DetachFromSequenceNoSequenceToken) {
-  SequenceCheckerImpl sequence_checker;
-  sequence_checker.DetachFromSequence();
-
-  // Verify that CalledOnValidSequence() returns true when called on a
-  // different thread after a call to DetachFromSequence().
-  RunCallbackThread thread(
-      Bind(&ExpectCalledOnValidSequence, Unretained(&sequence_checker)));
-
-  EXPECT_FALSE(sequence_checker.CalledOnValidSequence());
-}
-
-TEST(SequenceCheckerMacroTest, Macros) {
-  auto scope = std::make_unique<ScopedSetSequenceTokenForCurrentThread>(
-      SequenceToken::Create());
-  SEQUENCE_CHECKER(my_sequence_checker);
-
-  // Don't expect a DCHECK death when a SequenceChecker is used on the right
-  // sequence.
-  DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker) << "Error message.";
-
-  scope.reset();
-
-#if DCHECK_IS_ON()
-  // Expect DCHECK death when used on a different sequence.
-  EXPECT_DCHECK_DEATH({
-    DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker) << "Error message.";
-  });
-#else
-    // Happily no-ops on non-dcheck builds.
-    DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker) << "Error message.";
-#endif
-
-  DETACH_FROM_SEQUENCE(my_sequence_checker);
-
-  // Don't expect a DCHECK death when a SequenceChecker is used for the first
-  // time after having been detached.
-  DCHECK_CALLED_ON_VALID_SEQUENCE(my_sequence_checker) << "Error message.";
-}
-
-}  // namespace base
diff --git a/base/sequence_token_unittest.cc b/base/sequence_token_unittest.cc
deleted file mode 100644
index 2ed6878..0000000
--- a/base/sequence_token_unittest.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/sequence_token.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(SequenceTokenTest, IsValid) {
-  EXPECT_FALSE(SequenceToken().IsValid());
-  EXPECT_TRUE(SequenceToken::Create().IsValid());
-}
-
-TEST(SequenceTokenTest, OperatorEquals) {
-  const SequenceToken invalid_a;
-  const SequenceToken invalid_b;
-  const SequenceToken valid_a = SequenceToken::Create();
-  const SequenceToken valid_b = SequenceToken::Create();
-
-  EXPECT_FALSE(invalid_a == invalid_a);
-  EXPECT_FALSE(invalid_a == invalid_b);
-  EXPECT_FALSE(invalid_a == valid_a);
-  EXPECT_FALSE(invalid_a == valid_b);
-
-  EXPECT_FALSE(valid_a == invalid_a);
-  EXPECT_FALSE(valid_a == invalid_b);
-  EXPECT_EQ(valid_a, valid_a);
-  EXPECT_FALSE(valid_a == valid_b);
-}
-
-TEST(SequenceTokenTest, OperatorNotEquals) {
-  const SequenceToken invalid_a;
-  const SequenceToken invalid_b;
-  const SequenceToken valid_a = SequenceToken::Create();
-  const SequenceToken valid_b = SequenceToken::Create();
-
-  EXPECT_NE(invalid_a, invalid_a);
-  EXPECT_NE(invalid_a, invalid_b);
-  EXPECT_NE(invalid_a, valid_a);
-  EXPECT_NE(invalid_a, valid_b);
-
-  EXPECT_NE(valid_a, invalid_a);
-  EXPECT_NE(valid_a, invalid_b);
-  EXPECT_FALSE(valid_a != valid_a);
-  EXPECT_NE(valid_a, valid_b);
-}
-
-TEST(SequenceTokenTest, GetForCurrentThread) {
-  const SequenceToken token = SequenceToken::Create();
-
-  EXPECT_FALSE(SequenceToken::GetForCurrentThread().IsValid());
-
-  {
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(token);
-    EXPECT_TRUE(SequenceToken::GetForCurrentThread().IsValid());
-    EXPECT_EQ(token, SequenceToken::GetForCurrentThread());
-  }
-
-  EXPECT_FALSE(SequenceToken::GetForCurrentThread().IsValid());
-}
-
-TEST(SequenceTokenTest, ToInternalValue) {
-  const SequenceToken token1 = SequenceToken::Create();
-  const SequenceToken token2 = SequenceToken::Create();
-
-  // Confirm that internal values are unique.
-  EXPECT_NE(token1.ToInternalValue(), token2.ToInternalValue());
-}
-
-// Expect a default-constructed TaskToken to be invalid and not equal to
-// another invalid TaskToken.
-TEST(TaskTokenTest, InvalidDefaultConstructed) {
-  EXPECT_FALSE(TaskToken().IsValid());
-  EXPECT_NE(TaskToken(), TaskToken());
-}
-
-// Expect a TaskToken returned by TaskToken::GetForCurrentThread() outside the
-// scope of a ScopedSetSequenceTokenForCurrentThread to be invalid.
-TEST(TaskTokenTest, InvalidOutsideScope) {
-  EXPECT_FALSE(TaskToken::GetForCurrentThread().IsValid());
-}
-
-// Expect an invalid TaskToken not to be equal with a valid TaskToken.
-TEST(TaskTokenTest, ValidNotEqualsInvalid) {
-  ScopedSetSequenceTokenForCurrentThread
-      scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-  TaskToken valid = TaskToken::GetForCurrentThread();
-  TaskToken invalid;
-  EXPECT_NE(valid, invalid);
-}
-
-// Expect TaskTokens returned by TaskToken::GetForCurrentThread() in the scope
-// of the same ScopedSetSequenceTokenForCurrentThread instance to be
-// valid and equal with each other.
-TEST(TaskTokenTest, EqualInSameScope) {
-  ScopedSetSequenceTokenForCurrentThread
-      scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-
-  const TaskToken token_a = TaskToken::GetForCurrentThread();
-  const TaskToken token_b = TaskToken::GetForCurrentThread();
-
-  EXPECT_TRUE(token_a.IsValid());
-  EXPECT_TRUE(token_b.IsValid());
-  EXPECT_EQ(token_a, token_b);
-}
-
-// Expect TaskTokens returned by TaskToken::GetForCurrentThread() in the scope
-// of different ScopedSetSequenceTokenForCurrentThread instances to be
-// valid but not equal to each other.
-TEST(TaskTokenTest, NotEqualInDifferentScopes) {
-  TaskToken token_a;
-  TaskToken token_b;
-
-  {
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-    token_a = TaskToken::GetForCurrentThread();
-  }
-  {
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-    token_b = TaskToken::GetForCurrentThread();
-  }
-
-  EXPECT_TRUE(token_a.IsValid());
-  EXPECT_TRUE(token_b.IsValid());
-  EXPECT_NE(token_a, token_b);
-}
-
-}  // namespace base
diff --git a/base/sequenced_task_runner_unittest.cc b/base/sequenced_task_runner_unittest.cc
deleted file mode 100644
index 4dcc7e5..0000000
--- a/base/sequenced_task_runner_unittest.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/sequenced_task_runner.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/gtest_prod_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/threading/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-class FlagOnDelete {
- public:
-  FlagOnDelete(bool* deleted,
-               scoped_refptr<SequencedTaskRunner> expected_deletion_sequence)
-      : deleted_(deleted),
-        expected_deletion_sequence_(std::move(expected_deletion_sequence)) {}
-
- private:
-  friend class DeleteHelper<FlagOnDelete>;
-  FRIEND_TEST_ALL_PREFIXES(SequencedTaskRunnerTest,
-                           OnTaskRunnerDeleterTargetStoppedEarly);
-
-  ~FlagOnDelete() {
-    EXPECT_FALSE(*deleted_);
-    *deleted_ = true;
-    if (expected_deletion_sequence_)
-      EXPECT_TRUE(expected_deletion_sequence_->RunsTasksInCurrentSequence());
-  }
-
-  bool* deleted_;
-  const scoped_refptr<SequencedTaskRunner> expected_deletion_sequence_;
-
-  DISALLOW_COPY_AND_ASSIGN(FlagOnDelete);
-};
-
-class SequencedTaskRunnerTest : public testing::Test {
- protected:
-  SequencedTaskRunnerTest() : foreign_thread_("foreign") {}
-
-  void SetUp() override {
-    main_runner_ = message_loop_.task_runner();
-
-    foreign_thread_.Start();
-    foreign_runner_ = foreign_thread_.task_runner();
-  }
-
-  scoped_refptr<SequencedTaskRunner> main_runner_;
-  scoped_refptr<SequencedTaskRunner> foreign_runner_;
-
-  Thread foreign_thread_;
-
- private:
-  MessageLoop message_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(SequencedTaskRunnerTest);
-};
-
-using SequenceBoundUniquePtr =
-    std::unique_ptr<FlagOnDelete, OnTaskRunnerDeleter>;
-
-TEST_F(SequencedTaskRunnerTest, OnTaskRunnerDeleterOnMainThread) {
-  bool deleted_on_main_thread = false;
-  SequenceBoundUniquePtr ptr(
-      new FlagOnDelete(&deleted_on_main_thread, main_runner_),
-      OnTaskRunnerDeleter(main_runner_));
-  EXPECT_FALSE(deleted_on_main_thread);
-  foreign_runner_->PostTask(
-      FROM_HERE, BindOnce([](SequenceBoundUniquePtr) {}, std::move(ptr)));
-
-  {
-    RunLoop run_loop;
-    foreign_runner_->PostTaskAndReply(FROM_HERE, BindOnce([] {}),
-                                      run_loop.QuitClosure());
-    run_loop.Run();
-  }
-  EXPECT_TRUE(deleted_on_main_thread);
-}
-
-TEST_F(SequencedTaskRunnerTest, OnTaskRunnerDeleterTargetStoppedEarly) {
-  bool deleted_on_main_thread = false;
-  FlagOnDelete* raw = new FlagOnDelete(&deleted_on_main_thread, main_runner_);
-  SequenceBoundUniquePtr ptr(raw, OnTaskRunnerDeleter(foreign_runner_));
-  EXPECT_FALSE(deleted_on_main_thread);
-
-  // Stopping the target ahead of deleting |ptr| should make its
-  // OnTaskRunnerDeleter no-op.
-  foreign_thread_.Stop();
-  ptr = nullptr;
-  EXPECT_FALSE(deleted_on_main_thread);
-
-  delete raw;
-  EXPECT_TRUE(deleted_on_main_thread);
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/sha1_unittest.cc b/base/sha1_unittest.cc
deleted file mode 100644
index ea9cf63..0000000
--- a/base/sha1_unittest.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/sha1.h"
-
-#include <stddef.h>
-
-#include <string>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-TEST(SHA1Test, Test1) {
-  // Example A.1 from FIPS 180-2: one-block message.
-  std::string input = "abc";
-
-  int expected[] = { 0xa9, 0x99, 0x3e, 0x36,
-                     0x47, 0x06, 0x81, 0x6a,
-                     0xba, 0x3e, 0x25, 0x71,
-                     0x78, 0x50, 0xc2, 0x6c,
-                     0x9c, 0xd0, 0xd8, 0x9d };
-
-  std::string output = base::SHA1HashString(input);
-  for (size_t i = 0; i < base::kSHA1Length; i++)
-    EXPECT_EQ(expected[i], output[i] & 0xFF);
-}
-
-TEST(SHA1Test, Test2) {
-  // Example A.2 from FIPS 180-2: multi-block message.
-  std::string input =
-      "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
-
-  int expected[] = { 0x84, 0x98, 0x3e, 0x44,
-                     0x1c, 0x3b, 0xd2, 0x6e,
-                     0xba, 0xae, 0x4a, 0xa1,
-                     0xf9, 0x51, 0x29, 0xe5,
-                     0xe5, 0x46, 0x70, 0xf1 };
-
-  std::string output = base::SHA1HashString(input);
-  for (size_t i = 0; i < base::kSHA1Length; i++)
-    EXPECT_EQ(expected[i], output[i] & 0xFF);
-}
-
-TEST(SHA1Test, Test3) {
-  // Example A.3 from FIPS 180-2: long message.
-  std::string input(1000000, 'a');
-
-  int expected[] = { 0x34, 0xaa, 0x97, 0x3c,
-                     0xd4, 0xc4, 0xda, 0xa4,
-                     0xf6, 0x1e, 0xeb, 0x2b,
-                     0xdb, 0xad, 0x27, 0x31,
-                     0x65, 0x34, 0x01, 0x6f };
-
-  std::string output = base::SHA1HashString(input);
-  for (size_t i = 0; i < base::kSHA1Length; i++)
-    EXPECT_EQ(expected[i], output[i] & 0xFF);
-}
-
-TEST(SHA1Test, Test1Bytes) {
-  // Example A.1 from FIPS 180-2: one-block message.
-  std::string input = "abc";
-  unsigned char output[base::kSHA1Length];
-
-  unsigned char expected[] = { 0xa9, 0x99, 0x3e, 0x36,
-                               0x47, 0x06, 0x81, 0x6a,
-                               0xba, 0x3e, 0x25, 0x71,
-                               0x78, 0x50, 0xc2, 0x6c,
-                               0x9c, 0xd0, 0xd8, 0x9d };
-
-  base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(input.c_str()),
-                      input.length(), output);
-  for (size_t i = 0; i < base::kSHA1Length; i++)
-    EXPECT_EQ(expected[i], output[i]);
-}
-
-TEST(SHA1Test, Test2Bytes) {
-  // Example A.2 from FIPS 180-2: multi-block message.
-  std::string input =
-      "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
-  unsigned char output[base::kSHA1Length];
-
-  unsigned char expected[] = { 0x84, 0x98, 0x3e, 0x44,
-                               0x1c, 0x3b, 0xd2, 0x6e,
-                               0xba, 0xae, 0x4a, 0xa1,
-                               0xf9, 0x51, 0x29, 0xe5,
-                               0xe5, 0x46, 0x70, 0xf1 };
-
-  base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(input.c_str()),
-                      input.length(), output);
-  for (size_t i = 0; i < base::kSHA1Length; i++)
-    EXPECT_EQ(expected[i], output[i]);
-}
-
-TEST(SHA1Test, Test3Bytes) {
-  // Example A.3 from FIPS 180-2: long message.
-  std::string input(1000000, 'a');
-  unsigned char output[base::kSHA1Length];
-
-  unsigned char expected[] = { 0x34, 0xaa, 0x97, 0x3c,
-                               0xd4, 0xc4, 0xda, 0xa4,
-                               0xf6, 0x1e, 0xeb, 0x2b,
-                               0xdb, 0xad, 0x27, 0x31,
-                               0x65, 0x34, 0x01, 0x6f };
-
-  base::SHA1HashBytes(reinterpret_cast<const unsigned char*>(input.c_str()),
-                      input.length(), output);
-  for (size_t i = 0; i < base::kSHA1Length; i++)
-    EXPECT_EQ(expected[i], output[i]);
-}
diff --git a/base/stl_util_unittest.cc b/base/stl_util_unittest.cc
deleted file mode 100644
index f13f881..0000000
--- a/base/stl_util_unittest.cc
+++ /dev/null
@@ -1,612 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/stl_util.h"
-
-#include <array>
-#include <deque>
-#include <forward_list>
-#include <functional>
-#include <initializer_list>
-#include <iterator>
-#include <list>
-#include <map>
-#include <queue>
-#include <set>
-#include <stack>
-#include <string>
-#include <type_traits>
-#include <unordered_map>
-#include <unordered_set>
-#include <vector>
-
-#include "base/containers/queue.h"
-#include "base/strings/string16.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-// Used as test case to ensure the various base::STLXxx functions don't require
-// more than operators "<" and "==" on values stored in containers.
-class ComparableValue {
- public:
-  explicit ComparableValue(int value) : value_(value) {}
-
-  bool operator==(const ComparableValue& rhs) const {
-    return value_ == rhs.value_;
-  }
-
-  bool operator<(const ComparableValue& rhs) const {
-    return value_ < rhs.value_;
-  }
-
- private:
-  int value_;
-};
-
-template <typename Container>
-void RunEraseTest() {
-  const std::pair<Container, Container> test_data[] = {
-      {Container(), Container()}, {{1, 2, 3}, {1, 3}}, {{1, 2, 3, 2}, {1, 3}}};
-
-  for (auto test_case : test_data) {
-    base::Erase(test_case.first, 2);
-    EXPECT_EQ(test_case.second, test_case.first);
-  }
-}
-
-// This test is written for containers of std::pair<int, int> to support maps.
-template <typename Container>
-void RunEraseIfTest() {
-  struct {
-    Container input;
-    Container erase_even;
-    Container erase_odd;
-  } test_data[] = {
-      {Container(), Container(), Container()},
-      {{{1, 1}, {2, 2}, {3, 3}}, {{1, 1}, {3, 3}}, {{2, 2}}},
-      {{{1, 1}, {2, 2}, {3, 3}, {4, 4}}, {{1, 1}, {3, 3}}, {{2, 2}, {4, 4}}},
-  };
-
-  for (auto test_case : test_data) {
-    base::EraseIf(test_case.input, [](const std::pair<int, int>& elem) {
-      return !(elem.first & 1);
-    });
-    EXPECT_EQ(test_case.erase_even, test_case.input);
-  }
-
-  for (auto test_case : test_data) {
-    base::EraseIf(test_case.input, [](const std::pair<int, int>& elem) {
-      return elem.first & 1;
-    });
-    EXPECT_EQ(test_case.erase_odd, test_case.input);
-  }
-}
-
-struct CustomIntHash {
-  size_t operator()(int elem) const { return std::hash<int>()(elem) + 1; }
-};
-
-struct HashByFirst {
-  size_t operator()(const std::pair<int, int>& elem) const {
-    return std::hash<int>()(elem.first);
-  }
-};
-
-}  // namespace
-
-namespace base {
-namespace {
-
-TEST(STLUtilTest, Size) {
-  {
-    std::vector<int> vector = {1, 2, 3, 4, 5};
-    static_assert(
-        std::is_same<decltype(base::size(vector)),
-                     decltype(vector.size())>::value,
-        "base::size(vector) should have the same type as vector.size()");
-    EXPECT_EQ(vector.size(), base::size(vector));
-  }
-
-  {
-    std::string empty_str;
-    static_assert(
-        std::is_same<decltype(base::size(empty_str)),
-                     decltype(empty_str.size())>::value,
-        "base::size(empty_str) should have the same type as empty_str.size()");
-    EXPECT_EQ(0u, base::size(empty_str));
-  }
-
-  {
-    std::array<int, 4> array = {{1, 2, 3, 4}};
-    static_assert(
-        std::is_same<decltype(base::size(array)),
-                     decltype(array.size())>::value,
-        "base::size(array) should have the same type as array.size()");
-    static_assert(base::size(array) == array.size(),
-                  "base::size(array) should be equal to array.size()");
-  }
-
-  {
-    int array[] = {1, 2, 3};
-    static_assert(std::is_same<size_t, decltype(base::size(array))>::value,
-                  "base::size(array) should be of type size_t");
-    static_assert(3u == base::size(array), "base::size(array) should be 3");
-  }
-}
-
-TEST(STLUtilTest, Empty) {
-  {
-    std::vector<int> vector;
-    static_assert(
-        std::is_same<decltype(base::empty(vector)),
-                     decltype(vector.empty())>::value,
-        "base::empty(vector) should have the same type as vector.empty()");
-    EXPECT_EQ(vector.empty(), base::empty(vector));
-  }
-
-  {
-    std::array<int, 4> array = {{1, 2, 3, 4}};
-    static_assert(
-        std::is_same<decltype(base::empty(array)),
-                     decltype(array.empty())>::value,
-        "base::empty(array) should have the same type as array.empty()");
-    static_assert(base::empty(array) == array.empty(),
-                  "base::empty(array) should be equal to array.empty()");
-  }
-
-  {
-    int array[] = {1, 2, 3};
-    static_assert(std::is_same<bool, decltype(base::empty(array))>::value,
-                  "base::empty(array) should be of type bool");
-    static_assert(!base::empty(array), "base::empty(array) should be false");
-  }
-
-  {
-    constexpr std::initializer_list<int> il;
-    static_assert(std::is_same<bool, decltype(base::empty(il))>::value,
-                  "base::empty(il) should be of type bool");
-    static_assert(base::empty(il), "base::empty(il) should be true");
-  }
-}
-
-TEST(STLUtilTest, Data) {
-  {
-    std::vector<int> vector = {1, 2, 3, 4, 5};
-    static_assert(
-        std::is_same<decltype(base::data(vector)),
-                     decltype(vector.data())>::value,
-        "base::data(vector) should have the same type as vector.data()");
-    EXPECT_EQ(vector.data(), base::data(vector));
-  }
-
-  {
-    const std::string cstr = "const string";
-    static_assert(
-        std::is_same<decltype(base::data(cstr)), decltype(cstr.data())>::value,
-        "base::data(cstr) should have the same type as cstr.data()");
-
-    EXPECT_EQ(cstr.data(), base::data(cstr));
-  }
-
-  {
-    std::string str = "mutable string";
-    static_assert(std::is_same<decltype(base::data(str)), char*>::value,
-                  "base::data(str) should be of type char*");
-    EXPECT_EQ(str.data(), base::data(str));
-  }
-
-  {
-    std::string empty_str;
-    static_assert(std::is_same<decltype(base::data(empty_str)), char*>::value,
-                  "base::data(empty_str) should be of type char*");
-    EXPECT_EQ(empty_str.data(), base::data(empty_str));
-  }
-
-  {
-    std::array<int, 4> array = {{1, 2, 3, 4}};
-    static_assert(
-        std::is_same<decltype(base::data(array)),
-                     decltype(array.data())>::value,
-        "base::data(array) should have the same type as array.data()");
-    // std::array::data() is not constexpr prior to C++17, hence the runtime
-    // check.
-    EXPECT_EQ(array.data(), base::data(array));
-  }
-
-  {
-    constexpr int array[] = {1, 2, 3};
-    static_assert(std::is_same<const int*, decltype(base::data(array))>::value,
-                  "base::data(array) should be of type const int*");
-    static_assert(array == base::data(array),
-                  "base::data(array) should be array");
-  }
-
-  {
-    constexpr std::initializer_list<int> il;
-    static_assert(
-        std::is_same<decltype(il.begin()), decltype(base::data(il))>::value,
-        "base::data(il) should have the same type as il.begin()");
-    static_assert(il.begin() == base::data(il),
-                  "base::data(il) should be equal to il.begin()");
-  }
-}
-
-TEST(STLUtilTest, GetUnderlyingContainer) {
-  {
-    std::queue<int> queue({1, 2, 3, 4, 5});
-    static_assert(std::is_same<decltype(GetUnderlyingContainer(queue)),
-                               const std::deque<int>&>::value,
-                  "GetUnderlyingContainer(queue) should be of type deque");
-    EXPECT_THAT(GetUnderlyingContainer(queue),
-                testing::ElementsAre(1, 2, 3, 4, 5));
-  }
-
-  {
-    std::queue<int> queue;
-    EXPECT_THAT(GetUnderlyingContainer(queue), testing::ElementsAre());
-  }
-
-  {
-    base::queue<int> queue({1, 2, 3, 4, 5});
-    static_assert(
-        std::is_same<decltype(GetUnderlyingContainer(queue)),
-                     const base::circular_deque<int>&>::value,
-        "GetUnderlyingContainer(queue) should be of type circular_deque");
-    EXPECT_THAT(GetUnderlyingContainer(queue),
-                testing::ElementsAre(1, 2, 3, 4, 5));
-  }
-
-  {
-    std::vector<int> values = {1, 2, 3, 4, 5};
-    std::priority_queue<int> queue(values.begin(), values.end());
-    static_assert(std::is_same<decltype(GetUnderlyingContainer(queue)),
-                               const std::vector<int>&>::value,
-                  "GetUnderlyingContainer(queue) should be of type vector");
-    EXPECT_THAT(GetUnderlyingContainer(queue),
-                testing::UnorderedElementsAre(1, 2, 3, 4, 5));
-  }
-
-  {
-    std::stack<int> stack({1, 2, 3, 4, 5});
-    static_assert(std::is_same<decltype(GetUnderlyingContainer(stack)),
-                               const std::deque<int>&>::value,
-                  "GetUnderlyingContainer(stack) should be of type deque");
-    EXPECT_THAT(GetUnderlyingContainer(stack),
-                testing::ElementsAre(1, 2, 3, 4, 5));
-  }
-}
-
-TEST(STLUtilTest, STLIsSorted) {
-  {
-    std::set<int> set;
-    set.insert(24);
-    set.insert(1);
-    set.insert(12);
-    EXPECT_TRUE(STLIsSorted(set));
-  }
-
-  {
-    std::set<ComparableValue> set;
-    set.insert(ComparableValue(24));
-    set.insert(ComparableValue(1));
-    set.insert(ComparableValue(12));
-    EXPECT_TRUE(STLIsSorted(set));
-  }
-
-  {
-    std::vector<int> vector;
-    vector.push_back(1);
-    vector.push_back(1);
-    vector.push_back(4);
-    vector.push_back(64);
-    vector.push_back(12432);
-    EXPECT_TRUE(STLIsSorted(vector));
-    vector.back() = 1;
-    EXPECT_FALSE(STLIsSorted(vector));
-  }
-}
-
-TEST(STLUtilTest, STLSetDifference) {
-  std::set<int> a1;
-  a1.insert(1);
-  a1.insert(2);
-  a1.insert(3);
-  a1.insert(4);
-
-  std::set<int> a2;
-  a2.insert(3);
-  a2.insert(4);
-  a2.insert(5);
-  a2.insert(6);
-  a2.insert(7);
-
-  {
-    std::set<int> difference;
-    difference.insert(1);
-    difference.insert(2);
-    EXPECT_EQ(difference, STLSetDifference<std::set<int> >(a1, a2));
-  }
-
-  {
-    std::set<int> difference;
-    difference.insert(5);
-    difference.insert(6);
-    difference.insert(7);
-    EXPECT_EQ(difference, STLSetDifference<std::set<int> >(a2, a1));
-  }
-
-  {
-    std::vector<int> difference;
-    difference.push_back(1);
-    difference.push_back(2);
-    EXPECT_EQ(difference, STLSetDifference<std::vector<int> >(a1, a2));
-  }
-
-  {
-    std::vector<int> difference;
-    difference.push_back(5);
-    difference.push_back(6);
-    difference.push_back(7);
-    EXPECT_EQ(difference, STLSetDifference<std::vector<int> >(a2, a1));
-  }
-}
-
-TEST(STLUtilTest, STLSetUnion) {
-  std::set<int> a1;
-  a1.insert(1);
-  a1.insert(2);
-  a1.insert(3);
-  a1.insert(4);
-
-  std::set<int> a2;
-  a2.insert(3);
-  a2.insert(4);
-  a2.insert(5);
-  a2.insert(6);
-  a2.insert(7);
-
-  {
-    std::set<int> result;
-    result.insert(1);
-    result.insert(2);
-    result.insert(3);
-    result.insert(4);
-    result.insert(5);
-    result.insert(6);
-    result.insert(7);
-    EXPECT_EQ(result, STLSetUnion<std::set<int> >(a1, a2));
-  }
-
-  {
-    std::set<int> result;
-    result.insert(1);
-    result.insert(2);
-    result.insert(3);
-    result.insert(4);
-    result.insert(5);
-    result.insert(6);
-    result.insert(7);
-    EXPECT_EQ(result, STLSetUnion<std::set<int> >(a2, a1));
-  }
-
-  {
-    std::vector<int> result;
-    result.push_back(1);
-    result.push_back(2);
-    result.push_back(3);
-    result.push_back(4);
-    result.push_back(5);
-    result.push_back(6);
-    result.push_back(7);
-    EXPECT_EQ(result, STLSetUnion<std::vector<int> >(a1, a2));
-  }
-
-  {
-    std::vector<int> result;
-    result.push_back(1);
-    result.push_back(2);
-    result.push_back(3);
-    result.push_back(4);
-    result.push_back(5);
-    result.push_back(6);
-    result.push_back(7);
-    EXPECT_EQ(result, STLSetUnion<std::vector<int> >(a2, a1));
-  }
-}
-
-TEST(STLUtilTest, STLSetIntersection) {
-  std::set<int> a1;
-  a1.insert(1);
-  a1.insert(2);
-  a1.insert(3);
-  a1.insert(4);
-
-  std::set<int> a2;
-  a2.insert(3);
-  a2.insert(4);
-  a2.insert(5);
-  a2.insert(6);
-  a2.insert(7);
-
-  {
-    std::set<int> result;
-    result.insert(3);
-    result.insert(4);
-    EXPECT_EQ(result, STLSetIntersection<std::set<int> >(a1, a2));
-  }
-
-  {
-    std::set<int> result;
-    result.insert(3);
-    result.insert(4);
-    EXPECT_EQ(result, STLSetIntersection<std::set<int> >(a2, a1));
-  }
-
-  {
-    std::vector<int> result;
-    result.push_back(3);
-    result.push_back(4);
-    EXPECT_EQ(result, STLSetIntersection<std::vector<int> >(a1, a2));
-  }
-
-  {
-    std::vector<int> result;
-    result.push_back(3);
-    result.push_back(4);
-    EXPECT_EQ(result, STLSetIntersection<std::vector<int> >(a2, a1));
-  }
-}
-
-TEST(STLUtilTest, STLIncludes) {
-  std::set<int> a1;
-  a1.insert(1);
-  a1.insert(2);
-  a1.insert(3);
-  a1.insert(4);
-
-  std::set<int> a2;
-  a2.insert(3);
-  a2.insert(4);
-
-  std::set<int> a3;
-  a3.insert(3);
-  a3.insert(4);
-  a3.insert(5);
-
-  EXPECT_TRUE(STLIncludes<std::set<int> >(a1, a2));
-  EXPECT_FALSE(STLIncludes<std::set<int> >(a1, a3));
-  EXPECT_FALSE(STLIncludes<std::set<int> >(a2, a1));
-  EXPECT_FALSE(STLIncludes<std::set<int> >(a2, a3));
-  EXPECT_FALSE(STLIncludes<std::set<int> >(a3, a1));
-  EXPECT_TRUE(STLIncludes<std::set<int> >(a3, a2));
-}
-
-TEST(Erase, String) {
-  const std::pair<std::string, std::string> test_data[] = {
-      {"", ""}, {"abc", "bc"}, {"abca", "bc"},
-  };
-
-  for (auto test_case : test_data) {
-    Erase(test_case.first, 'a');
-    EXPECT_EQ(test_case.second, test_case.first);
-  }
-
-  for (auto test_case : test_data) {
-    EraseIf(test_case.first, [](char elem) { return elem < 'b'; });
-    EXPECT_EQ(test_case.second, test_case.first);
-  }
-}
-
-TEST(Erase, String16) {
-  std::pair<base::string16, base::string16> test_data[] = {
-      {base::string16(), base::string16()},
-      {UTF8ToUTF16("abc"), UTF8ToUTF16("bc")},
-      {UTF8ToUTF16("abca"), UTF8ToUTF16("bc")},
-  };
-
-  const base::string16 letters = UTF8ToUTF16("ab");
-  for (auto test_case : test_data) {
-    Erase(test_case.first, letters[0]);
-    EXPECT_EQ(test_case.second, test_case.first);
-  }
-
-  for (auto test_case : test_data) {
-    EraseIf(test_case.first, [&](short elem) { return elem < letters[1]; });
-    EXPECT_EQ(test_case.second, test_case.first);
-  }
-}
-
-TEST(Erase, Deque) {
-  RunEraseTest<std::deque<int>>();
-  RunEraseIfTest<std::deque<std::pair<int, int>>>();
-}
-
-TEST(Erase, Vector) {
-  RunEraseTest<std::vector<int>>();
-  RunEraseIfTest<std::vector<std::pair<int, int>>>();
-}
-
-TEST(Erase, ForwardList) {
-  RunEraseTest<std::forward_list<int>>();
-  RunEraseIfTest<std::forward_list<std::pair<int, int>>>();
-}
-
-TEST(Erase, List) {
-  RunEraseTest<std::list<int>>();
-  RunEraseIfTest<std::list<std::pair<int, int>>>();
-}
-
-TEST(Erase, Map) {
-  RunEraseIfTest<std::map<int, int>>();
-  RunEraseIfTest<std::map<int, int, std::greater<int>>>();
-}
-
-TEST(Erase, Multimap) {
-  RunEraseIfTest<std::multimap<int, int>>();
-  RunEraseIfTest<std::multimap<int, int, std::greater<int>>>();
-}
-
-TEST(Erase, Set) {
-  RunEraseIfTest<std::set<std::pair<int, int>>>();
-  RunEraseIfTest<
-      std::set<std::pair<int, int>, std::greater<std::pair<int, int>>>>();
-}
-
-TEST(Erase, Multiset) {
-  RunEraseIfTest<std::multiset<std::pair<int, int>>>();
-  RunEraseIfTest<
-      std::multiset<std::pair<int, int>, std::greater<std::pair<int, int>>>>();
-}
-
-TEST(Erase, UnorderedMap) {
-  RunEraseIfTest<std::unordered_map<int, int>>();
-  RunEraseIfTest<std::unordered_map<int, int, CustomIntHash>>();
-}
-
-TEST(Erase, UnorderedMultimap) {
-  RunEraseIfTest<std::unordered_multimap<int, int>>();
-  RunEraseIfTest<std::unordered_multimap<int, int, CustomIntHash>>();
-}
-
-TEST(Erase, UnorderedSet) {
-  RunEraseIfTest<std::unordered_set<std::pair<int, int>, HashByFirst>>();
-}
-
-TEST(Erase, UnorderedMultiset) {
-  RunEraseIfTest<std::unordered_multiset<std::pair<int, int>, HashByFirst>>();
-}
-
-TEST(Erase, IsNotIn) {
-  // Should keep both '2' but only one '4', like std::set_intersection.
-  std::vector<int> lhs = {0, 2, 2, 4, 4, 4, 6, 8, 10};
-  std::vector<int> rhs = {1, 2, 2, 4, 5, 6, 7};
-  std::vector<int> expected = {2, 2, 4, 6};
-  EraseIf(lhs, IsNotIn<std::vector<int>>(rhs));
-  EXPECT_EQ(expected, lhs);
-}
-
-TEST(ContainsValue, OrdinaryArrays) {
-  const char allowed_chars[] = {'a', 'b', 'c', 'd'};
-  EXPECT_TRUE(ContainsValue(allowed_chars, 'a'));
-  EXPECT_FALSE(ContainsValue(allowed_chars, 'z'));
-  EXPECT_FALSE(ContainsValue(allowed_chars, 0));
-
-  const char allowed_chars_including_nul[] = "abcd";
-  EXPECT_TRUE(ContainsValue(allowed_chars_including_nul, 0));
-}
-
-TEST(STLUtilTest, OptionalOrNullptr) {
-  Optional<float> optional;
-  EXPECT_EQ(nullptr, base::OptionalOrNullptr(optional));
-
-  optional = 0.1f;
-  EXPECT_EQ(&optional.value(), base::OptionalOrNullptr(optional));
-  EXPECT_NE(nullptr, base::OptionalOrNullptr(optional));
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/strings/char_traits_unittest.cc b/base/strings/char_traits_unittest.cc
deleted file mode 100644
index 31c421b..0000000
--- a/base/strings/char_traits_unittest.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/char_traits.h"
-#include "base/strings/string16.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(CharTraitsTest, CharCompare) {
-  static_assert(CharTraits<char>::compare("abc", "def", 3) == -1, "");
-  static_assert(CharTraits<char>::compare("def", "def", 3) == 0, "");
-  static_assert(CharTraits<char>::compare("ghi", "def", 3) == 1, "");
-}
-
-TEST(CharTraitsTest, CharLength) {
-  static_assert(CharTraits<char>::length("") == 0, "");
-  static_assert(CharTraits<char>::length("abc") == 3, "");
-}
-
-TEST(CharTraitsTest, Char16TCompare) {
-  static_assert(CharTraits<char16_t>::compare(u"abc", u"def", 3) == -1, "");
-  static_assert(CharTraits<char16_t>::compare(u"def", u"def", 3) == 0, "");
-  static_assert(CharTraits<char16_t>::compare(u"ghi", u"def", 3) == 1, "");
-}
-
-TEST(CharTraitsTest, Char16TLength) {
-  static_assert(CharTraits<char16_t>::length(u"abc") == 3, "");
-}
-
-}  // namespace base
diff --git a/base/strings/nullable_string16_unittest.cc b/base/strings/nullable_string16_unittest.cc
deleted file mode 100644
index f02fdce..0000000
--- a/base/strings/nullable_string16_unittest.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/nullable_string16.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(NullableString16Test, DefaultConstructor) {
-  NullableString16 s;
-  EXPECT_TRUE(s.is_null());
-  EXPECT_EQ(string16(), s.string());
-}
-
-TEST(NullableString16Test, Equals) {
-  NullableString16 a(ASCIIToUTF16("hello"), false);
-  NullableString16 b(ASCIIToUTF16("hello"), false);
-  EXPECT_EQ(a, b);
-}
-
-TEST(NullableString16Test, NotEquals) {
-  NullableString16 a(ASCIIToUTF16("hello"), false);
-  NullableString16 b(ASCIIToUTF16("world"), false);
-  EXPECT_NE(a, b);
-}
-
-TEST(NullableString16Test, NotEqualsNull) {
-  NullableString16 a(ASCIIToUTF16("hello"), false);
-  NullableString16 b;
-  EXPECT_NE(a, b);
-}
-
-}  // namespace base
diff --git a/base/strings/pattern_unittest.cc b/base/strings/pattern_unittest.cc
deleted file mode 100644
index 8ec5495..0000000
--- a/base/strings/pattern_unittest.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/pattern.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(StringUtilTest, MatchPatternTest) {
-  EXPECT_TRUE(MatchPattern("www.google.com", "*.com"));
-  EXPECT_TRUE(MatchPattern("www.google.com", "*"));
-  EXPECT_FALSE(MatchPattern("www.google.com", "www*.g*.org"));
-  EXPECT_TRUE(MatchPattern("Hello", "H?l?o"));
-  EXPECT_FALSE(MatchPattern("www.google.com", "http://*)"));
-  EXPECT_FALSE(MatchPattern("www.msn.com", "*.COM"));
-  EXPECT_TRUE(MatchPattern("Hello*1234", "He??o\\*1*"));
-  EXPECT_FALSE(MatchPattern("", "*.*"));
-  EXPECT_TRUE(MatchPattern("", "*"));
-  EXPECT_TRUE(MatchPattern("", "?"));
-  EXPECT_TRUE(MatchPattern("", ""));
-  EXPECT_FALSE(MatchPattern("Hello", ""));
-  EXPECT_TRUE(MatchPattern("Hello*", "Hello*"));
-  EXPECT_TRUE(MatchPattern("abcd", "*???"));
-  EXPECT_FALSE(MatchPattern("abcd", "???"));
-  EXPECT_TRUE(MatchPattern("abcb", "a*b"));
-  EXPECT_FALSE(MatchPattern("abcb", "a?b"));
-
-  // Test UTF8 matching.
-  EXPECT_TRUE(MatchPattern("heart: \xe2\x99\xa0", "*\xe2\x99\xa0"));
-  EXPECT_TRUE(MatchPattern("heart: \xe2\x99\xa0.", "heart: ?."));
-  EXPECT_TRUE(MatchPattern("hearts: \xe2\x99\xa0\xe2\x99\xa0", "*"));
-  // Invalid sequences should be handled as a single invalid character.
-  EXPECT_TRUE(MatchPattern("invalid: \xef\xbf\xbe", "invalid: ?"));
-  // If the pattern has invalid characters, it shouldn't match anything.
-  EXPECT_FALSE(MatchPattern("\xf4\x90\x80\x80", "\xf4\x90\x80\x80"));
-
-  // Test UTF16 character matching.
-  EXPECT_TRUE(MatchPattern(UTF8ToUTF16("www.google.com"),
-                           UTF8ToUTF16("*.com")));
-  EXPECT_TRUE(MatchPattern(UTF8ToUTF16("Hello*1234"),
-                           UTF8ToUTF16("He??o\\*1*")));
-
-  // Some test cases that might cause naive implementations to exhibit
-  // exponential run time or fail.
-  EXPECT_TRUE(MatchPattern("Hello", "He********************************o"));
-  EXPECT_TRUE(MatchPattern("123456789012345678", "?????????????????*"));
-  EXPECT_TRUE(MatchPattern("aaaaaaaaaaab", "a*a*a*a*a*a*a*a*a*a*a*b"));
-}
-
-}  // namespace base
diff --git a/base/strings/safe_sprintf_unittest.cc b/base/strings/safe_sprintf_unittest.cc
deleted file mode 100644
index 4a0948b..0000000
--- a/base/strings/safe_sprintf_unittest.cc
+++ /dev/null
@@ -1,765 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/safe_sprintf.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <limits>
-#include <memory>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-// Death tests on Android are currently very flaky. No need to add more flaky
-// tests, as they just make it hard to spot real problems.
-// TODO(markus): See if the restrictions on Android can eventually be lifted.
-#if defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
-#define ALLOW_DEATH_TEST
-#endif
-
-namespace base {
-namespace strings {
-
-TEST(SafeSPrintfTest, Empty) {
-  char buf[2] = { 'X', 'X' };
-
-  // Negative buffer size should always result in an error.
-  EXPECT_EQ(-1, SafeSNPrintf(buf, static_cast<size_t>(-1), ""));
-  EXPECT_EQ('X', buf[0]);
-  EXPECT_EQ('X', buf[1]);
-
-  // Zero buffer size should always result in an error.
-  EXPECT_EQ(-1, SafeSNPrintf(buf, 0, ""));
-  EXPECT_EQ('X', buf[0]);
-  EXPECT_EQ('X', buf[1]);
-
-  // A one-byte buffer should always print a single NUL byte.
-  EXPECT_EQ(0, SafeSNPrintf(buf, 1, ""));
-  EXPECT_EQ(0, buf[0]);
-  EXPECT_EQ('X', buf[1]);
-  buf[0] = 'X';
-
-  // A larger buffer should leave the trailing bytes unchanged.
-  EXPECT_EQ(0, SafeSNPrintf(buf, 2, ""));
-  EXPECT_EQ(0, buf[0]);
-  EXPECT_EQ('X', buf[1]);
-  buf[0] = 'X';
-
-  // The same test using SafeSPrintf() instead of SafeSNPrintf().
-  EXPECT_EQ(0, SafeSPrintf(buf, ""));
-  EXPECT_EQ(0, buf[0]);
-  EXPECT_EQ('X', buf[1]);
-  buf[0] = 'X';
-}
-
-TEST(SafeSPrintfTest, NoArguments) {
-  // Output a text message that doesn't require any substitutions. This
-  // is roughly equivalent to calling strncpy() (but unlike strncpy(), it does
-  // always add a trailing NUL; it always deduplicates '%' characters).
-  static const char text[] = "hello world";
-  char ref[20], buf[20];
-  memset(ref, 'X', sizeof(ref));
-  memcpy(buf, ref, sizeof(buf));
-
-  // A negative buffer size should always result in an error.
-  EXPECT_EQ(-1, SafeSNPrintf(buf, static_cast<size_t>(-1), text));
-  EXPECT_TRUE(!memcmp(buf, ref, sizeof(buf)));
-
-  // Zero buffer size should always result in an error.
-  EXPECT_EQ(-1, SafeSNPrintf(buf, 0, text));
-  EXPECT_TRUE(!memcmp(buf, ref, sizeof(buf)));
-
-  // A one-byte buffer should always print a single NUL byte.
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1, SafeSNPrintf(buf, 1, text));
-  EXPECT_EQ(0, buf[0]);
-  EXPECT_TRUE(!memcmp(buf+1, ref+1, sizeof(buf)-1));
-  memcpy(buf, ref, sizeof(buf));
-
-  // A larger (but limited) buffer should always leave the trailing bytes
-  // unchanged.
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1, SafeSNPrintf(buf, 2, text));
-  EXPECT_EQ(text[0], buf[0]);
-  EXPECT_EQ(0, buf[1]);
-  EXPECT_TRUE(!memcmp(buf+2, ref+2, sizeof(buf)-2));
-  memcpy(buf, ref, sizeof(buf));
-
-  // A unrestricted buffer length should always leave the trailing bytes
-  // unchanged.
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1,
-            SafeSNPrintf(buf, sizeof(buf), text));
-  EXPECT_EQ(std::string(text), std::string(buf));
-  EXPECT_TRUE(!memcmp(buf + sizeof(text), ref + sizeof(text),
-                      sizeof(buf) - sizeof(text)));
-  memcpy(buf, ref, sizeof(buf));
-
-  // The same test using SafeSPrintf() instead of SafeSNPrintf().
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1, SafeSPrintf(buf, text));
-  EXPECT_EQ(std::string(text), std::string(buf));
-  EXPECT_TRUE(!memcmp(buf + sizeof(text), ref + sizeof(text),
-                      sizeof(buf) - sizeof(text)));
-  memcpy(buf, ref, sizeof(buf));
-
-  // Check for deduplication of '%' percent characters.
-  EXPECT_EQ(1, SafeSPrintf(buf, "%%"));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%%%%"));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%%X"));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%%%%X"));
-#if defined(NDEBUG)
-  EXPECT_EQ(1, SafeSPrintf(buf, "%"));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%%%"));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%X"));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%%%X"));
-#elif defined(ALLOW_DEATH_TEST)
-  EXPECT_DEATH(SafeSPrintf(buf, "%"), "src.1. == '%'");
-  EXPECT_DEATH(SafeSPrintf(buf, "%%%"), "src.1. == '%'");
-  EXPECT_DEATH(SafeSPrintf(buf, "%X"), "src.1. == '%'");
-  EXPECT_DEATH(SafeSPrintf(buf, "%%%X"), "src.1. == '%'");
-#endif
-}
-
-TEST(SafeSPrintfTest, OneArgument) {
-  // Test basic single-argument single-character substitution.
-  const char text[] = "hello world";
-  const char fmt[]  = "hello%cworld";
-  char ref[20], buf[20];
-  memset(ref, 'X', sizeof(buf));
-  memcpy(buf, ref, sizeof(buf));
-
-  // A negative buffer size should always result in an error.
-  EXPECT_EQ(-1, SafeSNPrintf(buf, static_cast<size_t>(-1), fmt, ' '));
-  EXPECT_TRUE(!memcmp(buf, ref, sizeof(buf)));
-
-  // Zero buffer size should always result in an error.
-  EXPECT_EQ(-1, SafeSNPrintf(buf, 0, fmt, ' '));
-  EXPECT_TRUE(!memcmp(buf, ref, sizeof(buf)));
-
-  // A one-byte buffer should always print a single NUL byte.
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1,
-            SafeSNPrintf(buf, 1, fmt, ' '));
-  EXPECT_EQ(0, buf[0]);
-  EXPECT_TRUE(!memcmp(buf+1, ref+1, sizeof(buf)-1));
-  memcpy(buf, ref, sizeof(buf));
-
-  // A larger (but limited) buffer should always leave the trailing bytes
-  // unchanged.
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1,
-            SafeSNPrintf(buf, 2, fmt, ' '));
-  EXPECT_EQ(text[0], buf[0]);
-  EXPECT_EQ(0, buf[1]);
-  EXPECT_TRUE(!memcmp(buf+2, ref+2, sizeof(buf)-2));
-  memcpy(buf, ref, sizeof(buf));
-
-  // A unrestricted buffer length should always leave the trailing bytes
-  // unchanged.
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1,
-            SafeSNPrintf(buf, sizeof(buf), fmt, ' '));
-  EXPECT_EQ(std::string(text), std::string(buf));
-  EXPECT_TRUE(!memcmp(buf + sizeof(text), ref + sizeof(text),
-                      sizeof(buf) - sizeof(text)));
-  memcpy(buf, ref, sizeof(buf));
-
-  // The same test using SafeSPrintf() instead of SafeSNPrintf().
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(text))-1, SafeSPrintf(buf, fmt, ' '));
-  EXPECT_EQ(std::string(text), std::string(buf));
-  EXPECT_TRUE(!memcmp(buf + sizeof(text), ref + sizeof(text),
-                      sizeof(buf) - sizeof(text)));
-  memcpy(buf, ref, sizeof(buf));
-
-  // Check for deduplication of '%' percent characters.
-  EXPECT_EQ(1, SafeSPrintf(buf, "%%", 0));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%%%%", 0));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%Y", 0));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%%Y", 0));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%%%Y", 0));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%%%%Y", 0));
-#if defined(NDEBUG)
-  EXPECT_EQ(1, SafeSPrintf(buf, "%", 0));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%%%", 0));
-#elif defined(ALLOW_DEATH_TEST)
-  EXPECT_DEATH(SafeSPrintf(buf, "%", 0), "ch");
-  EXPECT_DEATH(SafeSPrintf(buf, "%%%", 0), "ch");
-#endif
-}
-
-TEST(SafeSPrintfTest, MissingArg) {
-#if defined(NDEBUG)
-  char buf[20];
-  EXPECT_EQ(3, SafeSPrintf(buf, "%c%c", 'A'));
-  EXPECT_EQ("A%c", std::string(buf));
-#elif defined(ALLOW_DEATH_TEST)
-  char buf[20];
-  EXPECT_DEATH(SafeSPrintf(buf, "%c%c", 'A'), "cur_arg < max_args");
-#endif
-}
-
-TEST(SafeSPrintfTest, ASANFriendlyBufferTest) {
-  // Print into a buffer that is sized exactly to size. ASAN can verify that
-  // nobody attempts to write past the end of the buffer.
-  // There is a more complicated test in PrintLongString() that covers a lot
-  // more edge case, but it is also harder to debug in case of a failure.
-  const char kTestString[] = "This is a test";
-  std::unique_ptr<char[]> buf(new char[sizeof(kTestString)]);
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(kTestString) - 1),
-            SafeSNPrintf(buf.get(), sizeof(kTestString), kTestString));
-  EXPECT_EQ(std::string(kTestString), std::string(buf.get()));
-  EXPECT_EQ(static_cast<ssize_t>(sizeof(kTestString) - 1),
-            SafeSNPrintf(buf.get(), sizeof(kTestString), "%s", kTestString));
-  EXPECT_EQ(std::string(kTestString), std::string(buf.get()));
-}
-
-TEST(SafeSPrintfTest, NArgs) {
-  // Pre-C++11 compilers have a different code path, that can only print
-  // up to ten distinct arguments.
-  // We test both SafeSPrintf() and SafeSNPrintf(). This makes sure we don't
-  // have typos in the copy-n-pasted code that is needed to deal with various
-  // numbers of arguments.
-  char buf[12];
-  EXPECT_EQ(1, SafeSPrintf(buf, "%c", 1));
-  EXPECT_EQ("\1", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%c%c", 1, 2));
-  EXPECT_EQ("\1\2", std::string(buf));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%c%c%c", 1, 2, 3));
-  EXPECT_EQ("\1\2\3", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, "%c%c%c%c", 1, 2, 3, 4));
-  EXPECT_EQ("\1\2\3\4", std::string(buf));
-  EXPECT_EQ(5, SafeSPrintf(buf, "%c%c%c%c%c", 1, 2, 3, 4, 5));
-  EXPECT_EQ("\1\2\3\4\5", std::string(buf));
-  EXPECT_EQ(6, SafeSPrintf(buf, "%c%c%c%c%c%c", 1, 2, 3, 4, 5, 6));
-  EXPECT_EQ("\1\2\3\4\5\6", std::string(buf));
-  EXPECT_EQ(7, SafeSPrintf(buf, "%c%c%c%c%c%c%c", 1, 2, 3, 4, 5, 6, 7));
-  EXPECT_EQ("\1\2\3\4\5\6\7", std::string(buf));
-  EXPECT_EQ(8, SafeSPrintf(buf, "%c%c%c%c%c%c%c%c", 1, 2, 3, 4, 5, 6, 7, 8));
-  EXPECT_EQ("\1\2\3\4\5\6\7\10", std::string(buf));
-  EXPECT_EQ(9, SafeSPrintf(buf, "%c%c%c%c%c%c%c%c%c",
-                           1, 2, 3, 4, 5, 6, 7, 8, 9));
-  EXPECT_EQ("\1\2\3\4\5\6\7\10\11", std::string(buf));
-  EXPECT_EQ(10, SafeSPrintf(buf, "%c%c%c%c%c%c%c%c%c%c",
-                            1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
-
-  // Repeat all the tests with SafeSNPrintf() instead of SafeSPrintf().
-  EXPECT_EQ("\1\2\3\4\5\6\7\10\11\12", std::string(buf));
-  EXPECT_EQ(1, SafeSNPrintf(buf, 11, "%c", 1));
-  EXPECT_EQ("\1", std::string(buf));
-  EXPECT_EQ(2, SafeSNPrintf(buf, 11, "%c%c", 1, 2));
-  EXPECT_EQ("\1\2", std::string(buf));
-  EXPECT_EQ(3, SafeSNPrintf(buf, 11, "%c%c%c", 1, 2, 3));
-  EXPECT_EQ("\1\2\3", std::string(buf));
-  EXPECT_EQ(4, SafeSNPrintf(buf, 11, "%c%c%c%c", 1, 2, 3, 4));
-  EXPECT_EQ("\1\2\3\4", std::string(buf));
-  EXPECT_EQ(5, SafeSNPrintf(buf, 11, "%c%c%c%c%c", 1, 2, 3, 4, 5));
-  EXPECT_EQ("\1\2\3\4\5", std::string(buf));
-  EXPECT_EQ(6, SafeSNPrintf(buf, 11, "%c%c%c%c%c%c", 1, 2, 3, 4, 5, 6));
-  EXPECT_EQ("\1\2\3\4\5\6", std::string(buf));
-  EXPECT_EQ(7, SafeSNPrintf(buf, 11, "%c%c%c%c%c%c%c", 1, 2, 3, 4, 5, 6, 7));
-  EXPECT_EQ("\1\2\3\4\5\6\7", std::string(buf));
-  EXPECT_EQ(8, SafeSNPrintf(buf, 11, "%c%c%c%c%c%c%c%c",
-                            1, 2, 3, 4, 5, 6, 7, 8));
-  EXPECT_EQ("\1\2\3\4\5\6\7\10", std::string(buf));
-  EXPECT_EQ(9, SafeSNPrintf(buf, 11, "%c%c%c%c%c%c%c%c%c",
-                            1, 2, 3, 4, 5, 6, 7, 8, 9));
-  EXPECT_EQ("\1\2\3\4\5\6\7\10\11", std::string(buf));
-  EXPECT_EQ(10, SafeSNPrintf(buf, 11, "%c%c%c%c%c%c%c%c%c%c",
-                             1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
-  EXPECT_EQ("\1\2\3\4\5\6\7\10\11\12", std::string(buf));
-
-  EXPECT_EQ(11, SafeSPrintf(buf, "%c%c%c%c%c%c%c%c%c%c%c",
-                            1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11));
-  EXPECT_EQ("\1\2\3\4\5\6\7\10\11\12\13", std::string(buf));
-  EXPECT_EQ(11, SafeSNPrintf(buf, 12, "%c%c%c%c%c%c%c%c%c%c%c",
-                             1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11));
-  EXPECT_EQ("\1\2\3\4\5\6\7\10\11\12\13", std::string(buf));
-}
-
-TEST(SafeSPrintfTest, DataTypes) {
-  char buf[40];
-
-  // Bytes
-  EXPECT_EQ(1, SafeSPrintf(buf, "%d", (uint8_t)1));
-  EXPECT_EQ("1", std::string(buf));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%d", (uint8_t)-1));
-  EXPECT_EQ("255", std::string(buf));
-  EXPECT_EQ(1, SafeSPrintf(buf, "%d", (int8_t)1));
-  EXPECT_EQ("1", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%d", (int8_t)-1));
-  EXPECT_EQ("-1", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, "%d", (int8_t)-128));
-  EXPECT_EQ("-128", std::string(buf));
-
-  // Half-words
-  EXPECT_EQ(1, SafeSPrintf(buf, "%d", (uint16_t)1));
-  EXPECT_EQ("1", std::string(buf));
-  EXPECT_EQ(5, SafeSPrintf(buf, "%d", (uint16_t)-1));
-  EXPECT_EQ("65535", std::string(buf));
-  EXPECT_EQ(1, SafeSPrintf(buf, "%d", (int16_t)1));
-  EXPECT_EQ("1", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%d", (int16_t)-1));
-  EXPECT_EQ("-1", std::string(buf));
-  EXPECT_EQ(6, SafeSPrintf(buf, "%d", (int16_t)-32768));
-  EXPECT_EQ("-32768", std::string(buf));
-
-  // Words
-  EXPECT_EQ(1, SafeSPrintf(buf, "%d", (uint32_t)1));
-  EXPECT_EQ("1", std::string(buf));
-  EXPECT_EQ(10, SafeSPrintf(buf, "%d", (uint32_t)-1));
-  EXPECT_EQ("4294967295", std::string(buf));
-  EXPECT_EQ(1, SafeSPrintf(buf, "%d", (int32_t)1));
-  EXPECT_EQ("1", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%d", (int32_t)-1));
-  EXPECT_EQ("-1", std::string(buf));
-  // Work-around for an limitation of C90
-  EXPECT_EQ(11, SafeSPrintf(buf, "%d", (int32_t)-2147483647-1));
-  EXPECT_EQ("-2147483648", std::string(buf));
-
-  // Quads
-  EXPECT_EQ(1, SafeSPrintf(buf, "%d", (uint64_t)1));
-  EXPECT_EQ("1", std::string(buf));
-  EXPECT_EQ(20, SafeSPrintf(buf, "%d", (uint64_t)-1));
-  EXPECT_EQ("18446744073709551615", std::string(buf));
-  EXPECT_EQ(1, SafeSPrintf(buf, "%d", (int64_t)1));
-  EXPECT_EQ("1", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%d", (int64_t)-1));
-  EXPECT_EQ("-1", std::string(buf));
-  // Work-around for an limitation of C90
-  EXPECT_EQ(20, SafeSPrintf(buf, "%d", (int64_t)-9223372036854775807LL-1));
-  EXPECT_EQ("-9223372036854775808", std::string(buf));
-
-  // Strings (both const and mutable).
-  EXPECT_EQ(4, SafeSPrintf(buf, "test"));
-  EXPECT_EQ("test", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, buf));
-  EXPECT_EQ("test", std::string(buf));
-
-  // Pointer
-  char addr[20];
-  sprintf(addr, "0x%llX", (unsigned long long)(uintptr_t)buf);
-  SafeSPrintf(buf, "%p", buf);
-  EXPECT_EQ(std::string(addr), std::string(buf));
-  SafeSPrintf(buf, "%p", (const char *)buf);
-  EXPECT_EQ(std::string(addr), std::string(buf));
-  sprintf(addr, "0x%llX", (unsigned long long)(uintptr_t)sprintf);
-  SafeSPrintf(buf, "%p", sprintf);
-  EXPECT_EQ(std::string(addr), std::string(buf));
-
-  // Padding for pointers is a little more complicated because of the "0x"
-  // prefix. Padding with '0' zeros is relatively straight-forward, but
-  // padding with ' ' spaces requires more effort.
-  sprintf(addr, "0x%017llX", (unsigned long long)(uintptr_t)buf);
-  SafeSPrintf(buf, "%019p", buf);
-  EXPECT_EQ(std::string(addr), std::string(buf));
-  sprintf(addr, "0x%llX", (unsigned long long)(uintptr_t)buf);
-  memset(addr, ' ',
-         (char*)memmove(addr + sizeof(addr) - strlen(addr) - 1,
-                        addr, strlen(addr)+1) - addr);
-  SafeSPrintf(buf, "%19p", buf);
-  EXPECT_EQ(std::string(addr), std::string(buf));
-}
-
-namespace {
-void PrintLongString(char* buf, size_t sz) {
-  // Output a reasonably complex expression into a limited-size buffer.
-  // At least one byte is available for writing the NUL character.
-  CHECK_GT(sz, static_cast<size_t>(0));
-
-  // Allocate slightly more space, so that we can verify that SafeSPrintf()
-  // never writes past the end of the buffer.
-  std::unique_ptr<char[]> tmp(new char[sz + 2]);
-  memset(tmp.get(), 'X', sz+2);
-
-  // Use SafeSPrintf() to output a complex list of arguments:
-  // - test padding and truncating %c single characters.
-  // - test truncating %s simple strings.
-  // - test mismatching arguments and truncating (for %d != %s).
-  // - test zero-padding and truncating %x hexadecimal numbers.
-  // - test outputting and truncating %d MININT.
-  // - test outputting and truncating %p arbitrary pointer values.
-  // - test outputting, padding and truncating NULL-pointer %s strings.
-  char* out = tmp.get();
-  size_t out_sz = sz;
-  size_t len;
-  for (std::unique_ptr<char[]> perfect_buf;;) {
-    size_t needed =
-        SafeSNPrintf(out, out_sz,
-#if defined(NDEBUG)
-                     "A%2cong %s: %d %010X %d %p%7s", 'l', "string", "",
-#else
-                     "A%2cong %s: %%d %010X %d %p%7s", 'l', "string",
-#endif
-                     0xDEADBEEF, std::numeric_limits<intptr_t>::min(),
-                     PrintLongString, static_cast<char*>(nullptr)) +
-        1;
-
-    // Various sanity checks:
-    // The numbered of characters needed to print the full string should always
-    // be bigger or equal to the bytes that have actually been output.
-    len = strlen(tmp.get());
-    CHECK_GE(needed, len+1);
-
-    // The number of characters output should always fit into the buffer that
-    // was passed into SafeSPrintf().
-    CHECK_LT(len, out_sz);
-
-    // The output is always terminated with a NUL byte (actually, this test is
-    // always going to pass, as strlen() already verified this)
-    EXPECT_FALSE(tmp[len]);
-
-    // ASAN can check that we are not overwriting buffers, iff we make sure the
-    // buffer is exactly the size that we are expecting to be written. After
-    // running SafeSNPrintf() the first time, it is possible to compute the
-    // correct buffer size for this test. So, allocate a second buffer and run
-    // the exact same SafeSNPrintf() command again.
-    if (!perfect_buf.get()) {
-      out_sz = std::min(needed, sz);
-      out = new char[out_sz];
-      perfect_buf.reset(out);
-    } else {
-      break;
-    }
-  }
-
-  // All trailing bytes are unchanged.
-  for (size_t i = len+1; i < sz+2; ++i)
-    EXPECT_EQ('X', tmp[i]);
-
-  // The text that was generated by SafeSPrintf() should always match the
-  // equivalent text generated by sprintf(). Please note that the format
-  // string for sprintf() is not complicated, as it does not have the
-  // benefit of getting type information from the C++ compiler.
-  //
-  // N.B.: It would be so much cleaner to use snprintf(). But unfortunately,
-  //       Visual Studio doesn't support this function, and the work-arounds
-  //       are all really awkward.
-  char ref[256];
-  CHECK_LE(sz, sizeof(ref));
-  sprintf(ref, "A long string: %%d 00DEADBEEF %lld 0x%llX <NULL>",
-          static_cast<long long>(std::numeric_limits<intptr_t>::min()),
-          static_cast<unsigned long long>(
-            reinterpret_cast<uintptr_t>(PrintLongString)));
-  ref[sz-1] = '\000';
-
-#if defined(NDEBUG)
-  const size_t kSSizeMax = std::numeric_limits<ssize_t>::max();
-#else
-  const size_t kSSizeMax = internal::GetSafeSPrintfSSizeMaxForTest();
-#endif
-
-  // Compare the output from SafeSPrintf() to the one from sprintf().
-  EXPECT_EQ(std::string(ref).substr(0, kSSizeMax-1), std::string(tmp.get()));
-
-  // We allocated a slightly larger buffer, so that we could perform some
-  // extra sanity checks. Now that the tests have all passed, we copy the
-  // data to the output buffer that the caller provided.
-  memcpy(buf, tmp.get(), len+1);
-}
-
-#if !defined(NDEBUG)
-class ScopedSafeSPrintfSSizeMaxSetter {
- public:
-  ScopedSafeSPrintfSSizeMaxSetter(size_t sz) {
-    old_ssize_max_ = internal::GetSafeSPrintfSSizeMaxForTest();
-    internal::SetSafeSPrintfSSizeMaxForTest(sz);
-  }
-
-  ~ScopedSafeSPrintfSSizeMaxSetter() {
-    internal::SetSafeSPrintfSSizeMaxForTest(old_ssize_max_);
-  }
-
- private:
-  size_t old_ssize_max_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedSafeSPrintfSSizeMaxSetter);
-};
-#endif
-
-}  // anonymous namespace
-
-TEST(SafeSPrintfTest, Truncation) {
-  // We use PrintLongString() to print a complex long string and then
-  // truncate to all possible lengths. This ends up exercising a lot of
-  // different code paths in SafeSPrintf() and IToASCII(), as truncation can
-  // happen in a lot of different states.
-  char ref[256];
-  PrintLongString(ref, sizeof(ref));
-  for (size_t i = strlen(ref)+1; i; --i) {
-    char buf[sizeof(ref)];
-    PrintLongString(buf, i);
-    EXPECT_EQ(std::string(ref, i - 1), std::string(buf));
-  }
-
-  // When compiling in debug mode, we have the ability to fake a small
-  // upper limit for the maximum value that can be stored in an ssize_t.
-  // SafeSPrintf() uses this upper limit to determine how many bytes it will
-  // write to the buffer, even if the caller claimed a bigger buffer size.
-  // Repeat the truncation test and verify that this other code path in
-  // SafeSPrintf() works correctly, too.
-#if !defined(NDEBUG)
-  for (size_t i = strlen(ref)+1; i > 1; --i) {
-    ScopedSafeSPrintfSSizeMaxSetter ssize_max_setter(i);
-    char buf[sizeof(ref)];
-    PrintLongString(buf, sizeof(buf));
-    EXPECT_EQ(std::string(ref, i - 1), std::string(buf));
-  }
-
-  // kSSizeMax is also used to constrain the maximum amount of padding, before
-  // SafeSPrintf() detects an error in the format string.
-  ScopedSafeSPrintfSSizeMaxSetter ssize_max_setter(100);
-  char buf[256];
-  EXPECT_EQ(99, SafeSPrintf(buf, "%99c", ' '));
-  EXPECT_EQ(std::string(99, ' '), std::string(buf));
-  *buf = '\000';
-#if defined(ALLOW_DEATH_TEST)
-  EXPECT_DEATH(SafeSPrintf(buf, "%100c", ' '), "padding <= max_padding");
-#endif
-  EXPECT_EQ(0, *buf);
-#endif
-}
-
-TEST(SafeSPrintfTest, Padding) {
-  char buf[40], fmt[40];
-
-  // Chars %c
-  EXPECT_EQ(1, SafeSPrintf(buf, "%c", 'A'));
-  EXPECT_EQ("A", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%2c", 'A'));
-  EXPECT_EQ(" A", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%02c", 'A'));
-  EXPECT_EQ(" A", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, "%-2c", 'A'));
-  EXPECT_EQ("%-2c", std::string(buf));
-  SafeSPrintf(fmt, "%%%dc", std::numeric_limits<ssize_t>::max() - 1);
-  EXPECT_EQ(std::numeric_limits<ssize_t>::max()-1, SafeSPrintf(buf, fmt, 'A'));
-  SafeSPrintf(fmt, "%%%dc",
-              static_cast<size_t>(std::numeric_limits<ssize_t>::max()));
-#if defined(NDEBUG)
-  EXPECT_EQ(2, SafeSPrintf(buf, fmt, 'A'));
-  EXPECT_EQ("%c", std::string(buf));
-#elif defined(ALLOW_DEATH_TEST)
-  EXPECT_DEATH(SafeSPrintf(buf, fmt, 'A'), "padding <= max_padding");
-#endif
-
-  // Octal %o
-  EXPECT_EQ(1, SafeSPrintf(buf, "%o", 1));
-  EXPECT_EQ("1", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%2o", 1));
-  EXPECT_EQ(" 1", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%02o", 1));
-  EXPECT_EQ("01", std::string(buf));
-  EXPECT_EQ(12, SafeSPrintf(buf, "%12o", -1));
-  EXPECT_EQ(" 37777777777", std::string(buf));
-  EXPECT_EQ(12, SafeSPrintf(buf, "%012o", -1));
-  EXPECT_EQ("037777777777", std::string(buf));
-  EXPECT_EQ(23, SafeSPrintf(buf, "%23o", -1LL));
-  EXPECT_EQ(" 1777777777777777777777", std::string(buf));
-  EXPECT_EQ(23, SafeSPrintf(buf, "%023o", -1LL));
-  EXPECT_EQ("01777777777777777777777", std::string(buf));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%2o", 0111));
-  EXPECT_EQ("111", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, "%-2o", 1));
-  EXPECT_EQ("%-2o", std::string(buf));
-  SafeSPrintf(fmt, "%%%do", std::numeric_limits<ssize_t>::max()-1);
-  EXPECT_EQ(std::numeric_limits<ssize_t>::max()-1,
-            SafeSNPrintf(buf, 4, fmt, 1));
-  EXPECT_EQ("   ", std::string(buf));
-  SafeSPrintf(fmt, "%%0%do", std::numeric_limits<ssize_t>::max()-1);
-  EXPECT_EQ(std::numeric_limits<ssize_t>::max()-1,
-            SafeSNPrintf(buf, 4, fmt, 1));
-  EXPECT_EQ("000", std::string(buf));
-  SafeSPrintf(fmt, "%%%do",
-              static_cast<size_t>(std::numeric_limits<ssize_t>::max()));
-#if defined(NDEBUG)
-  EXPECT_EQ(2, SafeSPrintf(buf, fmt, 1));
-  EXPECT_EQ("%o", std::string(buf));
-#elif defined(ALLOW_DEATH_TEST)
-  EXPECT_DEATH(SafeSPrintf(buf, fmt, 1), "padding <= max_padding");
-#endif
-
-  // Decimals %d
-  EXPECT_EQ(1, SafeSPrintf(buf, "%d", 1));
-  EXPECT_EQ("1", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%2d", 1));
-  EXPECT_EQ(" 1", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%02d", 1));
-  EXPECT_EQ("01", std::string(buf));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%3d", -1));
-  EXPECT_EQ(" -1", std::string(buf));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%03d", -1));
-  EXPECT_EQ("-01", std::string(buf));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%2d", 111));
-  EXPECT_EQ("111", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, "%2d", -111));
-  EXPECT_EQ("-111", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, "%-2d", 1));
-  EXPECT_EQ("%-2d", std::string(buf));
-  SafeSPrintf(fmt, "%%%dd", std::numeric_limits<ssize_t>::max()-1);
-  EXPECT_EQ(std::numeric_limits<ssize_t>::max()-1,
-            SafeSNPrintf(buf, 4, fmt, 1));
-  EXPECT_EQ("   ", std::string(buf));
-  SafeSPrintf(fmt, "%%0%dd", std::numeric_limits<ssize_t>::max()-1);
-  EXPECT_EQ(std::numeric_limits<ssize_t>::max()-1,
-            SafeSNPrintf(buf, 4, fmt, 1));
-  EXPECT_EQ("000", std::string(buf));
-  SafeSPrintf(fmt, "%%%dd",
-              static_cast<size_t>(std::numeric_limits<ssize_t>::max()));
-#if defined(NDEBUG)
-  EXPECT_EQ(2, SafeSPrintf(buf, fmt, 1));
-  EXPECT_EQ("%d", std::string(buf));
-#elif defined(ALLOW_DEATH_TEST)
-  EXPECT_DEATH(SafeSPrintf(buf, fmt, 1), "padding <= max_padding");
-#endif
-
-  // Hex %X
-  EXPECT_EQ(1, SafeSPrintf(buf, "%X", 1));
-  EXPECT_EQ("1", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%2X", 1));
-  EXPECT_EQ(" 1", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%02X", 1));
-  EXPECT_EQ("01", std::string(buf));
-  EXPECT_EQ(9, SafeSPrintf(buf, "%9X", -1));
-  EXPECT_EQ(" FFFFFFFF", std::string(buf));
-  EXPECT_EQ(9, SafeSPrintf(buf, "%09X", -1));
-  EXPECT_EQ("0FFFFFFFF", std::string(buf));
-  EXPECT_EQ(17, SafeSPrintf(buf, "%17X", -1LL));
-  EXPECT_EQ(" FFFFFFFFFFFFFFFF", std::string(buf));
-  EXPECT_EQ(17, SafeSPrintf(buf, "%017X", -1LL));
-  EXPECT_EQ("0FFFFFFFFFFFFFFFF", std::string(buf));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%2X", 0x111));
-  EXPECT_EQ("111", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, "%-2X", 1));
-  EXPECT_EQ("%-2X", std::string(buf));
-  SafeSPrintf(fmt, "%%%dX", std::numeric_limits<ssize_t>::max()-1);
-  EXPECT_EQ(std::numeric_limits<ssize_t>::max()-1,
-            SafeSNPrintf(buf, 4, fmt, 1));
-  EXPECT_EQ("   ", std::string(buf));
-  SafeSPrintf(fmt, "%%0%dX", std::numeric_limits<ssize_t>::max()-1);
-  EXPECT_EQ(std::numeric_limits<ssize_t>::max()-1,
-            SafeSNPrintf(buf, 4, fmt, 1));
-  EXPECT_EQ("000", std::string(buf));
-  SafeSPrintf(fmt, "%%%dX",
-              static_cast<size_t>(std::numeric_limits<ssize_t>::max()));
-#if defined(NDEBUG)
-  EXPECT_EQ(2, SafeSPrintf(buf, fmt, 1));
-  EXPECT_EQ("%X", std::string(buf));
-#elif defined(ALLOW_DEATH_TEST)
-  EXPECT_DEATH(SafeSPrintf(buf, fmt, 1), "padding <= max_padding");
-#endif
-
-  // Pointer %p
-  EXPECT_EQ(3, SafeSPrintf(buf, "%p", (void*)1));
-  EXPECT_EQ("0x1", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, "%4p", (void*)1));
-  EXPECT_EQ(" 0x1", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, "%04p", (void*)1));
-  EXPECT_EQ("0x01", std::string(buf));
-  EXPECT_EQ(5, SafeSPrintf(buf, "%4p", (void*)0x111));
-  EXPECT_EQ("0x111", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, "%-2p", (void*)1));
-  EXPECT_EQ("%-2p", std::string(buf));
-  SafeSPrintf(fmt, "%%%dp", std::numeric_limits<ssize_t>::max()-1);
-  EXPECT_EQ(std::numeric_limits<ssize_t>::max()-1,
-            SafeSNPrintf(buf, 4, fmt, (void*)1));
-  EXPECT_EQ("   ", std::string(buf));
-  SafeSPrintf(fmt, "%%0%dp", std::numeric_limits<ssize_t>::max()-1);
-  EXPECT_EQ(std::numeric_limits<ssize_t>::max()-1,
-            SafeSNPrintf(buf, 4, fmt, (void*)1));
-  EXPECT_EQ("0x0", std::string(buf));
-  SafeSPrintf(fmt, "%%%dp",
-              static_cast<size_t>(std::numeric_limits<ssize_t>::max()));
-#if defined(NDEBUG)
-  EXPECT_EQ(2, SafeSPrintf(buf, fmt, 1));
-  EXPECT_EQ("%p", std::string(buf));
-#elif defined(ALLOW_DEATH_TEST)
-  EXPECT_DEATH(SafeSPrintf(buf, fmt, 1), "padding <= max_padding");
-#endif
-
-  // String
-  EXPECT_EQ(1, SafeSPrintf(buf, "%s", "A"));
-  EXPECT_EQ("A", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%2s", "A"));
-  EXPECT_EQ(" A", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%02s", "A"));
-  EXPECT_EQ(" A", std::string(buf));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%2s", "AAA"));
-  EXPECT_EQ("AAA", std::string(buf));
-  EXPECT_EQ(4, SafeSPrintf(buf, "%-2s", "A"));
-  EXPECT_EQ("%-2s", std::string(buf));
-  SafeSPrintf(fmt, "%%%ds", std::numeric_limits<ssize_t>::max()-1);
-  EXPECT_EQ(std::numeric_limits<ssize_t>::max()-1,
-            SafeSNPrintf(buf, 4, fmt, "A"));
-  EXPECT_EQ("   ", std::string(buf));
-  SafeSPrintf(fmt, "%%0%ds", std::numeric_limits<ssize_t>::max()-1);
-  EXPECT_EQ(std::numeric_limits<ssize_t>::max()-1,
-            SafeSNPrintf(buf, 4, fmt, "A"));
-  EXPECT_EQ("   ", std::string(buf));
-  SafeSPrintf(fmt, "%%%ds",
-              static_cast<size_t>(std::numeric_limits<ssize_t>::max()));
-#if defined(NDEBUG)
-  EXPECT_EQ(2, SafeSPrintf(buf, fmt, "A"));
-  EXPECT_EQ("%s", std::string(buf));
-#elif defined(ALLOW_DEATH_TEST)
-  EXPECT_DEATH(SafeSPrintf(buf, fmt, "A"), "padding <= max_padding");
-#endif
-}
-
-TEST(SafeSPrintfTest, EmbeddedNul) {
-  char buf[] = { 'X', 'X', 'X', 'X' };
-  EXPECT_EQ(2, SafeSPrintf(buf, "%3c", 0));
-  EXPECT_EQ(' ', buf[0]);
-  EXPECT_EQ(' ', buf[1]);
-  EXPECT_EQ(0,   buf[2]);
-  EXPECT_EQ('X', buf[3]);
-
-  // Check handling of a NUL format character. N.B. this takes two different
-  // code paths depending on whether we are actually passing arguments. If
-  // we don't have any arguments, we are running in the fast-path code, that
-  // looks (almost) like a strncpy().
-#if defined(NDEBUG)
-  EXPECT_EQ(2, SafeSPrintf(buf, "%%%"));
-  EXPECT_EQ("%%", std::string(buf));
-  EXPECT_EQ(2, SafeSPrintf(buf, "%%%", 0));
-  EXPECT_EQ("%%", std::string(buf));
-#elif defined(ALLOW_DEATH_TEST)
-  EXPECT_DEATH(SafeSPrintf(buf, "%%%"), "src.1. == '%'");
-  EXPECT_DEATH(SafeSPrintf(buf, "%%%", 0), "ch");
-#endif
-}
-
-TEST(SafeSPrintfTest, EmitNULL) {
-  char buf[40];
-#if defined(__GNUC__)
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wconversion-null"
-#endif
-  EXPECT_EQ(1, SafeSPrintf(buf, "%d", NULL));
-  EXPECT_EQ("0", std::string(buf));
-  EXPECT_EQ(3, SafeSPrintf(buf, "%p", NULL));
-  EXPECT_EQ("0x0", std::string(buf));
-  EXPECT_EQ(6, SafeSPrintf(buf, "%s", NULL));
-  EXPECT_EQ("<NULL>", std::string(buf));
-#if defined(__GCC__)
-#pragma GCC diagnostic pop
-#endif
-}
-
-TEST(SafeSPrintfTest, PointerSize) {
-  // The internal data representation is a 64bit value, independent of the
-  // native word size. We want to perform sign-extension for signed integers,
-  // but we want to avoid doing so for pointer types. This could be a
-  // problem on systems, where pointers are only 32bit. This tests verifies
-  // that there is no such problem.
-  char *str = reinterpret_cast<char *>(0x80000000u);
-  void *ptr = str;
-  char buf[40];
-  EXPECT_EQ(10, SafeSPrintf(buf, "%p", str));
-  EXPECT_EQ("0x80000000", std::string(buf));
-  EXPECT_EQ(10, SafeSPrintf(buf, "%p", ptr));
-  EXPECT_EQ("0x80000000", std::string(buf));
-}
-
-}  // namespace strings
-}  // namespace base
diff --git a/base/strings/strcat_unittest.cc b/base/strings/strcat_unittest.cc
deleted file mode 100644
index cf2db51..0000000
--- a/base/strings/strcat_unittest.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/strcat.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(StrCat, 8Bit) {
-  EXPECT_EQ("", StrCat({""}));
-  EXPECT_EQ("1", StrCat({"1"}));
-  EXPECT_EQ("122", StrCat({"1", "22"}));
-  EXPECT_EQ("122333", StrCat({"1", "22", "333"}));
-  EXPECT_EQ("1223334444", StrCat({"1", "22", "333", "4444"}));
-  EXPECT_EQ("122333444455555", StrCat({"1", "22", "333", "4444", "55555"}));
-}
-
-TEST(StrCat, 16Bit) {
-  string16 arg1 = ASCIIToUTF16("1");
-  string16 arg2 = ASCIIToUTF16("22");
-  string16 arg3 = ASCIIToUTF16("333");
-
-  EXPECT_EQ(ASCIIToUTF16(""), StrCat({string16()}));
-  EXPECT_EQ(ASCIIToUTF16("1"), StrCat({arg1}));
-  EXPECT_EQ(ASCIIToUTF16("122"), StrCat({arg1, arg2}));
-  EXPECT_EQ(ASCIIToUTF16("122333"), StrCat({arg1, arg2, arg3}));
-}
-
-TEST(StrAppend, 8Bit) {
-  std::string result;
-
-  result = "foo";
-  StrAppend(&result, {std::string()});
-  EXPECT_EQ("foo", result);
-
-  result = "foo";
-  StrAppend(&result, {"1"});
-  EXPECT_EQ("foo1", result);
-
-  result = "foo";
-  StrAppend(&result, {"1", "22", "333"});
-  EXPECT_EQ("foo122333", result);
-}
-
-TEST(StrAppend, 16Bit) {
-  string16 arg1 = ASCIIToUTF16("1");
-  string16 arg2 = ASCIIToUTF16("22");
-  string16 arg3 = ASCIIToUTF16("333");
-
-  string16 result;
-
-  result = ASCIIToUTF16("foo");
-  StrAppend(&result, {string16()});
-  EXPECT_EQ(ASCIIToUTF16("foo"), result);
-
-  result = ASCIIToUTF16("foo");
-  StrAppend(&result, {arg1});
-  EXPECT_EQ(ASCIIToUTF16("foo1"), result);
-
-  result = ASCIIToUTF16("foo");
-  StrAppend(&result, {arg1, arg2, arg3});
-  EXPECT_EQ(ASCIIToUTF16("foo122333"), result);
-}
-
-}  // namespace base
diff --git a/base/strings/string16_unittest.cc b/base/strings/string16_unittest.cc
deleted file mode 100644
index 0d2ca80..0000000
--- a/base/strings/string16_unittest.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <sstream>
-#include <unordered_set>
-
-#include "base/strings/string16.h"
-
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-// We define a custom operator<< for string16 so we can use it with logging.
-// This tests that conversion.
-TEST(String16Test, OutputStream) {
-  // Basic stream test.
-  {
-    std::ostringstream stream;
-    stream << "Empty '" << string16() << "' standard '"
-           << string16(ASCIIToUTF16("Hello, world")) << "'";
-    EXPECT_STREQ("Empty '' standard 'Hello, world'",
-                 stream.str().c_str());
-  }
-
-  // Interesting edge cases.
-  {
-    // These should each get converted to the invalid character: EF BF BD.
-    string16 initial_surrogate;
-    initial_surrogate.push_back(0xd800);
-    string16 final_surrogate;
-    final_surrogate.push_back(0xdc00);
-
-    // Old italic A = U+10300, will get converted to: F0 90 8C 80 'z'.
-    string16 surrogate_pair;
-    surrogate_pair.push_back(0xd800);
-    surrogate_pair.push_back(0xdf00);
-    surrogate_pair.push_back('z');
-
-    // Will get converted to the invalid char + 's': EF BF BD 's'.
-    string16 unterminated_surrogate;
-    unterminated_surrogate.push_back(0xd800);
-    unterminated_surrogate.push_back('s');
-
-    std::ostringstream stream;
-    stream << initial_surrogate << "," << final_surrogate << ","
-           << surrogate_pair << "," << unterminated_surrogate;
-
-    EXPECT_STREQ("\xef\xbf\xbd,\xef\xbf\xbd,\xf0\x90\x8c\x80z,\xef\xbf\xbds",
-                 stream.str().c_str());
-  }
-}
-
-TEST(String16Test, Hash) {
-  string16 str1 = ASCIIToUTF16("hello");
-  string16 str2 = ASCIIToUTF16("world");
-
-  std::unordered_set<string16> set;
-
-  set.insert(str1);
-  EXPECT_EQ(1u, set.count(str1));
-  EXPECT_EQ(0u, set.count(str2));
-}
-
-}  // namespace base
diff --git a/base/strings/string16_unittest.nc b/base/strings/string16_unittest.nc
deleted file mode 100644
index 5186a45..0000000
--- a/base/strings/string16_unittest.nc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a "No Compile Test".
-// http://dev.chromium.org/developers/testing/no-compile-tests
-
-#include "base/strings/string16.h"
-
-#if defined(NCTEST_NO_KOENIG_LOOKUP_FOR_STRING16)  // [r"use of undeclared identifier 'ShouldNotBeFound'"]
-
-// base::string16 is declared as a typedef. It should not cause other functions
-// in base to be found via Argument-dependent lookup.
-
-namespace base {
-void ShouldNotBeFound(const base::string16& arg) {}
-}
-
-// Intentionally not in base:: namespace.
-void WontCompile() {
-  base::string16 s;
-  ShouldNotBeFound(s);
-}
-
-#endif
diff --git a/base/strings/string_number_conversions_unittest.cc b/base/strings/string_number_conversions_unittest.cc
deleted file mode 100644
index d969450..0000000
--- a/base/strings/string_number_conversions_unittest.cc
+++ /dev/null
@@ -1,905 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/string_number_conversions.h"
-
-#include <errno.h>
-#include <limits.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#include <cmath>
-#include <limits>
-
-#include "base/bit_cast.h"
-#include "base/format_macros.h"
-#include "base/macros.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-template <typename INT>
-struct NumberToStringTest {
-  INT num;
-  const char* sexpected;
-  const char* uexpected;
-};
-
-}  // namespace
-
-TEST(StringNumberConversionsTest, NumberToString) {
-  static const NumberToStringTest<int> int_tests[] = {
-      {0, "0", "0"},
-      {-1, "-1", "4294967295"},
-      {std::numeric_limits<int>::max(), "2147483647", "2147483647"},
-      {std::numeric_limits<int>::min(), "-2147483648", "2147483648"},
-  };
-  static const NumberToStringTest<int64_t> int64_tests[] = {
-      {0, "0", "0"},
-      {-1, "-1", "18446744073709551615"},
-      {
-          std::numeric_limits<int64_t>::max(), "9223372036854775807",
-          "9223372036854775807",
-      },
-      {std::numeric_limits<int64_t>::min(), "-9223372036854775808",
-       "9223372036854775808"},
-  };
-
-  for (size_t i = 0; i < arraysize(int_tests); ++i) {
-    const NumberToStringTest<int>& test = int_tests[i];
-    EXPECT_EQ(NumberToString(test.num), test.sexpected);
-    EXPECT_EQ(NumberToString16(test.num), UTF8ToUTF16(test.sexpected));
-    EXPECT_EQ(NumberToString(static_cast<unsigned>(test.num)), test.uexpected);
-    EXPECT_EQ(NumberToString16(static_cast<unsigned>(test.num)),
-              UTF8ToUTF16(test.uexpected));
-  }
-  for (size_t i = 0; i < arraysize(int64_tests); ++i) {
-    const NumberToStringTest<int64_t>& test = int64_tests[i];
-    EXPECT_EQ(NumberToString(test.num), test.sexpected);
-    EXPECT_EQ(NumberToString16(test.num), UTF8ToUTF16(test.sexpected));
-    EXPECT_EQ(NumberToString(static_cast<uint64_t>(test.num)), test.uexpected);
-    EXPECT_EQ(NumberToString16(static_cast<uint64_t>(test.num)),
-              UTF8ToUTF16(test.uexpected));
-  }
-}
-
-TEST(StringNumberConversionsTest, Uint64ToString) {
-  static const struct {
-    uint64_t input;
-    std::string output;
-  } cases[] = {
-      {0, "0"},
-      {42, "42"},
-      {INT_MAX, "2147483647"},
-      {std::numeric_limits<uint64_t>::max(), "18446744073709551615"},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i)
-    EXPECT_EQ(cases[i].output, NumberToString(cases[i].input));
-}
-
-TEST(StringNumberConversionsTest, SizeTToString) {
-  size_t size_t_max = std::numeric_limits<size_t>::max();
-  std::string size_t_max_string = StringPrintf("%" PRIuS, size_t_max);
-
-  static const struct {
-    size_t input;
-    std::string output;
-  } cases[] = {
-    {0, "0"},
-    {9, "9"},
-    {42, "42"},
-    {INT_MAX, "2147483647"},
-    {2147483648U, "2147483648"},
-#if SIZE_MAX > 4294967295U
-    {99999999999U, "99999999999"},
-#endif
-    {size_t_max, size_t_max_string},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i)
-    EXPECT_EQ(cases[i].output, NumberToString(cases[i].input));
-}
-
-TEST(StringNumberConversionsTest, StringToInt) {
-  static const struct {
-    std::string input;
-    int output;
-    bool success;
-  } cases[] = {
-    {"0", 0, true},
-    {"42", 42, true},
-    {"42\x99", 42, false},
-    {"\x99" "42\x99", 0, false},
-    {"-2147483648", INT_MIN, true},
-    {"2147483647", INT_MAX, true},
-    {"", 0, false},
-    {" 42", 42, false},
-    {"42 ", 42, false},
-    {"\t\n\v\f\r 42", 42, false},
-    {"blah42", 0, false},
-    {"42blah", 42, false},
-    {"blah42blah", 0, false},
-    {"-273.15", -273, false},
-    {"+98.6", 98, false},
-    {"--123", 0, false},
-    {"++123", 0, false},
-    {"-+123", 0, false},
-    {"+-123", 0, false},
-    {"-", 0, false},
-    {"-2147483649", INT_MIN, false},
-    {"-99999999999", INT_MIN, false},
-    {"2147483648", INT_MAX, false},
-    {"99999999999", INT_MAX, false},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    int output = cases[i].output ^ 1;  // Ensure StringToInt wrote something.
-    EXPECT_EQ(cases[i].success, StringToInt(cases[i].input, &output));
-    EXPECT_EQ(cases[i].output, output);
-
-    string16 utf16_input = UTF8ToUTF16(cases[i].input);
-    output = cases[i].output ^ 1;  // Ensure StringToInt wrote something.
-    EXPECT_EQ(cases[i].success, StringToInt(utf16_input, &output));
-    EXPECT_EQ(cases[i].output, output);
-  }
-
-  // One additional test to verify that conversion of numbers in strings with
-  // embedded NUL characters.  The NUL and extra data after it should be
-  // interpreted as junk after the number.
-  const char input[] = "6\06";
-  std::string input_string(input, arraysize(input) - 1);
-  int output;
-  EXPECT_FALSE(StringToInt(input_string, &output));
-  EXPECT_EQ(6, output);
-
-  string16 utf16_input = UTF8ToUTF16(input_string);
-  output = 0;
-  EXPECT_FALSE(StringToInt(utf16_input, &output));
-  EXPECT_EQ(6, output);
-
-  output = 0;
-  const char16 negative_wide_input[] = { 0xFF4D, '4', '2', 0};
-  EXPECT_FALSE(StringToInt(string16(negative_wide_input), &output));
-  EXPECT_EQ(0, output);
-}
-
-TEST(StringNumberConversionsTest, StringToUint) {
-  static const struct {
-    std::string input;
-    unsigned output;
-    bool success;
-  } cases[] = {
-    {"0", 0, true},
-    {"42", 42, true},
-    {"42\x99", 42, false},
-    {"\x99" "42\x99", 0, false},
-    {"-2147483648", 0, false},
-    {"2147483647", INT_MAX, true},
-    {"", 0, false},
-    {" 42", 42, false},
-    {"42 ", 42, false},
-    {"\t\n\v\f\r 42", 42, false},
-    {"blah42", 0, false},
-    {"42blah", 42, false},
-    {"blah42blah", 0, false},
-    {"-273.15", 0, false},
-    {"+98.6", 98, false},
-    {"--123", 0, false},
-    {"++123", 0, false},
-    {"-+123", 0, false},
-    {"+-123", 0, false},
-    {"-", 0, false},
-    {"-2147483649", 0, false},
-    {"-99999999999", 0, false},
-    {"4294967295", UINT_MAX, true},
-    {"4294967296", UINT_MAX, false},
-    {"99999999999", UINT_MAX, false},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    unsigned output =
-        cases[i].output ^ 1;  // Ensure StringToUint wrote something.
-    EXPECT_EQ(cases[i].success, StringToUint(cases[i].input, &output));
-    EXPECT_EQ(cases[i].output, output);
-
-    string16 utf16_input = UTF8ToUTF16(cases[i].input);
-    output = cases[i].output ^ 1;  // Ensure StringToUint wrote something.
-    EXPECT_EQ(cases[i].success, StringToUint(utf16_input, &output));
-    EXPECT_EQ(cases[i].output, output);
-  }
-
-  // One additional test to verify that conversion of numbers in strings with
-  // embedded NUL characters.  The NUL and extra data after it should be
-  // interpreted as junk after the number.
-  const char input[] = "6\06";
-  std::string input_string(input, arraysize(input) - 1);
-  unsigned output;
-  EXPECT_FALSE(StringToUint(input_string, &output));
-  EXPECT_EQ(6U, output);
-
-  string16 utf16_input = UTF8ToUTF16(input_string);
-  output = 0;
-  EXPECT_FALSE(StringToUint(utf16_input, &output));
-  EXPECT_EQ(6U, output);
-
-  output = 0;
-  const char16 negative_wide_input[] = { 0xFF4D, '4', '2', 0};
-  EXPECT_FALSE(StringToUint(string16(negative_wide_input), &output));
-  EXPECT_EQ(0U, output);
-}
-
-TEST(StringNumberConversionsTest, StringToInt64) {
-  static const struct {
-    std::string input;
-    int64_t output;
-    bool success;
-  } cases[] = {
-      {"0", 0, true},
-      {"42", 42, true},
-      {"-2147483648", INT_MIN, true},
-      {"2147483647", INT_MAX, true},
-      {"-2147483649", INT64_C(-2147483649), true},
-      {"-99999999999", INT64_C(-99999999999), true},
-      {"2147483648", INT64_C(2147483648), true},
-      {"99999999999", INT64_C(99999999999), true},
-      {"9223372036854775807", std::numeric_limits<int64_t>::max(), true},
-      {"-9223372036854775808", std::numeric_limits<int64_t>::min(), true},
-      {"09", 9, true},
-      {"-09", -9, true},
-      {"", 0, false},
-      {" 42", 42, false},
-      {"42 ", 42, false},
-      {"0x42", 0, false},
-      {"\t\n\v\f\r 42", 42, false},
-      {"blah42", 0, false},
-      {"42blah", 42, false},
-      {"blah42blah", 0, false},
-      {"-273.15", -273, false},
-      {"+98.6", 98, false},
-      {"--123", 0, false},
-      {"++123", 0, false},
-      {"-+123", 0, false},
-      {"+-123", 0, false},
-      {"-", 0, false},
-      {"-9223372036854775809", std::numeric_limits<int64_t>::min(), false},
-      {"-99999999999999999999", std::numeric_limits<int64_t>::min(), false},
-      {"9223372036854775808", std::numeric_limits<int64_t>::max(), false},
-      {"99999999999999999999", std::numeric_limits<int64_t>::max(), false},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    int64_t output = 0;
-    EXPECT_EQ(cases[i].success, StringToInt64(cases[i].input, &output));
-    EXPECT_EQ(cases[i].output, output);
-
-    string16 utf16_input = UTF8ToUTF16(cases[i].input);
-    output = 0;
-    EXPECT_EQ(cases[i].success, StringToInt64(utf16_input, &output));
-    EXPECT_EQ(cases[i].output, output);
-  }
-
-  // One additional test to verify that conversion of numbers in strings with
-  // embedded NUL characters.  The NUL and extra data after it should be
-  // interpreted as junk after the number.
-  const char input[] = "6\06";
-  std::string input_string(input, arraysize(input) - 1);
-  int64_t output;
-  EXPECT_FALSE(StringToInt64(input_string, &output));
-  EXPECT_EQ(6, output);
-
-  string16 utf16_input = UTF8ToUTF16(input_string);
-  output = 0;
-  EXPECT_FALSE(StringToInt64(utf16_input, &output));
-  EXPECT_EQ(6, output);
-}
-
-TEST(StringNumberConversionsTest, StringToUint64) {
-  static const struct {
-    std::string input;
-    uint64_t output;
-    bool success;
-  } cases[] = {
-      {"0", 0, true},
-      {"42", 42, true},
-      {"-2147483648", 0, false},
-      {"2147483647", INT_MAX, true},
-      {"-2147483649", 0, false},
-      {"-99999999999", 0, false},
-      {"2147483648", UINT64_C(2147483648), true},
-      {"99999999999", UINT64_C(99999999999), true},
-      {"9223372036854775807", std::numeric_limits<int64_t>::max(), true},
-      {"-9223372036854775808", 0, false},
-      {"09", 9, true},
-      {"-09", 0, false},
-      {"", 0, false},
-      {" 42", 42, false},
-      {"42 ", 42, false},
-      {"0x42", 0, false},
-      {"\t\n\v\f\r 42", 42, false},
-      {"blah42", 0, false},
-      {"42blah", 42, false},
-      {"blah42blah", 0, false},
-      {"-273.15", 0, false},
-      {"+98.6", 98, false},
-      {"--123", 0, false},
-      {"++123", 0, false},
-      {"-+123", 0, false},
-      {"+-123", 0, false},
-      {"-", 0, false},
-      {"-9223372036854775809", 0, false},
-      {"-99999999999999999999", 0, false},
-      {"9223372036854775808", UINT64_C(9223372036854775808), true},
-      {"99999999999999999999", std::numeric_limits<uint64_t>::max(), false},
-      {"18446744073709551615", std::numeric_limits<uint64_t>::max(), true},
-      {"18446744073709551616", std::numeric_limits<uint64_t>::max(), false},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    uint64_t output = 0;
-    EXPECT_EQ(cases[i].success, StringToUint64(cases[i].input, &output));
-    EXPECT_EQ(cases[i].output, output);
-
-    string16 utf16_input = UTF8ToUTF16(cases[i].input);
-    output = 0;
-    EXPECT_EQ(cases[i].success, StringToUint64(utf16_input, &output));
-    EXPECT_EQ(cases[i].output, output);
-  }
-
-  // One additional test to verify that conversion of numbers in strings with
-  // embedded NUL characters.  The NUL and extra data after it should be
-  // interpreted as junk after the number.
-  const char input[] = "6\06";
-  std::string input_string(input, arraysize(input) - 1);
-  uint64_t output;
-  EXPECT_FALSE(StringToUint64(input_string, &output));
-  EXPECT_EQ(6U, output);
-
-  string16 utf16_input = UTF8ToUTF16(input_string);
-  output = 0;
-  EXPECT_FALSE(StringToUint64(utf16_input, &output));
-  EXPECT_EQ(6U, output);
-}
-
-TEST(StringNumberConversionsTest, StringToSizeT) {
-  size_t size_t_max = std::numeric_limits<size_t>::max();
-  std::string size_t_max_string = StringPrintf("%" PRIuS, size_t_max);
-
-  static const struct {
-    std::string input;
-    size_t output;
-    bool success;
-  } cases[] = {
-    {"0", 0, true},
-    {"42", 42, true},
-    {"-2147483648", 0, false},
-    {"2147483647", INT_MAX, true},
-    {"-2147483649", 0, false},
-    {"-99999999999", 0, false},
-    {"2147483648", 2147483648U, true},
-#if SIZE_MAX > 4294967295U
-    {"99999999999", 99999999999U, true},
-#endif
-    {"-9223372036854775808", 0, false},
-    {"09", 9, true},
-    {"-09", 0, false},
-    {"", 0, false},
-    {" 42", 42, false},
-    {"42 ", 42, false},
-    {"0x42", 0, false},
-    {"\t\n\v\f\r 42", 42, false},
-    {"blah42", 0, false},
-    {"42blah", 42, false},
-    {"blah42blah", 0, false},
-    {"-273.15", 0, false},
-    {"+98.6", 98, false},
-    {"--123", 0, false},
-    {"++123", 0, false},
-    {"-+123", 0, false},
-    {"+-123", 0, false},
-    {"-", 0, false},
-    {"-9223372036854775809", 0, false},
-    {"-99999999999999999999", 0, false},
-    {"999999999999999999999999", size_t_max, false},
-    {size_t_max_string, size_t_max, true},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    size_t output = 0;
-    EXPECT_EQ(cases[i].success, StringToSizeT(cases[i].input, &output));
-    EXPECT_EQ(cases[i].output, output);
-
-    string16 utf16_input = UTF8ToUTF16(cases[i].input);
-    output = 0;
-    EXPECT_EQ(cases[i].success, StringToSizeT(utf16_input, &output));
-    EXPECT_EQ(cases[i].output, output);
-  }
-
-  // One additional test to verify that conversion of numbers in strings with
-  // embedded NUL characters.  The NUL and extra data after it should be
-  // interpreted as junk after the number.
-  const char input[] = "6\06";
-  std::string input_string(input, arraysize(input) - 1);
-  size_t output;
-  EXPECT_FALSE(StringToSizeT(input_string, &output));
-  EXPECT_EQ(6U, output);
-
-  string16 utf16_input = UTF8ToUTF16(input_string);
-  output = 0;
-  EXPECT_FALSE(StringToSizeT(utf16_input, &output));
-  EXPECT_EQ(6U, output);
-}
-
-TEST(StringNumberConversionsTest, HexStringToInt) {
-  static const struct {
-    std::string input;
-    int64_t output;
-    bool success;
-  } cases[] = {
-    {"0", 0, true},
-    {"42", 66, true},
-    {"-42", -66, true},
-    {"+42", 66, true},
-    {"7fffffff", INT_MAX, true},
-    {"-80000000", INT_MIN, true},
-    {"80000000", INT_MAX, false},  // Overflow test.
-    {"-80000001", INT_MIN, false},  // Underflow test.
-    {"0x42", 66, true},
-    {"-0x42", -66, true},
-    {"+0x42", 66, true},
-    {"0x7fffffff", INT_MAX, true},
-    {"-0x80000000", INT_MIN, true},
-    {"-80000000", INT_MIN, true},
-    {"80000000", INT_MAX, false},  // Overflow test.
-    {"-80000001", INT_MIN, false},  // Underflow test.
-    {"0x0f", 15, true},
-    {"0f", 15, true},
-    {" 45", 0x45, false},
-    {"\t\n\v\f\r 0x45", 0x45, false},
-    {" 45", 0x45, false},
-    {"45 ", 0x45, false},
-    {"45:", 0x45, false},
-    {"efgh", 0xef, false},
-    {"0xefgh", 0xef, false},
-    {"hgfe", 0, false},
-    {"-", 0, false},
-    {"", 0, false},
-    {"0x", 0, false},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    int output = 0;
-    EXPECT_EQ(cases[i].success, HexStringToInt(cases[i].input, &output));
-    EXPECT_EQ(cases[i].output, output);
-  }
-  // One additional test to verify that conversion of numbers in strings with
-  // embedded NUL characters.  The NUL and extra data after it should be
-  // interpreted as junk after the number.
-  const char input[] = "0xc0ffee\0" "9";
-  std::string input_string(input, arraysize(input) - 1);
-  int output;
-  EXPECT_FALSE(HexStringToInt(input_string, &output));
-  EXPECT_EQ(0xc0ffee, output);
-}
-
-TEST(StringNumberConversionsTest, HexStringToUInt) {
-  static const struct {
-    std::string input;
-    uint32_t output;
-    bool success;
-  } cases[] = {
-      {"0", 0, true},
-      {"42", 0x42, true},
-      {"-42", 0, false},
-      {"+42", 0x42, true},
-      {"7fffffff", INT_MAX, true},
-      {"-80000000", 0, false},
-      {"ffffffff", 0xffffffff, true},
-      {"DeadBeef", 0xdeadbeef, true},
-      {"0x42", 0x42, true},
-      {"-0x42", 0, false},
-      {"+0x42", 0x42, true},
-      {"0x7fffffff", INT_MAX, true},
-      {"-0x80000000", 0, false},
-      {"0xffffffff", std::numeric_limits<uint32_t>::max(), true},
-      {"0XDeadBeef", 0xdeadbeef, true},
-      {"0x7fffffffffffffff", std::numeric_limits<uint32_t>::max(),
-       false},  // Overflow test.
-      {"-0x8000000000000000", 0, false},
-      {"0x8000000000000000", std::numeric_limits<uint32_t>::max(),
-       false},  // Overflow test.
-      {"-0x8000000000000001", 0, false},
-      {"0xFFFFFFFFFFFFFFFF", std::numeric_limits<uint32_t>::max(),
-       false},  // Overflow test.
-      {"FFFFFFFFFFFFFFFF", std::numeric_limits<uint32_t>::max(),
-       false},  // Overflow test.
-      {"0x0000000000000000", 0, true},
-      {"0000000000000000", 0, true},
-      {"1FFFFFFFFFFFFFFFF", std::numeric_limits<uint32_t>::max(),
-       false},  // Overflow test.
-      {"0x0f", 0x0f, true},
-      {"0f", 0x0f, true},
-      {" 45", 0x45, false},
-      {"\t\n\v\f\r 0x45", 0x45, false},
-      {" 45", 0x45, false},
-      {"45 ", 0x45, false},
-      {"45:", 0x45, false},
-      {"efgh", 0xef, false},
-      {"0xefgh", 0xef, false},
-      {"hgfe", 0, false},
-      {"-", 0, false},
-      {"", 0, false},
-      {"0x", 0, false},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    uint32_t output = 0;
-    EXPECT_EQ(cases[i].success, HexStringToUInt(cases[i].input, &output));
-    EXPECT_EQ(cases[i].output, output);
-  }
-  // One additional test to verify that conversion of numbers in strings with
-  // embedded NUL characters.  The NUL and extra data after it should be
-  // interpreted as junk after the number.
-  const char input[] = "0xc0ffee\0" "9";
-  std::string input_string(input, arraysize(input) - 1);
-  uint32_t output;
-  EXPECT_FALSE(HexStringToUInt(input_string, &output));
-  EXPECT_EQ(0xc0ffeeU, output);
-}
-
-TEST(StringNumberConversionsTest, HexStringToInt64) {
-  static const struct {
-    std::string input;
-    int64_t output;
-    bool success;
-  } cases[] = {
-      {"0", 0, true},
-      {"42", 66, true},
-      {"-42", -66, true},
-      {"+42", 66, true},
-      {"40acd88557b", INT64_C(4444444448123), true},
-      {"7fffffff", INT_MAX, true},
-      {"-80000000", INT_MIN, true},
-      {"ffffffff", 0xffffffff, true},
-      {"DeadBeef", 0xdeadbeef, true},
-      {"0x42", 66, true},
-      {"-0x42", -66, true},
-      {"+0x42", 66, true},
-      {"0x40acd88557b", INT64_C(4444444448123), true},
-      {"0x7fffffff", INT_MAX, true},
-      {"-0x80000000", INT_MIN, true},
-      {"0xffffffff", 0xffffffff, true},
-      {"0XDeadBeef", 0xdeadbeef, true},
-      {"0x7fffffffffffffff", std::numeric_limits<int64_t>::max(), true},
-      {"-0x8000000000000000", std::numeric_limits<int64_t>::min(), true},
-      {"0x8000000000000000", std::numeric_limits<int64_t>::max(),
-       false},  // Overflow test.
-      {"-0x8000000000000001", std::numeric_limits<int64_t>::min(),
-       false},  // Underflow test.
-      {"0x0f", 15, true},
-      {"0f", 15, true},
-      {" 45", 0x45, false},
-      {"\t\n\v\f\r 0x45", 0x45, false},
-      {" 45", 0x45, false},
-      {"45 ", 0x45, false},
-      {"45:", 0x45, false},
-      {"efgh", 0xef, false},
-      {"0xefgh", 0xef, false},
-      {"hgfe", 0, false},
-      {"-", 0, false},
-      {"", 0, false},
-      {"0x", 0, false},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    int64_t output = 0;
-    EXPECT_EQ(cases[i].success, HexStringToInt64(cases[i].input, &output));
-    EXPECT_EQ(cases[i].output, output);
-  }
-  // One additional test to verify that conversion of numbers in strings with
-  // embedded NUL characters.  The NUL and extra data after it should be
-  // interpreted as junk after the number.
-  const char input[] = "0xc0ffee\0" "9";
-  std::string input_string(input, arraysize(input) - 1);
-  int64_t output;
-  EXPECT_FALSE(HexStringToInt64(input_string, &output));
-  EXPECT_EQ(0xc0ffee, output);
-}
-
-TEST(StringNumberConversionsTest, HexStringToUInt64) {
-  static const struct {
-    std::string input;
-    uint64_t output;
-    bool success;
-  } cases[] = {
-      {"0", 0, true},
-      {"42", 66, true},
-      {"-42", 0, false},
-      {"+42", 66, true},
-      {"40acd88557b", INT64_C(4444444448123), true},
-      {"7fffffff", INT_MAX, true},
-      {"-80000000", 0, false},
-      {"ffffffff", 0xffffffff, true},
-      {"DeadBeef", 0xdeadbeef, true},
-      {"0x42", 66, true},
-      {"-0x42", 0, false},
-      {"+0x42", 66, true},
-      {"0x40acd88557b", INT64_C(4444444448123), true},
-      {"0x7fffffff", INT_MAX, true},
-      {"-0x80000000", 0, false},
-      {"0xffffffff", 0xffffffff, true},
-      {"0XDeadBeef", 0xdeadbeef, true},
-      {"0x7fffffffffffffff", std::numeric_limits<int64_t>::max(), true},
-      {"-0x8000000000000000", 0, false},
-      {"0x8000000000000000", UINT64_C(0x8000000000000000), true},
-      {"-0x8000000000000001", 0, false},
-      {"0xFFFFFFFFFFFFFFFF", std::numeric_limits<uint64_t>::max(), true},
-      {"FFFFFFFFFFFFFFFF", std::numeric_limits<uint64_t>::max(), true},
-      {"0x0000000000000000", 0, true},
-      {"0000000000000000", 0, true},
-      {"1FFFFFFFFFFFFFFFF", std::numeric_limits<uint64_t>::max(),
-       false},  // Overflow test.
-      {"0x0f", 15, true},
-      {"0f", 15, true},
-      {" 45", 0x45, false},
-      {"\t\n\v\f\r 0x45", 0x45, false},
-      {" 45", 0x45, false},
-      {"45 ", 0x45, false},
-      {"45:", 0x45, false},
-      {"efgh", 0xef, false},
-      {"0xefgh", 0xef, false},
-      {"hgfe", 0, false},
-      {"-", 0, false},
-      {"", 0, false},
-      {"0x", 0, false},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    uint64_t output = 0;
-    EXPECT_EQ(cases[i].success, HexStringToUInt64(cases[i].input, &output));
-    EXPECT_EQ(cases[i].output, output);
-  }
-  // One additional test to verify that conversion of numbers in strings with
-  // embedded NUL characters.  The NUL and extra data after it should be
-  // interpreted as junk after the number.
-  const char input[] = "0xc0ffee\0" "9";
-  std::string input_string(input, arraysize(input) - 1);
-  uint64_t output;
-  EXPECT_FALSE(HexStringToUInt64(input_string, &output));
-  EXPECT_EQ(0xc0ffeeU, output);
-}
-
-TEST(StringNumberConversionsTest, HexStringToBytes) {
-  static const struct {
-    const std::string input;
-    const char* output;
-    size_t output_len;
-    bool success;
-  } cases[] = {
-    {"0", "", 0, false},  // odd number of characters fails
-    {"00", "\0", 1, true},
-    {"42", "\x42", 1, true},
-    {"-42", "", 0, false},  // any non-hex value fails
-    {"+42", "", 0, false},
-    {"7fffffff", "\x7f\xff\xff\xff", 4, true},
-    {"80000000", "\x80\0\0\0", 4, true},
-    {"deadbeef", "\xde\xad\xbe\xef", 4, true},
-    {"DeadBeef", "\xde\xad\xbe\xef", 4, true},
-    {"0x42", "", 0, false},  // leading 0x fails (x is not hex)
-    {"0f", "\xf", 1, true},
-    {"45  ", "\x45", 1, false},
-    {"efgh", "\xef", 1, false},
-    {"", "", 0, false},
-    {"0123456789ABCDEF", "\x01\x23\x45\x67\x89\xAB\xCD\xEF", 8, true},
-    {"0123456789ABCDEF012345",
-     "\x01\x23\x45\x67\x89\xAB\xCD\xEF\x01\x23\x45", 11, true},
-  };
-
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    std::vector<uint8_t> output;
-    std::vector<uint8_t> compare;
-    EXPECT_EQ(cases[i].success, HexStringToBytes(cases[i].input, &output)) <<
-        i << ": " << cases[i].input;
-    for (size_t j = 0; j < cases[i].output_len; ++j)
-      compare.push_back(static_cast<uint8_t>(cases[i].output[j]));
-    ASSERT_EQ(output.size(), compare.size()) << i << ": " << cases[i].input;
-    EXPECT_TRUE(std::equal(output.begin(), output.end(), compare.begin())) <<
-        i << ": " << cases[i].input;
-  }
-}
-
-TEST(StringNumberConversionsTest, StringToDouble) {
-  static const struct {
-    std::string input;
-    double output;
-    bool success;
-  } cases[] = {
-    // Test different forms of zero.
-    {"0", 0.0, true},
-    {"+0", 0.0, true},
-    {"-0", 0.0, true},
-    {"0.0", 0.0, true},
-    {"000000000000000000000000000000.0", 0.0, true},
-    {"0.000000000000000000000000000", 0.0, true},
-
-    // Test the answer.
-    {"42", 42.0, true},
-    {"-42", -42.0, true},
-
-    // Test variances of an ordinary number.
-    {"123.45", 123.45, true},
-    {"-123.45", -123.45, true},
-    {"+123.45", 123.45, true},
-
-    // Test different forms of representation.
-    {"2.99792458e8", 299792458.0, true},
-    {"149597870.691E+3", 149597870691.0, true},
-    {"6.", 6.0, true},
-
-    // Test around the largest/smallest value that a double can represent.
-    {"9e307", 9e307, true},
-    {"1.7976e308", 1.7976e308, true},
-    {"1.7977e308", HUGE_VAL, false},
-    {"1.797693134862315807e+308", HUGE_VAL, true},
-    {"1.797693134862315808e+308", HUGE_VAL, false},
-    {"9e308", HUGE_VAL, false},
-    {"9e309", HUGE_VAL, false},
-    {"9e999", HUGE_VAL, false},
-    {"9e1999", HUGE_VAL, false},
-    {"9e19999", HUGE_VAL, false},
-    {"9e99999999999999999999", HUGE_VAL, false},
-    {"-9e307", -9e307, true},
-    {"-1.7976e308", -1.7976e308, true},
-    {"-1.7977e308", -HUGE_VAL, false},
-    {"-1.797693134862315807e+308", -HUGE_VAL, true},
-    {"-1.797693134862315808e+308", -HUGE_VAL, false},
-    {"-9e308", -HUGE_VAL, false},
-    {"-9e309", -HUGE_VAL, false},
-    {"-9e999", -HUGE_VAL, false},
-    {"-9e1999", -HUGE_VAL, false},
-    {"-9e19999", -HUGE_VAL, false},
-    {"-9e99999999999999999999", -HUGE_VAL, false},
-
-    // Test more exponents.
-    {"1e-2", 0.01, true},
-    {"42 ", 42.0, false},
-    {" 1e-2", 0.01, false},
-    {"1e-2 ", 0.01, false},
-    {"-1E-7", -0.0000001, true},
-    {"01e02", 100, true},
-    {"2.3e15", 2.3e15, true},
-    {"100e-309", 100e-309, true},
-
-    // Test some invalid cases.
-    {"\t\n\v\f\r -123.45e2", -12345.0, false},
-    {"+123 e4", 123.0, false},
-    {"123e ", 123.0, false},
-    {"123e", 123.0, false},
-    {" 2.99", 2.99, false},
-    {"1e3.4", 1000.0, false},
-    {"nothing", 0.0, false},
-    {"-", 0.0, false},
-    {"+", 0.0, false},
-    {"", 0.0, false},
-
-    // crbug.org/588726
-    {"-0.0010000000000000000000000000000000000000001e-256",
-     -1.0000000000000001e-259, true},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    double output;
-    errno = 1;
-    EXPECT_EQ(cases[i].success, StringToDouble(cases[i].input, &output));
-    if (cases[i].success)
-      EXPECT_EQ(1, errno) << i;  // confirm that errno is unchanged.
-    EXPECT_DOUBLE_EQ(cases[i].output, output);
-  }
-
-  // One additional test to verify that conversion of numbers in strings with
-  // embedded NUL characters.  The NUL and extra data after it should be
-  // interpreted as junk after the number.
-  const char input[] = "3.14\0" "159";
-  std::string input_string(input, arraysize(input) - 1);
-  double output;
-  EXPECT_FALSE(StringToDouble(input_string, &output));
-  EXPECT_DOUBLE_EQ(3.14, output);
-}
-
-TEST(StringNumberConversionsTest, DoubleToString) {
-  static const struct {
-    double input;
-    const char* expected;
-  } cases[] = {
-    {0.0, "0"},
-    {1.25, "1.25"},
-    {1.33518e+012, "1.33518e+12"},
-    {1.33489e+012, "1.33489e+12"},
-    {1.33505e+012, "1.33505e+12"},
-    {1.33545e+009, "1335450000"},
-    {1.33503e+009, "1335030000"},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    EXPECT_EQ(cases[i].expected, NumberToString(cases[i].input));
-    EXPECT_EQ(cases[i].expected, UTF16ToUTF8(NumberToString16(cases[i].input)));
-  }
-
-  // The following two values were seen in crashes in the wild.
-  const char input_bytes[8] = {0, 0, 0, 0, '\xee', '\x6d', '\x73', '\x42'};
-  double input = 0;
-  memcpy(&input, input_bytes, arraysize(input_bytes));
-  EXPECT_EQ("1335179083776", NumberToString(input));
-  const char input_bytes2[8] =
-      {0, 0, 0, '\xa0', '\xda', '\x6c', '\x73', '\x42'};
-  input = 0;
-  memcpy(&input, input_bytes2, arraysize(input_bytes2));
-  EXPECT_EQ("1334890332160", NumberToString(input));
-}
-
-TEST(StringNumberConversionsTest, HexEncode) {
-  std::string hex(HexEncode(nullptr, 0));
-  EXPECT_EQ(hex.length(), 0U);
-  unsigned char bytes[] = {0x01, 0xff, 0x02, 0xfe, 0x03, 0x80, 0x81};
-  hex = HexEncode(bytes, sizeof(bytes));
-  EXPECT_EQ(hex.compare("01FF02FE038081"), 0);
-}
-
-// Test cases of known-bad strtod conversions that motivated the use of dmg_fp.
-// See https://bugs.chromium.org/p/chromium/issues/detail?id=593512.
-TEST(StringNumberConversionsTest, StrtodFailures) {
-  static const struct {
-    const char* input;
-    uint64_t expected;
-  } cases[] = {
-      // http://www.exploringbinary.com/incorrectly-rounded-conversions-in-visual-c-plus-plus/
-      {"9214843084008499", 0x43405e6cec57761aULL},
-      {"0.500000000000000166533453693773481063544750213623046875",
-       0x3fe0000000000002ULL},
-      {"30078505129381147446200", 0x44997a3c7271b021ULL},
-      {"1777820000000000000001", 0x4458180d5bad2e3eULL},
-      {"0.500000000000000166547006220929549868969843373633921146392822265625",
-       0x3fe0000000000002ULL},
-      {"0.50000000000000016656055874808561867439493653364479541778564453125",
-       0x3fe0000000000002ULL},
-      {"0.3932922657273", 0x3fd92bb352c4623aULL},
-
-      // http://www.exploringbinary.com/incorrectly-rounded-conversions-in-gcc-and-glibc/
-      {"0.500000000000000166533453693773481063544750213623046875",
-       0x3fe0000000000002ULL},
-      {"3.518437208883201171875e13", 0x42c0000000000002ULL},
-      {"62.5364939768271845828", 0x404f44abd5aa7ca4ULL},
-      {"8.10109172351e-10", 0x3e0bd5cbaef0fd0cULL},
-      {"1.50000000000000011102230246251565404236316680908203125",
-       0x3ff8000000000000ULL},
-      {"9007199254740991.4999999999999999999999999999999995",
-       0x433fffffffffffffULL},
-
-      // http://www.exploringbinary.com/incorrect-decimal-to-floating-point-conversion-in-sqlite/
-      {"1e-23", 0x3b282db34012b251ULL},
-      {"8.533e+68", 0x4e3fa69165a8eea2ULL},
-      {"4.1006e-184", 0x19dbe0d1c7ea60c9ULL},
-      {"9.998e+307", 0x7fe1cc0a350ca87bULL},
-      {"9.9538452227e-280", 0x0602117ae45cde43ULL},
-      {"6.47660115e-260", 0x0a1fdd9e333badadULL},
-      {"7.4e+47", 0x49e033d7eca0adefULL},
-      {"5.92e+48", 0x4a1033d7eca0adefULL},
-      {"7.35e+66", 0x4dd172b70eababa9ULL},
-      {"8.32116e+55", 0x4b8b2628393e02cdULL},
-  };
-
-  for (const auto& test : cases) {
-    double output;
-    EXPECT_TRUE(StringToDouble(test.input, &output));
-    EXPECT_EQ(bit_cast<uint64_t>(output), test.expected);
-  }
-}
-
-}  // namespace base
diff --git a/base/strings/string_piece_unittest.cc b/base/strings/string_piece_unittest.cc
deleted file mode 100644
index 17d0897..0000000
--- a/base/strings/string_piece_unittest.cc
+++ /dev/null
@@ -1,805 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-template <typename T>
-class CommonStringPieceTest : public ::testing::Test {
- public:
-  static const T as_string(const char* input) {
-    return T(input);
-  }
-  static const T& as_string(const T& input) {
-    return input;
-  }
-};
-
-template <>
-class CommonStringPieceTest<string16> : public ::testing::Test {
- public:
-  static const string16 as_string(const char* input) {
-    return ASCIIToUTF16(input);
-  }
-  static const string16 as_string(const std::string& input) {
-    return ASCIIToUTF16(input);
-  }
-};
-
-typedef ::testing::Types<std::string, string16> SupportedStringTypes;
-
-TYPED_TEST_CASE(CommonStringPieceTest, SupportedStringTypes);
-
-TYPED_TEST(CommonStringPieceTest, CheckComparisonOperators) {
-#define CMP_Y(op, x, y)                                                    \
-  {                                                                        \
-    TypeParam lhs(TestFixture::as_string(x));                              \
-    TypeParam rhs(TestFixture::as_string(y));                              \
-    ASSERT_TRUE( (BasicStringPiece<TypeParam>((lhs.c_str())) op            \
-                  BasicStringPiece<TypeParam>((rhs.c_str()))));            \
-    ASSERT_TRUE( (BasicStringPiece<TypeParam>((lhs.c_str())).compare(      \
-                      BasicStringPiece<TypeParam>((rhs.c_str()))) op 0));  \
-  }
-
-#define CMP_N(op, x, y)                                                    \
-  {                                                                        \
-    TypeParam lhs(TestFixture::as_string(x));                              \
-    TypeParam rhs(TestFixture::as_string(y));                              \
-    ASSERT_FALSE( (BasicStringPiece<TypeParam>((lhs.c_str())) op           \
-                  BasicStringPiece<TypeParam>((rhs.c_str()))));            \
-    ASSERT_FALSE( (BasicStringPiece<TypeParam>((lhs.c_str())).compare(     \
-                      BasicStringPiece<TypeParam>((rhs.c_str()))) op 0));  \
-  }
-
-  CMP_Y(==, "",   "");
-  CMP_Y(==, "a",  "a");
-  CMP_Y(==, "aa", "aa");
-  CMP_N(==, "a",  "");
-  CMP_N(==, "",   "a");
-  CMP_N(==, "a",  "b");
-  CMP_N(==, "a",  "aa");
-  CMP_N(==, "aa", "a");
-
-  CMP_N(!=, "",   "");
-  CMP_N(!=, "a",  "a");
-  CMP_N(!=, "aa", "aa");
-  CMP_Y(!=, "a",  "");
-  CMP_Y(!=, "",   "a");
-  CMP_Y(!=, "a",  "b");
-  CMP_Y(!=, "a",  "aa");
-  CMP_Y(!=, "aa", "a");
-
-  CMP_Y(<, "a",  "b");
-  CMP_Y(<, "a",  "aa");
-  CMP_Y(<, "aa", "b");
-  CMP_Y(<, "aa", "bb");
-  CMP_N(<, "a",  "a");
-  CMP_N(<, "b",  "a");
-  CMP_N(<, "aa", "a");
-  CMP_N(<, "b",  "aa");
-  CMP_N(<, "bb", "aa");
-
-  CMP_Y(<=, "a",  "a");
-  CMP_Y(<=, "a",  "b");
-  CMP_Y(<=, "a",  "aa");
-  CMP_Y(<=, "aa", "b");
-  CMP_Y(<=, "aa", "bb");
-  CMP_N(<=, "b",  "a");
-  CMP_N(<=, "aa", "a");
-  CMP_N(<=, "b",  "aa");
-  CMP_N(<=, "bb", "aa");
-
-  CMP_N(>=, "a",  "b");
-  CMP_N(>=, "a",  "aa");
-  CMP_N(>=, "aa", "b");
-  CMP_N(>=, "aa", "bb");
-  CMP_Y(>=, "a",  "a");
-  CMP_Y(>=, "b",  "a");
-  CMP_Y(>=, "aa", "a");
-  CMP_Y(>=, "b",  "aa");
-  CMP_Y(>=, "bb", "aa");
-
-  CMP_N(>, "a",  "a");
-  CMP_N(>, "a",  "b");
-  CMP_N(>, "a",  "aa");
-  CMP_N(>, "aa", "b");
-  CMP_N(>, "aa", "bb");
-  CMP_Y(>, "b",  "a");
-  CMP_Y(>, "aa", "a");
-  CMP_Y(>, "b",  "aa");
-  CMP_Y(>, "bb", "aa");
-
-  std::string x;
-  for (int i = 0; i < 256; i++) {
-    x += 'a';
-    std::string y = x;
-    CMP_Y(==, x, y);
-    for (int j = 0; j < i; j++) {
-      std::string z = x;
-      z[j] = 'b';       // Differs in position 'j'
-      CMP_N(==, x, z);
-    }
-  }
-
-#undef CMP_Y
-#undef CMP_N
-}
-
-TYPED_TEST(CommonStringPieceTest, CheckSTL) {
-  TypeParam alphabet(TestFixture::as_string("abcdefghijklmnopqrstuvwxyz"));
-  TypeParam abc(TestFixture::as_string("abc"));
-  TypeParam xyz(TestFixture::as_string("xyz"));
-  TypeParam foobar(TestFixture::as_string("foobar"));
-
-  BasicStringPiece<TypeParam> a(alphabet);
-  BasicStringPiece<TypeParam> b(abc);
-  BasicStringPiece<TypeParam> c(xyz);
-  BasicStringPiece<TypeParam> d(foobar);
-  BasicStringPiece<TypeParam> e;
-  TypeParam temp(TestFixture::as_string("123"));
-  temp += static_cast<typename TypeParam::value_type>(0);
-  temp += TestFixture::as_string("456");
-  BasicStringPiece<TypeParam> f(temp);
-
-  ASSERT_EQ(a[6], static_cast<typename TypeParam::value_type>('g'));
-  ASSERT_EQ(b[0], static_cast<typename TypeParam::value_type>('a'));
-  ASSERT_EQ(c[2], static_cast<typename TypeParam::value_type>('z'));
-  ASSERT_EQ(f[3], static_cast<typename TypeParam::value_type>('\0'));
-  ASSERT_EQ(f[5], static_cast<typename TypeParam::value_type>('5'));
-
-  ASSERT_EQ(*d.data(), static_cast<typename TypeParam::value_type>('f'));
-  ASSERT_EQ(d.data()[5], static_cast<typename TypeParam::value_type>('r'));
-  ASSERT_EQ(e.data(), nullptr);
-
-  ASSERT_EQ(*a.begin(), static_cast<typename TypeParam::value_type>('a'));
-  ASSERT_EQ(*(b.begin() + 2), static_cast<typename TypeParam::value_type>('c'));
-  ASSERT_EQ(*(c.end() - 1), static_cast<typename TypeParam::value_type>('z'));
-
-  ASSERT_EQ(*a.rbegin(), static_cast<typename TypeParam::value_type>('z'));
-  ASSERT_EQ(*(b.rbegin() + 2),
-            static_cast<typename TypeParam::value_type>('a'));
-  ASSERT_EQ(*(c.rend() - 1), static_cast<typename TypeParam::value_type>('x'));
-  ASSERT_EQ(a.rbegin() + 26, a.rend());
-
-  ASSERT_EQ(a.size(), 26U);
-  ASSERT_EQ(b.size(), 3U);
-  ASSERT_EQ(c.size(), 3U);
-  ASSERT_EQ(d.size(), 6U);
-  ASSERT_EQ(e.size(), 0U);
-  ASSERT_EQ(f.size(), 7U);
-
-  ASSERT_TRUE(!d.empty());
-  ASSERT_TRUE(d.begin() != d.end());
-  ASSERT_EQ(d.begin() + 6, d.end());
-
-  ASSERT_TRUE(e.empty());
-  ASSERT_EQ(e.begin(), e.end());
-
-  d.clear();
-  ASSERT_EQ(d.size(), 0U);
-  ASSERT_TRUE(d.empty());
-  ASSERT_EQ(d.data(), nullptr);
-  ASSERT_EQ(d.begin(), d.end());
-
-  ASSERT_GE(a.max_size(), a.capacity());
-  ASSERT_GE(a.capacity(), a.size());
-}
-
-TYPED_TEST(CommonStringPieceTest, CheckFind) {
-  typedef BasicStringPiece<TypeParam> Piece;
-
-  TypeParam alphabet(TestFixture::as_string("abcdefghijklmnopqrstuvwxyz"));
-  TypeParam abc(TestFixture::as_string("abc"));
-  TypeParam xyz(TestFixture::as_string("xyz"));
-  TypeParam foobar(TestFixture::as_string("foobar"));
-
-  BasicStringPiece<TypeParam> a(alphabet);
-  BasicStringPiece<TypeParam> b(abc);
-  BasicStringPiece<TypeParam> c(xyz);
-  BasicStringPiece<TypeParam> d(foobar);
-
-  d.clear();
-  Piece e;
-  TypeParam temp(TestFixture::as_string("123"));
-  temp.push_back('\0');
-  temp += TestFixture::as_string("456");
-  Piece f(temp);
-
-  typename TypeParam::value_type buf[4] = { '%', '%', '%', '%' };
-  ASSERT_EQ(a.copy(buf, 4), 4U);
-  ASSERT_EQ(buf[0], a[0]);
-  ASSERT_EQ(buf[1], a[1]);
-  ASSERT_EQ(buf[2], a[2]);
-  ASSERT_EQ(buf[3], a[3]);
-  ASSERT_EQ(a.copy(buf, 3, 7), 3U);
-  ASSERT_EQ(buf[0], a[7]);
-  ASSERT_EQ(buf[1], a[8]);
-  ASSERT_EQ(buf[2], a[9]);
-  ASSERT_EQ(buf[3], a[3]);
-  ASSERT_EQ(c.copy(buf, 99), 3U);
-  ASSERT_EQ(buf[0], c[0]);
-  ASSERT_EQ(buf[1], c[1]);
-  ASSERT_EQ(buf[2], c[2]);
-  ASSERT_EQ(buf[3], a[3]);
-
-  ASSERT_EQ(Piece::npos, TypeParam::npos);
-
-  ASSERT_EQ(a.find(b), 0U);
-  ASSERT_EQ(a.find(b, 1), Piece::npos);
-  ASSERT_EQ(a.find(c), 23U);
-  ASSERT_EQ(a.find(c, 9), 23U);
-  ASSERT_EQ(a.find(c, Piece::npos), Piece::npos);
-  ASSERT_EQ(b.find(c), Piece::npos);
-  ASSERT_EQ(b.find(c, Piece::npos), Piece::npos);
-  ASSERT_EQ(a.find(d), 0U);
-  ASSERT_EQ(a.find(e), 0U);
-  ASSERT_EQ(a.find(d, 12), 12U);
-  ASSERT_EQ(a.find(e, 17), 17U);
-  TypeParam not_found(TestFixture::as_string("xx not found bb"));
-  Piece g(not_found);
-  ASSERT_EQ(a.find(g), Piece::npos);
-  // empty string nonsense
-  ASSERT_EQ(d.find(b), Piece::npos);
-  ASSERT_EQ(e.find(b), Piece::npos);
-  ASSERT_EQ(d.find(b, 4), Piece::npos);
-  ASSERT_EQ(e.find(b, 7), Piece::npos);
-
-  size_t empty_search_pos = TypeParam().find(TypeParam());
-  ASSERT_EQ(d.find(d), empty_search_pos);
-  ASSERT_EQ(d.find(e), empty_search_pos);
-  ASSERT_EQ(e.find(d), empty_search_pos);
-  ASSERT_EQ(e.find(e), empty_search_pos);
-  ASSERT_EQ(d.find(d, 4), std::string().find(std::string(), 4));
-  ASSERT_EQ(d.find(e, 4), std::string().find(std::string(), 4));
-  ASSERT_EQ(e.find(d, 4), std::string().find(std::string(), 4));
-  ASSERT_EQ(e.find(e, 4), std::string().find(std::string(), 4));
-
-  ASSERT_EQ(a.find('a'), 0U);
-  ASSERT_EQ(a.find('c'), 2U);
-  ASSERT_EQ(a.find('z'), 25U);
-  ASSERT_EQ(a.find('$'), Piece::npos);
-  ASSERT_EQ(a.find('\0'), Piece::npos);
-  ASSERT_EQ(f.find('\0'), 3U);
-  ASSERT_EQ(f.find('3'), 2U);
-  ASSERT_EQ(f.find('5'), 5U);
-  ASSERT_EQ(g.find('o'), 4U);
-  ASSERT_EQ(g.find('o', 4), 4U);
-  ASSERT_EQ(g.find('o', 5), 8U);
-  ASSERT_EQ(a.find('b', 5), Piece::npos);
-  // empty string nonsense
-  ASSERT_EQ(d.find('\0'), Piece::npos);
-  ASSERT_EQ(e.find('\0'), Piece::npos);
-  ASSERT_EQ(d.find('\0', 4), Piece::npos);
-  ASSERT_EQ(e.find('\0', 7), Piece::npos);
-  ASSERT_EQ(d.find('x'), Piece::npos);
-  ASSERT_EQ(e.find('x'), Piece::npos);
-  ASSERT_EQ(d.find('x', 4), Piece::npos);
-  ASSERT_EQ(e.find('x', 7), Piece::npos);
-
-  ASSERT_EQ(a.rfind(b), 0U);
-  ASSERT_EQ(a.rfind(b, 1), 0U);
-  ASSERT_EQ(a.rfind(c), 23U);
-  ASSERT_EQ(a.rfind(c, 22U), Piece::npos);
-  ASSERT_EQ(a.rfind(c, 1U), Piece::npos);
-  ASSERT_EQ(a.rfind(c, 0U), Piece::npos);
-  ASSERT_EQ(b.rfind(c), Piece::npos);
-  ASSERT_EQ(b.rfind(c, 0U), Piece::npos);
-  ASSERT_EQ(a.rfind(d), static_cast<size_t>(a.as_string().rfind(TypeParam())));
-  ASSERT_EQ(a.rfind(e), a.as_string().rfind(TypeParam()));
-  ASSERT_EQ(a.rfind(d), static_cast<size_t>(TypeParam(a).rfind(TypeParam())));
-  ASSERT_EQ(a.rfind(e), TypeParam(a).rfind(TypeParam()));
-  ASSERT_EQ(a.rfind(d, 12), 12U);
-  ASSERT_EQ(a.rfind(e, 17), 17U);
-  ASSERT_EQ(a.rfind(g), Piece::npos);
-  ASSERT_EQ(d.rfind(b), Piece::npos);
-  ASSERT_EQ(e.rfind(b), Piece::npos);
-  ASSERT_EQ(d.rfind(b, 4), Piece::npos);
-  ASSERT_EQ(e.rfind(b, 7), Piece::npos);
-  // empty string nonsense
-  ASSERT_EQ(d.rfind(d, 4), std::string().rfind(std::string()));
-  ASSERT_EQ(e.rfind(d, 7), std::string().rfind(std::string()));
-  ASSERT_EQ(d.rfind(e, 4), std::string().rfind(std::string()));
-  ASSERT_EQ(e.rfind(e, 7), std::string().rfind(std::string()));
-  ASSERT_EQ(d.rfind(d), std::string().rfind(std::string()));
-  ASSERT_EQ(e.rfind(d), std::string().rfind(std::string()));
-  ASSERT_EQ(d.rfind(e), std::string().rfind(std::string()));
-  ASSERT_EQ(e.rfind(e), std::string().rfind(std::string()));
-
-  ASSERT_EQ(g.rfind('o'), 8U);
-  ASSERT_EQ(g.rfind('q'), Piece::npos);
-  ASSERT_EQ(g.rfind('o', 8), 8U);
-  ASSERT_EQ(g.rfind('o', 7), 4U);
-  ASSERT_EQ(g.rfind('o', 3), Piece::npos);
-  ASSERT_EQ(f.rfind('\0'), 3U);
-  ASSERT_EQ(f.rfind('\0', 12), 3U);
-  ASSERT_EQ(f.rfind('3'), 2U);
-  ASSERT_EQ(f.rfind('5'), 5U);
-  // empty string nonsense
-  ASSERT_EQ(d.rfind('o'), Piece::npos);
-  ASSERT_EQ(e.rfind('o'), Piece::npos);
-  ASSERT_EQ(d.rfind('o', 4), Piece::npos);
-  ASSERT_EQ(e.rfind('o', 7), Piece::npos);
-
-  TypeParam one_two_three_four(TestFixture::as_string("one,two:three;four"));
-  TypeParam comma_colon(TestFixture::as_string(",:"));
-  ASSERT_EQ(3U, Piece(one_two_three_four).find_first_of(comma_colon));
-  ASSERT_EQ(a.find_first_of(b), 0U);
-  ASSERT_EQ(a.find_first_of(b, 0), 0U);
-  ASSERT_EQ(a.find_first_of(b, 1), 1U);
-  ASSERT_EQ(a.find_first_of(b, 2), 2U);
-  ASSERT_EQ(a.find_first_of(b, 3), Piece::npos);
-  ASSERT_EQ(a.find_first_of(c), 23U);
-  ASSERT_EQ(a.find_first_of(c, 23), 23U);
-  ASSERT_EQ(a.find_first_of(c, 24), 24U);
-  ASSERT_EQ(a.find_first_of(c, 25), 25U);
-  ASSERT_EQ(a.find_first_of(c, 26), Piece::npos);
-  ASSERT_EQ(g.find_first_of(b), 13U);
-  ASSERT_EQ(g.find_first_of(c), 0U);
-  ASSERT_EQ(a.find_first_of(f), Piece::npos);
-  ASSERT_EQ(f.find_first_of(a), Piece::npos);
-  // empty string nonsense
-  ASSERT_EQ(a.find_first_of(d), Piece::npos);
-  ASSERT_EQ(a.find_first_of(e), Piece::npos);
-  ASSERT_EQ(d.find_first_of(b), Piece::npos);
-  ASSERT_EQ(e.find_first_of(b), Piece::npos);
-  ASSERT_EQ(d.find_first_of(d), Piece::npos);
-  ASSERT_EQ(e.find_first_of(d), Piece::npos);
-  ASSERT_EQ(d.find_first_of(e), Piece::npos);
-  ASSERT_EQ(e.find_first_of(e), Piece::npos);
-
-  ASSERT_EQ(a.find_first_not_of(b), 3U);
-  ASSERT_EQ(a.find_first_not_of(c), 0U);
-  ASSERT_EQ(b.find_first_not_of(a), Piece::npos);
-  ASSERT_EQ(c.find_first_not_of(a), Piece::npos);
-  ASSERT_EQ(f.find_first_not_of(a), 0U);
-  ASSERT_EQ(a.find_first_not_of(f), 0U);
-  ASSERT_EQ(a.find_first_not_of(d), 0U);
-  ASSERT_EQ(a.find_first_not_of(e), 0U);
-  // empty string nonsense
-  ASSERT_EQ(d.find_first_not_of(a), Piece::npos);
-  ASSERT_EQ(e.find_first_not_of(a), Piece::npos);
-  ASSERT_EQ(d.find_first_not_of(d), Piece::npos);
-  ASSERT_EQ(e.find_first_not_of(d), Piece::npos);
-  ASSERT_EQ(d.find_first_not_of(e), Piece::npos);
-  ASSERT_EQ(e.find_first_not_of(e), Piece::npos);
-
-  TypeParam equals(TestFixture::as_string("===="));
-  Piece h(equals);
-  ASSERT_EQ(h.find_first_not_of('='), Piece::npos);
-  ASSERT_EQ(h.find_first_not_of('=', 3), Piece::npos);
-  ASSERT_EQ(h.find_first_not_of('\0'), 0U);
-  ASSERT_EQ(g.find_first_not_of('x'), 2U);
-  ASSERT_EQ(f.find_first_not_of('\0'), 0U);
-  ASSERT_EQ(f.find_first_not_of('\0', 3), 4U);
-  ASSERT_EQ(f.find_first_not_of('\0', 2), 2U);
-  // empty string nonsense
-  ASSERT_EQ(d.find_first_not_of('x'), Piece::npos);
-  ASSERT_EQ(e.find_first_not_of('x'), Piece::npos);
-  ASSERT_EQ(d.find_first_not_of('\0'), Piece::npos);
-  ASSERT_EQ(e.find_first_not_of('\0'), Piece::npos);
-
-  //  Piece g("xx not found bb");
-  TypeParam fifty_six(TestFixture::as_string("56"));
-  Piece i(fifty_six);
-  ASSERT_EQ(h.find_last_of(a), Piece::npos);
-  ASSERT_EQ(g.find_last_of(a), g.size()-1);
-  ASSERT_EQ(a.find_last_of(b), 2U);
-  ASSERT_EQ(a.find_last_of(c), a.size()-1);
-  ASSERT_EQ(f.find_last_of(i), 6U);
-  ASSERT_EQ(a.find_last_of('a'), 0U);
-  ASSERT_EQ(a.find_last_of('b'), 1U);
-  ASSERT_EQ(a.find_last_of('z'), 25U);
-  ASSERT_EQ(a.find_last_of('a', 5), 0U);
-  ASSERT_EQ(a.find_last_of('b', 5), 1U);
-  ASSERT_EQ(a.find_last_of('b', 0), Piece::npos);
-  ASSERT_EQ(a.find_last_of('z', 25), 25U);
-  ASSERT_EQ(a.find_last_of('z', 24), Piece::npos);
-  ASSERT_EQ(f.find_last_of(i, 5), 5U);
-  ASSERT_EQ(f.find_last_of(i, 6), 6U);
-  ASSERT_EQ(f.find_last_of(a, 4), Piece::npos);
-  // empty string nonsense
-  ASSERT_EQ(f.find_last_of(d), Piece::npos);
-  ASSERT_EQ(f.find_last_of(e), Piece::npos);
-  ASSERT_EQ(f.find_last_of(d, 4), Piece::npos);
-  ASSERT_EQ(f.find_last_of(e, 4), Piece::npos);
-  ASSERT_EQ(d.find_last_of(d), Piece::npos);
-  ASSERT_EQ(d.find_last_of(e), Piece::npos);
-  ASSERT_EQ(e.find_last_of(d), Piece::npos);
-  ASSERT_EQ(e.find_last_of(e), Piece::npos);
-  ASSERT_EQ(d.find_last_of(f), Piece::npos);
-  ASSERT_EQ(e.find_last_of(f), Piece::npos);
-  ASSERT_EQ(d.find_last_of(d, 4), Piece::npos);
-  ASSERT_EQ(d.find_last_of(e, 4), Piece::npos);
-  ASSERT_EQ(e.find_last_of(d, 4), Piece::npos);
-  ASSERT_EQ(e.find_last_of(e, 4), Piece::npos);
-  ASSERT_EQ(d.find_last_of(f, 4), Piece::npos);
-  ASSERT_EQ(e.find_last_of(f, 4), Piece::npos);
-
-  ASSERT_EQ(a.find_last_not_of(b), a.size()-1);
-  ASSERT_EQ(a.find_last_not_of(c), 22U);
-  ASSERT_EQ(b.find_last_not_of(a), Piece::npos);
-  ASSERT_EQ(b.find_last_not_of(b), Piece::npos);
-  ASSERT_EQ(f.find_last_not_of(i), 4U);
-  ASSERT_EQ(a.find_last_not_of(c, 24), 22U);
-  ASSERT_EQ(a.find_last_not_of(b, 3), 3U);
-  ASSERT_EQ(a.find_last_not_of(b, 2), Piece::npos);
-  // empty string nonsense
-  ASSERT_EQ(f.find_last_not_of(d), f.size()-1);
-  ASSERT_EQ(f.find_last_not_of(e), f.size()-1);
-  ASSERT_EQ(f.find_last_not_of(d, 4), 4U);
-  ASSERT_EQ(f.find_last_not_of(e, 4), 4U);
-  ASSERT_EQ(d.find_last_not_of(d), Piece::npos);
-  ASSERT_EQ(d.find_last_not_of(e), Piece::npos);
-  ASSERT_EQ(e.find_last_not_of(d), Piece::npos);
-  ASSERT_EQ(e.find_last_not_of(e), Piece::npos);
-  ASSERT_EQ(d.find_last_not_of(f), Piece::npos);
-  ASSERT_EQ(e.find_last_not_of(f), Piece::npos);
-  ASSERT_EQ(d.find_last_not_of(d, 4), Piece::npos);
-  ASSERT_EQ(d.find_last_not_of(e, 4), Piece::npos);
-  ASSERT_EQ(e.find_last_not_of(d, 4), Piece::npos);
-  ASSERT_EQ(e.find_last_not_of(e, 4), Piece::npos);
-  ASSERT_EQ(d.find_last_not_of(f, 4), Piece::npos);
-  ASSERT_EQ(e.find_last_not_of(f, 4), Piece::npos);
-
-  ASSERT_EQ(h.find_last_not_of('x'), h.size() - 1);
-  ASSERT_EQ(h.find_last_not_of('='), Piece::npos);
-  ASSERT_EQ(b.find_last_not_of('c'), 1U);
-  ASSERT_EQ(h.find_last_not_of('x', 2), 2U);
-  ASSERT_EQ(h.find_last_not_of('=', 2), Piece::npos);
-  ASSERT_EQ(b.find_last_not_of('b', 1), 0U);
-  // empty string nonsense
-  ASSERT_EQ(d.find_last_not_of('x'), Piece::npos);
-  ASSERT_EQ(e.find_last_not_of('x'), Piece::npos);
-  ASSERT_EQ(d.find_last_not_of('\0'), Piece::npos);
-  ASSERT_EQ(e.find_last_not_of('\0'), Piece::npos);
-
-  ASSERT_EQ(a.substr(0, 3), b);
-  ASSERT_EQ(a.substr(23), c);
-  ASSERT_EQ(a.substr(23, 3), c);
-  ASSERT_EQ(a.substr(23, 99), c);
-  ASSERT_EQ(a.substr(0), a);
-  ASSERT_EQ(a.substr(3, 2), TestFixture::as_string("de"));
-  // empty string nonsense
-  ASSERT_EQ(a.substr(99, 2), e);
-  ASSERT_EQ(d.substr(99), e);
-  ASSERT_EQ(d.substr(0, 99), e);
-  ASSERT_EQ(d.substr(99, 99), e);
-}
-
-TYPED_TEST(CommonStringPieceTest, CheckCustom) {
-  TypeParam foobar(TestFixture::as_string("foobar"));
-  BasicStringPiece<TypeParam> a(foobar);
-  TypeParam s1(TestFixture::as_string("123"));
-  s1 += static_cast<typename TypeParam::value_type>('\0');
-  s1 += TestFixture::as_string("456");
-  BasicStringPiece<TypeParam> b(s1);
-  BasicStringPiece<TypeParam> e;
-  TypeParam s2;
-
-  // remove_prefix
-  BasicStringPiece<TypeParam> c(a);
-  c.remove_prefix(3);
-  ASSERT_EQ(c, TestFixture::as_string("bar"));
-  c = a;
-  c.remove_prefix(0);
-  ASSERT_EQ(c, a);
-  c.remove_prefix(c.size());
-  ASSERT_EQ(c, e);
-
-  // remove_suffix
-  c = a;
-  c.remove_suffix(3);
-  ASSERT_EQ(c, TestFixture::as_string("foo"));
-  c = a;
-  c.remove_suffix(0);
-  ASSERT_EQ(c, a);
-  c.remove_suffix(c.size());
-  ASSERT_EQ(c, e);
-
-  // set
-  c.set(foobar.c_str());
-  ASSERT_EQ(c, a);
-  c.set(foobar.c_str(), 6);
-  ASSERT_EQ(c, a);
-  c.set(foobar.c_str(), 0);
-  ASSERT_EQ(c, e);
-  c.set(foobar.c_str(), 7);  // Note, has an embedded NULL
-  ASSERT_NE(c, a);
-
-  // as_string
-  TypeParam s3(a.as_string().c_str(), 7);  // Note, has an embedded NULL
-  ASSERT_EQ(c, s3);
-  TypeParam s4(e.as_string());
-  ASSERT_TRUE(s4.empty());
-
-  // operator STRING_TYPE()
-  TypeParam s5(TypeParam(a).c_str(), 7);  // Note, has an embedded NULL
-  ASSERT_EQ(c, s5);
-  TypeParam s6(e);
-  ASSERT_TRUE(s6.empty());
-}
-
-TEST(StringPieceTest, CheckCustom) {
-  StringPiece a("foobar");
-  std::string s1("123");
-  s1 += '\0';
-  s1 += "456";
-  StringPiece b(s1);
-  StringPiece e;
-  std::string s2;
-
-  // CopyToString
-  a.CopyToString(&s2);
-  ASSERT_EQ(s2.size(), 6U);
-  ASSERT_EQ(s2, "foobar");
-  b.CopyToString(&s2);
-  ASSERT_EQ(s2.size(), 7U);
-  ASSERT_EQ(s1, s2);
-  e.CopyToString(&s2);
-  ASSERT_TRUE(s2.empty());
-
-  // AppendToString
-  s2.erase();
-  a.AppendToString(&s2);
-  ASSERT_EQ(s2.size(), 6U);
-  ASSERT_EQ(s2, "foobar");
-  a.AppendToString(&s2);
-  ASSERT_EQ(s2.size(), 12U);
-  ASSERT_EQ(s2, "foobarfoobar");
-
-  // starts_with
-  ASSERT_TRUE(a.starts_with(a));
-  ASSERT_TRUE(a.starts_with("foo"));
-  ASSERT_TRUE(a.starts_with(e));
-  ASSERT_TRUE(b.starts_with(s1));
-  ASSERT_TRUE(b.starts_with(b));
-  ASSERT_TRUE(b.starts_with(e));
-  ASSERT_TRUE(e.starts_with(""));
-  ASSERT_TRUE(!a.starts_with(b));
-  ASSERT_TRUE(!b.starts_with(a));
-  ASSERT_TRUE(!e.starts_with(a));
-
-  // ends with
-  ASSERT_TRUE(a.ends_with(a));
-  ASSERT_TRUE(a.ends_with("bar"));
-  ASSERT_TRUE(a.ends_with(e));
-  ASSERT_TRUE(b.ends_with(s1));
-  ASSERT_TRUE(b.ends_with(b));
-  ASSERT_TRUE(b.ends_with(e));
-  ASSERT_TRUE(e.ends_with(""));
-  ASSERT_TRUE(!a.ends_with(b));
-  ASSERT_TRUE(!b.ends_with(a));
-  ASSERT_TRUE(!e.ends_with(a));
-
-  StringPiece c;
-  c.set("foobar", 6);
-  ASSERT_EQ(c, a);
-  c.set("foobar", 0);
-  ASSERT_EQ(c, e);
-  c.set("foobar", 7);
-  ASSERT_NE(c, a);
-}
-
-TYPED_TEST(CommonStringPieceTest, CheckNULL) {
-  // we used to crash here, but now we don't.
-  BasicStringPiece<TypeParam> s(nullptr);
-  ASSERT_EQ(s.data(), nullptr);
-  ASSERT_EQ(s.size(), 0U);
-
-  s.set(nullptr);
-  ASSERT_EQ(s.data(), nullptr);
-  ASSERT_EQ(s.size(), 0U);
-
-  TypeParam str(s);
-  ASSERT_EQ(str.length(), 0U);
-  ASSERT_EQ(str, TypeParam());
-
-  str = s.as_string();
-  ASSERT_EQ(str.length(), 0U);
-  ASSERT_EQ(str, TypeParam());
-}
-
-TYPED_TEST(CommonStringPieceTest, CheckComparisons2) {
-  TypeParam alphabet(TestFixture::as_string("abcdefghijklmnopqrstuvwxyz"));
-  TypeParam alphabet_z(TestFixture::as_string("abcdefghijklmnopqrstuvwxyzz"));
-  TypeParam alphabet_y(TestFixture::as_string("abcdefghijklmnopqrstuvwxyy"));
-  BasicStringPiece<TypeParam> abc(alphabet);
-
-  // check comparison operations on strings longer than 4 bytes.
-  ASSERT_EQ(abc, BasicStringPiece<TypeParam>(alphabet));
-  ASSERT_EQ(abc.compare(BasicStringPiece<TypeParam>(alphabet)), 0);
-
-  ASSERT_TRUE(abc < BasicStringPiece<TypeParam>(alphabet_z));
-  ASSERT_LT(abc.compare(BasicStringPiece<TypeParam>(alphabet_z)), 0);
-
-  ASSERT_TRUE(abc > BasicStringPiece<TypeParam>(alphabet_y));
-  ASSERT_GT(abc.compare(BasicStringPiece<TypeParam>(alphabet_y)), 0);
-}
-
-// Test operations only supported by std::string version.
-TEST(StringPieceTest, CheckComparisons2) {
-  StringPiece abc("abcdefghijklmnopqrstuvwxyz");
-
-  // starts_with
-  ASSERT_TRUE(abc.starts_with(abc));
-  ASSERT_TRUE(abc.starts_with("abcdefghijklm"));
-  ASSERT_TRUE(!abc.starts_with("abcdefguvwxyz"));
-
-  // ends_with
-  ASSERT_TRUE(abc.ends_with(abc));
-  ASSERT_TRUE(!abc.ends_with("abcdefguvwxyz"));
-  ASSERT_TRUE(abc.ends_with("nopqrstuvwxyz"));
-}
-
-TYPED_TEST(CommonStringPieceTest, StringCompareNotAmbiguous) {
-  ASSERT_TRUE(TestFixture::as_string("hello").c_str() ==
-              TestFixture::as_string("hello"));
-  ASSERT_TRUE(TestFixture::as_string("hello").c_str() <
-              TestFixture::as_string("world"));
-}
-
-TYPED_TEST(CommonStringPieceTest, HeterogenousStringPieceEquals) {
-  TypeParam hello(TestFixture::as_string("hello"));
-
-  ASSERT_EQ(BasicStringPiece<TypeParam>(hello), hello);
-  ASSERT_EQ(hello.c_str(), BasicStringPiece<TypeParam>(hello));
-}
-
-// string16-specific stuff
-TEST(StringPiece16Test, CheckSTL) {
-  // Check some non-ascii characters.
-  string16 fifth(ASCIIToUTF16("123"));
-  fifth.push_back(0x0000);
-  fifth.push_back(0xd8c5);
-  fifth.push_back(0xdffe);
-  StringPiece16 f(fifth);
-
-  ASSERT_EQ(f[3], '\0');
-  ASSERT_EQ(f[5], static_cast<char16>(0xdffe));
-
-  ASSERT_EQ(f.size(), 6U);
-}
-
-
-
-TEST(StringPiece16Test, CheckConversion) {
-  // Make sure that we can convert from UTF8 to UTF16 and back. We use a two
-  // byte character (G clef) to test this.
-  ASSERT_EQ(
-      UTF16ToUTF8(
-          StringPiece16(UTF8ToUTF16("\xf0\x9d\x84\x9e")).as_string()),
-      "\xf0\x9d\x84\x9e");
-}
-
-TYPED_TEST(CommonStringPieceTest, CheckConstructors) {
-  TypeParam str(TestFixture::as_string("hello world"));
-  TypeParam empty;
-
-  ASSERT_EQ(str, BasicStringPiece<TypeParam>(str));
-  ASSERT_EQ(str, BasicStringPiece<TypeParam>(str.c_str()));
-  ASSERT_TRUE(TestFixture::as_string("hello") ==
-              BasicStringPiece<TypeParam>(str.c_str(), 5));
-  ASSERT_EQ(
-      empty,
-      BasicStringPiece<TypeParam>(
-          str.c_str(),
-          static_cast<typename BasicStringPiece<TypeParam>::size_type>(0)));
-  ASSERT_EQ(empty, BasicStringPiece<TypeParam>(nullptr));
-  ASSERT_TRUE(
-      empty ==
-      BasicStringPiece<TypeParam>(
-          nullptr,
-          static_cast<typename BasicStringPiece<TypeParam>::size_type>(0)));
-  ASSERT_EQ(empty, BasicStringPiece<TypeParam>());
-  ASSERT_EQ(str, BasicStringPiece<TypeParam>(str.begin(), str.end()));
-  ASSERT_EQ(empty, BasicStringPiece<TypeParam>(str.begin(), str.begin()));
-  ASSERT_EQ(empty, BasicStringPiece<TypeParam>(empty));
-  ASSERT_EQ(empty, BasicStringPiece<TypeParam>(empty.begin(), empty.end()));
-}
-
-TEST(StringPieceTest, ConstexprCtor) {
-  {
-    constexpr StringPiece piece;
-    std::ignore = piece;
-  }
-
-  {
-    constexpr StringPiece piece("abc");
-    std::ignore = piece;
-  }
-
-  {
-    constexpr StringPiece piece("abc", 2);
-    std::ignore = piece;
-  }
-}
-
-TEST(StringPieceTest, ConstexprData) {
-  {
-    constexpr StringPiece piece;
-    static_assert(piece.data() == nullptr, "");
-  }
-
-  {
-    constexpr StringPiece piece("abc");
-    static_assert(piece.data()[0] == 'a', "");
-    static_assert(piece.data()[1] == 'b', "");
-    static_assert(piece.data()[2] == 'c', "");
-  }
-
-  {
-    constexpr StringPiece piece("def", 2);
-    static_assert(piece.data()[0] == 'd', "");
-    static_assert(piece.data()[1] == 'e', "");
-  }
-}
-
-TEST(StringPieceTest, ConstexprSize) {
-  {
-    constexpr StringPiece piece;
-    static_assert(piece.size() == 0, "");
-  }
-
-  {
-    constexpr StringPiece piece("abc");
-    static_assert(piece.size() == 3, "");
-  }
-
-  {
-    constexpr StringPiece piece("def", 2);
-    static_assert(piece.size() == 2, "");
-  }
-}
-
-TEST(StringPieceTest, Compare) {
-  constexpr StringPiece piece = "def";
-
-  static_assert(piece.compare("ab") == 1, "");
-  static_assert(piece.compare("abc") == 1, "");
-  static_assert(piece.compare("abcd") == 1, "");
-  static_assert(piece.compare("de") == 1, "");
-  static_assert(piece.compare("def") == 0, "");
-  static_assert(piece.compare("defg") == -1, "");
-  static_assert(piece.compare("gh") == -1, "");
-  static_assert(piece.compare("ghi") == -1, "");
-  static_assert(piece.compare("ghij") == -1, "");
-}
-
-TEST(StringPieceTest, StartsWith) {
-  constexpr StringPiece piece("abc");
-
-  static_assert(piece.starts_with(""), "");
-  static_assert(piece.starts_with("a"), "");
-  static_assert(piece.starts_with("ab"), "");
-  static_assert(piece.starts_with("abc"), "");
-
-  static_assert(!piece.starts_with("b"), "");
-  static_assert(!piece.starts_with("bc"), "");
-
-  static_assert(!piece.starts_with("abcd"), "");
-}
-
-TEST(StringPieceTest, EndsWith) {
-  constexpr StringPiece piece("abc");
-
-  static_assert(piece.ends_with(""), "");
-  static_assert(piece.ends_with("c"), "");
-  static_assert(piece.ends_with("bc"), "");
-  static_assert(piece.ends_with("abc"), "");
-
-  static_assert(!piece.ends_with("a"), "");
-  static_assert(!piece.ends_with("ab"), "");
-
-  static_assert(!piece.ends_with("abcd"), "");
-}
-
-}  // namespace base
diff --git a/base/strings/string_split_unittest.cc b/base/strings/string_split_unittest.cc
deleted file mode 100644
index bf09aa5..0000000
--- a/base/strings/string_split_unittest.cc
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/string_split.h"
-
-#include <stddef.h>
-
-#include "base/macros.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::ElementsAre;
-
-namespace base {
-
-class SplitStringIntoKeyValuePairsTest : public testing::Test {
- protected:
-  base::StringPairs kv_pairs;
-};
-
-TEST_F(SplitStringIntoKeyValuePairsTest, EmptyString) {
-  EXPECT_TRUE(SplitStringIntoKeyValuePairs(std::string(),
-                                           ':',  // Key-value delimiter
-                                           ',',  // Key-value pair delimiter
-                                           &kv_pairs));
-  EXPECT_TRUE(kv_pairs.empty());
-}
-
-TEST_F(SplitStringIntoKeyValuePairsTest, MissingKeyValueDelimiter) {
-  EXPECT_FALSE(SplitStringIntoKeyValuePairs("key1,key2:value2",
-                                            ':',  // Key-value delimiter
-                                            ',',  // Key-value pair delimiter
-                                            &kv_pairs));
-  ASSERT_EQ(2U, kv_pairs.size());
-  EXPECT_TRUE(kv_pairs[0].first.empty());
-  EXPECT_TRUE(kv_pairs[0].second.empty());
-  EXPECT_EQ("key2", kv_pairs[1].first);
-  EXPECT_EQ("value2", kv_pairs[1].second);
-}
-
-TEST_F(SplitStringIntoKeyValuePairsTest, EmptyKeyWithKeyValueDelimiter) {
-  EXPECT_TRUE(SplitStringIntoKeyValuePairs(":value1,key2:value2",
-                                           ':',  // Key-value delimiter
-                                           ',',  // Key-value pair delimiter
-                                           &kv_pairs));
-  ASSERT_EQ(2U, kv_pairs.size());
-  EXPECT_TRUE(kv_pairs[0].first.empty());
-  EXPECT_EQ("value1", kv_pairs[0].second);
-  EXPECT_EQ("key2", kv_pairs[1].first);
-  EXPECT_EQ("value2", kv_pairs[1].second);
-}
-
-TEST_F(SplitStringIntoKeyValuePairsTest, TrailingAndLeadingPairDelimiter) {
-  EXPECT_TRUE(SplitStringIntoKeyValuePairs(",key1:value1,key2:value2,",
-                                           ':',   // Key-value delimiter
-                                           ',',   // Key-value pair delimiter
-                                           &kv_pairs));
-  ASSERT_EQ(2U, kv_pairs.size());
-  EXPECT_EQ("key1", kv_pairs[0].first);
-  EXPECT_EQ("value1", kv_pairs[0].second);
-  EXPECT_EQ("key2", kv_pairs[1].first);
-  EXPECT_EQ("value2", kv_pairs[1].second);
-}
-
-TEST_F(SplitStringIntoKeyValuePairsTest, EmptyPair) {
-  EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1:value1,,key3:value3",
-                                           ':',   // Key-value delimiter
-                                           ',',   // Key-value pair delimiter
-                                           &kv_pairs));
-  ASSERT_EQ(2U, kv_pairs.size());
-  EXPECT_EQ("key1", kv_pairs[0].first);
-  EXPECT_EQ("value1", kv_pairs[0].second);
-  EXPECT_EQ("key3", kv_pairs[1].first);
-  EXPECT_EQ("value3", kv_pairs[1].second);
-}
-
-TEST_F(SplitStringIntoKeyValuePairsTest, EmptyValue) {
-  EXPECT_FALSE(SplitStringIntoKeyValuePairs("key1:,key2:value2",
-                                            ':',   // Key-value delimiter
-                                            ',',   // Key-value pair delimiter
-                                            &kv_pairs));
-  ASSERT_EQ(2U, kv_pairs.size());
-  EXPECT_EQ("key1", kv_pairs[0].first);
-  EXPECT_EQ("", kv_pairs[0].second);
-  EXPECT_EQ("key2", kv_pairs[1].first);
-  EXPECT_EQ("value2", kv_pairs[1].second);
-}
-
-TEST_F(SplitStringIntoKeyValuePairsTest, UntrimmedWhitespace) {
-  EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1 : value1",
-                                           ':',  // Key-value delimiter
-                                           ',',  // Key-value pair delimiter
-                                           &kv_pairs));
-  ASSERT_EQ(1U, kv_pairs.size());
-  EXPECT_EQ("key1 ", kv_pairs[0].first);
-  EXPECT_EQ(" value1", kv_pairs[0].second);
-}
-
-TEST_F(SplitStringIntoKeyValuePairsTest, TrimmedWhitespace) {
-  EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1:value1 , key2:value2",
-                                           ':',   // Key-value delimiter
-                                           ',',   // Key-value pair delimiter
-                                           &kv_pairs));
-  ASSERT_EQ(2U, kv_pairs.size());
-  EXPECT_EQ("key1", kv_pairs[0].first);
-  EXPECT_EQ("value1", kv_pairs[0].second);
-  EXPECT_EQ("key2", kv_pairs[1].first);
-  EXPECT_EQ("value2", kv_pairs[1].second);
-}
-
-TEST_F(SplitStringIntoKeyValuePairsTest, MultipleKeyValueDelimiters) {
-  EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1:::value1,key2:value2",
-                                           ':',   // Key-value delimiter
-                                           ',',   // Key-value pair delimiter
-                                           &kv_pairs));
-  ASSERT_EQ(2U, kv_pairs.size());
-  EXPECT_EQ("key1", kv_pairs[0].first);
-  EXPECT_EQ("value1", kv_pairs[0].second);
-  EXPECT_EQ("key2", kv_pairs[1].first);
-  EXPECT_EQ("value2", kv_pairs[1].second);
-}
-
-TEST_F(SplitStringIntoKeyValuePairsTest, OnlySplitAtGivenSeparator) {
-  std::string a("a ?!@#$%^&*()_+:/{}\\\t\nb");
-  EXPECT_TRUE(SplitStringIntoKeyValuePairs(a + "X" + a + "Y" + a + "X" + a,
-                                           'X',  // Key-value delimiter
-                                           'Y',  // Key-value pair delimiter
-                                           &kv_pairs));
-  ASSERT_EQ(2U, kv_pairs.size());
-  EXPECT_EQ(a, kv_pairs[0].first);
-  EXPECT_EQ(a, kv_pairs[0].second);
-  EXPECT_EQ(a, kv_pairs[1].first);
-  EXPECT_EQ(a, kv_pairs[1].second);
-}
-
-
-TEST_F(SplitStringIntoKeyValuePairsTest, DelimiterInValue) {
-  EXPECT_TRUE(SplitStringIntoKeyValuePairs("key1:va:ue1,key2:value2",
-                                           ':',   // Key-value delimiter
-                                           ',',   // Key-value pair delimiter
-                                           &kv_pairs));
-  ASSERT_EQ(2U, kv_pairs.size());
-  EXPECT_EQ("key1", kv_pairs[0].first);
-  EXPECT_EQ("va:ue1", kv_pairs[0].second);
-  EXPECT_EQ("key2", kv_pairs[1].first);
-  EXPECT_EQ("value2", kv_pairs[1].second);
-}
-
-TEST(SplitStringUsingSubstrTest, EmptyString) {
-  std::vector<std::string> results = SplitStringUsingSubstr(
-      std::string(), "DELIMITER", TRIM_WHITESPACE, SPLIT_WANT_ALL);
-  ASSERT_EQ(1u, results.size());
-  EXPECT_THAT(results, ElementsAre(""));
-}
-
-TEST(StringUtilTest, SplitString_Basics) {
-  std::vector<std::string> r;
-
-  r = SplitString(std::string(), ",:;", KEEP_WHITESPACE, SPLIT_WANT_ALL);
-  EXPECT_TRUE(r.empty());
-
-  // Empty separator list
-  r = SplitString("hello, world", "", KEEP_WHITESPACE, SPLIT_WANT_ALL);
-  ASSERT_EQ(1u, r.size());
-  EXPECT_EQ("hello, world", r[0]);
-
-  // Should split on any of the separators.
-  r = SplitString("::,,;;", ",:;", KEEP_WHITESPACE, SPLIT_WANT_ALL);
-  ASSERT_EQ(7u, r.size());
-  for (auto str : r)
-    ASSERT_TRUE(str.empty());
-
-  r = SplitString("red, green; blue:", ",:;", TRIM_WHITESPACE,
-                  SPLIT_WANT_NONEMPTY);
-  ASSERT_EQ(3u, r.size());
-  EXPECT_EQ("red", r[0]);
-  EXPECT_EQ("green", r[1]);
-  EXPECT_EQ("blue", r[2]);
-
-  // Want to split a string along whitespace sequences.
-  r = SplitString("  red green   \tblue\n", " \t\n", TRIM_WHITESPACE,
-                  SPLIT_WANT_NONEMPTY);
-  ASSERT_EQ(3u, r.size());
-  EXPECT_EQ("red", r[0]);
-  EXPECT_EQ("green", r[1]);
-  EXPECT_EQ("blue", r[2]);
-
-  // Weird case of splitting on spaces but not trimming.
-  r = SplitString(" red ", " ", TRIM_WHITESPACE, SPLIT_WANT_ALL);
-  ASSERT_EQ(3u, r.size());
-  EXPECT_EQ("", r[0]);  // Before the first space.
-  EXPECT_EQ("red", r[1]);
-  EXPECT_EQ("", r[2]);  // After the last space.
-}
-
-TEST(StringUtilTest, SplitString_WhitespaceAndResultType) {
-  std::vector<std::string> r;
-
-  // Empty input handling.
-  r = SplitString(std::string(), ",", KEEP_WHITESPACE, SPLIT_WANT_ALL);
-  EXPECT_TRUE(r.empty());
-  r = SplitString(std::string(), ",", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY);
-  EXPECT_TRUE(r.empty());
-
-  // Input string is space and we're trimming.
-  r = SplitString(" ", ",", TRIM_WHITESPACE, SPLIT_WANT_ALL);
-  ASSERT_EQ(1u, r.size());
-  EXPECT_EQ("", r[0]);
-  r = SplitString(" ", ",", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
-  EXPECT_TRUE(r.empty());
-
-  // Test all 4 combinations of flags on ", ,".
-  r = SplitString(", ,", ",", KEEP_WHITESPACE, SPLIT_WANT_ALL);
-  ASSERT_EQ(3u, r.size());
-  EXPECT_EQ("", r[0]);
-  EXPECT_EQ(" ", r[1]);
-  EXPECT_EQ("", r[2]);
-  r = SplitString(", ,", ",", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY);
-  ASSERT_EQ(1u, r.size());
-  ASSERT_EQ(" ", r[0]);
-  r = SplitString(", ,", ",", TRIM_WHITESPACE, SPLIT_WANT_ALL);
-  ASSERT_EQ(3u, r.size());
-  EXPECT_EQ("", r[0]);
-  EXPECT_EQ("", r[1]);
-  EXPECT_EQ("", r[2]);
-  r = SplitString(", ,", ",", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
-  ASSERT_TRUE(r.empty());
-}
-
-TEST(SplitStringUsingSubstrTest, StringWithNoDelimiter) {
-  std::vector<std::string> results = SplitStringUsingSubstr(
-      "alongwordwithnodelimiter", "DELIMITER", TRIM_WHITESPACE,
-      SPLIT_WANT_ALL);
-  ASSERT_EQ(1u, results.size());
-  EXPECT_THAT(results, ElementsAre("alongwordwithnodelimiter"));
-}
-
-TEST(SplitStringUsingSubstrTest, LeadingDelimitersSkipped) {
-  std::vector<std::string> results = SplitStringUsingSubstr(
-      "DELIMITERDELIMITERDELIMITERoneDELIMITERtwoDELIMITERthree",
-      "DELIMITER", TRIM_WHITESPACE, SPLIT_WANT_ALL);
-  ASSERT_EQ(6u, results.size());
-  EXPECT_THAT(results, ElementsAre("", "", "", "one", "two", "three"));
-}
-
-TEST(SplitStringUsingSubstrTest, ConsecutiveDelimitersSkipped) {
-  std::vector<std::string> results = SplitStringUsingSubstr(
-      "unoDELIMITERDELIMITERDELIMITERdosDELIMITERtresDELIMITERDELIMITERcuatro",
-      "DELIMITER", TRIM_WHITESPACE, SPLIT_WANT_ALL);
-  ASSERT_EQ(7u, results.size());
-  EXPECT_THAT(results, ElementsAre("uno", "", "", "dos", "tres", "", "cuatro"));
-}
-
-TEST(SplitStringUsingSubstrTest, TrailingDelimitersSkipped) {
-  std::vector<std::string> results = SplitStringUsingSubstr(
-      "unDELIMITERdeuxDELIMITERtroisDELIMITERquatreDELIMITERDELIMITERDELIMITER",
-      "DELIMITER", TRIM_WHITESPACE, SPLIT_WANT_ALL);
-  ASSERT_EQ(7u, results.size());
-  EXPECT_THAT(
-      results, ElementsAre("un", "deux", "trois", "quatre", "", "", ""));
-}
-
-TEST(SplitStringPieceUsingSubstrTest, StringWithNoDelimiter) {
-  std::vector<base::StringPiece> results =
-      SplitStringPieceUsingSubstr("alongwordwithnodelimiter", "DELIMITER",
-                                  base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  ASSERT_EQ(1u, results.size());
-  EXPECT_THAT(results, ElementsAre("alongwordwithnodelimiter"));
-}
-
-TEST(SplitStringPieceUsingSubstrTest, LeadingDelimitersSkipped) {
-  std::vector<base::StringPiece> results = SplitStringPieceUsingSubstr(
-      "DELIMITERDELIMITERDELIMITERoneDELIMITERtwoDELIMITERthree", "DELIMITER",
-      base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  ASSERT_EQ(6u, results.size());
-  EXPECT_THAT(results, ElementsAre("", "", "", "one", "two", "three"));
-}
-
-TEST(SplitStringPieceUsingSubstrTest, ConsecutiveDelimitersSkipped) {
-  std::vector<base::StringPiece> results = SplitStringPieceUsingSubstr(
-      "unoDELIMITERDELIMITERDELIMITERdosDELIMITERtresDELIMITERDELIMITERcuatro",
-      "DELIMITER", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  ASSERT_EQ(7u, results.size());
-  EXPECT_THAT(results, ElementsAre("uno", "", "", "dos", "tres", "", "cuatro"));
-}
-
-TEST(SplitStringPieceUsingSubstrTest, TrailingDelimitersSkipped) {
-  std::vector<base::StringPiece> results = SplitStringPieceUsingSubstr(
-      "unDELIMITERdeuxDELIMITERtroisDELIMITERquatreDELIMITERDELIMITERDELIMITER",
-      "DELIMITER", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  ASSERT_EQ(7u, results.size());
-  EXPECT_THAT(results,
-              ElementsAre("un", "deux", "trois", "quatre", "", "", ""));
-}
-
-TEST(SplitStringPieceUsingSubstrTest, KeepWhitespace) {
-  std::vector<base::StringPiece> results = SplitStringPieceUsingSubstr(
-      "un DELIMITERdeux\tDELIMITERtrois\nDELIMITERquatre", "DELIMITER",
-      base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-  ASSERT_EQ(4u, results.size());
-  EXPECT_THAT(results, ElementsAre("un ", "deux\t", "trois\n", "quatre"));
-}
-
-TEST(SplitStringPieceUsingSubstrTest, TrimWhitespace) {
-  std::vector<base::StringPiece> results = SplitStringPieceUsingSubstr(
-      "un DELIMITERdeux\tDELIMITERtrois\nDELIMITERquatre", "DELIMITER",
-      base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  ASSERT_EQ(4u, results.size());
-  EXPECT_THAT(results, ElementsAre("un", "deux", "trois", "quatre"));
-}
-
-TEST(SplitStringPieceUsingSubstrTest, SplitWantAll) {
-  std::vector<base::StringPiece> results = SplitStringPieceUsingSubstr(
-      "unDELIMITERdeuxDELIMITERtroisDELIMITERDELIMITER", "DELIMITER",
-      base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  ASSERT_EQ(5u, results.size());
-  EXPECT_THAT(results, ElementsAre("un", "deux", "trois", "", ""));
-}
-
-TEST(SplitStringPieceUsingSubstrTest, SplitWantNonEmpty) {
-  std::vector<base::StringPiece> results = SplitStringPieceUsingSubstr(
-      "unDELIMITERdeuxDELIMITERtroisDELIMITERDELIMITER", "DELIMITER",
-      base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
-  ASSERT_EQ(3u, results.size());
-  EXPECT_THAT(results, ElementsAre("un", "deux", "trois"));
-}
-
-TEST(StringSplitTest, StringSplitKeepWhitespace) {
-  std::vector<std::string> r;
-
-  r = SplitString("   ", "*", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
-  ASSERT_EQ(1U, r.size());
-  EXPECT_EQ(r[0], "   ");
-
-  r = SplitString("\t  \ta\t ", "\t", base::KEEP_WHITESPACE,
-                  base::SPLIT_WANT_ALL);
-  ASSERT_EQ(4U, r.size());
-  EXPECT_EQ(r[0], "");
-  EXPECT_EQ(r[1], "  ");
-  EXPECT_EQ(r[2], "a");
-  EXPECT_EQ(r[3], " ");
-
-  r = SplitString("\ta\t\nb\tcc", "\n", base::KEEP_WHITESPACE,
-                  base::SPLIT_WANT_ALL);
-  ASSERT_EQ(2U, r.size());
-  EXPECT_EQ(r[0], "\ta\t");
-  EXPECT_EQ(r[1], "b\tcc");
-}
-
-TEST(StringSplitTest, SplitStringAlongWhitespace) {
-  struct TestData {
-    const char* input;
-    const size_t expected_result_count;
-    const char* output1;
-    const char* output2;
-  } data[] = {
-    { "a",       1, "a",  ""   },
-    { " ",       0, "",   ""   },
-    { " a",      1, "a",  ""   },
-    { " ab ",    1, "ab", ""   },
-    { " ab c",   2, "ab", "c"  },
-    { " ab c ",  2, "ab", "c"  },
-    { " ab cd",  2, "ab", "cd" },
-    { " ab cd ", 2, "ab", "cd" },
-    { " \ta\t",  1, "a",  ""   },
-    { " b\ta\t", 2, "b",  "a"  },
-    { " b\tat",  2, "b",  "at" },
-    { "b\tat",   2, "b",  "at" },
-    { "b\t at",  2, "b",  "at" },
-  };
-  for (size_t i = 0; i < arraysize(data); ++i) {
-    std::vector<std::string> results = base::SplitString(
-        data[i].input, kWhitespaceASCII, base::KEEP_WHITESPACE,
-        base::SPLIT_WANT_NONEMPTY);
-    ASSERT_EQ(data[i].expected_result_count, results.size());
-    if (data[i].expected_result_count > 0)
-      ASSERT_EQ(data[i].output1, results[0]);
-    if (data[i].expected_result_count > 1)
-      ASSERT_EQ(data[i].output2, results[1]);
-  }
-}
-
-}  // namespace base
diff --git a/base/strings/string_tokenizer_unittest.cc b/base/strings/string_tokenizer_unittest.cc
deleted file mode 100644
index d391845..0000000
--- a/base/strings/string_tokenizer_unittest.cc
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/string_tokenizer.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-using std::string;
-
-namespace base {
-
-namespace {
-
-TEST(StringTokenizerTest, Simple) {
-  string input = "this is a test";
-  StringTokenizer t(input, " ");
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("this"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("is"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("a"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("test"), t.token());
-
-  EXPECT_FALSE(t.GetNext());
-}
-
-TEST(StringTokenizerTest, Reset) {
-  string input = "this is a test";
-  StringTokenizer t(input, " ");
-
-  for (int i = 0; i < 2; ++i) {
-    EXPECT_TRUE(t.GetNext());
-    EXPECT_EQ(string("this"), t.token());
-
-    EXPECT_TRUE(t.GetNext());
-    EXPECT_EQ(string("is"), t.token());
-
-    EXPECT_TRUE(t.GetNext());
-    EXPECT_EQ(string("a"), t.token());
-
-    EXPECT_TRUE(t.GetNext());
-    EXPECT_EQ(string("test"), t.token());
-
-    EXPECT_FALSE(t.GetNext());
-    t.Reset();
-  }
-}
-
-TEST(StringTokenizerTest, RetDelims) {
-  string input = "this is a test";
-  StringTokenizer t(input, " ");
-  t.set_options(StringTokenizer::RETURN_DELIMS);
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("this"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string(" "), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("is"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string(" "), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("a"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string(" "), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("test"), t.token());
-
-  EXPECT_FALSE(t.GetNext());
-}
-
-TEST(StringTokenizerTest, ManyDelims) {
-  string input = "this: is, a-test";
-  StringTokenizer t(input, ": ,-");
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("this"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("is"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("a"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("test"), t.token());
-
-  EXPECT_FALSE(t.GetNext());
-}
-
-TEST(StringTokenizerTest, ParseHeader) {
-  string input = "Content-Type: text/html ; charset=UTF-8";
-  StringTokenizer t(input, ": ;=");
-  t.set_options(StringTokenizer::RETURN_DELIMS);
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_FALSE(t.token_is_delim());
-  EXPECT_EQ(string("Content-Type"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_TRUE(t.token_is_delim());
-  EXPECT_EQ(string(":"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_TRUE(t.token_is_delim());
-  EXPECT_EQ(string(" "), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_FALSE(t.token_is_delim());
-  EXPECT_EQ(string("text/html"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_TRUE(t.token_is_delim());
-  EXPECT_EQ(string(" "), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_TRUE(t.token_is_delim());
-  EXPECT_EQ(string(";"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_TRUE(t.token_is_delim());
-  EXPECT_EQ(string(" "), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_FALSE(t.token_is_delim());
-  EXPECT_EQ(string("charset"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_TRUE(t.token_is_delim());
-  EXPECT_EQ(string("="), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_FALSE(t.token_is_delim());
-  EXPECT_EQ(string("UTF-8"), t.token());
-
-  EXPECT_FALSE(t.GetNext());
-  EXPECT_FALSE(t.token_is_delim());
-}
-
-TEST(StringTokenizerTest, ParseQuotedString) {
-  string input = "foo bar 'hello world' baz";
-  StringTokenizer t(input, " ");
-  t.set_quote_chars("'");
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("foo"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("bar"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("'hello world'"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("baz"), t.token());
-
-  EXPECT_FALSE(t.GetNext());
-}
-
-TEST(StringTokenizerTest, ParseQuotedString_Malformed) {
-  string input = "bar 'hello wo";
-  StringTokenizer t(input, " ");
-  t.set_quote_chars("'");
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("bar"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("'hello wo"), t.token());
-
-  EXPECT_FALSE(t.GetNext());
-}
-
-TEST(StringTokenizerTest, ParseQuotedString_Multiple) {
-  string input = "bar 'hel\"lo\" wo' baz\"";
-  StringTokenizer t(input, " ");
-  t.set_quote_chars("'\"");
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("bar"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("'hel\"lo\" wo'"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("baz\""), t.token());
-
-  EXPECT_FALSE(t.GetNext());
-}
-
-TEST(StringTokenizerTest, ParseQuotedString_EscapedQuotes) {
-  string input = "foo 'don\\'t do that'";
-  StringTokenizer t(input, " ");
-  t.set_quote_chars("'");
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("foo"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("'don\\'t do that'"), t.token());
-
-  EXPECT_FALSE(t.GetNext());
-}
-
-TEST(StringTokenizerTest, ParseQuotedString_EscapedQuotes2) {
-  string input = "foo='a, b', bar";
-  StringTokenizer t(input, ", ");
-  t.set_quote_chars("'");
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("foo='a, b'"), t.token());
-
-  EXPECT_TRUE(t.GetNext());
-  EXPECT_EQ(string("bar"), t.token());
-
-  EXPECT_FALSE(t.GetNext());
-}
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/strings/string_util_unittest.cc b/base/strings/string_util_unittest.cc
deleted file mode 100644
index 509889e..0000000
--- a/base/strings/string_util_unittest.cc
+++ /dev/null
@@ -1,1379 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/string_util.h"
-
-#include <math.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::ElementsAre;
-
-namespace base {
-
-static const struct trim_case {
-  const wchar_t* input;
-  const TrimPositions positions;
-  const wchar_t* output;
-  const TrimPositions return_value;
-} trim_cases[] = {
-  {L" Google Video ", TRIM_LEADING, L"Google Video ", TRIM_LEADING},
-  {L" Google Video ", TRIM_TRAILING, L" Google Video", TRIM_TRAILING},
-  {L" Google Video ", TRIM_ALL, L"Google Video", TRIM_ALL},
-  {L"Google Video", TRIM_ALL, L"Google Video", TRIM_NONE},
-  {L"", TRIM_ALL, L"", TRIM_NONE},
-  {L"  ", TRIM_LEADING, L"", TRIM_LEADING},
-  {L"  ", TRIM_TRAILING, L"", TRIM_TRAILING},
-  {L"  ", TRIM_ALL, L"", TRIM_ALL},
-  {L"\t\rTest String\n", TRIM_ALL, L"Test String", TRIM_ALL},
-  {L"\x2002Test String\x00A0\x3000", TRIM_ALL, L"Test String", TRIM_ALL},
-};
-
-static const struct trim_case_ascii {
-  const char* input;
-  const TrimPositions positions;
-  const char* output;
-  const TrimPositions return_value;
-} trim_cases_ascii[] = {
-  {" Google Video ", TRIM_LEADING, "Google Video ", TRIM_LEADING},
-  {" Google Video ", TRIM_TRAILING, " Google Video", TRIM_TRAILING},
-  {" Google Video ", TRIM_ALL, "Google Video", TRIM_ALL},
-  {"Google Video", TRIM_ALL, "Google Video", TRIM_NONE},
-  {"", TRIM_ALL, "", TRIM_NONE},
-  {"  ", TRIM_LEADING, "", TRIM_LEADING},
-  {"  ", TRIM_TRAILING, "", TRIM_TRAILING},
-  {"  ", TRIM_ALL, "", TRIM_ALL},
-  {"\t\rTest String\n", TRIM_ALL, "Test String", TRIM_ALL},
-};
-
-namespace {
-
-// Helper used to test TruncateUTF8ToByteSize.
-bool Truncated(const std::string& input,
-               const size_t byte_size,
-               std::string* output) {
-    size_t prev = input.length();
-    TruncateUTF8ToByteSize(input, byte_size, output);
-    return prev != output->length();
-}
-
-}  // namespace
-
-TEST(StringUtilTest, TruncateUTF8ToByteSize) {
-  std::string output;
-
-  // Empty strings and invalid byte_size arguments
-  EXPECT_FALSE(Truncated(std::string(), 0, &output));
-  EXPECT_EQ(output, "");
-  EXPECT_TRUE(Truncated("\xe1\x80\xbf", 0, &output));
-  EXPECT_EQ(output, "");
-  EXPECT_FALSE(Truncated("\xe1\x80\xbf", static_cast<size_t>(-1), &output));
-  EXPECT_FALSE(Truncated("\xe1\x80\xbf", 4, &output));
-
-  // Testing the truncation of valid UTF8 correctly
-  EXPECT_TRUE(Truncated("abc", 2, &output));
-  EXPECT_EQ(output, "ab");
-  EXPECT_TRUE(Truncated("\xc2\x81\xc2\x81", 2, &output));
-  EXPECT_EQ(output.compare("\xc2\x81"), 0);
-  EXPECT_TRUE(Truncated("\xc2\x81\xc2\x81", 3, &output));
-  EXPECT_EQ(output.compare("\xc2\x81"), 0);
-  EXPECT_FALSE(Truncated("\xc2\x81\xc2\x81", 4, &output));
-  EXPECT_EQ(output.compare("\xc2\x81\xc2\x81"), 0);
-
-  {
-    const char array[] = "\x00\x00\xc2\x81\xc2\x81";
-    const std::string array_string(array, arraysize(array));
-    EXPECT_TRUE(Truncated(array_string, 4, &output));
-    EXPECT_EQ(output.compare(std::string("\x00\x00\xc2\x81", 4)), 0);
-  }
-
-  {
-    const char array[] = "\x00\xc2\x81\xc2\x81";
-    const std::string array_string(array, arraysize(array));
-    EXPECT_TRUE(Truncated(array_string, 4, &output));
-    EXPECT_EQ(output.compare(std::string("\x00\xc2\x81", 3)), 0);
-  }
-
-  // Testing invalid UTF8
-  EXPECT_TRUE(Truncated("\xed\xa0\x80\xed\xbf\xbf", 6, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xed\xa0\x8f", 3, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xed\xbf\xbf", 3, &output));
-  EXPECT_EQ(output.compare(""), 0);
-
-  // Testing invalid UTF8 mixed with valid UTF8
-  EXPECT_FALSE(Truncated("\xe1\x80\xbf", 3, &output));
-  EXPECT_EQ(output.compare("\xe1\x80\xbf"), 0);
-  EXPECT_FALSE(Truncated("\xf1\x80\xa0\xbf", 4, &output));
-  EXPECT_EQ(output.compare("\xf1\x80\xa0\xbf"), 0);
-  EXPECT_FALSE(Truncated("a\xc2\x81\xe1\x80\xbf\xf1\x80\xa0\xbf",
-              10, &output));
-  EXPECT_EQ(output.compare("a\xc2\x81\xe1\x80\xbf\xf1\x80\xa0\xbf"), 0);
-  EXPECT_TRUE(Truncated("a\xc2\x81\xe1\x80\xbf\xf1""a""\x80\xa0",
-              10, &output));
-  EXPECT_EQ(output.compare("a\xc2\x81\xe1\x80\xbf\xf1""a"), 0);
-  EXPECT_FALSE(Truncated("\xef\xbb\xbf" "abc", 6, &output));
-  EXPECT_EQ(output.compare("\xef\xbb\xbf" "abc"), 0);
-
-  // Overlong sequences
-  EXPECT_TRUE(Truncated("\xc0\x80", 2, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xc1\x80\xc1\x81", 4, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xe0\x80\x80", 3, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xe0\x82\x80", 3, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xe0\x9f\xbf", 3, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xf0\x80\x80\x8D", 4, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xf0\x80\x82\x91", 4, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xf0\x80\xa0\x80", 4, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xf0\x8f\xbb\xbf", 4, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xf8\x80\x80\x80\xbf", 5, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xfc\x80\x80\x80\xa0\xa5", 6, &output));
-  EXPECT_EQ(output.compare(""), 0);
-
-  // Beyond U+10FFFF (the upper limit of Unicode codespace)
-  EXPECT_TRUE(Truncated("\xf4\x90\x80\x80", 4, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xf8\xa0\xbf\x80\xbf", 5, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xfc\x9c\xbf\x80\xbf\x80", 6, &output));
-  EXPECT_EQ(output.compare(""), 0);
-
-  // BOMs in UTF-16(BE|LE) and UTF-32(BE|LE)
-  EXPECT_TRUE(Truncated("\xfe\xff", 2, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xff\xfe", 2, &output));
-  EXPECT_EQ(output.compare(""), 0);
-
-  {
-    const char array[] = "\x00\x00\xfe\xff";
-    const std::string array_string(array, arraysize(array));
-    EXPECT_TRUE(Truncated(array_string, 4, &output));
-    EXPECT_EQ(output.compare(std::string("\x00\x00", 2)), 0);
-  }
-
-  // Variants on the previous test
-  {
-    const char array[] = "\xff\xfe\x00\x00";
-    const std::string array_string(array, 4);
-    EXPECT_FALSE(Truncated(array_string, 4, &output));
-    EXPECT_EQ(output.compare(std::string("\xff\xfe\x00\x00", 4)), 0);
-  }
-  {
-    const char array[] = "\xff\x00\x00\xfe";
-    const std::string array_string(array, arraysize(array));
-    EXPECT_TRUE(Truncated(array_string, 4, &output));
-    EXPECT_EQ(output.compare(std::string("\xff\x00\x00", 3)), 0);
-  }
-
-  // Non-characters : U+xxFFF[EF] where xx is 0x00 through 0x10 and <FDD0,FDEF>
-  EXPECT_TRUE(Truncated("\xef\xbf\xbe", 3, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xf0\x8f\xbf\xbe", 4, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xf3\xbf\xbf\xbf", 4, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xef\xb7\x90", 3, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_TRUE(Truncated("\xef\xb7\xaf", 3, &output));
-  EXPECT_EQ(output.compare(""), 0);
-
-  // Strings in legacy encodings that are valid in UTF-8, but
-  // are invalid as UTF-8 in real data.
-  EXPECT_TRUE(Truncated("caf\xe9", 4, &output));
-  EXPECT_EQ(output.compare("caf"), 0);
-  EXPECT_TRUE(Truncated("\xb0\xa1\xb0\xa2", 4, &output));
-  EXPECT_EQ(output.compare(""), 0);
-  EXPECT_FALSE(Truncated("\xa7\x41\xa6\x6e", 4, &output));
-  EXPECT_EQ(output.compare("\xa7\x41\xa6\x6e"), 0);
-  EXPECT_TRUE(Truncated("\xa7\x41\xa6\x6e\xd9\xee\xe4\xee", 7,
-              &output));
-  EXPECT_EQ(output.compare("\xa7\x41\xa6\x6e"), 0);
-
-  // Testing using the same string as input and output.
-  EXPECT_FALSE(Truncated(output, 4, &output));
-  EXPECT_EQ(output.compare("\xa7\x41\xa6\x6e"), 0);
-  EXPECT_TRUE(Truncated(output, 3, &output));
-  EXPECT_EQ(output.compare("\xa7\x41"), 0);
-
-  // "abc" with U+201[CD] in windows-125[0-8]
-  EXPECT_TRUE(Truncated("\x93" "abc\x94", 5, &output));
-  EXPECT_EQ(output.compare("\x93" "abc"), 0);
-
-  // U+0639 U+064E U+0644 U+064E in ISO-8859-6
-  EXPECT_TRUE(Truncated("\xd9\xee\xe4\xee", 4, &output));
-  EXPECT_EQ(output.compare(""), 0);
-
-  // U+03B3 U+03B5 U+03B9 U+03AC in ISO-8859-7
-  EXPECT_TRUE(Truncated("\xe3\xe5\xe9\xdC", 4, &output));
-  EXPECT_EQ(output.compare(""), 0);
-}
-
-TEST(StringUtilTest, TrimWhitespace) {
-  string16 output;  // Allow contents to carry over to next testcase
-  for (size_t i = 0; i < arraysize(trim_cases); ++i) {
-    const trim_case& value = trim_cases[i];
-    EXPECT_EQ(value.return_value,
-              TrimWhitespace(WideToUTF16(value.input), value.positions,
-                             &output));
-    EXPECT_EQ(WideToUTF16(value.output), output);
-  }
-
-  // Test that TrimWhitespace() can take the same string for input and output
-  output = ASCIIToUTF16("  This is a test \r\n");
-  EXPECT_EQ(TRIM_ALL, TrimWhitespace(output, TRIM_ALL, &output));
-  EXPECT_EQ(ASCIIToUTF16("This is a test"), output);
-
-  // Once more, but with a string of whitespace
-  output = ASCIIToUTF16("  \r\n");
-  EXPECT_EQ(TRIM_ALL, TrimWhitespace(output, TRIM_ALL, &output));
-  EXPECT_EQ(string16(), output);
-
-  std::string output_ascii;
-  for (size_t i = 0; i < arraysize(trim_cases_ascii); ++i) {
-    const trim_case_ascii& value = trim_cases_ascii[i];
-    EXPECT_EQ(value.return_value,
-              TrimWhitespaceASCII(value.input, value.positions, &output_ascii));
-    EXPECT_EQ(value.output, output_ascii);
-  }
-}
-
-static const struct collapse_case {
-  const wchar_t* input;
-  const bool trim;
-  const wchar_t* output;
-} collapse_cases[] = {
-  {L" Google Video ", false, L"Google Video"},
-  {L"Google Video", false, L"Google Video"},
-  {L"", false, L""},
-  {L"  ", false, L""},
-  {L"\t\rTest String\n", false, L"Test String"},
-  {L"\x2002Test String\x00A0\x3000", false, L"Test String"},
-  {L"    Test     \n  \t String    ", false, L"Test String"},
-  {L"\x2002Test\x1680 \x2028 \tString\x00A0\x3000", false, L"Test String"},
-  {L"   Test String", false, L"Test String"},
-  {L"Test String    ", false, L"Test String"},
-  {L"Test String", false, L"Test String"},
-  {L"", true, L""},
-  {L"\n", true, L""},
-  {L"  \r  ", true, L""},
-  {L"\nFoo", true, L"Foo"},
-  {L"\r  Foo  ", true, L"Foo"},
-  {L" Foo bar ", true, L"Foo bar"},
-  {L"  \tFoo  bar  \n", true, L"Foo bar"},
-  {L" a \r b\n c \r\n d \t\re \t f \n ", true, L"abcde f"},
-};
-
-TEST(StringUtilTest, CollapseWhitespace) {
-  for (size_t i = 0; i < arraysize(collapse_cases); ++i) {
-    const collapse_case& value = collapse_cases[i];
-    EXPECT_EQ(WideToUTF16(value.output),
-              CollapseWhitespace(WideToUTF16(value.input), value.trim));
-  }
-}
-
-static const struct collapse_case_ascii {
-  const char* input;
-  const bool trim;
-  const char* output;
-} collapse_cases_ascii[] = {
-  {" Google Video ", false, "Google Video"},
-  {"Google Video", false, "Google Video"},
-  {"", false, ""},
-  {"  ", false, ""},
-  {"\t\rTest String\n", false, "Test String"},
-  {"    Test     \n  \t String    ", false, "Test String"},
-  {"   Test String", false, "Test String"},
-  {"Test String    ", false, "Test String"},
-  {"Test String", false, "Test String"},
-  {"", true, ""},
-  {"\n", true, ""},
-  {"  \r  ", true, ""},
-  {"\nFoo", true, "Foo"},
-  {"\r  Foo  ", true, "Foo"},
-  {" Foo bar ", true, "Foo bar"},
-  {"  \tFoo  bar  \n", true, "Foo bar"},
-  {" a \r b\n c \r\n d \t\re \t f \n ", true, "abcde f"},
-};
-
-TEST(StringUtilTest, CollapseWhitespaceASCII) {
-  for (size_t i = 0; i < arraysize(collapse_cases_ascii); ++i) {
-    const collapse_case_ascii& value = collapse_cases_ascii[i];
-    EXPECT_EQ(value.output, CollapseWhitespaceASCII(value.input, value.trim));
-  }
-}
-
-TEST(StringUtilTest, IsStringUTF8) {
-  EXPECT_TRUE(IsStringUTF8("abc"));
-  EXPECT_TRUE(IsStringUTF8("\xc2\x81"));
-  EXPECT_TRUE(IsStringUTF8("\xe1\x80\xbf"));
-  EXPECT_TRUE(IsStringUTF8("\xf1\x80\xa0\xbf"));
-  EXPECT_TRUE(IsStringUTF8("a\xc2\x81\xe1\x80\xbf\xf1\x80\xa0\xbf"));
-  EXPECT_TRUE(IsStringUTF8("\xef\xbb\xbf" "abc"));  // UTF-8 BOM
-
-  // surrogate code points
-  EXPECT_FALSE(IsStringUTF8("\xed\xa0\x80\xed\xbf\xbf"));
-  EXPECT_FALSE(IsStringUTF8("\xed\xa0\x8f"));
-  EXPECT_FALSE(IsStringUTF8("\xed\xbf\xbf"));
-
-  // overlong sequences
-  EXPECT_FALSE(IsStringUTF8("\xc0\x80"));  // U+0000
-  EXPECT_FALSE(IsStringUTF8("\xc1\x80\xc1\x81"));  // "AB"
-  EXPECT_FALSE(IsStringUTF8("\xe0\x80\x80"));  // U+0000
-  EXPECT_FALSE(IsStringUTF8("\xe0\x82\x80"));  // U+0080
-  EXPECT_FALSE(IsStringUTF8("\xe0\x9f\xbf"));  // U+07ff
-  EXPECT_FALSE(IsStringUTF8("\xf0\x80\x80\x8D"));  // U+000D
-  EXPECT_FALSE(IsStringUTF8("\xf0\x80\x82\x91"));  // U+0091
-  EXPECT_FALSE(IsStringUTF8("\xf0\x80\xa0\x80"));  // U+0800
-  EXPECT_FALSE(IsStringUTF8("\xf0\x8f\xbb\xbf"));  // U+FEFF (BOM)
-  EXPECT_FALSE(IsStringUTF8("\xf8\x80\x80\x80\xbf"));  // U+003F
-  EXPECT_FALSE(IsStringUTF8("\xfc\x80\x80\x80\xa0\xa5"));  // U+00A5
-
-  // Beyond U+10FFFF (the upper limit of Unicode codespace)
-  EXPECT_FALSE(IsStringUTF8("\xf4\x90\x80\x80"));  // U+110000
-  EXPECT_FALSE(IsStringUTF8("\xf8\xa0\xbf\x80\xbf"));  // 5 bytes
-  EXPECT_FALSE(IsStringUTF8("\xfc\x9c\xbf\x80\xbf\x80"));  // 6 bytes
-
-  // BOMs in UTF-16(BE|LE) and UTF-32(BE|LE)
-  EXPECT_FALSE(IsStringUTF8("\xfe\xff"));
-  EXPECT_FALSE(IsStringUTF8("\xff\xfe"));
-  EXPECT_FALSE(IsStringUTF8(std::string("\x00\x00\xfe\xff", 4)));
-  EXPECT_FALSE(IsStringUTF8("\xff\xfe\x00\x00"));
-
-  // Non-characters : U+xxFFF[EF] where xx is 0x00 through 0x10 and <FDD0,FDEF>
-  EXPECT_FALSE(IsStringUTF8("\xef\xbf\xbe"));  // U+FFFE)
-  EXPECT_FALSE(IsStringUTF8("\xf0\x8f\xbf\xbe"));  // U+1FFFE
-  EXPECT_FALSE(IsStringUTF8("\xf3\xbf\xbf\xbf"));  // U+10FFFF
-  EXPECT_FALSE(IsStringUTF8("\xef\xb7\x90"));  // U+FDD0
-  EXPECT_FALSE(IsStringUTF8("\xef\xb7\xaf"));  // U+FDEF
-  // Strings in legacy encodings. We can certainly make up strings
-  // in a legacy encoding that are valid in UTF-8, but in real data,
-  // most of them are invalid as UTF-8.
-  EXPECT_FALSE(IsStringUTF8("caf\xe9"));  // cafe with U+00E9 in ISO-8859-1
-  EXPECT_FALSE(IsStringUTF8("\xb0\xa1\xb0\xa2"));  // U+AC00, U+AC001 in EUC-KR
-  EXPECT_FALSE(IsStringUTF8("\xa7\x41\xa6\x6e"));  // U+4F60 U+597D in Big5
-  // "abc" with U+201[CD] in windows-125[0-8]
-  EXPECT_FALSE(IsStringUTF8("\x93" "abc\x94"));
-  // U+0639 U+064E U+0644 U+064E in ISO-8859-6
-  EXPECT_FALSE(IsStringUTF8("\xd9\xee\xe4\xee"));
-  // U+03B3 U+03B5 U+03B9 U+03AC in ISO-8859-7
-  EXPECT_FALSE(IsStringUTF8("\xe3\xe5\xe9\xdC"));
-
-  // Check that we support Embedded Nulls. The first uses the canonical UTF-8
-  // representation, and the second uses a 2-byte sequence. The second version
-  // is invalid UTF-8 since UTF-8 states that the shortest encoding for a
-  // given codepoint must be used.
-  static const char kEmbeddedNull[] = "embedded\0null";
-  EXPECT_TRUE(IsStringUTF8(
-      std::string(kEmbeddedNull, sizeof(kEmbeddedNull))));
-  EXPECT_FALSE(IsStringUTF8("embedded\xc0\x80U+0000"));
-}
-
-TEST(StringUtilTest, IsStringASCII) {
-  static char char_ascii[] =
-      "0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF";
-  static char16 char16_ascii[] = {
-      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'A',
-      'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6',
-      '7', '8', '9', '0', 'A', 'B', 'C', 'D', 'E', 'F', 0 };
-  static std::wstring wchar_ascii(
-      L"0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF");
-
-  // Test a variety of the fragment start positions and lengths in order to make
-  // sure that bit masking in IsStringASCII works correctly.
-  // Also, test that a non-ASCII character will be detected regardless of its
-  // position inside the string.
-  {
-    const size_t string_length = arraysize(char_ascii) - 1;
-    for (size_t offset = 0; offset < 8; ++offset) {
-      for (size_t len = 0, max_len = string_length - offset; len < max_len;
-           ++len) {
-        EXPECT_TRUE(IsStringASCII(StringPiece(char_ascii + offset, len)));
-        for (size_t char_pos = offset; char_pos < len; ++char_pos) {
-          char_ascii[char_pos] |= '\x80';
-          EXPECT_FALSE(IsStringASCII(StringPiece(char_ascii + offset, len)));
-          char_ascii[char_pos] &= ~'\x80';
-        }
-      }
-    }
-  }
-
-  {
-    const size_t string_length = arraysize(char16_ascii) - 1;
-    for (size_t offset = 0; offset < 4; ++offset) {
-      for (size_t len = 0, max_len = string_length - offset; len < max_len;
-           ++len) {
-        EXPECT_TRUE(IsStringASCII(StringPiece16(char16_ascii + offset, len)));
-        for (size_t char_pos = offset; char_pos < len; ++char_pos) {
-          char16_ascii[char_pos] |= 0x80;
-          EXPECT_FALSE(
-              IsStringASCII(StringPiece16(char16_ascii + offset, len)));
-          char16_ascii[char_pos] &= ~0x80;
-          // Also test when the upper half is non-zero.
-          char16_ascii[char_pos] |= 0x100;
-          EXPECT_FALSE(
-              IsStringASCII(StringPiece16(char16_ascii + offset, len)));
-          char16_ascii[char_pos] &= ~0x100;
-        }
-      }
-    }
-  }
-
-  {
-    const size_t string_length = wchar_ascii.length();
-    for (size_t len = 0; len < string_length; ++len) {
-      EXPECT_TRUE(IsStringASCII(wchar_ascii.substr(0, len)));
-      for (size_t char_pos = 0; char_pos < len; ++char_pos) {
-        wchar_ascii[char_pos] |= 0x80;
-        EXPECT_FALSE(
-            IsStringASCII(wchar_ascii.substr(0, len)));
-        wchar_ascii[char_pos] &= ~0x80;
-        wchar_ascii[char_pos] |= 0x100;
-        EXPECT_FALSE(
-            IsStringASCII(wchar_ascii.substr(0, len)));
-        wchar_ascii[char_pos] &= ~0x100;
-#if defined(WCHAR_T_IS_UTF32)
-        wchar_ascii[char_pos] |= 0x10000;
-        EXPECT_FALSE(
-            IsStringASCII(wchar_ascii.substr(0, len)));
-        wchar_ascii[char_pos] &= ~0x10000;
-#endif  // WCHAR_T_IS_UTF32
-      }
-    }
-  }
-}
-
-TEST(StringUtilTest, ConvertASCII) {
-  static const char* const char_cases[] = {
-    "Google Video",
-    "Hello, world\n",
-    "0123ABCDwxyz \a\b\t\r\n!+,.~"
-  };
-
-  static const wchar_t* const wchar_cases[] = {
-    L"Google Video",
-    L"Hello, world\n",
-    L"0123ABCDwxyz \a\b\t\r\n!+,.~"
-  };
-
-  for (size_t i = 0; i < arraysize(char_cases); ++i) {
-    EXPECT_TRUE(IsStringASCII(char_cases[i]));
-    string16 utf16 = ASCIIToUTF16(char_cases[i]);
-    EXPECT_EQ(WideToUTF16(wchar_cases[i]), utf16);
-
-    std::string ascii = UTF16ToASCII(WideToUTF16(wchar_cases[i]));
-    EXPECT_EQ(char_cases[i], ascii);
-  }
-
-  EXPECT_FALSE(IsStringASCII("Google \x80Video"));
-
-  // Convert empty strings.
-  string16 empty16;
-  std::string empty;
-  EXPECT_EQ(empty, UTF16ToASCII(empty16));
-  EXPECT_EQ(empty16, ASCIIToUTF16(empty));
-
-  // Convert strings with an embedded NUL character.
-  const char chars_with_nul[] = "test\0string";
-  const int length_with_nul = arraysize(chars_with_nul) - 1;
-  std::string string_with_nul(chars_with_nul, length_with_nul);
-  string16 string16_with_nul = ASCIIToUTF16(string_with_nul);
-  EXPECT_EQ(static_cast<string16::size_type>(length_with_nul),
-            string16_with_nul.length());
-  std::string narrow_with_nul = UTF16ToASCII(string16_with_nul);
-  EXPECT_EQ(static_cast<std::string::size_type>(length_with_nul),
-            narrow_with_nul.length());
-  EXPECT_EQ(0, string_with_nul.compare(narrow_with_nul));
-}
-
-TEST(StringUtilTest, ToLowerASCII) {
-  EXPECT_EQ('c', ToLowerASCII('C'));
-  EXPECT_EQ('c', ToLowerASCII('c'));
-  EXPECT_EQ('2', ToLowerASCII('2'));
-
-  EXPECT_EQ(static_cast<char16>('c'), ToLowerASCII(static_cast<char16>('C')));
-  EXPECT_EQ(static_cast<char16>('c'), ToLowerASCII(static_cast<char16>('c')));
-  EXPECT_EQ(static_cast<char16>('2'), ToLowerASCII(static_cast<char16>('2')));
-
-  EXPECT_EQ("cc2", ToLowerASCII("Cc2"));
-  EXPECT_EQ(ASCIIToUTF16("cc2"), ToLowerASCII(ASCIIToUTF16("Cc2")));
-}
-
-TEST(StringUtilTest, ToUpperASCII) {
-  EXPECT_EQ('C', ToUpperASCII('C'));
-  EXPECT_EQ('C', ToUpperASCII('c'));
-  EXPECT_EQ('2', ToUpperASCII('2'));
-
-  EXPECT_EQ(static_cast<char16>('C'), ToUpperASCII(static_cast<char16>('C')));
-  EXPECT_EQ(static_cast<char16>('C'), ToUpperASCII(static_cast<char16>('c')));
-  EXPECT_EQ(static_cast<char16>('2'), ToUpperASCII(static_cast<char16>('2')));
-
-  EXPECT_EQ("CC2", ToUpperASCII("Cc2"));
-  EXPECT_EQ(ASCIIToUTF16("CC2"), ToUpperASCII(ASCIIToUTF16("Cc2")));
-}
-
-TEST(StringUtilTest, LowerCaseEqualsASCII) {
-  static const struct {
-    const char*    src_a;
-    const char*    dst;
-  } lowercase_cases[] = {
-    { "FoO", "foo" },
-    { "foo", "foo" },
-    { "FOO", "foo" },
-  };
-
-  for (size_t i = 0; i < arraysize(lowercase_cases); ++i) {
-    EXPECT_TRUE(LowerCaseEqualsASCII(ASCIIToUTF16(lowercase_cases[i].src_a),
-                                     lowercase_cases[i].dst));
-    EXPECT_TRUE(LowerCaseEqualsASCII(lowercase_cases[i].src_a,
-                                     lowercase_cases[i].dst));
-  }
-}
-
-TEST(StringUtilTest, FormatBytesUnlocalized) {
-  static const struct {
-    int64_t bytes;
-    const char* expected;
-  } cases[] = {
-    // Expected behavior: we show one post-decimal digit when we have
-    // under two pre-decimal digits, except in cases where it makes no
-    // sense (zero or bytes).
-    // Since we switch units once we cross the 1000 mark, this keeps
-    // the display of file sizes or bytes consistently around three
-    // digits.
-    {0, "0 B"},
-    {512, "512 B"},
-    {1024*1024, "1.0 MB"},
-    {1024*1024*1024, "1.0 GB"},
-    {10LL*1024*1024*1024, "10.0 GB"},
-    {99LL*1024*1024*1024, "99.0 GB"},
-    {105LL*1024*1024*1024, "105 GB"},
-    {105LL*1024*1024*1024 + 500LL*1024*1024, "105 GB"},
-    {~(1LL << 63), "8192 PB"},
-
-    {99*1024 + 103, "99.1 kB"},
-    {1024*1024 + 103, "1.0 MB"},
-    {1024*1024 + 205 * 1024, "1.2 MB"},
-    {1024*1024*1024 + (927 * 1024*1024), "1.9 GB"},
-    {10LL*1024*1024*1024, "10.0 GB"},
-    {100LL*1024*1024*1024, "100 GB"},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    EXPECT_EQ(ASCIIToUTF16(cases[i].expected),
-              FormatBytesUnlocalized(cases[i].bytes));
-  }
-}
-TEST(StringUtilTest, ReplaceSubstringsAfterOffset) {
-  static const struct {
-    StringPiece str;
-    size_t start_offset;
-    StringPiece find_this;
-    StringPiece replace_with;
-    StringPiece expected;
-  } cases[] = {
-      {"aaa", 0, "", "b", "aaa"},
-      {"aaa", 1, "", "b", "aaa"},
-      {"aaa", 0, "a", "b", "bbb"},
-      {"aaa", 0, "aa", "b", "ba"},
-      {"aaa", 0, "aa", "bbb", "bbba"},
-      {"aaaaa", 0, "aa", "b", "bba"},
-      {"ababaaababa", 0, "aba", "", "baaba"},
-      {"ababaaababa", 0, "aba", "_", "_baa_ba"},
-      {"ababaaababa", 0, "aba", "__", "__baa__ba"},
-      {"ababaaababa", 0, "aba", "___", "___baa___ba"},
-      {"ababaaababa", 0, "aba", "____", "____baa____ba"},
-      {"ababaaababa", 0, "aba", "_____", "_____baa_____ba"},
-      {"abb", 0, "ab", "a", "ab"},
-      {"Removing some substrings inging", 0, "ing", "", "Remov some substrs "},
-      {"Not found", 0, "x", "0", "Not found"},
-      {"Not found again", 5, "x", "0", "Not found again"},
-      {" Making it much longer ", 0, " ", "Four score and seven years ago",
-       "Four score and seven years agoMakingFour score and seven years agoit"
-       "Four score and seven years agomuchFour score and seven years agolonger"
-       "Four score and seven years ago"},
-      {" Making it much much much much shorter ", 0,
-       "Making it much much much much shorter", "", "  "},
-      {"so much much much much much very much much much shorter", 0, "much ",
-       "", "so very shorter"},
-      {"Invalid offset", 9999, "t", "foobar", "Invalid offset"},
-      {"Replace me only me once", 9, "me ", "", "Replace me only once"},
-      {"abababab", 2, "ab", "c", "abccc"},
-      {"abababab", 1, "ab", "c", "abccc"},
-      {"abababab", 1, "aba", "c", "abcbab"},
-  };
-
-  // base::string16 variant
-  for (const auto& scenario : cases) {
-    string16 str = ASCIIToUTF16(scenario.str);
-    ReplaceSubstringsAfterOffset(&str, scenario.start_offset,
-                                 ASCIIToUTF16(scenario.find_this),
-                                 ASCIIToUTF16(scenario.replace_with));
-    EXPECT_EQ(ASCIIToUTF16(scenario.expected), str);
-  }
-
-  // std::string with insufficient capacity: expansion must realloc the buffer.
-  for (const auto& scenario : cases) {
-    std::string str = scenario.str.as_string();
-    str.shrink_to_fit();  // This is nonbinding, but it's the best we've got.
-    ReplaceSubstringsAfterOffset(&str, scenario.start_offset,
-                                 scenario.find_this, scenario.replace_with);
-    EXPECT_EQ(scenario.expected, str);
-  }
-
-  // std::string with ample capacity: should be possible to grow in-place.
-  for (const auto& scenario : cases) {
-    std::string str = scenario.str.as_string();
-    str.reserve(std::max(scenario.str.length(), scenario.expected.length()) *
-                2);
-
-    ReplaceSubstringsAfterOffset(&str, scenario.start_offset,
-                                 scenario.find_this, scenario.replace_with);
-    EXPECT_EQ(scenario.expected, str);
-  }
-}
-
-TEST(StringUtilTest, ReplaceFirstSubstringAfterOffset) {
-  static const struct {
-    const char* str;
-    string16::size_type start_offset;
-    const char* find_this;
-    const char* replace_with;
-    const char* expected;
-  } cases[] = {
-    {"aaa", 0, "a", "b", "baa"},
-    {"abb", 0, "ab", "a", "ab"},
-    {"Removing some substrings inging", 0, "ing", "",
-      "Remov some substrings inging"},
-    {"Not found", 0, "x", "0", "Not found"},
-    {"Not found again", 5, "x", "0", "Not found again"},
-    {" Making it much longer ", 0, " ", "Four score and seven years ago",
-     "Four score and seven years agoMaking it much longer "},
-    {"Invalid offset", 9999, "t", "foobar", "Invalid offset"},
-    {"Replace me only me once", 4, "me ", "", "Replace only me once"},
-    {"abababab", 2, "ab", "c", "abcabab"},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); i++) {
-    string16 str = ASCIIToUTF16(cases[i].str);
-    ReplaceFirstSubstringAfterOffset(&str, cases[i].start_offset,
-                                     ASCIIToUTF16(cases[i].find_this),
-                                     ASCIIToUTF16(cases[i].replace_with));
-    EXPECT_EQ(ASCIIToUTF16(cases[i].expected), str);
-  }
-}
-
-TEST(StringUtilTest, HexDigitToInt) {
-  EXPECT_EQ(0, HexDigitToInt('0'));
-  EXPECT_EQ(1, HexDigitToInt('1'));
-  EXPECT_EQ(2, HexDigitToInt('2'));
-  EXPECT_EQ(3, HexDigitToInt('3'));
-  EXPECT_EQ(4, HexDigitToInt('4'));
-  EXPECT_EQ(5, HexDigitToInt('5'));
-  EXPECT_EQ(6, HexDigitToInt('6'));
-  EXPECT_EQ(7, HexDigitToInt('7'));
-  EXPECT_EQ(8, HexDigitToInt('8'));
-  EXPECT_EQ(9, HexDigitToInt('9'));
-  EXPECT_EQ(10, HexDigitToInt('A'));
-  EXPECT_EQ(11, HexDigitToInt('B'));
-  EXPECT_EQ(12, HexDigitToInt('C'));
-  EXPECT_EQ(13, HexDigitToInt('D'));
-  EXPECT_EQ(14, HexDigitToInt('E'));
-  EXPECT_EQ(15, HexDigitToInt('F'));
-
-  // Verify the lower case as well.
-  EXPECT_EQ(10, HexDigitToInt('a'));
-  EXPECT_EQ(11, HexDigitToInt('b'));
-  EXPECT_EQ(12, HexDigitToInt('c'));
-  EXPECT_EQ(13, HexDigitToInt('d'));
-  EXPECT_EQ(14, HexDigitToInt('e'));
-  EXPECT_EQ(15, HexDigitToInt('f'));
-}
-
-TEST(StringUtilTest, JoinString) {
-  std::string separator(", ");
-  std::vector<std::string> parts;
-  EXPECT_EQ(std::string(), JoinString(parts, separator));
-
-  parts.push_back(std::string());
-  EXPECT_EQ(std::string(), JoinString(parts, separator));
-  parts.clear();
-
-  parts.push_back("a");
-  EXPECT_EQ("a", JoinString(parts, separator));
-
-  parts.push_back("b");
-  parts.push_back("c");
-  EXPECT_EQ("a, b, c", JoinString(parts, separator));
-
-  parts.push_back(std::string());
-  EXPECT_EQ("a, b, c, ", JoinString(parts, separator));
-  parts.push_back(" ");
-  EXPECT_EQ("a|b|c|| ", JoinString(parts, "|"));
-}
-
-TEST(StringUtilTest, JoinString16) {
-  string16 separator = ASCIIToUTF16(", ");
-  std::vector<string16> parts;
-  EXPECT_EQ(string16(), JoinString(parts, separator));
-
-  parts.push_back(string16());
-  EXPECT_EQ(string16(), JoinString(parts, separator));
-  parts.clear();
-
-  parts.push_back(ASCIIToUTF16("a"));
-  EXPECT_EQ(ASCIIToUTF16("a"), JoinString(parts, separator));
-
-  parts.push_back(ASCIIToUTF16("b"));
-  parts.push_back(ASCIIToUTF16("c"));
-  EXPECT_EQ(ASCIIToUTF16("a, b, c"), JoinString(parts, separator));
-
-  parts.push_back(ASCIIToUTF16(""));
-  EXPECT_EQ(ASCIIToUTF16("a, b, c, "), JoinString(parts, separator));
-  parts.push_back(ASCIIToUTF16(" "));
-  EXPECT_EQ(ASCIIToUTF16("a|b|c|| "), JoinString(parts, ASCIIToUTF16("|")));
-}
-
-TEST(StringUtilTest, JoinStringPiece) {
-  std::string separator(", ");
-  std::vector<StringPiece> parts;
-  EXPECT_EQ(std::string(), JoinString(parts, separator));
-
-  // Test empty first part (https://crbug.com/698073).
-  parts.push_back(StringPiece());
-  EXPECT_EQ(std::string(), JoinString(parts, separator));
-  parts.clear();
-
-  parts.push_back("a");
-  EXPECT_EQ("a", JoinString(parts, separator));
-
-  parts.push_back("b");
-  parts.push_back("c");
-  EXPECT_EQ("a, b, c", JoinString(parts, separator));
-
-  parts.push_back(StringPiece());
-  EXPECT_EQ("a, b, c, ", JoinString(parts, separator));
-  parts.push_back(" ");
-  EXPECT_EQ("a|b|c|| ", JoinString(parts, "|"));
-}
-
-TEST(StringUtilTest, JoinStringPiece16) {
-  string16 separator = ASCIIToUTF16(", ");
-  std::vector<StringPiece16> parts;
-  EXPECT_EQ(string16(), JoinString(parts, separator));
-
-  // Test empty first part (https://crbug.com/698073).
-  parts.push_back(StringPiece16());
-  EXPECT_EQ(string16(), JoinString(parts, separator));
-  parts.clear();
-
-  const string16 kA = ASCIIToUTF16("a");
-  parts.push_back(kA);
-  EXPECT_EQ(ASCIIToUTF16("a"), JoinString(parts, separator));
-
-  const string16 kB = ASCIIToUTF16("b");
-  parts.push_back(kB);
-  const string16 kC = ASCIIToUTF16("c");
-  parts.push_back(kC);
-  EXPECT_EQ(ASCIIToUTF16("a, b, c"), JoinString(parts, separator));
-
-  parts.push_back(StringPiece16());
-  EXPECT_EQ(ASCIIToUTF16("a, b, c, "), JoinString(parts, separator));
-  const string16 kSpace = ASCIIToUTF16(" ");
-  parts.push_back(kSpace);
-  EXPECT_EQ(ASCIIToUTF16("a|b|c|| "), JoinString(parts, ASCIIToUTF16("|")));
-}
-
-TEST(StringUtilTest, JoinStringInitializerList) {
-  std::string separator(", ");
-  EXPECT_EQ(std::string(), JoinString({}, separator));
-
-  // Test empty first part (https://crbug.com/698073).
-  EXPECT_EQ(std::string(), JoinString({StringPiece()}, separator));
-
-  // With const char*s.
-  EXPECT_EQ("a", JoinString({"a"}, separator));
-  EXPECT_EQ("a, b, c", JoinString({"a", "b", "c"}, separator));
-  EXPECT_EQ("a, b, c, ", JoinString({"a", "b", "c", StringPiece()}, separator));
-  EXPECT_EQ("a|b|c|| ", JoinString({"a", "b", "c", StringPiece(), " "}, "|"));
-
-  // With std::strings.
-  const std::string kA = "a";
-  const std::string kB = "b";
-  EXPECT_EQ("a, b", JoinString({kA, kB}, separator));
-
-  // With StringPieces.
-  const StringPiece kPieceA = kA;
-  const StringPiece kPieceB = kB;
-  EXPECT_EQ("a, b", JoinString({kPieceA, kPieceB}, separator));
-}
-
-TEST(StringUtilTest, JoinStringInitializerList16) {
-  string16 separator = ASCIIToUTF16(", ");
-  EXPECT_EQ(string16(), JoinString({}, separator));
-
-  // Test empty first part (https://crbug.com/698073).
-  EXPECT_EQ(string16(), JoinString({StringPiece16()}, separator));
-
-  // With string16s.
-  const string16 kA = ASCIIToUTF16("a");
-  EXPECT_EQ(ASCIIToUTF16("a"), JoinString({kA}, separator));
-
-  const string16 kB = ASCIIToUTF16("b");
-  const string16 kC = ASCIIToUTF16("c");
-  EXPECT_EQ(ASCIIToUTF16("a, b, c"), JoinString({kA, kB, kC}, separator));
-
-  EXPECT_EQ(ASCIIToUTF16("a, b, c, "),
-            JoinString({kA, kB, kC, StringPiece16()}, separator));
-  const string16 kSpace = ASCIIToUTF16(" ");
-  EXPECT_EQ(
-      ASCIIToUTF16("a|b|c|| "),
-      JoinString({kA, kB, kC, StringPiece16(), kSpace}, ASCIIToUTF16("|")));
-
-  // With StringPiece16s.
-  const StringPiece16 kPieceA = kA;
-  const StringPiece16 kPieceB = kB;
-  EXPECT_EQ(ASCIIToUTF16("a, b"), JoinString({kPieceA, kPieceB}, separator));
-}
-
-TEST(StringUtilTest, StartsWith) {
-  EXPECT_TRUE(StartsWith("javascript:url", "javascript",
-                         base::CompareCase::SENSITIVE));
-  EXPECT_FALSE(StartsWith("JavaScript:url", "javascript",
-                          base::CompareCase::SENSITIVE));
-  EXPECT_TRUE(StartsWith("javascript:url", "javascript",
-                         base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_TRUE(StartsWith("JavaScript:url", "javascript",
-                         base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_FALSE(StartsWith("java", "javascript", base::CompareCase::SENSITIVE));
-  EXPECT_FALSE(StartsWith("java", "javascript",
-                          base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_FALSE(StartsWith(std::string(), "javascript",
-                          base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_FALSE(StartsWith(std::string(), "javascript",
-                          base::CompareCase::SENSITIVE));
-  EXPECT_TRUE(StartsWith("java", std::string(),
-                         base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_TRUE(StartsWith("java", std::string(), base::CompareCase::SENSITIVE));
-
-  EXPECT_TRUE(StartsWith(ASCIIToUTF16("javascript:url"),
-                         ASCIIToUTF16("javascript"),
-                         base::CompareCase::SENSITIVE));
-  EXPECT_FALSE(StartsWith(ASCIIToUTF16("JavaScript:url"),
-                          ASCIIToUTF16("javascript"),
-                          base::CompareCase::SENSITIVE));
-  EXPECT_TRUE(StartsWith(ASCIIToUTF16("javascript:url"),
-                         ASCIIToUTF16("javascript"),
-                         base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_TRUE(StartsWith(ASCIIToUTF16("JavaScript:url"),
-                         ASCIIToUTF16("javascript"),
-                         base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_FALSE(StartsWith(ASCIIToUTF16("java"), ASCIIToUTF16("javascript"),
-                          base::CompareCase::SENSITIVE));
-  EXPECT_FALSE(StartsWith(ASCIIToUTF16("java"), ASCIIToUTF16("javascript"),
-                          base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_FALSE(StartsWith(string16(), ASCIIToUTF16("javascript"),
-                          base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_FALSE(StartsWith(string16(), ASCIIToUTF16("javascript"),
-                          base::CompareCase::SENSITIVE));
-  EXPECT_TRUE(StartsWith(ASCIIToUTF16("java"), string16(),
-                         base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_TRUE(StartsWith(ASCIIToUTF16("java"), string16(),
-                         base::CompareCase::SENSITIVE));
-}
-
-TEST(StringUtilTest, EndsWith) {
-  EXPECT_TRUE(EndsWith(ASCIIToUTF16("Foo.plugin"), ASCIIToUTF16(".plugin"),
-                       base::CompareCase::SENSITIVE));
-  EXPECT_FALSE(EndsWith(ASCIIToUTF16("Foo.Plugin"), ASCIIToUTF16(".plugin"),
-                        base::CompareCase::SENSITIVE));
-  EXPECT_TRUE(EndsWith(ASCIIToUTF16("Foo.plugin"), ASCIIToUTF16(".plugin"),
-                       base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_TRUE(EndsWith(ASCIIToUTF16("Foo.Plugin"), ASCIIToUTF16(".plugin"),
-                       base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_FALSE(EndsWith(ASCIIToUTF16(".plug"), ASCIIToUTF16(".plugin"),
-                        base::CompareCase::SENSITIVE));
-  EXPECT_FALSE(EndsWith(ASCIIToUTF16(".plug"), ASCIIToUTF16(".plugin"),
-                        base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_FALSE(EndsWith(ASCIIToUTF16("Foo.plugin Bar"), ASCIIToUTF16(".plugin"),
-                        base::CompareCase::SENSITIVE));
-  EXPECT_FALSE(EndsWith(ASCIIToUTF16("Foo.plugin Bar"), ASCIIToUTF16(".plugin"),
-                        base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_FALSE(EndsWith(string16(), ASCIIToUTF16(".plugin"),
-                        base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_FALSE(EndsWith(string16(), ASCIIToUTF16(".plugin"),
-                        base::CompareCase::SENSITIVE));
-  EXPECT_TRUE(EndsWith(ASCIIToUTF16("Foo.plugin"), string16(),
-                       base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_TRUE(EndsWith(ASCIIToUTF16("Foo.plugin"), string16(),
-                       base::CompareCase::SENSITIVE));
-  EXPECT_TRUE(EndsWith(ASCIIToUTF16(".plugin"), ASCIIToUTF16(".plugin"),
-                       base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_TRUE(EndsWith(ASCIIToUTF16(".plugin"), ASCIIToUTF16(".plugin"),
-                       base::CompareCase::SENSITIVE));
-  EXPECT_TRUE(
-      EndsWith(string16(), string16(), base::CompareCase::INSENSITIVE_ASCII));
-  EXPECT_TRUE(EndsWith(string16(), string16(), base::CompareCase::SENSITIVE));
-}
-
-TEST(StringUtilTest, GetStringFWithOffsets) {
-  std::vector<string16> subst;
-  subst.push_back(ASCIIToUTF16("1"));
-  subst.push_back(ASCIIToUTF16("2"));
-  std::vector<size_t> offsets;
-
-  ReplaceStringPlaceholders(ASCIIToUTF16("Hello, $1. Your number is $2."),
-                            subst,
-                            &offsets);
-  EXPECT_EQ(2U, offsets.size());
-  EXPECT_EQ(7U, offsets[0]);
-  EXPECT_EQ(25U, offsets[1]);
-  offsets.clear();
-
-  ReplaceStringPlaceholders(ASCIIToUTF16("Hello, $2. Your number is $1."),
-                            subst,
-                            &offsets);
-  EXPECT_EQ(2U, offsets.size());
-  EXPECT_EQ(25U, offsets[0]);
-  EXPECT_EQ(7U, offsets[1]);
-  offsets.clear();
-}
-
-TEST(StringUtilTest, ReplaceStringPlaceholdersTooFew) {
-  // Test whether replacestringplaceholders works as expected when there
-  // are fewer inputs than outputs.
-  std::vector<string16> subst;
-  subst.push_back(ASCIIToUTF16("9a"));
-  subst.push_back(ASCIIToUTF16("8b"));
-  subst.push_back(ASCIIToUTF16("7c"));
-
-  string16 formatted =
-      ReplaceStringPlaceholders(
-          ASCIIToUTF16("$1a,$2b,$3c,$4d,$5e,$6f,$1g,$2h,$3i"), subst, nullptr);
-
-  EXPECT_EQ(ASCIIToUTF16("9aa,8bb,7cc,d,e,f,9ag,8bh,7ci"), formatted);
-}
-
-TEST(StringUtilTest, ReplaceStringPlaceholders) {
-  std::vector<string16> subst;
-  subst.push_back(ASCIIToUTF16("9a"));
-  subst.push_back(ASCIIToUTF16("8b"));
-  subst.push_back(ASCIIToUTF16("7c"));
-  subst.push_back(ASCIIToUTF16("6d"));
-  subst.push_back(ASCIIToUTF16("5e"));
-  subst.push_back(ASCIIToUTF16("4f"));
-  subst.push_back(ASCIIToUTF16("3g"));
-  subst.push_back(ASCIIToUTF16("2h"));
-  subst.push_back(ASCIIToUTF16("1i"));
-
-  string16 formatted =
-      ReplaceStringPlaceholders(
-          ASCIIToUTF16("$1a,$2b,$3c,$4d,$5e,$6f,$7g,$8h,$9i"), subst, nullptr);
-
-  EXPECT_EQ(ASCIIToUTF16("9aa,8bb,7cc,6dd,5ee,4ff,3gg,2hh,1ii"), formatted);
-}
-
-TEST(StringUtilTest, ReplaceStringPlaceholdersNetExpansionWithContraction) {
-  // In this test, some of the substitutions are shorter than the placeholders,
-  // but overall the string gets longer.
-  std::vector<string16> subst;
-  subst.push_back(ASCIIToUTF16("9a____"));
-  subst.push_back(ASCIIToUTF16("B"));
-  subst.push_back(ASCIIToUTF16("7c___"));
-  subst.push_back(ASCIIToUTF16("d"));
-  subst.push_back(ASCIIToUTF16("5e____"));
-  subst.push_back(ASCIIToUTF16("F"));
-  subst.push_back(ASCIIToUTF16("3g___"));
-  subst.push_back(ASCIIToUTF16("h"));
-  subst.push_back(ASCIIToUTF16("1i_____"));
-
-  string16 original = ASCIIToUTF16("$1a,$2b,$3c,$4d,$5e,$6f,$7g,$8h,$9i");
-  string16 expected =
-      ASCIIToUTF16("9a____a,Bb,7c___c,dd,5e____e,Ff,3g___g,hh,1i_____i");
-
-  EXPECT_EQ(expected, ReplaceStringPlaceholders(original, subst, nullptr));
-
-  std::vector<size_t> offsets;
-  EXPECT_EQ(expected, ReplaceStringPlaceholders(original, subst, &offsets));
-  std::vector<size_t> expected_offsets = {0, 8, 11, 18, 21, 29, 32, 39, 42};
-  EXPECT_EQ(offsets.size(), subst.size());
-  EXPECT_EQ(expected_offsets, offsets);
-  for (size_t i = 0; i < offsets.size(); i++) {
-    EXPECT_EQ(expected.substr(expected_offsets[i], subst[i].length()),
-              subst[i]);
-  }
-}
-
-TEST(StringUtilTest, ReplaceStringPlaceholdersNetContractionWithExpansion) {
-  // In this test, some of the substitutions are longer than the placeholders,
-  // but overall the string gets smaller. Additionally, the placeholders appear
-  // in a permuted order.
-  std::vector<string16> subst;
-  subst.push_back(ASCIIToUTF16("z"));
-  subst.push_back(ASCIIToUTF16("y"));
-  subst.push_back(ASCIIToUTF16("XYZW"));
-  subst.push_back(ASCIIToUTF16("x"));
-  subst.push_back(ASCIIToUTF16("w"));
-
-  string16 formatted =
-      ReplaceStringPlaceholders(ASCIIToUTF16("$3_$4$2$1$5"), subst, nullptr);
-
-  EXPECT_EQ(ASCIIToUTF16("XYZW_xyzw"), formatted);
-}
-
-TEST(StringUtilTest, ReplaceStringPlaceholdersOneDigit) {
-  std::vector<string16> subst;
-  subst.push_back(ASCIIToUTF16("1a"));
-  string16 formatted =
-      ReplaceStringPlaceholders(ASCIIToUTF16(" $16 "), subst, nullptr);
-  EXPECT_EQ(ASCIIToUTF16(" 1a6 "), formatted);
-}
-
-TEST(StringUtilTest, ReplaceStringPlaceholdersInvalidPlaceholder) {
-  std::vector<string16> subst;
-  subst.push_back(ASCIIToUTF16("1a"));
-  string16 formatted =
-      ReplaceStringPlaceholders(ASCIIToUTF16("+$-+$A+$1+"), subst, nullptr);
-  EXPECT_EQ(ASCIIToUTF16("+++1a+"), formatted);
-}
-
-TEST(StringUtilTest, StdStringReplaceStringPlaceholders) {
-  std::vector<std::string> subst;
-  subst.push_back("9a");
-  subst.push_back("8b");
-  subst.push_back("7c");
-  subst.push_back("6d");
-  subst.push_back("5e");
-  subst.push_back("4f");
-  subst.push_back("3g");
-  subst.push_back("2h");
-  subst.push_back("1i");
-
-  std::string formatted =
-      ReplaceStringPlaceholders(
-          "$1a,$2b,$3c,$4d,$5e,$6f,$7g,$8h,$9i", subst, nullptr);
-
-  EXPECT_EQ("9aa,8bb,7cc,6dd,5ee,4ff,3gg,2hh,1ii", formatted);
-}
-
-TEST(StringUtilTest, StdStringReplaceStringPlaceholdersMultipleMatches) {
-  std::vector<std::string> subst;
-  subst.push_back("4");   // Referenced twice.
-  subst.push_back("?");   // Unreferenced.
-  subst.push_back("!");   // Unreferenced.
-  subst.push_back("16");  // Referenced once.
-
-  std::string original = "$1 * $1 == $4";
-  std::string expected = "4 * 4 == 16";
-  EXPECT_EQ(expected, ReplaceStringPlaceholders(original, subst, nullptr));
-  std::vector<size_t> offsets;
-  EXPECT_EQ(expected, ReplaceStringPlaceholders(original, subst, &offsets));
-  std::vector<size_t> expected_offsets = {0, 4, 9};
-  EXPECT_EQ(expected_offsets, offsets);
-}
-
-TEST(StringUtilTest, ReplaceStringPlaceholdersConsecutiveDollarSigns) {
-  std::vector<std::string> subst;
-  subst.push_back("a");
-  subst.push_back("b");
-  subst.push_back("c");
-  EXPECT_EQ(ReplaceStringPlaceholders("$$1 $$$2 $$$$3", subst, nullptr),
-            "$1 $$2 $$$3");
-}
-
-TEST(StringUtilTest, LcpyTest) {
-  // Test the normal case where we fit in our buffer.
-  {
-    char dst[10];
-    wchar_t wdst[10];
-    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", arraysize(dst)));
-    EXPECT_EQ(0, memcmp(dst, "abcdefg", 8));
-    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", arraysize(wdst)));
-    EXPECT_EQ(0, memcmp(wdst, L"abcdefg", sizeof(wchar_t) * 8));
-  }
-
-  // Test dst_size == 0, nothing should be written to |dst| and we should
-  // have the equivalent of strlen(src).
-  {
-    char dst[2] = {1, 2};
-    wchar_t wdst[2] = {1, 2};
-    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", 0));
-    EXPECT_EQ(1, dst[0]);
-    EXPECT_EQ(2, dst[1]);
-    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", 0));
-    EXPECT_EQ(static_cast<wchar_t>(1), wdst[0]);
-    EXPECT_EQ(static_cast<wchar_t>(2), wdst[1]);
-  }
-
-  // Test the case were we _just_ competely fit including the null.
-  {
-    char dst[8];
-    wchar_t wdst[8];
-    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", arraysize(dst)));
-    EXPECT_EQ(0, memcmp(dst, "abcdefg", 8));
-    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", arraysize(wdst)));
-    EXPECT_EQ(0, memcmp(wdst, L"abcdefg", sizeof(wchar_t) * 8));
-  }
-
-  // Test the case were we we are one smaller, so we can't fit the null.
-  {
-    char dst[7];
-    wchar_t wdst[7];
-    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", arraysize(dst)));
-    EXPECT_EQ(0, memcmp(dst, "abcdef", 7));
-    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", arraysize(wdst)));
-    EXPECT_EQ(0, memcmp(wdst, L"abcdef", sizeof(wchar_t) * 7));
-  }
-
-  // Test the case were we are just too small.
-  {
-    char dst[3];
-    wchar_t wdst[3];
-    EXPECT_EQ(7U, strlcpy(dst, "abcdefg", arraysize(dst)));
-    EXPECT_EQ(0, memcmp(dst, "ab", 3));
-    EXPECT_EQ(7U, wcslcpy(wdst, L"abcdefg", arraysize(wdst)));
-    EXPECT_EQ(0, memcmp(wdst, L"ab", sizeof(wchar_t) * 3));
-  }
-}
-
-TEST(StringUtilTest, WprintfFormatPortabilityTest) {
-  static const struct {
-    const wchar_t* input;
-    bool portable;
-  } cases[] = {
-    { L"%ls", true },
-    { L"%s", false },
-    { L"%S", false },
-    { L"%lS", false },
-    { L"Hello, %s", false },
-    { L"%lc", true },
-    { L"%c", false },
-    { L"%C", false },
-    { L"%lC", false },
-    { L"%ls %s", false },
-    { L"%s %ls", false },
-    { L"%s %ls %s", false },
-    { L"%f", true },
-    { L"%f %F", false },
-    { L"%d %D", false },
-    { L"%o %O", false },
-    { L"%u %U", false },
-    { L"%f %d %o %u", true },
-    { L"%-8d (%02.1f%)", true },
-    { L"% 10s", false },
-    { L"% 10ls", true }
-  };
-  for (size_t i = 0; i < arraysize(cases); ++i)
-    EXPECT_EQ(cases[i].portable, IsWprintfFormatPortable(cases[i].input));
-}
-
-TEST(StringUtilTest, RemoveChars) {
-  const char kRemoveChars[] = "-/+*";
-  std::string input = "A-+bc/d!*";
-  EXPECT_TRUE(RemoveChars(input, kRemoveChars, &input));
-  EXPECT_EQ("Abcd!", input);
-
-  // No characters match kRemoveChars.
-  EXPECT_FALSE(RemoveChars(input, kRemoveChars, &input));
-  EXPECT_EQ("Abcd!", input);
-
-  // Empty string.
-  input.clear();
-  EXPECT_FALSE(RemoveChars(input, kRemoveChars, &input));
-  EXPECT_EQ(std::string(), input);
-}
-
-TEST(StringUtilTest, ReplaceChars) {
-  struct TestData {
-    const char* input;
-    const char* replace_chars;
-    const char* replace_with;
-    const char* output;
-    bool result;
-  } cases[] = {
-      {"", "", "", "", false},
-      {"t", "t", "t", "t", true},
-      {"a", "b", "c", "a", false},
-      {"b", "b", "c", "c", true},
-      {"bob", "b", "p", "pop", true},
-      {"bob", "o", "i", "bib", true},
-      {"test", "", "", "test", false},
-      {"test", "", "!", "test", false},
-      {"test", "z", "!", "test", false},
-      {"test", "e", "!", "t!st", true},
-      {"test", "e", "!?", "t!?st", true},
-      {"test", "ez", "!", "t!st", true},
-      {"test", "zed", "!?", "t!?st", true},
-      {"test", "t", "!?", "!?es!?", true},
-      {"test", "et", "!>", "!>!>s!>", true},
-      {"test", "zest", "!", "!!!!", true},
-      {"test", "szt", "!", "!e!!", true},
-      {"test", "t", "test", "testestest", true},
-      {"tetst", "t", "test", "testeteststest", true},
-      {"ttttttt", "t", "-", "-------", true},
-      {"aAaAaAAaAAa", "A", "", "aaaaa", true},
-      {"xxxxxxxxxx", "x", "", "", true},
-      {"xxxxxxxxxx", "x", "x", "xxxxxxxxxx", true},
-      {"xxxxxxxxxx", "x", "y-", "y-y-y-y-y-y-y-y-y-y-", true},
-      {"xxxxxxxxxx", "x", "xy", "xyxyxyxyxyxyxyxyxyxy", true},
-      {"xxxxxxxxxx", "x", "zyx", "zyxzyxzyxzyxzyxzyxzyxzyxzyxzyx", true},
-      {"xaxxaxxxaxxxax", "x", "xy", "xyaxyxyaxyxyxyaxyxyxyaxy", true},
-      {"-xaxxaxxxaxxxax-", "x", "xy", "-xyaxyxyaxyxyxyaxyxyxyaxy-", true},
-  };
-
-  for (const TestData& scenario : cases) {
-    // Test with separate output and input vars.
-    std::string output;
-    bool result = ReplaceChars(scenario.input, scenario.replace_chars,
-                               scenario.replace_with, &output);
-    EXPECT_EQ(scenario.result, result) << scenario.input;
-    EXPECT_EQ(scenario.output, output);
-  }
-
-  for (const TestData& scenario : cases) {
-    // Test with an input/output var of limited capacity.
-    std::string input_output = scenario.input;
-    input_output.shrink_to_fit();
-    bool result = ReplaceChars(input_output, scenario.replace_chars,
-                               scenario.replace_with, &input_output);
-    EXPECT_EQ(scenario.result, result) << scenario.input;
-    EXPECT_EQ(scenario.output, input_output);
-  }
-
-  for (const TestData& scenario : cases) {
-    // Test with an input/output var of ample capacity; should
-    // not realloc.
-    std::string input_output = scenario.input;
-    input_output.reserve(strlen(scenario.output) * 2);
-    const void* original_buffer = input_output.data();
-    bool result = ReplaceChars(input_output, scenario.replace_chars,
-                               scenario.replace_with, &input_output);
-    EXPECT_EQ(scenario.result, result) << scenario.input;
-    EXPECT_EQ(scenario.output, input_output);
-    EXPECT_EQ(original_buffer, input_output.data());
-  }
-}
-
-TEST(StringUtilTest, ContainsOnlyChars) {
-  // Providing an empty list of characters should return false but for the empty
-  // string.
-  EXPECT_TRUE(ContainsOnlyChars(std::string(), std::string()));
-  EXPECT_FALSE(ContainsOnlyChars("Hello", std::string()));
-
-  EXPECT_TRUE(ContainsOnlyChars(std::string(), "1234"));
-  EXPECT_TRUE(ContainsOnlyChars("1", "1234"));
-  EXPECT_TRUE(ContainsOnlyChars("1", "4321"));
-  EXPECT_TRUE(ContainsOnlyChars("123", "4321"));
-  EXPECT_FALSE(ContainsOnlyChars("123a", "4321"));
-
-  EXPECT_TRUE(ContainsOnlyChars(std::string(), kWhitespaceASCII));
-  EXPECT_TRUE(ContainsOnlyChars(" ", kWhitespaceASCII));
-  EXPECT_TRUE(ContainsOnlyChars("\t", kWhitespaceASCII));
-  EXPECT_TRUE(ContainsOnlyChars("\t \r \n  ", kWhitespaceASCII));
-  EXPECT_FALSE(ContainsOnlyChars("a", kWhitespaceASCII));
-  EXPECT_FALSE(ContainsOnlyChars("\thello\r \n  ", kWhitespaceASCII));
-
-  EXPECT_TRUE(ContainsOnlyChars(string16(), kWhitespaceUTF16));
-  EXPECT_TRUE(ContainsOnlyChars(ASCIIToUTF16(" "), kWhitespaceUTF16));
-  EXPECT_TRUE(ContainsOnlyChars(ASCIIToUTF16("\t"), kWhitespaceUTF16));
-  EXPECT_TRUE(ContainsOnlyChars(ASCIIToUTF16("\t \r \n  "), kWhitespaceUTF16));
-  EXPECT_FALSE(ContainsOnlyChars(ASCIIToUTF16("a"), kWhitespaceUTF16));
-  EXPECT_FALSE(ContainsOnlyChars(ASCIIToUTF16("\thello\r \n  "),
-                                  kWhitespaceUTF16));
-}
-
-TEST(StringUtilTest, CompareCaseInsensitiveASCII) {
-  EXPECT_EQ(0, CompareCaseInsensitiveASCII("", ""));
-  EXPECT_EQ(0, CompareCaseInsensitiveASCII("Asdf", "aSDf"));
-
-  // Differing lengths.
-  EXPECT_EQ(-1, CompareCaseInsensitiveASCII("Asdf", "aSDfA"));
-  EXPECT_EQ(1, CompareCaseInsensitiveASCII("AsdfA", "aSDf"));
-
-  // Differing values.
-  EXPECT_EQ(-1, CompareCaseInsensitiveASCII("AsdfA", "aSDfb"));
-  EXPECT_EQ(1, CompareCaseInsensitiveASCII("Asdfb", "aSDfA"));
-}
-
-TEST(StringUtilTest, EqualsCaseInsensitiveASCII) {
-  EXPECT_TRUE(EqualsCaseInsensitiveASCII("", ""));
-  EXPECT_TRUE(EqualsCaseInsensitiveASCII("Asdf", "aSDF"));
-  EXPECT_FALSE(EqualsCaseInsensitiveASCII("bsdf", "aSDF"));
-  EXPECT_FALSE(EqualsCaseInsensitiveASCII("Asdf", "aSDFz"));
-}
-
-TEST(StringUtilTest, IsUnicodeWhitespace) {
-  // NOT unicode white space.
-  EXPECT_FALSE(IsUnicodeWhitespace(L'\0'));
-  EXPECT_FALSE(IsUnicodeWhitespace(L'A'));
-  EXPECT_FALSE(IsUnicodeWhitespace(L'0'));
-  EXPECT_FALSE(IsUnicodeWhitespace(L'.'));
-  EXPECT_FALSE(IsUnicodeWhitespace(L';'));
-  EXPECT_FALSE(IsUnicodeWhitespace(L'\x4100'));
-
-  // Actual unicode whitespace.
-  EXPECT_TRUE(IsUnicodeWhitespace(L' '));
-  EXPECT_TRUE(IsUnicodeWhitespace(L'\xa0'));
-  EXPECT_TRUE(IsUnicodeWhitespace(L'\x3000'));
-  EXPECT_TRUE(IsUnicodeWhitespace(L'\t'));
-  EXPECT_TRUE(IsUnicodeWhitespace(L'\r'));
-  EXPECT_TRUE(IsUnicodeWhitespace(L'\v'));
-  EXPECT_TRUE(IsUnicodeWhitespace(L'\f'));
-  EXPECT_TRUE(IsUnicodeWhitespace(L'\n'));
-}
-
-class WriteIntoTest : public testing::Test {
- protected:
-  static void WritesCorrectly(size_t num_chars) {
-    std::string buffer;
-    char kOriginal[] = "supercali";
-    strncpy(WriteInto(&buffer, num_chars + 1), kOriginal, num_chars);
-    // Using std::string(buffer.c_str()) instead of |buffer| truncates the
-    // string at the first \0.
-    EXPECT_EQ(std::string(kOriginal,
-                          std::min(num_chars, arraysize(kOriginal) - 1)),
-              std::string(buffer.c_str()));
-    EXPECT_EQ(num_chars, buffer.size());
-  }
-};
-
-TEST_F(WriteIntoTest, WriteInto) {
-  // Validate that WriteInto reserves enough space and
-  // sizes a string correctly.
-  WritesCorrectly(1);
-  WritesCorrectly(2);
-  WritesCorrectly(5000);
-
-  // Validate that WriteInto doesn't modify other strings
-  // when using a Copy-on-Write implementation.
-  const char kLive[] = "live";
-  const char kDead[] = "dead";
-  const std::string live = kLive;
-  std::string dead = live;
-  strncpy(WriteInto(&dead, 5), kDead, 4);
-  EXPECT_EQ(kDead, dead);
-  EXPECT_EQ(4u, dead.size());
-  EXPECT_EQ(kLive, live);
-  EXPECT_EQ(4u, live.size());
-}
-
-}  // namespace base
diff --git a/base/strings/stringize_macros_unittest.cc b/base/strings/stringize_macros_unittest.cc
deleted file mode 100644
index d7f9e56..0000000
--- a/base/strings/stringize_macros_unittest.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/stringize_macros.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-// Macros as per documentation in header file.
-#define PREPROCESSOR_UTIL_UNITTEST_A FOO
-#define PREPROCESSOR_UTIL_UNITTEST_B(x) myobj->FunctionCall(x)
-#define PREPROCESSOR_UTIL_UNITTEST_C "foo"
-
-TEST(StringizeTest, Ansi) {
-  EXPECT_STREQ(
-      "PREPROCESSOR_UTIL_UNITTEST_A",
-      STRINGIZE_NO_EXPANSION(PREPROCESSOR_UTIL_UNITTEST_A));
-  EXPECT_STREQ(
-      "PREPROCESSOR_UTIL_UNITTEST_B(y)",
-      STRINGIZE_NO_EXPANSION(PREPROCESSOR_UTIL_UNITTEST_B(y)));
-  EXPECT_STREQ(
-      "PREPROCESSOR_UTIL_UNITTEST_C",
-      STRINGIZE_NO_EXPANSION(PREPROCESSOR_UTIL_UNITTEST_C));
-
-  EXPECT_STREQ("FOO", STRINGIZE(PREPROCESSOR_UTIL_UNITTEST_A));
-  EXPECT_STREQ("myobj->FunctionCall(y)",
-               STRINGIZE(PREPROCESSOR_UTIL_UNITTEST_B(y)));
-  EXPECT_STREQ("\"foo\"", STRINGIZE(PREPROCESSOR_UTIL_UNITTEST_C));
-}
diff --git a/base/strings/stringprintf_unittest.cc b/base/strings/stringprintf_unittest.cc
deleted file mode 100644
index 02cd349..0000000
--- a/base/strings/stringprintf_unittest.cc
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/strings/stringprintf.h"
-
-#include <errno.h>
-#include <stddef.h>
-
-#include "base/macros.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-// A helper for the StringAppendV test that follows.
-//
-// Just forwards its args to StringAppendV.
-static void StringAppendVTestHelper(std::string* out, const char* format, ...) {
-  va_list ap;
-  va_start(ap, format);
-  StringAppendV(out, format, ap);
-  va_end(ap);
-}
-
-}  // namespace
-
-TEST(StringPrintfTest, StringPrintfEmpty) {
-  EXPECT_EQ("", StringPrintf("%s", ""));
-}
-
-TEST(StringPrintfTest, StringPrintfMisc) {
-  EXPECT_EQ("123hello w", StringPrintf("%3d%2s %1c", 123, "hello", 'w'));
-#if defined(OS_WIN)
-  EXPECT_EQ(L"123hello w", StringPrintf(L"%3d%2ls %1lc", 123, L"hello", 'w'));
-#endif
-}
-
-TEST(StringPrintfTest, StringAppendfEmptyString) {
-  std::string value("Hello");
-  StringAppendF(&value, "%s", "");
-  EXPECT_EQ("Hello", value);
-
-#if defined(OS_WIN)
-  std::wstring valuew(L"Hello");
-  StringAppendF(&valuew, L"%ls", L"");
-  EXPECT_EQ(L"Hello", valuew);
-#endif
-}
-
-TEST(StringPrintfTest, StringAppendfString) {
-  std::string value("Hello");
-  StringAppendF(&value, " %s", "World");
-  EXPECT_EQ("Hello World", value);
-
-#if defined(OS_WIN)
-  std::wstring valuew(L"Hello");
-  StringAppendF(&valuew, L" %ls", L"World");
-  EXPECT_EQ(L"Hello World", valuew);
-#endif
-}
-
-TEST(StringPrintfTest, StringAppendfInt) {
-  std::string value("Hello");
-  StringAppendF(&value, " %d", 123);
-  EXPECT_EQ("Hello 123", value);
-
-#if defined(OS_WIN)
-  std::wstring valuew(L"Hello");
-  StringAppendF(&valuew, L" %d", 123);
-  EXPECT_EQ(L"Hello 123", valuew);
-#endif
-}
-
-// Make sure that lengths exactly around the initial buffer size are handled
-// correctly.
-TEST(StringPrintfTest, StringPrintfBounds) {
-  const int kSrcLen = 1026;
-  char src[kSrcLen];
-  for (size_t i = 0; i < arraysize(src); i++)
-    src[i] = 'A';
-
-  wchar_t srcw[kSrcLen];
-  for (size_t i = 0; i < arraysize(srcw); i++)
-    srcw[i] = 'A';
-
-  for (int i = 1; i < 3; i++) {
-    src[kSrcLen - i] = 0;
-    std::string out;
-    SStringPrintf(&out, "%s", src);
-    EXPECT_STREQ(src, out.c_str());
-
-#if defined(OS_WIN)
-    srcw[kSrcLen - i] = 0;
-    std::wstring outw;
-    SStringPrintf(&outw, L"%ls", srcw);
-    EXPECT_STREQ(srcw, outw.c_str());
-#endif
-  }
-}
-
-// Test very large sprintfs that will cause the buffer to grow.
-TEST(StringPrintfTest, Grow) {
-  char src[1026];
-  for (size_t i = 0; i < arraysize(src); i++)
-    src[i] = 'A';
-  src[1025] = 0;
-
-  const char fmt[] = "%sB%sB%sB%sB%sB%sB%s";
-
-  std::string out;
-  SStringPrintf(&out, fmt, src, src, src, src, src, src, src);
-
-  const int kRefSize = 320000;
-  char* ref = new char[kRefSize];
-#if defined(OS_WIN)
-  sprintf_s(ref, kRefSize, fmt, src, src, src, src, src, src, src);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  snprintf(ref, kRefSize, fmt, src, src, src, src, src, src, src);
-#endif
-
-  EXPECT_STREQ(ref, out.c_str());
-  delete[] ref;
-}
-
-TEST(StringPrintfTest, StringAppendV) {
-  std::string out;
-  StringAppendVTestHelper(&out, "%d foo %s", 1, "bar");
-  EXPECT_EQ("1 foo bar", out);
-}
-
-// Test the boundary condition for the size of the string_util's
-// internal buffer.
-TEST(StringPrintfTest, GrowBoundary) {
-  const int kStringUtilBufLen = 1024;
-  // Our buffer should be one larger than the size of StringAppendVT's stack
-  // buffer.
-  // And need extra one for NULL-terminator.
-  const int kBufLen = kStringUtilBufLen + 1 + 1;
-  char src[kBufLen];
-  for (int i = 0; i < kBufLen - 1; ++i)
-    src[i] = 'a';
-  src[kBufLen - 1] = 0;
-
-  std::string out;
-  SStringPrintf(&out, "%s", src);
-
-  EXPECT_STREQ(src, out.c_str());
-}
-
-#if defined(OS_WIN)
-// vswprintf in Visual Studio 2013 fails when given U+FFFF. This tests that the
-// failure case is gracefuly handled. In Visual Studio 2015 the bad character
-// is passed through.
-TEST(StringPrintfTest, Invalid) {
-  wchar_t invalid[2];
-  invalid[0] = 0xffff;
-  invalid[1] = 0;
-
-  std::wstring out;
-  SStringPrintf(&out, L"%ls", invalid);
-#if _MSC_VER >= 1900
-  EXPECT_STREQ(invalid, out.c_str());
-#else
-  EXPECT_STREQ(L"", out.c_str());
-#endif
-}
-#endif
-
-// Test that StringPrintf and StringAppendV do not change errno.
-TEST(StringPrintfTest, StringPrintfErrno) {
-  errno = 1;
-  EXPECT_EQ("", StringPrintf("%s", ""));
-  EXPECT_EQ(1, errno);
-  std::string out;
-  StringAppendVTestHelper(&out, "%d foo %s", 1, "bar");
-  EXPECT_EQ(1, errno);
-}
-
-}  // namespace base
diff --git a/base/strings/sys_string_conversions_unittest.cc b/base/strings/sys_string_conversions_unittest.cc
deleted file mode 100644
index 0f4eddd..0000000
--- a/base/strings/sys_string_conversions_unittest.cc
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/sys_string_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/test/scoped_locale.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#ifdef WCHAR_T_IS_UTF32
-static const std::wstring kSysWideOldItalicLetterA = L"\x10300";
-#else
-static const std::wstring kSysWideOldItalicLetterA = L"\xd800\xdf00";
-#endif
-
-namespace base {
-
-TEST(SysStrings, SysWideToUTF8) {
-  EXPECT_EQ("Hello, world", SysWideToUTF8(L"Hello, world"));
-  EXPECT_EQ("\xe4\xbd\xa0\xe5\xa5\xbd", SysWideToUTF8(L"\x4f60\x597d"));
-
-  // >16 bits
-  EXPECT_EQ("\xF0\x90\x8C\x80", SysWideToUTF8(kSysWideOldItalicLetterA));
-
-  // Error case. When Windows finds a UTF-16 character going off the end of
-  // a string, it just converts that literal value to UTF-8, even though this
-  // is invalid.
-  //
-  // This is what XP does, but Vista has different behavior, so we don't bother
-  // verifying it:
-  // EXPECT_EQ("\xE4\xBD\xA0\xED\xA0\x80zyxw",
-  //           SysWideToUTF8(L"\x4f60\xd800zyxw"));
-
-  // Test embedded NULLs.
-  std::wstring wide_null(L"a");
-  wide_null.push_back(0);
-  wide_null.push_back('b');
-
-  std::string expected_null("a");
-  expected_null.push_back(0);
-  expected_null.push_back('b');
-
-  EXPECT_EQ(expected_null, SysWideToUTF8(wide_null));
-}
-
-TEST(SysStrings, SysUTF8ToWide) {
-  EXPECT_EQ(L"Hello, world", SysUTF8ToWide("Hello, world"));
-  EXPECT_EQ(L"\x4f60\x597d", SysUTF8ToWide("\xe4\xbd\xa0\xe5\xa5\xbd"));
-  // >16 bits
-  EXPECT_EQ(kSysWideOldItalicLetterA, SysUTF8ToWide("\xF0\x90\x8C\x80"));
-
-  // Error case. When Windows finds an invalid UTF-8 character, it just skips
-  // it. This seems weird because it's inconsistent with the reverse conversion.
-  //
-  // This is what XP does, but Vista has different behavior, so we don't bother
-  // verifying it:
-  // EXPECT_EQ(L"\x4f60zyxw", SysUTF8ToWide("\xe4\xbd\xa0\xe5\xa5zyxw"));
-
-  // Test embedded NULLs.
-  std::string utf8_null("a");
-  utf8_null.push_back(0);
-  utf8_null.push_back('b');
-
-  std::wstring expected_null(L"a");
-  expected_null.push_back(0);
-  expected_null.push_back('b');
-
-  EXPECT_EQ(expected_null, SysUTF8ToWide(utf8_null));
-}
-
-#if defined(OS_LINUX)  // Tests depend on setting a specific Linux locale.
-
-TEST(SysStrings, SysWideToNativeMB) {
-#if !defined(SYSTEM_NATIVE_UTF8)
-  ScopedLocale locale("en_US.UTF-8");
-#endif
-  EXPECT_EQ("Hello, world", SysWideToNativeMB(L"Hello, world"));
-  EXPECT_EQ("\xe4\xbd\xa0\xe5\xa5\xbd", SysWideToNativeMB(L"\x4f60\x597d"));
-
-  // >16 bits
-  EXPECT_EQ("\xF0\x90\x8C\x80", SysWideToNativeMB(kSysWideOldItalicLetterA));
-
-  // Error case. When Windows finds a UTF-16 character going off the end of
-  // a string, it just converts that literal value to UTF-8, even though this
-  // is invalid.
-  //
-  // This is what XP does, but Vista has different behavior, so we don't bother
-  // verifying it:
-  // EXPECT_EQ("\xE4\xBD\xA0\xED\xA0\x80zyxw",
-  //           SysWideToNativeMB(L"\x4f60\xd800zyxw"));
-
-  // Test embedded NULLs.
-  std::wstring wide_null(L"a");
-  wide_null.push_back(0);
-  wide_null.push_back('b');
-
-  std::string expected_null("a");
-  expected_null.push_back(0);
-  expected_null.push_back('b');
-
-  EXPECT_EQ(expected_null, SysWideToNativeMB(wide_null));
-}
-
-// We assume the test is running in a UTF8 locale.
-TEST(SysStrings, SysNativeMBToWide) {
-#if !defined(SYSTEM_NATIVE_UTF8)
-  ScopedLocale locale("en_US.UTF-8");
-#endif
-  EXPECT_EQ(L"Hello, world", SysNativeMBToWide("Hello, world"));
-  EXPECT_EQ(L"\x4f60\x597d", SysNativeMBToWide("\xe4\xbd\xa0\xe5\xa5\xbd"));
-  // >16 bits
-  EXPECT_EQ(kSysWideOldItalicLetterA, SysNativeMBToWide("\xF0\x90\x8C\x80"));
-
-  // Error case. When Windows finds an invalid UTF-8 character, it just skips
-  // it. This seems weird because it's inconsistent with the reverse conversion.
-  //
-  // This is what XP does, but Vista has different behavior, so we don't bother
-  // verifying it:
-  // EXPECT_EQ(L"\x4f60zyxw", SysNativeMBToWide("\xe4\xbd\xa0\xe5\xa5zyxw"));
-
-  // Test embedded NULLs.
-  std::string utf8_null("a");
-  utf8_null.push_back(0);
-  utf8_null.push_back('b');
-
-  std::wstring expected_null(L"a");
-  expected_null.push_back(0);
-  expected_null.push_back('b');
-
-  EXPECT_EQ(expected_null, SysNativeMBToWide(utf8_null));
-}
-
-static const wchar_t* const kConvertRoundtripCases[] = {
-  L"Google Video",
-  // "网页 图片 资讯更多 »"
-  L"\x7f51\x9875\x0020\x56fe\x7247\x0020\x8d44\x8baf\x66f4\x591a\x0020\x00bb",
-  //  "Παγκόσμιος Ιστός"
-  L"\x03a0\x03b1\x03b3\x03ba\x03cc\x03c3\x03bc\x03b9"
-  L"\x03bf\x03c2\x0020\x0399\x03c3\x03c4\x03cc\x03c2",
-  // "Поиск страниц на русском"
-  L"\x041f\x043e\x0438\x0441\x043a\x0020\x0441\x0442"
-  L"\x0440\x0430\x043d\x0438\x0446\x0020\x043d\x0430"
-  L"\x0020\x0440\x0443\x0441\x0441\x043a\x043e\x043c",
-  // "전체서비스"
-  L"\xc804\xccb4\xc11c\xbe44\xc2a4",
-
-  // Test characters that take more than 16 bits. This will depend on whether
-  // wchar_t is 16 or 32 bits.
-#if defined(WCHAR_T_IS_UTF16)
-  L"\xd800\xdf00",
-  // ?????  (Mathematical Alphanumeric Symbols (U+011d40 - U+011d44 : A,B,C,D,E)
-  L"\xd807\xdd40\xd807\xdd41\xd807\xdd42\xd807\xdd43\xd807\xdd44",
-#elif defined(WCHAR_T_IS_UTF32)
-  L"\x10300",
-  // ?????  (Mathematical Alphanumeric Symbols (U+011d40 - U+011d44 : A,B,C,D,E)
-  L"\x11d40\x11d41\x11d42\x11d43\x11d44",
-#endif
-};
-
-
-TEST(SysStrings, SysNativeMBAndWide) {
-#if !defined(SYSTEM_NATIVE_UTF8)
-  ScopedLocale locale("en_US.UTF-8");
-#endif
-  for (size_t i = 0; i < arraysize(kConvertRoundtripCases); ++i) {
-    std::wstring wide = kConvertRoundtripCases[i];
-    std::wstring trip = SysNativeMBToWide(SysWideToNativeMB(wide));
-    EXPECT_EQ(wide.size(), trip.size());
-    EXPECT_EQ(wide, trip);
-  }
-
-  // We assume our test is running in UTF-8, so double check through ICU.
-  for (size_t i = 0; i < arraysize(kConvertRoundtripCases); ++i) {
-    std::wstring wide = kConvertRoundtripCases[i];
-    std::wstring trip = SysNativeMBToWide(WideToUTF8(wide));
-    EXPECT_EQ(wide.size(), trip.size());
-    EXPECT_EQ(wide, trip);
-  }
-
-  for (size_t i = 0; i < arraysize(kConvertRoundtripCases); ++i) {
-    std::wstring wide = kConvertRoundtripCases[i];
-    std::wstring trip = UTF8ToWide(SysWideToNativeMB(wide));
-    EXPECT_EQ(wide.size(), trip.size());
-    EXPECT_EQ(wide, trip);
-  }
-}
-#endif  // OS_LINUX
-
-}  // namespace base
diff --git a/base/strings/utf_offset_string_conversions_unittest.cc b/base/strings/utf_offset_string_conversions_unittest.cc
deleted file mode 100644
index c5ce647..0000000
--- a/base/strings/utf_offset_string_conversions_unittest.cc
+++ /dev/null
@@ -1,300 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include <algorithm>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/utf_offset_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-static const size_t kNpos = string16::npos;
-
-}  // namespace
-
-TEST(UTFOffsetStringConversionsTest, AdjustOffset) {
-  struct UTF8ToUTF16Case {
-    const char* utf8;
-    size_t input_offset;
-    size_t output_offset;
-  } utf8_to_utf16_cases[] = {
-    {"", 0, 0},
-    {"", kNpos, kNpos},
-    {"\xe4\xbd\xa0\xe5\xa5\xbd", 1, kNpos},
-    {"\xe4\xbd\xa0\xe5\xa5\xbd", 3, 1},
-    {"\xed\xb0\x80z", 3, 3},
-    {"A\xF0\x90\x8C\x80z", 1, 1},
-    {"A\xF0\x90\x8C\x80z", 2, kNpos},
-    {"A\xF0\x90\x8C\x80z", 5, 3},
-    {"A\xF0\x90\x8C\x80z", 6, 4},
-    {"A\xF0\x90\x8C\x80z", kNpos, kNpos},
-  };
-  for (size_t i = 0; i < arraysize(utf8_to_utf16_cases); ++i) {
-    const size_t offset = utf8_to_utf16_cases[i].input_offset;
-    std::vector<size_t> offsets;
-    offsets.push_back(offset);
-    UTF8ToUTF16AndAdjustOffsets(utf8_to_utf16_cases[i].utf8, &offsets);
-    EXPECT_EQ(utf8_to_utf16_cases[i].output_offset, offsets[0]);
-  }
-
-  struct UTF16ToUTF8Case {
-    char16 utf16[10];
-    size_t input_offset;
-    size_t output_offset;
-  } utf16_to_utf8_cases[] = {
-      {{}, 0, 0},
-      // Converted to 3-byte utf-8 sequences
-      {{0x5909, 0x63DB}, 3, kNpos},
-      {{0x5909, 0x63DB}, 2, 6},
-      {{0x5909, 0x63DB}, 1, 3},
-      {{0x5909, 0x63DB}, 0, 0},
-      // Converted to 2-byte utf-8 sequences
-      {{'A', 0x00bc, 0x00be, 'z'}, 1, 1},
-      {{'A', 0x00bc, 0x00be, 'z'}, 2, 3},
-      {{'A', 0x00bc, 0x00be, 'z'}, 3, 5},
-      {{'A', 0x00bc, 0x00be, 'z'}, 4, 6},
-      // Surrogate pair
-      {{'A', 0xd800, 0xdf00, 'z'}, 1, 1},
-      {{'A', 0xd800, 0xdf00, 'z'}, 2, kNpos},
-      {{'A', 0xd800, 0xdf00, 'z'}, 3, 5},
-      {{'A', 0xd800, 0xdf00, 'z'}, 4, 6},
-  };
-  for (size_t i = 0; i < arraysize(utf16_to_utf8_cases); ++i) {
-    size_t offset = utf16_to_utf8_cases[i].input_offset;
-    std::vector<size_t> offsets;
-    offsets.push_back(offset);
-    UTF16ToUTF8AndAdjustOffsets(utf16_to_utf8_cases[i].utf16, &offsets);
-    EXPECT_EQ(utf16_to_utf8_cases[i].output_offset, offsets[0]) << i;
-  }
-}
-
-TEST(UTFOffsetStringConversionsTest, LimitOffsets) {
-  const OffsetAdjuster::Adjustments kNoAdjustments;
-  const size_t kLimit = 10;
-  const size_t kItems = 20;
-  std::vector<size_t> size_ts;
-  for (size_t t = 0; t < kItems; ++t) {
-    size_ts.push_back(t);
-    OffsetAdjuster::AdjustOffset(kNoAdjustments, &size_ts.back(), kLimit);
-  }
-  size_t unlimited_count = 0;
-  for (std::vector<size_t>::iterator ti = size_ts.begin(); ti != size_ts.end();
-       ++ti) {
-    if (*ti != kNpos)
-      ++unlimited_count;
-  }
-  EXPECT_EQ(11U, unlimited_count);
-
-  // Reverse the values in the vector and try again.
-  size_ts.clear();
-  for (size_t t = kItems; t > 0; --t) {
-    size_ts.push_back(t - 1);
-    OffsetAdjuster::AdjustOffset(kNoAdjustments, &size_ts.back(), kLimit);
-  }
-  unlimited_count = 0;
-  for (std::vector<size_t>::iterator ti = size_ts.begin(); ti != size_ts.end();
-       ++ti) {
-    if (*ti != kNpos)
-      ++unlimited_count;
-  }
-  EXPECT_EQ(11U, unlimited_count);
-}
-
-TEST(UTFOffsetStringConversionsTest, AdjustOffsets) {
-  // Imagine we have strings as shown in the following cases where the
-  // X's represent encoded characters.
-  // 1: abcXXXdef ==> abcXdef
-  {
-    std::vector<size_t> offsets;
-    for (size_t t = 0; t <= 9; ++t)
-      offsets.push_back(t);
-    OffsetAdjuster::Adjustments adjustments;
-    adjustments.push_back(OffsetAdjuster::Adjustment(3, 3, 1));
-    OffsetAdjuster::AdjustOffsets(adjustments, &offsets);
-    size_t expected_1[] = {0, 1, 2, 3, kNpos, kNpos, 4, 5, 6, 7};
-    EXPECT_EQ(offsets.size(), arraysize(expected_1));
-    for (size_t i = 0; i < arraysize(expected_1); ++i)
-      EXPECT_EQ(expected_1[i], offsets[i]);
-  }
-
-  // 2: XXXaXXXXbcXXXXXXXdefXXX ==> XaXXbcXXXXdefX
-  {
-    std::vector<size_t> offsets;
-    for (size_t t = 0; t <= 23; ++t)
-      offsets.push_back(t);
-    OffsetAdjuster::Adjustments adjustments;
-    adjustments.push_back(OffsetAdjuster::Adjustment(0, 3, 1));
-    adjustments.push_back(OffsetAdjuster::Adjustment(4, 4, 2));
-    adjustments.push_back(OffsetAdjuster::Adjustment(10, 7, 4));
-    adjustments.push_back(OffsetAdjuster::Adjustment(20, 3, 1));
-    OffsetAdjuster::AdjustOffsets(adjustments, &offsets);
-    size_t expected_2[] = {
-      0, kNpos, kNpos, 1, 2, kNpos, kNpos, kNpos, 4, 5, 6, kNpos, kNpos, kNpos,
-      kNpos, kNpos, kNpos, 10, 11, 12, 13, kNpos, kNpos, 14
-    };
-    EXPECT_EQ(offsets.size(), arraysize(expected_2));
-    for (size_t i = 0; i < arraysize(expected_2); ++i)
-      EXPECT_EQ(expected_2[i], offsets[i]);
-  }
-
-  // 3: XXXaXXXXbcdXXXeXX ==> aXXXXbcdXXXe
-  {
-    std::vector<size_t> offsets;
-    for (size_t t = 0; t <= 17; ++t)
-      offsets.push_back(t);
-    OffsetAdjuster::Adjustments adjustments;
-    adjustments.push_back(OffsetAdjuster::Adjustment(0, 3, 0));
-    adjustments.push_back(OffsetAdjuster::Adjustment(4, 4, 4));
-    adjustments.push_back(OffsetAdjuster::Adjustment(11, 3, 3));
-    adjustments.push_back(OffsetAdjuster::Adjustment(15, 2, 0));
-    OffsetAdjuster::AdjustOffsets(adjustments, &offsets);
-    size_t expected_3[] = {
-      0, kNpos, kNpos, 0, 1, kNpos, kNpos, kNpos, 5, 6, 7, 8, kNpos, kNpos, 11,
-      12, kNpos, 12
-    };
-    EXPECT_EQ(offsets.size(), arraysize(expected_3));
-    for (size_t i = 0; i < arraysize(expected_3); ++i)
-      EXPECT_EQ(expected_3[i], offsets[i]);
-  }
-}
-
-TEST(UTFOffsetStringConversionsTest, UnadjustOffsets) {
-  // Imagine we have strings as shown in the following cases where the
-  // X's represent encoded characters.
-  // 1: abcXXXdef ==> abcXdef
-  {
-    std::vector<size_t> offsets;
-    for (size_t t = 0; t <= 7; ++t)
-      offsets.push_back(t);
-    OffsetAdjuster::Adjustments adjustments;
-    adjustments.push_back(OffsetAdjuster::Adjustment(3, 3, 1));
-    OffsetAdjuster::UnadjustOffsets(adjustments, &offsets);
-    size_t expected_1[] = {0, 1, 2, 3, 6, 7, 8, 9};
-    EXPECT_EQ(offsets.size(), arraysize(expected_1));
-    for (size_t i = 0; i < arraysize(expected_1); ++i)
-      EXPECT_EQ(expected_1[i], offsets[i]);
-  }
-
-  // 2: XXXaXXXXbcXXXXXXXdefXXX ==> XaXXbcXXXXdefX
-  {
-    std::vector<size_t> offsets;
-    for (size_t t = 0; t <= 14; ++t)
-      offsets.push_back(t);
-    OffsetAdjuster::Adjustments adjustments;
-    adjustments.push_back(OffsetAdjuster::Adjustment(0, 3, 1));
-    adjustments.push_back(OffsetAdjuster::Adjustment(4, 4, 2));
-    adjustments.push_back(OffsetAdjuster::Adjustment(10, 7, 4));
-    adjustments.push_back(OffsetAdjuster::Adjustment(20, 3, 1));
-    OffsetAdjuster::UnadjustOffsets(adjustments, &offsets);
-    size_t expected_2[] = {
-      0, 3, 4, kNpos, 8, 9, 10, kNpos, kNpos, kNpos, 17, 18, 19, 20, 23
-    };
-    EXPECT_EQ(offsets.size(), arraysize(expected_2));
-    for (size_t i = 0; i < arraysize(expected_2); ++i)
-      EXPECT_EQ(expected_2[i], offsets[i]);
-  }
-
-  // 3: XXXaXXXXbcdXXXeXX ==> aXXXXbcdXXXe
-  {
-    std::vector<size_t> offsets;
-    for (size_t t = 0; t <= 12; ++t)
-      offsets.push_back(t);
-    OffsetAdjuster::Adjustments adjustments;
-    adjustments.push_back(OffsetAdjuster::Adjustment(0, 3, 0));
-    adjustments.push_back(OffsetAdjuster::Adjustment(4, 4, 4));
-    adjustments.push_back(OffsetAdjuster::Adjustment(11, 3, 3));
-    adjustments.push_back(OffsetAdjuster::Adjustment(15, 2, 0));
-    OffsetAdjuster::UnadjustOffsets(adjustments, &offsets);
-    size_t expected_3[] = {
-      0,  // this could just as easily be 3
-      4, kNpos, kNpos, kNpos, 8, 9, 10, 11, kNpos, kNpos, 14,
-      15  // this could just as easily be 17
-    };
-    EXPECT_EQ(offsets.size(), arraysize(expected_3));
-    for (size_t i = 0; i < arraysize(expected_3); ++i)
-      EXPECT_EQ(expected_3[i], offsets[i]);
-  }
-}
-
-// MergeSequentialAdjustments is used by net/base/escape.{h,cc} and
-// net/base/net_util.{h,cc}.  The two tests EscapeTest.AdjustOffset and
-// NetUtilTest.FormatUrlWithOffsets test its behavior extensively.  This
-// is simply a short, additional test.
-TEST(UTFOffsetStringConversionsTest, MergeSequentialAdjustments) {
-  // Pretend the input string is "abcdefghijklmnopqrstuvwxyz".
-
-  // Set up |first_adjustments| to
-  // - remove the leading "a"
-  // - combine the "bc" into one character (call it ".")
-  // - remove the "f"
-  // - remove the "tuv"
-  // The resulting string should be ".deghijklmnopqrswxyz".
-  OffsetAdjuster::Adjustments first_adjustments;
-  first_adjustments.push_back(OffsetAdjuster::Adjustment(0, 1, 0));
-  first_adjustments.push_back(OffsetAdjuster::Adjustment(1, 2, 1));
-  first_adjustments.push_back(OffsetAdjuster::Adjustment(5, 1, 0));
-  first_adjustments.push_back(OffsetAdjuster::Adjustment(19, 3, 0));
-
-  // Set up |adjustments_on_adjusted_string| to
-  // - combine the "." character that replaced "bc" with "d" into one character
-  //   (call it "?")
-  // - remove the "egh"
-  // - expand the "i" into two characters (call them "12")
-  // - combine the "jkl" into one character (call it "@")
-  // - expand the "z" into two characters (call it "34")
-  // The resulting string should be "?12@mnopqrswxy34".
-  OffsetAdjuster::Adjustments adjustments_on_adjusted_string;
-  adjustments_on_adjusted_string.push_back(OffsetAdjuster::Adjustment(
-      0, 2, 1));
-  adjustments_on_adjusted_string.push_back(OffsetAdjuster::Adjustment(
-      2, 3, 0));
-  adjustments_on_adjusted_string.push_back(OffsetAdjuster::Adjustment(
-      5, 1, 2));
-  adjustments_on_adjusted_string.push_back(OffsetAdjuster::Adjustment(
-      6, 3, 1));
-  adjustments_on_adjusted_string.push_back(OffsetAdjuster::Adjustment(
-      19, 1, 2));
-
-  // Now merge the adjustments and check the results.
-  OffsetAdjuster::MergeSequentialAdjustments(first_adjustments,
-                                             &adjustments_on_adjusted_string);
-  // The merged adjustments should look like
-  // - combine abcd into "?"
-  //   - note: it's also reasonable for the Merge function to instead produce
-  //     two adjustments instead of this, one to remove a and another to
-  //     combine bcd into "?".  This test verifies the current behavior.
-  // - remove efgh
-  // - expand i into "12"
-  // - combine jkl into "@"
-  // - remove tuv
-  // - expand z into "34"
-  ASSERT_EQ(6u, adjustments_on_adjusted_string.size());
-  EXPECT_EQ(0u, adjustments_on_adjusted_string[0].original_offset);
-  EXPECT_EQ(4u, adjustments_on_adjusted_string[0].original_length);
-  EXPECT_EQ(1u, adjustments_on_adjusted_string[0].output_length);
-  EXPECT_EQ(4u, adjustments_on_adjusted_string[1].original_offset);
-  EXPECT_EQ(4u, adjustments_on_adjusted_string[1].original_length);
-  EXPECT_EQ(0u, adjustments_on_adjusted_string[1].output_length);
-  EXPECT_EQ(8u, adjustments_on_adjusted_string[2].original_offset);
-  EXPECT_EQ(1u, adjustments_on_adjusted_string[2].original_length);
-  EXPECT_EQ(2u, adjustments_on_adjusted_string[2].output_length);
-  EXPECT_EQ(9u, adjustments_on_adjusted_string[3].original_offset);
-  EXPECT_EQ(3u, adjustments_on_adjusted_string[3].original_length);
-  EXPECT_EQ(1u, adjustments_on_adjusted_string[3].output_length);
-  EXPECT_EQ(19u, adjustments_on_adjusted_string[4].original_offset);
-  EXPECT_EQ(3u, adjustments_on_adjusted_string[4].original_length);
-  EXPECT_EQ(0u, adjustments_on_adjusted_string[4].output_length);
-  EXPECT_EQ(25u, adjustments_on_adjusted_string[5].original_offset);
-  EXPECT_EQ(1u, adjustments_on_adjusted_string[5].original_length);
-  EXPECT_EQ(2u, adjustments_on_adjusted_string[5].output_length);
-}
-
-}  // namespace base
diff --git a/base/strings/utf_string_conversions_unittest.cc b/base/strings/utf_string_conversions_unittest.cc
deleted file mode 100644
index ce776c8..0000000
--- a/base/strings/utf_string_conversions_unittest.cc
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-const wchar_t* const kConvertRoundtripCases[] = {
-  L"Google Video",
-  // "网页 图片 资讯更多 »"
-  L"\x7f51\x9875\x0020\x56fe\x7247\x0020\x8d44\x8baf\x66f4\x591a\x0020\x00bb",
-  //  "Παγκόσμιος Ιστός"
-  L"\x03a0\x03b1\x03b3\x03ba\x03cc\x03c3\x03bc\x03b9"
-  L"\x03bf\x03c2\x0020\x0399\x03c3\x03c4\x03cc\x03c2",
-  // "Поиск страниц на русском"
-  L"\x041f\x043e\x0438\x0441\x043a\x0020\x0441\x0442"
-  L"\x0440\x0430\x043d\x0438\x0446\x0020\x043d\x0430"
-  L"\x0020\x0440\x0443\x0441\x0441\x043a\x043e\x043c",
-  // "전체서비스"
-  L"\xc804\xccb4\xc11c\xbe44\xc2a4",
-
-  // Test characters that take more than 16 bits. This will depend on whether
-  // wchar_t is 16 or 32 bits.
-#if defined(WCHAR_T_IS_UTF16)
-  L"\xd800\xdf00",
-  // ?????  (Mathematical Alphanumeric Symbols (U+011d40 - U+011d44 : A,B,C,D,E)
-  L"\xd807\xdd40\xd807\xdd41\xd807\xdd42\xd807\xdd43\xd807\xdd44",
-#elif defined(WCHAR_T_IS_UTF32)
-  L"\x10300",
-  // ?????  (Mathematical Alphanumeric Symbols (U+011d40 - U+011d44 : A,B,C,D,E)
-  L"\x11d40\x11d41\x11d42\x11d43\x11d44",
-#endif
-};
-
-}  // namespace
-
-TEST(UTFStringConversionsTest, ConvertUTF8AndWide) {
-  // we round-trip all the wide strings through UTF-8 to make sure everything
-  // agrees on the conversion. This uses the stream operators to test them
-  // simultaneously.
-  for (size_t i = 0; i < arraysize(kConvertRoundtripCases); ++i) {
-    std::ostringstream utf8;
-    utf8 << WideToUTF8(kConvertRoundtripCases[i]);
-    std::wostringstream wide;
-    wide << UTF8ToWide(utf8.str());
-
-    EXPECT_EQ(kConvertRoundtripCases[i], wide.str());
-  }
-}
-
-TEST(UTFStringConversionsTest, ConvertUTF8AndWideEmptyString) {
-  // An empty std::wstring should be converted to an empty std::string,
-  // and vice versa.
-  std::wstring wempty;
-  std::string empty;
-  EXPECT_EQ(empty, WideToUTF8(wempty));
-  EXPECT_EQ(wempty, UTF8ToWide(empty));
-}
-
-TEST(UTFStringConversionsTest, ConvertUTF8ToWide) {
-  struct UTF8ToWideCase {
-    const char* utf8;
-    const wchar_t* wide;
-    bool success;
-  } convert_cases[] = {
-    // Regular UTF-8 input.
-    {"\xe4\xbd\xa0\xe5\xa5\xbd", L"\x4f60\x597d", true},
-    // Non-character is passed through.
-    {"\xef\xbf\xbfHello", L"\xffffHello", true},
-    // Truncated UTF-8 sequence.
-    {"\xe4\xa0\xe5\xa5\xbd", L"\xfffd\x597d", false},
-    // Truncated off the end.
-    {"\xe5\xa5\xbd\xe4\xa0", L"\x597d\xfffd", false},
-    // Non-shortest-form UTF-8.
-    {"\xf0\x84\xbd\xa0\xe5\xa5\xbd", L"\xfffd\xfffd\xfffd\xfffd\x597d", false},
-    // This UTF-8 character decodes to a UTF-16 surrogate, which is illegal.
-    {"\xed\xb0\x80", L"\xfffd\xfffd\xfffd", false},
-    // Non-BMP characters. The second is a non-character regarded as valid.
-    // The result will either be in UTF-16 or UTF-32.
-#if defined(WCHAR_T_IS_UTF16)
-    {"A\xF0\x90\x8C\x80z", L"A\xd800\xdf00z", true},
-    {"A\xF4\x8F\xBF\xBEz", L"A\xdbff\xdffez", true},
-#elif defined(WCHAR_T_IS_UTF32)
-    {"A\xF0\x90\x8C\x80z", L"A\x10300z", true},
-    {"A\xF4\x8F\xBF\xBEz", L"A\x10fffez", true},
-#endif
-  };
-
-  for (size_t i = 0; i < arraysize(convert_cases); i++) {
-    std::wstring converted;
-    EXPECT_EQ(convert_cases[i].success,
-              UTF8ToWide(convert_cases[i].utf8,
-                         strlen(convert_cases[i].utf8),
-                         &converted));
-    std::wstring expected(convert_cases[i].wide);
-    EXPECT_EQ(expected, converted);
-  }
-
-  // Manually test an embedded NULL.
-  std::wstring converted;
-  EXPECT_TRUE(UTF8ToWide("\00Z\t", 3, &converted));
-  ASSERT_EQ(3U, converted.length());
-  EXPECT_EQ(static_cast<wchar_t>(0), converted[0]);
-  EXPECT_EQ('Z', converted[1]);
-  EXPECT_EQ('\t', converted[2]);
-
-  // Make sure that conversion replaces, not appends.
-  EXPECT_TRUE(UTF8ToWide("B", 1, &converted));
-  ASSERT_EQ(1U, converted.length());
-  EXPECT_EQ('B', converted[0]);
-}
-
-#if defined(WCHAR_T_IS_UTF16)
-// This test is only valid when wchar_t == UTF-16.
-TEST(UTFStringConversionsTest, ConvertUTF16ToUTF8) {
-  struct WideToUTF8Case {
-    const wchar_t* utf16;
-    const char* utf8;
-    bool success;
-  } convert_cases[] = {
-    // Regular UTF-16 input.
-    {L"\x4f60\x597d", "\xe4\xbd\xa0\xe5\xa5\xbd", true},
-    // Test a non-BMP character.
-    {L"\xd800\xdf00", "\xF0\x90\x8C\x80", true},
-    // Non-characters are passed through.
-    {L"\xffffHello", "\xEF\xBF\xBFHello", true},
-    {L"\xdbff\xdffeHello", "\xF4\x8F\xBF\xBEHello", true},
-    // The first character is a truncated UTF-16 character.
-    {L"\xd800\x597d", "\xef\xbf\xbd\xe5\xa5\xbd", false},
-    // Truncated at the end.
-    {L"\x597d\xd800", "\xe5\xa5\xbd\xef\xbf\xbd", false},
-  };
-
-  for (const auto& test : convert_cases) {
-    std::string converted;
-    EXPECT_EQ(test.success,
-              WideToUTF8(test.utf16, wcslen(test.utf16), &converted));
-    std::string expected(test.utf8);
-    EXPECT_EQ(expected, converted);
-  }
-}
-
-#elif defined(WCHAR_T_IS_UTF32)
-// This test is only valid when wchar_t == UTF-32.
-TEST(UTFStringConversionsTest, ConvertUTF32ToUTF8) {
-  struct WideToUTF8Case {
-    const wchar_t* utf32;
-    const char* utf8;
-    bool success;
-  } convert_cases[] = {
-    // Regular 16-bit input.
-    {L"\x4f60\x597d", "\xe4\xbd\xa0\xe5\xa5\xbd", true},
-    // Test a non-BMP character.
-    {L"A\x10300z", "A\xF0\x90\x8C\x80z", true},
-    // Non-characters are passed through.
-    {L"\xffffHello", "\xEF\xBF\xBFHello", true},
-    {L"\x10fffeHello", "\xF4\x8F\xBF\xBEHello", true},
-    // Invalid Unicode code points.
-    {L"\xfffffffHello", "\xEF\xBF\xBDHello", false},
-    // The first character is a truncated UTF-16 character.
-    {L"\xd800\x597d", "\xef\xbf\xbd\xe5\xa5\xbd", false},
-    {L"\xdc01Hello", "\xef\xbf\xbdHello", false},
-  };
-
-  for (const auto& test : convert_cases) {
-    std::string converted;
-    EXPECT_EQ(test.success,
-              WideToUTF8(test.utf32, wcslen(test.utf32), &converted));
-    std::string expected(test.utf8);
-    EXPECT_EQ(expected, converted);
-  }
-}
-#endif  // defined(WCHAR_T_IS_UTF32)
-
-TEST(UTFStringConversionsTest, ConvertMultiString) {
-  static char16 multi16[] = {
-    'f', 'o', 'o', '\0',
-    'b', 'a', 'r', '\0',
-    'b', 'a', 'z', '\0',
-    '\0'
-  };
-  static char multi[] = {
-    'f', 'o', 'o', '\0',
-    'b', 'a', 'r', '\0',
-    'b', 'a', 'z', '\0',
-    '\0'
-  };
-  string16 multistring16;
-  memcpy(WriteInto(&multistring16, arraysize(multi16)), multi16,
-                   sizeof(multi16));
-  EXPECT_EQ(arraysize(multi16) - 1, multistring16.length());
-  std::string expected;
-  memcpy(WriteInto(&expected, arraysize(multi)), multi, sizeof(multi));
-  EXPECT_EQ(arraysize(multi) - 1, expected.length());
-  const std::string& converted = UTF16ToUTF8(multistring16);
-  EXPECT_EQ(arraysize(multi) - 1, converted.length());
-  EXPECT_EQ(expected, converted);
-}
-
-}  // namespace base
diff --git a/base/supports_user_data_unittest.cc b/base/supports_user_data_unittest.cc
deleted file mode 100644
index 2e0a724..0000000
--- a/base/supports_user_data_unittest.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/supports_user_data.h"
-
-#include <vector>
-
-#include "base/memory/ptr_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-struct TestSupportsUserData : public SupportsUserData {};
-
-struct UsesItself : public SupportsUserData::Data {
-  UsesItself(SupportsUserData* supports_user_data, const void* key)
-      : supports_user_data_(supports_user_data),
-        key_(key) {
-  }
-
-  ~UsesItself() override {
-    EXPECT_EQ(nullptr, supports_user_data_->GetUserData(key_));
-  }
-
-  SupportsUserData* supports_user_data_;
-  const void* key_;
-};
-
-TEST(SupportsUserDataTest, ClearWorksRecursively) {
-  TestSupportsUserData supports_user_data;
-  char key = 0;
-  supports_user_data.SetUserData(
-      &key, std::make_unique<UsesItself>(&supports_user_data, &key));
-  // Destruction of supports_user_data runs the actual test.
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/sync_socket_unittest.cc b/base/sync_socket_unittest.cc
deleted file mode 100644
index fdcd9a1..0000000
--- a/base/sync_socket_unittest.cc
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/sync_socket.h"
-
-#include "base/macros.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-constexpr TimeDelta kReceiveTimeout = base::TimeDelta::FromMilliseconds(750);
-
-class HangingReceiveThread : public DelegateSimpleThread::Delegate {
- public:
-  explicit HangingReceiveThread(SyncSocket* socket, bool with_timeout)
-      : socket_(socket),
-        thread_(this, "HangingReceiveThread"),
-        with_timeout_(with_timeout),
-        started_event_(WaitableEvent::ResetPolicy::MANUAL,
-                       WaitableEvent::InitialState::NOT_SIGNALED),
-        done_event_(WaitableEvent::ResetPolicy::MANUAL,
-                    WaitableEvent::InitialState::NOT_SIGNALED) {
-    thread_.Start();
-  }
-
-  ~HangingReceiveThread() override = default;
-
-  void Run() override {
-    int data = 0;
-    ASSERT_EQ(socket_->Peek(), 0u);
-
-    started_event_.Signal();
-
-    if (with_timeout_) {
-      ASSERT_EQ(0u, socket_->ReceiveWithTimeout(&data, sizeof(data),
-                                                kReceiveTimeout));
-    } else {
-      ASSERT_EQ(0u, socket_->Receive(&data, sizeof(data)));
-    }
-
-    done_event_.Signal();
-  }
-
-  void Stop() {
-    thread_.Join();
-  }
-
-  WaitableEvent* started_event() { return &started_event_; }
-  WaitableEvent* done_event() { return &done_event_; }
-
- private:
-  SyncSocket* socket_;
-  DelegateSimpleThread thread_;
-  bool with_timeout_;
-  WaitableEvent started_event_;
-  WaitableEvent done_event_;
-
-  DISALLOW_COPY_AND_ASSIGN(HangingReceiveThread);
-};
-
-// Tests sending data between two SyncSockets. Uses ASSERT() and thus will exit
-// early upon failure.  Callers should use ASSERT_NO_FATAL_FAILURE() if testing
-// continues after return.
-void SendReceivePeek(SyncSocket* socket_a, SyncSocket* socket_b) {
-  int received = 0;
-  const int kSending = 123;
-  static_assert(sizeof(kSending) == sizeof(received), "invalid data size");
-
-  ASSERT_EQ(0u, socket_a->Peek());
-  ASSERT_EQ(0u, socket_b->Peek());
-
-  // Verify |socket_a| can send to |socket_a| and |socket_a| can Receive from
-  // |socket_a|.
-  ASSERT_EQ(sizeof(kSending), socket_a->Send(&kSending, sizeof(kSending)));
-  ASSERT_EQ(sizeof(kSending), socket_b->Peek());
-  ASSERT_EQ(sizeof(kSending), socket_b->Receive(&received, sizeof(kSending)));
-  ASSERT_EQ(kSending, received);
-
-  ASSERT_EQ(0u, socket_a->Peek());
-  ASSERT_EQ(0u, socket_b->Peek());
-
-  // Now verify the reverse.
-  received = 0;
-  ASSERT_EQ(sizeof(kSending), socket_b->Send(&kSending, sizeof(kSending)));
-  ASSERT_EQ(sizeof(kSending), socket_a->Peek());
-  ASSERT_EQ(sizeof(kSending), socket_a->Receive(&received, sizeof(kSending)));
-  ASSERT_EQ(kSending, received);
-
-  ASSERT_EQ(0u, socket_a->Peek());
-  ASSERT_EQ(0u, socket_b->Peek());
-
-  ASSERT_TRUE(socket_a->Close());
-  ASSERT_TRUE(socket_b->Close());
-}
-
-}  // namespace
-
-class SyncSocketTest : public testing::Test {
- public:
-  void SetUp() override {
-    ASSERT_TRUE(SyncSocket::CreatePair(&socket_a_, &socket_b_));
-  }
-
- protected:
-  SyncSocket socket_a_;
-  SyncSocket socket_b_;
-};
-
-TEST_F(SyncSocketTest, NormalSendReceivePeek) {
-  SendReceivePeek(&socket_a_, &socket_b_);
-}
-
-TEST_F(SyncSocketTest, ClonedSendReceivePeek) {
-  SyncSocket socket_c(socket_a_.Release());
-  SyncSocket socket_d(socket_b_.Release());
-  SendReceivePeek(&socket_c, &socket_d);
-};
-
-class CancelableSyncSocketTest : public testing::Test {
- public:
-  void SetUp() override {
-    ASSERT_TRUE(CancelableSyncSocket::CreatePair(&socket_a_, &socket_b_));
-  }
-
- protected:
-  CancelableSyncSocket socket_a_;
-  CancelableSyncSocket socket_b_;
-};
-
-TEST_F(CancelableSyncSocketTest, NormalSendReceivePeek) {
-  SendReceivePeek(&socket_a_, &socket_b_);
-}
-
-TEST_F(CancelableSyncSocketTest, ClonedSendReceivePeek) {
-  CancelableSyncSocket socket_c(socket_a_.Release());
-  CancelableSyncSocket socket_d(socket_b_.Release());
-  SendReceivePeek(&socket_c, &socket_d);
-}
-
-TEST_F(CancelableSyncSocketTest, ShutdownCancelsReceive) {
-  HangingReceiveThread thread(&socket_b_, /* with_timeout = */ false);
-
-  // Wait for the thread to be started. Note that this doesn't guarantee that
-  // Receive() is called before Shutdown().
-  thread.started_event()->Wait();
-
-  EXPECT_TRUE(socket_b_.Shutdown());
-  EXPECT_TRUE(thread.done_event()->TimedWait(kReceiveTimeout));
-
-  thread.Stop();
-}
-
-TEST_F(CancelableSyncSocketTest, ShutdownCancelsReceiveWithTimeout) {
-  HangingReceiveThread thread(&socket_b_, /* with_timeout = */ true);
-
-  // Wait for the thread to be started. Note that this doesn't guarantee that
-  // Receive() is called before Shutdown().
-  thread.started_event()->Wait();
-
-  EXPECT_TRUE(socket_b_.Shutdown());
-  EXPECT_TRUE(thread.done_event()->TimedWait(kReceiveTimeout));
-
-  thread.Stop();
-}
-
-TEST_F(CancelableSyncSocketTest, ReceiveAfterShutdown) {
-  socket_a_.Shutdown();
-  int data = 0;
-  EXPECT_EQ(0u, socket_a_.Receive(&data, sizeof(data)));
-}
-
-TEST_F(CancelableSyncSocketTest, ReceiveWithTimeoutAfterShutdown) {
-  socket_a_.Shutdown();
-  TimeTicks start = TimeTicks::Now();
-  int data = 0;
-  EXPECT_EQ(0u,
-            socket_a_.ReceiveWithTimeout(&data, sizeof(data), kReceiveTimeout));
-
-  // Ensure the receive didn't just timeout.
-  EXPECT_LT(TimeTicks::Now() - start, kReceiveTimeout);
-}
-
-}  // namespace base
diff --git a/base/synchronization/atomic_flag_unittest.cc b/base/synchronization/atomic_flag_unittest.cc
deleted file mode 100644
index 1a3da7f..0000000
--- a/base/synchronization/atomic_flag_unittest.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/synchronization/atomic_flag.h"
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/gtest_util.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-void ExpectSetFlagDeath(AtomicFlag* flag) {
-  ASSERT_TRUE(flag);
-  EXPECT_DCHECK_DEATH(flag->Set());
-}
-
-// Busy waits (to explicitly avoid using synchronization constructs that would
-// defeat the purpose of testing atomics) until |tested_flag| is set and then
-// verifies that non-atomic |*expected_after_flag| is true and sets |*done_flag|
-// before returning if it's non-null.
-void BusyWaitUntilFlagIsSet(AtomicFlag* tested_flag, bool* expected_after_flag,
-                            AtomicFlag* done_flag) {
-  while (!tested_flag->IsSet())
-    PlatformThread::YieldCurrentThread();
-
-  EXPECT_TRUE(*expected_after_flag);
-  if (done_flag)
-    done_flag->Set();
-}
-
-}  // namespace
-
-TEST(AtomicFlagTest, SimpleSingleThreadedTest) {
-  AtomicFlag flag;
-  ASSERT_FALSE(flag.IsSet());
-  flag.Set();
-  ASSERT_TRUE(flag.IsSet());
-}
-
-TEST(AtomicFlagTest, DoubleSetTest) {
-  AtomicFlag flag;
-  ASSERT_FALSE(flag.IsSet());
-  flag.Set();
-  ASSERT_TRUE(flag.IsSet());
-  flag.Set();
-  ASSERT_TRUE(flag.IsSet());
-}
-
-TEST(AtomicFlagTest, ReadFromDifferentThread) {
-  // |tested_flag| is the one being tested below.
-  AtomicFlag tested_flag;
-  // |expected_after_flag| is used to confirm that sequential consistency is
-  // obtained around |tested_flag|.
-  bool expected_after_flag = false;
-  // |reset_flag| is used to confirm the test flows as intended without using
-  // synchronization constructs which would defeat the purpose of exercising
-  // atomics.
-  AtomicFlag reset_flag;
-
-  Thread thread("AtomicFlagTest.ReadFromDifferentThread");
-  ASSERT_TRUE(thread.Start());
-  thread.task_runner()->PostTask(FROM_HERE,
-                                 BindOnce(&BusyWaitUntilFlagIsSet, &tested_flag,
-                                          &expected_after_flag, &reset_flag));
-
-  // To verify that IsSet() fetches the flag's value from memory every time it
-  // is called (not just the first time that it is called on a thread), sleep
-  // before setting the flag.
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(20));
-
-  // |expected_after_flag| is used to verify that all memory operations
-  // performed before |tested_flag| is Set() are visible to threads that can see
-  // IsSet().
-  expected_after_flag = true;
-  tested_flag.Set();
-
-  // Sleep again to give the busy loop time to observe the flag and verify
-  // expectations.
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(20));
-
-  // Use |reset_flag| to confirm that the above completed (which the rest of
-  // this test assumes).
-  while (!reset_flag.IsSet())
-    PlatformThread::YieldCurrentThread();
-
-  tested_flag.UnsafeResetForTesting();
-  EXPECT_FALSE(tested_flag.IsSet());
-  expected_after_flag = false;
-
-  // Perform the same test again after the controlled UnsafeResetForTesting(),
-  // |thread| is guaranteed to be synchronized past the
-  // |UnsafeResetForTesting()| call when the task runs per the implicit
-  // synchronization in the post task mechanism.
-  thread.task_runner()->PostTask(FROM_HERE,
-                                 BindOnce(&BusyWaitUntilFlagIsSet, &tested_flag,
-                                          &expected_after_flag, nullptr));
-
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(20));
-
-  expected_after_flag = true;
-  tested_flag.Set();
-
-  // The |thread|'s destructor will block until the posted task completes, so
-  // the test will time out if it fails to see the flag be set.
-}
-
-TEST(AtomicFlagTest, SetOnDifferentSequenceDeathTest) {
-  // Checks that Set() can't be called from another sequence after being called
-  // on this one. AtomicFlag should die on a DCHECK if Set() is called again
-  // from another sequence.
-
-  // Note: flag must be declared before the Thread so that its destructor runs
-  // later. Otherwise there's a race between destructing flag and running
-  // ExpectSetFlagDeath.
-  AtomicFlag flag;
-
-  ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  Thread t("AtomicFlagTest.SetOnDifferentThreadDeathTest");
-  ASSERT_TRUE(t.Start());
-  EXPECT_TRUE(t.WaitUntilThreadStarted());
-
-  flag.Set();
-  t.task_runner()->PostTask(FROM_HERE, BindOnce(&ExpectSetFlagDeath, &flag));
-}
-
-}  // namespace base
diff --git a/base/synchronization/condition_variable_unittest.cc b/base/synchronization/condition_variable_unittest.cc
deleted file mode 100644
index 929060a..0000000
--- a/base/synchronization/condition_variable_unittest.cc
+++ /dev/null
@@ -1,768 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Multi-threaded tests of ConditionVariable class.
-
-#include "base/synchronization/condition_variable.h"
-
-#include <time.h>
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/spin_wait.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_collision_warner.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-namespace base {
-
-namespace {
-//------------------------------------------------------------------------------
-// Define our test class, with several common variables.
-//------------------------------------------------------------------------------
-
-class ConditionVariableTest : public PlatformTest {
- public:
-  const TimeDelta kZeroMs;
-  const TimeDelta kTenMs;
-  const TimeDelta kThirtyMs;
-  const TimeDelta kFortyFiveMs;
-  const TimeDelta kSixtyMs;
-  const TimeDelta kOneHundredMs;
-
-  ConditionVariableTest()
-      : kZeroMs(TimeDelta::FromMilliseconds(0)),
-        kTenMs(TimeDelta::FromMilliseconds(10)),
-        kThirtyMs(TimeDelta::FromMilliseconds(30)),
-        kFortyFiveMs(TimeDelta::FromMilliseconds(45)),
-        kSixtyMs(TimeDelta::FromMilliseconds(60)),
-        kOneHundredMs(TimeDelta::FromMilliseconds(100)) {
-  }
-};
-
-//------------------------------------------------------------------------------
-// Define a class that will control activities an several multi-threaded tests.
-// The general structure of multi-threaded tests is that a test case will
-// construct an instance of a WorkQueue.  The WorkQueue will spin up some
-// threads and control them throughout their lifetime, as well as maintaining
-// a central repository of the work thread's activity.  Finally, the WorkQueue
-// will command the the worker threads to terminate.  At that point, the test
-// cases will validate that the WorkQueue has records showing that the desired
-// activities were performed.
-//------------------------------------------------------------------------------
-
-// Callers are responsible for synchronizing access to the following class.
-// The WorkQueue::lock_, as accessed via WorkQueue::lock(), should be used for
-// all synchronized access.
-class WorkQueue : public PlatformThread::Delegate {
- public:
-  explicit WorkQueue(int thread_count);
-  ~WorkQueue() override;
-
-  // PlatformThread::Delegate interface.
-  void ThreadMain() override;
-
-  //----------------------------------------------------------------------------
-  // Worker threads only call the following methods.
-  // They should use the lock to get exclusive access.
-  int GetThreadId();  // Get an ID assigned to a thread..
-  bool EveryIdWasAllocated() const;  // Indicates that all IDs were handed out.
-  TimeDelta GetAnAssignment(int thread_id);  // Get a work task duration.
-  void WorkIsCompleted(int thread_id);
-
-  int task_count() const;
-  bool allow_help_requests() const;  // Workers can signal more workers.
-  bool shutdown() const;  // Check if shutdown has been requested.
-
-  void thread_shutting_down();
-
-
-  //----------------------------------------------------------------------------
-  // Worker threads can call them but not needed to acquire a lock.
-  Lock* lock();
-
-  ConditionVariable* work_is_available();
-  ConditionVariable* all_threads_have_ids();
-  ConditionVariable* no_more_tasks();
-
-  //----------------------------------------------------------------------------
-  // The rest of the methods are for use by the controlling master thread (the
-  // test case code).
-  void ResetHistory();
-  int GetMinCompletionsByWorkerThread() const;
-  int GetMaxCompletionsByWorkerThread() const;
-  int GetNumThreadsTakingAssignments() const;
-  int GetNumThreadsCompletingTasks() const;
-  int GetNumberOfCompletedTasks() const;
-
-  void SetWorkTime(TimeDelta delay);
-  void SetTaskCount(int count);
-  void SetAllowHelp(bool allow);
-
-  // The following must be called without locking, and will spin wait until the
-  // threads are all in a wait state.
-  void SpinUntilAllThreadsAreWaiting();
-  void SpinUntilTaskCountLessThan(int task_count);
-
-  // Caller must acquire lock before calling.
-  void SetShutdown();
-
-  // Compares the |shutdown_task_count_| to the |thread_count| and returns true
-  // if they are equal.  This check will acquire the |lock_| so the caller
-  // should not hold the lock when calling this method.
-  bool ThreadSafeCheckShutdown(int thread_count);
-
- private:
-  // Both worker threads and controller use the following to synchronize.
-  Lock lock_;
-  ConditionVariable work_is_available_;  // To tell threads there is work.
-
-  // Conditions to notify the controlling process (if it is interested).
-  ConditionVariable all_threads_have_ids_;  // All threads are running.
-  ConditionVariable no_more_tasks_;  // Task count is zero.
-
-  const int thread_count_;
-  int waiting_thread_count_;
-  std::unique_ptr<PlatformThreadHandle[]> thread_handles_;
-  std::vector<int> assignment_history_;  // Number of assignment per worker.
-  std::vector<int> completion_history_;  // Number of completions per worker.
-  int thread_started_counter_;  // Used to issue unique id to workers.
-  int shutdown_task_count_;  // Number of tasks told to shutdown
-  int task_count_;  // Number of assignment tasks waiting to be processed.
-  TimeDelta worker_delay_;  // Time each task takes to complete.
-  bool allow_help_requests_;  // Workers can signal more workers.
-  bool shutdown_;  // Set when threads need to terminate.
-
-  DFAKE_MUTEX(locked_methods_);
-};
-
-//------------------------------------------------------------------------------
-// The next section contains the actual tests.
-//------------------------------------------------------------------------------
-
-TEST_F(ConditionVariableTest, StartupShutdownTest) {
-  Lock lock;
-
-  // First try trivial startup/shutdown.
-  {
-    ConditionVariable cv1(&lock);
-  }  // Call for cv1 destruction.
-
-  // Exercise with at least a few waits.
-  ConditionVariable cv(&lock);
-
-  lock.Acquire();
-  cv.TimedWait(kTenMs);  // Wait for 10 ms.
-  cv.TimedWait(kTenMs);  // Wait for 10 ms.
-  lock.Release();
-
-  lock.Acquire();
-  cv.TimedWait(kTenMs);  // Wait for 10 ms.
-  cv.TimedWait(kTenMs);  // Wait for 10 ms.
-  cv.TimedWait(kTenMs);  // Wait for 10 ms.
-  lock.Release();
-}  // Call for cv destruction.
-
-TEST_F(ConditionVariableTest, TimeoutTest) {
-  Lock lock;
-  ConditionVariable cv(&lock);
-  lock.Acquire();
-
-  TimeTicks start = TimeTicks::Now();
-  const TimeDelta WAIT_TIME = TimeDelta::FromMilliseconds(300);
-  // Allow for clocking rate granularity.
-  const TimeDelta FUDGE_TIME = TimeDelta::FromMilliseconds(50);
-
-  cv.TimedWait(WAIT_TIME + FUDGE_TIME);
-  TimeDelta duration = TimeTicks::Now() - start;
-  // We can't use EXPECT_GE here as the TimeDelta class does not support the
-  // required stream conversion.
-  EXPECT_TRUE(duration >= WAIT_TIME);
-
-  lock.Release();
-}
-
-#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
-const int kDiscontinuitySeconds = 2;
-
-void BackInTime(Lock* lock) {
-  AutoLock auto_lock(*lock);
-
-  timeval tv;
-  gettimeofday(&tv, nullptr);
-  tv.tv_sec -= kDiscontinuitySeconds;
-  settimeofday(&tv, nullptr);
-}
-
-// Tests that TimedWait ignores changes to the system clock.
-// Test is disabled by default, because it needs to run as root to muck with the
-// system clock.
-// http://crbug.com/293736
-TEST_F(ConditionVariableTest, DISABLED_TimeoutAcrossSetTimeOfDay) {
-  timeval tv;
-  gettimeofday(&tv, nullptr);
-  tv.tv_sec += kDiscontinuitySeconds;
-  if (settimeofday(&tv, nullptr) < 0) {
-    PLOG(ERROR) << "Could not set time of day. Run as root?";
-    return;
-  }
-
-  Lock lock;
-  ConditionVariable cv(&lock);
-  lock.Acquire();
-
-  Thread thread("Helper");
-  thread.Start();
-  thread.task_runner()->PostTask(FROM_HERE, base::BindOnce(&BackInTime, &lock));
-
-  TimeTicks start = TimeTicks::Now();
-  const TimeDelta kWaitTime = TimeDelta::FromMilliseconds(300);
-  // Allow for clocking rate granularity.
-  const TimeDelta kFudgeTime = TimeDelta::FromMilliseconds(50);
-
-  cv.TimedWait(kWaitTime + kFudgeTime);
-  TimeDelta duration = TimeTicks::Now() - start;
-
-  thread.Stop();
-  // We can't use EXPECT_GE here as the TimeDelta class does not support the
-  // required stream conversion.
-  EXPECT_TRUE(duration >= kWaitTime);
-  EXPECT_TRUE(duration <= TimeDelta::FromSeconds(kDiscontinuitySeconds));
-
-  lock.Release();
-}
-#endif
-
-
-// Suddenly got flaky on Win, see http://crbug.com/10607 (starting at
-// comment #15).
-#if defined(OS_WIN)
-#define MAYBE_MultiThreadConsumerTest DISABLED_MultiThreadConsumerTest
-#else
-#define MAYBE_MultiThreadConsumerTest MultiThreadConsumerTest
-#endif
-// Test serial task servicing, as well as two parallel task servicing methods.
-TEST_F(ConditionVariableTest, MAYBE_MultiThreadConsumerTest) {
-  const int kThreadCount = 10;
-  WorkQueue queue(kThreadCount);  // Start the threads.
-
-  const int kTaskCount = 10;  // Number of tasks in each mini-test here.
-
-  Time start_time;  // Used to time task processing.
-
-  {
-    base::AutoLock auto_lock(*queue.lock());
-    while (!queue.EveryIdWasAllocated())
-      queue.all_threads_have_ids()->Wait();
-  }
-
-  // If threads aren't in a wait state, they may start to gobble up tasks in
-  // parallel, short-circuiting (breaking) this test.
-  queue.SpinUntilAllThreadsAreWaiting();
-
-  {
-    // Since we have no tasks yet, all threads should be waiting by now.
-    base::AutoLock auto_lock(*queue.lock());
-    EXPECT_EQ(0, queue.GetNumThreadsTakingAssignments());
-    EXPECT_EQ(0, queue.GetNumThreadsCompletingTasks());
-    EXPECT_EQ(0, queue.task_count());
-    EXPECT_EQ(0, queue.GetMaxCompletionsByWorkerThread());
-    EXPECT_EQ(0, queue.GetMinCompletionsByWorkerThread());
-    EXPECT_EQ(0, queue.GetNumberOfCompletedTasks());
-
-    // Set up to make each task include getting help from another worker, so
-    // so that the work gets done in paralell.
-    queue.ResetHistory();
-    queue.SetTaskCount(kTaskCount);
-    queue.SetWorkTime(kThirtyMs);
-    queue.SetAllowHelp(true);
-
-    start_time = Time::Now();
-  }
-
-  queue.work_is_available()->Signal();  // But each worker can signal another.
-  // Wait till we at least start to handle tasks (and we're not all waiting).
-  queue.SpinUntilTaskCountLessThan(kTaskCount);
-  // Wait to allow the all workers to get done.
-  queue.SpinUntilAllThreadsAreWaiting();
-
-  {
-    // Wait until all work tasks have at least been assigned.
-    base::AutoLock auto_lock(*queue.lock());
-    while (queue.task_count())
-      queue.no_more_tasks()->Wait();
-
-    // To avoid racy assumptions, we'll just assert that at least 2 threads
-    // did work.  We know that the first worker should have gone to sleep, and
-    // hence a second worker should have gotten an assignment.
-    EXPECT_LE(2, queue.GetNumThreadsTakingAssignments());
-    EXPECT_EQ(kTaskCount, queue.GetNumberOfCompletedTasks());
-
-    // Try to ask all workers to help, and only a few will do the work.
-    queue.ResetHistory();
-    queue.SetTaskCount(3);
-    queue.SetWorkTime(kThirtyMs);
-    queue.SetAllowHelp(false);
-  }
-  queue.work_is_available()->Broadcast();  // Make them all try.
-  // Wait till we at least start to handle tasks (and we're not all waiting).
-  queue.SpinUntilTaskCountLessThan(3);
-  // Wait to allow the 3 workers to get done.
-  queue.SpinUntilAllThreadsAreWaiting();
-
-  {
-    base::AutoLock auto_lock(*queue.lock());
-    EXPECT_EQ(3, queue.GetNumThreadsTakingAssignments());
-    EXPECT_EQ(3, queue.GetNumThreadsCompletingTasks());
-    EXPECT_EQ(0, queue.task_count());
-    EXPECT_EQ(1, queue.GetMaxCompletionsByWorkerThread());
-    EXPECT_EQ(0, queue.GetMinCompletionsByWorkerThread());
-    EXPECT_EQ(3, queue.GetNumberOfCompletedTasks());
-
-    // Set up to make each task get help from another worker.
-    queue.ResetHistory();
-    queue.SetTaskCount(3);
-    queue.SetWorkTime(kThirtyMs);
-    queue.SetAllowHelp(true);  // Allow (unnecessary) help requests.
-  }
-  queue.work_is_available()->Broadcast();  // Signal all threads.
-  // Wait till we at least start to handle tasks (and we're not all waiting).
-  queue.SpinUntilTaskCountLessThan(3);
-  // Wait to allow the 3 workers to get done.
-  queue.SpinUntilAllThreadsAreWaiting();
-
-  {
-    base::AutoLock auto_lock(*queue.lock());
-    EXPECT_EQ(3, queue.GetNumThreadsTakingAssignments());
-    EXPECT_EQ(3, queue.GetNumThreadsCompletingTasks());
-    EXPECT_EQ(0, queue.task_count());
-    EXPECT_EQ(1, queue.GetMaxCompletionsByWorkerThread());
-    EXPECT_EQ(0, queue.GetMinCompletionsByWorkerThread());
-    EXPECT_EQ(3, queue.GetNumberOfCompletedTasks());
-
-    // Set up to make each task get help from another worker.
-    queue.ResetHistory();
-    queue.SetTaskCount(20);  // 2 tasks per thread.
-    queue.SetWorkTime(kThirtyMs);
-    queue.SetAllowHelp(true);
-  }
-  queue.work_is_available()->Signal();  // But each worker can signal another.
-  // Wait till we at least start to handle tasks (and we're not all waiting).
-  queue.SpinUntilTaskCountLessThan(20);
-  // Wait to allow the 10 workers to get done.
-  queue.SpinUntilAllThreadsAreWaiting();  // Should take about 60 ms.
-
-  {
-    base::AutoLock auto_lock(*queue.lock());
-    EXPECT_EQ(10, queue.GetNumThreadsTakingAssignments());
-    EXPECT_EQ(10, queue.GetNumThreadsCompletingTasks());
-    EXPECT_EQ(0, queue.task_count());
-    EXPECT_EQ(20, queue.GetNumberOfCompletedTasks());
-
-    // Same as last test, but with Broadcast().
-    queue.ResetHistory();
-    queue.SetTaskCount(20);  // 2 tasks per thread.
-    queue.SetWorkTime(kThirtyMs);
-    queue.SetAllowHelp(true);
-  }
-  queue.work_is_available()->Broadcast();
-  // Wait till we at least start to handle tasks (and we're not all waiting).
-  queue.SpinUntilTaskCountLessThan(20);
-  // Wait to allow the 10 workers to get done.
-  queue.SpinUntilAllThreadsAreWaiting();  // Should take about 60 ms.
-
-  {
-    base::AutoLock auto_lock(*queue.lock());
-    EXPECT_EQ(10, queue.GetNumThreadsTakingAssignments());
-    EXPECT_EQ(10, queue.GetNumThreadsCompletingTasks());
-    EXPECT_EQ(0, queue.task_count());
-    EXPECT_EQ(20, queue.GetNumberOfCompletedTasks());
-
-    queue.SetShutdown();
-  }
-  queue.work_is_available()->Broadcast();  // Force check for shutdown.
-
-  SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromMinutes(1),
-                                   queue.ThreadSafeCheckShutdown(kThreadCount));
-}
-
-TEST_F(ConditionVariableTest, LargeFastTaskTest) {
-  const int kThreadCount = 200;
-  WorkQueue queue(kThreadCount);  // Start the threads.
-
-  Lock private_lock;  // Used locally for master to wait.
-  base::AutoLock private_held_lock(private_lock);
-  ConditionVariable private_cv(&private_lock);
-
-  {
-    base::AutoLock auto_lock(*queue.lock());
-    while (!queue.EveryIdWasAllocated())
-      queue.all_threads_have_ids()->Wait();
-  }
-
-  // Wait a bit more to allow threads to reach their wait state.
-  queue.SpinUntilAllThreadsAreWaiting();
-
-  {
-    // Since we have no tasks, all threads should be waiting by now.
-    base::AutoLock auto_lock(*queue.lock());
-    EXPECT_EQ(0, queue.GetNumThreadsTakingAssignments());
-    EXPECT_EQ(0, queue.GetNumThreadsCompletingTasks());
-    EXPECT_EQ(0, queue.task_count());
-    EXPECT_EQ(0, queue.GetMaxCompletionsByWorkerThread());
-    EXPECT_EQ(0, queue.GetMinCompletionsByWorkerThread());
-    EXPECT_EQ(0, queue.GetNumberOfCompletedTasks());
-
-    // Set up to make all workers do (an average of) 20 tasks.
-    queue.ResetHistory();
-    queue.SetTaskCount(20 * kThreadCount);
-    queue.SetWorkTime(kFortyFiveMs);
-    queue.SetAllowHelp(false);
-  }
-  queue.work_is_available()->Broadcast();  // Start up all threads.
-  // Wait until we've handed out all tasks.
-  {
-    base::AutoLock auto_lock(*queue.lock());
-    while (queue.task_count() != 0)
-      queue.no_more_tasks()->Wait();
-  }
-
-  // Wait till the last of the tasks complete.
-  queue.SpinUntilAllThreadsAreWaiting();
-
-  {
-    // With Broadcast(), every thread should have participated.
-    // but with racing.. they may not all have done equal numbers of tasks.
-    base::AutoLock auto_lock(*queue.lock());
-    EXPECT_EQ(kThreadCount, queue.GetNumThreadsTakingAssignments());
-    EXPECT_EQ(kThreadCount, queue.GetNumThreadsCompletingTasks());
-    EXPECT_EQ(0, queue.task_count());
-    EXPECT_LE(20, queue.GetMaxCompletionsByWorkerThread());
-    EXPECT_EQ(20 * kThreadCount, queue.GetNumberOfCompletedTasks());
-
-    // Set up to make all workers do (an average of) 4 tasks.
-    queue.ResetHistory();
-    queue.SetTaskCount(kThreadCount * 4);
-    queue.SetWorkTime(kFortyFiveMs);
-    queue.SetAllowHelp(true);  // Might outperform Broadcast().
-  }
-  queue.work_is_available()->Signal();  // Start up one thread.
-
-  // Wait until we've handed out all tasks
-  {
-    base::AutoLock auto_lock(*queue.lock());
-    while (queue.task_count() != 0)
-      queue.no_more_tasks()->Wait();
-  }
-
-  // Wait till the last of the tasks complete.
-  queue.SpinUntilAllThreadsAreWaiting();
-
-  {
-    // With Signal(), every thread should have participated.
-    // but with racing.. they may not all have done four tasks.
-    base::AutoLock auto_lock(*queue.lock());
-    EXPECT_EQ(kThreadCount, queue.GetNumThreadsTakingAssignments());
-    EXPECT_EQ(kThreadCount, queue.GetNumThreadsCompletingTasks());
-    EXPECT_EQ(0, queue.task_count());
-    EXPECT_LE(4, queue.GetMaxCompletionsByWorkerThread());
-    EXPECT_EQ(4 * kThreadCount, queue.GetNumberOfCompletedTasks());
-
-    queue.SetShutdown();
-  }
-  queue.work_is_available()->Broadcast();  // Force check for shutdown.
-
-  // Wait for shutdowns to complete.
-  SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromMinutes(1),
-                                   queue.ThreadSafeCheckShutdown(kThreadCount));
-}
-
-//------------------------------------------------------------------------------
-// Finally we provide the implementation for the methods in the WorkQueue class.
-//------------------------------------------------------------------------------
-
-WorkQueue::WorkQueue(int thread_count)
-  : lock_(),
-    work_is_available_(&lock_),
-    all_threads_have_ids_(&lock_),
-    no_more_tasks_(&lock_),
-    thread_count_(thread_count),
-    waiting_thread_count_(0),
-    thread_handles_(new PlatformThreadHandle[thread_count]),
-    assignment_history_(thread_count),
-    completion_history_(thread_count),
-    thread_started_counter_(0),
-    shutdown_task_count_(0),
-    task_count_(0),
-    allow_help_requests_(false),
-    shutdown_(false) {
-  EXPECT_GE(thread_count_, 1);
-  ResetHistory();
-  SetTaskCount(0);
-  SetWorkTime(TimeDelta::FromMilliseconds(30));
-
-  for (int i = 0; i < thread_count_; ++i) {
-    PlatformThreadHandle pth;
-    EXPECT_TRUE(PlatformThread::Create(0, this, &pth));
-    thread_handles_[i] = pth;
-  }
-}
-
-WorkQueue::~WorkQueue() {
-  {
-    base::AutoLock auto_lock(lock_);
-    SetShutdown();
-  }
-  work_is_available_.Broadcast();  // Tell them all to terminate.
-
-  for (int i = 0; i < thread_count_; ++i) {
-    PlatformThread::Join(thread_handles_[i]);
-  }
-  EXPECT_EQ(0, waiting_thread_count_);
-}
-
-int WorkQueue::GetThreadId() {
-  DFAKE_SCOPED_RECURSIVE_LOCK(locked_methods_);
-  DCHECK(!EveryIdWasAllocated());
-  return thread_started_counter_++;  // Give out Unique IDs.
-}
-
-bool WorkQueue::EveryIdWasAllocated() const {
-  DFAKE_SCOPED_RECURSIVE_LOCK(locked_methods_);
-  return thread_count_ == thread_started_counter_;
-}
-
-TimeDelta WorkQueue::GetAnAssignment(int thread_id) {
-  DFAKE_SCOPED_RECURSIVE_LOCK(locked_methods_);
-  DCHECK_LT(0, task_count_);
-  assignment_history_[thread_id]++;
-  if (0 == --task_count_) {
-    no_more_tasks_.Signal();
-  }
-  return worker_delay_;
-}
-
-void WorkQueue::WorkIsCompleted(int thread_id) {
-  DFAKE_SCOPED_RECURSIVE_LOCK(locked_methods_);
-  completion_history_[thread_id]++;
-}
-
-int WorkQueue::task_count() const {
-  DFAKE_SCOPED_RECURSIVE_LOCK(locked_methods_);
-  return task_count_;
-}
-
-bool WorkQueue::allow_help_requests() const {
-  DFAKE_SCOPED_RECURSIVE_LOCK(locked_methods_);
-  return allow_help_requests_;
-}
-
-bool WorkQueue::shutdown() const {
-  lock_.AssertAcquired();
-  DFAKE_SCOPED_RECURSIVE_LOCK(locked_methods_);
-  return shutdown_;
-}
-
-// Because this method is called from the test's main thread we need to actually
-// take the lock.  Threads will call the thread_shutting_down() method with the
-// lock already acquired.
-bool WorkQueue::ThreadSafeCheckShutdown(int thread_count) {
-  bool all_shutdown;
-  base::AutoLock auto_lock(lock_);
-  {
-    // Declare in scope so DFAKE is guranteed to be destroyed before AutoLock.
-    DFAKE_SCOPED_RECURSIVE_LOCK(locked_methods_);
-    all_shutdown = (shutdown_task_count_ == thread_count);
-  }
-  return all_shutdown;
-}
-
-void WorkQueue::thread_shutting_down() {
-  lock_.AssertAcquired();
-  DFAKE_SCOPED_RECURSIVE_LOCK(locked_methods_);
-  shutdown_task_count_++;
-}
-
-Lock* WorkQueue::lock() {
-  return &lock_;
-}
-
-ConditionVariable* WorkQueue::work_is_available() {
-  return &work_is_available_;
-}
-
-ConditionVariable* WorkQueue::all_threads_have_ids() {
-  return &all_threads_have_ids_;
-}
-
-ConditionVariable* WorkQueue::no_more_tasks() {
-  return &no_more_tasks_;
-}
-
-void WorkQueue::ResetHistory() {
-  for (int i = 0; i < thread_count_; ++i) {
-    assignment_history_[i] = 0;
-    completion_history_[i] = 0;
-  }
-}
-
-int WorkQueue::GetMinCompletionsByWorkerThread() const {
-  int minumum = completion_history_[0];
-  for (int i = 0; i < thread_count_; ++i)
-    minumum = std::min(minumum, completion_history_[i]);
-  return minumum;
-}
-
-int WorkQueue::GetMaxCompletionsByWorkerThread() const {
-  int maximum = completion_history_[0];
-  for (int i = 0; i < thread_count_; ++i)
-    maximum = std::max(maximum, completion_history_[i]);
-  return maximum;
-}
-
-int WorkQueue::GetNumThreadsTakingAssignments() const {
-  int count = 0;
-  for (int i = 0; i < thread_count_; ++i)
-    if (assignment_history_[i])
-      count++;
-  return count;
-}
-
-int WorkQueue::GetNumThreadsCompletingTasks() const {
-  int count = 0;
-  for (int i = 0; i < thread_count_; ++i)
-    if (completion_history_[i])
-      count++;
-  return count;
-}
-
-int WorkQueue::GetNumberOfCompletedTasks() const {
-  int total = 0;
-  for (int i = 0; i < thread_count_; ++i)
-    total += completion_history_[i];
-  return total;
-}
-
-void WorkQueue::SetWorkTime(TimeDelta delay) {
-  worker_delay_ = delay;
-}
-
-void WorkQueue::SetTaskCount(int count) {
-  task_count_ = count;
-}
-
-void WorkQueue::SetAllowHelp(bool allow) {
-  allow_help_requests_ = allow;
-}
-
-void WorkQueue::SetShutdown() {
-  lock_.AssertAcquired();
-  shutdown_ = true;
-}
-
-void WorkQueue::SpinUntilAllThreadsAreWaiting() {
-  while (true) {
-    {
-      base::AutoLock auto_lock(lock_);
-      if (waiting_thread_count_ == thread_count_)
-        break;
-    }
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(30));
-  }
-}
-
-void WorkQueue::SpinUntilTaskCountLessThan(int task_count) {
-  while (true) {
-    {
-      base::AutoLock auto_lock(lock_);
-      if (task_count_ < task_count)
-        break;
-    }
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(30));
-  }
-}
-
-
-//------------------------------------------------------------------------------
-// Define the standard worker task. Several tests will spin out many of these
-// threads.
-//------------------------------------------------------------------------------
-
-// The multithread tests involve several threads with a task to perform as
-// directed by an instance of the class WorkQueue.
-// The task is to:
-// a) Check to see if there are more tasks (there is a task counter).
-//    a1) Wait on condition variable if there are no tasks currently.
-// b) Call a function to see what should be done.
-// c) Do some computation based on the number of milliseconds returned in (b).
-// d) go back to (a).
-
-// WorkQueue::ThreadMain() implements the above task for all threads.
-// It calls the controlling object to tell the creator about progress, and to
-// ask about tasks.
-
-void WorkQueue::ThreadMain() {
-  int thread_id;
-  {
-    base::AutoLock auto_lock(lock_);
-    thread_id = GetThreadId();
-    if (EveryIdWasAllocated())
-      all_threads_have_ids()->Signal();  // Tell creator we're ready.
-  }
-
-  Lock private_lock;  // Used to waste time on "our work".
-  while (1) {  // This is the main consumer loop.
-    TimeDelta work_time;
-    bool could_use_help;
-    {
-      base::AutoLock auto_lock(lock_);
-      while (0 == task_count() && !shutdown()) {
-        ++waiting_thread_count_;
-        work_is_available()->Wait();
-        --waiting_thread_count_;
-      }
-      if (shutdown()) {
-        // Ack the notification of a shutdown message back to the controller.
-        thread_shutting_down();
-        return;  // Terminate.
-      }
-      // Get our task duration from the queue.
-      work_time = GetAnAssignment(thread_id);
-      could_use_help = (task_count() > 0) && allow_help_requests();
-    }  // Release lock
-
-    // Do work (outside of locked region.
-    if (could_use_help)
-      work_is_available()->Signal();  // Get help from other threads.
-
-    if (work_time > TimeDelta::FromMilliseconds(0)) {
-      // We could just sleep(), but we'll instead further exercise the
-      // condition variable class, and do a timed wait.
-      base::AutoLock auto_lock(private_lock);
-      ConditionVariable private_cv(&private_lock);
-      private_cv.TimedWait(work_time);  // Unsynchronized waiting.
-    }
-
-    {
-      base::AutoLock auto_lock(lock_);
-      // Send notification that we completed our "work."
-      WorkIsCompleted(thread_id);
-    }
-  }
-}
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/synchronization/lock_unittest.cc b/base/synchronization/lock_unittest.cc
deleted file mode 100644
index 1e2f998..0000000
--- a/base/synchronization/lock_unittest.cc
+++ /dev/null
@@ -1,257 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/synchronization/lock.h"
-
-#include <stdlib.h>
-
-#include "base/compiler_specific.h"
-#include "base/debug/activity_tracker.h"
-#include "base/macros.h"
-#include "base/threading/platform_thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-// Basic test to make sure that Acquire()/Release()/Try() don't crash ----------
-
-class BasicLockTestThread : public PlatformThread::Delegate {
- public:
-  explicit BasicLockTestThread(Lock* lock) : lock_(lock), acquired_(0) {}
-
-  void ThreadMain() override {
-    for (int i = 0; i < 10; i++) {
-      lock_->Acquire();
-      acquired_++;
-      lock_->Release();
-    }
-    for (int i = 0; i < 10; i++) {
-      lock_->Acquire();
-      acquired_++;
-      PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 20));
-      lock_->Release();
-    }
-    for (int i = 0; i < 10; i++) {
-      if (lock_->Try()) {
-        acquired_++;
-        PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 20));
-        lock_->Release();
-      }
-    }
-  }
-
-  int acquired() const { return acquired_; }
-
- private:
-  Lock* lock_;
-  int acquired_;
-
-  DISALLOW_COPY_AND_ASSIGN(BasicLockTestThread);
-};
-
-TEST(LockTest, Basic) {
-  Lock lock;
-  BasicLockTestThread thread(&lock);
-  PlatformThreadHandle handle;
-
-  ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
-
-  int acquired = 0;
-  for (int i = 0; i < 5; i++) {
-    lock.Acquire();
-    acquired++;
-    lock.Release();
-  }
-  for (int i = 0; i < 10; i++) {
-    lock.Acquire();
-    acquired++;
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 20));
-    lock.Release();
-  }
-  for (int i = 0; i < 10; i++) {
-    if (lock.Try()) {
-      acquired++;
-      PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 20));
-      lock.Release();
-    }
-  }
-  for (int i = 0; i < 5; i++) {
-    lock.Acquire();
-    acquired++;
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 20));
-    lock.Release();
-  }
-
-  PlatformThread::Join(handle);
-
-  EXPECT_GE(acquired, 20);
-  EXPECT_GE(thread.acquired(), 20);
-}
-
-// Test that Try() works as expected -------------------------------------------
-
-class TryLockTestThread : public PlatformThread::Delegate {
- public:
-  explicit TryLockTestThread(Lock* lock) : lock_(lock), got_lock_(false) {}
-
-  void ThreadMain() override {
-    got_lock_ = lock_->Try();
-    if (got_lock_)
-      lock_->Release();
-  }
-
-  bool got_lock() const { return got_lock_; }
-
- private:
-  Lock* lock_;
-  bool got_lock_;
-
-  DISALLOW_COPY_AND_ASSIGN(TryLockTestThread);
-};
-
-TEST(LockTest, TryLock) {
-  Lock lock;
-
-  ASSERT_TRUE(lock.Try());
-  // We now have the lock....
-
-  // This thread will not be able to get the lock.
-  {
-    TryLockTestThread thread(&lock);
-    PlatformThreadHandle handle;
-
-    ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
-
-    PlatformThread::Join(handle);
-
-    ASSERT_FALSE(thread.got_lock());
-  }
-
-  lock.Release();
-
-  // This thread will....
-  {
-    TryLockTestThread thread(&lock);
-    PlatformThreadHandle handle;
-
-    ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
-
-    PlatformThread::Join(handle);
-
-    ASSERT_TRUE(thread.got_lock());
-    // But it released it....
-    ASSERT_TRUE(lock.Try());
-  }
-
-  lock.Release();
-}
-
-TEST(LockTest, TryTrackedLock) {
-  // Enable the activity tracker.
-  debug::GlobalActivityTracker::CreateWithLocalMemory(64 << 10, 0, "", 3, 0);
-
-  Lock lock;
-
-  ASSERT_TRUE(lock.Try());
-  // We now have the lock....
-
-  // This thread will not be able to get the lock.
-  {
-    TryLockTestThread thread(&lock);
-    PlatformThreadHandle handle;
-
-    ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
-
-    PlatformThread::Join(handle);
-
-    ASSERT_FALSE(thread.got_lock());
-  }
-
-  lock.Release();
-
-  // This thread will....
-  {
-    TryLockTestThread thread(&lock);
-    PlatformThreadHandle handle;
-
-    ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
-
-    PlatformThread::Join(handle);
-
-    ASSERT_TRUE(thread.got_lock());
-    // But it released it....
-    ASSERT_TRUE(lock.Try());
-  }
-
-  lock.Release();
-  debug::GlobalActivityTracker::ReleaseForTesting();
-}
-
-// Tests that locks actually exclude -------------------------------------------
-
-class MutexLockTestThread : public PlatformThread::Delegate {
- public:
-  MutexLockTestThread(Lock* lock, int* value) : lock_(lock), value_(value) {}
-
-  // Static helper which can also be called from the main thread.
-  static void DoStuff(Lock* lock, int* value) {
-    for (int i = 0; i < 40; i++) {
-      lock->Acquire();
-      int v = *value;
-      PlatformThread::Sleep(TimeDelta::FromMilliseconds(rand() % 10));
-      *value = v + 1;
-      lock->Release();
-    }
-  }
-
-  void ThreadMain() override { DoStuff(lock_, value_); }
-
- private:
-  Lock* lock_;
-  int* value_;
-
-  DISALLOW_COPY_AND_ASSIGN(MutexLockTestThread);
-};
-
-TEST(LockTest, MutexTwoThreads) {
-  Lock lock;
-  int value = 0;
-
-  MutexLockTestThread thread(&lock, &value);
-  PlatformThreadHandle handle;
-
-  ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
-
-  MutexLockTestThread::DoStuff(&lock, &value);
-
-  PlatformThread::Join(handle);
-
-  EXPECT_EQ(2 * 40, value);
-}
-
-TEST(LockTest, MutexFourThreads) {
-  Lock lock;
-  int value = 0;
-
-  MutexLockTestThread thread1(&lock, &value);
-  MutexLockTestThread thread2(&lock, &value);
-  MutexLockTestThread thread3(&lock, &value);
-  PlatformThreadHandle handle1;
-  PlatformThreadHandle handle2;
-  PlatformThreadHandle handle3;
-
-  ASSERT_TRUE(PlatformThread::Create(0, &thread1, &handle1));
-  ASSERT_TRUE(PlatformThread::Create(0, &thread2, &handle2));
-  ASSERT_TRUE(PlatformThread::Create(0, &thread3, &handle3));
-
-  MutexLockTestThread::DoStuff(&lock, &value);
-
-  PlatformThread::Join(handle1);
-  PlatformThread::Join(handle2);
-  PlatformThread::Join(handle3);
-
-  EXPECT_EQ(4 * 40, value);
-}
-
-}  // namespace base
diff --git a/base/synchronization/waitable_event_unittest.cc b/base/synchronization/waitable_event_unittest.cc
deleted file mode 100644
index 9c981d8..0000000
--- a/base/synchronization/waitable_event_unittest.cc
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/synchronization/waitable_event.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-
-#include "base/compiler_specific.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(WaitableEventTest, ManualBasics) {
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  EXPECT_FALSE(event.IsSignaled());
-
-  event.Signal();
-  EXPECT_TRUE(event.IsSignaled());
-  EXPECT_TRUE(event.IsSignaled());
-
-  event.Reset();
-  EXPECT_FALSE(event.IsSignaled());
-  EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
-
-  event.Signal();
-  event.Wait();
-  EXPECT_TRUE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
-}
-
-TEST(WaitableEventTest, ManualInitiallySignaled) {
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::SIGNALED);
-
-  EXPECT_TRUE(event.IsSignaled());
-  EXPECT_TRUE(event.IsSignaled());
-
-  event.Reset();
-
-  EXPECT_FALSE(event.IsSignaled());
-  EXPECT_FALSE(event.IsSignaled());
-
-  event.Signal();
-
-  event.Wait();
-  EXPECT_TRUE(event.IsSignaled());
-  EXPECT_TRUE(event.IsSignaled());
-}
-
-TEST(WaitableEventTest, AutoBasics) {
-  WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  EXPECT_FALSE(event.IsSignaled());
-
-  event.Signal();
-  EXPECT_TRUE(event.IsSignaled());
-  EXPECT_FALSE(event.IsSignaled());
-
-  event.Reset();
-  EXPECT_FALSE(event.IsSignaled());
-  EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
-
-  event.Signal();
-  event.Wait();
-  EXPECT_FALSE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
-
-  event.Signal();
-  EXPECT_TRUE(event.TimedWait(TimeDelta::FromMilliseconds(10)));
-}
-
-TEST(WaitableEventTest, AutoInitiallySignaled) {
-  WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                      WaitableEvent::InitialState::SIGNALED);
-
-  EXPECT_TRUE(event.IsSignaled());
-  EXPECT_FALSE(event.IsSignaled());
-
-  event.Signal();
-
-  EXPECT_TRUE(event.IsSignaled());
-  EXPECT_FALSE(event.IsSignaled());
-}
-
-TEST(WaitableEventTest, WaitManyShortcut) {
-  WaitableEvent* ev[5];
-  for (unsigned i = 0; i < 5; ++i) {
-    ev[i] = new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
-                              WaitableEvent::InitialState::NOT_SIGNALED);
-  }
-
-  ev[3]->Signal();
-  EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 3u);
-
-  ev[3]->Signal();
-  EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 3u);
-
-  ev[4]->Signal();
-  EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 4u);
-
-  ev[0]->Signal();
-  EXPECT_EQ(WaitableEvent::WaitMany(ev, 5), 0u);
-
-  for (unsigned i = 0; i < 5; ++i)
-    delete ev[i];
-}
-
-TEST(WaitableEventTest, WaitManyLeftToRight) {
-  WaitableEvent* ev[5];
-  for (size_t i = 0; i < 5; ++i) {
-    ev[i] = new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
-                              WaitableEvent::InitialState::NOT_SIGNALED);
-  }
-
-  // Test for consistent left-to-right return behavior across all permutations
-  // of the input array. This is to verify that only the indices -- and not
-  // the WaitableEvents' addresses -- are relevant in determining who wins when
-  // multiple events are signaled.
-
-  std::sort(ev, ev + 5);
-  do {
-    ev[0]->Signal();
-    ev[1]->Signal();
-    EXPECT_EQ(0u, WaitableEvent::WaitMany(ev, 5));
-
-    ev[2]->Signal();
-    EXPECT_EQ(1u, WaitableEvent::WaitMany(ev, 5));
-    EXPECT_EQ(2u, WaitableEvent::WaitMany(ev, 5));
-
-    ev[3]->Signal();
-    ev[4]->Signal();
-    ev[0]->Signal();
-    EXPECT_EQ(0u, WaitableEvent::WaitMany(ev, 5));
-    EXPECT_EQ(3u, WaitableEvent::WaitMany(ev, 5));
-    ev[2]->Signal();
-    EXPECT_EQ(2u, WaitableEvent::WaitMany(ev, 5));
-    EXPECT_EQ(4u, WaitableEvent::WaitMany(ev, 5));
-  } while (std::next_permutation(ev, ev + 5));
-
-  for (size_t i = 0; i < 5; ++i)
-    delete ev[i];
-}
-
-class WaitableEventSignaler : public PlatformThread::Delegate {
- public:
-  WaitableEventSignaler(TimeDelta delay, WaitableEvent* event)
-      : delay_(delay),
-        event_(event) {
-  }
-
-  void ThreadMain() override {
-    PlatformThread::Sleep(delay_);
-    event_->Signal();
-  }
-
- private:
-  const TimeDelta delay_;
-  WaitableEvent* event_;
-};
-
-// Tests that a WaitableEvent can be safely deleted when |Wait| is done without
-// additional synchronization.
-TEST(WaitableEventTest, WaitAndDelete) {
-  WaitableEvent* ev =
-      new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
-                        WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WaitableEventSignaler signaler(TimeDelta::FromMilliseconds(10), ev);
-  PlatformThreadHandle thread;
-  PlatformThread::Create(0, &signaler, &thread);
-
-  ev->Wait();
-  delete ev;
-
-  PlatformThread::Join(thread);
-}
-
-// Tests that a WaitableEvent can be safely deleted when |WaitMany| is done
-// without additional synchronization.
-TEST(WaitableEventTest, WaitMany) {
-  WaitableEvent* ev[5];
-  for (unsigned i = 0; i < 5; ++i) {
-    ev[i] = new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
-                              WaitableEvent::InitialState::NOT_SIGNALED);
-  }
-
-  WaitableEventSignaler signaler(TimeDelta::FromMilliseconds(10), ev[2]);
-  PlatformThreadHandle thread;
-  PlatformThread::Create(0, &signaler, &thread);
-
-  size_t index = WaitableEvent::WaitMany(ev, 5);
-
-  for (unsigned i = 0; i < 5; ++i)
-    delete ev[i];
-
-  PlatformThread::Join(thread);
-  EXPECT_EQ(2u, index);
-}
-
-// Tests that using TimeDelta::Max() on TimedWait() is not the same as passing
-// a timeout of 0. (crbug.com/465948)
-TEST(WaitableEventTest, TimedWait) {
-  WaitableEvent* ev =
-      new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
-                        WaitableEvent::InitialState::NOT_SIGNALED);
-
-  TimeDelta thread_delay = TimeDelta::FromMilliseconds(10);
-  WaitableEventSignaler signaler(thread_delay, ev);
-  PlatformThreadHandle thread;
-  TimeTicks start = TimeTicks::Now();
-  PlatformThread::Create(0, &signaler, &thread);
-
-  EXPECT_TRUE(ev->TimedWait(TimeDelta::Max()));
-  EXPECT_GE(TimeTicks::Now() - start, thread_delay);
-  delete ev;
-
-  PlatformThread::Join(thread);
-}
-
-// Tests that a sub-ms TimedWait doesn't time out promptly.
-TEST(WaitableEventTest, SubMsTimedWait) {
-  WaitableEvent ev(WaitableEvent::ResetPolicy::AUTOMATIC,
-                   WaitableEvent::InitialState::NOT_SIGNALED);
-
-  TimeDelta delay = TimeDelta::FromMicroseconds(900);
-  TimeTicks start_time = TimeTicks::Now();
-  ev.TimedWait(delay);
-  EXPECT_GE(TimeTicks::Now() - start_time, delay);
-}
-
-// Tests that TimedWaitUntil can be safely used with various end_time deadline
-// values.
-TEST(WaitableEventTest, TimedWaitUntil) {
-  WaitableEvent ev(WaitableEvent::ResetPolicy::AUTOMATIC,
-                   WaitableEvent::InitialState::NOT_SIGNALED);
-
-  TimeTicks start_time(TimeTicks::Now());
-  TimeDelta delay = TimeDelta::FromMilliseconds(10);
-
-  // Should be OK to wait for the current time or time in the past.
-  // That should end promptly and be equivalent to IsSignalled.
-  EXPECT_FALSE(ev.TimedWaitUntil(start_time));
-  EXPECT_FALSE(ev.TimedWaitUntil(start_time - delay));
-
-  // Should be OK to wait for zero TimeTicks().
-  EXPECT_FALSE(ev.TimedWaitUntil(TimeTicks()));
-
-  // Waiting for a time in the future shouldn't end before the deadline
-  // if the event isn't signalled.
-  EXPECT_FALSE(ev.TimedWaitUntil(start_time + delay));
-  EXPECT_GE(TimeTicks::Now() - start_time, delay);
-
-  // Test that passing TimeTicks::Max to TimedWaitUntil is valid and isn't
-  // the same as passing TimeTicks(). Also verifies that signaling event
-  // ends the wait promptly.
-  WaitableEventSignaler signaler(delay, &ev);
-  PlatformThreadHandle thread;
-  start_time = TimeTicks::Now();
-  PlatformThread::Create(0, &signaler, &thread);
-
-  EXPECT_TRUE(ev.TimedWaitUntil(TimeTicks::Max()));
-  EXPECT_GE(TimeTicks::Now() - start_time, delay);
-
-  PlatformThread::Join(thread);
-}
-
-}  // namespace base
diff --git a/base/synchronization/waitable_event_watcher_unittest.cc b/base/synchronization/waitable_event_watcher_unittest.cc
deleted file mode 100644
index bdb45a3..0000000
--- a/base/synchronization/waitable_event_watcher_unittest.cc
+++ /dev/null
@@ -1,429 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/synchronization/waitable_event_watcher.h"
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-// The message loops on which each waitable event timer should be tested.
-const MessageLoop::Type testing_message_loops[] = {
-  MessageLoop::TYPE_DEFAULT,
-  MessageLoop::TYPE_IO,
-#if !defined(OS_IOS)  // iOS does not allow direct running of the UI loop.
-  MessageLoop::TYPE_UI,
-#endif
-};
-
-void QuitWhenSignaled(WaitableEvent* event) {
-  RunLoop::QuitCurrentWhenIdleDeprecated();
-}
-
-class DecrementCountContainer {
- public:
-  explicit DecrementCountContainer(int* counter) : counter_(counter) {}
-  void OnWaitableEventSignaled(WaitableEvent* object) {
-    // NOTE: |object| may be already deleted.
-    --(*counter_);
-  }
-
- private:
-  int* counter_;
-};
-
-}  // namespace
-
-class WaitableEventWatcherTest
-    : public testing::TestWithParam<MessageLoop::Type> {};
-
-TEST_P(WaitableEventWatcherTest, BasicSignalManual) {
-  MessageLoop message_loop(GetParam());
-
-  // A manual-reset event that is not yet signaled.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WaitableEventWatcher watcher;
-  watcher.StartWatching(&event, BindOnce(&QuitWhenSignaled),
-                        SequencedTaskRunnerHandle::Get());
-
-  event.Signal();
-
-  RunLoop().Run();
-
-  EXPECT_TRUE(event.IsSignaled());
-}
-
-TEST_P(WaitableEventWatcherTest, BasicSignalAutomatic) {
-  MessageLoop message_loop(GetParam());
-
-  WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WaitableEventWatcher watcher;
-  watcher.StartWatching(&event, BindOnce(&QuitWhenSignaled),
-                        SequencedTaskRunnerHandle::Get());
-
-  event.Signal();
-
-  RunLoop().Run();
-
-  // The WaitableEventWatcher consumes the event signal.
-  EXPECT_FALSE(event.IsSignaled());
-}
-
-TEST_P(WaitableEventWatcherTest, BasicCancel) {
-  MessageLoop message_loop(GetParam());
-
-  // A manual-reset event that is not yet signaled.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WaitableEventWatcher watcher;
-
-  watcher.StartWatching(&event, BindOnce(&QuitWhenSignaled),
-                        SequencedTaskRunnerHandle::Get());
-
-  watcher.StopWatching();
-}
-
-TEST_P(WaitableEventWatcherTest, CancelAfterSet) {
-  MessageLoop message_loop(GetParam());
-
-  // A manual-reset event that is not yet signaled.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WaitableEventWatcher watcher;
-
-  int counter = 1;
-  DecrementCountContainer delegate(&counter);
-  WaitableEventWatcher::EventCallback callback = BindOnce(
-      &DecrementCountContainer::OnWaitableEventSignaled, Unretained(&delegate));
-  watcher.StartWatching(&event, std::move(callback),
-                        SequencedTaskRunnerHandle::Get());
-
-  event.Signal();
-
-  // Let the background thread do its business
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(30));
-
-  watcher.StopWatching();
-
-  RunLoop().RunUntilIdle();
-
-  // Our delegate should not have fired.
-  EXPECT_EQ(1, counter);
-}
-
-TEST_P(WaitableEventWatcherTest, OutlivesMessageLoop) {
-  // Simulate a MessageLoop that dies before an WaitableEventWatcher.  This
-  // ordinarily doesn't happen when people use the Thread class, but it can
-  // happen when people use the Singleton pattern or atexit.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  {
-    std::unique_ptr<WaitableEventWatcher> watcher;
-    {
-      MessageLoop message_loop(GetParam());
-      watcher = std::make_unique<WaitableEventWatcher>();
-
-      watcher->StartWatching(&event, BindOnce(&QuitWhenSignaled),
-                             SequencedTaskRunnerHandle::Get());
-    }
-  }
-}
-
-TEST_P(WaitableEventWatcherTest, SignaledAtStartManual) {
-  MessageLoop message_loop(GetParam());
-
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::SIGNALED);
-
-  WaitableEventWatcher watcher;
-  watcher.StartWatching(&event, BindOnce(&QuitWhenSignaled),
-                        SequencedTaskRunnerHandle::Get());
-
-  RunLoop().Run();
-
-  EXPECT_TRUE(event.IsSignaled());
-}
-
-TEST_P(WaitableEventWatcherTest, SignaledAtStartAutomatic) {
-  MessageLoop message_loop(GetParam());
-
-  WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                      WaitableEvent::InitialState::SIGNALED);
-
-  WaitableEventWatcher watcher;
-  watcher.StartWatching(&event, BindOnce(&QuitWhenSignaled),
-                        SequencedTaskRunnerHandle::Get());
-
-  RunLoop().Run();
-
-  // The watcher consumes the event signal.
-  EXPECT_FALSE(event.IsSignaled());
-}
-
-TEST_P(WaitableEventWatcherTest, StartWatchingInCallback) {
-  MessageLoop message_loop(GetParam());
-
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WaitableEventWatcher watcher;
-  watcher.StartWatching(
-      &event,
-      BindOnce(
-          [](WaitableEventWatcher* watcher, WaitableEvent* event) {
-            // |event| is manual, so the second watcher will run
-            // immediately.
-            watcher->StartWatching(event, BindOnce(&QuitWhenSignaled),
-                                   SequencedTaskRunnerHandle::Get());
-          },
-          &watcher),
-      SequencedTaskRunnerHandle::Get());
-
-  event.Signal();
-
-  RunLoop().Run();
-}
-
-TEST_P(WaitableEventWatcherTest, MultipleWatchersManual) {
-  MessageLoop message_loop(GetParam());
-
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  int counter1 = 0;
-  int counter2 = 0;
-
-  auto callback = [](RunLoop* run_loop, int* counter, WaitableEvent* event) {
-    ++(*counter);
-    run_loop->QuitWhenIdle();
-  };
-
-  RunLoop run_loop;
-
-  WaitableEventWatcher watcher1;
-  watcher1.StartWatching(
-      &event, BindOnce(callback, Unretained(&run_loop), Unretained(&counter1)),
-      SequencedTaskRunnerHandle::Get());
-
-  WaitableEventWatcher watcher2;
-  watcher2.StartWatching(
-      &event, BindOnce(callback, Unretained(&run_loop), Unretained(&counter2)),
-      SequencedTaskRunnerHandle::Get());
-
-  event.Signal();
-  run_loop.Run();
-
-  EXPECT_EQ(1, counter1);
-  EXPECT_EQ(1, counter2);
-  EXPECT_TRUE(event.IsSignaled());
-}
-
-// Tests that only one async waiter gets called back for an auto-reset event.
-TEST_P(WaitableEventWatcherTest, MultipleWatchersAutomatic) {
-  MessageLoop message_loop(GetParam());
-
-  WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  int counter1 = 0;
-  int counter2 = 0;
-
-  auto callback = [](RunLoop** run_loop, int* counter, WaitableEvent* event) {
-    ++(*counter);
-    (*run_loop)->QuitWhenIdle();
-  };
-
-  // The same RunLoop instance cannot be Run more than once, and it is
-  // undefined which watcher will get called back first. Have the callback
-  // dereference this pointer to quit the loop, which will be updated on each
-  // Run.
-  RunLoop* current_run_loop;
-
-  WaitableEventWatcher watcher1;
-  watcher1.StartWatching(
-      &event,
-      BindOnce(callback, Unretained(&current_run_loop), Unretained(&counter1)),
-      SequencedTaskRunnerHandle::Get());
-
-  WaitableEventWatcher watcher2;
-  watcher2.StartWatching(
-      &event,
-      BindOnce(callback, Unretained(&current_run_loop), Unretained(&counter2)),
-      SequencedTaskRunnerHandle::Get());
-
-  event.Signal();
-  {
-    RunLoop run_loop;
-    current_run_loop = &run_loop;
-    run_loop.Run();
-  }
-
-  // Only one of the waiters should have been signaled.
-  EXPECT_TRUE((counter1 == 1) ^ (counter2 == 1));
-
-  EXPECT_FALSE(event.IsSignaled());
-
-  event.Signal();
-  {
-    RunLoop run_loop;
-    current_run_loop = &run_loop;
-    run_loop.Run();
-  }
-
-  EXPECT_FALSE(event.IsSignaled());
-
-  // The other watcher should have been signaled.
-  EXPECT_EQ(1, counter1);
-  EXPECT_EQ(1, counter2);
-}
-
-// To help detect errors around deleting WaitableEventWatcher, an additional
-// bool parameter is used to test sleeping between watching and deletion.
-class WaitableEventWatcherDeletionTest
-    : public testing::TestWithParam<std::tuple<MessageLoop::Type, bool>> {};
-
-TEST_P(WaitableEventWatcherDeletionTest, DeleteUnder) {
-  MessageLoop::Type message_loop_type;
-  bool delay_after_delete;
-  std::tie(message_loop_type, delay_after_delete) = GetParam();
-
-  // Delete the WaitableEvent out from under the Watcher. This is explictly
-  // allowed by the interface.
-
-  MessageLoop message_loop(message_loop_type);
-
-  {
-    WaitableEventWatcher watcher;
-
-    auto* event = new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                    WaitableEvent::InitialState::NOT_SIGNALED);
-
-    watcher.StartWatching(event, BindOnce(&QuitWhenSignaled),
-                          SequencedTaskRunnerHandle::Get());
-
-    if (delay_after_delete) {
-      // On Windows that sleep() improves the chance to catch some problems.
-      // It postpones the dtor |watcher| (which immediately cancel the waiting)
-      // and gives some time to run to a created background thread.
-      // Unfortunately, that thread is under OS control and we can't
-      // manipulate it directly.
-      PlatformThread::Sleep(TimeDelta::FromMilliseconds(30));
-    }
-
-    delete event;
-  }
-}
-
-TEST_P(WaitableEventWatcherDeletionTest, SignalAndDelete) {
-  MessageLoop::Type message_loop_type;
-  bool delay_after_delete;
-  std::tie(message_loop_type, delay_after_delete) = GetParam();
-
-  // Signal and immediately delete the WaitableEvent out from under the Watcher.
-
-  MessageLoop message_loop(message_loop_type);
-
-  {
-    WaitableEventWatcher watcher;
-
-    auto event = std::make_unique<WaitableEvent>(
-        WaitableEvent::ResetPolicy::AUTOMATIC,
-        WaitableEvent::InitialState::NOT_SIGNALED);
-
-    watcher.StartWatching(event.get(), BindOnce(&QuitWhenSignaled),
-                          SequencedTaskRunnerHandle::Get());
-    event->Signal();
-    event.reset();
-
-    if (delay_after_delete) {
-      // On Windows that sleep() improves the chance to catch some problems.
-      // It postpones the dtor |watcher| (which immediately cancel the waiting)
-      // and gives some time to run to a created background thread.
-      // Unfortunately, that thread is under OS control and we can't
-      // manipulate it directly.
-      PlatformThread::Sleep(TimeDelta::FromMilliseconds(30));
-    }
-
-    // Wait for the watcher callback.
-    RunLoop().Run();
-  }
-}
-
-// Tests deleting the WaitableEventWatcher between signaling the event and
-// when the callback should be run.
-TEST_P(WaitableEventWatcherDeletionTest, DeleteWatcherBeforeCallback) {
-  MessageLoop::Type message_loop_type;
-  bool delay_after_delete;
-  std::tie(message_loop_type, delay_after_delete) = GetParam();
-
-  MessageLoop message_loop(message_loop_type);
-  scoped_refptr<SingleThreadTaskRunner> task_runner =
-      message_loop.task_runner();
-
-  // Flag used to esnure that the |watcher_callback| never runs.
-  bool did_callback = false;
-
-  WaitableEvent event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  auto watcher = std::make_unique<WaitableEventWatcher>();
-
-  // Queue up a series of tasks:
-  // 1. StartWatching the WaitableEvent
-  // 2. Signal the event (which will result in another task getting posted to
-  //    the |task_runner|)
-  // 3. Delete the WaitableEventWatcher
-  // 4. WaitableEventWatcher callback should run (from #2)
-
-  WaitableEventWatcher::EventCallback watcher_callback = BindOnce(
-      [](bool* did_callback, WaitableEvent*) {
-        *did_callback = true;
-      },
-      Unretained(&did_callback));
-
-  task_runner->PostTask(
-      FROM_HERE, BindOnce(IgnoreResult(&WaitableEventWatcher::StartWatching),
-                          Unretained(watcher.get()), Unretained(&event),
-                          std::move(watcher_callback), task_runner));
-  task_runner->PostTask(FROM_HERE,
-                        BindOnce(&WaitableEvent::Signal, Unretained(&event)));
-  task_runner->DeleteSoon(FROM_HERE, std::move(watcher));
-  if (delay_after_delete) {
-    task_runner->PostTask(FROM_HERE, BindOnce(&PlatformThread::Sleep,
-                                              TimeDelta::FromMilliseconds(30)));
-  }
-
-  RunLoop().RunUntilIdle();
-
-  EXPECT_FALSE(did_callback);
-}
-
-INSTANTIATE_TEST_CASE_P(,
-                        WaitableEventWatcherTest,
-                        testing::ValuesIn(testing_message_loops));
-
-INSTANTIATE_TEST_CASE_P(
-    ,
-    WaitableEventWatcherDeletionTest,
-    testing::Combine(testing::ValuesIn(testing_message_loops),
-                     testing::Bool()));
-
-}  // namespace base
diff --git a/base/sys_byteorder_unittest.cc b/base/sys_byteorder_unittest.cc
deleted file mode 100644
index f5bad31..0000000
--- a/base/sys_byteorder_unittest.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/sys_byteorder.h"
-
-#include <stdint.h>
-
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-const uint16_t k16BitTestData = 0xaabb;
-const uint16_t k16BitSwappedTestData = 0xbbaa;
-const uint32_t k32BitTestData = 0xaabbccdd;
-const uint32_t k32BitSwappedTestData = 0xddccbbaa;
-const uint64_t k64BitTestData = 0xaabbccdd44332211;
-const uint64_t k64BitSwappedTestData = 0x11223344ddccbbaa;
-
-}  // namespace
-
-TEST(ByteOrderTest, ByteSwap16) {
-  uint16_t swapped = base::ByteSwap(k16BitTestData);
-  EXPECT_EQ(k16BitSwappedTestData, swapped);
-  uint16_t reswapped = base::ByteSwap(swapped);
-  EXPECT_EQ(k16BitTestData, reswapped);
-}
-
-TEST(ByteOrderTest, ByteSwap32) {
-  uint32_t swapped = base::ByteSwap(k32BitTestData);
-  EXPECT_EQ(k32BitSwappedTestData, swapped);
-  uint32_t reswapped = base::ByteSwap(swapped);
-  EXPECT_EQ(k32BitTestData, reswapped);
-}
-
-TEST(ByteOrderTest, ByteSwap64) {
-  uint64_t swapped = base::ByteSwap(k64BitTestData);
-  EXPECT_EQ(k64BitSwappedTestData, swapped);
-  uint64_t reswapped = base::ByteSwap(swapped);
-  EXPECT_EQ(k64BitTestData, reswapped);
-}
-
-TEST(ByteOrderTest, ByteSwapUintPtrT) {
-#if defined(ARCH_CPU_64_BITS)
-  const uintptr_t test_data = static_cast<uintptr_t>(k64BitTestData);
-  const uintptr_t swapped_test_data =
-      static_cast<uintptr_t>(k64BitSwappedTestData);
-#elif defined(ARCH_CPU_32_BITS)
-  const uintptr_t test_data = static_cast<uintptr_t>(k32BitTestData);
-  const uintptr_t swapped_test_data =
-      static_cast<uintptr_t>(k32BitSwappedTestData);
-#else
-#error architecture not supported
-#endif
-
-  uintptr_t swapped = base::ByteSwapUintPtrT(test_data);
-  EXPECT_EQ(swapped_test_data, swapped);
-  uintptr_t reswapped = base::ByteSwapUintPtrT(swapped);
-  EXPECT_EQ(test_data, reswapped);
-}
-
-TEST(ByteOrderTest, ByteSwapToLE16) {
-  uint16_t le = base::ByteSwapToLE16(k16BitTestData);
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
-  EXPECT_EQ(k16BitTestData, le);
-#else
-  EXPECT_EQ(k16BitSwappedTestData, le);
-#endif
-}
-
-TEST(ByteOrderTest, ByteSwapToLE32) {
-  uint32_t le = base::ByteSwapToLE32(k32BitTestData);
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
-  EXPECT_EQ(k32BitTestData, le);
-#else
-  EXPECT_EQ(k32BitSwappedTestData, le);
-#endif
-}
-
-TEST(ByteOrderTest, ByteSwapToLE64) {
-  uint64_t le = base::ByteSwapToLE64(k64BitTestData);
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
-  EXPECT_EQ(k64BitTestData, le);
-#else
-  EXPECT_EQ(k64BitSwappedTestData, le);
-#endif
-}
-
-TEST(ByteOrderTest, NetToHost16) {
-  uint16_t h = base::NetToHost16(k16BitTestData);
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
-  EXPECT_EQ(k16BitSwappedTestData, h);
-#else
-  EXPECT_EQ(k16BitTestData, h);
-#endif
-}
-
-TEST(ByteOrderTest, NetToHost32) {
-  uint32_t h = base::NetToHost32(k32BitTestData);
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
-  EXPECT_EQ(k32BitSwappedTestData, h);
-#else
-  EXPECT_EQ(k32BitTestData, h);
-#endif
-}
-
-TEST(ByteOrderTest, NetToHost64) {
-  uint64_t h = base::NetToHost64(k64BitTestData);
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
-  EXPECT_EQ(k64BitSwappedTestData, h);
-#else
-  EXPECT_EQ(k64BitTestData, h);
-#endif
-}
-
-TEST(ByteOrderTest, HostToNet16) {
-  uint16_t n = base::HostToNet16(k16BitTestData);
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
-  EXPECT_EQ(k16BitSwappedTestData, n);
-#else
-  EXPECT_EQ(k16BitTestData, n);
-#endif
-}
-
-TEST(ByteOrderTest, HostToNet32) {
-  uint32_t n = base::HostToNet32(k32BitTestData);
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
-  EXPECT_EQ(k32BitSwappedTestData, n);
-#else
-  EXPECT_EQ(k32BitTestData, n);
-#endif
-}
-
-TEST(ByteOrderTest, HostToNet64) {
-  uint64_t n = base::HostToNet64(k64BitTestData);
-#if defined(ARCH_CPU_LITTLE_ENDIAN)
-  EXPECT_EQ(k64BitSwappedTestData, n);
-#else
-  EXPECT_EQ(k64BitTestData, n);
-#endif
-}
diff --git a/base/sys_info_unittest.cc b/base/sys_info_unittest.cc
deleted file mode 100644
index 7b2c458..0000000
--- a/base/sys_info_unittest.cc
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-
-#include "base/environment.h"
-#include "base/files/file_util.h"
-#include "base/process/process_metrics.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/sys_info.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-namespace base {
-
-using SysInfoTest = PlatformTest;
-
-TEST_F(SysInfoTest, NumProcs) {
-  // We aren't actually testing that it's correct, just that it's sane.
-  EXPECT_GE(SysInfo::NumberOfProcessors(), 1);
-}
-
-TEST_F(SysInfoTest, AmountOfMem) {
-  // We aren't actually testing that it's correct, just that it's sane.
-  EXPECT_GT(SysInfo::AmountOfPhysicalMemory(), 0);
-  EXPECT_GT(SysInfo::AmountOfPhysicalMemoryMB(), 0);
-  // The maxmimal amount of virtual memory can be zero which means unlimited.
-  EXPECT_GE(SysInfo::AmountOfVirtualMemory(), 0);
-}
-
-#if defined(OS_LINUX) || defined(OS_ANDROID)
-#if defined(OS_LINUX)
-#define MAYBE_AmountOfAvailablePhysicalMemory \
-  DISABLED_AmountOfAvailablePhysicalMemory
-#else
-#define MAYBE_AmountOfAvailablePhysicalMemory AmountOfAvailablePhysicalMemory
-#endif  // defined(OS_LINUX)
-TEST_F(SysInfoTest, MAYBE_AmountOfAvailablePhysicalMemory) {
-  // Note: info is in _K_bytes.
-  SystemMemoryInfoKB info;
-  ASSERT_TRUE(GetSystemMemoryInfo(&info));
-  EXPECT_GT(info.free, 0);
-
-  if (info.available != 0) {
-    // If there is MemAvailable from kernel.
-    EXPECT_LT(info.available, info.total);
-    const int64_t amount = SysInfo::AmountOfAvailablePhysicalMemory(info);
-    // We aren't actually testing that it's correct, just that it's sane.
-    EXPECT_GT(amount, static_cast<int64_t>(info.free) * 1024);
-    EXPECT_LT(amount / 1024, info.available);
-    // Simulate as if there is no MemAvailable.
-    info.available = 0;
-  }
-
-  // There is no MemAvailable. Check the fallback logic.
-  const int64_t amount = SysInfo::AmountOfAvailablePhysicalMemory(info);
-  // We aren't actually testing that it's correct, just that it's sane.
-  EXPECT_GT(amount, static_cast<int64_t>(info.free) * 1024);
-  EXPECT_LT(amount / 1024, info.total);
-}
-#endif  // defined(OS_LINUX) || defined(OS_ANDROID)
-
-TEST_F(SysInfoTest, AmountOfFreeDiskSpace) {
-  // We aren't actually testing that it's correct, just that it's sane.
-  FilePath tmp_path;
-  ASSERT_TRUE(GetTempDir(&tmp_path));
-  EXPECT_GE(SysInfo::AmountOfFreeDiskSpace(tmp_path), 0) << tmp_path.value();
-}
-
-TEST_F(SysInfoTest, AmountOfTotalDiskSpace) {
-  // We aren't actually testing that it's correct, just that it's sane.
-  FilePath tmp_path;
-  ASSERT_TRUE(GetTempDir(&tmp_path));
-  EXPECT_GT(SysInfo::AmountOfTotalDiskSpace(tmp_path), 0) << tmp_path.value();
-}
-
-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
-TEST_F(SysInfoTest, OperatingSystemVersionNumbers) {
-  int32_t os_major_version = -1;
-  int32_t os_minor_version = -1;
-  int32_t os_bugfix_version = -1;
-  SysInfo::OperatingSystemVersionNumbers(&os_major_version,
-                                         &os_minor_version,
-                                         &os_bugfix_version);
-  EXPECT_GT(os_major_version, -1);
-  EXPECT_GT(os_minor_version, -1);
-  EXPECT_GT(os_bugfix_version, -1);
-}
-#endif
-
-TEST_F(SysInfoTest, Uptime) {
-  TimeDelta up_time_1 = SysInfo::Uptime();
-  // UpTime() is implemented internally using TimeTicks::Now(), which documents
-  // system resolution as being 1-15ms. Sleep a little longer than that.
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(20));
-  TimeDelta up_time_2 = SysInfo::Uptime();
-  EXPECT_GT(up_time_1.InMicroseconds(), 0);
-  EXPECT_GT(up_time_2.InMicroseconds(), up_time_1.InMicroseconds());
-}
-
-#if defined(OS_MACOSX)
-TEST_F(SysInfoTest, HardwareModelNameFormatMacAndiOS) {
-  std::string hardware_model = SysInfo::HardwareModelName();
-  ASSERT_FALSE(hardware_model.empty());
-  // Check that the model is of the expected format "Foo,Bar" where "Bar" is
-  // a number.
-  std::vector<StringPiece> pieces =
-      SplitStringPiece(hardware_model, ",", KEEP_WHITESPACE, SPLIT_WANT_ALL);
-  ASSERT_EQ(2u, pieces.size()) << hardware_model;
-  int value;
-  EXPECT_TRUE(StringToInt(pieces[1], &value)) << hardware_model;
-}
-#endif
-
-#if defined(OS_CHROMEOS)
-
-TEST_F(SysInfoTest, GoogleChromeOSVersionNumbers) {
-  int32_t os_major_version = -1;
-  int32_t os_minor_version = -1;
-  int32_t os_bugfix_version = -1;
-  const char kLsbRelease[] =
-      "FOO=1234123.34.5\n"
-      "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
-  SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, Time());
-  SysInfo::OperatingSystemVersionNumbers(&os_major_version,
-                                         &os_minor_version,
-                                         &os_bugfix_version);
-  EXPECT_EQ(1, os_major_version);
-  EXPECT_EQ(2, os_minor_version);
-  EXPECT_EQ(3, os_bugfix_version);
-}
-
-TEST_F(SysInfoTest, GoogleChromeOSVersionNumbersFirst) {
-  int32_t os_major_version = -1;
-  int32_t os_minor_version = -1;
-  int32_t os_bugfix_version = -1;
-  const char kLsbRelease[] =
-      "CHROMEOS_RELEASE_VERSION=1.2.3.4\n"
-      "FOO=1234123.34.5\n";
-  SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, Time());
-  SysInfo::OperatingSystemVersionNumbers(&os_major_version,
-                                         &os_minor_version,
-                                         &os_bugfix_version);
-  EXPECT_EQ(1, os_major_version);
-  EXPECT_EQ(2, os_minor_version);
-  EXPECT_EQ(3, os_bugfix_version);
-}
-
-TEST_F(SysInfoTest, GoogleChromeOSNoVersionNumbers) {
-  int32_t os_major_version = -1;
-  int32_t os_minor_version = -1;
-  int32_t os_bugfix_version = -1;
-  const char kLsbRelease[] = "FOO=1234123.34.5\n";
-  SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, Time());
-  SysInfo::OperatingSystemVersionNumbers(&os_major_version,
-                                         &os_minor_version,
-                                         &os_bugfix_version);
-  EXPECT_EQ(0, os_major_version);
-  EXPECT_EQ(0, os_minor_version);
-  EXPECT_EQ(0, os_bugfix_version);
-}
-
-TEST_F(SysInfoTest, GoogleChromeOSLsbReleaseTime) {
-  const char kLsbRelease[] = "CHROMEOS_RELEASE_VERSION=1.2.3.4";
-  // Use a fake time that can be safely displayed as a string.
-  const Time lsb_release_time(Time::FromDoubleT(12345.6));
-  SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease, lsb_release_time);
-  Time parsed_lsb_release_time = SysInfo::GetLsbReleaseTime();
-  EXPECT_DOUBLE_EQ(lsb_release_time.ToDoubleT(),
-                   parsed_lsb_release_time.ToDoubleT());
-}
-
-TEST_F(SysInfoTest, IsRunningOnChromeOS) {
-  SysInfo::SetChromeOSVersionInfoForTest("", Time());
-  EXPECT_FALSE(SysInfo::IsRunningOnChromeOS());
-
-  const char kLsbRelease1[] =
-      "CHROMEOS_RELEASE_NAME=Non Chrome OS\n"
-      "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
-  SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease1, Time());
-  EXPECT_FALSE(SysInfo::IsRunningOnChromeOS());
-
-  const char kLsbRelease2[] =
-      "CHROMEOS_RELEASE_NAME=Chrome OS\n"
-      "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
-  SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease2, Time());
-  EXPECT_TRUE(SysInfo::IsRunningOnChromeOS());
-
-  const char kLsbRelease3[] =
-      "CHROMEOS_RELEASE_NAME=Chromium OS\n";
-  SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease3, Time());
-  EXPECT_TRUE(SysInfo::IsRunningOnChromeOS());
-}
-
-TEST_F(SysInfoTest, GetStrippedReleaseBoard) {
-  const char* kLsbRelease1 = "CHROMEOS_RELEASE_BOARD=Glimmer\n";
-  SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease1, Time());
-  EXPECT_EQ("glimmer", SysInfo::GetStrippedReleaseBoard());
-
-  const char* kLsbRelease2 = "CHROMEOS_RELEASE_BOARD=glimmer-signed-mp-v4keys";
-  SysInfo::SetChromeOSVersionInfoForTest(kLsbRelease2, Time());
-  EXPECT_EQ("glimmer", SysInfo::GetStrippedReleaseBoard());
-}
-
-#endif  // OS_CHROMEOS
-
-}  // namespace base
diff --git a/base/system_monitor/system_monitor_unittest.cc b/base/system_monitor/system_monitor_unittest.cc
deleted file mode 100644
index 8963f7b..0000000
--- a/base/system_monitor/system_monitor_unittest.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/system_monitor/system_monitor.h"
-
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/test/mock_devices_changed_observer.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class SystemMonitorTest : public testing::Test {
- protected:
-  SystemMonitorTest() {
-    system_monitor_.reset(new SystemMonitor);
-  }
-
-  MessageLoop message_loop_;
-  std::unique_ptr<SystemMonitor> system_monitor_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SystemMonitorTest);
-};
-
-TEST_F(SystemMonitorTest, DeviceChangeNotifications) {
-  const int kObservers = 5;
-
-  testing::Sequence mock_sequencer[kObservers];
-  MockDevicesChangedObserver observers[kObservers];
-  for (int index = 0; index < kObservers; ++index) {
-    system_monitor_->AddDevicesChangedObserver(&observers[index]);
-
-    EXPECT_CALL(observers[index],
-                OnDevicesChanged(SystemMonitor::DEVTYPE_UNKNOWN))
-        .Times(3)
-        .InSequence(mock_sequencer[index]);
-  }
-
-  system_monitor_->ProcessDevicesChanged(SystemMonitor::DEVTYPE_UNKNOWN);
-  RunLoop().RunUntilIdle();
-
-  system_monitor_->ProcessDevicesChanged(SystemMonitor::DEVTYPE_UNKNOWN);
-  system_monitor_->ProcessDevicesChanged(SystemMonitor::DEVTYPE_UNKNOWN);
-  RunLoop().RunUntilIdle();
-}
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/task/cancelable_task_tracker_unittest.cc b/base/task/cancelable_task_tracker_unittest.cc
deleted file mode 100644
index c75adc4..0000000
--- a/base/task/cancelable_task_tracker_unittest.cc
+++ /dev/null
@@ -1,403 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task/cancelable_task_tracker.h"
-
-#include <cstddef>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/weak_ptr.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/test/gtest_util.h"
-#include "base/test/test_simple_task_runner.h"
-#include "base/threading/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class CancelableTaskTrackerTest : public testing::Test {
- protected:
-  ~CancelableTaskTrackerTest() override { RunCurrentLoopUntilIdle(); }
-
-  void RunCurrentLoopUntilIdle() {
-    RunLoop run_loop;
-    run_loop.RunUntilIdle();
-  }
-
-  CancelableTaskTracker task_tracker_;
-
- private:
-  // Needed by CancelableTaskTracker methods.
-  MessageLoop message_loop_;
-};
-
-void AddFailureAt(const Location& location) {
-  ADD_FAILURE_AT(location.file_name(), location.line_number());
-}
-
-// Returns a closure that fails if run.
-Closure MakeExpectedNotRunClosure(const Location& location) {
-  return Bind(&AddFailureAt, location);
-}
-
-// A helper class for MakeExpectedRunClosure() that fails if it is
-// destroyed without Run() having been called.  This class may be used
-// from multiple threads as long as Run() is called at most once
-// before destruction.
-class RunChecker {
- public:
-  explicit RunChecker(const Location& location)
-      : location_(location), called_(false) {}
-
-  ~RunChecker() {
-    if (!called_) {
-      ADD_FAILURE_AT(location_.file_name(), location_.line_number());
-    }
-  }
-
-  void Run() { called_ = true; }
-
- private:
-  Location location_;
-  bool called_;
-};
-
-// Returns a closure that fails on destruction if it hasn't been run.
-Closure MakeExpectedRunClosure(const Location& location) {
-  return Bind(&RunChecker::Run, Owned(new RunChecker(location)));
-}
-
-}  // namespace
-
-// With the task tracker, post a task, a task with a reply, and get a
-// new task id without canceling any of them.  The tasks and the reply
-// should run and the "is canceled" callback should return false.
-TEST_F(CancelableTaskTrackerTest, NoCancel) {
-  Thread worker_thread("worker thread");
-  ASSERT_TRUE(worker_thread.Start());
-
-  ignore_result(task_tracker_.PostTask(worker_thread.task_runner().get(),
-                                       FROM_HERE,
-                                       MakeExpectedRunClosure(FROM_HERE)));
-
-  ignore_result(task_tracker_.PostTaskAndReply(
-      worker_thread.task_runner().get(), FROM_HERE,
-      MakeExpectedRunClosure(FROM_HERE), MakeExpectedRunClosure(FROM_HERE)));
-
-  CancelableTaskTracker::IsCanceledCallback is_canceled;
-  ignore_result(task_tracker_.NewTrackedTaskId(&is_canceled));
-
-  worker_thread.Stop();
-
-  RunCurrentLoopUntilIdle();
-
-  EXPECT_FALSE(is_canceled.Run());
-}
-
-// Post a task with the task tracker but cancel it before running the
-// task runner.  The task should not run.
-TEST_F(CancelableTaskTrackerTest, CancelPostedTask) {
-  scoped_refptr<TestSimpleTaskRunner> test_task_runner(
-      new TestSimpleTaskRunner());
-
-  CancelableTaskTracker::TaskId task_id = task_tracker_.PostTask(
-      test_task_runner.get(), FROM_HERE, MakeExpectedNotRunClosure(FROM_HERE));
-  EXPECT_NE(CancelableTaskTracker::kBadTaskId, task_id);
-
-  EXPECT_EQ(1U, test_task_runner->NumPendingTasks());
-
-  task_tracker_.TryCancel(task_id);
-
-  test_task_runner->RunUntilIdle();
-}
-
-// Post a task with reply with the task tracker and cancel it before
-// running the task runner.  Neither the task nor the reply should
-// run.
-TEST_F(CancelableTaskTrackerTest, CancelPostedTaskAndReply) {
-  scoped_refptr<TestSimpleTaskRunner> test_task_runner(
-      new TestSimpleTaskRunner());
-
-  CancelableTaskTracker::TaskId task_id =
-      task_tracker_.PostTaskAndReply(test_task_runner.get(),
-                                     FROM_HERE,
-                                     MakeExpectedNotRunClosure(FROM_HERE),
-                                     MakeExpectedNotRunClosure(FROM_HERE));
-  EXPECT_NE(CancelableTaskTracker::kBadTaskId, task_id);
-
-  task_tracker_.TryCancel(task_id);
-
-  test_task_runner->RunUntilIdle();
-}
-
-// Post a task with reply with the task tracker and cancel it after
-// running the task runner but before running the current message
-// loop.  The task should run but the reply should not.
-TEST_F(CancelableTaskTrackerTest, CancelReply) {
-  scoped_refptr<TestSimpleTaskRunner> test_task_runner(
-      new TestSimpleTaskRunner());
-
-  CancelableTaskTracker::TaskId task_id =
-      task_tracker_.PostTaskAndReply(test_task_runner.get(),
-                                     FROM_HERE,
-                                     MakeExpectedRunClosure(FROM_HERE),
-                                     MakeExpectedNotRunClosure(FROM_HERE));
-  EXPECT_NE(CancelableTaskTracker::kBadTaskId, task_id);
-
-  test_task_runner->RunUntilIdle();
-
-  task_tracker_.TryCancel(task_id);
-}
-
-// Post a task with reply with the task tracker on a worker thread and
-// cancel it before running the current message loop.  The task should
-// run but the reply should not.
-TEST_F(CancelableTaskTrackerTest, CancelReplyDifferentThread) {
-  Thread worker_thread("worker thread");
-  ASSERT_TRUE(worker_thread.Start());
-
-  CancelableTaskTracker::TaskId task_id = task_tracker_.PostTaskAndReply(
-      worker_thread.task_runner().get(), FROM_HERE, DoNothing(),
-      MakeExpectedNotRunClosure(FROM_HERE));
-  EXPECT_NE(CancelableTaskTracker::kBadTaskId, task_id);
-
-  task_tracker_.TryCancel(task_id);
-
-  worker_thread.Stop();
-}
-
-void ExpectIsCanceled(
-    const CancelableTaskTracker::IsCanceledCallback& is_canceled,
-    bool expected_is_canceled) {
-  EXPECT_EQ(expected_is_canceled, is_canceled.Run());
-}
-
-// Create a new task ID and check its status on a separate thread
-// before and after canceling.  The is-canceled callback should be
-// thread-safe (i.e., nothing should blow up).
-TEST_F(CancelableTaskTrackerTest, NewTrackedTaskIdDifferentThread) {
-  CancelableTaskTracker::IsCanceledCallback is_canceled;
-  CancelableTaskTracker::TaskId task_id =
-      task_tracker_.NewTrackedTaskId(&is_canceled);
-
-  EXPECT_FALSE(is_canceled.Run());
-
-  Thread other_thread("other thread");
-  ASSERT_TRUE(other_thread.Start());
-  other_thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&ExpectIsCanceled, is_canceled, false));
-  other_thread.Stop();
-
-  task_tracker_.TryCancel(task_id);
-
-  ASSERT_TRUE(other_thread.Start());
-  other_thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&ExpectIsCanceled, is_canceled, true));
-  other_thread.Stop();
-}
-
-// With the task tracker, post a task, a task with a reply, get a new
-// task id, and then cancel all of them.  None of the tasks nor the
-// reply should run and the "is canceled" callback should return
-// true.
-TEST_F(CancelableTaskTrackerTest, CancelAll) {
-  scoped_refptr<TestSimpleTaskRunner> test_task_runner(
-      new TestSimpleTaskRunner());
-
-  ignore_result(task_tracker_.PostTask(
-      test_task_runner.get(), FROM_HERE, MakeExpectedNotRunClosure(FROM_HERE)));
-
-  ignore_result(
-      task_tracker_.PostTaskAndReply(test_task_runner.get(),
-                                     FROM_HERE,
-                                     MakeExpectedNotRunClosure(FROM_HERE),
-                                     MakeExpectedNotRunClosure(FROM_HERE)));
-
-  CancelableTaskTracker::IsCanceledCallback is_canceled;
-  ignore_result(task_tracker_.NewTrackedTaskId(&is_canceled));
-
-  task_tracker_.TryCancelAll();
-
-  test_task_runner->RunUntilIdle();
-
-  RunCurrentLoopUntilIdle();
-
-  EXPECT_TRUE(is_canceled.Run());
-}
-
-// With the task tracker, post a task, a task with a reply, get a new
-// task id, and then cancel all of them.  None of the tasks nor the
-// reply should run and the "is canceled" callback should return
-// true.
-TEST_F(CancelableTaskTrackerTest, DestructionCancelsAll) {
-  scoped_refptr<TestSimpleTaskRunner> test_task_runner(
-      new TestSimpleTaskRunner());
-
-  CancelableTaskTracker::IsCanceledCallback is_canceled;
-
-  {
-    // Create another task tracker with a smaller scope.
-    CancelableTaskTracker task_tracker;
-
-    ignore_result(task_tracker.PostTask(test_task_runner.get(),
-                                        FROM_HERE,
-                                        MakeExpectedNotRunClosure(FROM_HERE)));
-
-    ignore_result(
-        task_tracker.PostTaskAndReply(test_task_runner.get(),
-                                      FROM_HERE,
-                                      MakeExpectedNotRunClosure(FROM_HERE),
-                                      MakeExpectedNotRunClosure(FROM_HERE)));
-
-    ignore_result(task_tracker_.NewTrackedTaskId(&is_canceled));
-  }
-
-  test_task_runner->RunUntilIdle();
-
-  RunCurrentLoopUntilIdle();
-
-  EXPECT_FALSE(is_canceled.Run());
-}
-
-// Post a task and cancel it. HasTrackedTasks() should return false as soon as
-// TryCancelAll() is called.
-TEST_F(CancelableTaskTrackerTest, HasTrackedTasksPost) {
-  scoped_refptr<TestSimpleTaskRunner> test_task_runner(
-      new TestSimpleTaskRunner());
-
-  EXPECT_FALSE(task_tracker_.HasTrackedTasks());
-
-  ignore_result(task_tracker_.PostTask(
-      test_task_runner.get(), FROM_HERE, MakeExpectedNotRunClosure(FROM_HERE)));
-
-  task_tracker_.TryCancelAll();
-
-  EXPECT_FALSE(task_tracker_.HasTrackedTasks());
-
-  test_task_runner->RunUntilIdle();
-  RunCurrentLoopUntilIdle();
-}
-
-// Post a task with a reply and cancel it. HasTrackedTasks() should return false
-// as soon as TryCancelAll() is called.
-TEST_F(CancelableTaskTrackerTest, HasTrackedTasksPostWithReply) {
-  scoped_refptr<TestSimpleTaskRunner> test_task_runner(
-      new TestSimpleTaskRunner());
-
-  EXPECT_FALSE(task_tracker_.HasTrackedTasks());
-
-  ignore_result(
-      task_tracker_.PostTaskAndReply(test_task_runner.get(),
-                                     FROM_HERE,
-                                     MakeExpectedNotRunClosure(FROM_HERE),
-                                     MakeExpectedNotRunClosure(FROM_HERE)));
-
-  task_tracker_.TryCancelAll();
-
-  EXPECT_FALSE(task_tracker_.HasTrackedTasks());
-
-  test_task_runner->RunUntilIdle();
-  RunCurrentLoopUntilIdle();
-}
-
-// Create a new tracked task ID. HasTrackedTasks() should return false as soon
-// as TryCancelAll() is called.
-TEST_F(CancelableTaskTrackerTest, HasTrackedTasksIsCancelled) {
-  EXPECT_FALSE(task_tracker_.HasTrackedTasks());
-
-  CancelableTaskTracker::IsCanceledCallback is_canceled;
-  ignore_result(task_tracker_.NewTrackedTaskId(&is_canceled));
-
-  task_tracker_.TryCancelAll();
-
-  EXPECT_FALSE(task_tracker_.HasTrackedTasks());
-}
-
-// The death tests below make sure that calling task tracker member
-// functions from a thread different from its owner thread DCHECKs in
-// debug mode.
-
-class CancelableTaskTrackerDeathTest : public CancelableTaskTrackerTest {
- protected:
-  CancelableTaskTrackerDeathTest() {
-    // The default style "fast" does not support multi-threaded tests.
-    ::testing::FLAGS_gtest_death_test_style = "threadsafe";
-  }
-};
-
-// Runs |fn| with |task_tracker|, expecting it to crash in debug mode.
-void MaybeRunDeadlyTaskTrackerMemberFunction(
-    CancelableTaskTracker* task_tracker,
-    const Callback<void(CancelableTaskTracker*)>& fn) {
-  EXPECT_DCHECK_DEATH(fn.Run(task_tracker));
-}
-
-void PostDoNothingTask(CancelableTaskTracker* task_tracker) {
-  ignore_result(task_tracker->PostTask(
-      scoped_refptr<TestSimpleTaskRunner>(new TestSimpleTaskRunner()).get(),
-      FROM_HERE, DoNothing()));
-}
-
-TEST_F(CancelableTaskTrackerDeathTest, PostFromDifferentThread) {
-  Thread bad_thread("bad thread");
-  ASSERT_TRUE(bad_thread.Start());
-
-  bad_thread.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(&MaybeRunDeadlyTaskTrackerMemberFunction,
-               Unretained(&task_tracker_), Bind(&PostDoNothingTask)));
-}
-
-void TryCancel(CancelableTaskTracker::TaskId task_id,
-               CancelableTaskTracker* task_tracker) {
-  task_tracker->TryCancel(task_id);
-}
-
-TEST_F(CancelableTaskTrackerDeathTest, CancelOnDifferentThread) {
-  scoped_refptr<TestSimpleTaskRunner> test_task_runner(
-      new TestSimpleTaskRunner());
-
-  Thread bad_thread("bad thread");
-  ASSERT_TRUE(bad_thread.Start());
-
-  CancelableTaskTracker::TaskId task_id =
-      task_tracker_.PostTask(test_task_runner.get(), FROM_HERE, DoNothing());
-  EXPECT_NE(CancelableTaskTracker::kBadTaskId, task_id);
-
-  bad_thread.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(&MaybeRunDeadlyTaskTrackerMemberFunction,
-               Unretained(&task_tracker_), Bind(&TryCancel, task_id)));
-
-  test_task_runner->RunUntilIdle();
-}
-
-TEST_F(CancelableTaskTrackerDeathTest, CancelAllOnDifferentThread) {
-  scoped_refptr<TestSimpleTaskRunner> test_task_runner(
-      new TestSimpleTaskRunner());
-
-  Thread bad_thread("bad thread");
-  ASSERT_TRUE(bad_thread.Start());
-
-  CancelableTaskTracker::TaskId task_id =
-      task_tracker_.PostTask(test_task_runner.get(), FROM_HERE, DoNothing());
-  EXPECT_NE(CancelableTaskTracker::kBadTaskId, task_id);
-
-  bad_thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&MaybeRunDeadlyTaskTrackerMemberFunction,
-                          Unretained(&task_tracker_),
-                          Bind(&CancelableTaskTracker::TryCancelAll)));
-
-  test_task_runner->RunUntilIdle();
-}
-
-}  // namespace base
diff --git a/base/task_runner_util_unittest.cc b/base/task_runner_util_unittest.cc
deleted file mode 100644
index 44baad4..0000000
--- a/base/task_runner_util_unittest.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_runner_util.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-int ReturnFourtyTwo() {
-  return 42;
-}
-
-void StoreValue(int* destination, int value) {
-  *destination = value;
-}
-
-void StoreDoubleValue(double* destination, double value) {
-  *destination = value;
-}
-
-int g_foo_destruct_count = 0;
-int g_foo_free_count = 0;
-
-struct Foo {
-  ~Foo() {
-    ++g_foo_destruct_count;
-  }
-};
-
-std::unique_ptr<Foo> CreateFoo() {
-  return std::unique_ptr<Foo>(new Foo);
-}
-
-void ExpectFoo(std::unique_ptr<Foo> foo) {
-  EXPECT_TRUE(foo.get());
-  std::unique_ptr<Foo> local_foo(std::move(foo));
-  EXPECT_TRUE(local_foo.get());
-  EXPECT_FALSE(foo.get());
-}
-
-struct FooDeleter {
-  void operator()(Foo* foo) const {
-    ++g_foo_free_count;
-    delete foo;
-  };
-};
-
-std::unique_ptr<Foo, FooDeleter> CreateScopedFoo() {
-  return std::unique_ptr<Foo, FooDeleter>(new Foo);
-}
-
-void ExpectScopedFoo(std::unique_ptr<Foo, FooDeleter> foo) {
-  EXPECT_TRUE(foo.get());
-  std::unique_ptr<Foo, FooDeleter> local_foo(std::move(foo));
-  EXPECT_TRUE(local_foo.get());
-  EXPECT_FALSE(foo.get());
-}
-
-}  // namespace
-
-TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResult) {
-  int result = 0;
-
-  MessageLoop message_loop;
-  PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
-                             Bind(&ReturnFourtyTwo),
-                             Bind(&StoreValue, &result));
-
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(42, result);
-}
-
-TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultImplicitConvert) {
-  double result = 0;
-
-  MessageLoop message_loop;
-  PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
-                             Bind(&ReturnFourtyTwo),
-                             Bind(&StoreDoubleValue, &result));
-
-  RunLoop().RunUntilIdle();
-
-  EXPECT_DOUBLE_EQ(42.0, result);
-}
-
-TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultPassed) {
-  g_foo_destruct_count = 0;
-  g_foo_free_count = 0;
-
-  MessageLoop message_loop;
-  PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
-                             Bind(&CreateFoo), Bind(&ExpectFoo));
-
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(1, g_foo_destruct_count);
-  EXPECT_EQ(0, g_foo_free_count);
-}
-
-TEST(TaskRunnerHelpersTest, PostTaskAndReplyWithResultPassedFreeProc) {
-  g_foo_destruct_count = 0;
-  g_foo_free_count = 0;
-
-  MessageLoop message_loop;
-  PostTaskAndReplyWithResult(message_loop.task_runner().get(), FROM_HERE,
-                             Bind(&CreateScopedFoo), Bind(&ExpectScopedFoo));
-
-  RunLoop().RunUntilIdle();
-
-  EXPECT_EQ(1, g_foo_destruct_count);
-  EXPECT_EQ(1, g_foo_free_count);
-}
-
-}  // namespace base
diff --git a/base/task_scheduler/delayed_task_manager_unittest.cc b/base/task_scheduler/delayed_task_manager_unittest.cc
deleted file mode 100644
index 67c797a..0000000
--- a/base/task_scheduler/delayed_task_manager_unittest.cc
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/delayed_task_manager.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/task.h"
-#include "base/test/bind_test_util.h"
-#include "base/test/test_mock_time_task_runner.h"
-#include "base/threading/thread.h"
-#include "base/time/time.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-namespace {
-
-constexpr TimeDelta kLongDelay = TimeDelta::FromHours(1);
-
-class MockTask {
- public:
-  MOCK_METHOD0(Run, void());
-};
-
-void RunTask(Task task) {
-  std::move(task.task).Run();
-}
-
-class TaskSchedulerDelayedTaskManagerTest : public testing::Test {
- protected:
-  TaskSchedulerDelayedTaskManagerTest()
-      : delayed_task_manager_(
-            service_thread_task_runner_->DeprecatedGetMockTickClock()),
-        task_(FROM_HERE,
-              BindOnce(&MockTask::Run, Unretained(&mock_task_)),
-              TaskTraits(),
-              kLongDelay) {
-    // The constructor of Task computes |delayed_run_time| by adding |delay| to
-    // the real time. Recompute it by adding |delay| to the mock time.
-    task_.delayed_run_time =
-        service_thread_task_runner_->GetMockTickClock()->NowTicks() +
-        kLongDelay;
-  }
-  ~TaskSchedulerDelayedTaskManagerTest() override = default;
-
-  const scoped_refptr<TestMockTimeTaskRunner> service_thread_task_runner_ =
-      MakeRefCounted<TestMockTimeTaskRunner>();
-  DelayedTaskManager delayed_task_manager_;
-  testing::StrictMock<MockTask> mock_task_;
-  Task task_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerDelayedTaskManagerTest);
-};
-
-}  // namespace
-
-// Verify that a delayed task isn't forwarded before Start().
-TEST_F(TaskSchedulerDelayedTaskManagerTest, DelayedTaskDoesNotRunBeforeStart) {
-  // Send |task| to the DelayedTaskManager.
-  delayed_task_manager_.AddDelayedTask(std::move(task_), BindOnce(&RunTask));
-
-  // Fast-forward time until the task is ripe for execution. Since Start() has
-  // not been called, the task should not be forwarded to RunTask() (MockTask is
-  // a StrictMock without expectations so test will fail if RunTask() runs it).
-  service_thread_task_runner_->FastForwardBy(kLongDelay);
-}
-
-// Verify that a delayed task added before Start() and whose delay expires after
-// Start() is forwarded when its delay expires.
-TEST_F(TaskSchedulerDelayedTaskManagerTest,
-       DelayedTaskPostedBeforeStartExpiresAfterStartRunsOnExpire) {
-  // Send |task| to the DelayedTaskManager.
-  delayed_task_manager_.AddDelayedTask(std::move(task_), BindOnce(&RunTask));
-
-  delayed_task_manager_.Start(service_thread_task_runner_);
-
-  // Run tasks on the service thread. Don't expect any forwarding to
-  // |task_target_| since the task isn't ripe for execution.
-  service_thread_task_runner_->RunUntilIdle();
-
-  // Fast-forward time until the task is ripe for execution. Expect the task to
-  // be forwarded to RunTask().
-  EXPECT_CALL(mock_task_, Run());
-  service_thread_task_runner_->FastForwardBy(kLongDelay);
-}
-
-// Verify that a delayed task added before Start() and whose delay expires
-// before Start() is forwarded when Start() is called.
-TEST_F(TaskSchedulerDelayedTaskManagerTest,
-       DelayedTaskPostedBeforeStartExpiresBeforeStartRunsOnStart) {
-  // Send |task| to the DelayedTaskManager.
-  delayed_task_manager_.AddDelayedTask(std::move(task_), BindOnce(&RunTask));
-
-  // Run tasks on the service thread. Don't expect any forwarding to
-  // |task_target_| since the task isn't ripe for execution.
-  service_thread_task_runner_->RunUntilIdle();
-
-  // Fast-forward time until the task is ripe for execution. Don't expect the
-  // task to be forwarded since Start() hasn't been called yet.
-  service_thread_task_runner_->FastForwardBy(kLongDelay);
-
-  // Start the DelayedTaskManager. Expect the task to be forwarded to RunTask().
-  EXPECT_CALL(mock_task_, Run());
-  delayed_task_manager_.Start(service_thread_task_runner_);
-  service_thread_task_runner_->RunUntilIdle();
-}
-
-// Verify that a delayed task added after Start() isn't forwarded before it is
-// ripe for execution.
-TEST_F(TaskSchedulerDelayedTaskManagerTest, DelayedTaskDoesNotRunTooEarly) {
-  delayed_task_manager_.Start(service_thread_task_runner_);
-
-  // Send |task| to the DelayedTaskManager.
-  delayed_task_manager_.AddDelayedTask(std::move(task_), BindOnce(&RunTask));
-
-  // Run tasks that are ripe for execution. Don't expect any forwarding to
-  // RunTask().
-  service_thread_task_runner_->RunUntilIdle();
-}
-
-// Verify that a delayed task added after Start() is forwarded when it is ripe
-// for execution.
-TEST_F(TaskSchedulerDelayedTaskManagerTest, DelayedTaskRunsAfterDelay) {
-  delayed_task_manager_.Start(service_thread_task_runner_);
-
-  // Send |task| to the DelayedTaskManager.
-  delayed_task_manager_.AddDelayedTask(std::move(task_), BindOnce(&RunTask));
-
-  // Fast-forward time. Expect the task to be forwarded to RunTask().
-  EXPECT_CALL(mock_task_, Run());
-  service_thread_task_runner_->FastForwardBy(kLongDelay);
-}
-
-// Verify that multiple delayed tasks added after Start() are forwarded when
-// they are ripe for execution.
-TEST_F(TaskSchedulerDelayedTaskManagerTest, DelayedTasksRunAfterDelay) {
-  delayed_task_manager_.Start(service_thread_task_runner_);
-
-  testing::StrictMock<MockTask> mock_task_a;
-  Task task_a(FROM_HERE, BindOnce(&MockTask::Run, Unretained(&mock_task_a)),
-              TaskTraits(), TimeDelta::FromHours(1));
-
-  testing::StrictMock<MockTask> mock_task_b;
-  Task task_b(FROM_HERE, BindOnce(&MockTask::Run, Unretained(&mock_task_b)),
-              TaskTraits(), TimeDelta::FromHours(2));
-
-  testing::StrictMock<MockTask> mock_task_c;
-  Task task_c(FROM_HERE, BindOnce(&MockTask::Run, Unretained(&mock_task_c)),
-              TaskTraits(), TimeDelta::FromHours(1));
-
-  // Send tasks to the DelayedTaskManager.
-  delayed_task_manager_.AddDelayedTask(std::move(task_a), BindOnce(&RunTask));
-  delayed_task_manager_.AddDelayedTask(std::move(task_b), BindOnce(&RunTask));
-  delayed_task_manager_.AddDelayedTask(std::move(task_c), BindOnce(&RunTask));
-
-  // Run tasks that are ripe for execution on the service thread. Don't expect
-  // any call to RunTask().
-  service_thread_task_runner_->RunUntilIdle();
-
-  // Fast-forward time. Expect |task_a| and |task_c| to be forwarded to
-  // |task_target_|.
-  EXPECT_CALL(mock_task_a, Run());
-  EXPECT_CALL(mock_task_c, Run());
-  service_thread_task_runner_->FastForwardBy(TimeDelta::FromHours(1));
-  testing::Mock::VerifyAndClear(&mock_task_a);
-  testing::Mock::VerifyAndClear(&mock_task_c);
-
-  // Fast-forward time. Expect |task_b| to be forwarded to RunTask().
-  EXPECT_CALL(mock_task_b, Run());
-  service_thread_task_runner_->FastForwardBy(TimeDelta::FromHours(1));
-  testing::Mock::VerifyAndClear(&mock_task_b);
-}
-
-TEST_F(TaskSchedulerDelayedTaskManagerTest, PostTaskDuringStart) {
-  Thread other_thread("Test");
-  other_thread.StartAndWaitForTesting();
-
-  WaitableEvent task_posted;
-
-  other_thread.task_runner()->PostTask(FROM_HERE, BindLambdaForTesting([&]() {
-                                         delayed_task_manager_.AddDelayedTask(
-                                             std::move(task_),
-                                             BindOnce(&RunTask));
-                                         task_posted.Signal();
-                                       }));
-
-  delayed_task_manager_.Start(service_thread_task_runner_);
-
-  // The test is testing a race between AddDelayedTask/Start but it still needs
-  // synchronization to ensure we don't do the final verification before the
-  // task itself is posted.
-  task_posted.Wait();
-
-  // Fast-forward time. Expect the task to be forwarded to RunTask().
-  EXPECT_CALL(mock_task_, Run());
-  service_thread_task_runner_->FastForwardBy(kLongDelay);
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/lazy_task_runner_unittest.cc b/base/task_scheduler/lazy_task_runner_unittest.cc
deleted file mode 100644
index e898a1e..0000000
--- a/base/task_scheduler/lazy_task_runner_unittest.cc
+++ /dev/null
@@ -1,199 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/lazy_task_runner.h"
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/sequence_checker_impl.h"
-#include "base/task_scheduler/scoped_set_task_priority_for_current_thread.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/threading/thread_checker_impl.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include "base/win/com_init_util.h"
-#endif
-
-namespace base {
-
-namespace {
-
-LazySequencedTaskRunner g_sequenced_task_runner_user_visible =
-    LAZY_SEQUENCED_TASK_RUNNER_INITIALIZER({TaskPriority::USER_VISIBLE});
-LazySequencedTaskRunner g_sequenced_task_runner_user_blocking =
-    LAZY_SEQUENCED_TASK_RUNNER_INITIALIZER({TaskPriority::USER_BLOCKING});
-
-LazySingleThreadTaskRunner g_single_thread_task_runner_user_visible =
-    LAZY_SINGLE_THREAD_TASK_RUNNER_INITIALIZER(
-        {TaskPriority::USER_VISIBLE},
-        SingleThreadTaskRunnerThreadMode::SHARED);
-LazySingleThreadTaskRunner g_single_thread_task_runner_user_blocking =
-    LAZY_SINGLE_THREAD_TASK_RUNNER_INITIALIZER(
-        {TaskPriority::USER_BLOCKING},
-        SingleThreadTaskRunnerThreadMode::SHARED);
-
-#if defined(OS_WIN)
-LazyCOMSTATaskRunner g_com_sta_task_runner_user_visible =
-    LAZY_COM_STA_TASK_RUNNER_INITIALIZER(
-        {TaskPriority::USER_VISIBLE},
-        SingleThreadTaskRunnerThreadMode::SHARED);
-LazyCOMSTATaskRunner g_com_sta_task_runner_user_blocking =
-    LAZY_COM_STA_TASK_RUNNER_INITIALIZER(
-        {TaskPriority::USER_BLOCKING},
-        SingleThreadTaskRunnerThreadMode::SHARED);
-#endif  // defined(OS_WIN)
-
-void InitCheckers(SequenceCheckerImpl* sequence_checker,
-                  ThreadCheckerImpl* thread_checker) {
-  sequence_checker->DetachFromSequence();
-  EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
-  thread_checker->DetachFromThread();
-  EXPECT_TRUE(thread_checker->CalledOnValidThread());
-}
-
-void ExpectSequencedEnvironment(SequenceCheckerImpl* sequence_checker,
-                                ThreadCheckerImpl* thread_checker,
-                                TaskPriority expected_priority) {
-  EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
-  EXPECT_FALSE(thread_checker->CalledOnValidThread());
-  EXPECT_EQ(expected_priority, internal::GetTaskPriorityForCurrentThread());
-}
-
-void ExpectSingleThreadEnvironment(SequenceCheckerImpl* sequence_checker,
-                                   ThreadCheckerImpl* thread_checker,
-                                   TaskPriority expected_priority
-#if defined(OS_WIN)
-                                   ,
-                                   bool expect_com_sta = false
-#endif
-                                   ) {
-  EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
-  EXPECT_TRUE(thread_checker->CalledOnValidThread());
-  EXPECT_EQ(expected_priority, internal::GetTaskPriorityForCurrentThread());
-
-#if defined(OS_WIN)
-  if (expect_com_sta)
-    win::AssertComApartmentType(win::ComApartmentType::STA);
-#endif
-}
-
-class TaskSchedulerLazyTaskRunnerEnvironmentTest : public testing::Test {
- protected:
-  TaskSchedulerLazyTaskRunnerEnvironmentTest() = default;
-
-  void TestTaskRunnerEnvironment(scoped_refptr<SequencedTaskRunner> task_runner,
-                                 bool expect_single_thread,
-                                 TaskPriority expected_priority
-#if defined(OS_WIN)
-                                 ,
-                                 bool expect_com_sta = false
-#endif
-                                 ) {
-    SequenceCheckerImpl sequence_checker;
-    ThreadCheckerImpl thread_checker;
-    task_runner->PostTask(FROM_HERE,
-                          BindOnce(&InitCheckers, Unretained(&sequence_checker),
-                                   Unretained(&thread_checker)));
-    scoped_task_environment_.RunUntilIdle();
-
-    OnceClosure task =
-        expect_single_thread
-            ? BindOnce(&ExpectSingleThreadEnvironment,
-                       Unretained(&sequence_checker),
-                       Unretained(&thread_checker), expected_priority
-#if defined(OS_WIN)
-                       ,
-                       expect_com_sta
-#endif
-                       )
-            : BindOnce(&ExpectSequencedEnvironment,
-                       Unretained(&sequence_checker),
-                       Unretained(&thread_checker), expected_priority);
-    task_runner->PostTask(FROM_HERE, std::move(task));
-    scoped_task_environment_.RunUntilIdle();
-  }
-
-  test::ScopedTaskEnvironment scoped_task_environment_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerLazyTaskRunnerEnvironmentTest);
-};
-
-}  // namespace
-
-TEST_F(TaskSchedulerLazyTaskRunnerEnvironmentTest,
-       LazySequencedTaskRunnerUserVisible) {
-  TestTaskRunnerEnvironment(g_sequenced_task_runner_user_visible.Get(), false,
-                            TaskPriority::USER_VISIBLE);
-}
-
-TEST_F(TaskSchedulerLazyTaskRunnerEnvironmentTest,
-       LazySequencedTaskRunnerUserBlocking) {
-  TestTaskRunnerEnvironment(g_sequenced_task_runner_user_blocking.Get(), false,
-                            TaskPriority::USER_BLOCKING);
-}
-
-TEST_F(TaskSchedulerLazyTaskRunnerEnvironmentTest,
-       LazySingleThreadTaskRunnerUserVisible) {
-  TestTaskRunnerEnvironment(g_single_thread_task_runner_user_visible.Get(),
-                            true, TaskPriority::USER_VISIBLE);
-}
-
-TEST_F(TaskSchedulerLazyTaskRunnerEnvironmentTest,
-       LazySingleThreadTaskRunnerUserBlocking) {
-  TestTaskRunnerEnvironment(g_single_thread_task_runner_user_blocking.Get(),
-                            true, TaskPriority::USER_BLOCKING);
-}
-
-#if defined(OS_WIN)
-TEST_F(TaskSchedulerLazyTaskRunnerEnvironmentTest,
-       LazyCOMSTATaskRunnerUserVisible) {
-  TestTaskRunnerEnvironment(g_com_sta_task_runner_user_visible.Get(), true,
-                            TaskPriority::USER_VISIBLE, true);
-}
-
-TEST_F(TaskSchedulerLazyTaskRunnerEnvironmentTest,
-       LazyCOMSTATaskRunnerUserBlocking) {
-  TestTaskRunnerEnvironment(g_com_sta_task_runner_user_blocking.Get(), true,
-                            TaskPriority::USER_BLOCKING, true);
-}
-#endif  // defined(OS_WIN)
-
-TEST(TaskSchdulerLazyTaskRunnerTest, LazySequencedTaskRunnerReset) {
-  for (int i = 0; i < 2; ++i) {
-    test::ScopedTaskEnvironment scoped_task_environment;
-    // If the TaskRunner isn't released when the test::ScopedTaskEnvironment
-    // goes out of scope, the second invocation of the line below will access a
-    // deleted TaskScheduler and crash.
-    g_sequenced_task_runner_user_visible.Get()->PostTask(FROM_HERE,
-                                                         DoNothing());
-  }
-}
-
-TEST(TaskSchdulerLazyTaskRunnerTest, LazySingleThreadTaskRunnerReset) {
-  for (int i = 0; i < 2; ++i) {
-    test::ScopedTaskEnvironment scoped_task_environment;
-    // If the TaskRunner isn't released when the test::ScopedTaskEnvironment
-    // goes out of scope, the second invocation of the line below will access a
-    // deleted TaskScheduler and crash.
-    g_single_thread_task_runner_user_visible.Get()->PostTask(FROM_HERE,
-                                                             DoNothing());
-  }
-}
-
-#if defined(OS_WIN)
-TEST(TaskSchdulerLazyTaskRunnerTest, LazyCOMSTATaskRunnerReset) {
-  for (int i = 0; i < 2; ++i) {
-    test::ScopedTaskEnvironment scoped_task_environment;
-    // If the TaskRunner isn't released when the test::ScopedTaskEnvironment
-    // goes out of scope, the second invocation of the line below will access a
-    // deleted TaskScheduler and crash.
-    g_com_sta_task_runner_user_visible.Get()->PostTask(FROM_HERE, DoNothing());
-  }
-}
-#endif  // defined(OS_WIN)
-
-}  // namespace base
diff --git a/base/task_scheduler/priority_queue_unittest.cc b/base/task_scheduler/priority_queue_unittest.cc
deleted file mode 100644
index 9dc4d13..0000000
--- a/base/task_scheduler/priority_queue_unittest.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/priority_queue.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/test/gtest_util.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-namespace {
-
-class ThreadBeginningTransaction : public SimpleThread {
- public:
-  explicit ThreadBeginningTransaction(PriorityQueue* priority_queue)
-      : SimpleThread("ThreadBeginningTransaction"),
-        priority_queue_(priority_queue),
-        transaction_began_(WaitableEvent::ResetPolicy::MANUAL,
-                           WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  // SimpleThread:
-  void Run() override {
-    std::unique_ptr<PriorityQueue::Transaction> transaction =
-        priority_queue_->BeginTransaction();
-    transaction_began_.Signal();
-  }
-
-  void ExpectTransactionDoesNotBegin() {
-    // After a few milliseconds, the call to BeginTransaction() should not have
-    // returned.
-    EXPECT_FALSE(
-        transaction_began_.TimedWait(TimeDelta::FromMilliseconds(250)));
-  }
-
- private:
-  PriorityQueue* const priority_queue_;
-  WaitableEvent transaction_began_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadBeginningTransaction);
-};
-
-}  // namespace
-
-TEST(TaskSchedulerPriorityQueueTest, PushPopPeek) {
-  // Create test sequences.
-  scoped_refptr<Sequence> sequence_a(new Sequence);
-  sequence_a->PushTask(Task(FROM_HERE, DoNothing(),
-                            TaskTraits(TaskPriority::USER_VISIBLE),
-                            TimeDelta()));
-  SequenceSortKey sort_key_a = sequence_a->GetSortKey();
-
-  scoped_refptr<Sequence> sequence_b(new Sequence);
-  sequence_b->PushTask(Task(FROM_HERE, DoNothing(),
-                            TaskTraits(TaskPriority::USER_BLOCKING),
-                            TimeDelta()));
-  SequenceSortKey sort_key_b = sequence_b->GetSortKey();
-
-  scoped_refptr<Sequence> sequence_c(new Sequence);
-  sequence_c->PushTask(Task(FROM_HERE, DoNothing(),
-                            TaskTraits(TaskPriority::USER_BLOCKING),
-                            TimeDelta()));
-  SequenceSortKey sort_key_c = sequence_c->GetSortKey();
-
-  scoped_refptr<Sequence> sequence_d(new Sequence);
-  sequence_d->PushTask(Task(FROM_HERE, DoNothing(),
-                            TaskTraits(TaskPriority::BACKGROUND), TimeDelta()));
-  SequenceSortKey sort_key_d = sequence_d->GetSortKey();
-
-  // Create a PriorityQueue and a Transaction.
-  PriorityQueue pq;
-  auto transaction(pq.BeginTransaction());
-  EXPECT_TRUE(transaction->IsEmpty());
-
-  // Push |sequence_a| in the PriorityQueue. It becomes the sequence with the
-  // highest priority.
-  transaction->Push(sequence_a, sort_key_a);
-  EXPECT_EQ(sort_key_a, transaction->PeekSortKey());
-
-  // Push |sequence_b| in the PriorityQueue. It becomes the sequence with the
-  // highest priority.
-  transaction->Push(sequence_b, sort_key_b);
-  EXPECT_EQ(sort_key_b, transaction->PeekSortKey());
-
-  // Push |sequence_c| in the PriorityQueue. |sequence_b| is still the sequence
-  // with the highest priority.
-  transaction->Push(sequence_c, sort_key_c);
-  EXPECT_EQ(sort_key_b, transaction->PeekSortKey());
-
-  // Push |sequence_d| in the PriorityQueue. |sequence_b| is still the sequence
-  // with the highest priority.
-  transaction->Push(sequence_d, sort_key_d);
-  EXPECT_EQ(sort_key_b, transaction->PeekSortKey());
-
-  // Pop |sequence_b| from the PriorityQueue. |sequence_c| becomes the sequence
-  // with the highest priority.
-  EXPECT_EQ(sequence_b, transaction->PopSequence());
-  EXPECT_EQ(sort_key_c, transaction->PeekSortKey());
-
-  // Pop |sequence_c| from the PriorityQueue. |sequence_a| becomes the sequence
-  // with the highest priority.
-  EXPECT_EQ(sequence_c, transaction->PopSequence());
-  EXPECT_EQ(sort_key_a, transaction->PeekSortKey());
-
-  // Pop |sequence_a| from the PriorityQueue. |sequence_d| becomes the sequence
-  // with the highest priority.
-  EXPECT_EQ(sequence_a, transaction->PopSequence());
-  EXPECT_EQ(sort_key_d, transaction->PeekSortKey());
-
-  // Pop |sequence_d| from the PriorityQueue. It is now empty.
-  EXPECT_EQ(sequence_d, transaction->PopSequence());
-  EXPECT_TRUE(transaction->IsEmpty());
-}
-
-// Check that creating Transactions on the same thread for 2 unrelated
-// PriorityQueues causes a crash.
-TEST(TaskSchedulerPriorityQueueTest, IllegalTwoTransactionsSameThread) {
-  PriorityQueue pq_a;
-  PriorityQueue pq_b;
-
-  EXPECT_DCHECK_DEATH(
-      {
-        std::unique_ptr<PriorityQueue::Transaction> transaction_a =
-            pq_a.BeginTransaction();
-        std::unique_ptr<PriorityQueue::Transaction> transaction_b =
-            pq_b.BeginTransaction();
-      });
-}
-
-// Check that it is possible to begin multiple Transactions for the same
-// PriorityQueue on different threads. The call to BeginTransaction() on the
-// second thread should block until the Transaction has ended on the first
-// thread.
-TEST(TaskSchedulerPriorityQueueTest, TwoTransactionsTwoThreads) {
-  PriorityQueue pq;
-
-  // Call BeginTransaction() on this thread and keep the Transaction alive.
-  std::unique_ptr<PriorityQueue::Transaction> transaction =
-      pq.BeginTransaction();
-
-  // Call BeginTransaction() on another thread.
-  ThreadBeginningTransaction thread_beginning_transaction(&pq);
-  thread_beginning_transaction.Start();
-
-  // After a few milliseconds, the call to BeginTransaction() on the other
-  // thread should not have returned.
-  thread_beginning_transaction.ExpectTransactionDoesNotBegin();
-
-  // End the Transaction on the current thread.
-  transaction.reset();
-
-  // The other thread should exit after its call to BeginTransaction() returns.
-  thread_beginning_transaction.Join();
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/scheduler_lock_unittest.cc b/base/task_scheduler/scheduler_lock_unittest.cc
deleted file mode 100644
index 5518247..0000000
--- a/base/task_scheduler/scheduler_lock_unittest.cc
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/scheduler_lock.h"
-
-#include <stdlib.h>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/rand_util.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/gtest_util.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-namespace {
-
-// Adapted from base::Lock's BasicLockTestThread to make sure
-// Acquire()/Release() don't crash.
-class BasicLockTestThread : public SimpleThread {
- public:
-  explicit BasicLockTestThread(SchedulerLock* lock)
-      : SimpleThread("BasicLockTestThread"),
-        lock_(lock),
-        acquired_(0) {}
-
-  int acquired() const { return acquired_; }
-
- private:
-  void Run() override {
-    for (int i = 0; i < 10; i++) {
-      lock_->Acquire();
-      acquired_++;
-      lock_->Release();
-    }
-    for (int i = 0; i < 10; i++) {
-      lock_->Acquire();
-      acquired_++;
-      PlatformThread::Sleep(TimeDelta::FromMilliseconds(base::RandInt(0, 19)));
-      lock_->Release();
-    }
-  }
-
-  SchedulerLock* const lock_;
-  int acquired_;
-
-  DISALLOW_COPY_AND_ASSIGN(BasicLockTestThread);
-};
-
-class BasicLockAcquireAndWaitThread : public SimpleThread {
- public:
-  explicit BasicLockAcquireAndWaitThread(SchedulerLock* lock)
-      : SimpleThread("BasicLockAcquireAndWaitThread"),
-        lock_(lock),
-        lock_acquire_event_(WaitableEvent::ResetPolicy::AUTOMATIC,
-                            WaitableEvent::InitialState::NOT_SIGNALED),
-        main_thread_continue_event_(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                    WaitableEvent::InitialState::NOT_SIGNALED) {
-  }
-
-  void WaitForLockAcquisition() {
-    lock_acquire_event_.Wait();
-  }
-
-  void ContinueMain() {
-    main_thread_continue_event_.Signal();
-  }
-
- private:
-  void Run() override {
-    lock_->Acquire();
-    lock_acquire_event_.Signal();
-    main_thread_continue_event_.Wait();
-    lock_->Release();
-  }
-
-  SchedulerLock* const lock_;
-  WaitableEvent lock_acquire_event_;
-  WaitableEvent main_thread_continue_event_;
-
-  DISALLOW_COPY_AND_ASSIGN(BasicLockAcquireAndWaitThread);
-};
-
-TEST(TaskSchedulerLock, Basic) {
-  SchedulerLock lock;
-  BasicLockTestThread thread(&lock);
-
-  thread.Start();
-
-  int acquired = 0;
-  for (int i = 0; i < 5; i++) {
-    lock.Acquire();
-    acquired++;
-    lock.Release();
-  }
-  for (int i = 0; i < 10; i++) {
-    lock.Acquire();
-    acquired++;
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(base::RandInt(0, 19)));
-    lock.Release();
-  }
-  for (int i = 0; i < 5; i++) {
-    lock.Acquire();
-    acquired++;
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(base::RandInt(0, 19)));
-    lock.Release();
-  }
-
-  thread.Join();
-
-  EXPECT_EQ(acquired, 20);
-  EXPECT_EQ(thread.acquired(), 20);
-}
-
-TEST(TaskSchedulerLock, AcquirePredecessor) {
-  SchedulerLock predecessor;
-  SchedulerLock lock(&predecessor);
-  predecessor.Acquire();
-  lock.Acquire();
-  lock.Release();
-  predecessor.Release();
-}
-
-TEST(TaskSchedulerLock, AcquirePredecessorWrongOrder) {
-  SchedulerLock predecessor;
-  SchedulerLock lock(&predecessor);
-  EXPECT_DCHECK_DEATH({
-    lock.Acquire();
-    predecessor.Acquire();
-  });
-}
-
-TEST(TaskSchedulerLock, AcquireNonPredecessor) {
-  SchedulerLock lock1;
-  SchedulerLock lock2;
-  EXPECT_DCHECK_DEATH({
-    lock1.Acquire();
-    lock2.Acquire();
-  });
-}
-
-TEST(TaskSchedulerLock, AcquireMultipleLocksInOrder) {
-  SchedulerLock lock1;
-  SchedulerLock lock2(&lock1);
-  SchedulerLock lock3(&lock2);
-  lock1.Acquire();
-  lock2.Acquire();
-  lock3.Acquire();
-  lock3.Release();
-  lock2.Release();
-  lock1.Release();
-}
-
-TEST(TaskSchedulerLock, AcquireMultipleLocksInTheMiddleOfAChain) {
-  SchedulerLock lock1;
-  SchedulerLock lock2(&lock1);
-  SchedulerLock lock3(&lock2);
-  lock2.Acquire();
-  lock3.Acquire();
-  lock3.Release();
-  lock2.Release();
-}
-
-TEST(TaskSchedulerLock, AcquireMultipleLocksNoTransitivity) {
-  SchedulerLock lock1;
-  SchedulerLock lock2(&lock1);
-  SchedulerLock lock3(&lock2);
-  EXPECT_DCHECK_DEATH({
-    lock1.Acquire();
-    lock3.Acquire();
-  });
-}
-
-TEST(TaskSchedulerLock, AcquireLocksDifferentThreadsSafely) {
-  SchedulerLock lock1;
-  SchedulerLock lock2;
-  BasicLockAcquireAndWaitThread thread(&lock1);
-  thread.Start();
-
-  lock2.Acquire();
-  thread.WaitForLockAcquisition();
-  thread.ContinueMain();
-  thread.Join();
-  lock2.Release();
-}
-
-TEST(TaskSchedulerLock,
-     AcquireLocksWithPredecessorDifferentThreadsSafelyPredecessorFirst) {
-  // A lock and its predecessor may be safely acquired on different threads.
-  // This Thread                Other Thread
-  // predecessor.Acquire()
-  //                            lock.Acquire()
-  // predecessor.Release()
-  //                            lock.Release()
-  SchedulerLock predecessor;
-  SchedulerLock lock(&predecessor);
-  predecessor.Acquire();
-  BasicLockAcquireAndWaitThread thread(&lock);
-  thread.Start();
-  thread.WaitForLockAcquisition();
-  predecessor.Release();
-  thread.ContinueMain();
-  thread.Join();
-}
-
-TEST(TaskSchedulerLock,
-     AcquireLocksWithPredecessorDifferentThreadsSafelyPredecessorLast) {
-  // A lock and its predecessor may be safely acquired on different threads.
-  // This Thread                Other Thread
-  // lock.Acquire()
-  //                            predecessor.Acquire()
-  // lock.Release()
-  //                            predecessor.Release()
-  SchedulerLock predecessor;
-  SchedulerLock lock(&predecessor);
-  lock.Acquire();
-  BasicLockAcquireAndWaitThread thread(&predecessor);
-  thread.Start();
-  thread.WaitForLockAcquisition();
-  lock.Release();
-  thread.ContinueMain();
-  thread.Join();
-}
-
-TEST(TaskSchedulerLock,
-     AcquireLocksWithPredecessorDifferentThreadsSafelyNoInterference) {
-  // Acquisition of an unrelated lock on another thread should not affect a
-  // legal lock acquisition with a predecessor on this thread.
-  // This Thread                Other Thread
-  // predecessor.Acquire()
-  //                            unrelated.Acquire()
-  // lock.Acquire()
-  //                            unrelated.Release()
-  // lock.Release()
-  // predecessor.Release();
-  SchedulerLock predecessor;
-  SchedulerLock lock(&predecessor);
-  predecessor.Acquire();
-  SchedulerLock unrelated;
-  BasicLockAcquireAndWaitThread thread(&unrelated);
-  thread.Start();
-  thread.WaitForLockAcquisition();
-  lock.Acquire();
-  thread.ContinueMain();
-  thread.Join();
-  lock.Release();
-  predecessor.Release();
-}
-
-TEST(TaskSchedulerLock, SelfReferentialLock) {
-  struct SelfReferentialLock {
-    SelfReferentialLock() : lock(&lock) {}
-
-    SchedulerLock lock;
-  };
-
-  EXPECT_DCHECK_DEATH({ SelfReferentialLock lock; });
-}
-
-TEST(TaskSchedulerLock, PredecessorCycle) {
-  struct LockCycle {
-    LockCycle() : lock1(&lock2), lock2(&lock1) {}
-
-    SchedulerLock lock1;
-    SchedulerLock lock2;
-  };
-
-  EXPECT_DCHECK_DEATH({ LockCycle cycle; });
-}
-
-TEST(TaskSchedulerLock, PredecessorLongerCycle) {
-  struct LockCycle {
-    LockCycle()
-        : lock1(&lock5),
-          lock2(&lock1),
-          lock3(&lock2),
-          lock4(&lock3),
-          lock5(&lock4) {}
-
-    SchedulerLock lock1;
-    SchedulerLock lock2;
-    SchedulerLock lock3;
-    SchedulerLock lock4;
-    SchedulerLock lock5;
-  };
-
-  EXPECT_DCHECK_DEATH({ LockCycle cycle; });
-}
-
-}  // namespace
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc b/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
deleted file mode 100644
index 52d99f6..0000000
--- a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
+++ /dev/null
@@ -1,676 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/scheduler_single_thread_task_runner_manager.h"
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/memory/ptr_util.h"
-#include "base/synchronization/atomic_flag.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/delayed_task_manager.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/test/gtest_util.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_restrictions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-
-#include "base/win/com_init_util.h"
-#include "base/win/current_module.h"
-#endif  // defined(OS_WIN)
-
-namespace base {
-namespace internal {
-
-namespace {
-
-class TaskSchedulerSingleThreadTaskRunnerManagerTest : public testing::Test {
- public:
-  TaskSchedulerSingleThreadTaskRunnerManagerTest()
-      : service_thread_("TaskSchedulerServiceThread") {}
-
-  void SetUp() override {
-    service_thread_.Start();
-    delayed_task_manager_.Start(service_thread_.task_runner());
-    single_thread_task_runner_manager_ =
-        std::make_unique<SchedulerSingleThreadTaskRunnerManager>(
-            task_tracker_.GetTrackedRef(), &delayed_task_manager_);
-    StartSingleThreadTaskRunnerManagerFromSetUp();
-  }
-
-  void TearDown() override {
-    if (single_thread_task_runner_manager_)
-      TearDownSingleThreadTaskRunnerManager();
-    service_thread_.Stop();
-  }
-
- protected:
-  virtual void StartSingleThreadTaskRunnerManagerFromSetUp() {
-    single_thread_task_runner_manager_->Start();
-  }
-
-  virtual void TearDownSingleThreadTaskRunnerManager() {
-    single_thread_task_runner_manager_->JoinForTesting();
-    single_thread_task_runner_manager_.reset();
-  }
-
-  Thread service_thread_;
-  TaskTracker task_tracker_ = {"Test"};
-  DelayedTaskManager delayed_task_manager_;
-  std::unique_ptr<SchedulerSingleThreadTaskRunnerManager>
-      single_thread_task_runner_manager_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerSingleThreadTaskRunnerManagerTest);
-};
-
-void CaptureThreadRef(PlatformThreadRef* thread_ref) {
-  ASSERT_TRUE(thread_ref);
-  *thread_ref = PlatformThread::CurrentRef();
-}
-
-void CaptureThreadPriority(ThreadPriority* thread_priority) {
-  ASSERT_TRUE(thread_priority);
-  *thread_priority = PlatformThread::GetCurrentThreadPriority();
-}
-
-void CaptureThreadName(std::string* thread_name) {
-  *thread_name = PlatformThread::GetName();
-}
-
-void ShouldNotRun() {
-  ADD_FAILURE() << "Ran a task that shouldn't run.";
-}
-
-}  // namespace
-
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, DifferentThreadsUsed) {
-  scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits(
-              {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-              SingleThreadTaskRunnerThreadMode::DEDICATED);
-  scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits(
-              {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-              SingleThreadTaskRunnerThreadMode::DEDICATED);
-
-  PlatformThreadRef thread_ref_1;
-  task_runner_1->PostTask(FROM_HERE,
-                          BindOnce(&CaptureThreadRef, &thread_ref_1));
-  PlatformThreadRef thread_ref_2;
-  task_runner_2->PostTask(FROM_HERE,
-                          BindOnce(&CaptureThreadRef, &thread_ref_2));
-
-  task_tracker_.Shutdown();
-
-  ASSERT_FALSE(thread_ref_1.is_null());
-  ASSERT_FALSE(thread_ref_2.is_null());
-  EXPECT_NE(thread_ref_1, thread_ref_2);
-}
-
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, SameThreadUsed) {
-  scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits(
-              {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-              SingleThreadTaskRunnerThreadMode::SHARED);
-  scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits(
-              {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-              SingleThreadTaskRunnerThreadMode::SHARED);
-
-  PlatformThreadRef thread_ref_1;
-  task_runner_1->PostTask(FROM_HERE,
-                          BindOnce(&CaptureThreadRef, &thread_ref_1));
-  PlatformThreadRef thread_ref_2;
-  task_runner_2->PostTask(FROM_HERE,
-                          BindOnce(&CaptureThreadRef, &thread_ref_2));
-
-  task_tracker_.Shutdown();
-
-  ASSERT_FALSE(thread_ref_1.is_null());
-  ASSERT_FALSE(thread_ref_2.is_null());
-  EXPECT_EQ(thread_ref_1, thread_ref_2);
-}
-
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest,
-       RunsTasksInCurrentSequence) {
-  scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits(
-              {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-              SingleThreadTaskRunnerThreadMode::DEDICATED);
-  scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits(
-              {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-              SingleThreadTaskRunnerThreadMode::DEDICATED);
-
-  EXPECT_FALSE(task_runner_1->RunsTasksInCurrentSequence());
-  EXPECT_FALSE(task_runner_2->RunsTasksInCurrentSequence());
-
-  task_runner_1->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](scoped_refptr<SingleThreadTaskRunner> task_runner_1,
-             scoped_refptr<SingleThreadTaskRunner> task_runner_2) {
-            EXPECT_TRUE(task_runner_1->RunsTasksInCurrentSequence());
-            EXPECT_FALSE(task_runner_2->RunsTasksInCurrentSequence());
-          },
-          task_runner_1, task_runner_2));
-
-  task_runner_2->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](scoped_refptr<SingleThreadTaskRunner> task_runner_1,
-             scoped_refptr<SingleThreadTaskRunner> task_runner_2) {
-            EXPECT_FALSE(task_runner_1->RunsTasksInCurrentSequence());
-            EXPECT_TRUE(task_runner_2->RunsTasksInCurrentSequence());
-          },
-          task_runner_1, task_runner_2));
-
-  task_tracker_.Shutdown();
-}
-
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest,
-       SharedWithBaseSyncPrimitivesDCHECKs) {
-  testing::GTEST_FLAG(death_test_style) = "threadsafe";
-  EXPECT_DCHECK_DEATH({
-    single_thread_task_runner_manager_->CreateSingleThreadTaskRunnerWithTraits(
-        {WithBaseSyncPrimitives()}, SingleThreadTaskRunnerThreadMode::SHARED);
-  });
-}
-
-// Regression test for https://crbug.com/829786
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest,
-       ContinueOnShutdownDoesNotBlockBlockShutdown) {
-  WaitableEvent task_has_started(WaitableEvent::ResetPolicy::MANUAL,
-                                 WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent task_can_continue(WaitableEvent::ResetPolicy::MANUAL,
-                                  WaitableEvent::InitialState::NOT_SIGNALED);
-
-  // Post a CONTINUE_ON_SHUTDOWN task that waits on
-  // |task_can_continue| to a shared SingleThreadTaskRunner.
-  single_thread_task_runner_manager_
-      ->CreateSingleThreadTaskRunnerWithTraits(
-          {TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
-          SingleThreadTaskRunnerThreadMode::SHARED)
-      ->PostTask(FROM_HERE, base::BindOnce(
-                                [](WaitableEvent* task_has_started,
-                                   WaitableEvent* task_can_continue) {
-                                  task_has_started->Signal();
-                                  ScopedAllowBaseSyncPrimitivesForTesting
-                                      allow_base_sync_primitives;
-                                  task_can_continue->Wait();
-                                },
-                                Unretained(&task_has_started),
-                                Unretained(&task_can_continue)));
-
-  task_has_started.Wait();
-
-  // Post a BLOCK_SHUTDOWN task to a shared SingleThreadTaskRunner.
-  single_thread_task_runner_manager_
-      ->CreateSingleThreadTaskRunnerWithTraits(
-          {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-          SingleThreadTaskRunnerThreadMode::SHARED)
-      ->PostTask(FROM_HERE, DoNothing());
-
-  // Shutdown should not hang even though the first task hasn't finished.
-  task_tracker_.Shutdown();
-
-  // Let the first task finish.
-  task_can_continue.Signal();
-
-  // Tear down from the test body to prevent accesses to |task_can_continue|
-  // after it goes out of scope.
-  TearDownSingleThreadTaskRunnerManager();
-}
-
-namespace {
-
-class TaskSchedulerSingleThreadTaskRunnerManagerCommonTest
-    : public TaskSchedulerSingleThreadTaskRunnerManagerTest,
-      public ::testing::WithParamInterface<SingleThreadTaskRunnerThreadMode> {
- public:
-  TaskSchedulerSingleThreadTaskRunnerManagerCommonTest() = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(
-      TaskSchedulerSingleThreadTaskRunnerManagerCommonTest);
-};
-
-}  // namespace
-
-TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest,
-       PrioritySetCorrectly) {
-  // Why are events used here instead of the task tracker?
-  // Shutting down can cause priorities to get raised. This means we have to use
-  // events to determine when a task is run.
-  scoped_refptr<SingleThreadTaskRunner> task_runner_background =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits({TaskPriority::BACKGROUND},
-                                                   GetParam());
-  scoped_refptr<SingleThreadTaskRunner> task_runner_normal =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits({TaskPriority::USER_VISIBLE},
-                                                   GetParam());
-
-  ThreadPriority thread_priority_background;
-  task_runner_background->PostTask(
-      FROM_HERE, BindOnce(&CaptureThreadPriority, &thread_priority_background));
-  WaitableEvent waitable_event_background(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  task_runner_background->PostTask(
-      FROM_HERE,
-      BindOnce(&WaitableEvent::Signal, Unretained(&waitable_event_background)));
-
-  ThreadPriority thread_priority_normal;
-  task_runner_normal->PostTask(
-      FROM_HERE, BindOnce(&CaptureThreadPriority, &thread_priority_normal));
-  WaitableEvent waitable_event_normal(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  task_runner_normal->PostTask(
-      FROM_HERE,
-      BindOnce(&WaitableEvent::Signal, Unretained(&waitable_event_normal)));
-
-  waitable_event_background.Wait();
-  waitable_event_normal.Wait();
-
-  if (Lock::HandlesMultipleThreadPriorities() &&
-      PlatformThread::CanIncreaseCurrentThreadPriority()) {
-    EXPECT_EQ(ThreadPriority::BACKGROUND, thread_priority_background);
-  } else {
-    EXPECT_EQ(ThreadPriority::NORMAL, thread_priority_background);
-  }
-  EXPECT_EQ(ThreadPriority::NORMAL, thread_priority_normal);
-}
-
-TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest, ThreadNamesSet) {
-  constexpr TaskTraits foo_traits = {TaskPriority::BACKGROUND,
-                                     TaskShutdownBehavior::BLOCK_SHUTDOWN};
-  scoped_refptr<SingleThreadTaskRunner> foo_task_runner =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits(foo_traits, GetParam());
-  std::string foo_captured_name;
-  foo_task_runner->PostTask(FROM_HERE,
-                            BindOnce(&CaptureThreadName, &foo_captured_name));
-
-  constexpr TaskTraits user_blocking_traits = {
-      TaskPriority::USER_BLOCKING, MayBlock(),
-      TaskShutdownBehavior::BLOCK_SHUTDOWN};
-  scoped_refptr<SingleThreadTaskRunner> user_blocking_task_runner =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits(user_blocking_traits,
-                                                   GetParam());
-
-  std::string user_blocking_captured_name;
-  user_blocking_task_runner->PostTask(
-      FROM_HERE, BindOnce(&CaptureThreadName, &user_blocking_captured_name));
-
-  task_tracker_.Shutdown();
-
-  EXPECT_NE(std::string::npos,
-            foo_captured_name.find(
-                kEnvironmentParams[GetEnvironmentIndexForTraits(foo_traits)]
-                    .name_suffix));
-  EXPECT_NE(
-      std::string::npos,
-      user_blocking_captured_name.find(
-          kEnvironmentParams[GetEnvironmentIndexForTraits(user_blocking_traits)]
-              .name_suffix));
-
-  if (GetParam() == SingleThreadTaskRunnerThreadMode::DEDICATED) {
-    EXPECT_EQ(std::string::npos, foo_captured_name.find("Shared"));
-    EXPECT_EQ(std::string::npos, user_blocking_captured_name.find("Shared"));
-  } else {
-    EXPECT_NE(std::string::npos, foo_captured_name.find("Shared"));
-    EXPECT_NE(std::string::npos, user_blocking_captured_name.find("Shared"));
-  }
-}
-
-TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest,
-       PostTaskAfterShutdown) {
-  auto task_runner =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits(TaskTraits(), GetParam());
-  task_tracker_.Shutdown();
-  EXPECT_FALSE(task_runner->PostTask(FROM_HERE, BindOnce(&ShouldNotRun)));
-}
-
-// Verify that a Task runs shortly after its delay expires.
-TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest, PostDelayedTask) {
-  TimeTicks start_time = TimeTicks::Now();
-
-  WaitableEvent task_ran(WaitableEvent::ResetPolicy::AUTOMATIC,
-                         WaitableEvent::InitialState::NOT_SIGNALED);
-  auto task_runner =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits(TaskTraits(), GetParam());
-
-  // Wait until the task runner is up and running to make sure the test below is
-  // solely timing the delayed task, not bringing up a physical thread.
-  task_runner->PostTask(
-      FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&task_ran)));
-  task_ran.Wait();
-  ASSERT_TRUE(!task_ran.IsSignaled());
-
-  // Post a task with a short delay.
-  EXPECT_TRUE(task_runner->PostDelayedTask(
-      FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&task_ran)),
-      TestTimeouts::tiny_timeout()));
-
-  // Wait until the task runs.
-  task_ran.Wait();
-
-  // Expect the task to run after its delay expires, but no more than 250 ms
-  // after that.
-  const TimeDelta actual_delay = TimeTicks::Now() - start_time;
-  EXPECT_GE(actual_delay, TestTimeouts::tiny_timeout());
-  EXPECT_LT(actual_delay,
-            TimeDelta::FromMilliseconds(250) + TestTimeouts::tiny_timeout());
-}
-
-// Verify that posting tasks after the single-thread manager is destroyed fails
-// but doesn't crash.
-TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest,
-       PostTaskAfterDestroy) {
-  auto task_runner =
-      single_thread_task_runner_manager_
-          ->CreateSingleThreadTaskRunnerWithTraits(TaskTraits(), GetParam());
-  EXPECT_TRUE(task_runner->PostTask(FROM_HERE, DoNothing()));
-  task_tracker_.Shutdown();
-  TearDownSingleThreadTaskRunnerManager();
-  EXPECT_FALSE(task_runner->PostTask(FROM_HERE, BindOnce(&ShouldNotRun)));
-}
-
-INSTANTIATE_TEST_CASE_P(
-    AllModes,
-    TaskSchedulerSingleThreadTaskRunnerManagerCommonTest,
-    ::testing::Values(SingleThreadTaskRunnerThreadMode::SHARED,
-                      SingleThreadTaskRunnerThreadMode::DEDICATED));
-
-namespace {
-
-class CallJoinFromDifferentThread : public SimpleThread {
- public:
-  CallJoinFromDifferentThread(
-      SchedulerSingleThreadTaskRunnerManager* manager_to_join)
-      : SimpleThread("SchedulerSingleThreadTaskRunnerManagerJoinThread"),
-        manager_to_join_(manager_to_join),
-        run_started_event_(WaitableEvent::ResetPolicy::MANUAL,
-                           WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  ~CallJoinFromDifferentThread() override = default;
-
-  void Run() override {
-    run_started_event_.Signal();
-    manager_to_join_->JoinForTesting();
-  }
-
-  void WaitForRunToStart() { run_started_event_.Wait(); }
-
- private:
-  SchedulerSingleThreadTaskRunnerManager* const manager_to_join_;
-  WaitableEvent run_started_event_;
-
-  DISALLOW_COPY_AND_ASSIGN(CallJoinFromDifferentThread);
-};
-
-class TaskSchedulerSingleThreadTaskRunnerManagerJoinTest
-    : public TaskSchedulerSingleThreadTaskRunnerManagerTest {
- public:
-  TaskSchedulerSingleThreadTaskRunnerManagerJoinTest() = default;
-  ~TaskSchedulerSingleThreadTaskRunnerManagerJoinTest() override = default;
-
- protected:
-  void TearDownSingleThreadTaskRunnerManager() override {
-    // The tests themselves are responsible for calling JoinForTesting().
-    single_thread_task_runner_manager_.reset();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest);
-};
-
-}  // namespace
-
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest, ConcurrentJoin) {
-  // Exercises the codepath where the workers are unavailable for unregistration
-  // because of a Join call.
-  WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent task_blocking(WaitableEvent::ResetPolicy::MANUAL,
-                              WaitableEvent::InitialState::NOT_SIGNALED);
-
-  {
-    auto task_runner = single_thread_task_runner_manager_
-                           ->CreateSingleThreadTaskRunnerWithTraits(
-                               {WithBaseSyncPrimitives()},
-                               SingleThreadTaskRunnerThreadMode::DEDICATED);
-    EXPECT_TRUE(task_runner->PostTask(
-        FROM_HERE,
-        BindOnce(&WaitableEvent::Signal, Unretained(&task_running))));
-    EXPECT_TRUE(task_runner->PostTask(
-        FROM_HERE, BindOnce(&WaitableEvent::Wait, Unretained(&task_blocking))));
-  }
-
-  task_running.Wait();
-  CallJoinFromDifferentThread join_from_different_thread(
-      single_thread_task_runner_manager_.get());
-  join_from_different_thread.Start();
-  join_from_different_thread.WaitForRunToStart();
-  task_blocking.Signal();
-  join_from_different_thread.Join();
-}
-
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerJoinTest,
-       ConcurrentJoinExtraSkippedTask) {
-  // Tests to make sure that tasks are properly cleaned up at Join, allowing
-  // SingleThreadTaskRunners to unregister themselves.
-  WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent task_blocking(WaitableEvent::ResetPolicy::MANUAL,
-                              WaitableEvent::InitialState::NOT_SIGNALED);
-
-  {
-    auto task_runner = single_thread_task_runner_manager_
-                           ->CreateSingleThreadTaskRunnerWithTraits(
-                               {WithBaseSyncPrimitives()},
-                               SingleThreadTaskRunnerThreadMode::DEDICATED);
-    EXPECT_TRUE(task_runner->PostTask(
-        FROM_HERE,
-        BindOnce(&WaitableEvent::Signal, Unretained(&task_running))));
-    EXPECT_TRUE(task_runner->PostTask(
-        FROM_HERE, BindOnce(&WaitableEvent::Wait, Unretained(&task_blocking))));
-    EXPECT_TRUE(task_runner->PostTask(FROM_HERE, DoNothing()));
-  }
-
-  task_running.Wait();
-  CallJoinFromDifferentThread join_from_different_thread(
-      single_thread_task_runner_manager_.get());
-  join_from_different_thread.Start();
-  join_from_different_thread.WaitForRunToStart();
-  task_blocking.Signal();
-  join_from_different_thread.Join();
-}
-
-#if defined(OS_WIN)
-
-TEST_P(TaskSchedulerSingleThreadTaskRunnerManagerCommonTest,
-       COMSTAInitialized) {
-  scoped_refptr<SingleThreadTaskRunner> com_task_runner =
-      single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits(
-          {TaskShutdownBehavior::BLOCK_SHUTDOWN}, GetParam());
-
-  com_task_runner->PostTask(FROM_HERE, BindOnce(&win::AssertComApartmentType,
-                                                win::ComApartmentType::STA));
-
-  task_tracker_.Shutdown();
-}
-
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTest, COMSTASameThreadUsed) {
-  scoped_refptr<SingleThreadTaskRunner> task_runner_1 =
-      single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits(
-          {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-          SingleThreadTaskRunnerThreadMode::SHARED);
-  scoped_refptr<SingleThreadTaskRunner> task_runner_2 =
-      single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits(
-          {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-          SingleThreadTaskRunnerThreadMode::SHARED);
-
-  PlatformThreadRef thread_ref_1;
-  task_runner_1->PostTask(FROM_HERE,
-                          BindOnce(&CaptureThreadRef, &thread_ref_1));
-  PlatformThreadRef thread_ref_2;
-  task_runner_2->PostTask(FROM_HERE,
-                          BindOnce(&CaptureThreadRef, &thread_ref_2));
-
-  task_tracker_.Shutdown();
-
-  ASSERT_FALSE(thread_ref_1.is_null());
-  ASSERT_FALSE(thread_ref_2.is_null());
-  EXPECT_EQ(thread_ref_1, thread_ref_2);
-}
-
-namespace {
-
-const wchar_t* const kTestWindowClassName =
-    L"TaskSchedulerSingleThreadTaskRunnerManagerTestWinMessageWindow";
-
-class TaskSchedulerSingleThreadTaskRunnerManagerTestWin
-    : public TaskSchedulerSingleThreadTaskRunnerManagerTest {
- public:
-  TaskSchedulerSingleThreadTaskRunnerManagerTestWin() = default;
-
-  void SetUp() override {
-    TaskSchedulerSingleThreadTaskRunnerManagerTest::SetUp();
-    register_class_succeeded_ = RegisterTestWindowClass();
-    ASSERT_TRUE(register_class_succeeded_);
-  }
-
-  void TearDown() override {
-    if (register_class_succeeded_)
-      ::UnregisterClass(kTestWindowClassName, CURRENT_MODULE());
-
-    TaskSchedulerSingleThreadTaskRunnerManagerTest::TearDown();
-  }
-
-  HWND CreateTestWindow() {
-    return CreateWindow(kTestWindowClassName, kTestWindowClassName, 0, 0, 0, 0,
-                        0, HWND_MESSAGE, nullptr, CURRENT_MODULE(), nullptr);
-  }
-
- private:
-  bool RegisterTestWindowClass() {
-    WNDCLASSEX window_class = {};
-    window_class.cbSize = sizeof(window_class);
-    window_class.lpfnWndProc = &::DefWindowProc;
-    window_class.hInstance = CURRENT_MODULE();
-    window_class.lpszClassName = kTestWindowClassName;
-    return !!::RegisterClassEx(&window_class);
-  }
-
-  bool register_class_succeeded_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerSingleThreadTaskRunnerManagerTestWin);
-};
-
-}  // namespace
-
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerTestWin, PumpsMessages) {
-  scoped_refptr<SingleThreadTaskRunner> com_task_runner =
-      single_thread_task_runner_manager_->CreateCOMSTATaskRunnerWithTraits(
-          {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-          SingleThreadTaskRunnerThreadMode::DEDICATED);
-  HWND hwnd = nullptr;
-  // HWNDs process messages on the thread that created them, so we have to
-  // create them within the context of the task runner to properly simulate a
-  // COM callback.
-  com_task_runner->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](TaskSchedulerSingleThreadTaskRunnerManagerTestWin* test_harness,
-             HWND* hwnd) { *hwnd = test_harness->CreateTestWindow(); },
-          Unretained(this), &hwnd));
-
-  task_tracker_.FlushForTesting();
-
-  ASSERT_NE(hwnd, nullptr);
-  // If the message pump isn't running, we will hang here. This simulates how
-  // COM would receive a callback with its own message HWND.
-  SendMessage(hwnd, WM_USER, 0, 0);
-
-  com_task_runner->PostTask(
-      FROM_HERE, BindOnce([](HWND hwnd) { ::DestroyWindow(hwnd); }, hwnd));
-
-  task_tracker_.Shutdown();
-}
-
-#endif  // defined(OS_WIN)
-
-namespace {
-
-class TaskSchedulerSingleThreadTaskRunnerManagerStartTest
-    : public TaskSchedulerSingleThreadTaskRunnerManagerTest {
- public:
-  TaskSchedulerSingleThreadTaskRunnerManagerStartTest() = default;
-
- private:
-  void StartSingleThreadTaskRunnerManagerFromSetUp() override {
-    // Start() is called in the test body rather than in SetUp().
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerSingleThreadTaskRunnerManagerStartTest);
-};
-
-}  // namespace
-
-// Verify that a task posted before Start() doesn't run until Start() is called.
-TEST_F(TaskSchedulerSingleThreadTaskRunnerManagerStartTest,
-       PostTaskBeforeStart) {
-  AtomicFlag manager_started;
-  WaitableEvent task_finished(WaitableEvent::ResetPolicy::MANUAL,
-                              WaitableEvent::InitialState::NOT_SIGNALED);
-  single_thread_task_runner_manager_
-      ->CreateSingleThreadTaskRunnerWithTraits(
-          TaskTraits(), SingleThreadTaskRunnerThreadMode::DEDICATED)
-      ->PostTask(
-          FROM_HERE,
-          BindOnce(
-              [](WaitableEvent* task_finished, AtomicFlag* manager_started) {
-                // The task should not run before Start().
-                EXPECT_TRUE(manager_started->IsSet());
-                task_finished->Signal();
-              },
-              Unretained(&task_finished), Unretained(&manager_started)));
-
-  // Wait a little bit to make sure that the task doesn't run before start.
-  // Note: This test won't catch a case where the task runs between setting
-  // |manager_started| and calling Start(). However, we expect the test to be
-  // flaky if the tested code allows that to happen.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  manager_started.Set();
-  single_thread_task_runner_manager_->Start();
-
-  // Wait for the task to complete to keep |manager_started| alive.
-  task_finished.Wait();
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc b/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc
deleted file mode 100644
index 21e77f4..0000000
--- a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc
+++ /dev/null
@@ -1,1566 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/scheduler_worker_pool_impl.h"
-
-#include <stddef.h>
-
-#include <memory>
-#include <unordered_set>
-#include <vector>
-
-#include "base/atomicops.h"
-#include "base/barrier_closure.h"
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/metrics/histogram.h"
-#include "base/metrics/histogram_samples.h"
-#include "base/metrics/statistics_recorder.h"
-#include "base/synchronization/condition_variable.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_runner.h"
-#include "base/task_scheduler/delayed_task_manager.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/sequence_sort_key.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/test_task_factory.h"
-#include "base/task_scheduler/test_utils.h"
-#include "base/test/gtest_util.h"
-#include "base/test/test_simple_task_runner.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/scoped_blocking_call.h"
-#include "base/threading/simple_thread.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_checker_impl.h"
-#include "base/threading/thread_local_storage.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include "base/win/com_init_util.h"
-#endif  // defined(OS_WIN)
-
-namespace base {
-namespace internal {
-namespace {
-
-constexpr size_t kNumWorkersInWorkerPool = 4;
-constexpr size_t kNumThreadsPostingTasks = 4;
-constexpr size_t kNumTasksPostedPerThread = 150;
-// This can't be lower because Windows' WaitableEvent wakes up too early when a
-// small timeout is used. This results in many spurious wake ups before a worker
-// is allowed to cleanup.
-constexpr TimeDelta kReclaimTimeForCleanupTests =
-    TimeDelta::FromMilliseconds(500);
-
-// Waits on |event| in a scope where the blocking observer is null, to avoid
-// affecting the worker capacity.
-void WaitWithoutBlockingObserver(WaitableEvent* event) {
-  internal::ScopedClearBlockingObserverForTesting clear_blocking_observer;
-  event->Wait();
-}
-
-class TaskSchedulerWorkerPoolImplTestBase {
- protected:
-  TaskSchedulerWorkerPoolImplTestBase()
-      : service_thread_("TaskSchedulerServiceThread"){};
-
-  void CommonSetUp() {
-    CreateAndStartWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool);
-  }
-
-  void CommonTearDown() {
-    service_thread_.Stop();
-    task_tracker_.FlushForTesting();
-    worker_pool_->WaitForAllWorkersIdleForTesting();
-    worker_pool_->JoinForTesting();
-  }
-
-  void CreateWorkerPool() {
-    ASSERT_FALSE(worker_pool_);
-    service_thread_.Start();
-    delayed_task_manager_.Start(service_thread_.task_runner());
-    worker_pool_ = std::make_unique<SchedulerWorkerPoolImpl>(
-        "TestWorkerPool", "A", ThreadPriority::NORMAL,
-        task_tracker_.GetTrackedRef(), &delayed_task_manager_);
-    ASSERT_TRUE(worker_pool_);
-  }
-
-  virtual void StartWorkerPool(TimeDelta suggested_reclaim_time,
-                               size_t num_workers) {
-    ASSERT_TRUE(worker_pool_);
-    worker_pool_->Start(
-        SchedulerWorkerPoolParams(num_workers, suggested_reclaim_time),
-        service_thread_.task_runner(), nullptr,
-        SchedulerWorkerPoolImpl::WorkerEnvironment::NONE);
-  }
-
-  void CreateAndStartWorkerPool(TimeDelta suggested_reclaim_time,
-                                size_t num_workers) {
-    CreateWorkerPool();
-    StartWorkerPool(suggested_reclaim_time, num_workers);
-  }
-
-  Thread service_thread_;
-  TaskTracker task_tracker_ = {"Test"};
-
-  std::unique_ptr<SchedulerWorkerPoolImpl> worker_pool_;
-
- private:
-  DelayedTaskManager delayed_task_manager_;
-
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTestBase);
-};
-
-class TaskSchedulerWorkerPoolImplTest
-    : public TaskSchedulerWorkerPoolImplTestBase,
-      public testing::Test {
- protected:
-  TaskSchedulerWorkerPoolImplTest() = default;
-
-  void SetUp() override { TaskSchedulerWorkerPoolImplTestBase::CommonSetUp(); }
-
-  void TearDown() override {
-    TaskSchedulerWorkerPoolImplTestBase::CommonTearDown();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTest);
-};
-
-class TaskSchedulerWorkerPoolImplTestParam
-    : public TaskSchedulerWorkerPoolImplTestBase,
-      public testing::TestWithParam<test::ExecutionMode> {
- protected:
-  TaskSchedulerWorkerPoolImplTestParam() = default;
-
-  void SetUp() override { TaskSchedulerWorkerPoolImplTestBase::CommonSetUp(); }
-
-  void TearDown() override {
-    TaskSchedulerWorkerPoolImplTestBase::CommonTearDown();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTestParam);
-};
-
-using PostNestedTask = test::TestTaskFactory::PostNestedTask;
-
-class ThreadPostingTasksWaitIdle : public SimpleThread {
- public:
-  // Constructs a thread that posts tasks to |worker_pool| through an
-  // |execution_mode| task runner. The thread waits until all workers in
-  // |worker_pool| are idle before posting a new task.
-  ThreadPostingTasksWaitIdle(SchedulerWorkerPoolImpl* worker_pool,
-                             test::ExecutionMode execution_mode)
-      : SimpleThread("ThreadPostingTasksWaitIdle"),
-        worker_pool_(worker_pool),
-        factory_(CreateTaskRunnerWithExecutionMode(worker_pool, execution_mode),
-                 execution_mode) {
-    DCHECK(worker_pool_);
-  }
-
-  const test::TestTaskFactory* factory() const { return &factory_; }
-
- private:
-  void Run() override {
-    EXPECT_FALSE(factory_.task_runner()->RunsTasksInCurrentSequence());
-
-    for (size_t i = 0; i < kNumTasksPostedPerThread; ++i) {
-      worker_pool_->WaitForAllWorkersIdleForTesting();
-      EXPECT_TRUE(factory_.PostTask(PostNestedTask::NO, Closure()));
-    }
-  }
-
-  SchedulerWorkerPoolImpl* const worker_pool_;
-  const scoped_refptr<TaskRunner> task_runner_;
-  test::TestTaskFactory factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadPostingTasksWaitIdle);
-};
-
-}  // namespace
-
-TEST_P(TaskSchedulerWorkerPoolImplTestParam, PostTasksWaitAllWorkersIdle) {
-  // Create threads to post tasks. To verify that workers can sleep and be woken
-  // up when new tasks are posted, wait for all workers to become idle before
-  // posting a new task.
-  std::vector<std::unique_ptr<ThreadPostingTasksWaitIdle>>
-      threads_posting_tasks;
-  for (size_t i = 0; i < kNumThreadsPostingTasks; ++i) {
-    threads_posting_tasks.push_back(
-        std::make_unique<ThreadPostingTasksWaitIdle>(worker_pool_.get(),
-                                                     GetParam()));
-    threads_posting_tasks.back()->Start();
-  }
-
-  // Wait for all tasks to run.
-  for (const auto& thread_posting_tasks : threads_posting_tasks) {
-    thread_posting_tasks->Join();
-    thread_posting_tasks->factory()->WaitForAllTasksToRun();
-  }
-
-  // Wait until all workers are idle to be sure that no task accesses its
-  // TestTaskFactory after |thread_posting_tasks| is destroyed.
-  worker_pool_->WaitForAllWorkersIdleForTesting();
-}
-
-TEST_P(TaskSchedulerWorkerPoolImplTestParam, PostTasksWithOneAvailableWorker) {
-  // Post blocking tasks to keep all workers busy except one until |event| is
-  // signaled. Use different factories so that tasks are added to different
-  // sequences and can run simultaneously when the execution mode is SEQUENCED.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  std::vector<std::unique_ptr<test::TestTaskFactory>> blocked_task_factories;
-  for (size_t i = 0; i < (kNumWorkersInWorkerPool - 1); ++i) {
-    blocked_task_factories.push_back(std::make_unique<test::TestTaskFactory>(
-        CreateTaskRunnerWithExecutionMode(worker_pool_.get(), GetParam()),
-        GetParam()));
-    EXPECT_TRUE(blocked_task_factories.back()->PostTask(
-        PostNestedTask::NO,
-        BindOnce(&WaitWithoutBlockingObserver, Unretained(&event))));
-    blocked_task_factories.back()->WaitForAllTasksToRun();
-  }
-
-  // Post |kNumTasksPostedPerThread| tasks that should all run despite the fact
-  // that only one worker in |worker_pool_| isn't busy.
-  test::TestTaskFactory short_task_factory(
-      CreateTaskRunnerWithExecutionMode(worker_pool_.get(), GetParam()),
-      GetParam());
-  for (size_t i = 0; i < kNumTasksPostedPerThread; ++i)
-    EXPECT_TRUE(short_task_factory.PostTask(PostNestedTask::NO, Closure()));
-  short_task_factory.WaitForAllTasksToRun();
-
-  // Release tasks waiting on |event|.
-  event.Signal();
-
-  // Wait until all workers are idle to be sure that no task accesses
-  // its TestTaskFactory after it is destroyed.
-  worker_pool_->WaitForAllWorkersIdleForTesting();
-}
-
-TEST_P(TaskSchedulerWorkerPoolImplTestParam, Saturate) {
-  // Verify that it is possible to have |kNumWorkersInWorkerPool|
-  // tasks/sequences running simultaneously. Use different factories so that the
-  // blocking tasks are added to different sequences and can run simultaneously
-  // when the execution mode is SEQUENCED.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  std::vector<std::unique_ptr<test::TestTaskFactory>> factories;
-  for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) {
-    factories.push_back(std::make_unique<test::TestTaskFactory>(
-        CreateTaskRunnerWithExecutionMode(worker_pool_.get(), GetParam()),
-        GetParam()));
-    EXPECT_TRUE(factories.back()->PostTask(
-        PostNestedTask::NO,
-        BindOnce(&WaitWithoutBlockingObserver, Unretained(&event))));
-    factories.back()->WaitForAllTasksToRun();
-  }
-
-  // Release tasks waiting on |event|.
-  event.Signal();
-
-  // Wait until all workers are idle to be sure that no task accesses
-  // its TestTaskFactory after it is destroyed.
-  worker_pool_->WaitForAllWorkersIdleForTesting();
-}
-
-#if defined(OS_WIN)
-TEST_P(TaskSchedulerWorkerPoolImplTestParam, NoEnvironment) {
-  // Verify that COM is not initialized in a SchedulerWorkerPoolImpl initialized
-  // with SchedulerWorkerPoolImpl::WorkerEnvironment::NONE.
-  scoped_refptr<TaskRunner> task_runner =
-      CreateTaskRunnerWithExecutionMode(worker_pool_.get(), GetParam());
-
-  WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  task_runner->PostTask(
-      FROM_HERE, BindOnce(
-                     [](WaitableEvent* task_running) {
-                       win::AssertComApartmentType(win::ComApartmentType::NONE);
-                       task_running->Signal();
-                     },
-                     &task_running));
-
-  task_running.Wait();
-
-  worker_pool_->WaitForAllWorkersIdleForTesting();
-}
-#endif  // defined(OS_WIN)
-
-INSTANTIATE_TEST_CASE_P(Parallel,
-                        TaskSchedulerWorkerPoolImplTestParam,
-                        ::testing::Values(test::ExecutionMode::PARALLEL));
-INSTANTIATE_TEST_CASE_P(Sequenced,
-                        TaskSchedulerWorkerPoolImplTestParam,
-                        ::testing::Values(test::ExecutionMode::SEQUENCED));
-
-#if defined(OS_WIN)
-
-namespace {
-
-class TaskSchedulerWorkerPoolImplTestCOMMTAParam
-    : public TaskSchedulerWorkerPoolImplTestBase,
-      public testing::TestWithParam<test::ExecutionMode> {
- protected:
-  TaskSchedulerWorkerPoolImplTestCOMMTAParam() = default;
-
-  void SetUp() override { TaskSchedulerWorkerPoolImplTestBase::CommonSetUp(); }
-
-  void TearDown() override {
-    TaskSchedulerWorkerPoolImplTestBase::CommonTearDown();
-  }
-
- private:
-  void StartWorkerPool(TimeDelta suggested_reclaim_time,
-                       size_t num_workers) override {
-    ASSERT_TRUE(worker_pool_);
-    worker_pool_->Start(
-        SchedulerWorkerPoolParams(num_workers, suggested_reclaim_time),
-        service_thread_.task_runner(), nullptr,
-        SchedulerWorkerPoolImpl::WorkerEnvironment::COM_MTA);
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolImplTestCOMMTAParam);
-};
-
-}  // namespace
-
-TEST_P(TaskSchedulerWorkerPoolImplTestCOMMTAParam, COMMTAInitialized) {
-  // Verify that SchedulerWorkerPoolImpl workers have a COM MTA available.
-  scoped_refptr<TaskRunner> task_runner =
-      CreateTaskRunnerWithExecutionMode(worker_pool_.get(), GetParam());
-
-  WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  task_runner->PostTask(
-      FROM_HERE, BindOnce(
-                     [](WaitableEvent* task_running) {
-                       win::AssertComApartmentType(win::ComApartmentType::MTA);
-                       task_running->Signal();
-                     },
-                     &task_running));
-
-  task_running.Wait();
-
-  worker_pool_->WaitForAllWorkersIdleForTesting();
-}
-
-INSTANTIATE_TEST_CASE_P(Parallel,
-                        TaskSchedulerWorkerPoolImplTestCOMMTAParam,
-                        ::testing::Values(test::ExecutionMode::PARALLEL));
-INSTANTIATE_TEST_CASE_P(Sequenced,
-                        TaskSchedulerWorkerPoolImplTestCOMMTAParam,
-                        ::testing::Values(test::ExecutionMode::SEQUENCED));
-
-#endif  // defined(OS_WIN)
-
-namespace {
-
-class TaskSchedulerWorkerPoolImplPostTaskBeforeStartTest
-    : public TaskSchedulerWorkerPoolImplTest {
- public:
-  void SetUp() override {
-    CreateWorkerPool();
-    // Let the test start the worker pool.
-  }
-};
-
-void TaskPostedBeforeStart(PlatformThreadRef* platform_thread_ref,
-                           WaitableEvent* task_running,
-                           WaitableEvent* barrier) {
-  *platform_thread_ref = PlatformThread::CurrentRef();
-  task_running->Signal();
-  WaitWithoutBlockingObserver(barrier);
-}
-
-}  // namespace
-
-// Verify that 2 tasks posted before Start() to a SchedulerWorkerPoolImpl with
-// more than 2 workers run on different workers when Start() is called.
-TEST_F(TaskSchedulerWorkerPoolImplPostTaskBeforeStartTest,
-       PostTasksBeforeStart) {
-  PlatformThreadRef task_1_thread_ref;
-  PlatformThreadRef task_2_thread_ref;
-  WaitableEvent task_1_running(WaitableEvent::ResetPolicy::MANUAL,
-                               WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent task_2_running(WaitableEvent::ResetPolicy::MANUAL,
-                               WaitableEvent::InitialState::NOT_SIGNALED);
-
-  // This event is used to prevent a task from completing before the other task
-  // starts running. If that happened, both tasks could run on the same worker
-  // and this test couldn't verify that the correct number of workers were woken
-  // up.
-  WaitableEvent barrier(WaitableEvent::ResetPolicy::MANUAL,
-                        WaitableEvent::InitialState::NOT_SIGNALED);
-
-  worker_pool_->CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()})
-      ->PostTask(
-          FROM_HERE,
-          BindOnce(&TaskPostedBeforeStart, Unretained(&task_1_thread_ref),
-                   Unretained(&task_1_running), Unretained(&barrier)));
-  worker_pool_->CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()})
-      ->PostTask(
-          FROM_HERE,
-          BindOnce(&TaskPostedBeforeStart, Unretained(&task_2_thread_ref),
-                   Unretained(&task_2_running), Unretained(&barrier)));
-
-  // Workers should not be created and tasks should not run before the pool is
-  // started.
-  EXPECT_EQ(0U, worker_pool_->NumberOfWorkersForTesting());
-  EXPECT_FALSE(task_1_running.IsSignaled());
-  EXPECT_FALSE(task_2_running.IsSignaled());
-
-  StartWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool);
-
-  // Tasks should run shortly after the pool is started.
-  task_1_running.Wait();
-  task_2_running.Wait();
-
-  // Tasks should run on different threads.
-  EXPECT_NE(task_1_thread_ref, task_2_thread_ref);
-
-  barrier.Signal();
-  task_tracker_.FlushForTesting();
-}
-
-// Verify that posting many tasks before Start will cause the number of workers
-// to grow to |worker_capacity_| during Start.
-TEST_F(TaskSchedulerWorkerPoolImplPostTaskBeforeStartTest, PostManyTasks) {
-  scoped_refptr<TaskRunner> task_runner =
-      worker_pool_->CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()});
-  constexpr size_t kNumTasksPosted = 2 * kNumWorkersInWorkerPool;
-  for (size_t i = 0; i < kNumTasksPosted; ++i)
-    task_runner->PostTask(FROM_HERE, DoNothing());
-
-  EXPECT_EQ(0U, worker_pool_->NumberOfWorkersForTesting());
-
-  StartWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool);
-  ASSERT_GT(kNumTasksPosted, worker_pool_->GetWorkerCapacityForTesting());
-  EXPECT_EQ(kNumWorkersInWorkerPool,
-            worker_pool_->GetWorkerCapacityForTesting());
-
-  EXPECT_EQ(worker_pool_->NumberOfWorkersForTesting(),
-            worker_pool_->GetWorkerCapacityForTesting());
-}
-
-namespace {
-
-constexpr size_t kMagicTlsValue = 42;
-
-class TaskSchedulerWorkerPoolCheckTlsReuse
-    : public TaskSchedulerWorkerPoolImplTest {
- public:
-  void SetTlsValueAndWait() {
-    slot_.Set(reinterpret_cast<void*>(kMagicTlsValue));
-    WaitWithoutBlockingObserver(&waiter_);
-  }
-
-  void CountZeroTlsValuesAndWait(WaitableEvent* count_waiter) {
-    if (!slot_.Get())
-      subtle::NoBarrier_AtomicIncrement(&zero_tls_values_, 1);
-
-    count_waiter->Signal();
-    WaitWithoutBlockingObserver(&waiter_);
-  }
-
- protected:
-  TaskSchedulerWorkerPoolCheckTlsReuse() :
-      waiter_(WaitableEvent::ResetPolicy::MANUAL,
-              WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  void SetUp() override {
-    CreateAndStartWorkerPool(kReclaimTimeForCleanupTests,
-                             kNumWorkersInWorkerPool);
-  }
-
-  subtle::Atomic32 zero_tls_values_ = 0;
-
-  WaitableEvent waiter_;
-
- private:
-  ThreadLocalStorage::Slot slot_;
-
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolCheckTlsReuse);
-};
-
-}  // namespace
-
-// Checks that at least one worker has been cleaned up by checking the TLS.
-TEST_F(TaskSchedulerWorkerPoolCheckTlsReuse, CheckCleanupWorkers) {
-  // Saturate the workers and mark each worker's thread with a magic TLS value.
-  std::vector<std::unique_ptr<test::TestTaskFactory>> factories;
-  for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) {
-    factories.push_back(std::make_unique<test::TestTaskFactory>(
-        worker_pool_->CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()}),
-        test::ExecutionMode::PARALLEL));
-    ASSERT_TRUE(factories.back()->PostTask(
-        PostNestedTask::NO,
-        Bind(&TaskSchedulerWorkerPoolCheckTlsReuse::SetTlsValueAndWait,
-             Unretained(this))));
-    factories.back()->WaitForAllTasksToRun();
-  }
-
-  // Release tasks waiting on |waiter_|.
-  waiter_.Signal();
-  worker_pool_->WaitForAllWorkersIdleForTesting();
-
-  // All workers should be done running by now, so reset for the next phase.
-  waiter_.Reset();
-
-  // Wait for the worker pool to clean up at least one worker.
-  worker_pool_->WaitForWorkersCleanedUpForTesting(1U);
-
-  // Saturate and count the worker threads that do not have the magic TLS value.
-  // If the value is not there, that means we're at a new worker.
-  std::vector<std::unique_ptr<WaitableEvent>> count_waiters;
-  for (auto& factory : factories) {
-    count_waiters.push_back(WrapUnique(new WaitableEvent(
-        WaitableEvent::ResetPolicy::MANUAL,
-        WaitableEvent::InitialState::NOT_SIGNALED)));
-    ASSERT_TRUE(factory->PostTask(
-          PostNestedTask::NO,
-          Bind(&TaskSchedulerWorkerPoolCheckTlsReuse::CountZeroTlsValuesAndWait,
-               Unretained(this),
-               count_waiters.back().get())));
-    factory->WaitForAllTasksToRun();
-  }
-
-  // Wait for all counters to complete.
-  for (auto& count_waiter : count_waiters)
-    count_waiter->Wait();
-
-  EXPECT_GT(subtle::NoBarrier_Load(&zero_tls_values_), 0);
-
-  // Release tasks waiting on |waiter_|.
-  waiter_.Signal();
-}
-
-namespace {
-
-class TaskSchedulerWorkerPoolHistogramTest
-    : public TaskSchedulerWorkerPoolImplTest {
- public:
-  TaskSchedulerWorkerPoolHistogramTest() = default;
-
- protected:
-  // Override SetUp() to allow every test case to initialize a worker pool with
-  // its own arguments.
-  void SetUp() override {}
-
-  // Floods |worker_pool_| with a single task each that blocks until
-  // |continue_event| is signaled. Every worker in the pool is blocked on
-  // |continue_event| when this method returns. Note: this helper can easily be
-  // generalized to be useful in other tests, but it's here for now because it's
-  // only used in a TaskSchedulerWorkerPoolHistogramTest at the moment.
-  void FloodPool(WaitableEvent* continue_event) {
-    ASSERT_FALSE(continue_event->IsSignaled());
-
-    auto task_runner =
-        worker_pool_->CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()});
-
-    const auto pool_capacity = worker_pool_->GetWorkerCapacityForTesting();
-
-    WaitableEvent workers_flooded(WaitableEvent::ResetPolicy::MANUAL,
-                                  WaitableEvent::InitialState::NOT_SIGNALED);
-    RepeatingClosure all_workers_running_barrier = BarrierClosure(
-        pool_capacity,
-        BindOnce(&WaitableEvent::Signal, Unretained(&workers_flooded)));
-    for (size_t i = 0; i < pool_capacity; ++i) {
-      task_runner->PostTask(
-          FROM_HERE,
-          BindOnce(
-              [](OnceClosure on_running, WaitableEvent* continue_event) {
-                std::move(on_running).Run();
-                WaitWithoutBlockingObserver(continue_event);
-              },
-              all_workers_running_barrier, continue_event));
-    }
-    workers_flooded.Wait();
-  }
-
- private:
-  std::unique_ptr<StatisticsRecorder> statistics_recorder_ =
-      StatisticsRecorder::CreateTemporaryForTesting();
-
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolHistogramTest);
-};
-
-}  // namespace
-
-TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBetweenWaits) {
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  CreateAndStartWorkerPool(TimeDelta::Max(), kNumWorkersInWorkerPool);
-  auto task_runner = worker_pool_->CreateSequencedTaskRunnerWithTraits(
-      {WithBaseSyncPrimitives()});
-
-  // Post a task.
-  task_runner->PostTask(
-      FROM_HERE, BindOnce(&WaitWithoutBlockingObserver, Unretained(&event)));
-
-  // Post 2 more tasks while the first task hasn't completed its execution. It
-  // is guaranteed that these tasks will run immediately after the first task,
-  // without allowing the worker to sleep.
-  task_runner->PostTask(FROM_HERE, DoNothing());
-  task_runner->PostTask(FROM_HERE, DoNothing());
-
-  // Allow tasks to run and wait until the SchedulerWorker is idle.
-  event.Signal();
-  worker_pool_->WaitForAllWorkersIdleForTesting();
-
-  // Wake up the SchedulerWorker that just became idle by posting a task and
-  // wait until it becomes idle again. The SchedulerWorker should record the
-  // TaskScheduler.NumTasksBetweenWaits.* histogram on wake up.
-  task_runner->PostTask(FROM_HERE, DoNothing());
-  worker_pool_->WaitForAllWorkersIdleForTesting();
-
-  // Verify that counts were recorded to the histogram as expected.
-  const auto* histogram = worker_pool_->num_tasks_between_waits_histogram();
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0));
-  EXPECT_EQ(1, histogram->SnapshotSamples()->GetCount(3));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10));
-}
-
-// Verifies that NumTasksBetweenWaits histogram is logged as expected across
-// idle and cleanup periods.
-TEST_F(TaskSchedulerWorkerPoolHistogramTest,
-       NumTasksBetweenWaitsWithIdlePeriodAndCleanup) {
-  WaitableEvent tasks_can_exit_event(WaitableEvent::ResetPolicy::MANUAL,
-                                     WaitableEvent::InitialState::NOT_SIGNALED);
-  CreateAndStartWorkerPool(kReclaimTimeForCleanupTests,
-                           kNumWorkersInWorkerPool);
-
-  WaitableEvent workers_continue(WaitableEvent::ResetPolicy::MANUAL,
-                                 WaitableEvent::InitialState::NOT_SIGNALED);
-
-  FloodPool(&workers_continue);
-
-  const auto* histogram = worker_pool_->num_tasks_between_waits_histogram();
-
-  // NumTasksBetweenWaits shouldn't be logged until idle.
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(1));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10));
-
-  // Make all workers go idle.
-  workers_continue.Signal();
-  worker_pool_->WaitForAllWorkersIdleForTesting();
-
-  // All workers should have reported a single hit in the "1" bucket per the the
-  // histogram being reported when going idle and each worker having processed
-  // precisely 1 task per the controlled flooding logic above.
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0));
-  EXPECT_EQ(static_cast<int>(kNumWorkersInWorkerPool),
-            histogram->SnapshotSamples()->GetCount(1));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10));
-
-  worker_pool_->WaitForWorkersCleanedUpForTesting(kNumWorkersInWorkerPool - 1);
-
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0));
-  EXPECT_EQ(static_cast<int>(kNumWorkersInWorkerPool),
-            histogram->SnapshotSamples()->GetCount(1));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10));
-
-  // Flooding the pool once again (without letting any workers go idle)
-  // shouldn't affect the counts either.
-
-  workers_continue.Reset();
-  FloodPool(&workers_continue);
-
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0));
-  EXPECT_EQ(static_cast<int>(kNumWorkersInWorkerPool),
-            histogram->SnapshotSamples()->GetCount(1));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10));
-
-  workers_continue.Signal();
-  worker_pool_->WaitForAllWorkersIdleForTesting();
-}
-
-TEST_F(TaskSchedulerWorkerPoolHistogramTest, NumTasksBeforeCleanup) {
-  CreateWorkerPool();
-  auto histogrammed_thread_task_runner =
-      worker_pool_->CreateSequencedTaskRunnerWithTraits(
-          {WithBaseSyncPrimitives()});
-
-  // Post 3 tasks and hold the thread for idle thread stack ordering.
-  // This test assumes |histogrammed_thread_task_runner| gets assigned the same
-  // thread for each of its tasks.
-  PlatformThreadRef thread_ref;
-  histogrammed_thread_task_runner->PostTask(
-      FROM_HERE, BindOnce(
-                     [](PlatformThreadRef* thread_ref) {
-                       ASSERT_TRUE(thread_ref);
-                       *thread_ref = PlatformThread::CurrentRef();
-                     },
-                     Unretained(&thread_ref)));
-  histogrammed_thread_task_runner->PostTask(
-      FROM_HERE, BindOnce(
-                     [](PlatformThreadRef* thread_ref) {
-                       ASSERT_FALSE(thread_ref->is_null());
-                       EXPECT_EQ(*thread_ref, PlatformThread::CurrentRef());
-                     },
-                     Unretained(&thread_ref)));
-
-  WaitableEvent cleanup_thread_running(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent cleanup_thread_continue(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  histogrammed_thread_task_runner->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](PlatformThreadRef* thread_ref,
-             WaitableEvent* cleanup_thread_running,
-             WaitableEvent* cleanup_thread_continue) {
-            ASSERT_FALSE(thread_ref->is_null());
-            EXPECT_EQ(*thread_ref, PlatformThread::CurrentRef());
-            cleanup_thread_running->Signal();
-            WaitWithoutBlockingObserver(cleanup_thread_continue);
-          },
-          Unretained(&thread_ref), Unretained(&cleanup_thread_running),
-          Unretained(&cleanup_thread_continue)));
-
-  // Start the worker pool with 2 workers, to avoid depending on the scheduler's
-  // logic to always keep one extra idle worker.
-  //
-  // The pool is started after the 3 initial tasks have been posted to ensure
-  // that they are scheduled on the same worker. If the tasks could run as they
-  // are posted, there would be a chance that:
-  // 1. Worker #1:        Runs a tasks and empties the sequence, without adding
-  //                      itself to the idle stack yet.
-  // 2. Posting thread:   Posts another task to the now empty sequence. Wakes
-  //                      up a new worker, since worker #1 isn't on the idle
-  //                      stack yet.
-  // 3: Worker #2:        Runs the tasks, violating the expectation that the 3
-  //                      initial tasks run on the same worker.
-  constexpr size_t kTwoWorkers = 2;
-  StartWorkerPool(kReclaimTimeForCleanupTests, kTwoWorkers);
-
-  // Wait until the 3rd task is scheduled.
-  cleanup_thread_running.Wait();
-
-  // To allow the SchedulerWorker associated with
-  // |histogrammed_thread_task_runner| to cleanup, make sure it isn't on top of
-  // the idle stack by waking up another SchedulerWorker via
-  // |task_runner_for_top_idle|. |histogrammed_thread_task_runner| should
-  // release and go idle first and then |task_runner_for_top_idle| should
-  // release and go idle. This allows the SchedulerWorker associated with
-  // |histogrammed_thread_task_runner| to cleanup.
-  WaitableEvent top_idle_thread_running(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent top_idle_thread_continue(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  auto task_runner_for_top_idle =
-      worker_pool_->CreateSequencedTaskRunnerWithTraits(
-          {WithBaseSyncPrimitives()});
-  task_runner_for_top_idle->PostTask(
-      FROM_HERE, BindOnce(
-                     [](PlatformThreadRef thread_ref,
-                        WaitableEvent* top_idle_thread_running,
-                        WaitableEvent* top_idle_thread_continue) {
-                       ASSERT_FALSE(thread_ref.is_null());
-                       EXPECT_NE(thread_ref, PlatformThread::CurrentRef())
-                           << "Worker reused. Worker will not cleanup and the "
-                              "histogram value will be wrong.";
-                       top_idle_thread_running->Signal();
-                       WaitWithoutBlockingObserver(top_idle_thread_continue);
-                     },
-                     thread_ref, Unretained(&top_idle_thread_running),
-                     Unretained(&top_idle_thread_continue)));
-  top_idle_thread_running.Wait();
-  EXPECT_EQ(0U, worker_pool_->NumberOfIdleWorkersForTesting());
-  cleanup_thread_continue.Signal();
-  // Wait for the cleanup thread to also become idle.
-  worker_pool_->WaitForWorkersIdleForTesting(1U);
-  top_idle_thread_continue.Signal();
-  // Allow the thread processing the |histogrammed_thread_task_runner| work to
-  // cleanup.
-  worker_pool_->WaitForWorkersCleanedUpForTesting(1U);
-
-  // Verify that counts were recorded to the histogram as expected.
-  const auto* histogram = worker_pool_->num_tasks_before_detach_histogram();
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(0));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(1));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(2));
-  EXPECT_EQ(1, histogram->SnapshotSamples()->GetCount(3));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(4));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(5));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(6));
-  EXPECT_EQ(0, histogram->SnapshotSamples()->GetCount(10));
-}
-
-TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, InitOne) {
-  TaskTracker task_tracker("Test");
-  DelayedTaskManager delayed_task_manager;
-  scoped_refptr<TaskRunner> service_thread_task_runner =
-      MakeRefCounted<TestSimpleTaskRunner>();
-  delayed_task_manager.Start(service_thread_task_runner);
-  auto worker_pool = std::make_unique<SchedulerWorkerPoolImpl>(
-      "OnePolicyWorkerPool", "A", ThreadPriority::NORMAL,
-      task_tracker.GetTrackedRef(), &delayed_task_manager);
-  worker_pool->Start(SchedulerWorkerPoolParams(8U, TimeDelta::Max()),
-                     service_thread_task_runner, nullptr,
-                     SchedulerWorkerPoolImpl::WorkerEnvironment::NONE);
-  ASSERT_TRUE(worker_pool);
-  EXPECT_EQ(1U, worker_pool->NumberOfWorkersForTesting());
-  worker_pool->JoinForTesting();
-}
-
-// Verify the SchedulerWorkerPoolImpl keeps at least one idle standby thread,
-// capacity permitting.
-TEST(TaskSchedulerWorkerPoolStandbyPolicyTest, VerifyStandbyThread) {
-  constexpr size_t kWorkerCapacity = 3;
-
-  TaskTracker task_tracker("Test");
-  DelayedTaskManager delayed_task_manager;
-  scoped_refptr<TaskRunner> service_thread_task_runner =
-      MakeRefCounted<TestSimpleTaskRunner>();
-  delayed_task_manager.Start(service_thread_task_runner);
-  auto worker_pool = std::make_unique<SchedulerWorkerPoolImpl>(
-      "StandbyThreadWorkerPool", "A", ThreadPriority::NORMAL,
-      task_tracker.GetTrackedRef(), &delayed_task_manager);
-  worker_pool->Start(
-      SchedulerWorkerPoolParams(kWorkerCapacity, kReclaimTimeForCleanupTests),
-      service_thread_task_runner, nullptr,
-      SchedulerWorkerPoolImpl::WorkerEnvironment::NONE);
-  ASSERT_TRUE(worker_pool);
-  EXPECT_EQ(1U, worker_pool->NumberOfWorkersForTesting());
-
-  auto task_runner =
-      worker_pool->CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()});
-
-  WaitableEvent thread_running(WaitableEvent::ResetPolicy::AUTOMATIC,
-                               WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent thread_continue(WaitableEvent::ResetPolicy::MANUAL,
-                                WaitableEvent::InitialState::NOT_SIGNALED);
-
-  RepeatingClosure closure = BindRepeating(
-      [](WaitableEvent* thread_running, WaitableEvent* thread_continue) {
-        thread_running->Signal();
-        WaitWithoutBlockingObserver(thread_continue);
-      },
-      Unretained(&thread_running), Unretained(&thread_continue));
-
-  // There should be one idle thread until we reach worker capacity
-  for (size_t i = 0; i < kWorkerCapacity; ++i) {
-    EXPECT_EQ(i + 1, worker_pool->NumberOfWorkersForTesting());
-    task_runner->PostTask(FROM_HERE, closure);
-    thread_running.Wait();
-  }
-
-  // There should not be an extra idle thread if it means going above capacity
-  EXPECT_EQ(kWorkerCapacity, worker_pool->NumberOfWorkersForTesting());
-
-  thread_continue.Signal();
-  // Wait long enough for all but one worker to clean up.
-  worker_pool->WaitForWorkersCleanedUpForTesting(kWorkerCapacity - 1);
-  EXPECT_EQ(1U, worker_pool->NumberOfWorkersForTesting());
-  // Give extra time for a worker to cleanup : none should as the pool is
-  // expected to keep a worker ready regardless of how long it was idle for.
-  PlatformThread::Sleep(kReclaimTimeForCleanupTests);
-  EXPECT_EQ(1U, worker_pool->NumberOfWorkersForTesting());
-
-  worker_pool->JoinForTesting();
-}
-
-namespace {
-
-enum class OptionalBlockingType {
-  NO_BLOCK,
-  MAY_BLOCK,
-  WILL_BLOCK,
-};
-
-struct NestedBlockingType {
-  NestedBlockingType(BlockingType first_in,
-                     OptionalBlockingType second_in,
-                     BlockingType behaves_as_in)
-      : first(first_in), second(second_in), behaves_as(behaves_as_in) {}
-
-  BlockingType first;
-  OptionalBlockingType second;
-  BlockingType behaves_as;
-};
-
-class NestedScopedBlockingCall {
- public:
-  NestedScopedBlockingCall(const NestedBlockingType& nested_blocking_type)
-      : first_scoped_blocking_call_(nested_blocking_type.first),
-        second_scoped_blocking_call_(
-            nested_blocking_type.second == OptionalBlockingType::WILL_BLOCK
-                ? std::make_unique<ScopedBlockingCall>(BlockingType::WILL_BLOCK)
-                : (nested_blocking_type.second ==
-                           OptionalBlockingType::MAY_BLOCK
-                       ? std::make_unique<ScopedBlockingCall>(
-                             BlockingType::MAY_BLOCK)
-                       : nullptr)) {}
-
- private:
-  ScopedBlockingCall first_scoped_blocking_call_;
-  std::unique_ptr<ScopedBlockingCall> second_scoped_blocking_call_;
-
-  DISALLOW_COPY_AND_ASSIGN(NestedScopedBlockingCall);
-};
-
-}  // namespace
-
-class TaskSchedulerWorkerPoolBlockingTest
-    : public TaskSchedulerWorkerPoolImplTestBase,
-      public testing::TestWithParam<NestedBlockingType> {
- public:
-  TaskSchedulerWorkerPoolBlockingTest()
-      : blocking_thread_running_(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                 WaitableEvent::InitialState::NOT_SIGNALED),
-        blocking_thread_continue_(WaitableEvent::ResetPolicy::MANUAL,
-                                  WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  static std::string ParamInfoToString(
-      ::testing::TestParamInfo<NestedBlockingType> param_info) {
-    std::string str = param_info.param.first == BlockingType::MAY_BLOCK
-                          ? "MAY_BLOCK"
-                          : "WILL_BLOCK";
-    if (param_info.param.second == OptionalBlockingType::MAY_BLOCK)
-      str += "_MAY_BLOCK";
-    else if (param_info.param.second == OptionalBlockingType::WILL_BLOCK)
-      str += "_WILL_BLOCK";
-    return str;
-  }
-
-  void SetUp() override {
-    TaskSchedulerWorkerPoolImplTestBase::CommonSetUp();
-    task_runner_ =
-        worker_pool_->CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()});
-  }
-
-  void TearDown() override {
-    TaskSchedulerWorkerPoolImplTestBase::CommonTearDown();
-  }
-
- protected:
-  // Saturates the worker pool with a task that first blocks, waits to be
-  // unblocked, then exits.
-  void SaturateWithBlockingTasks(
-      const NestedBlockingType& nested_blocking_type) {
-    RepeatingClosure blocking_thread_running_closure =
-        BarrierClosure(kNumWorkersInWorkerPool,
-                       BindOnce(&WaitableEvent::Signal,
-                                Unretained(&blocking_thread_running_)));
-
-    for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) {
-      task_runner_->PostTask(
-          FROM_HERE,
-          BindOnce(
-              [](Closure* blocking_thread_running_closure,
-                 WaitableEvent* blocking_thread_continue_,
-                 const NestedBlockingType& nested_blocking_type) {
-                NestedScopedBlockingCall nested_scoped_blocking_call(
-                    nested_blocking_type);
-                blocking_thread_running_closure->Run();
-                WaitWithoutBlockingObserver(blocking_thread_continue_);
-              },
-              Unretained(&blocking_thread_running_closure),
-              Unretained(&blocking_thread_continue_), nested_blocking_type));
-    }
-    blocking_thread_running_.Wait();
-  }
-
-  // Returns how long we can expect a change to |worker_capacity_| to occur
-  // after a task has become blocked.
-  TimeDelta GetWorkerCapacityChangeSleepTime() {
-    return std::max(SchedulerWorkerPoolImpl::kBlockedWorkersPollPeriod,
-                    worker_pool_->MayBlockThreshold()) +
-           TestTimeouts::tiny_timeout();
-  }
-
-  // Waits indefinitely, until |worker_pool_|'s worker capacity increases to
-  // |expected_worker_capacity|.
-  void ExpectWorkerCapacityIncreasesTo(size_t expected_worker_capacity) {
-    size_t capacity = worker_pool_->GetWorkerCapacityForTesting();
-    while (capacity != expected_worker_capacity) {
-      PlatformThread::Sleep(GetWorkerCapacityChangeSleepTime());
-      size_t new_capacity = worker_pool_->GetWorkerCapacityForTesting();
-      ASSERT_GE(new_capacity, capacity);
-      capacity = new_capacity;
-    }
-  }
-
-  // Unblocks tasks posted by SaturateWithBlockingTasks().
-  void UnblockTasks() { blocking_thread_continue_.Signal(); }
-
-  scoped_refptr<TaskRunner> task_runner_;
-
- private:
-  WaitableEvent blocking_thread_running_;
-  WaitableEvent blocking_thread_continue_;
-
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolBlockingTest);
-};
-
-// Verify that BlockingScopeEntered() causes worker capacity to increase and
-// creates a worker if needed. Also verify that BlockingScopeExited() decreases
-// worker capacity after an increase.
-TEST_P(TaskSchedulerWorkerPoolBlockingTest, ThreadBlockedUnblocked) {
-  ASSERT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            kNumWorkersInWorkerPool);
-
-  SaturateWithBlockingTasks(GetParam());
-  if (GetParam().behaves_as == BlockingType::MAY_BLOCK)
-    ExpectWorkerCapacityIncreasesTo(2 * kNumWorkersInWorkerPool);
-  // A range of possible number of workers is accepted because of
-  // crbug.com/757897.
-  EXPECT_GE(worker_pool_->NumberOfWorkersForTesting(),
-            kNumWorkersInWorkerPool + 1);
-  EXPECT_LE(worker_pool_->NumberOfWorkersForTesting(),
-            2 * kNumWorkersInWorkerPool);
-  EXPECT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            2 * kNumWorkersInWorkerPool);
-
-  UnblockTasks();
-  task_tracker_.FlushForTesting();
-  EXPECT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            kNumWorkersInWorkerPool);
-}
-
-// Verify that tasks posted in a saturated pool before a ScopedBlockingCall will
-// execute after ScopedBlockingCall is instantiated.
-TEST_P(TaskSchedulerWorkerPoolBlockingTest, PostBeforeBlocking) {
-  WaitableEvent thread_running(WaitableEvent::ResetPolicy::AUTOMATIC,
-                               WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent thread_can_block(WaitableEvent::ResetPolicy::MANUAL,
-                                 WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent thread_continue(WaitableEvent::ResetPolicy::MANUAL,
-                                WaitableEvent::InitialState::NOT_SIGNALED);
-
-  for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) {
-    task_runner_->PostTask(
-        FROM_HERE,
-        BindOnce(
-            [](const NestedBlockingType& nested_blocking_type,
-               WaitableEvent* thread_running, WaitableEvent* thread_can_block,
-               WaitableEvent* thread_continue) {
-              thread_running->Signal();
-              WaitWithoutBlockingObserver(thread_can_block);
-
-              NestedScopedBlockingCall nested_scoped_blocking_call(
-                  nested_blocking_type);
-              WaitWithoutBlockingObserver(thread_continue);
-            },
-            GetParam(), Unretained(&thread_running),
-            Unretained(&thread_can_block), Unretained(&thread_continue)));
-    thread_running.Wait();
-  }
-
-  // All workers should be occupied and the pool should be saturated. Workers
-  // have not entered ScopedBlockingCall yet.
-  EXPECT_EQ(worker_pool_->NumberOfWorkersForTesting(), kNumWorkersInWorkerPool);
-  EXPECT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            kNumWorkersInWorkerPool);
-
-  WaitableEvent extra_thread_running(WaitableEvent::ResetPolicy::MANUAL,
-                                     WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent extra_threads_continue(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  RepeatingClosure extra_threads_running_barrier = BarrierClosure(
-      kNumWorkersInWorkerPool,
-      BindOnce(&WaitableEvent::Signal, Unretained(&extra_thread_running)));
-  for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) {
-    task_runner_->PostTask(FROM_HERE,
-                           BindOnce(
-                               [](Closure* extra_threads_running_barrier,
-                                  WaitableEvent* extra_threads_continue) {
-                                 extra_threads_running_barrier->Run();
-                                 WaitWithoutBlockingObserver(
-                                     extra_threads_continue);
-                               },
-                               Unretained(&extra_threads_running_barrier),
-                               Unretained(&extra_threads_continue)));
-  }
-
-  // Allow tasks to enter ScopedBlockingCall. Workers should be created for the
-  // tasks we just posted.
-  thread_can_block.Signal();
-  if (GetParam().behaves_as == BlockingType::MAY_BLOCK)
-    ExpectWorkerCapacityIncreasesTo(2 * kNumWorkersInWorkerPool);
-
-  // Should not block forever.
-  extra_thread_running.Wait();
-  EXPECT_EQ(worker_pool_->NumberOfWorkersForTesting(),
-            2 * kNumWorkersInWorkerPool);
-  extra_threads_continue.Signal();
-
-  thread_continue.Signal();
-  task_tracker_.FlushForTesting();
-}
-// Verify that workers become idle when the pool is over-capacity and that
-// those workers do no work.
-TEST_P(TaskSchedulerWorkerPoolBlockingTest, WorkersIdleWhenOverCapacity) {
-  ASSERT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            kNumWorkersInWorkerPool);
-
-  SaturateWithBlockingTasks(GetParam());
-  if (GetParam().behaves_as == BlockingType::MAY_BLOCK)
-    ExpectWorkerCapacityIncreasesTo(2 * kNumWorkersInWorkerPool);
-  EXPECT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            2 * kNumWorkersInWorkerPool);
-  // A range of possible number of workers is accepted because of
-  // crbug.com/757897.
-  EXPECT_GE(worker_pool_->NumberOfWorkersForTesting(),
-            kNumWorkersInWorkerPool + 1);
-  EXPECT_LE(worker_pool_->NumberOfWorkersForTesting(),
-            2 * kNumWorkersInWorkerPool);
-
-  WaitableEvent thread_running(WaitableEvent::ResetPolicy::AUTOMATIC,
-                               WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent thread_continue(WaitableEvent::ResetPolicy::MANUAL,
-                                WaitableEvent::InitialState::NOT_SIGNALED);
-
-  RepeatingClosure thread_running_barrier = BarrierClosure(
-      kNumWorkersInWorkerPool,
-      BindOnce(&WaitableEvent::Signal, Unretained(&thread_running)));
-  // Posting these tasks should cause new workers to be created.
-  for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) {
-    auto callback = BindOnce(
-        [](Closure* thread_running_barrier, WaitableEvent* thread_continue) {
-          thread_running_barrier->Run();
-          WaitWithoutBlockingObserver(thread_continue);
-        },
-        Unretained(&thread_running_barrier), Unretained(&thread_continue));
-    task_runner_->PostTask(FROM_HERE, std::move(callback));
-  }
-  thread_running.Wait();
-
-  ASSERT_EQ(worker_pool_->NumberOfIdleWorkersForTesting(), 0U);
-  EXPECT_EQ(worker_pool_->NumberOfWorkersForTesting(),
-            2 * kNumWorkersInWorkerPool);
-
-  AtomicFlag is_exiting;
-  // These tasks should not get executed until after other tasks become
-  // unblocked.
-  for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) {
-    task_runner_->PostTask(FROM_HERE, BindOnce(
-                                          [](AtomicFlag* is_exiting) {
-                                            EXPECT_TRUE(is_exiting->IsSet());
-                                          },
-                                          Unretained(&is_exiting)));
-  }
-
-  // The original |kNumWorkersInWorkerPool| will finish their tasks after being
-  // unblocked. There will be work in the work queue, but the pool should now
-  // be over-capacity and workers will become idle.
-  UnblockTasks();
-  worker_pool_->WaitForWorkersIdleForTesting(kNumWorkersInWorkerPool);
-  EXPECT_EQ(worker_pool_->NumberOfIdleWorkersForTesting(),
-            kNumWorkersInWorkerPool);
-
-  // Posting more tasks should not cause workers idle from the pool being over
-  // capacity to begin doing work.
-  for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) {
-    task_runner_->PostTask(FROM_HERE, BindOnce(
-                                          [](AtomicFlag* is_exiting) {
-                                            EXPECT_TRUE(is_exiting->IsSet());
-                                          },
-                                          Unretained(&is_exiting)));
-  }
-
-  // Give time for those idle workers to possibly do work (which should not
-  // happen).
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-
-  is_exiting.Set();
-  // Unblocks the new workers.
-  thread_continue.Signal();
-  task_tracker_.FlushForTesting();
-}
-
-INSTANTIATE_TEST_CASE_P(
-    ,
-    TaskSchedulerWorkerPoolBlockingTest,
-    ::testing::Values(NestedBlockingType(BlockingType::MAY_BLOCK,
-                                         OptionalBlockingType::NO_BLOCK,
-                                         BlockingType::MAY_BLOCK),
-                      NestedBlockingType(BlockingType::WILL_BLOCK,
-                                         OptionalBlockingType::NO_BLOCK,
-                                         BlockingType::WILL_BLOCK),
-                      NestedBlockingType(BlockingType::MAY_BLOCK,
-                                         OptionalBlockingType::WILL_BLOCK,
-                                         BlockingType::WILL_BLOCK),
-                      NestedBlockingType(BlockingType::WILL_BLOCK,
-                                         OptionalBlockingType::MAY_BLOCK,
-                                         BlockingType::WILL_BLOCK)),
-    TaskSchedulerWorkerPoolBlockingTest::ParamInfoToString);
-
-// Verify that if a thread enters the scope of a MAY_BLOCK ScopedBlockingCall,
-// but exits the scope before the MayBlockThreshold() is reached, that the
-// worker capacity does not increase.
-TEST_F(TaskSchedulerWorkerPoolBlockingTest, ThreadBlockUnblockPremature) {
-  ASSERT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            kNumWorkersInWorkerPool);
-
-  TimeDelta worker_capacity_change_sleep = GetWorkerCapacityChangeSleepTime();
-  worker_pool_->MaximizeMayBlockThresholdForTesting();
-
-  SaturateWithBlockingTasks(NestedBlockingType(BlockingType::MAY_BLOCK,
-                                               OptionalBlockingType::NO_BLOCK,
-                                               BlockingType::MAY_BLOCK));
-  PlatformThread::Sleep(worker_capacity_change_sleep);
-  EXPECT_EQ(worker_pool_->NumberOfWorkersForTesting(), kNumWorkersInWorkerPool);
-  EXPECT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            kNumWorkersInWorkerPool);
-
-  UnblockTasks();
-  task_tracker_.FlushForTesting();
-  EXPECT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            kNumWorkersInWorkerPool);
-}
-
-// Verify that if worker capacity is incremented because of a MAY_BLOCK
-// ScopedBlockingCall, it isn't incremented again when there is a nested
-// WILL_BLOCK ScopedBlockingCall.
-TEST_F(TaskSchedulerWorkerPoolBlockingTest,
-       MayBlockIncreaseCapacityNestedWillBlock) {
-  ASSERT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            kNumWorkersInWorkerPool);
-  auto task_runner =
-      worker_pool_->CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()});
-  WaitableEvent can_return(WaitableEvent::ResetPolicy::MANUAL,
-                           WaitableEvent::InitialState::NOT_SIGNALED);
-
-  // Saturate the pool so that a MAY_BLOCK ScopedBlockingCall would increment
-  // the worker capacity.
-  for (size_t i = 0; i < kNumWorkersInWorkerPool - 1; ++i) {
-    task_runner->PostTask(FROM_HERE, BindOnce(&WaitWithoutBlockingObserver,
-                                              Unretained(&can_return)));
-  }
-
-  WaitableEvent can_instantiate_will_block(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent did_instantiate_will_block(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  // Post a task that instantiates a MAY_BLOCK ScopedBlockingCall.
-  task_runner->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](WaitableEvent* can_instantiate_will_block,
-             WaitableEvent* did_instantiate_will_block,
-             WaitableEvent* can_return) {
-            ScopedBlockingCall may_block(BlockingType::MAY_BLOCK);
-            WaitWithoutBlockingObserver(can_instantiate_will_block);
-            ScopedBlockingCall will_block(BlockingType::WILL_BLOCK);
-            did_instantiate_will_block->Signal();
-            WaitWithoutBlockingObserver(can_return);
-          },
-          Unretained(&can_instantiate_will_block),
-          Unretained(&did_instantiate_will_block), Unretained(&can_return)));
-
-  // After a short delay, worker capacity should be incremented.
-  ExpectWorkerCapacityIncreasesTo(kNumWorkersInWorkerPool + 1);
-
-  // Wait until the task instantiates a WILL_BLOCK ScopedBlockingCall.
-  can_instantiate_will_block.Signal();
-  did_instantiate_will_block.Wait();
-
-  // Worker capacity shouldn't be incremented again.
-  EXPECT_EQ(kNumWorkersInWorkerPool + 1,
-            worker_pool_->GetWorkerCapacityForTesting());
-
-  // Tear down.
-  can_return.Signal();
-  task_tracker_.FlushForTesting();
-  EXPECT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            kNumWorkersInWorkerPool);
-}
-
-// Verify that workers that become idle due to the pool being over capacity will
-// eventually cleanup.
-TEST(TaskSchedulerWorkerPoolOverWorkerCapacityTest, VerifyCleanup) {
-  constexpr size_t kWorkerCapacity = 3;
-
-  TaskTracker task_tracker("Test");
-  DelayedTaskManager delayed_task_manager;
-  scoped_refptr<TaskRunner> service_thread_task_runner =
-      MakeRefCounted<TestSimpleTaskRunner>();
-  delayed_task_manager.Start(service_thread_task_runner);
-  SchedulerWorkerPoolImpl worker_pool(
-      "OverWorkerCapacityTestWorkerPool", "A", ThreadPriority::NORMAL,
-      task_tracker.GetTrackedRef(), &delayed_task_manager);
-  worker_pool.Start(
-      SchedulerWorkerPoolParams(kWorkerCapacity, kReclaimTimeForCleanupTests),
-      service_thread_task_runner, nullptr,
-      SchedulerWorkerPoolImpl::WorkerEnvironment::NONE);
-
-  scoped_refptr<TaskRunner> task_runner =
-      worker_pool.CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()});
-
-  WaitableEvent threads_running(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent threads_continue(WaitableEvent::ResetPolicy::MANUAL,
-                                 WaitableEvent::InitialState::NOT_SIGNALED);
-  RepeatingClosure threads_running_barrier = BarrierClosure(
-      kWorkerCapacity,
-      BindOnce(&WaitableEvent::Signal, Unretained(&threads_running)));
-
-  WaitableEvent blocked_call_continue(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  RepeatingClosure closure = BindRepeating(
-      [](Closure* threads_running_barrier, WaitableEvent* threads_continue,
-         WaitableEvent* blocked_call_continue) {
-        threads_running_barrier->Run();
-        {
-          ScopedBlockingCall scoped_blocking_call(BlockingType::WILL_BLOCK);
-          WaitWithoutBlockingObserver(blocked_call_continue);
-        }
-        WaitWithoutBlockingObserver(threads_continue);
-      },
-      Unretained(&threads_running_barrier), Unretained(&threads_continue),
-      Unretained(&blocked_call_continue));
-
-  for (size_t i = 0; i < kWorkerCapacity; ++i)
-    task_runner->PostTask(FROM_HERE, closure);
-
-  threads_running.Wait();
-
-  WaitableEvent extra_threads_running(
-      WaitableEvent::ResetPolicy::AUTOMATIC,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent extra_threads_continue(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  RepeatingClosure extra_threads_running_barrier = BarrierClosure(
-      kWorkerCapacity,
-      BindOnce(&WaitableEvent::Signal, Unretained(&extra_threads_running)));
-  // These tasks should run on the new threads from increasing worker capacity.
-  for (size_t i = 0; i < kWorkerCapacity; ++i) {
-    task_runner->PostTask(FROM_HERE,
-                          BindOnce(
-                              [](Closure* extra_threads_running_barrier,
-                                 WaitableEvent* extra_threads_continue) {
-                                extra_threads_running_barrier->Run();
-                                WaitWithoutBlockingObserver(
-                                    extra_threads_continue);
-                              },
-                              Unretained(&extra_threads_running_barrier),
-                              Unretained(&extra_threads_continue)));
-  }
-  extra_threads_running.Wait();
-
-  ASSERT_EQ(kWorkerCapacity * 2, worker_pool.NumberOfWorkersForTesting());
-  EXPECT_EQ(kWorkerCapacity * 2, worker_pool.GetWorkerCapacityForTesting());
-  blocked_call_continue.Signal();
-  extra_threads_continue.Signal();
-
-  // Periodically post tasks to ensure that posting tasks does not prevent
-  // workers that are idle due to the pool being over capacity from cleaning up.
-  for (int i = 0; i < 16; ++i) {
-    task_runner->PostDelayedTask(FROM_HERE, DoNothing(),
-                                 kReclaimTimeForCleanupTests * i * 0.5);
-  }
-
-  // Note: one worker above capacity will not get cleaned up since it's on the
-  // top of the idle stack.
-  worker_pool.WaitForWorkersCleanedUpForTesting(kWorkerCapacity - 1);
-  EXPECT_EQ(kWorkerCapacity + 1, worker_pool.NumberOfWorkersForTesting());
-
-  threads_continue.Signal();
-
-  worker_pool.JoinForTesting();
-}
-
-// Verify that the maximum number of workers is 256 and that hitting the max
-// leaves the pool in a valid state with regards to worker capacity.
-TEST_F(TaskSchedulerWorkerPoolBlockingTest, MaximumWorkersTest) {
-  constexpr size_t kMaxNumberOfWorkers = 256;
-  constexpr size_t kNumExtraTasks = 10;
-
-  WaitableEvent early_blocking_thread_running(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  RepeatingClosure early_threads_barrier_closure =
-      BarrierClosure(kMaxNumberOfWorkers,
-                     BindOnce(&WaitableEvent::Signal,
-                              Unretained(&early_blocking_thread_running)));
-
-  WaitableEvent early_threads_finished(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  RepeatingClosure early_threads_finished_barrier = BarrierClosure(
-      kMaxNumberOfWorkers,
-      BindOnce(&WaitableEvent::Signal, Unretained(&early_threads_finished)));
-
-  WaitableEvent early_release_thread_continue(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  // Post ScopedBlockingCall tasks to hit the worker cap.
-  for (size_t i = 0; i < kMaxNumberOfWorkers; ++i) {
-    task_runner_->PostTask(FROM_HERE,
-                           BindOnce(
-                               [](Closure* early_threads_barrier_closure,
-                                  WaitableEvent* early_release_thread_continue,
-                                  Closure* early_threads_finished) {
-                                 {
-                                   ScopedBlockingCall scoped_blocking_call(
-                                       BlockingType::WILL_BLOCK);
-                                   early_threads_barrier_closure->Run();
-                                   WaitWithoutBlockingObserver(
-                                       early_release_thread_continue);
-                                 }
-                                 early_threads_finished->Run();
-                               },
-                               Unretained(&early_threads_barrier_closure),
-                               Unretained(&early_release_thread_continue),
-                               Unretained(&early_threads_finished_barrier)));
-  }
-
-  early_blocking_thread_running.Wait();
-  EXPECT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            kNumWorkersInWorkerPool + kMaxNumberOfWorkers);
-
-  WaitableEvent late_release_thread_contine(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WaitableEvent late_blocking_thread_running(
-      WaitableEvent::ResetPolicy::MANUAL,
-      WaitableEvent::InitialState::NOT_SIGNALED);
-  RepeatingClosure late_threads_barrier_closure = BarrierClosure(
-      kNumExtraTasks, BindOnce(&WaitableEvent::Signal,
-                               Unretained(&late_blocking_thread_running)));
-
-  // Posts additional tasks. Note: we should already have |kMaxNumberOfWorkers|
-  // tasks running. These tasks should not be able to get executed yet as
-  // the pool is already at its max worker cap.
-  for (size_t i = 0; i < kNumExtraTasks; ++i) {
-    task_runner_->PostTask(
-        FROM_HERE,
-        BindOnce(
-            [](Closure* late_threads_barrier_closure,
-               WaitableEvent* late_release_thread_contine) {
-              ScopedBlockingCall scoped_blocking_call(BlockingType::WILL_BLOCK);
-              late_threads_barrier_closure->Run();
-              WaitWithoutBlockingObserver(late_release_thread_contine);
-            },
-            Unretained(&late_threads_barrier_closure),
-            Unretained(&late_release_thread_contine)));
-  }
-
-  // Give time to see if we exceed the max number of workers.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_LE(worker_pool_->NumberOfWorkersForTesting(), kMaxNumberOfWorkers);
-
-  early_release_thread_continue.Signal();
-  early_threads_finished.Wait();
-  late_blocking_thread_running.Wait();
-
-  WaitableEvent final_tasks_running(WaitableEvent::ResetPolicy::MANUAL,
-                                    WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent final_tasks_continue(WaitableEvent::ResetPolicy::MANUAL,
-                                     WaitableEvent::InitialState::NOT_SIGNALED);
-  RepeatingClosure final_tasks_running_barrier = BarrierClosure(
-      kNumWorkersInWorkerPool,
-      BindOnce(&WaitableEvent::Signal, Unretained(&final_tasks_running)));
-
-  // Verify that we are still able to saturate the pool.
-  for (size_t i = 0; i < kNumWorkersInWorkerPool; ++i) {
-    task_runner_->PostTask(
-        FROM_HERE,
-        BindOnce(
-            [](Closure* closure, WaitableEvent* final_tasks_continue) {
-              closure->Run();
-              WaitWithoutBlockingObserver(final_tasks_continue);
-            },
-            Unretained(&final_tasks_running_barrier),
-            Unretained(&final_tasks_continue)));
-  }
-  final_tasks_running.Wait();
-  EXPECT_EQ(worker_pool_->GetWorkerCapacityForTesting(),
-            kNumWorkersInWorkerPool + kNumExtraTasks);
-  late_release_thread_contine.Signal();
-  final_tasks_continue.Signal();
-  task_tracker_.FlushForTesting();
-}
-
-// Verify that worker detachement doesn't race with worker cleanup, regression
-// test for https://crbug.com/810464.
-TEST(TaskSchedulerWorkerPoolTest, RacyCleanup) {
-#if defined(OS_FUCHSIA)
-  // Fuchsia + QEMU doesn't deal well with *many* threads being
-  // created/destroyed at once: https://crbug.com/816575.
-  constexpr size_t kWorkerCapacity = 16;
-#else   // defined(OS_FUCHSIA)
-  constexpr size_t kWorkerCapacity = 256;
-#endif  // defined(OS_FUCHSIA)
-  constexpr TimeDelta kReclaimTimeForRacyCleanupTest =
-      TimeDelta::FromMilliseconds(10);
-
-  TaskTracker task_tracker("Test");
-  DelayedTaskManager delayed_task_manager;
-  scoped_refptr<TaskRunner> service_thread_task_runner =
-      MakeRefCounted<TestSimpleTaskRunner>();
-  delayed_task_manager.Start(service_thread_task_runner);
-  SchedulerWorkerPoolImpl worker_pool(
-      "RacyCleanupTestWorkerPool", "A", ThreadPriority::NORMAL,
-      task_tracker.GetTrackedRef(), &delayed_task_manager);
-  worker_pool.Start(SchedulerWorkerPoolParams(kWorkerCapacity,
-                                              kReclaimTimeForRacyCleanupTest),
-                    service_thread_task_runner, nullptr,
-                    SchedulerWorkerPoolImpl::WorkerEnvironment::NONE);
-
-  scoped_refptr<TaskRunner> task_runner =
-      worker_pool.CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()});
-
-  WaitableEvent threads_running(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent unblock_threads(WaitableEvent::ResetPolicy::MANUAL,
-                                WaitableEvent::InitialState::NOT_SIGNALED);
-  RepeatingClosure threads_running_barrier = BarrierClosure(
-      kWorkerCapacity,
-      BindOnce(&WaitableEvent::Signal, Unretained(&threads_running)));
-
-  for (size_t i = 0; i < kWorkerCapacity; ++i) {
-    task_runner->PostTask(
-        FROM_HERE,
-        BindOnce(
-            [](OnceClosure on_running, WaitableEvent* unblock_threads) {
-              std::move(on_running).Run();
-              WaitWithoutBlockingObserver(unblock_threads);
-            },
-            threads_running_barrier, Unretained(&unblock_threads)));
-  }
-
-  // Wait for all workers to be ready and release them all at once.
-  threads_running.Wait();
-  unblock_threads.Signal();
-
-  // Sleep to wakeup precisely when all workers are going to try to cleanup per
-  // being idle.
-  PlatformThread::Sleep(kReclaimTimeForRacyCleanupTest);
-
-  worker_pool.JoinForTesting();
-
-  // Unwinding this test will be racy if worker cleanup can race with
-  // SchedulerWorkerPoolImpl destruction : https://crbug.com/810464.
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/scheduler_worker_pool_unittest.cc b/base/task_scheduler/scheduler_worker_pool_unittest.cc
deleted file mode 100644
index 20c1ad0..0000000
--- a/base/task_scheduler/scheduler_worker_pool_unittest.cc
+++ /dev/null
@@ -1,345 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/scheduler_worker_pool.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/location.h"
-#include "base/memory/ref_counted.h"
-#include "base/task_runner.h"
-#include "base/task_scheduler/delayed_task_manager.h"
-#include "base/task_scheduler/scheduler_worker_pool_impl.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/task_scheduler/test_task_factory.h"
-#include "base/task_scheduler/test_utils.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/threading/thread.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include "base/task_scheduler/platform_native_worker_pool_win.h"
-#endif
-
-namespace base {
-namespace internal {
-
-namespace {
-
-constexpr size_t kNumWorkersInWorkerPool = 4;
-constexpr size_t kNumThreadsPostingTasks = 4;
-constexpr size_t kNumTasksPostedPerThread = 150;
-
-enum class PoolType {
-  GENERIC,
-#if defined(OS_WIN)
-  WINDOWS,
-#endif
-};
-
-struct PoolExecutionType {
-  PoolType pool_type;
-  test::ExecutionMode execution_mode;
-};
-
-using PostNestedTask = test::TestTaskFactory::PostNestedTask;
-
-class ThreadPostingTasks : public SimpleThread {
- public:
-  // Constructs a thread that posts |num_tasks_posted_per_thread| tasks to
-  // |worker_pool| through an |execution_mode| task runner. If
-  // |post_nested_task| is YES, each task posted by this thread posts another
-  // task when it runs.
-  ThreadPostingTasks(SchedulerWorkerPool* worker_pool,
-                     test::ExecutionMode execution_mode,
-                     PostNestedTask post_nested_task)
-      : SimpleThread("ThreadPostingTasks"),
-        worker_pool_(worker_pool),
-        post_nested_task_(post_nested_task),
-        factory_(test::CreateTaskRunnerWithExecutionMode(worker_pool,
-                                                         execution_mode),
-                 execution_mode) {
-    DCHECK(worker_pool_);
-  }
-
-  const test::TestTaskFactory* factory() const { return &factory_; }
-
- private:
-  void Run() override {
-    EXPECT_FALSE(factory_.task_runner()->RunsTasksInCurrentSequence());
-
-    for (size_t i = 0; i < kNumTasksPostedPerThread; ++i)
-      EXPECT_TRUE(factory_.PostTask(post_nested_task_, Closure()));
-  }
-
-  SchedulerWorkerPool* const worker_pool_;
-  const scoped_refptr<TaskRunner> task_runner_;
-  const PostNestedTask post_nested_task_;
-  test::TestTaskFactory factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadPostingTasks);
-};
-
-class TaskSchedulerWorkerPoolTest
-    : public testing::TestWithParam<PoolExecutionType> {
- protected:
-  TaskSchedulerWorkerPoolTest()
-      : service_thread_("TaskSchedulerServiceThread") {}
-
-  void SetUp() override {
-    service_thread_.Start();
-    delayed_task_manager_.Start(service_thread_.task_runner());
-    CreateWorkerPool();
-  }
-
-  void TearDown() override {
-    service_thread_.Stop();
-    if (worker_pool_)
-      worker_pool_->JoinForTesting();
-  }
-
-  void CreateWorkerPool() {
-    ASSERT_FALSE(worker_pool_);
-    switch (GetParam().pool_type) {
-      case PoolType::GENERIC:
-        worker_pool_ = std::make_unique<SchedulerWorkerPoolImpl>(
-            "TestWorkerPool", "A", ThreadPriority::NORMAL,
-            task_tracker_.GetTrackedRef(), &delayed_task_manager_);
-        break;
-#if defined(OS_WIN)
-      case PoolType::WINDOWS:
-        worker_pool_ = std::make_unique<PlatformNativeWorkerPoolWin>(
-            task_tracker_.GetTrackedRef(), &delayed_task_manager_);
-        break;
-#endif
-    }
-    ASSERT_TRUE(worker_pool_);
-  }
-
-  void StartWorkerPool() {
-    ASSERT_TRUE(worker_pool_);
-    switch (GetParam().pool_type) {
-      case PoolType::GENERIC: {
-        SchedulerWorkerPoolImpl* scheduler_worker_pool_impl =
-            static_cast<SchedulerWorkerPoolImpl*>(worker_pool_.get());
-        scheduler_worker_pool_impl->Start(
-            SchedulerWorkerPoolParams(kNumWorkersInWorkerPool,
-                                      TimeDelta::Max()),
-            service_thread_.task_runner(), nullptr,
-            SchedulerWorkerPoolImpl::WorkerEnvironment::NONE);
-        break;
-      }
-#if defined(OS_WIN)
-      case PoolType::WINDOWS: {
-        PlatformNativeWorkerPoolWin* scheduler_worker_pool_windows_impl =
-            static_cast<PlatformNativeWorkerPoolWin*>(worker_pool_.get());
-        scheduler_worker_pool_windows_impl->Start();
-        break;
-      }
-#endif
-    }
-  }
-
-  Thread service_thread_;
-  TaskTracker task_tracker_ = {"Test"};
-  DelayedTaskManager delayed_task_manager_;
-
-  std::unique_ptr<SchedulerWorkerPool> worker_pool_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerPoolTest);
-};
-
-void ShouldNotRun() {
-  ADD_FAILURE() << "Ran a task that shouldn't run.";
-}
-
-}  // namespace
-
-TEST_P(TaskSchedulerWorkerPoolTest, PostTasks) {
-  StartWorkerPool();
-  // Create threads to post tasks.
-  std::vector<std::unique_ptr<ThreadPostingTasks>> threads_posting_tasks;
-  for (size_t i = 0; i < kNumThreadsPostingTasks; ++i) {
-    threads_posting_tasks.push_back(std::make_unique<ThreadPostingTasks>(
-        worker_pool_.get(), GetParam().execution_mode, PostNestedTask::NO));
-    threads_posting_tasks.back()->Start();
-  }
-
-  // Wait for all tasks to run.
-  for (const auto& thread_posting_tasks : threads_posting_tasks) {
-    thread_posting_tasks->Join();
-    thread_posting_tasks->factory()->WaitForAllTasksToRun();
-  }
-
-  // Flush the task tracker to be sure that no task accesses its TestTaskFactory
-  // after |thread_posting_tasks| is destroyed.
-  task_tracker_.FlushForTesting();
-}
-
-TEST_P(TaskSchedulerWorkerPoolTest, NestedPostTasks) {
-  StartWorkerPool();
-  // Create threads to post tasks. Each task posted by these threads will post
-  // another task when it runs.
-  std::vector<std::unique_ptr<ThreadPostingTasks>> threads_posting_tasks;
-  for (size_t i = 0; i < kNumThreadsPostingTasks; ++i) {
-    threads_posting_tasks.push_back(std::make_unique<ThreadPostingTasks>(
-        worker_pool_.get(), GetParam().execution_mode, PostNestedTask::YES));
-    threads_posting_tasks.back()->Start();
-  }
-
-  // Wait for all tasks to run.
-  for (const auto& thread_posting_tasks : threads_posting_tasks) {
-    thread_posting_tasks->Join();
-    thread_posting_tasks->factory()->WaitForAllTasksToRun();
-  }
-
-  // Flush the task tracker to be sure that no task accesses its TestTaskFactory
-  // after |thread_posting_tasks| is destroyed.
-  task_tracker_.FlushForTesting();
-}
-
-// Verify that a Task can't be posted after shutdown.
-TEST_P(TaskSchedulerWorkerPoolTest, PostTaskAfterShutdown) {
-  StartWorkerPool();
-  auto task_runner = test::CreateTaskRunnerWithExecutionMode(
-      worker_pool_.get(), GetParam().execution_mode);
-  task_tracker_.Shutdown();
-  EXPECT_FALSE(task_runner->PostTask(FROM_HERE, BindOnce(&ShouldNotRun)));
-}
-
-// Verify that posting tasks after the pool was destroyed fails but doesn't
-// crash.
-TEST_P(TaskSchedulerWorkerPoolTest, PostAfterDestroy) {
-  StartWorkerPool();
-  auto task_runner = test::CreateTaskRunnerWithExecutionMode(
-      worker_pool_.get(), GetParam().execution_mode);
-  EXPECT_TRUE(task_runner->PostTask(FROM_HERE, DoNothing()));
-  task_tracker_.Shutdown();
-  worker_pool_->JoinForTesting();
-  worker_pool_.reset();
-  EXPECT_FALSE(task_runner->PostTask(FROM_HERE, BindOnce(&ShouldNotRun)));
-}
-
-// Verify that a Task runs shortly after its delay expires.
-TEST_P(TaskSchedulerWorkerPoolTest, PostDelayedTask) {
-  StartWorkerPool();
-
-  WaitableEvent task_ran(WaitableEvent::ResetPolicy::AUTOMATIC,
-                         WaitableEvent::InitialState::NOT_SIGNALED);
-
-  auto task_runner = test::CreateTaskRunnerWithExecutionMode(
-      worker_pool_.get(), GetParam().execution_mode);
-
-  // Wait until the task runner is up and running to make sure the test below is
-  // solely timing the delayed task, not bringing up a physical thread.
-  task_runner->PostTask(
-      FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&task_ran)));
-  task_ran.Wait();
-  ASSERT_TRUE(!task_ran.IsSignaled());
-
-  // Post a task with a short delay.
-  TimeTicks start_time = TimeTicks::Now();
-  EXPECT_TRUE(task_runner->PostDelayedTask(
-      FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&task_ran)),
-      TestTimeouts::tiny_timeout()));
-
-  // Wait until the task runs.
-  task_ran.Wait();
-
-  // Expect the task to run after its delay expires, but no more than 250
-  // ms after that.
-  const TimeDelta actual_delay = TimeTicks::Now() - start_time;
-  EXPECT_GE(actual_delay, TestTimeouts::tiny_timeout());
-  EXPECT_LT(actual_delay,
-            TimeDelta::FromMilliseconds(250) + TestTimeouts::tiny_timeout());
-}
-
-// Verify that the RunsTasksInCurrentSequence() method of a SEQUENCED TaskRunner
-// returns false when called from a task that isn't part of the sequence. Note:
-// Tests that use TestTaskFactory already verify that
-// RunsTasksInCurrentSequence() returns true when appropriate so this method
-// complements it to get full coverage of that method.
-TEST_P(TaskSchedulerWorkerPoolTest, SequencedRunsTasksInCurrentSequence) {
-  StartWorkerPool();
-  auto task_runner = test::CreateTaskRunnerWithExecutionMode(
-      worker_pool_.get(), GetParam().execution_mode);
-  auto sequenced_task_runner =
-      worker_pool_->CreateSequencedTaskRunnerWithTraits(TaskTraits());
-
-  WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
-                         WaitableEvent::InitialState::NOT_SIGNALED);
-  task_runner->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](scoped_refptr<TaskRunner> sequenced_task_runner,
-             WaitableEvent* task_ran) {
-            EXPECT_FALSE(sequenced_task_runner->RunsTasksInCurrentSequence());
-            task_ran->Signal();
-          },
-          sequenced_task_runner, Unretained(&task_ran)));
-  task_ran.Wait();
-}
-
-// Verify that tasks posted before Start run after Start.
-TEST_P(TaskSchedulerWorkerPoolTest, PostBeforeStart) {
-  WaitableEvent task_1_running(WaitableEvent::ResetPolicy::MANUAL,
-                               WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent task_2_running(WaitableEvent::ResetPolicy::MANUAL,
-                               WaitableEvent::InitialState::NOT_SIGNALED);
-
-  scoped_refptr<TaskRunner> task_runner =
-      worker_pool_->CreateTaskRunnerWithTraits({WithBaseSyncPrimitives()});
-
-  task_runner->PostTask(
-      FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&task_1_running)));
-  task_runner->PostTask(
-      FROM_HERE, BindOnce(&WaitableEvent::Signal, Unretained(&task_2_running)));
-
-  // Workers should not be created and tasks should not run before the pool is
-  // started. The sleep is to give time for the tasks to potentially run.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_FALSE(task_1_running.IsSignaled());
-  EXPECT_FALSE(task_2_running.IsSignaled());
-
-  StartWorkerPool();
-
-  // Tasks should run shortly after the pool is started.
-  task_1_running.Wait();
-  task_2_running.Wait();
-
-  task_tracker_.FlushForTesting();
-}
-
-INSTANTIATE_TEST_CASE_P(GenericParallel,
-                        TaskSchedulerWorkerPoolTest,
-                        ::testing::Values(PoolExecutionType{
-                            PoolType::GENERIC, test::ExecutionMode::PARALLEL}));
-INSTANTIATE_TEST_CASE_P(GenericSequenced,
-                        TaskSchedulerWorkerPoolTest,
-                        ::testing::Values(PoolExecutionType{
-                            PoolType::GENERIC,
-                            test::ExecutionMode::SEQUENCED}));
-
-#if defined(OS_WIN)
-INSTANTIATE_TEST_CASE_P(WinParallel,
-                        TaskSchedulerWorkerPoolTest,
-                        ::testing::Values(PoolExecutionType{
-                            PoolType::WINDOWS, test::ExecutionMode::PARALLEL}));
-INSTANTIATE_TEST_CASE_P(WinSequenced,
-                        TaskSchedulerWorkerPoolTest,
-                        ::testing::Values(PoolExecutionType{
-                            PoolType::WINDOWS,
-                            test::ExecutionMode::SEQUENCED}));
-#endif
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/scheduler_worker_stack_unittest.cc b/base/task_scheduler/scheduler_worker_stack_unittest.cc
deleted file mode 100644
index 8707874..0000000
--- a/base/task_scheduler/scheduler_worker_stack_unittest.cc
+++ /dev/null
@@ -1,253 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/scheduler_worker_stack.h"
-
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/task_scheduler/scheduler_worker.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/test/gtest_util.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-namespace {
-
-class MockSchedulerWorkerDelegate : public SchedulerWorker::Delegate {
- public:
-  void OnCanScheduleSequence(scoped_refptr<Sequence> sequence) override {
-    ADD_FAILURE() << "Unexpected call to OnCanScheduleSequence().";
-  }
-  SchedulerWorker::ThreadLabel GetThreadLabel() const override {
-    return SchedulerWorker::ThreadLabel::DEDICATED;
-  }
-  void OnMainEntry(const SchedulerWorker* worker) override {}
-  scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override {
-    return nullptr;
-  }
-  void DidRunTask() override {
-    ADD_FAILURE() << "Unexpected call to DidRunTask()";
-  }
-  void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override {
-    ADD_FAILURE() << "Unexpected call to ReEnqueueSequence()";
-  }
-  TimeDelta GetSleepTimeout() override {
-    return TimeDelta::Max();
-  }
-};
-
-class TaskSchedulerWorkerStackTest : public testing::Test {
- protected:
-  void SetUp() override {
-    worker_a_ = MakeRefCounted<SchedulerWorker>(
-        ThreadPriority::NORMAL, WrapUnique(new MockSchedulerWorkerDelegate),
-        task_tracker_.GetTrackedRef());
-    ASSERT_TRUE(worker_a_);
-    worker_b_ = MakeRefCounted<SchedulerWorker>(
-        ThreadPriority::NORMAL, WrapUnique(new MockSchedulerWorkerDelegate),
-        task_tracker_.GetTrackedRef());
-    ASSERT_TRUE(worker_b_);
-    worker_c_ = MakeRefCounted<SchedulerWorker>(
-        ThreadPriority::NORMAL, WrapUnique(new MockSchedulerWorkerDelegate),
-        task_tracker_.GetTrackedRef());
-    ASSERT_TRUE(worker_c_);
-  }
-
- private:
-  TaskTracker task_tracker_ = {"Test"};
-
- protected:
-  scoped_refptr<SchedulerWorker> worker_a_;
-  scoped_refptr<SchedulerWorker> worker_b_;
-  scoped_refptr<SchedulerWorker> worker_c_;
-};
-
-}  // namespace
-
-// Verify that Push() and Pop() add/remove values in FIFO order.
-TEST_F(TaskSchedulerWorkerStackTest, PushPop) {
-  SchedulerWorkerStack stack;
-  EXPECT_EQ(nullptr, stack.Pop());
-
-  EXPECT_TRUE(stack.IsEmpty());
-  EXPECT_EQ(0U, stack.Size());
-
-  stack.Push(worker_a_.get());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(1U, stack.Size());
-
-  stack.Push(worker_b_.get());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(2U, stack.Size());
-
-  stack.Push(worker_c_.get());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(3U, stack.Size());
-
-  EXPECT_EQ(worker_c_.get(), stack.Pop());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(2U, stack.Size());
-
-  stack.Push(worker_c_.get());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(3U, stack.Size());
-
-  EXPECT_EQ(worker_c_.get(), stack.Pop());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(2U, stack.Size());
-
-  EXPECT_EQ(worker_b_.get(), stack.Pop());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(1U, stack.Size());
-
-  EXPECT_EQ(worker_a_.get(), stack.Pop());
-  EXPECT_TRUE(stack.IsEmpty());
-  EXPECT_EQ(0U, stack.Size());
-
-  EXPECT_EQ(nullptr, stack.Pop());
-}
-
-// Verify that Peek() returns the correct values in FIFO order.
-TEST_F(TaskSchedulerWorkerStackTest, PeekPop) {
-  SchedulerWorkerStack stack;
-  EXPECT_EQ(nullptr, stack.Peek());
-
-  EXPECT_TRUE(stack.IsEmpty());
-  EXPECT_EQ(0U, stack.Size());
-
-  stack.Push(worker_a_.get());
-  EXPECT_EQ(worker_a_.get(), stack.Peek());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(1U, stack.Size());
-
-  stack.Push(worker_b_.get());
-  EXPECT_EQ(worker_b_.get(), stack.Peek());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(2U, stack.Size());
-
-  stack.Push(worker_c_.get());
-  EXPECT_EQ(worker_c_.get(), stack.Peek());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(3U, stack.Size());
-
-  EXPECT_EQ(worker_c_.get(), stack.Pop());
-  EXPECT_EQ(worker_b_.get(), stack.Peek());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(2U, stack.Size());
-
-  EXPECT_EQ(worker_b_.get(), stack.Pop());
-  EXPECT_EQ(worker_a_.get(), stack.Peek());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(1U, stack.Size());
-
-  EXPECT_EQ(worker_a_.get(), stack.Pop());
-  EXPECT_TRUE(stack.IsEmpty());
-  EXPECT_EQ(0U, stack.Size());
-
-  EXPECT_EQ(nullptr, stack.Peek());
-}
-
-// Verify that Contains() returns true for workers on the stack.
-TEST_F(TaskSchedulerWorkerStackTest, Contains) {
-  SchedulerWorkerStack stack;
-  EXPECT_FALSE(stack.Contains(worker_a_.get()));
-  EXPECT_FALSE(stack.Contains(worker_b_.get()));
-  EXPECT_FALSE(stack.Contains(worker_c_.get()));
-
-  stack.Push(worker_a_.get());
-  EXPECT_TRUE(stack.Contains(worker_a_.get()));
-  EXPECT_FALSE(stack.Contains(worker_b_.get()));
-  EXPECT_FALSE(stack.Contains(worker_c_.get()));
-
-  stack.Push(worker_b_.get());
-  EXPECT_TRUE(stack.Contains(worker_a_.get()));
-  EXPECT_TRUE(stack.Contains(worker_b_.get()));
-  EXPECT_FALSE(stack.Contains(worker_c_.get()));
-
-  stack.Push(worker_c_.get());
-  EXPECT_TRUE(stack.Contains(worker_a_.get()));
-  EXPECT_TRUE(stack.Contains(worker_b_.get()));
-  EXPECT_TRUE(stack.Contains(worker_c_.get()));
-
-  stack.Pop();
-  EXPECT_TRUE(stack.Contains(worker_a_.get()));
-  EXPECT_TRUE(stack.Contains(worker_b_.get()));
-  EXPECT_FALSE(stack.Contains(worker_c_.get()));
-
-  stack.Pop();
-  EXPECT_TRUE(stack.Contains(worker_a_.get()));
-  EXPECT_FALSE(stack.Contains(worker_b_.get()));
-  EXPECT_FALSE(stack.Contains(worker_c_.get()));
-
-  stack.Pop();
-  EXPECT_FALSE(stack.Contains(worker_a_.get()));
-  EXPECT_FALSE(stack.Contains(worker_b_.get()));
-  EXPECT_FALSE(stack.Contains(worker_c_.get()));
-}
-
-// Verify that a value can be removed by Remove().
-TEST_F(TaskSchedulerWorkerStackTest, Remove) {
-  SchedulerWorkerStack stack;
-  EXPECT_TRUE(stack.IsEmpty());
-  EXPECT_EQ(0U, stack.Size());
-
-  stack.Push(worker_a_.get());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(1U, stack.Size());
-
-  stack.Push(worker_b_.get());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(2U, stack.Size());
-
-  stack.Push(worker_c_.get());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(3U, stack.Size());
-
-  stack.Remove(worker_b_.get());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(2U, stack.Size());
-
-  EXPECT_EQ(worker_c_.get(), stack.Pop());
-  EXPECT_FALSE(stack.IsEmpty());
-  EXPECT_EQ(1U, stack.Size());
-
-  EXPECT_EQ(worker_a_.get(), stack.Pop());
-  EXPECT_TRUE(stack.IsEmpty());
-  EXPECT_EQ(0U, stack.Size());
-}
-
-// Verify that a value can be pushed again after it has been removed.
-TEST_F(TaskSchedulerWorkerStackTest, PushAfterRemove) {
-  SchedulerWorkerStack stack;
-  EXPECT_EQ(0U, stack.Size());
-  EXPECT_TRUE(stack.IsEmpty());
-
-  stack.Push(worker_a_.get());
-  EXPECT_EQ(1U, stack.Size());
-  EXPECT_FALSE(stack.IsEmpty());
-
-  stack.Remove(worker_a_.get());
-  EXPECT_EQ(0U, stack.Size());
-  EXPECT_TRUE(stack.IsEmpty());
-
-  stack.Push(worker_a_.get());
-  EXPECT_EQ(1U, stack.Size());
-  EXPECT_FALSE(stack.IsEmpty());
-}
-
-// Verify that Push() DCHECKs when a value is inserted twice.
-TEST_F(TaskSchedulerWorkerStackTest, PushTwice) {
-  SchedulerWorkerStack stack;
-  stack.Push(worker_a_.get());
-  EXPECT_DCHECK_DEATH({ stack.Push(worker_a_.get()); });
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/scheduler_worker_unittest.cc b/base/task_scheduler/scheduler_worker_unittest.cc
deleted file mode 100644
index b7a2eda..0000000
--- a/base/task_scheduler/scheduler_worker_unittest.cc
+++ /dev/null
@@ -1,907 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/scheduler_worker.h"
-
-#include <stddef.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/synchronization/condition_variable.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/scheduler_lock.h"
-#include "base/task_scheduler/scheduler_worker_observer.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/test_utils.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include <objbase.h>
-
-#include "base/win/com_init_check_hook.h"
-#endif
-
-using testing::_;
-using testing::Mock;
-using testing::Ne;
-using testing::StrictMock;
-
-namespace base {
-namespace internal {
-namespace {
-
-const size_t kNumSequencesPerTest = 150;
-
-class SchedulerWorkerDefaultDelegate : public SchedulerWorker::Delegate {
- public:
-  SchedulerWorkerDefaultDelegate() = default;
-
-  // SchedulerWorker::Delegate:
-  void OnCanScheduleSequence(scoped_refptr<Sequence> sequence) override {
-    ADD_FAILURE() << "Unexpected call to OnCanScheduleSequence().";
-  }
-  SchedulerWorker::ThreadLabel GetThreadLabel() const override {
-    return SchedulerWorker::ThreadLabel::DEDICATED;
-  }
-  void OnMainEntry(const SchedulerWorker* worker) override {}
-  scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override {
-    return nullptr;
-  }
-  void DidRunTask() override {
-    ADD_FAILURE() << "Unexpected call to DidRunTask()";
-  }
-  void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override {
-    ADD_FAILURE() << "Unexpected call to ReEnqueueSequence()";
-  }
-  TimeDelta GetSleepTimeout() override { return TimeDelta::Max(); }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SchedulerWorkerDefaultDelegate);
-};
-
-// The test parameter is the number of Tasks per Sequence returned by GetWork().
-class TaskSchedulerWorkerTest : public testing::TestWithParam<size_t> {
- protected:
-  TaskSchedulerWorkerTest()
-      : main_entry_called_(WaitableEvent::ResetPolicy::MANUAL,
-                           WaitableEvent::InitialState::NOT_SIGNALED),
-        num_get_work_cv_(lock_.CreateConditionVariable()),
-        worker_set_(WaitableEvent::ResetPolicy::MANUAL,
-                    WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  void SetUp() override {
-    worker_ = MakeRefCounted<SchedulerWorker>(
-        ThreadPriority::NORMAL,
-        std::make_unique<TestSchedulerWorkerDelegate>(this),
-        task_tracker_.GetTrackedRef());
-    ASSERT_TRUE(worker_);
-    worker_->Start();
-    worker_set_.Signal();
-    main_entry_called_.Wait();
-  }
-
-  void TearDown() override {
-    // |worker_| needs to be released before ~TaskTracker() as it holds a
-    // TrackedRef to it.
-    worker_->JoinForTesting();
-    worker_ = nullptr;
-  }
-
-  size_t TasksPerSequence() const { return GetParam(); }
-
-  // Wait until GetWork() has been called |num_get_work| times.
-  void WaitForNumGetWork(size_t num_get_work) {
-    AutoSchedulerLock auto_lock(lock_);
-    while (num_get_work_ < num_get_work)
-      num_get_work_cv_->Wait();
-  }
-
-  void SetMaxGetWork(size_t max_get_work) {
-    AutoSchedulerLock auto_lock(lock_);
-    max_get_work_ = max_get_work;
-  }
-
-  void SetNumSequencesToCreate(size_t num_sequences_to_create) {
-    AutoSchedulerLock auto_lock(lock_);
-    EXPECT_EQ(0U, num_sequences_to_create_);
-    num_sequences_to_create_ = num_sequences_to_create;
-  }
-
-  size_t NumRunTasks() {
-    AutoSchedulerLock auto_lock(lock_);
-    return num_run_tasks_;
-  }
-
-  std::vector<scoped_refptr<Sequence>> CreatedSequences() {
-    AutoSchedulerLock auto_lock(lock_);
-    return created_sequences_;
-  }
-
-  std::vector<scoped_refptr<Sequence>> EnqueuedSequences() {
-    AutoSchedulerLock auto_lock(lock_);
-    return re_enqueued_sequences_;
-  }
-
-  scoped_refptr<SchedulerWorker> worker_;
-
- private:
-  class TestSchedulerWorkerDelegate : public SchedulerWorkerDefaultDelegate {
-   public:
-    TestSchedulerWorkerDelegate(TaskSchedulerWorkerTest* outer)
-        : outer_(outer) {}
-
-    ~TestSchedulerWorkerDelegate() override {
-      EXPECT_FALSE(IsCallToDidRunTaskExpected());
-    }
-
-    // SchedulerWorker::Delegate:
-    void OnMainEntry(const SchedulerWorker* worker) override {
-      outer_->worker_set_.Wait();
-      EXPECT_EQ(outer_->worker_.get(), worker);
-      EXPECT_FALSE(IsCallToDidRunTaskExpected());
-
-      // Without synchronization, OnMainEntry() could be called twice without
-      // generating an error.
-      AutoSchedulerLock auto_lock(outer_->lock_);
-      EXPECT_FALSE(outer_->main_entry_called_.IsSignaled());
-      outer_->main_entry_called_.Signal();
-    }
-
-    scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override {
-      EXPECT_FALSE(IsCallToDidRunTaskExpected());
-      EXPECT_EQ(outer_->worker_.get(), worker);
-
-      {
-        AutoSchedulerLock auto_lock(outer_->lock_);
-
-        // Increment the number of times that this method has been called.
-        ++outer_->num_get_work_;
-        outer_->num_get_work_cv_->Signal();
-
-        // Verify that this method isn't called more times than expected.
-        EXPECT_LE(outer_->num_get_work_, outer_->max_get_work_);
-
-        // Check if a Sequence should be returned.
-        if (outer_->num_sequences_to_create_ == 0)
-          return nullptr;
-        --outer_->num_sequences_to_create_;
-      }
-
-      // Create a Sequence with TasksPerSequence() Tasks.
-      scoped_refptr<Sequence> sequence(new Sequence);
-      for (size_t i = 0; i < outer_->TasksPerSequence(); ++i) {
-        Task task(FROM_HERE,
-                  BindOnce(&TaskSchedulerWorkerTest::RunTaskCallback,
-                           Unretained(outer_)),
-                  TaskTraits(), TimeDelta());
-        EXPECT_TRUE(outer_->task_tracker_.WillPostTask(task));
-        sequence->PushTask(std::move(task));
-      }
-
-      ExpectCallToDidRunTask();
-
-      {
-        // Add the Sequence to the vector of created Sequences.
-        AutoSchedulerLock auto_lock(outer_->lock_);
-        outer_->created_sequences_.push_back(sequence);
-      }
-
-      sequence = outer_->task_tracker_.WillScheduleSequence(std::move(sequence),
-                                                            nullptr);
-      EXPECT_TRUE(sequence);
-      return sequence;
-    }
-
-    void DidRunTask() override {
-      AutoSchedulerLock auto_lock(expect_did_run_task_lock_);
-      EXPECT_TRUE(expect_did_run_task_);
-      expect_did_run_task_ = false;
-    }
-
-    // This override verifies that |sequence| contains the expected number of
-    // Tasks and adds it to |enqueued_sequences_|. Unlike a normal
-    // EnqueueSequence implementation, it doesn't reinsert |sequence| into a
-    // queue for further execution.
-    void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override {
-      EXPECT_FALSE(IsCallToDidRunTaskExpected());
-      EXPECT_GT(outer_->TasksPerSequence(), 1U);
-
-      // Verify that |sequence| contains TasksPerSequence() - 1 Tasks.
-      for (size_t i = 0; i < outer_->TasksPerSequence() - 1; ++i) {
-        EXPECT_TRUE(sequence->TakeTask());
-        EXPECT_EQ(i == outer_->TasksPerSequence() - 2, sequence->Pop());
-      }
-
-      // Add |sequence| to |re_enqueued_sequences_|.
-      AutoSchedulerLock auto_lock(outer_->lock_);
-      outer_->re_enqueued_sequences_.push_back(std::move(sequence));
-      EXPECT_LE(outer_->re_enqueued_sequences_.size(),
-                outer_->created_sequences_.size());
-    }
-
-   private:
-    // Expect a call to DidRunTask() before the next call to any other method of
-    // this delegate.
-    void ExpectCallToDidRunTask() {
-      AutoSchedulerLock auto_lock(expect_did_run_task_lock_);
-      expect_did_run_task_ = true;
-    }
-
-    bool IsCallToDidRunTaskExpected() const {
-      AutoSchedulerLock auto_lock(expect_did_run_task_lock_);
-      return expect_did_run_task_;
-    }
-
-    TaskSchedulerWorkerTest* outer_;
-
-    // Synchronizes access to |expect_did_run_task_|.
-    mutable SchedulerLock expect_did_run_task_lock_;
-
-    // Whether the next method called on this delegate should be DidRunTask().
-    bool expect_did_run_task_ = false;
-
-    DISALLOW_COPY_AND_ASSIGN(TestSchedulerWorkerDelegate);
-  };
-
-  void RunTaskCallback() {
-    AutoSchedulerLock auto_lock(lock_);
-    ++num_run_tasks_;
-    EXPECT_LE(num_run_tasks_, created_sequences_.size());
-  }
-
-  TaskTracker task_tracker_ = {"Test"};
-
-  // Synchronizes access to all members below.
-  mutable SchedulerLock lock_;
-
-  // Signaled once OnMainEntry() has been called.
-  WaitableEvent main_entry_called_;
-
-  // Number of Sequences that should be created by GetWork(). When this
-  // is 0, GetWork() returns nullptr.
-  size_t num_sequences_to_create_ = 0;
-
-  // Number of times that GetWork() has been called.
-  size_t num_get_work_ = 0;
-
-  // Maximum number of times that GetWork() can be called.
-  size_t max_get_work_ = 0;
-
-  // Condition variable signaled when |num_get_work_| is incremented.
-  std::unique_ptr<ConditionVariable> num_get_work_cv_;
-
-  // Sequences created by GetWork().
-  std::vector<scoped_refptr<Sequence>> created_sequences_;
-
-  // Sequences passed to EnqueueSequence().
-  std::vector<scoped_refptr<Sequence>> re_enqueued_sequences_;
-
-  // Number of times that RunTaskCallback() has been called.
-  size_t num_run_tasks_ = 0;
-
-  // Signaled after |worker_| is set.
-  WaitableEvent worker_set_;
-
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerWorkerTest);
-};
-
-}  // namespace
-
-// Verify that when GetWork() continuously returns Sequences, all Tasks in these
-// Sequences run successfully. The test wakes up the SchedulerWorker once.
-TEST_P(TaskSchedulerWorkerTest, ContinuousWork) {
-  // Set GetWork() to return |kNumSequencesPerTest| Sequences before starting to
-  // return nullptr.
-  SetNumSequencesToCreate(kNumSequencesPerTest);
-
-  // Expect |kNumSequencesPerTest| calls to GetWork() in which it returns a
-  // Sequence and one call in which its returns nullptr.
-  const size_t kExpectedNumGetWork = kNumSequencesPerTest + 1;
-  SetMaxGetWork(kExpectedNumGetWork);
-
-  // Wake up |worker_| and wait until GetWork() has been invoked the
-  // expected amount of times.
-  worker_->WakeUp();
-  WaitForNumGetWork(kExpectedNumGetWork);
-
-  // All tasks should have run.
-  EXPECT_EQ(kNumSequencesPerTest, NumRunTasks());
-
-  // If Sequences returned by GetWork() contain more than one Task, they aren't
-  // empty after the worker pops Tasks from them and thus should be returned to
-  // EnqueueSequence().
-  if (TasksPerSequence() > 1)
-    EXPECT_EQ(CreatedSequences(), EnqueuedSequences());
-  else
-    EXPECT_TRUE(EnqueuedSequences().empty());
-}
-
-// Verify that when GetWork() alternates between returning a Sequence and
-// returning nullptr, all Tasks in the returned Sequences run successfully. The
-// test wakes up the SchedulerWorker once for each Sequence.
-TEST_P(TaskSchedulerWorkerTest, IntermittentWork) {
-  for (size_t i = 0; i < kNumSequencesPerTest; ++i) {
-    // Set GetWork() to return 1 Sequence before starting to return
-    // nullptr.
-    SetNumSequencesToCreate(1);
-
-    // Expect |i + 1| calls to GetWork() in which it returns a Sequence and
-    // |i + 1| calls in which it returns nullptr.
-    const size_t expected_num_get_work = 2 * (i + 1);
-    SetMaxGetWork(expected_num_get_work);
-
-    // Wake up |worker_| and wait until GetWork() has been invoked
-    // the expected amount of times.
-    worker_->WakeUp();
-    WaitForNumGetWork(expected_num_get_work);
-
-    // The Task should have run
-    EXPECT_EQ(i + 1, NumRunTasks());
-
-    // If Sequences returned by GetWork() contain more than one Task, they
-    // aren't empty after the worker pops Tasks from them and thus should be
-    // returned to EnqueueSequence().
-    if (TasksPerSequence() > 1)
-      EXPECT_EQ(CreatedSequences(), EnqueuedSequences());
-    else
-      EXPECT_TRUE(EnqueuedSequences().empty());
-  }
-}
-
-INSTANTIATE_TEST_CASE_P(OneTaskPerSequence,
-                        TaskSchedulerWorkerTest,
-                        ::testing::Values(1));
-INSTANTIATE_TEST_CASE_P(TwoTasksPerSequence,
-                        TaskSchedulerWorkerTest,
-                        ::testing::Values(2));
-
-namespace {
-
-class ControllableCleanupDelegate : public SchedulerWorkerDefaultDelegate {
- public:
-  class Controls : public RefCountedThreadSafe<Controls> {
-   public:
-    Controls()
-        : work_running_(WaitableEvent::ResetPolicy::MANUAL,
-                        WaitableEvent::InitialState::SIGNALED),
-          work_processed_(WaitableEvent::ResetPolicy::MANUAL,
-                          WaitableEvent::InitialState::NOT_SIGNALED),
-          cleanup_requested_(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED),
-          destroyed_(WaitableEvent::ResetPolicy::MANUAL,
-                     WaitableEvent::InitialState::NOT_SIGNALED),
-          exited_(WaitableEvent::ResetPolicy::MANUAL,
-                  WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-    void HaveWorkBlock() { work_running_.Reset(); }
-
-    void UnblockWork() { work_running_.Signal(); }
-
-    void WaitForWorkToRun() { work_processed_.Wait(); }
-
-    void WaitForCleanupRequest() { cleanup_requested_.Wait(); }
-
-    void WaitForDelegateDestroy() { destroyed_.Wait(); }
-
-    void WaitForMainExit() { exited_.Wait(); }
-
-    void set_expect_get_work(bool expect_get_work) {
-      expect_get_work_ = expect_get_work;
-    }
-
-    void ResetState() {
-      work_running_.Signal();
-      work_processed_.Reset();
-      cleanup_requested_.Reset();
-      exited_.Reset();
-      work_requested_ = false;
-    }
-
-    void set_can_cleanup(bool can_cleanup) { can_cleanup_ = can_cleanup; }
-
-   private:
-    friend class ControllableCleanupDelegate;
-    friend class RefCountedThreadSafe<Controls>;
-    ~Controls() = default;
-
-    WaitableEvent work_running_;
-    WaitableEvent work_processed_;
-    WaitableEvent cleanup_requested_;
-    WaitableEvent destroyed_;
-    WaitableEvent exited_;
-
-    bool expect_get_work_ = true;
-    bool can_cleanup_ = false;
-    bool work_requested_ = false;
-
-    DISALLOW_COPY_AND_ASSIGN(Controls);
-  };
-
-  ControllableCleanupDelegate(TaskTracker* task_tracker)
-      : task_tracker_(task_tracker), controls_(new Controls()) {}
-
-  ~ControllableCleanupDelegate() override { controls_->destroyed_.Signal(); }
-
-  scoped_refptr<Sequence> GetWork(SchedulerWorker* worker)
-      override {
-    EXPECT_TRUE(controls_->expect_get_work_);
-
-    // Sends one item of work to signal |work_processed_|. On subsequent calls,
-    // sends nullptr to indicate there's no more work to be done.
-    if (controls_->work_requested_) {
-      if (CanCleanup(worker)) {
-        OnCleanup();
-        worker->Cleanup();
-        controls_->set_expect_get_work(false);
-      }
-      return nullptr;
-    }
-
-    controls_->work_requested_ = true;
-    scoped_refptr<Sequence> sequence(new Sequence);
-    Task task(
-        FROM_HERE,
-        BindOnce(
-            [](WaitableEvent* work_processed, WaitableEvent* work_running) {
-              work_processed->Signal();
-              work_running->Wait();
-            },
-            Unretained(&controls_->work_processed_),
-            Unretained(&controls_->work_running_)),
-        {WithBaseSyncPrimitives(), TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
-        TimeDelta());
-    EXPECT_TRUE(task_tracker_->WillPostTask(task));
-    sequence->PushTask(std::move(task));
-    sequence =
-        task_tracker_->WillScheduleSequence(std::move(sequence), nullptr);
-    EXPECT_TRUE(sequence);
-    return sequence;
-  }
-
-  void DidRunTask() override {}
-
-  void OnMainExit(SchedulerWorker* worker) override {
-    controls_->exited_.Signal();
-  }
-
-  bool CanCleanup(SchedulerWorker* worker) {
-    // Saving |can_cleanup_| now so that callers waiting on |cleanup_requested_|
-    // have the thread go to sleep and then allow timing out.
-    bool can_cleanup = controls_->can_cleanup_;
-    controls_->cleanup_requested_.Signal();
-    return can_cleanup;
-  }
-
-  void OnCleanup() {
-    EXPECT_TRUE(controls_->can_cleanup_);
-    EXPECT_TRUE(controls_->cleanup_requested_.IsSignaled());
-  }
-
-  // ControllableCleanupDelegate:
-  scoped_refptr<Controls> controls() { return controls_; }
-
- private:
-  scoped_refptr<Sequence> work_sequence_;
-  TaskTracker* const task_tracker_;
-  scoped_refptr<Controls> controls_;
-
-  DISALLOW_COPY_AND_ASSIGN(ControllableCleanupDelegate);
-};
-
-class MockedControllableCleanupDelegate : public ControllableCleanupDelegate {
- public:
-  MockedControllableCleanupDelegate(TaskTracker* task_tracker)
-      : ControllableCleanupDelegate(task_tracker){};
-  ~MockedControllableCleanupDelegate() override = default;
-
-  // SchedulerWorker::Delegate:
-  MOCK_METHOD1(OnMainEntry, void(const SchedulerWorker* worker));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockedControllableCleanupDelegate);
-};
-
-}  // namespace
-
-// Verify that calling SchedulerWorker::Cleanup() from GetWork() causes
-// the SchedulerWorker's thread to exit.
-TEST(TaskSchedulerWorkerTest, WorkerCleanupFromGetWork) {
-  TaskTracker task_tracker("Test");
-  // Will be owned by SchedulerWorker.
-  MockedControllableCleanupDelegate* delegate =
-      new StrictMock<MockedControllableCleanupDelegate>(&task_tracker);
-  scoped_refptr<ControllableCleanupDelegate::Controls> controls =
-      delegate->controls();
-  controls->set_can_cleanup(true);
-  EXPECT_CALL(*delegate, OnMainEntry(_));
-  auto worker = MakeRefCounted<SchedulerWorker>(ThreadPriority::NORMAL,
-                                                WrapUnique(delegate),
-                                                task_tracker.GetTrackedRef());
-  worker->Start();
-  worker->WakeUp();
-  controls->WaitForWorkToRun();
-  Mock::VerifyAndClear(delegate);
-  controls->WaitForMainExit();
-}
-
-TEST(TaskSchedulerWorkerTest, WorkerCleanupDuringWork) {
-  TaskTracker task_tracker("Test");
-  // Will be owned by SchedulerWorker.
-  // No mock here as that's reasonably covered by other tests and the delegate
-  // may destroy on a different thread. Mocks aren't designed with that in mind.
-  std::unique_ptr<ControllableCleanupDelegate> delegate =
-      std::make_unique<ControllableCleanupDelegate>(&task_tracker);
-  scoped_refptr<ControllableCleanupDelegate::Controls> controls =
-      delegate->controls();
-
-  controls->HaveWorkBlock();
-
-  auto worker = MakeRefCounted<SchedulerWorker>(ThreadPriority::NORMAL,
-                                                std::move(delegate),
-                                                task_tracker.GetTrackedRef());
-  worker->Start();
-  worker->WakeUp();
-
-  controls->WaitForWorkToRun();
-  worker->Cleanup();
-  worker = nullptr;
-  controls->UnblockWork();
-  controls->WaitForDelegateDestroy();
-}
-
-TEST(TaskSchedulerWorkerTest, WorkerCleanupDuringWait) {
-  TaskTracker task_tracker("Test");
-  // Will be owned by SchedulerWorker.
-  // No mock here as that's reasonably covered by other tests and the delegate
-  // may destroy on a different thread. Mocks aren't designed with that in mind.
-  std::unique_ptr<ControllableCleanupDelegate> delegate =
-      std::make_unique<ControllableCleanupDelegate>(&task_tracker);
-  scoped_refptr<ControllableCleanupDelegate::Controls> controls =
-      delegate->controls();
-
-  auto worker = MakeRefCounted<SchedulerWorker>(ThreadPriority::NORMAL,
-                                                std::move(delegate),
-                                                task_tracker.GetTrackedRef());
-  worker->Start();
-  worker->WakeUp();
-
-  controls->WaitForCleanupRequest();
-  worker->Cleanup();
-  worker = nullptr;
-  controls->WaitForDelegateDestroy();
-}
-
-TEST(TaskSchedulerWorkerTest, WorkerCleanupDuringShutdown) {
-  TaskTracker task_tracker("Test");
-  // Will be owned by SchedulerWorker.
-  // No mock here as that's reasonably covered by other tests and the delegate
-  // may destroy on a different thread. Mocks aren't designed with that in mind.
-  std::unique_ptr<ControllableCleanupDelegate> delegate =
-      std::make_unique<ControllableCleanupDelegate>(&task_tracker);
-  scoped_refptr<ControllableCleanupDelegate::Controls> controls =
-      delegate->controls();
-
-  controls->HaveWorkBlock();
-
-  auto worker = MakeRefCounted<SchedulerWorker>(ThreadPriority::NORMAL,
-                                                std::move(delegate),
-                                                task_tracker.GetTrackedRef());
-  worker->Start();
-  worker->WakeUp();
-
-  controls->WaitForWorkToRun();
-  task_tracker.Shutdown();
-  worker->Cleanup();
-  worker = nullptr;
-  controls->UnblockWork();
-  controls->WaitForDelegateDestroy();
-}
-
-// Verify that Start() is a no-op after Cleanup().
-TEST(TaskSchedulerWorkerTest, CleanupBeforeStart) {
-  TaskTracker task_tracker("Test");
-  // Will be owned by SchedulerWorker.
-  // No mock here as that's reasonably covered by other tests and the delegate
-  // may destroy on a different thread. Mocks aren't designed with that in mind.
-  std::unique_ptr<ControllableCleanupDelegate> delegate =
-      std::make_unique<ControllableCleanupDelegate>(&task_tracker);
-  scoped_refptr<ControllableCleanupDelegate::Controls> controls =
-      delegate->controls();
-  controls->set_expect_get_work(false);
-
-  auto worker = MakeRefCounted<SchedulerWorker>(ThreadPriority::NORMAL,
-                                                std::move(delegate),
-                                                task_tracker.GetTrackedRef());
-
-  worker->Cleanup();
-  worker->Start();
-
-  EXPECT_FALSE(worker->ThreadAliveForTesting());
-}
-
-namespace {
-
-class CallJoinFromDifferentThread : public SimpleThread {
- public:
-  CallJoinFromDifferentThread(SchedulerWorker* worker_to_join)
-      : SimpleThread("SchedulerWorkerJoinThread"),
-        worker_to_join_(worker_to_join),
-        run_started_event_(WaitableEvent::ResetPolicy::MANUAL,
-                           WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  ~CallJoinFromDifferentThread() override = default;
-
-  void Run() override {
-    run_started_event_.Signal();
-    worker_to_join_->JoinForTesting();
-  }
-
-  void WaitForRunToStart() { run_started_event_.Wait(); }
-
- private:
-  SchedulerWorker* const worker_to_join_;
-  WaitableEvent run_started_event_;
-  DISALLOW_COPY_AND_ASSIGN(CallJoinFromDifferentThread);
-};
-
-}  // namespace
-
-TEST(TaskSchedulerWorkerTest, WorkerCleanupDuringJoin) {
-  TaskTracker task_tracker("Test");
-  // Will be owned by SchedulerWorker.
-  // No mock here as that's reasonably covered by other tests and the
-  // delegate may destroy on a different thread. Mocks aren't designed with that
-  // in mind.
-  std::unique_ptr<ControllableCleanupDelegate> delegate =
-      std::make_unique<ControllableCleanupDelegate>(&task_tracker);
-  scoped_refptr<ControllableCleanupDelegate::Controls> controls =
-      delegate->controls();
-
-  controls->HaveWorkBlock();
-
-  auto worker = MakeRefCounted<SchedulerWorker>(ThreadPriority::NORMAL,
-                                                std::move(delegate),
-                                                task_tracker.GetTrackedRef());
-  worker->Start();
-  worker->WakeUp();
-
-  controls->WaitForWorkToRun();
-  CallJoinFromDifferentThread join_from_different_thread(worker.get());
-  join_from_different_thread.Start();
-  join_from_different_thread.WaitForRunToStart();
-  // Sleep here to give the other thread a chance to call JoinForTesting().
-  // Receiving a signal that Run() was called doesn't mean JoinForTesting() was
-  // necessarily called, and we can't signal after JoinForTesting() as
-  // JoinForTesting() blocks until we call UnblockWork().
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  worker->Cleanup();
-  worker = nullptr;
-  controls->UnblockWork();
-  controls->WaitForDelegateDestroy();
-  join_from_different_thread.Join();
-}
-
-namespace {
-
-class ExpectThreadPriorityDelegate : public SchedulerWorkerDefaultDelegate {
- public:
-  ExpectThreadPriorityDelegate()
-      : priority_verified_in_get_work_event_(
-            WaitableEvent::ResetPolicy::AUTOMATIC,
-            WaitableEvent::InitialState::NOT_SIGNALED),
-        expected_thread_priority_(ThreadPriority::BACKGROUND) {}
-
-  void SetExpectedThreadPriority(ThreadPriority expected_thread_priority) {
-    expected_thread_priority_ = expected_thread_priority;
-  }
-
-  void WaitForPriorityVerifiedInGetWork() {
-    priority_verified_in_get_work_event_.Wait();
-  }
-
-  // SchedulerWorker::Delegate:
-  void OnMainEntry(const SchedulerWorker* worker) override {
-    VerifyThreadPriority();
-  }
-  scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override {
-    VerifyThreadPriority();
-    priority_verified_in_get_work_event_.Signal();
-    return nullptr;
-  }
-
- private:
-  void VerifyThreadPriority() {
-    AutoSchedulerLock auto_lock(expected_thread_priority_lock_);
-    EXPECT_EQ(expected_thread_priority_,
-              PlatformThread::GetCurrentThreadPriority());
-  }
-
-  // Signaled after GetWork() has verified the priority of the worker thread.
-  WaitableEvent priority_verified_in_get_work_event_;
-
-  // Synchronizes access to |expected_thread_priority_|.
-  SchedulerLock expected_thread_priority_lock_;
-
-  // Expected thread priority for the next call to OnMainEntry() or GetWork().
-  ThreadPriority expected_thread_priority_;
-
-  DISALLOW_COPY_AND_ASSIGN(ExpectThreadPriorityDelegate);
-};
-
-}  // namespace
-
-TEST(TaskSchedulerWorkerTest, BumpPriorityOfAliveThreadDuringShutdown) {
-  TaskTracker task_tracker("Test");
-
-  std::unique_ptr<ExpectThreadPriorityDelegate> delegate(
-      new ExpectThreadPriorityDelegate);
-  ExpectThreadPriorityDelegate* delegate_raw = delegate.get();
-  delegate_raw->SetExpectedThreadPriority(
-      PlatformThread::CanIncreaseCurrentThreadPriority()
-          ? ThreadPriority::BACKGROUND
-          : ThreadPriority::NORMAL);
-
-  auto worker = MakeRefCounted<SchedulerWorker>(ThreadPriority::BACKGROUND,
-                                                std::move(delegate),
-                                                task_tracker.GetTrackedRef());
-  worker->Start();
-
-  // Verify that the initial thread priority is BACKGROUND (or NORMAL if thread
-  // priority can't be increased).
-  worker->WakeUp();
-  delegate_raw->WaitForPriorityVerifiedInGetWork();
-
-  // Verify that the thread priority is bumped to NORMAL during shutdown.
-  delegate_raw->SetExpectedThreadPriority(ThreadPriority::NORMAL);
-  task_tracker.SetHasShutdownStartedForTesting();
-  worker->WakeUp();
-  delegate_raw->WaitForPriorityVerifiedInGetWork();
-
-  worker->JoinForTesting();
-}
-
-namespace {
-
-class VerifyCallsToObserverDelegate : public SchedulerWorkerDefaultDelegate {
- public:
-  VerifyCallsToObserverDelegate(test::MockSchedulerWorkerObserver* observer)
-      : observer_(observer) {}
-
-  // SchedulerWorker::Delegate:
-  void OnMainEntry(const SchedulerWorker* worker) override {
-    Mock::VerifyAndClear(observer_);
-  }
-
-  void OnMainExit(SchedulerWorker* worker) override {
-    EXPECT_CALL(*observer_, OnSchedulerWorkerMainExit());
-  }
-
- private:
-  test::MockSchedulerWorkerObserver* const observer_;
-
-  DISALLOW_COPY_AND_ASSIGN(VerifyCallsToObserverDelegate);
-};
-
-}  // namespace
-
-// Verify that the SchedulerWorkerObserver is notified when the worker enters
-// and exits its main function.
-TEST(TaskSchedulerWorkerTest, SchedulerWorkerObserver) {
-  StrictMock<test::MockSchedulerWorkerObserver> observer;
-  {
-    TaskTracker task_tracker("Test");
-    auto delegate = std::make_unique<VerifyCallsToObserverDelegate>(&observer);
-    auto worker = MakeRefCounted<SchedulerWorker>(ThreadPriority::NORMAL,
-                                                  std::move(delegate),
-                                                  task_tracker.GetTrackedRef());
-
-    EXPECT_CALL(observer, OnSchedulerWorkerMainEntry());
-    worker->Start(&observer);
-    worker->Cleanup();
-    worker = nullptr;
-  }
-  Mock::VerifyAndClear(&observer);
-}
-
-#if defined(OS_WIN)
-
-namespace {
-
-class CoInitializeDelegate : public SchedulerWorkerDefaultDelegate {
- public:
-  CoInitializeDelegate()
-      : get_work_returned_(WaitableEvent::ResetPolicy::MANUAL,
-                           WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override {
-    EXPECT_FALSE(get_work_returned_.IsSignaled());
-    EXPECT_EQ(E_UNEXPECTED, coinitialize_hresult_);
-
-    coinitialize_hresult_ = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
-    if (SUCCEEDED(coinitialize_hresult_))
-      CoUninitialize();
-
-    get_work_returned_.Signal();
-    return nullptr;
-  }
-
-  void WaitUntilGetWorkReturned() { get_work_returned_.Wait(); }
-
-  HRESULT coinitialize_hresult() const { return coinitialize_hresult_; }
-
- private:
-  WaitableEvent get_work_returned_;
-  HRESULT coinitialize_hresult_ = E_UNEXPECTED;
-
-  DISALLOW_COPY_AND_ASSIGN(CoInitializeDelegate);
-};
-
-}  // namespace
-
-TEST(TaskSchedulerWorkerTest, BackwardCompatibilityEnabled) {
-  TaskTracker task_tracker("Test");
-  auto delegate = std::make_unique<CoInitializeDelegate>();
-  CoInitializeDelegate* const delegate_raw = delegate.get();
-
-  // Create a worker with backward compatibility ENABLED. Wake it up and wait
-  // until GetWork() returns.
-  auto worker = MakeRefCounted<SchedulerWorker>(
-      ThreadPriority::NORMAL, std::move(delegate), task_tracker.GetTrackedRef(),
-      nullptr, SchedulerBackwardCompatibility::INIT_COM_STA);
-  worker->Start();
-  worker->WakeUp();
-  delegate_raw->WaitUntilGetWorkReturned();
-
-  // The call to CoInitializeEx() should have returned S_FALSE to indicate that
-  // the COM library was already initialized on the thread.
-  // See SchedulerWorker::Thread::ThreadMain for why we expect two different
-  // results here.
-#if defined(COM_INIT_CHECK_HOOK_ENABLED)
-  EXPECT_EQ(S_OK, delegate_raw->coinitialize_hresult());
-#else
-  EXPECT_EQ(S_FALSE, delegate_raw->coinitialize_hresult());
-#endif
-
-  worker->JoinForTesting();
-}
-
-TEST(TaskSchedulerWorkerTest, BackwardCompatibilityDisabled) {
-  TaskTracker task_tracker("Test");
-  auto delegate = std::make_unique<CoInitializeDelegate>();
-  CoInitializeDelegate* const delegate_raw = delegate.get();
-
-  // Create a worker with backward compatibility DISABLED. Wake it up and wait
-  // until GetWork() returns.
-  auto worker = MakeRefCounted<SchedulerWorker>(
-      ThreadPriority::NORMAL, std::move(delegate), task_tracker.GetTrackedRef(),
-      nullptr, SchedulerBackwardCompatibility::DISABLED);
-  worker->Start();
-  worker->WakeUp();
-  delegate_raw->WaitUntilGetWorkReturned();
-
-  // The call to CoInitializeEx() should have returned S_OK to indicate that the
-  // COM library wasn't already initialized on the thread.
-  EXPECT_EQ(S_OK, delegate_raw->coinitialize_hresult());
-
-  worker->JoinForTesting();
-}
-
-#endif  // defined(OS_WIN)
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/scoped_set_task_priority_for_current_thread_unittest.cc b/base/task_scheduler/scoped_set_task_priority_for_current_thread_unittest.cc
deleted file mode 100644
index c497af6..0000000
--- a/base/task_scheduler/scoped_set_task_priority_for_current_thread_unittest.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/scoped_set_task_priority_for_current_thread.h"
-
-#include "base/task_scheduler/task_traits.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-TEST(TaskSchedulerScopedSetTaskPriorityForCurrentThreadTest,
-     ScopedSetTaskPriorityForCurrentThread) {
-  EXPECT_EQ(TaskPriority::USER_VISIBLE, GetTaskPriorityForCurrentThread());
-  {
-    ScopedSetTaskPriorityForCurrentThread
-        scoped_set_task_priority_for_current_thread(
-            TaskPriority::USER_BLOCKING);
-    EXPECT_EQ(TaskPriority::USER_BLOCKING, GetTaskPriorityForCurrentThread());
-  }
-  EXPECT_EQ(TaskPriority::USER_VISIBLE, GetTaskPriorityForCurrentThread());
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/sequence_sort_key_unittest.cc b/base/task_scheduler/sequence_sort_key_unittest.cc
deleted file mode 100644
index 2c1d80d..0000000
--- a/base/task_scheduler/sequence_sort_key_unittest.cc
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/sequence_sort_key.h"
-
-#include "base/task_scheduler/task_traits.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-TEST(TaskSchedulerSequenceSortKeyTest, OperatorLessThan) {
-  SequenceSortKey key_a(TaskPriority::USER_BLOCKING,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_b(TaskPriority::USER_BLOCKING,
-                        TimeTicks::FromInternalValue(2000));
-  SequenceSortKey key_c(TaskPriority::USER_VISIBLE,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_d(TaskPriority::USER_VISIBLE,
-                        TimeTicks::FromInternalValue(2000));
-  SequenceSortKey key_e(TaskPriority::BACKGROUND,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_f(TaskPriority::BACKGROUND,
-                        TimeTicks::FromInternalValue(2000));
-
-  EXPECT_FALSE(key_a < key_a);
-  EXPECT_LT(key_b, key_a);
-  EXPECT_LT(key_c, key_a);
-  EXPECT_LT(key_d, key_a);
-  EXPECT_LT(key_e, key_a);
-  EXPECT_LT(key_f, key_a);
-
-  EXPECT_FALSE(key_a < key_b);
-  EXPECT_FALSE(key_b < key_b);
-  EXPECT_LT(key_c, key_b);
-  EXPECT_LT(key_d, key_b);
-  EXPECT_LT(key_e, key_b);
-  EXPECT_LT(key_f, key_b);
-
-  EXPECT_FALSE(key_a < key_c);
-  EXPECT_FALSE(key_b < key_c);
-  EXPECT_FALSE(key_c < key_c);
-  EXPECT_LT(key_d, key_c);
-  EXPECT_LT(key_e, key_c);
-  EXPECT_LT(key_f, key_c);
-
-  EXPECT_FALSE(key_a < key_d);
-  EXPECT_FALSE(key_b < key_d);
-  EXPECT_FALSE(key_c < key_d);
-  EXPECT_FALSE(key_d < key_d);
-  EXPECT_LT(key_e, key_d);
-  EXPECT_LT(key_f, key_d);
-
-  EXPECT_FALSE(key_a < key_e);
-  EXPECT_FALSE(key_b < key_e);
-  EXPECT_FALSE(key_c < key_e);
-  EXPECT_FALSE(key_d < key_e);
-  EXPECT_FALSE(key_e < key_e);
-  EXPECT_LT(key_f, key_e);
-
-  EXPECT_FALSE(key_a < key_f);
-  EXPECT_FALSE(key_b < key_f);
-  EXPECT_FALSE(key_c < key_f);
-  EXPECT_FALSE(key_d < key_f);
-  EXPECT_FALSE(key_e < key_f);
-  EXPECT_FALSE(key_f < key_f);
-}
-
-TEST(TaskSchedulerSequenceSortKeyTest, OperatorGreaterThan) {
-  SequenceSortKey key_a(TaskPriority::USER_BLOCKING,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_b(TaskPriority::USER_BLOCKING,
-                        TimeTicks::FromInternalValue(2000));
-  SequenceSortKey key_c(TaskPriority::USER_VISIBLE,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_d(TaskPriority::USER_VISIBLE,
-                        TimeTicks::FromInternalValue(2000));
-  SequenceSortKey key_e(TaskPriority::BACKGROUND,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_f(TaskPriority::BACKGROUND,
-                        TimeTicks::FromInternalValue(2000));
-
-  EXPECT_FALSE(key_a > key_a);
-  EXPECT_FALSE(key_b > key_a);
-  EXPECT_FALSE(key_c > key_a);
-  EXPECT_FALSE(key_d > key_a);
-  EXPECT_FALSE(key_e > key_a);
-  EXPECT_FALSE(key_f > key_a);
-
-  EXPECT_GT(key_a, key_b);
-  EXPECT_FALSE(key_b > key_b);
-  EXPECT_FALSE(key_c > key_b);
-  EXPECT_FALSE(key_d > key_b);
-  EXPECT_FALSE(key_e > key_b);
-  EXPECT_FALSE(key_f > key_b);
-
-  EXPECT_GT(key_a, key_c);
-  EXPECT_GT(key_b, key_c);
-  EXPECT_FALSE(key_c > key_c);
-  EXPECT_FALSE(key_d > key_c);
-  EXPECT_FALSE(key_e > key_c);
-  EXPECT_FALSE(key_f > key_c);
-
-  EXPECT_GT(key_a, key_d);
-  EXPECT_GT(key_b, key_d);
-  EXPECT_GT(key_c, key_d);
-  EXPECT_FALSE(key_d > key_d);
-  EXPECT_FALSE(key_e > key_d);
-  EXPECT_FALSE(key_f > key_d);
-
-  EXPECT_GT(key_a, key_e);
-  EXPECT_GT(key_b, key_e);
-  EXPECT_GT(key_c, key_e);
-  EXPECT_GT(key_d, key_e);
-  EXPECT_FALSE(key_e > key_e);
-  EXPECT_FALSE(key_f > key_e);
-
-  EXPECT_GT(key_a, key_f);
-  EXPECT_GT(key_b, key_f);
-  EXPECT_GT(key_c, key_f);
-  EXPECT_GT(key_d, key_f);
-  EXPECT_GT(key_e, key_f);
-  EXPECT_FALSE(key_f > key_f);
-}
-
-TEST(TaskSchedulerSequenceSortKeyTest, OperatorEqual) {
-  SequenceSortKey key_a(TaskPriority::USER_BLOCKING,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_b(TaskPriority::USER_BLOCKING,
-                        TimeTicks::FromInternalValue(2000));
-  SequenceSortKey key_c(TaskPriority::USER_VISIBLE,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_d(TaskPriority::USER_VISIBLE,
-                        TimeTicks::FromInternalValue(2000));
-  SequenceSortKey key_e(TaskPriority::BACKGROUND,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_f(TaskPriority::BACKGROUND,
-                        TimeTicks::FromInternalValue(2000));
-
-  EXPECT_EQ(key_a, key_a);
-  EXPECT_FALSE(key_b == key_a);
-  EXPECT_FALSE(key_c == key_a);
-  EXPECT_FALSE(key_d == key_a);
-  EXPECT_FALSE(key_e == key_a);
-  EXPECT_FALSE(key_f == key_a);
-
-  EXPECT_FALSE(key_a == key_b);
-  EXPECT_EQ(key_b, key_b);
-  EXPECT_FALSE(key_c == key_b);
-  EXPECT_FALSE(key_d == key_b);
-  EXPECT_FALSE(key_e == key_b);
-  EXPECT_FALSE(key_f == key_b);
-
-  EXPECT_FALSE(key_a == key_c);
-  EXPECT_FALSE(key_b == key_c);
-  EXPECT_EQ(key_c, key_c);
-  EXPECT_FALSE(key_d == key_c);
-  EXPECT_FALSE(key_e == key_c);
-  EXPECT_FALSE(key_f == key_c);
-
-  EXPECT_FALSE(key_a == key_d);
-  EXPECT_FALSE(key_b == key_d);
-  EXPECT_FALSE(key_c == key_d);
-  EXPECT_EQ(key_d, key_d);
-  EXPECT_FALSE(key_e == key_d);
-  EXPECT_FALSE(key_f == key_d);
-
-  EXPECT_FALSE(key_a == key_e);
-  EXPECT_FALSE(key_b == key_e);
-  EXPECT_FALSE(key_c == key_e);
-  EXPECT_FALSE(key_d == key_e);
-  EXPECT_EQ(key_e, key_e);
-  EXPECT_FALSE(key_f == key_e);
-
-  EXPECT_FALSE(key_a == key_f);
-  EXPECT_FALSE(key_b == key_f);
-  EXPECT_FALSE(key_c == key_f);
-  EXPECT_FALSE(key_d == key_f);
-  EXPECT_FALSE(key_e == key_f);
-  EXPECT_EQ(key_f, key_f);
-}
-
-TEST(TaskSchedulerSequenceSortKeyTest, OperatorNotEqual) {
-  SequenceSortKey key_a(TaskPriority::USER_BLOCKING,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_b(TaskPriority::USER_BLOCKING,
-                        TimeTicks::FromInternalValue(2000));
-  SequenceSortKey key_c(TaskPriority::USER_VISIBLE,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_d(TaskPriority::USER_VISIBLE,
-                        TimeTicks::FromInternalValue(2000));
-  SequenceSortKey key_e(TaskPriority::BACKGROUND,
-                        TimeTicks::FromInternalValue(1000));
-  SequenceSortKey key_f(TaskPriority::BACKGROUND,
-                        TimeTicks::FromInternalValue(2000));
-
-  EXPECT_FALSE(key_a != key_a);
-  EXPECT_NE(key_b, key_a);
-  EXPECT_NE(key_c, key_a);
-  EXPECT_NE(key_d, key_a);
-  EXPECT_NE(key_e, key_a);
-  EXPECT_NE(key_f, key_a);
-
-  EXPECT_NE(key_a, key_b);
-  EXPECT_FALSE(key_b != key_b);
-  EXPECT_NE(key_c, key_b);
-  EXPECT_NE(key_d, key_b);
-  EXPECT_NE(key_e, key_b);
-  EXPECT_NE(key_f, key_b);
-
-  EXPECT_NE(key_a, key_c);
-  EXPECT_NE(key_b, key_c);
-  EXPECT_FALSE(key_c != key_c);
-  EXPECT_NE(key_d, key_c);
-  EXPECT_NE(key_e, key_c);
-  EXPECT_NE(key_f, key_c);
-
-  EXPECT_NE(key_a, key_d);
-  EXPECT_NE(key_b, key_d);
-  EXPECT_NE(key_c, key_d);
-  EXPECT_FALSE(key_d != key_d);
-  EXPECT_NE(key_e, key_d);
-  EXPECT_NE(key_f, key_d);
-
-  EXPECT_NE(key_a, key_e);
-  EXPECT_NE(key_b, key_e);
-  EXPECT_NE(key_c, key_e);
-  EXPECT_NE(key_d, key_e);
-  EXPECT_FALSE(key_e != key_e);
-  EXPECT_NE(key_f, key_e);
-
-  EXPECT_NE(key_a, key_f);
-  EXPECT_NE(key_b, key_f);
-  EXPECT_NE(key_c, key_f);
-  EXPECT_NE(key_d, key_f);
-  EXPECT_NE(key_e, key_f);
-  EXPECT_FALSE(key_f != key_f);
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/sequence_unittest.cc b/base/task_scheduler/sequence_unittest.cc
deleted file mode 100644
index 86d1547..0000000
--- a/base/task_scheduler/sequence_unittest.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/sequence.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/memory/ptr_util.h"
-#include "base/test/gtest_util.h"
-#include "base/time/time.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-namespace {
-
-class MockTask {
- public:
-  MOCK_METHOD0(Run, void());
-};
-
-Task CreateTask(MockTask* mock_task) {
-  return Task(FROM_HERE, BindOnce(&MockTask::Run, Unretained(mock_task)),
-              {TaskPriority::BACKGROUND}, TimeDelta());
-}
-
-void ExpectMockTask(MockTask* mock_task, Task* task) {
-  EXPECT_CALL(*mock_task, Run());
-  std::move(task->task).Run();
-  testing::Mock::VerifyAndClear(mock_task);
-}
-
-}  // namespace
-
-TEST(TaskSchedulerSequenceTest, PushTakeRemove) {
-  testing::StrictMock<MockTask> mock_task_a;
-  testing::StrictMock<MockTask> mock_task_b;
-  testing::StrictMock<MockTask> mock_task_c;
-  testing::StrictMock<MockTask> mock_task_d;
-  testing::StrictMock<MockTask> mock_task_e;
-
-  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>();
-
-  // Push task A in the sequence. PushTask() should return true since it's the
-  // first task->
-  EXPECT_TRUE(sequence->PushTask(CreateTask(&mock_task_a)));
-
-  // Push task B, C and D in the sequence. PushTask() should return false since
-  // there is already a task in a sequence.
-  EXPECT_FALSE(sequence->PushTask(CreateTask(&mock_task_b)));
-  EXPECT_FALSE(sequence->PushTask(CreateTask(&mock_task_c)));
-  EXPECT_FALSE(sequence->PushTask(CreateTask(&mock_task_d)));
-
-  // Take the task in front of the sequence. It should be task A.
-  Optional<Task> task = sequence->TakeTask();
-  ExpectMockTask(&mock_task_a, &task.value());
-  EXPECT_FALSE(task->sequenced_time.is_null());
-
-  // Remove the empty slot. Task B should now be in front.
-  EXPECT_FALSE(sequence->Pop());
-  task = sequence->TakeTask();
-  ExpectMockTask(&mock_task_b, &task.value());
-  EXPECT_FALSE(task->sequenced_time.is_null());
-
-  // Remove the empty slot. Task C should now be in front.
-  EXPECT_FALSE(sequence->Pop());
-  task = sequence->TakeTask();
-  ExpectMockTask(&mock_task_c, &task.value());
-  EXPECT_FALSE(task->sequenced_time.is_null());
-
-  // Remove the empty slot.
-  EXPECT_FALSE(sequence->Pop());
-
-  // Push task E in the sequence.
-  EXPECT_FALSE(sequence->PushTask(CreateTask(&mock_task_e)));
-
-  // Task D should be in front.
-  task = sequence->TakeTask();
-  ExpectMockTask(&mock_task_d, &task.value());
-  EXPECT_FALSE(task->sequenced_time.is_null());
-
-  // Remove the empty slot. Task E should now be in front.
-  EXPECT_FALSE(sequence->Pop());
-  task = sequence->TakeTask();
-  ExpectMockTask(&mock_task_e, &task.value());
-  EXPECT_FALSE(task->sequenced_time.is_null());
-
-  // Remove the empty slot. The sequence should now be empty.
-  EXPECT_TRUE(sequence->Pop());
-}
-
-// Verifies the sort key of a sequence that contains one BACKGROUND task.
-TEST(TaskSchedulerSequenceTest, GetSortKeyBackground) {
-  // Create a sequence with a BACKGROUND task.
-  Task background_task(FROM_HERE, DoNothing(), {TaskPriority::BACKGROUND},
-                       TimeDelta());
-  scoped_refptr<Sequence> background_sequence = MakeRefCounted<Sequence>();
-  background_sequence->PushTask(std::move(background_task));
-
-  // Get the sort key.
-  const SequenceSortKey background_sort_key = background_sequence->GetSortKey();
-
-  // Take the task from the sequence, so that its sequenced time is available
-  // for the check below.
-  auto take_background_task = background_sequence->TakeTask();
-
-  // Verify the sort key.
-  EXPECT_EQ(TaskPriority::BACKGROUND, background_sort_key.priority());
-  EXPECT_EQ(take_background_task->sequenced_time,
-            background_sort_key.next_task_sequenced_time());
-
-  // Pop for correctness.
-  background_sequence->Pop();
-}
-
-// Same as TaskSchedulerSequenceTest.GetSortKeyBackground, but with a
-// USER_VISIBLE task.
-TEST(TaskSchedulerSequenceTest, GetSortKeyForeground) {
-  // Create a sequence with a USER_VISIBLE task.
-  Task foreground_task(FROM_HERE, DoNothing(), {TaskPriority::USER_VISIBLE},
-                       TimeDelta());
-  scoped_refptr<Sequence> foreground_sequence = MakeRefCounted<Sequence>();
-  foreground_sequence->PushTask(std::move(foreground_task));
-
-  // Get the sort key.
-  const SequenceSortKey foreground_sort_key = foreground_sequence->GetSortKey();
-
-  // Take the task from the sequence, so that its sequenced time is available
-  // for the check below.
-  auto take_foreground_task = foreground_sequence->TakeTask();
-
-  // Verify the sort key.
-  EXPECT_EQ(TaskPriority::USER_VISIBLE, foreground_sort_key.priority());
-  EXPECT_EQ(take_foreground_task->sequenced_time,
-            foreground_sort_key.next_task_sequenced_time());
-
-  // Pop for correctness.
-  foreground_sequence->Pop();
-}
-
-// Verify that a DCHECK fires if Pop() is called on a sequence whose front slot
-// isn't empty.
-TEST(TaskSchedulerSequenceTest, PopNonEmptyFrontSlot) {
-  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>();
-  sequence->PushTask(Task(FROM_HERE, DoNothing(), TaskTraits(), TimeDelta()));
-
-  EXPECT_DCHECK_DEATH({ sequence->Pop(); });
-}
-
-// Verify that a DCHECK fires if TakeTask() is called on a sequence whose front
-// slot is empty.
-TEST(TaskSchedulerSequenceTest, TakeEmptyFrontSlot) {
-  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>();
-  sequence->PushTask(Task(FROM_HERE, DoNothing(), TaskTraits(), TimeDelta()));
-
-  EXPECT_TRUE(sequence->TakeTask());
-  EXPECT_DCHECK_DEATH({ sequence->TakeTask(); });
-}
-
-// Verify that a DCHECK fires if TakeTask() is called on an empty sequence.
-TEST(TaskSchedulerSequenceTest, TakeEmptySequence) {
-  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>();
-  EXPECT_DCHECK_DEATH({ sequence->TakeTask(); });
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/service_thread_unittest.cc b/base/task_scheduler/service_thread_unittest.cc
deleted file mode 100644
index df4d8d6..0000000
--- a/base/task_scheduler/service_thread_unittest.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/service_thread.h"
-
-#include <string>
-
-#include "base/bind.h"
-#include "base/debug/stack_trace.h"
-#include "base/task_scheduler/task_scheduler.h"
-#include "base/task_scheduler/task_scheduler_impl.h"
-#include "base/test/histogram_tester.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-namespace {
-
-// Verifies that |query| is found on the current stack. Ignores failures if this
-// configuration doesn't have symbols.
-void VerifyHasStringOnStack(const std::string& query) {
-  const std::string stack = debug::StackTrace().ToString();
-  SCOPED_TRACE(stack);
-  const bool found_on_stack = stack.find(query) != std::string::npos;
-  const bool stack_has_symbols =
-      stack.find("SchedulerWorker") != std::string::npos;
-  EXPECT_TRUE(found_on_stack || !stack_has_symbols) << query;
-}
-
-}  // namespace
-
-#if defined(OS_POSIX)
-// Many POSIX bots flakily crash on |debug::StackTrace().ToString()|,
-// https://crbug.com/840429.
-#define MAYBE_StackHasIdentifyingFrame DISABLED_StackHasIdentifyingFrame
-#else
-#define MAYBE_StackHasIdentifyingFrame StackHasIdentifyingFrame
-#endif
-
-TEST(TaskSchedulerServiceThreadTest, MAYBE_StackHasIdentifyingFrame) {
-  ServiceThread service_thread(nullptr);
-  service_thread.Start();
-
-  service_thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&VerifyHasStringOnStack, "ServiceThread"));
-
-  service_thread.FlushForTesting();
-}
-
-// Integration test verifying that a service thread running in a fully
-// integrated TaskScheduler environment results in reporting
-// HeartbeatLatencyMicroseconds metrics.
-TEST(TaskSchedulerServiceThreadIntegrationTest, HeartbeatLatencyReport) {
-  TaskScheduler::SetInstance(
-      std::make_unique<internal::TaskSchedulerImpl>("Test"));
-  TaskScheduler::GetInstance()->StartWithDefaultParams();
-
-  static constexpr const char* kExpectedMetrics[] = {
-      "TaskScheduler.HeartbeatLatencyMicroseconds.Test."
-      "UserBlockingTaskPriority",
-      "TaskScheduler.HeartbeatLatencyMicroseconds.Test."
-      "UserBlockingTaskPriority_MayBlock",
-      "TaskScheduler.HeartbeatLatencyMicroseconds.Test."
-      "UserVisibleTaskPriority",
-      "TaskScheduler.HeartbeatLatencyMicroseconds.Test."
-      "UserVisibleTaskPriority_MayBlock",
-      "TaskScheduler.HeartbeatLatencyMicroseconds.Test."
-      "BackgroundTaskPriority",
-      "TaskScheduler.HeartbeatLatencyMicroseconds.Test."
-      "BackgroundTaskPriority_MayBlock"};
-
-  constexpr TimeDelta kReasonableTimeout = TimeDelta::FromSeconds(6);
-  constexpr TimeDelta kBusyWaitTime = TimeDelta::FromMilliseconds(100);
-
-  const TimeTicks start_time = TimeTicks::Now();
-
-  HistogramTester tester;
-  for (const char* expected_metric : kExpectedMetrics) {
-    for (int i = 0; tester.GetAllSamples(expected_metric).empty(); ++i) {
-      if (TimeTicks::Now() - start_time > kReasonableTimeout)
-        LOG(WARNING) << "Waiting a while for " << expected_metric;
-      PlatformThread::Sleep(kBusyWaitTime);
-    }
-  }
-
-  TaskScheduler::GetInstance()->JoinForTesting();
-  TaskScheduler::SetInstance(nullptr);
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/task_scheduler_impl_unittest.cc b/base/task_scheduler/task_scheduler_impl_unittest.cc
deleted file mode 100644
index 6eee033..0000000
--- a/base/task_scheduler/task_scheduler_impl_unittest.cc
+++ /dev/null
@@ -1,823 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/task_scheduler_impl.h"
-
-#include <stddef.h>
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback.h"
-#include "base/debug/stack_trace.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/metrics/field_trial.h"
-#include "base/metrics/field_trial_params.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/scheduler_worker_observer.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/task_scheduler/test_task_factory.h"
-#include "base/task_scheduler/test_utils.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/sequence_local_storage_slot.h"
-#include "base/threading/simple_thread.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_POSIX)
-#include <unistd.h>
-
-#include "base/debug/leak_annotations.h"
-#include "base/files/file_descriptor_watcher_posix.h"
-#include "base/files/file_util.h"
-#include "base/posix/eintr_wrapper.h"
-#endif  // defined(OS_POSIX)
-
-#if defined(OS_WIN)
-#include "base/win/com_init_util.h"
-#endif  // defined(OS_WIN)
-
-namespace base {
-namespace internal {
-
-namespace {
-
-struct TraitsExecutionModePair {
-  TraitsExecutionModePair(const TaskTraits& traits,
-                          test::ExecutionMode execution_mode)
-      : traits(traits), execution_mode(execution_mode) {}
-
-  TaskTraits traits;
-  test::ExecutionMode execution_mode;
-};
-
-#if DCHECK_IS_ON()
-// Returns whether I/O calls are allowed on the current thread.
-bool GetIOAllowed() {
-  const bool previous_value = ThreadRestrictions::SetIOAllowed(true);
-  ThreadRestrictions::SetIOAllowed(previous_value);
-  return previous_value;
-}
-#endif
-
-// Verify that the current thread priority and I/O restrictions are appropriate
-// to run a Task with |traits|.
-// Note: ExecutionMode is verified inside TestTaskFactory.
-void VerifyTaskEnvironment(const TaskTraits& traits) {
-  const bool supports_background_priority =
-      Lock::HandlesMultipleThreadPriorities() &&
-      PlatformThread::CanIncreaseCurrentThreadPriority();
-
-  EXPECT_EQ(supports_background_priority &&
-                    traits.priority() == TaskPriority::BACKGROUND
-                ? ThreadPriority::BACKGROUND
-                : ThreadPriority::NORMAL,
-            PlatformThread::GetCurrentThreadPriority());
-
-#if DCHECK_IS_ON()
-  // The #if above is required because GetIOAllowed() always returns true when
-  // !DCHECK_IS_ON(), even when |traits| don't allow file I/O.
-  EXPECT_EQ(traits.may_block(), GetIOAllowed());
-#endif
-
-  // Verify that the thread the task is running on is named as expected.
-  const std::string current_thread_name(PlatformThread::GetName());
-  EXPECT_NE(std::string::npos, current_thread_name.find("TaskScheduler"));
-  EXPECT_NE(std::string::npos,
-            current_thread_name.find(
-                traits.priority() == TaskPriority::BACKGROUND ? "Background"
-                                                              : "Foreground"));
-  EXPECT_EQ(traits.may_block(),
-            current_thread_name.find("Blocking") != std::string::npos);
-}
-
-void VerifyTaskEnvironmentAndSignalEvent(const TaskTraits& traits,
-                                         WaitableEvent* event) {
-  DCHECK(event);
-  VerifyTaskEnvironment(traits);
-  event->Signal();
-}
-
-void VerifyTimeAndTaskEnvironmentAndSignalEvent(const TaskTraits& traits,
-                                                TimeTicks expected_time,
-                                                WaitableEvent* event) {
-  DCHECK(event);
-  EXPECT_LE(expected_time, TimeTicks::Now());
-  VerifyTaskEnvironment(traits);
-  event->Signal();
-}
-
-scoped_refptr<TaskRunner> CreateTaskRunnerWithTraitsAndExecutionMode(
-    TaskScheduler* scheduler,
-    const TaskTraits& traits,
-    test::ExecutionMode execution_mode,
-    SingleThreadTaskRunnerThreadMode default_single_thread_task_runner_mode =
-        SingleThreadTaskRunnerThreadMode::SHARED) {
-  switch (execution_mode) {
-    case test::ExecutionMode::PARALLEL:
-      return scheduler->CreateTaskRunnerWithTraits(traits);
-    case test::ExecutionMode::SEQUENCED:
-      return scheduler->CreateSequencedTaskRunnerWithTraits(traits);
-    case test::ExecutionMode::SINGLE_THREADED: {
-      return scheduler->CreateSingleThreadTaskRunnerWithTraits(
-          traits, default_single_thread_task_runner_mode);
-    }
-  }
-  ADD_FAILURE() << "Unknown ExecutionMode";
-  return nullptr;
-}
-
-class ThreadPostingTasks : public SimpleThread {
- public:
-  // Creates a thread that posts Tasks to |scheduler| with |traits| and
-  // |execution_mode|.
-  ThreadPostingTasks(TaskSchedulerImpl* scheduler,
-                     const TaskTraits& traits,
-                     test::ExecutionMode execution_mode)
-      : SimpleThread("ThreadPostingTasks"),
-        traits_(traits),
-        factory_(CreateTaskRunnerWithTraitsAndExecutionMode(scheduler,
-                                                            traits,
-                                                            execution_mode),
-                 execution_mode) {}
-
-  void WaitForAllTasksToRun() { factory_.WaitForAllTasksToRun(); }
-
- private:
-  void Run() override {
-    EXPECT_FALSE(factory_.task_runner()->RunsTasksInCurrentSequence());
-
-    const size_t kNumTasksPerThread = 150;
-    for (size_t i = 0; i < kNumTasksPerThread; ++i) {
-      factory_.PostTask(test::TestTaskFactory::PostNestedTask::NO,
-                        Bind(&VerifyTaskEnvironment, traits_));
-    }
-  }
-
-  const TaskTraits traits_;
-  test::TestTaskFactory factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadPostingTasks);
-};
-
-// Returns a vector with a TraitsExecutionModePair for each valid
-// combination of {ExecutionMode, TaskPriority, MayBlock()}.
-std::vector<TraitsExecutionModePair> GetTraitsExecutionModePairs() {
-  std::vector<TraitsExecutionModePair> params;
-
-  const test::ExecutionMode execution_modes[] = {
-      test::ExecutionMode::PARALLEL, test::ExecutionMode::SEQUENCED,
-      test::ExecutionMode::SINGLE_THREADED};
-
-  for (test::ExecutionMode execution_mode : execution_modes) {
-    for (size_t priority_index = static_cast<size_t>(TaskPriority::LOWEST);
-         priority_index <= static_cast<size_t>(TaskPriority::HIGHEST);
-         ++priority_index) {
-      const TaskPriority priority = static_cast<TaskPriority>(priority_index);
-      params.push_back(TraitsExecutionModePair({priority}, execution_mode));
-      params.push_back(TraitsExecutionModePair({MayBlock()}, execution_mode));
-    }
-  }
-
-  return params;
-}
-
-class TaskSchedulerImplTest
-    : public testing::TestWithParam<TraitsExecutionModePair> {
- protected:
-  TaskSchedulerImplTest() : scheduler_("Test"), field_trial_list_(nullptr) {}
-
-  void EnableAllTasksUserBlocking() {
-    constexpr char kFieldTrialName[] = "BrowserScheduler";
-    constexpr char kFieldTrialTestGroup[] = "DummyGroup";
-    std::map<std::string, std::string> variation_params;
-    variation_params["AllTasksUserBlocking"] = "true";
-    base::AssociateFieldTrialParams(kFieldTrialName, kFieldTrialTestGroup,
-                                    variation_params);
-    base::FieldTrialList::CreateFieldTrial(kFieldTrialName,
-                                           kFieldTrialTestGroup);
-  }
-
-  void set_scheduler_worker_observer(
-      SchedulerWorkerObserver* scheduler_worker_observer) {
-    scheduler_worker_observer_ = scheduler_worker_observer;
-  }
-
-  void StartTaskScheduler() {
-    constexpr TimeDelta kSuggestedReclaimTime = TimeDelta::FromSeconds(30);
-    constexpr int kMaxNumBackgroundThreads = 1;
-    constexpr int kMaxNumBackgroundBlockingThreads = 3;
-    constexpr int kMaxNumForegroundThreads = 4;
-    constexpr int kMaxNumForegroundBlockingThreads = 12;
-
-    scheduler_.Start(
-        {{kMaxNumBackgroundThreads, kSuggestedReclaimTime},
-         {kMaxNumBackgroundBlockingThreads, kSuggestedReclaimTime},
-         {kMaxNumForegroundThreads, kSuggestedReclaimTime},
-         {kMaxNumForegroundBlockingThreads, kSuggestedReclaimTime}},
-        scheduler_worker_observer_);
-  }
-
-  void TearDown() override {
-    if (did_tear_down_)
-      return;
-
-    scheduler_.FlushForTesting();
-    scheduler_.JoinForTesting();
-    did_tear_down_ = true;
-  }
-
-  TaskSchedulerImpl scheduler_;
-
- private:
-  base::FieldTrialList field_trial_list_;
-  SchedulerWorkerObserver* scheduler_worker_observer_ = nullptr;
-  bool did_tear_down_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerImplTest);
-};
-
-}  // namespace
-
-// Verifies that a Task posted via PostDelayedTaskWithTraits with parameterized
-// TaskTraits and no delay runs on a thread with the expected priority and I/O
-// restrictions. The ExecutionMode parameter is ignored by this test.
-TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsNoDelay) {
-  StartTaskScheduler();
-  WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
-                         WaitableEvent::InitialState::NOT_SIGNALED);
-  scheduler_.PostDelayedTaskWithTraits(
-      FROM_HERE, GetParam().traits,
-      BindOnce(&VerifyTaskEnvironmentAndSignalEvent, GetParam().traits,
-               Unretained(&task_ran)),
-      TimeDelta());
-  task_ran.Wait();
-}
-
-// Verifies that a Task posted via PostDelayedTaskWithTraits with parameterized
-// TaskTraits and a non-zero delay runs on a thread with the expected priority
-// and I/O restrictions after the delay expires. The ExecutionMode parameter is
-// ignored by this test.
-TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsWithDelay) {
-  StartTaskScheduler();
-  WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
-                         WaitableEvent::InitialState::NOT_SIGNALED);
-  scheduler_.PostDelayedTaskWithTraits(
-      FROM_HERE, GetParam().traits,
-      BindOnce(&VerifyTimeAndTaskEnvironmentAndSignalEvent, GetParam().traits,
-               TimeTicks::Now() + TestTimeouts::tiny_timeout(),
-               Unretained(&task_ran)),
-      TestTimeouts::tiny_timeout());
-  task_ran.Wait();
-}
-
-// Verifies that Tasks posted via a TaskRunner with parameterized TaskTraits and
-// ExecutionMode run on a thread with the expected priority and I/O restrictions
-// and respect the characteristics of their ExecutionMode.
-TEST_P(TaskSchedulerImplTest, PostTasksViaTaskRunner) {
-  StartTaskScheduler();
-  test::TestTaskFactory factory(
-      CreateTaskRunnerWithTraitsAndExecutionMode(&scheduler_, GetParam().traits,
-                                                 GetParam().execution_mode),
-      GetParam().execution_mode);
-  EXPECT_FALSE(factory.task_runner()->RunsTasksInCurrentSequence());
-
-  const size_t kNumTasksPerTest = 150;
-  for (size_t i = 0; i < kNumTasksPerTest; ++i) {
-    factory.PostTask(test::TestTaskFactory::PostNestedTask::NO,
-                     Bind(&VerifyTaskEnvironment, GetParam().traits));
-  }
-
-  factory.WaitForAllTasksToRun();
-}
-
-// Verifies that a task posted via PostDelayedTaskWithTraits without a delay
-// doesn't run before Start() is called.
-TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsNoDelayBeforeStart) {
-  WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  scheduler_.PostDelayedTaskWithTraits(
-      FROM_HERE, GetParam().traits,
-      BindOnce(&VerifyTaskEnvironmentAndSignalEvent, GetParam().traits,
-               Unretained(&task_running)),
-      TimeDelta());
-
-  // Wait a little bit to make sure that the task doesn't run before Start().
-  // Note: This test won't catch a case where the task runs just after the check
-  // and before Start(). However, we expect the test to be flaky if the tested
-  // code allows that to happen.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_FALSE(task_running.IsSignaled());
-
-  StartTaskScheduler();
-  task_running.Wait();
-}
-
-// Verifies that a task posted via PostDelayedTaskWithTraits with a delay
-// doesn't run before Start() is called.
-TEST_P(TaskSchedulerImplTest, PostDelayedTaskWithTraitsWithDelayBeforeStart) {
-  WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  scheduler_.PostDelayedTaskWithTraits(
-      FROM_HERE, GetParam().traits,
-      BindOnce(&VerifyTimeAndTaskEnvironmentAndSignalEvent, GetParam().traits,
-               TimeTicks::Now() + TestTimeouts::tiny_timeout(),
-               Unretained(&task_running)),
-      TestTimeouts::tiny_timeout());
-
-  // Wait a little bit to make sure that the task doesn't run before Start().
-  // Note: This test won't catch a case where the task runs just after the check
-  // and before Start(). However, we expect the test to be flaky if the tested
-  // code allows that to happen.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_FALSE(task_running.IsSignaled());
-
-  StartTaskScheduler();
-  task_running.Wait();
-}
-
-// Verifies that a task posted via a TaskRunner doesn't run before Start() is
-// called.
-TEST_P(TaskSchedulerImplTest, PostTaskViaTaskRunnerBeforeStart) {
-  WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  CreateTaskRunnerWithTraitsAndExecutionMode(&scheduler_, GetParam().traits,
-                                             GetParam().execution_mode)
-      ->PostTask(FROM_HERE,
-                 BindOnce(&VerifyTaskEnvironmentAndSignalEvent,
-                          GetParam().traits, Unretained(&task_running)));
-
-  // Wait a little bit to make sure that the task doesn't run before Start().
-  // Note: This test won't catch a case where the task runs just after the check
-  // and before Start(). However, we expect the test to be flaky if the tested
-  // code allows that to happen.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_FALSE(task_running.IsSignaled());
-
-  StartTaskScheduler();
-
-  // This should not hang if the task runs after Start().
-  task_running.Wait();
-}
-
-// Verify that all tasks posted to a TaskRunner after Start() run in a
-// USER_BLOCKING environment when the AllTasksUserBlocking variation param of
-// the BrowserScheduler experiment is true.
-TEST_P(TaskSchedulerImplTest, AllTasksAreUserBlockingTaskRunner) {
-  EnableAllTasksUserBlocking();
-  StartTaskScheduler();
-
-  WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  CreateTaskRunnerWithTraitsAndExecutionMode(&scheduler_, GetParam().traits,
-                                             GetParam().execution_mode)
-      ->PostTask(FROM_HERE,
-                 BindOnce(&VerifyTaskEnvironmentAndSignalEvent,
-                          TaskTraits::Override(GetParam().traits,
-                                               {TaskPriority::USER_BLOCKING}),
-                          Unretained(&task_running)));
-  task_running.Wait();
-}
-
-// Verify that all tasks posted via PostDelayedTaskWithTraits() after Start()
-// run in a USER_BLOCKING environment when the AllTasksUserBlocking variation
-// param of the BrowserScheduler experiment is true.
-TEST_P(TaskSchedulerImplTest, AllTasksAreUserBlocking) {
-  EnableAllTasksUserBlocking();
-  StartTaskScheduler();
-
-  WaitableEvent task_running(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  // Ignore |params.execution_mode| in this test.
-  scheduler_.PostDelayedTaskWithTraits(
-      FROM_HERE, GetParam().traits,
-      BindOnce(&VerifyTaskEnvironmentAndSignalEvent,
-               TaskTraits::Override(GetParam().traits,
-                                    {TaskPriority::USER_BLOCKING}),
-               Unretained(&task_running)),
-      TimeDelta());
-  task_running.Wait();
-}
-
-// Verifies that FlushAsyncForTesting() calls back correctly for all trait and
-// execution mode pairs.
-TEST_P(TaskSchedulerImplTest, FlushAsyncForTestingSimple) {
-  StartTaskScheduler();
-
-  WaitableEvent unblock_task(WaitableEvent::ResetPolicy::MANUAL,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  CreateTaskRunnerWithTraitsAndExecutionMode(
-      &scheduler_,
-      TaskTraits::Override(GetParam().traits, {WithBaseSyncPrimitives()}),
-      GetParam().execution_mode, SingleThreadTaskRunnerThreadMode::DEDICATED)
-      ->PostTask(FROM_HERE,
-                 BindOnce(&WaitableEvent::Wait, Unretained(&unblock_task)));
-
-  WaitableEvent flush_event(WaitableEvent::ResetPolicy::MANUAL,
-                            WaitableEvent::InitialState::NOT_SIGNALED);
-  scheduler_.FlushAsyncForTesting(
-      BindOnce(&WaitableEvent::Signal, Unretained(&flush_event)));
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_FALSE(flush_event.IsSignaled());
-
-  unblock_task.Signal();
-
-  flush_event.Wait();
-}
-
-INSTANTIATE_TEST_CASE_P(OneTraitsExecutionModePair,
-                        TaskSchedulerImplTest,
-                        ::testing::ValuesIn(GetTraitsExecutionModePairs()));
-
-// Spawns threads that simultaneously post Tasks to TaskRunners with various
-// TaskTraits and ExecutionModes. Verifies that each Task runs on a thread with
-// the expected priority and I/O restrictions and respects the characteristics
-// of its ExecutionMode.
-TEST_F(TaskSchedulerImplTest, MultipleTraitsExecutionModePairs) {
-  StartTaskScheduler();
-  std::vector<std::unique_ptr<ThreadPostingTasks>> threads_posting_tasks;
-  for (const auto& traits_execution_mode_pair : GetTraitsExecutionModePairs()) {
-    threads_posting_tasks.push_back(WrapUnique(
-        new ThreadPostingTasks(&scheduler_, traits_execution_mode_pair.traits,
-                               traits_execution_mode_pair.execution_mode)));
-    threads_posting_tasks.back()->Start();
-  }
-
-  for (const auto& thread : threads_posting_tasks) {
-    thread->WaitForAllTasksToRun();
-    thread->Join();
-  }
-}
-
-TEST_F(TaskSchedulerImplTest,
-       GetMaxConcurrentNonBlockedTasksWithTraitsDeprecated) {
-  StartTaskScheduler();
-  EXPECT_EQ(1, scheduler_.GetMaxConcurrentNonBlockedTasksWithTraitsDeprecated(
-                   {TaskPriority::BACKGROUND}));
-  EXPECT_EQ(3, scheduler_.GetMaxConcurrentNonBlockedTasksWithTraitsDeprecated(
-                   {MayBlock(), TaskPriority::BACKGROUND}));
-  EXPECT_EQ(4, scheduler_.GetMaxConcurrentNonBlockedTasksWithTraitsDeprecated(
-                   {TaskPriority::USER_VISIBLE}));
-  EXPECT_EQ(12, scheduler_.GetMaxConcurrentNonBlockedTasksWithTraitsDeprecated(
-                    {MayBlock(), TaskPriority::USER_VISIBLE}));
-  EXPECT_EQ(4, scheduler_.GetMaxConcurrentNonBlockedTasksWithTraitsDeprecated(
-                   {TaskPriority::USER_BLOCKING}));
-  EXPECT_EQ(12, scheduler_.GetMaxConcurrentNonBlockedTasksWithTraitsDeprecated(
-                    {MayBlock(), TaskPriority::USER_BLOCKING}));
-}
-
-// Verify that the RunsTasksInCurrentSequence() method of a SequencedTaskRunner
-// returns false when called from a task that isn't part of the sequence.
-TEST_F(TaskSchedulerImplTest, SequencedRunsTasksInCurrentSequence) {
-  StartTaskScheduler();
-  auto single_thread_task_runner =
-      scheduler_.CreateSingleThreadTaskRunnerWithTraits(
-          TaskTraits(), SingleThreadTaskRunnerThreadMode::SHARED);
-  auto sequenced_task_runner =
-      scheduler_.CreateSequencedTaskRunnerWithTraits(TaskTraits());
-
-  WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
-                         WaitableEvent::InitialState::NOT_SIGNALED);
-  single_thread_task_runner->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](scoped_refptr<TaskRunner> sequenced_task_runner,
-             WaitableEvent* task_ran) {
-            EXPECT_FALSE(sequenced_task_runner->RunsTasksInCurrentSequence());
-            task_ran->Signal();
-          },
-          sequenced_task_runner, Unretained(&task_ran)));
-  task_ran.Wait();
-}
-
-// Verify that the RunsTasksInCurrentSequence() method of a
-// SingleThreadTaskRunner returns false when called from a task that isn't part
-// of the sequence.
-TEST_F(TaskSchedulerImplTest, SingleThreadRunsTasksInCurrentSequence) {
-  StartTaskScheduler();
-  auto sequenced_task_runner =
-      scheduler_.CreateSequencedTaskRunnerWithTraits(TaskTraits());
-  auto single_thread_task_runner =
-      scheduler_.CreateSingleThreadTaskRunnerWithTraits(
-          TaskTraits(), SingleThreadTaskRunnerThreadMode::SHARED);
-
-  WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
-                         WaitableEvent::InitialState::NOT_SIGNALED);
-  sequenced_task_runner->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](scoped_refptr<TaskRunner> single_thread_task_runner,
-             WaitableEvent* task_ran) {
-            EXPECT_FALSE(
-                single_thread_task_runner->RunsTasksInCurrentSequence());
-            task_ran->Signal();
-          },
-          single_thread_task_runner, Unretained(&task_ran)));
-  task_ran.Wait();
-}
-
-#if defined(OS_WIN)
-TEST_F(TaskSchedulerImplTest, COMSTATaskRunnersRunWithCOMSTA) {
-  StartTaskScheduler();
-  auto com_sta_task_runner = scheduler_.CreateCOMSTATaskRunnerWithTraits(
-      TaskTraits(), SingleThreadTaskRunnerThreadMode::SHARED);
-
-  WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
-                         WaitableEvent::InitialState::NOT_SIGNALED);
-  com_sta_task_runner->PostTask(
-      FROM_HERE, Bind(
-                     [](WaitableEvent* task_ran) {
-                       win::AssertComApartmentType(win::ComApartmentType::STA);
-                       task_ran->Signal();
-                     },
-                     Unretained(&task_ran)));
-  task_ran.Wait();
-}
-#endif  // defined(OS_WIN)
-
-TEST_F(TaskSchedulerImplTest, DelayedTasksNotRunAfterShutdown) {
-  StartTaskScheduler();
-  // As with delayed tasks in general, this is racy. If the task does happen to
-  // run after Shutdown within the timeout, it will fail this test.
-  //
-  // The timeout should be set sufficiently long enough to ensure that the
-  // delayed task did not run. 2x is generally good enough.
-  //
-  // A non-racy way to do this would be to post two sequenced tasks:
-  // 1) Regular Post Task: A WaitableEvent.Wait
-  // 2) Delayed Task: ADD_FAILURE()
-  // and signalling the WaitableEvent after Shutdown() on a different thread
-  // since Shutdown() will block. However, the cost of managing this extra
-  // thread was deemed to be too great for the unlikely race.
-  scheduler_.PostDelayedTaskWithTraits(FROM_HERE, TaskTraits(),
-                                       BindOnce([]() { ADD_FAILURE(); }),
-                                       TestTimeouts::tiny_timeout());
-  scheduler_.Shutdown();
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout() * 2);
-}
-
-#if defined(OS_POSIX)
-
-TEST_F(TaskSchedulerImplTest, FileDescriptorWatcherNoOpsAfterShutdown) {
-  StartTaskScheduler();
-
-  int pipes[2];
-  ASSERT_EQ(0, pipe(pipes));
-
-  scoped_refptr<TaskRunner> blocking_task_runner =
-      scheduler_.CreateSequencedTaskRunnerWithTraits(
-          {TaskShutdownBehavior::BLOCK_SHUTDOWN});
-  blocking_task_runner->PostTask(
-      FROM_HERE,
-      BindOnce(
-          [](int read_fd) {
-            std::unique_ptr<FileDescriptorWatcher::Controller> controller =
-                FileDescriptorWatcher::WatchReadable(
-                    read_fd, BindRepeating([]() { NOTREACHED(); }));
-
-            // This test is for components that intentionally leak their
-            // watchers at shutdown. We can't clean |controller| up because its
-            // destructor will assert that it's being called from the correct
-            // sequence. After the task scheduler is shutdown, it is not
-            // possible to run tasks on this sequence.
-            //
-            // Note: Do not inline the controller.release() call into the
-            //       ANNOTATE_LEAKING_OBJECT_PTR as the annotation is removed
-            //       by the preprocessor in non-LEAK_SANITIZER builds,
-            //       effectively breaking this test.
-            ANNOTATE_LEAKING_OBJECT_PTR(controller.get());
-            controller.release();
-          },
-          pipes[0]));
-
-  scheduler_.Shutdown();
-
-  constexpr char kByte = '!';
-  ASSERT_TRUE(WriteFileDescriptor(pipes[1], &kByte, sizeof(kByte)));
-
-  // Give a chance for the file watcher to fire before closing the handles.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-
-  EXPECT_EQ(0, IGNORE_EINTR(close(pipes[0])));
-  EXPECT_EQ(0, IGNORE_EINTR(close(pipes[1])));
-}
-#endif  // defined(OS_POSIX)
-
-// Verify that tasks posted on the same sequence access the same values on
-// SequenceLocalStorage, and tasks on different sequences see different values.
-TEST_F(TaskSchedulerImplTest, SequenceLocalStorage) {
-  StartTaskScheduler();
-
-  SequenceLocalStorageSlot<int> slot;
-  auto sequenced_task_runner1 =
-      scheduler_.CreateSequencedTaskRunnerWithTraits(TaskTraits());
-  auto sequenced_task_runner2 =
-      scheduler_.CreateSequencedTaskRunnerWithTraits(TaskTraits());
-
-  sequenced_task_runner1->PostTask(
-      FROM_HERE,
-      BindOnce([](SequenceLocalStorageSlot<int>* slot) { slot->Set(11); },
-               &slot));
-
-  sequenced_task_runner1->PostTask(FROM_HERE,
-                                   BindOnce(
-                                       [](SequenceLocalStorageSlot<int>* slot) {
-                                         EXPECT_EQ(slot->Get(), 11);
-                                       },
-                                       &slot));
-
-  sequenced_task_runner2->PostTask(FROM_HERE,
-                                   BindOnce(
-                                       [](SequenceLocalStorageSlot<int>* slot) {
-                                         EXPECT_NE(slot->Get(), 11);
-                                       },
-                                       &slot));
-
-  scheduler_.FlushForTesting();
-}
-
-TEST_F(TaskSchedulerImplTest, FlushAsyncNoTasks) {
-  StartTaskScheduler();
-  bool called_back = false;
-  scheduler_.FlushAsyncForTesting(
-      BindOnce([](bool* called_back) { *called_back = true; },
-               Unretained(&called_back)));
-  EXPECT_TRUE(called_back);
-}
-
-namespace {
-
-// Verifies that |query| is found on the current stack. Ignores failures if this
-// configuration doesn't have symbols.
-void VerifyHasStringOnStack(const std::string& query) {
-  const std::string stack = debug::StackTrace().ToString();
-  SCOPED_TRACE(stack);
-  const bool found_on_stack = stack.find(query) != std::string::npos;
-  const bool stack_has_symbols =
-      stack.find("SchedulerWorker") != std::string::npos;
-  EXPECT_TRUE(found_on_stack || !stack_has_symbols) << query;
-}
-
-}  // namespace
-
-#if defined(OS_POSIX)
-// Many POSIX bots flakily crash on |debug::StackTrace().ToString()|,
-// https://crbug.com/840429.
-#define MAYBE_IdentifiableStacks DISABLED_IdentifiableStacks
-#else
-#define MAYBE_IdentifiableStacks IdentifiableStacks
-#endif
-
-// Integration test that verifies that workers have a frame on their stacks
-// which easily identifies the type of worker (useful to diagnose issues from
-// logs without memory dumps).
-TEST_F(TaskSchedulerImplTest, MAYBE_IdentifiableStacks) {
-  StartTaskScheduler();
-
-  scheduler_.CreateSequencedTaskRunnerWithTraits({})->PostTask(
-      FROM_HERE, BindOnce(&VerifyHasStringOnStack, "RunPooledWorker"));
-  scheduler_.CreateSequencedTaskRunnerWithTraits({TaskPriority::BACKGROUND})
-      ->PostTask(FROM_HERE, BindOnce(&VerifyHasStringOnStack,
-                                     "RunBackgroundPooledWorker"));
-
-  scheduler_
-      .CreateSingleThreadTaskRunnerWithTraits(
-          {}, SingleThreadTaskRunnerThreadMode::SHARED)
-      ->PostTask(FROM_HERE,
-                 BindOnce(&VerifyHasStringOnStack, "RunSharedWorker"));
-  scheduler_
-      .CreateSingleThreadTaskRunnerWithTraits(
-          {TaskPriority::BACKGROUND}, SingleThreadTaskRunnerThreadMode::SHARED)
-      ->PostTask(FROM_HERE, BindOnce(&VerifyHasStringOnStack,
-                                     "RunBackgroundSharedWorker"));
-
-  scheduler_
-      .CreateSingleThreadTaskRunnerWithTraits(
-          {}, SingleThreadTaskRunnerThreadMode::DEDICATED)
-      ->PostTask(FROM_HERE,
-                 BindOnce(&VerifyHasStringOnStack, "RunDedicatedWorker"));
-  scheduler_
-      .CreateSingleThreadTaskRunnerWithTraits(
-          {TaskPriority::BACKGROUND},
-          SingleThreadTaskRunnerThreadMode::DEDICATED)
-      ->PostTask(FROM_HERE, BindOnce(&VerifyHasStringOnStack,
-                                     "RunBackgroundDedicatedWorker"));
-
-#if defined(OS_WIN)
-  scheduler_
-      .CreateCOMSTATaskRunnerWithTraits(
-          {}, SingleThreadTaskRunnerThreadMode::SHARED)
-      ->PostTask(FROM_HERE,
-                 BindOnce(&VerifyHasStringOnStack, "RunSharedCOMWorker"));
-  scheduler_
-      .CreateCOMSTATaskRunnerWithTraits(
-          {TaskPriority::BACKGROUND}, SingleThreadTaskRunnerThreadMode::SHARED)
-      ->PostTask(FROM_HERE, BindOnce(&VerifyHasStringOnStack,
-                                     "RunBackgroundSharedCOMWorker"));
-
-  scheduler_
-      .CreateCOMSTATaskRunnerWithTraits(
-          {}, SingleThreadTaskRunnerThreadMode::DEDICATED)
-      ->PostTask(FROM_HERE,
-                 BindOnce(&VerifyHasStringOnStack, "RunDedicatedCOMWorker"));
-  scheduler_
-      .CreateCOMSTATaskRunnerWithTraits(
-          {TaskPriority::BACKGROUND},
-          SingleThreadTaskRunnerThreadMode::DEDICATED)
-      ->PostTask(FROM_HERE, BindOnce(&VerifyHasStringOnStack,
-                                     "RunBackgroundDedicatedCOMWorker"));
-#endif  // defined(OS_WIN)
-
-  scheduler_.FlushForTesting();
-}
-
-TEST_F(TaskSchedulerImplTest, SchedulerWorkerObserver) {
-  testing::StrictMock<test::MockSchedulerWorkerObserver> observer;
-  set_scheduler_worker_observer(&observer);
-
-// 4 workers should be created for the 4 pools. After that, 8 threads should
-// be created for single-threaded work (16 on Windows).
-#if defined(OS_WIN)
-  constexpr int kExpectedNumWorkers = 20;
-#else
-  constexpr int kExpectedNumWorkers = 12;
-#endif
-  EXPECT_CALL(observer, OnSchedulerWorkerMainEntry())
-      .Times(kExpectedNumWorkers);
-
-  StartTaskScheduler();
-
-  std::vector<scoped_refptr<SingleThreadTaskRunner>> task_runners;
-
-  task_runners.push_back(scheduler_.CreateSingleThreadTaskRunnerWithTraits(
-      {TaskPriority::BACKGROUND}, SingleThreadTaskRunnerThreadMode::SHARED));
-  task_runners.push_back(scheduler_.CreateSingleThreadTaskRunnerWithTraits(
-      {TaskPriority::BACKGROUND, MayBlock()},
-      SingleThreadTaskRunnerThreadMode::SHARED));
-  task_runners.push_back(scheduler_.CreateSingleThreadTaskRunnerWithTraits(
-      {TaskPriority::USER_BLOCKING}, SingleThreadTaskRunnerThreadMode::SHARED));
-  task_runners.push_back(scheduler_.CreateSingleThreadTaskRunnerWithTraits(
-      {TaskPriority::USER_BLOCKING, MayBlock()},
-      SingleThreadTaskRunnerThreadMode::SHARED));
-
-  task_runners.push_back(scheduler_.CreateSingleThreadTaskRunnerWithTraits(
-      {TaskPriority::BACKGROUND}, SingleThreadTaskRunnerThreadMode::DEDICATED));
-  task_runners.push_back(scheduler_.CreateSingleThreadTaskRunnerWithTraits(
-      {TaskPriority::BACKGROUND, MayBlock()},
-      SingleThreadTaskRunnerThreadMode::DEDICATED));
-  task_runners.push_back(scheduler_.CreateSingleThreadTaskRunnerWithTraits(
-      {TaskPriority::USER_BLOCKING},
-      SingleThreadTaskRunnerThreadMode::DEDICATED));
-  task_runners.push_back(scheduler_.CreateSingleThreadTaskRunnerWithTraits(
-      {TaskPriority::USER_BLOCKING, MayBlock()},
-      SingleThreadTaskRunnerThreadMode::DEDICATED));
-
-#if defined(OS_WIN)
-  task_runners.push_back(scheduler_.CreateCOMSTATaskRunnerWithTraits(
-      {TaskPriority::BACKGROUND}, SingleThreadTaskRunnerThreadMode::SHARED));
-  task_runners.push_back(scheduler_.CreateCOMSTATaskRunnerWithTraits(
-      {TaskPriority::BACKGROUND, MayBlock()},
-      SingleThreadTaskRunnerThreadMode::SHARED));
-  task_runners.push_back(scheduler_.CreateCOMSTATaskRunnerWithTraits(
-      {TaskPriority::USER_BLOCKING}, SingleThreadTaskRunnerThreadMode::SHARED));
-  task_runners.push_back(scheduler_.CreateCOMSTATaskRunnerWithTraits(
-      {TaskPriority::USER_BLOCKING, MayBlock()},
-      SingleThreadTaskRunnerThreadMode::SHARED));
-
-  task_runners.push_back(scheduler_.CreateCOMSTATaskRunnerWithTraits(
-      {TaskPriority::BACKGROUND}, SingleThreadTaskRunnerThreadMode::DEDICATED));
-  task_runners.push_back(scheduler_.CreateCOMSTATaskRunnerWithTraits(
-      {TaskPriority::BACKGROUND, MayBlock()},
-      SingleThreadTaskRunnerThreadMode::DEDICATED));
-  task_runners.push_back(scheduler_.CreateCOMSTATaskRunnerWithTraits(
-      {TaskPriority::USER_BLOCKING},
-      SingleThreadTaskRunnerThreadMode::DEDICATED));
-  task_runners.push_back(scheduler_.CreateCOMSTATaskRunnerWithTraits(
-      {TaskPriority::USER_BLOCKING, MayBlock()},
-      SingleThreadTaskRunnerThreadMode::DEDICATED));
-#endif
-
-  for (auto& task_runner : task_runners)
-    task_runner->PostTask(FROM_HERE, DoNothing());
-
-  EXPECT_CALL(observer, OnSchedulerWorkerMainExit()).Times(kExpectedNumWorkers);
-
-  // Allow single-threaded workers to be released.
-  task_runners.clear();
-
-  TearDown();
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/task_tracker_posix_unittest.cc b/base/task_scheduler/task_tracker_posix_unittest.cc
deleted file mode 100644
index d8849de..0000000
--- a/base/task_scheduler/task_tracker_posix_unittest.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/task_tracker_posix.h"
-
-#include <unistd.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/files/file_descriptor_watcher_posix.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/run_loop.h"
-#include "base/sequence_token.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/task_scheduler/test_utils.h"
-#include "base/test/null_task_runner.h"
-#include "base/threading/thread.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-namespace {
-
-class TaskSchedulerTaskTrackerPosixTest : public testing::Test {
- public:
-  TaskSchedulerTaskTrackerPosixTest() : service_thread_("ServiceThread") {
-    Thread::Options service_thread_options;
-    service_thread_options.message_loop_type = MessageLoop::TYPE_IO;
-    service_thread_.StartWithOptions(service_thread_options);
-    tracker_.set_watch_file_descriptor_message_loop(
-        static_cast<MessageLoopForIO*>(service_thread_.message_loop()));
-  }
-
- protected:
-  Thread service_thread_;
-  TaskTrackerPosix tracker_ = {"Test"};
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerTaskTrackerPosixTest);
-};
-
-}  // namespace
-
-// Verify that TaskTrackerPosix runs a Task it receives.
-TEST_F(TaskSchedulerTaskTrackerPosixTest, RunTask) {
-  bool did_run = false;
-  Task task(FROM_HERE,
-            Bind([](bool* did_run) { *did_run = true; }, Unretained(&did_run)),
-            TaskTraits(), TimeDelta());
-
-  EXPECT_TRUE(tracker_.WillPostTask(task));
-
-  auto sequence = test::CreateSequenceWithTask(std::move(task));
-  EXPECT_EQ(sequence, tracker_.WillScheduleSequence(sequence, nullptr));
-  // Expect RunAndPopNextTask to return nullptr since |sequence| is empty after
-  // popping a task from it.
-  EXPECT_FALSE(tracker_.RunAndPopNextTask(sequence, nullptr));
-
-  EXPECT_TRUE(did_run);
-}
-
-// Verify that FileDescriptorWatcher::WatchReadable() can be called from a task
-// running in TaskTrackerPosix without a crash.
-TEST_F(TaskSchedulerTaskTrackerPosixTest, FileDescriptorWatcher) {
-  int fds[2];
-  ASSERT_EQ(0, pipe(fds));
-  Task task(FROM_HERE,
-            Bind(IgnoreResult(&FileDescriptorWatcher::WatchReadable), fds[0],
-                 DoNothing()),
-            TaskTraits(), TimeDelta());
-  // FileDescriptorWatcher::WatchReadable needs a SequencedTaskRunnerHandle.
-  task.sequenced_task_runner_ref = MakeRefCounted<NullTaskRunner>();
-
-  EXPECT_TRUE(tracker_.WillPostTask(task));
-
-  auto sequence = test::CreateSequenceWithTask(std::move(task));
-  EXPECT_EQ(sequence, tracker_.WillScheduleSequence(sequence, nullptr));
-  // Expect RunAndPopNextTask to return nullptr since |sequence| is empty after
-  // popping a task from it.
-  EXPECT_FALSE(tracker_.RunAndPopNextTask(sequence, nullptr));
-
-  // Join the service thread to make sure that the read watch is registered and
-  // unregistered before file descriptors are closed.
-  service_thread_.Stop();
-
-  EXPECT_EQ(0, IGNORE_EINTR(close(fds[0])));
-  EXPECT_EQ(0, IGNORE_EINTR(close(fds[1])));
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/task_tracker_unittest.cc b/base/task_scheduler/task_tracker_unittest.cc
deleted file mode 100644
index ea8a3c1..0000000
--- a/base/task_scheduler/task_tracker_unittest.cc
+++ /dev/null
@@ -1,1368 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/task_tracker.h"
-
-#include <stdint.h>
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/metrics/histogram_base.h"
-#include "base/metrics/histogram_samples.h"
-#include "base/metrics/statistics_recorder.h"
-#include "base/sequence_token.h"
-#include "base/sequenced_task_runner.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/atomic_flag.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/scheduler_lock.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/task_scheduler/test_utils.h"
-#include "base/test/gtest_util.h"
-#include "base/test/histogram_tester.h"
-#include "base/test/test_simple_task_runner.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/simple_thread.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-namespace {
-
-constexpr size_t kLoadTestNumIterations = 75;
-
-class MockCanScheduleSequenceObserver : public CanScheduleSequenceObserver {
- public:
-  void OnCanScheduleSequence(scoped_refptr<Sequence> sequence) override {
-    MockOnCanScheduleSequence(sequence.get());
-  }
-
-  MOCK_METHOD1(MockOnCanScheduleSequence, void(Sequence*));
-};
-
-// Invokes a closure asynchronously.
-class CallbackThread : public SimpleThread {
- public:
-  explicit CallbackThread(const Closure& closure)
-      : SimpleThread("CallbackThread"), closure_(closure) {}
-
-  // Returns true once the callback returns.
-  bool has_returned() { return has_returned_.IsSet(); }
-
- private:
-  void Run() override {
-    closure_.Run();
-    has_returned_.Set();
-  }
-
-  const Closure closure_;
-  AtomicFlag has_returned_;
-
-  DISALLOW_COPY_AND_ASSIGN(CallbackThread);
-};
-
-class ThreadPostingAndRunningTask : public SimpleThread {
- public:
-  enum class Action {
-    WILL_POST,
-    RUN,
-    WILL_POST_AND_RUN,
-  };
-
-  ThreadPostingAndRunningTask(TaskTracker* tracker,
-                              Task* task,
-                              Action action,
-                              bool expect_post_succeeds)
-      : SimpleThread("ThreadPostingAndRunningTask"),
-        tracker_(tracker),
-        owned_task_(FROM_HERE, OnceClosure(), TaskTraits(), TimeDelta()),
-        task_(task),
-        action_(action),
-        expect_post_succeeds_(expect_post_succeeds) {
-    EXPECT_TRUE(task_);
-
-    // Ownership of the Task is required to run it.
-    EXPECT_NE(Action::RUN, action_);
-    EXPECT_NE(Action::WILL_POST_AND_RUN, action_);
-  }
-
-  ThreadPostingAndRunningTask(TaskTracker* tracker,
-                              Task task,
-                              Action action,
-                              bool expect_post_succeeds)
-      : SimpleThread("ThreadPostingAndRunningTask"),
-        tracker_(tracker),
-        owned_task_(std::move(task)),
-        task_(&owned_task_),
-        action_(action),
-        expect_post_succeeds_(expect_post_succeeds) {
-    EXPECT_TRUE(owned_task_.task);
-  }
-
- private:
-  void Run() override {
-    bool post_succeeded = true;
-    if (action_ == Action::WILL_POST || action_ == Action::WILL_POST_AND_RUN) {
-      post_succeeded = tracker_->WillPostTask(*task_);
-      EXPECT_EQ(expect_post_succeeds_, post_succeeded);
-    }
-    if (post_succeeded &&
-        (action_ == Action::RUN || action_ == Action::WILL_POST_AND_RUN)) {
-      EXPECT_TRUE(owned_task_.task);
-
-      testing::StrictMock<MockCanScheduleSequenceObserver>
-          never_notified_observer;
-      auto sequence = tracker_->WillScheduleSequence(
-          test::CreateSequenceWithTask(std::move(owned_task_)),
-          &never_notified_observer);
-      ASSERT_TRUE(sequence);
-      // Expect RunAndPopNextTask to return nullptr since |sequence| is empty
-      // after popping a task from it.
-      EXPECT_FALSE(tracker_->RunAndPopNextTask(std::move(sequence),
-                                               &never_notified_observer));
-    }
-  }
-
-  TaskTracker* const tracker_;
-  Task owned_task_;
-  Task* task_;
-  const Action action_;
-  const bool expect_post_succeeds_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadPostingAndRunningTask);
-};
-
-class ScopedSetSingletonAllowed {
- public:
-  ScopedSetSingletonAllowed(bool singleton_allowed)
-      : previous_value_(
-            ThreadRestrictions::SetSingletonAllowed(singleton_allowed)) {}
-  ~ScopedSetSingletonAllowed() {
-    ThreadRestrictions::SetSingletonAllowed(previous_value_);
-  }
-
- private:
-  const bool previous_value_;
-};
-
-class TaskSchedulerTaskTrackerTest
-    : public testing::TestWithParam<TaskShutdownBehavior> {
- protected:
-  TaskSchedulerTaskTrackerTest() = default;
-
-  // Creates a task with |shutdown_behavior|.
-  Task CreateTask(TaskShutdownBehavior shutdown_behavior) {
-    return Task(
-        FROM_HERE,
-        Bind(&TaskSchedulerTaskTrackerTest::RunTaskCallback, Unretained(this)),
-        TaskTraits(shutdown_behavior), TimeDelta());
-  }
-
-  void DispatchAndRunTaskWithTracker(Task task) {
-    auto sequence = tracker_.WillScheduleSequence(
-        test::CreateSequenceWithTask(std::move(task)),
-        &never_notified_observer_);
-    ASSERT_TRUE(sequence);
-    tracker_.RunAndPopNextTask(std::move(sequence), &never_notified_observer_);
-  }
-
-  // Calls tracker_->Shutdown() on a new thread. When this returns, Shutdown()
-  // method has been entered on the new thread, but it hasn't necessarily
-  // returned.
-  void CallShutdownAsync() {
-    ASSERT_FALSE(thread_calling_shutdown_);
-    thread_calling_shutdown_.reset(new CallbackThread(
-        Bind(&TaskTracker::Shutdown, Unretained(&tracker_))));
-    thread_calling_shutdown_->Start();
-    while (!tracker_.HasShutdownStarted())
-      PlatformThread::YieldCurrentThread();
-  }
-
-  void WaitForAsyncIsShutdownComplete() {
-    ASSERT_TRUE(thread_calling_shutdown_);
-    thread_calling_shutdown_->Join();
-    EXPECT_TRUE(thread_calling_shutdown_->has_returned());
-    EXPECT_TRUE(tracker_.IsShutdownComplete());
-  }
-
-  void VerifyAsyncShutdownInProgress() {
-    ASSERT_TRUE(thread_calling_shutdown_);
-    EXPECT_FALSE(thread_calling_shutdown_->has_returned());
-    EXPECT_TRUE(tracker_.HasShutdownStarted());
-    EXPECT_FALSE(tracker_.IsShutdownComplete());
-  }
-
-  // Calls tracker_->FlushForTesting() on a new thread.
-  void CallFlushFromAnotherThread() {
-    ASSERT_FALSE(thread_calling_flush_);
-    thread_calling_flush_.reset(new CallbackThread(
-        Bind(&TaskTracker::FlushForTesting, Unretained(&tracker_))));
-    thread_calling_flush_->Start();
-  }
-
-  void WaitForAsyncFlushReturned() {
-    ASSERT_TRUE(thread_calling_flush_);
-    thread_calling_flush_->Join();
-    EXPECT_TRUE(thread_calling_flush_->has_returned());
-  }
-
-  void VerifyAsyncFlushInProgress() {
-    ASSERT_TRUE(thread_calling_flush_);
-    EXPECT_FALSE(thread_calling_flush_->has_returned());
-  }
-
-  size_t NumTasksExecuted() {
-    AutoSchedulerLock auto_lock(lock_);
-    return num_tasks_executed_;
-  }
-
-  TaskTracker tracker_ = {"Test"};
-  testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer_;
-
- private:
-  void RunTaskCallback() {
-    AutoSchedulerLock auto_lock(lock_);
-    ++num_tasks_executed_;
-  }
-
-  std::unique_ptr<CallbackThread> thread_calling_shutdown_;
-  std::unique_ptr<CallbackThread> thread_calling_flush_;
-
-  // Synchronizes accesses to |num_tasks_executed_|.
-  SchedulerLock lock_;
-
-  size_t num_tasks_executed_ = 0;
-
-  DISALLOW_COPY_AND_ASSIGN(TaskSchedulerTaskTrackerTest);
-};
-
-#define WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED() \
-  do {                                      \
-    SCOPED_TRACE("");                       \
-    WaitForAsyncIsShutdownComplete();       \
-  } while (false)
-
-#define VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS() \
-  do {                                      \
-    SCOPED_TRACE("");                       \
-    VerifyAsyncShutdownInProgress();        \
-  } while (false)
-
-#define WAIT_FOR_ASYNC_FLUSH_RETURNED() \
-  do {                                  \
-    SCOPED_TRACE("");                   \
-    WaitForAsyncFlushReturned();        \
-  } while (false)
-
-#define VERIFY_ASYNC_FLUSH_IN_PROGRESS() \
-  do {                                   \
-    SCOPED_TRACE("");                    \
-    VerifyAsyncFlushInProgress();        \
-  } while (false)
-
-}  // namespace
-
-TEST_P(TaskSchedulerTaskTrackerTest, WillPostAndRunBeforeShutdown) {
-  Task task(CreateTask(GetParam()));
-
-  // Inform |task_tracker_| that |task| will be posted.
-  EXPECT_TRUE(tracker_.WillPostTask(task));
-
-  // Run the task.
-  EXPECT_EQ(0U, NumTasksExecuted());
-
-  DispatchAndRunTaskWithTracker(std::move(task));
-  EXPECT_EQ(1U, NumTasksExecuted());
-
-  // Shutdown() shouldn't block.
-  tracker_.Shutdown();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, WillPostAndRunLongTaskBeforeShutdown) {
-  // Create a task that signals |task_running| and blocks until |task_barrier|
-  // is signaled.
-  WaitableEvent task_running(WaitableEvent::ResetPolicy::AUTOMATIC,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent task_barrier(WaitableEvent::ResetPolicy::AUTOMATIC,
-                             WaitableEvent::InitialState::NOT_SIGNALED);
-  Task blocked_task(
-      FROM_HERE,
-      Bind(
-          [](WaitableEvent* task_running, WaitableEvent* task_barrier) {
-            task_running->Signal();
-            task_barrier->Wait();
-          },
-          Unretained(&task_running), Unretained(&task_barrier)),
-      TaskTraits(WithBaseSyncPrimitives(), GetParam()), TimeDelta());
-
-  // Inform |task_tracker_| that |blocked_task| will be posted.
-  EXPECT_TRUE(tracker_.WillPostTask(blocked_task));
-
-  // Create a thread to run the task. Wait until the task starts running.
-  ThreadPostingAndRunningTask thread_running_task(
-      &tracker_, std::move(blocked_task),
-      ThreadPostingAndRunningTask::Action::RUN, false);
-  thread_running_task.Start();
-  task_running.Wait();
-
-  // Initiate shutdown after the task has started to run.
-  CallShutdownAsync();
-
-  if (GetParam() == TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN) {
-    // Shutdown should complete even with a CONTINUE_ON_SHUTDOWN in progress.
-    WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
-  } else {
-    // Shutdown should block with any non CONTINUE_ON_SHUTDOWN task in progress.
-    VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS();
-  }
-
-  // Unblock the task.
-  task_barrier.Signal();
-  thread_running_task.Join();
-
-  // Shutdown should now complete for a non CONTINUE_ON_SHUTDOWN task.
-  if (GetParam() != TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN)
-    WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, WillPostBeforeShutdownRunDuringShutdown) {
-  // Inform |task_tracker_| that a task will be posted.
-  Task task(CreateTask(GetParam()));
-  EXPECT_TRUE(tracker_.WillPostTask(task));
-
-  // Inform |task_tracker_| that a BLOCK_SHUTDOWN task will be posted just to
-  // block shutdown.
-  Task block_shutdown_task(CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
-  EXPECT_TRUE(tracker_.WillPostTask(block_shutdown_task));
-
-  // Call Shutdown() asynchronously.
-  CallShutdownAsync();
-  VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS();
-
-  // Try to run |task|. It should only run it it's BLOCK_SHUTDOWN. Otherwise it
-  // should be discarded.
-  EXPECT_EQ(0U, NumTasksExecuted());
-  const bool should_run = GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN;
-
-  DispatchAndRunTaskWithTracker(std::move(task));
-  EXPECT_EQ(should_run ? 1U : 0U, NumTasksExecuted());
-  VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS();
-
-  // Unblock shutdown by running the remaining BLOCK_SHUTDOWN task.
-  DispatchAndRunTaskWithTracker(std::move(block_shutdown_task));
-  EXPECT_EQ(should_run ? 2U : 1U, NumTasksExecuted());
-  WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, WillPostBeforeShutdownRunAfterShutdown) {
-  // Inform |task_tracker_| that a task will be posted.
-  Task task(CreateTask(GetParam()));
-  EXPECT_TRUE(tracker_.WillPostTask(task));
-
-  // Call Shutdown() asynchronously.
-  CallShutdownAsync();
-  EXPECT_EQ(0U, NumTasksExecuted());
-
-  if (GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN) {
-    VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS();
-
-    // Run the task to unblock shutdown.
-    DispatchAndRunTaskWithTracker(std::move(task));
-    EXPECT_EQ(1U, NumTasksExecuted());
-    WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
-
-    // It is not possible to test running a BLOCK_SHUTDOWN task posted before
-    // shutdown after shutdown because Shutdown() won't return if there are
-    // pending BLOCK_SHUTDOWN tasks.
-  } else {
-    WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
-
-    // The task shouldn't be allowed to run after shutdown.
-    DispatchAndRunTaskWithTracker(std::move(task));
-    EXPECT_EQ(0U, NumTasksExecuted());
-  }
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, WillPostAndRunDuringShutdown) {
-  // Inform |task_tracker_| that a BLOCK_SHUTDOWN task will be posted just to
-  // block shutdown.
-  Task block_shutdown_task(CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
-  EXPECT_TRUE(tracker_.WillPostTask(block_shutdown_task));
-
-  // Call Shutdown() asynchronously.
-  CallShutdownAsync();
-  VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS();
-
-  if (GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN) {
-    // Inform |task_tracker_| that a BLOCK_SHUTDOWN task will be posted.
-    Task task(CreateTask(GetParam()));
-    EXPECT_TRUE(tracker_.WillPostTask(task));
-
-    // Run the BLOCK_SHUTDOWN task.
-    EXPECT_EQ(0U, NumTasksExecuted());
-    DispatchAndRunTaskWithTracker(std::move(task));
-    EXPECT_EQ(1U, NumTasksExecuted());
-  } else {
-    // It shouldn't be allowed to post a non BLOCK_SHUTDOWN task.
-    Task task(CreateTask(GetParam()));
-    EXPECT_FALSE(tracker_.WillPostTask(task));
-
-    // Don't try to run the task, because it wasn't allowed to be posted.
-  }
-
-  // Unblock shutdown by running |block_shutdown_task|.
-  VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS();
-  DispatchAndRunTaskWithTracker(std::move(block_shutdown_task));
-  EXPECT_EQ(GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN ? 2U : 1U,
-            NumTasksExecuted());
-  WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, WillPostAfterShutdown) {
-  tracker_.Shutdown();
-
-  Task task(CreateTask(GetParam()));
-
-  // |task_tracker_| shouldn't allow a task to be posted after shutdown.
-  EXPECT_FALSE(tracker_.WillPostTask(task));
-}
-
-// Verify that BLOCK_SHUTDOWN and SKIP_ON_SHUTDOWN tasks can
-// AssertSingletonAllowed() but CONTINUE_ON_SHUTDOWN tasks can't.
-TEST_P(TaskSchedulerTaskTrackerTest, SingletonAllowed) {
-  const bool can_use_singletons =
-      (GetParam() != TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN);
-
-  Task task(FROM_HERE, BindOnce(&ThreadRestrictions::AssertSingletonAllowed),
-            TaskTraits(GetParam()), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(task));
-
-  // Set the singleton allowed bit to the opposite of what it is expected to be
-  // when |tracker| runs |task| to verify that |tracker| actually sets the
-  // correct value.
-  ScopedSetSingletonAllowed scoped_singleton_allowed(!can_use_singletons);
-
-  // Running the task should fail iff the task isn't allowed to use singletons.
-  if (can_use_singletons) {
-    DispatchAndRunTaskWithTracker(std::move(task));
-  } else {
-    EXPECT_DCHECK_DEATH({ DispatchAndRunTaskWithTracker(std::move(task)); });
-  }
-}
-
-// Verify that AssertIOAllowed() succeeds only for a MayBlock() task.
-TEST_P(TaskSchedulerTaskTrackerTest, IOAllowed) {
-  // Unset the IO allowed bit. Expect TaskTracker to set it before running a
-  // task with the MayBlock() trait.
-  ThreadRestrictions::SetIOAllowed(false);
-  Task task_with_may_block(FROM_HERE, Bind([]() {
-                             // Shouldn't fail.
-                             AssertBlockingAllowed();
-                           }),
-                           TaskTraits(MayBlock(), GetParam()), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(task_with_may_block));
-  DispatchAndRunTaskWithTracker(std::move(task_with_may_block));
-
-  // Set the IO allowed bit. Expect TaskTracker to unset it before running a
-  // task without the MayBlock() trait.
-  ThreadRestrictions::SetIOAllowed(true);
-  Task task_without_may_block(
-      FROM_HERE,
-      Bind([]() { EXPECT_DCHECK_DEATH({ AssertBlockingAllowed(); }); }),
-      TaskTraits(GetParam()), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(task_without_may_block));
-  DispatchAndRunTaskWithTracker(std::move(task_without_may_block));
-}
-
-static void RunTaskRunnerHandleVerificationTask(TaskTracker* tracker,
-                                                Task verify_task) {
-  // Pretend |verify_task| is posted to respect TaskTracker's contract.
-  EXPECT_TRUE(tracker->WillPostTask(verify_task));
-
-  // Confirm that the test conditions are right (no TaskRunnerHandles set
-  // already).
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-  EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
-
-  testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer;
-  auto sequence = tracker->WillScheduleSequence(
-      test::CreateSequenceWithTask(std::move(verify_task)),
-      &never_notified_observer);
-  ASSERT_TRUE(sequence);
-  tracker->RunAndPopNextTask(std::move(sequence), &never_notified_observer);
-
-  // TaskRunnerHandle state is reset outside of task's scope.
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-  EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
-}
-
-static void VerifyNoTaskRunnerHandle() {
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-  EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, TaskRunnerHandleIsNotSetOnParallel) {
-  // Create a task that will verify that TaskRunnerHandles are not set in its
-  // scope per no TaskRunner ref being set to it.
-  Task verify_task(FROM_HERE, BindOnce(&VerifyNoTaskRunnerHandle),
-                   TaskTraits(GetParam()), TimeDelta());
-
-  RunTaskRunnerHandleVerificationTask(&tracker_, std::move(verify_task));
-}
-
-static void VerifySequencedTaskRunnerHandle(
-    const SequencedTaskRunner* expected_task_runner) {
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-  EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
-  EXPECT_EQ(expected_task_runner, SequencedTaskRunnerHandle::Get());
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest,
-       SequencedTaskRunnerHandleIsSetOnSequenced) {
-  scoped_refptr<SequencedTaskRunner> test_task_runner(new TestSimpleTaskRunner);
-
-  // Create a task that will verify that SequencedTaskRunnerHandle is properly
-  // set to |test_task_runner| in its scope per |sequenced_task_runner_ref|
-  // being set to it.
-  Task verify_task(FROM_HERE,
-                   BindOnce(&VerifySequencedTaskRunnerHandle,
-                            Unretained(test_task_runner.get())),
-                   TaskTraits(GetParam()), TimeDelta());
-  verify_task.sequenced_task_runner_ref = test_task_runner;
-
-  RunTaskRunnerHandleVerificationTask(&tracker_, std::move(verify_task));
-}
-
-static void VerifyThreadTaskRunnerHandle(
-    const SingleThreadTaskRunner* expected_task_runner) {
-  EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
-  // SequencedTaskRunnerHandle inherits ThreadTaskRunnerHandle for thread.
-  EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
-  EXPECT_EQ(expected_task_runner, ThreadTaskRunnerHandle::Get());
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest,
-       ThreadTaskRunnerHandleIsSetOnSingleThreaded) {
-  scoped_refptr<SingleThreadTaskRunner> test_task_runner(
-      new TestSimpleTaskRunner);
-
-  // Create a task that will verify that ThreadTaskRunnerHandle is properly set
-  // to |test_task_runner| in its scope per |single_thread_task_runner_ref|
-  // being set on it.
-  Task verify_task(FROM_HERE,
-                   BindOnce(&VerifyThreadTaskRunnerHandle,
-                            Unretained(test_task_runner.get())),
-                   TaskTraits(GetParam()), TimeDelta());
-  verify_task.single_thread_task_runner_ref = test_task_runner;
-
-  RunTaskRunnerHandleVerificationTask(&tracker_, std::move(verify_task));
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, FlushPendingDelayedTask) {
-  const Task delayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                          TimeDelta::FromDays(1));
-  tracker_.WillPostTask(delayed_task);
-  // FlushForTesting() should return even if the delayed task didn't run.
-  tracker_.FlushForTesting();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, FlushAsyncForTestingPendingDelayedTask) {
-  const Task delayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                          TimeDelta::FromDays(1));
-  tracker_.WillPostTask(delayed_task);
-  // FlushAsyncForTesting() should callback even if the delayed task didn't run.
-  bool called_back = false;
-  tracker_.FlushAsyncForTesting(
-      BindOnce([](bool* called_back) { *called_back = true; },
-               Unretained(&called_back)));
-  EXPECT_TRUE(called_back);
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, FlushPendingUndelayedTask) {
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(undelayed_task);
-
-  // FlushForTesting() shouldn't return before the undelayed task runs.
-  CallFlushFromAnotherThread();
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  VERIFY_ASYNC_FLUSH_IN_PROGRESS();
-
-  // FlushForTesting() should return after the undelayed task runs.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
-  WAIT_FOR_ASYNC_FLUSH_RETURNED();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, FlushAsyncForTestingPendingUndelayedTask) {
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(undelayed_task);
-
-  // FlushAsyncForTesting() shouldn't callback before the undelayed task runs.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  tracker_.FlushAsyncForTesting(
-      BindOnce(&WaitableEvent::Signal, Unretained(&event)));
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_FALSE(event.IsSignaled());
-
-  // FlushAsyncForTesting() should callback after the undelayed task runs.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
-  event.Wait();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, PostTaskDuringFlush) {
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(undelayed_task);
-
-  // FlushForTesting() shouldn't return before the undelayed task runs.
-  CallFlushFromAnotherThread();
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  VERIFY_ASYNC_FLUSH_IN_PROGRESS();
-
-  // Simulate posting another undelayed task.
-  Task other_undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                            TimeDelta());
-  tracker_.WillPostTask(other_undelayed_task);
-
-  // Run the first undelayed task.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
-
-  // FlushForTesting() shouldn't return before the second undelayed task runs.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  VERIFY_ASYNC_FLUSH_IN_PROGRESS();
-
-  // FlushForTesting() should return after the second undelayed task runs.
-  DispatchAndRunTaskWithTracker(std::move(other_undelayed_task));
-  WAIT_FOR_ASYNC_FLUSH_RETURNED();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, PostTaskDuringFlushAsyncForTesting) {
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(undelayed_task);
-
-  // FlushAsyncForTesting() shouldn't callback before the undelayed task runs.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  tracker_.FlushAsyncForTesting(
-      BindOnce(&WaitableEvent::Signal, Unretained(&event)));
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_FALSE(event.IsSignaled());
-
-  // Simulate posting another undelayed task.
-  Task other_undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                            TimeDelta());
-  tracker_.WillPostTask(other_undelayed_task);
-
-  // Run the first undelayed task.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
-
-  // FlushAsyncForTesting() shouldn't callback before the second undelayed task
-  // runs.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_FALSE(event.IsSignaled());
-
-  // FlushAsyncForTesting() should callback after the second undelayed task
-  // runs.
-  DispatchAndRunTaskWithTracker(std::move(other_undelayed_task));
-  event.Wait();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, RunDelayedTaskDuringFlush) {
-  // Simulate posting a delayed and an undelayed task.
-  Task delayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                    TimeDelta::FromDays(1));
-  tracker_.WillPostTask(delayed_task);
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(undelayed_task);
-
-  // FlushForTesting() shouldn't return before the undelayed task runs.
-  CallFlushFromAnotherThread();
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  VERIFY_ASYNC_FLUSH_IN_PROGRESS();
-
-  // Run the delayed task.
-  DispatchAndRunTaskWithTracker(std::move(delayed_task));
-
-  // FlushForTesting() shouldn't return since there is still a pending undelayed
-  // task.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  VERIFY_ASYNC_FLUSH_IN_PROGRESS();
-
-  // Run the undelayed task.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
-
-  // FlushForTesting() should now return.
-  WAIT_FOR_ASYNC_FLUSH_RETURNED();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, RunDelayedTaskDuringFlushAsyncForTesting) {
-  // Simulate posting a delayed and an undelayed task.
-  Task delayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                    TimeDelta::FromDays(1));
-  tracker_.WillPostTask(delayed_task);
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(undelayed_task);
-
-  // FlushAsyncForTesting() shouldn't callback before the undelayed task runs.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  tracker_.FlushAsyncForTesting(
-      BindOnce(&WaitableEvent::Signal, Unretained(&event)));
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_FALSE(event.IsSignaled());
-
-  // Run the delayed task.
-  DispatchAndRunTaskWithTracker(std::move(delayed_task));
-
-  // FlushAsyncForTesting() shouldn't callback since there is still a pending
-  // undelayed task.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_FALSE(event.IsSignaled());
-
-  // Run the undelayed task.
-  DispatchAndRunTaskWithTracker(std::move(undelayed_task));
-
-  // FlushAsyncForTesting() should now callback.
-  event.Wait();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, FlushAfterShutdown) {
-  if (GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN)
-    return;
-
-  // Simulate posting a task.
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(undelayed_task);
-
-  // Shutdown() should return immediately since there are no pending
-  // BLOCK_SHUTDOWN tasks.
-  tracker_.Shutdown();
-
-  // FlushForTesting() should return immediately after shutdown, even if an
-  // undelayed task hasn't run.
-  tracker_.FlushForTesting();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, FlushAfterShutdownAsync) {
-  if (GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN)
-    return;
-
-  // Simulate posting a task.
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(undelayed_task);
-
-  // Shutdown() should return immediately since there are no pending
-  // BLOCK_SHUTDOWN tasks.
-  tracker_.Shutdown();
-
-  // FlushForTesting() should callback immediately after shutdown, even if an
-  // undelayed task hasn't run.
-  bool called_back = false;
-  tracker_.FlushAsyncForTesting(
-      BindOnce([](bool* called_back) { *called_back = true; },
-               Unretained(&called_back)));
-  EXPECT_TRUE(called_back);
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, ShutdownDuringFlush) {
-  if (GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN)
-    return;
-
-  // Simulate posting a task.
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(undelayed_task);
-
-  // FlushForTesting() shouldn't return before the undelayed task runs or
-  // shutdown completes.
-  CallFlushFromAnotherThread();
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  VERIFY_ASYNC_FLUSH_IN_PROGRESS();
-
-  // Shutdown() should return immediately since there are no pending
-  // BLOCK_SHUTDOWN tasks.
-  tracker_.Shutdown();
-
-  // FlushForTesting() should now return, even if an undelayed task hasn't run.
-  WAIT_FOR_ASYNC_FLUSH_RETURNED();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, ShutdownDuringFlushAsyncForTesting) {
-  if (GetParam() == TaskShutdownBehavior::BLOCK_SHUTDOWN)
-    return;
-
-  // Simulate posting a task.
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(undelayed_task);
-
-  // FlushAsyncForTesting() shouldn't callback before the undelayed task runs or
-  // shutdown completes.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  tracker_.FlushAsyncForTesting(
-      BindOnce(&WaitableEvent::Signal, Unretained(&event)));
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  EXPECT_FALSE(event.IsSignaled());
-
-  // Shutdown() should return immediately since there are no pending
-  // BLOCK_SHUTDOWN tasks.
-  tracker_.Shutdown();
-
-  // FlushAsyncForTesting() should now callback, even if an undelayed task
-  // hasn't run.
-  event.Wait();
-}
-
-TEST_P(TaskSchedulerTaskTrackerTest, DoublePendingFlushAsyncForTestingFails) {
-  Task undelayed_task(FROM_HERE, DoNothing(), TaskTraits(GetParam()),
-                      TimeDelta());
-  tracker_.WillPostTask(undelayed_task);
-
-  // FlushAsyncForTesting() shouldn't callback before the undelayed task runs.
-  bool called_back = false;
-  tracker_.FlushAsyncForTesting(
-      BindOnce([](bool* called_back) { *called_back = true; },
-               Unretained(&called_back)));
-  EXPECT_FALSE(called_back);
-  EXPECT_DCHECK_DEATH({ tracker_.FlushAsyncForTesting(BindOnce([]() {})); });
-}
-
-INSTANTIATE_TEST_CASE_P(
-    ContinueOnShutdown,
-    TaskSchedulerTaskTrackerTest,
-    ::testing::Values(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
-INSTANTIATE_TEST_CASE_P(
-    SkipOnShutdown,
-    TaskSchedulerTaskTrackerTest,
-    ::testing::Values(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
-INSTANTIATE_TEST_CASE_P(
-    BlockShutdown,
-    TaskSchedulerTaskTrackerTest,
-    ::testing::Values(TaskShutdownBehavior::BLOCK_SHUTDOWN));
-
-namespace {
-
-void ExpectSequenceToken(SequenceToken sequence_token) {
-  EXPECT_EQ(sequence_token, SequenceToken::GetForCurrentThread());
-}
-
-}  // namespace
-
-// Verify that SequenceToken::GetForCurrentThread() returns the Sequence's token
-// when a Task runs.
-TEST_F(TaskSchedulerTaskTrackerTest, CurrentSequenceToken) {
-  scoped_refptr<Sequence> sequence = MakeRefCounted<Sequence>();
-
-  const SequenceToken sequence_token = sequence->token();
-  Task task(FROM_HERE, Bind(&ExpectSequenceToken, sequence_token), TaskTraits(),
-            TimeDelta());
-  tracker_.WillPostTask(task);
-
-  sequence->PushTask(std::move(task));
-
-  EXPECT_FALSE(SequenceToken::GetForCurrentThread().IsValid());
-  sequence = tracker_.WillScheduleSequence(std::move(sequence),
-                                           &never_notified_observer_);
-  ASSERT_TRUE(sequence);
-  tracker_.RunAndPopNextTask(std::move(sequence), &never_notified_observer_);
-  EXPECT_FALSE(SequenceToken::GetForCurrentThread().IsValid());
-}
-
-TEST_F(TaskSchedulerTaskTrackerTest, LoadWillPostAndRunBeforeShutdown) {
-  // Post and run tasks asynchronously.
-  std::vector<std::unique_ptr<ThreadPostingAndRunningTask>> threads;
-
-  for (size_t i = 0; i < kLoadTestNumIterations; ++i) {
-    threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
-        ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true));
-    threads.back()->Start();
-
-    threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN),
-        ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true));
-    threads.back()->Start();
-
-    threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN),
-        ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true));
-    threads.back()->Start();
-  }
-
-  for (const auto& thread : threads)
-    thread->Join();
-
-  // Expect all tasks to be executed.
-  EXPECT_EQ(kLoadTestNumIterations * 3, NumTasksExecuted());
-
-  // Should return immediately because no tasks are blocking shutdown.
-  tracker_.Shutdown();
-}
-
-TEST_F(TaskSchedulerTaskTrackerTest,
-       LoadWillPostBeforeShutdownAndRunDuringShutdown) {
-  // Post tasks asynchronously.
-  std::vector<Task> tasks_continue_on_shutdown;
-  std::vector<Task> tasks_skip_on_shutdown;
-  std::vector<Task> tasks_block_shutdown;
-  for (size_t i = 0; i < kLoadTestNumIterations; ++i) {
-    tasks_continue_on_shutdown.push_back(
-        CreateTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN));
-    tasks_skip_on_shutdown.push_back(
-        CreateTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN));
-    tasks_block_shutdown.push_back(
-        CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
-  }
-
-  std::vector<std::unique_ptr<ThreadPostingAndRunningTask>> post_threads;
-  for (size_t i = 0; i < kLoadTestNumIterations; ++i) {
-    post_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, &tasks_continue_on_shutdown[i],
-        ThreadPostingAndRunningTask::Action::WILL_POST, true));
-    post_threads.back()->Start();
-
-    post_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, &tasks_skip_on_shutdown[i],
-        ThreadPostingAndRunningTask::Action::WILL_POST, true));
-    post_threads.back()->Start();
-
-    post_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, &tasks_block_shutdown[i],
-        ThreadPostingAndRunningTask::Action::WILL_POST, true));
-    post_threads.back()->Start();
-  }
-
-  for (const auto& thread : post_threads)
-    thread->Join();
-
-  // Call Shutdown() asynchronously.
-  CallShutdownAsync();
-
-  // Run tasks asynchronously.
-  std::vector<std::unique_ptr<ThreadPostingAndRunningTask>> run_threads;
-  for (size_t i = 0; i < kLoadTestNumIterations; ++i) {
-    run_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, std::move(tasks_continue_on_shutdown[i]),
-        ThreadPostingAndRunningTask::Action::RUN, false));
-    run_threads.back()->Start();
-
-    run_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, std::move(tasks_skip_on_shutdown[i]),
-        ThreadPostingAndRunningTask::Action::RUN, false));
-    run_threads.back()->Start();
-
-    run_threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, std::move(tasks_block_shutdown[i]),
-        ThreadPostingAndRunningTask::Action::RUN, false));
-    run_threads.back()->Start();
-  }
-
-  for (const auto& thread : run_threads)
-    thread->Join();
-
-  WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
-
-  // Expect BLOCK_SHUTDOWN tasks to have been executed.
-  EXPECT_EQ(kLoadTestNumIterations, NumTasksExecuted());
-}
-
-TEST_F(TaskSchedulerTaskTrackerTest, LoadWillPostAndRunDuringShutdown) {
-  // Inform |task_tracker_| that a BLOCK_SHUTDOWN task will be posted just to
-  // block shutdown.
-  Task block_shutdown_task(CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN));
-  EXPECT_TRUE(tracker_.WillPostTask(block_shutdown_task));
-
-  // Call Shutdown() asynchronously.
-  CallShutdownAsync();
-
-  // Post and run tasks asynchronously.
-  std::vector<std::unique_ptr<ThreadPostingAndRunningTask>> threads;
-
-  for (size_t i = 0; i < kLoadTestNumIterations; ++i) {
-    threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN),
-        ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, false));
-    threads.back()->Start();
-
-    threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::SKIP_ON_SHUTDOWN),
-        ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, false));
-    threads.back()->Start();
-
-    threads.push_back(std::make_unique<ThreadPostingAndRunningTask>(
-        &tracker_, CreateTask(TaskShutdownBehavior::BLOCK_SHUTDOWN),
-        ThreadPostingAndRunningTask::Action::WILL_POST_AND_RUN, true));
-    threads.back()->Start();
-  }
-
-  for (const auto& thread : threads)
-    thread->Join();
-
-  // Expect BLOCK_SHUTDOWN tasks to have been executed.
-  EXPECT_EQ(kLoadTestNumIterations, NumTasksExecuted());
-
-  // Shutdown() shouldn't return before |block_shutdown_task| is executed.
-  VERIFY_ASYNC_SHUTDOWN_IN_PROGRESS();
-
-  // Unblock shutdown by running |block_shutdown_task|.
-  DispatchAndRunTaskWithTracker(std::move(block_shutdown_task));
-  EXPECT_EQ(kLoadTestNumIterations + 1, NumTasksExecuted());
-  WAIT_FOR_ASYNC_SHUTDOWN_COMPLETED();
-}
-
-// Verify that RunAndPopNextTask() returns the sequence from which it ran a task
-// when it can be rescheduled.
-TEST_F(TaskSchedulerTaskTrackerTest,
-       RunAndPopNextTaskReturnsSequenceToReschedule) {
-  Task task_1(FROM_HERE, DoNothing(), TaskTraits(), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(task_1));
-  Task task_2(FROM_HERE, DoNothing(), TaskTraits(), TimeDelta());
-  EXPECT_TRUE(tracker_.WillPostTask(task_2));
-
-  scoped_refptr<Sequence> sequence =
-      test::CreateSequenceWithTask(std::move(task_1));
-  sequence->PushTask(std::move(task_2));
-  EXPECT_EQ(sequence, tracker_.WillScheduleSequence(sequence, nullptr));
-
-  EXPECT_EQ(sequence, tracker_.RunAndPopNextTask(sequence, nullptr));
-}
-
-// Verify that WillScheduleSequence() returns nullptr when it receives a
-// background sequence and the maximum number of background sequences that can
-// be scheduled concurrently is reached. Verify that an observer is notified
-// when a background sequence can be scheduled (i.e. when one of the previously
-// scheduled background sequences has run).
-TEST_F(TaskSchedulerTaskTrackerTest,
-       WillScheduleBackgroundSequenceWithMaxBackgroundSequences) {
-  constexpr int kMaxNumScheduledBackgroundSequences = 2;
-  TaskTracker tracker("Test", kMaxNumScheduledBackgroundSequences);
-
-  // Simulate posting |kMaxNumScheduledBackgroundSequences| background tasks
-  // and scheduling the associated sequences. This should succeed.
-  std::vector<scoped_refptr<Sequence>> scheduled_sequences;
-  testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer;
-  for (int i = 0; i < kMaxNumScheduledBackgroundSequences; ++i) {
-    Task task(FROM_HERE, DoNothing(), TaskTraits(TaskPriority::BACKGROUND),
-              TimeDelta());
-    EXPECT_TRUE(tracker.WillPostTask(task));
-    scoped_refptr<Sequence> sequence =
-        test::CreateSequenceWithTask(std::move(task));
-    EXPECT_EQ(sequence,
-              tracker.WillScheduleSequence(sequence, &never_notified_observer));
-    scheduled_sequences.push_back(std::move(sequence));
-  }
-
-  // Simulate posting extra background tasks and scheduling the associated
-  // sequences. This should fail because the maximum number of background
-  // sequences that can be scheduled concurrently is already reached.
-  std::vector<std::unique_ptr<bool>> extra_tasks_did_run;
-  std::vector<
-      std::unique_ptr<testing::StrictMock<MockCanScheduleSequenceObserver>>>
-      extra_observers;
-  std::vector<scoped_refptr<Sequence>> extra_sequences;
-  for (int i = 0; i < kMaxNumScheduledBackgroundSequences; ++i) {
-    extra_tasks_did_run.push_back(std::make_unique<bool>());
-    Task extra_task(
-        FROM_HERE,
-        BindOnce([](bool* extra_task_did_run) { *extra_task_did_run = true; },
-                 Unretained(extra_tasks_did_run.back().get())),
-        TaskTraits(TaskPriority::BACKGROUND), TimeDelta());
-    EXPECT_TRUE(tracker.WillPostTask(extra_task));
-    extra_sequences.push_back(
-        test::CreateSequenceWithTask(std::move(extra_task)));
-    extra_observers.push_back(
-        std::make_unique<
-            testing::StrictMock<MockCanScheduleSequenceObserver>>());
-    EXPECT_EQ(nullptr,
-              tracker.WillScheduleSequence(extra_sequences.back(),
-                                           extra_observers.back().get()));
-  }
-
-  // Run the sequences scheduled at the beginning of the test. Expect an
-  // observer from |extra_observer| to be notified every time a task finishes to
-  // run.
-  for (int i = 0; i < kMaxNumScheduledBackgroundSequences; ++i) {
-    EXPECT_CALL(*extra_observers[i].get(),
-                MockOnCanScheduleSequence(extra_sequences[i].get()));
-    EXPECT_FALSE(tracker.RunAndPopNextTask(scheduled_sequences[i],
-                                           &never_notified_observer));
-    testing::Mock::VerifyAndClear(extra_observers[i].get());
-  }
-
-  // Run the extra sequences.
-  for (int i = 0; i < kMaxNumScheduledBackgroundSequences; ++i) {
-    EXPECT_FALSE(*extra_tasks_did_run[i]);
-    EXPECT_FALSE(tracker.RunAndPopNextTask(extra_sequences[i],
-                                           &never_notified_observer));
-    EXPECT_TRUE(*extra_tasks_did_run[i]);
-  }
-}
-
-namespace {
-
-void SetBool(bool* arg) {
-  ASSERT_TRUE(arg);
-  EXPECT_FALSE(*arg);
-  *arg = true;
-}
-
-}  // namespace
-
-// Verify that RunAndPopNextTask() doesn't reschedule the background sequence it
-// was assigned if there is a preempted background sequence with an earlier
-// sequence time (compared to the next task in the sequence assigned to
-// RunAndPopNextTask()).
-TEST_F(TaskSchedulerTaskTrackerTest,
-       RunNextBackgroundTaskWithEarlierPendingBackgroundTask) {
-  constexpr int kMaxNumScheduledBackgroundSequences = 1;
-  TaskTracker tracker("Test", kMaxNumScheduledBackgroundSequences);
-  testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer;
-
-  // Simulate posting a background task and scheduling the associated sequence.
-  // This should succeed.
-  bool task_a_1_did_run = false;
-  Task task_a_1(FROM_HERE, BindOnce(&SetBool, Unretained(&task_a_1_did_run)),
-                TaskTraits(TaskPriority::BACKGROUND), TimeDelta());
-  EXPECT_TRUE(tracker.WillPostTask(task_a_1));
-  scoped_refptr<Sequence> sequence_a =
-      test::CreateSequenceWithTask(std::move(task_a_1));
-  EXPECT_EQ(sequence_a,
-            tracker.WillScheduleSequence(sequence_a, &never_notified_observer));
-
-  // Simulate posting an extra background task and scheduling the associated
-  // sequence. This should fail because the maximum number of background
-  // sequences that can be scheduled concurrently is already reached.
-  bool task_b_1_did_run = false;
-  Task task_b_1(FROM_HERE, BindOnce(&SetBool, Unretained(&task_b_1_did_run)),
-                TaskTraits(TaskPriority::BACKGROUND), TimeDelta());
-  EXPECT_TRUE(tracker.WillPostTask(task_b_1));
-  scoped_refptr<Sequence> sequence_b =
-      test::CreateSequenceWithTask(std::move(task_b_1));
-  testing::StrictMock<MockCanScheduleSequenceObserver> task_b_1_observer;
-  EXPECT_FALSE(tracker.WillScheduleSequence(sequence_b, &task_b_1_observer));
-
-  // Wait to be sure that the sequence time of |task_a_2| is after the sequenced
-  // time of |task_b_1|.
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-
-  // Post an extra background task in |sequence_a|.
-  bool task_a_2_did_run = false;
-  Task task_a_2(FROM_HERE, BindOnce(&SetBool, Unretained(&task_a_2_did_run)),
-                TaskTraits(TaskPriority::BACKGROUND), TimeDelta());
-  EXPECT_TRUE(tracker.WillPostTask(task_a_2));
-  sequence_a->PushTask(std::move(task_a_2));
-
-  // Run the first task in |sequence_a|. RunAndPopNextTask() should return
-  // nullptr since |sequence_a| can't be rescheduled immediately.
-  // |task_b_1_observer| should be notified that |sequence_b| can be scheduled.
-  testing::StrictMock<MockCanScheduleSequenceObserver> task_a_2_observer;
-  EXPECT_CALL(task_b_1_observer, MockOnCanScheduleSequence(sequence_b.get()));
-  EXPECT_FALSE(tracker.RunAndPopNextTask(sequence_a, &task_a_2_observer));
-  testing::Mock::VerifyAndClear(&task_b_1_observer);
-  EXPECT_TRUE(task_a_1_did_run);
-
-  // Run the first task in |sequence_b|. RunAndPopNextTask() should return
-  // nullptr since |sequence_b| is empty after popping a task from it.
-  // |task_a_2_observer| should be notified that |sequence_a| can be
-  // scheduled.
-  EXPECT_CALL(task_a_2_observer, MockOnCanScheduleSequence(sequence_a.get()));
-  EXPECT_FALSE(tracker.RunAndPopNextTask(sequence_b, &never_notified_observer));
-  testing::Mock::VerifyAndClear(&task_a_2_observer);
-  EXPECT_TRUE(task_b_1_did_run);
-
-  // Run the first task in |sequence_a|. RunAndPopNextTask() should return
-  // nullptr since |sequence_b| is empty after popping a task from it. No
-  // observer should be notified.
-  EXPECT_FALSE(tracker.RunAndPopNextTask(sequence_a, &never_notified_observer));
-  EXPECT_TRUE(task_a_2_did_run);
-}
-
-// Verify that preempted background sequences are scheduled when shutdown
-// starts.
-TEST_F(TaskSchedulerTaskTrackerTest,
-       SchedulePreemptedBackgroundSequencesOnShutdown) {
-  constexpr int kMaxNumScheduledBackgroundSequences = 0;
-  TaskTracker tracker("Test", kMaxNumScheduledBackgroundSequences);
-  testing::StrictMock<MockCanScheduleSequenceObserver> observer;
-
-  // Simulate scheduling sequences. TaskTracker should prevent this.
-  std::vector<scoped_refptr<Sequence>> preempted_sequences;
-  for (int i = 0; i < 3; ++i) {
-    Task task(FROM_HERE, DoNothing(),
-              TaskTraits(TaskPriority::BACKGROUND,
-                         TaskShutdownBehavior::BLOCK_SHUTDOWN),
-              TimeDelta());
-    EXPECT_TRUE(tracker.WillPostTask(task));
-    scoped_refptr<Sequence> sequence =
-        test::CreateSequenceWithTask(std::move(task));
-    EXPECT_FALSE(tracker.WillScheduleSequence(sequence, &observer));
-    preempted_sequences.push_back(std::move(sequence));
-
-    // Wait to be sure that tasks have different |sequenced_time|.
-    PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  }
-
-  // Perform shutdown. Expect |preempted_sequences| to be scheduled in posting
-  // order.
-  {
-    testing::InSequence in_sequence;
-    for (auto& preempted_sequence : preempted_sequences) {
-      EXPECT_CALL(observer, MockOnCanScheduleSequence(preempted_sequence.get()))
-          .WillOnce(testing::Invoke([&tracker](Sequence* sequence) {
-            // Run the task to unblock shutdown.
-            tracker.RunAndPopNextTask(sequence, nullptr);
-          }));
-    }
-    tracker.Shutdown();
-  }
-}
-
-namespace {
-
-class WaitAllowedTestThread : public SimpleThread {
- public:
-  WaitAllowedTestThread() : SimpleThread("WaitAllowedTestThread") {}
-
- private:
-  void Run() override {
-    auto task_tracker = std::make_unique<TaskTracker>("Test");
-
-    // Waiting is allowed by default. Expect TaskTracker to disallow it before
-    // running a task without the WithBaseSyncPrimitives() trait.
-    internal::AssertBaseSyncPrimitivesAllowed();
-    Task task_without_sync_primitives(
-        FROM_HERE, Bind([]() {
-          EXPECT_DCHECK_DEATH({ internal::AssertBaseSyncPrimitivesAllowed(); });
-        }),
-        TaskTraits(), TimeDelta());
-    EXPECT_TRUE(task_tracker->WillPostTask(task_without_sync_primitives));
-    testing::StrictMock<MockCanScheduleSequenceObserver>
-        never_notified_observer;
-    auto sequence_without_sync_primitives = task_tracker->WillScheduleSequence(
-        test::CreateSequenceWithTask(std::move(task_without_sync_primitives)),
-        &never_notified_observer);
-    ASSERT_TRUE(sequence_without_sync_primitives);
-    task_tracker->RunAndPopNextTask(std::move(sequence_without_sync_primitives),
-                                    &never_notified_observer);
-
-    // Disallow waiting. Expect TaskTracker to allow it before running a task
-    // with the WithBaseSyncPrimitives() trait.
-    ThreadRestrictions::DisallowWaiting();
-    Task task_with_sync_primitives(
-        FROM_HERE, Bind([]() {
-          // Shouldn't fail.
-          internal::AssertBaseSyncPrimitivesAllowed();
-        }),
-        TaskTraits(WithBaseSyncPrimitives()), TimeDelta());
-    EXPECT_TRUE(task_tracker->WillPostTask(task_with_sync_primitives));
-    auto sequence_with_sync_primitives = task_tracker->WillScheduleSequence(
-        test::CreateSequenceWithTask(std::move(task_with_sync_primitives)),
-        &never_notified_observer);
-    ASSERT_TRUE(sequence_with_sync_primitives);
-    task_tracker->RunAndPopNextTask(std::move(sequence_with_sync_primitives),
-                                    &never_notified_observer);
-
-    ScopedAllowBaseSyncPrimitivesForTesting
-        allow_wait_in_task_tracker_destructor;
-    task_tracker.reset();
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(WaitAllowedTestThread);
-};
-
-}  // namespace
-
-// Verify that AssertIOAllowed() succeeds only for a WithBaseSyncPrimitives()
-// task.
-TEST(TaskSchedulerTaskTrackerWaitAllowedTest, WaitAllowed) {
-  // Run the test on the separate thread since it is not possible to reset the
-  // "wait allowed" bit of a thread without being a friend of
-  // ThreadRestrictions.
-  testing::GTEST_FLAG(death_test_style) = "threadsafe";
-  WaitAllowedTestThread wait_allowed_test_thread;
-  wait_allowed_test_thread.Start();
-  wait_allowed_test_thread.Join();
-}
-
-// Verify that TaskScheduler.TaskLatency.* histograms are correctly recorded
-// when a task runs.
-TEST(TaskSchedulerTaskTrackerHistogramTest, TaskLatency) {
-  auto statistics_recorder = StatisticsRecorder::CreateTemporaryForTesting();
-
-  TaskTracker tracker("Test");
-  testing::StrictMock<MockCanScheduleSequenceObserver> never_notified_observer;
-
-  struct {
-    const TaskTraits traits;
-    const char* const expected_histogram;
-  } static constexpr kTests[] = {
-      {{TaskPriority::BACKGROUND},
-       "TaskScheduler.TaskLatencyMicroseconds.Test."
-       "BackgroundTaskPriority"},
-      {{MayBlock(), TaskPriority::BACKGROUND},
-       "TaskScheduler.TaskLatencyMicroseconds.Test."
-       "BackgroundTaskPriority_MayBlock"},
-      {{WithBaseSyncPrimitives(), TaskPriority::BACKGROUND},
-       "TaskScheduler.TaskLatencyMicroseconds.Test."
-       "BackgroundTaskPriority_MayBlock"},
-      {{TaskPriority::USER_VISIBLE},
-       "TaskScheduler.TaskLatencyMicroseconds.Test."
-       "UserVisibleTaskPriority"},
-      {{MayBlock(), TaskPriority::USER_VISIBLE},
-       "TaskScheduler.TaskLatencyMicroseconds.Test."
-       "UserVisibleTaskPriority_MayBlock"},
-      {{WithBaseSyncPrimitives(), TaskPriority::USER_VISIBLE},
-       "TaskScheduler.TaskLatencyMicroseconds.Test."
-       "UserVisibleTaskPriority_MayBlock"},
-      {{TaskPriority::USER_BLOCKING},
-       "TaskScheduler.TaskLatencyMicroseconds.Test."
-       "UserBlockingTaskPriority"},
-      {{MayBlock(), TaskPriority::USER_BLOCKING},
-       "TaskScheduler.TaskLatencyMicroseconds.Test."
-       "UserBlockingTaskPriority_MayBlock"},
-      {{WithBaseSyncPrimitives(), TaskPriority::USER_BLOCKING},
-       "TaskScheduler.TaskLatencyMicroseconds.Test."
-       "UserBlockingTaskPriority_MayBlock"}};
-
-  for (const auto& test : kTests) {
-    Task task(FROM_HERE, DoNothing(), test.traits, TimeDelta());
-    ASSERT_TRUE(tracker.WillPostTask(task));
-
-    HistogramTester tester;
-
-    auto sequence = tracker.WillScheduleSequence(
-        test::CreateSequenceWithTask(std::move(task)),
-        &never_notified_observer);
-    ASSERT_TRUE(sequence);
-    tracker.RunAndPopNextTask(std::move(sequence), &never_notified_observer);
-    tester.ExpectTotalCount(test.expected_histogram, 1);
-  }
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/task_traits_unittest.cc b/base/task_scheduler/task_traits_unittest.cc
deleted file mode 100644
index 2a35048..0000000
--- a/base/task_scheduler/task_traits_unittest.cc
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/task_traits.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(TaskSchedulerTaskTraitsTest, Default) {
-  constexpr TaskTraits traits = {};
-  EXPECT_FALSE(traits.priority_set_explicitly());
-  EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
-  EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
-  EXPECT_FALSE(traits.may_block());
-  EXPECT_FALSE(traits.with_base_sync_primitives());
-}
-
-TEST(TaskSchedulerTaskTraitsTest, TaskPriority) {
-  constexpr TaskTraits traits = {TaskPriority::BACKGROUND};
-  EXPECT_TRUE(traits.priority_set_explicitly());
-  EXPECT_EQ(TaskPriority::BACKGROUND, traits.priority());
-  EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
-  EXPECT_FALSE(traits.may_block());
-  EXPECT_FALSE(traits.with_base_sync_primitives());
-}
-
-TEST(TaskSchedulerTaskTraitsTest, TaskShutdownBehavior) {
-  constexpr TaskTraits traits = {TaskShutdownBehavior::BLOCK_SHUTDOWN};
-  EXPECT_FALSE(traits.priority_set_explicitly());
-  EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
-  EXPECT_EQ(TaskShutdownBehavior::BLOCK_SHUTDOWN, traits.shutdown_behavior());
-  EXPECT_FALSE(traits.may_block());
-  EXPECT_FALSE(traits.with_base_sync_primitives());
-}
-
-TEST(TaskSchedulerTaskTraitsTest, MayBlock) {
-  constexpr TaskTraits traits = {MayBlock()};
-  EXPECT_FALSE(traits.priority_set_explicitly());
-  EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
-  EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
-  EXPECT_TRUE(traits.may_block());
-  EXPECT_FALSE(traits.with_base_sync_primitives());
-}
-
-TEST(TaskSchedulerTaskTraitsTest, WithBaseSyncPrimitives) {
-  constexpr TaskTraits traits = {WithBaseSyncPrimitives()};
-  EXPECT_FALSE(traits.priority_set_explicitly());
-  EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
-  EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN, traits.shutdown_behavior());
-  EXPECT_FALSE(traits.may_block());
-  EXPECT_TRUE(traits.with_base_sync_primitives());
-}
-
-TEST(TaskSchedulerTaskTraitsTest, MultipleTraits) {
-  constexpr TaskTraits traits = {TaskPriority::BACKGROUND,
-                                 TaskShutdownBehavior::BLOCK_SHUTDOWN,
-                                 MayBlock(), WithBaseSyncPrimitives()};
-  EXPECT_TRUE(traits.priority_set_explicitly());
-  EXPECT_EQ(TaskPriority::BACKGROUND, traits.priority());
-  EXPECT_EQ(TaskShutdownBehavior::BLOCK_SHUTDOWN, traits.shutdown_behavior());
-  EXPECT_TRUE(traits.may_block());
-  EXPECT_TRUE(traits.with_base_sync_primitives());
-}
-
-TEST(TaskSchedulerTaskTraitsTest, Copy) {
-  constexpr TaskTraits traits = {TaskPriority::BACKGROUND,
-                                 TaskShutdownBehavior::BLOCK_SHUTDOWN,
-                                 MayBlock(), WithBaseSyncPrimitives()};
-  constexpr TaskTraits traits_copy(traits);
-  EXPECT_EQ(traits.priority_set_explicitly(),
-            traits_copy.priority_set_explicitly());
-  EXPECT_EQ(traits.priority(), traits_copy.priority());
-  EXPECT_EQ(traits.shutdown_behavior(), traits_copy.shutdown_behavior());
-  EXPECT_EQ(traits.may_block(), traits_copy.may_block());
-  EXPECT_EQ(traits.with_base_sync_primitives(),
-            traits_copy.with_base_sync_primitives());
-}
-
-TEST(TaskSchedulerTaskTraitsTest, OverridePriority) {
-  constexpr TaskTraits left = {TaskPriority::BACKGROUND};
-  constexpr TaskTraits right = {TaskPriority::USER_BLOCKING};
-  constexpr TaskTraits overridden = TaskTraits::Override(left, right);
-  EXPECT_TRUE(overridden.priority_set_explicitly());
-  EXPECT_EQ(TaskPriority::USER_BLOCKING, overridden.priority());
-  EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
-  EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
-            overridden.shutdown_behavior());
-  EXPECT_FALSE(overridden.may_block());
-  EXPECT_FALSE(overridden.with_base_sync_primitives());
-}
-
-TEST(TaskSchedulerTaskTraitsTest, OverrideShutdownBehavior) {
-  constexpr TaskTraits left = {TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
-  constexpr TaskTraits right = {TaskShutdownBehavior::BLOCK_SHUTDOWN};
-  constexpr TaskTraits overridden = TaskTraits::Override(left, right);
-  EXPECT_FALSE(overridden.priority_set_explicitly());
-  EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
-  EXPECT_TRUE(overridden.shutdown_behavior_set_explicitly());
-  EXPECT_EQ(TaskShutdownBehavior::BLOCK_SHUTDOWN,
-            overridden.shutdown_behavior());
-  EXPECT_FALSE(overridden.may_block());
-  EXPECT_FALSE(overridden.with_base_sync_primitives());
-}
-
-TEST(TaskSchedulerTaskTraitsTest, OverrideMayBlock) {
-  {
-    constexpr TaskTraits left = {MayBlock()};
-    constexpr TaskTraits right = {};
-    constexpr TaskTraits overridden = TaskTraits::Override(left, right);
-    EXPECT_FALSE(overridden.priority_set_explicitly());
-    EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
-    EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
-    EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
-              overridden.shutdown_behavior());
-    EXPECT_TRUE(overridden.may_block());
-    EXPECT_FALSE(overridden.with_base_sync_primitives());
-  }
-  {
-    constexpr TaskTraits left = {};
-    constexpr TaskTraits right = {MayBlock()};
-    constexpr TaskTraits overridden = TaskTraits::Override(left, right);
-    EXPECT_FALSE(overridden.priority_set_explicitly());
-    EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
-    EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
-    EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
-              overridden.shutdown_behavior());
-    EXPECT_TRUE(overridden.may_block());
-    EXPECT_FALSE(overridden.with_base_sync_primitives());
-  }
-}
-
-TEST(TaskSchedulerTaskTraitsTest, OverrideWithBaseSyncPrimitives) {
-  {
-    constexpr TaskTraits left = {WithBaseSyncPrimitives()};
-    constexpr TaskTraits right = {};
-    constexpr TaskTraits overridden = TaskTraits::Override(left, right);
-    EXPECT_FALSE(overridden.priority_set_explicitly());
-    EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
-    EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
-    EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
-              overridden.shutdown_behavior());
-    EXPECT_FALSE(overridden.may_block());
-    EXPECT_TRUE(overridden.with_base_sync_primitives());
-  }
-  {
-    constexpr TaskTraits left = {};
-    constexpr TaskTraits right = {WithBaseSyncPrimitives()};
-    constexpr TaskTraits overridden = TaskTraits::Override(left, right);
-    EXPECT_FALSE(overridden.priority_set_explicitly());
-    EXPECT_EQ(TaskPriority::USER_VISIBLE, overridden.priority());
-    EXPECT_FALSE(overridden.shutdown_behavior_set_explicitly());
-    EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
-              overridden.shutdown_behavior());
-    EXPECT_FALSE(overridden.may_block());
-    EXPECT_TRUE(overridden.with_base_sync_primitives());
-  }
-}
-
-TEST(TaskSchedulerTaskTraitsTest, OverrideMultipleTraits) {
-  constexpr TaskTraits left = {MayBlock(), TaskPriority::BACKGROUND,
-                               TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
-  constexpr TaskTraits right = {WithBaseSyncPrimitives(),
-                                TaskPriority::USER_BLOCKING};
-  constexpr TaskTraits overridden = TaskTraits::Override(left, right);
-  EXPECT_TRUE(overridden.priority_set_explicitly());
-  EXPECT_EQ(right.priority(), overridden.priority());
-  EXPECT_TRUE(overridden.shutdown_behavior_set_explicitly());
-  EXPECT_EQ(left.shutdown_behavior(), overridden.shutdown_behavior());
-  EXPECT_TRUE(overridden.may_block());
-  EXPECT_TRUE(overridden.with_base_sync_primitives());
-}
-
-}  // namespace base
diff --git a/base/task_scheduler/task_traits_unittest.nc b/base/task_scheduler/task_traits_unittest.nc
deleted file mode 100644
index 97f9c4b..0000000
--- a/base/task_scheduler/task_traits_unittest.nc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a "No Compile Test" suite.
-// http://dev.chromium.org/developers/testing/no-compile-tests
-
-#include "base/task_scheduler/task_traits.h"
-
-namespace base {
-
-#if defined(NCTEST_TASK_TRAITS_MULTIPLE_MAY_BLOCK)  // [r"Multiple arguments of the same type were provided to the constructor of TaskTraits."]
-constexpr TaskTraits traits = {MayBlock(), MayBlock()};
-#elif defined(NCTEST_TASK_TRAITS_MULTIPLE_WITH_BASE_SYNC_PRIMITIVES)  // [r"Multiple arguments of the same type were provided to the constructor of TaskTraits."]
-constexpr TaskTraits traits = {WithBaseSyncPrimitives(),
-                               WithBaseSyncPrimitives()};
-#elif defined(NCTEST_TASK_TRAITS_MULTIPLE_TASK_PRIORITY)  // [r"Multiple arguments of the same type were provided to the constructor of TaskTraits."]
-constexpr TaskTraits traits = {TaskPriority::BACKGROUND,
-                               TaskPriority::USER_BLOCKING};
-#elif defined(NCTEST_TASK_TRAITS_MULTIPLE_SHUTDOWN_BEHAVIOR)  // [r"Multiple arguments of the same type were provided to the constructor of TaskTraits."]
-constexpr TaskTraits traits = {TaskShutdownBehavior::BLOCK_SHUTDOWN,
-                               TaskShutdownBehavior::BLOCK_SHUTDOWN};
-#elif defined(NCTEST_TASK_TRAITS_MULTIPLE_SAME_TYPE_MIX)  // [r"Multiple arguments of the same type were provided to the constructor of TaskTraits."]
-constexpr TaskTraits traits = {TaskShutdownBehavior::BLOCK_SHUTDOWN,
-                               MayBlock(),
-                               TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
-#elif defined(NCTEST_TASK_TRAITS_INVALID_TYPE)  // [r"no matching constructor for initialization of 'const base::TaskTraits'"]
-constexpr TaskTraits traits = {TaskShutdownBehavior::BLOCK_SHUTDOWN, true};
-#endif
-
-}  // namespace base
diff --git a/base/task_scheduler/task_unittest.cc b/base/task_scheduler/task_unittest.cc
deleted file mode 100644
index 31a59de..0000000
--- a/base/task_scheduler/task_unittest.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/task.h"
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/location.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-// Verify that the shutdown behavior of a BLOCK_SHUTDOWN delayed task is
-// adjusted to SKIP_ON_SHUTDOWN. The shutown behavior of other delayed tasks
-// should not change.
-TEST(TaskSchedulerTaskTest, ShutdownBehaviorChangeWithDelay) {
-  Task continue_on_shutdown(FROM_HERE, DoNothing(),
-                            {TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
-                            TimeDelta::FromSeconds(1));
-  EXPECT_EQ(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN,
-            continue_on_shutdown.traits.shutdown_behavior());
-
-  Task skip_on_shutdown(FROM_HERE, DoNothing(),
-                        {TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
-                        TimeDelta::FromSeconds(1));
-  EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
-            skip_on_shutdown.traits.shutdown_behavior());
-
-  Task block_shutdown(FROM_HERE, DoNothing(),
-                      {TaskShutdownBehavior::BLOCK_SHUTDOWN},
-                      TimeDelta::FromSeconds(1));
-  EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
-            block_shutdown.traits.shutdown_behavior());
-}
-
-// Verify that the shutdown behavior of undelayed tasks is not adjusted.
-TEST(TaskSchedulerTaskTest, NoShutdownBehaviorChangeNoDelay) {
-  Task continue_on_shutdown(FROM_HERE, DoNothing(),
-                            {TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
-                            TimeDelta());
-  EXPECT_EQ(TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN,
-            continue_on_shutdown.traits.shutdown_behavior());
-
-  Task skip_on_shutdown(FROM_HERE, DoNothing(),
-                        {TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, TimeDelta());
-  EXPECT_EQ(TaskShutdownBehavior::SKIP_ON_SHUTDOWN,
-            skip_on_shutdown.traits.shutdown_behavior());
-
-  Task block_shutdown(FROM_HERE, DoNothing(),
-                      {TaskShutdownBehavior::BLOCK_SHUTDOWN}, TimeDelta());
-  EXPECT_EQ(TaskShutdownBehavior::BLOCK_SHUTDOWN,
-            block_shutdown.traits.shutdown_behavior());
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/task_scheduler/tracked_ref_unittest.cc b/base/task_scheduler/tracked_ref_unittest.cc
deleted file mode 100644
index b793c07..0000000
--- a/base/task_scheduler/tracked_ref_unittest.cc
+++ /dev/null
@@ -1,150 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/task_scheduler/tracked_ref.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/macros.h"
-#include "base/synchronization/atomic_flag.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/thread.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-namespace {
-
-class ObjectWithTrackedRefs {
- public:
-  ObjectWithTrackedRefs() : tracked_ref_factory_(this) {}
-  ~ObjectWithTrackedRefs() { under_destruction_.Set(); }
-
-  TrackedRef<ObjectWithTrackedRefs> GetTrackedRef() {
-    return tracked_ref_factory_.GetTrackedRef();
-  }
-
-  bool under_destruction() const { return under_destruction_.IsSet(); }
-
- private:
-  // True once ~ObjectWithTrackedRefs() has been initiated.
-  AtomicFlag under_destruction_;
-
-  TrackedRefFactory<ObjectWithTrackedRefs> tracked_ref_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(ObjectWithTrackedRefs);
-};
-
-}  // namespace
-
-// Test that an object with a TrackedRefFactory can be destroyed by a single
-// owner but that its destruction will be blocked on the TrackedRefs being
-// released.
-TEST(TrackedRefTest, TrackedRefObjectDeletion) {
-  Thread thread("TrackedRefTestThread");
-  thread.Start();
-
-  std::unique_ptr<ObjectWithTrackedRefs> obj =
-      std::make_unique<ObjectWithTrackedRefs>();
-
-  TimeTicks begin = TimeTicks::Now();
-
-  thread.task_runner()->PostDelayedTask(
-      FROM_HERE,
-      BindOnce(
-          [](TrackedRef<ObjectWithTrackedRefs> obj) {
-            // By the time this kicks in, the object should already be under
-            // destruction, but blocked on this TrackedRef being released. This
-            // is technically racy (main thread has to run |obj.reset()| and
-            // this thread has to observe the side-effects before this delayed
-            // task fires). If this ever flakes this expectation could be turned
-            // into a while(!obj->under_destruction()); but until that's proven
-            // flaky in practice, this expectation is more readable and
-            // diagnosable then a hang.
-            EXPECT_TRUE(obj->under_destruction());
-          },
-          obj->GetTrackedRef()),
-      TestTimeouts::tiny_timeout());
-
-  // This should kick off destruction but block until the above task resolves
-  // and releases the TrackedRef.
-  obj.reset();
-  EXPECT_GE(TimeTicks::Now() - begin, TestTimeouts::tiny_timeout());
-}
-
-TEST(TrackedRefTest, ManyThreadsRacing) {
-  constexpr int kNumThreads = 16;
-  std::vector<std::unique_ptr<Thread>> threads;
-  for (int i = 0; i < kNumThreads; ++i) {
-    threads.push_back(std::make_unique<Thread>("TrackedRefTestThread"));
-    threads.back()->StartAndWaitForTesting();
-  }
-
-  std::unique_ptr<ObjectWithTrackedRefs> obj =
-      std::make_unique<ObjectWithTrackedRefs>();
-
-  // Send a TrackedRef to each thread.
-  for (auto& thread : threads) {
-    thread->task_runner()->PostTask(
-        FROM_HERE, BindOnce(
-                       [](TrackedRef<ObjectWithTrackedRefs> obj) {
-                         // Confirm it's still safe to
-                         // dereference |obj| (and, bonus, that
-                         // playing with TrackedRefs some more
-                         // isn't problematic).
-                         EXPECT_TRUE(obj->GetTrackedRef());
-                       },
-                       obj->GetTrackedRef()));
-  }
-
-  // Initiate destruction racily with the above tasks' execution (they will
-  // crash if TrackedRefs aren't WAI).
-  obj.reset();
-}
-
-// Test that instantiating and deleting a TrackedRefFactory without ever taking
-// a TrackedRef on it is fine.
-TEST(TrackedRefTest, NoTrackedRefs) {
-  ObjectWithTrackedRefs obj;
-}
-
-namespace {
-void ConsumesTrackedRef(TrackedRef<ObjectWithTrackedRefs> obj) {}
-}  // namespace
-
-// Test that destroying a TrackedRefFactory which had TrackedRefs in the past
-// that are already gone is WAI.
-TEST(TrackedRefTest, NoPendingTrackedRefs) {
-  ObjectWithTrackedRefs obj;
-  ConsumesTrackedRef(obj.GetTrackedRef());
-}
-
-TEST(TrackedRefTest, CopyAndMoveSemantics) {
-  struct Foo {
-    Foo() : factory(this) {}
-    TrackedRefFactory<Foo> factory;
-  };
-  Foo foo;
-
-  EXPECT_EQ(1, foo.factory.live_tracked_refs_.SubtleRefCountForDebug());
-
-  {
-    TrackedRef<Foo> plain = foo.factory.GetTrackedRef();
-    EXPECT_EQ(2, foo.factory.live_tracked_refs_.SubtleRefCountForDebug());
-
-    TrackedRef<Foo> copy_constructed(plain);
-    EXPECT_EQ(3, foo.factory.live_tracked_refs_.SubtleRefCountForDebug());
-
-    TrackedRef<Foo> moved_constructed(std::move(copy_constructed));
-    EXPECT_EQ(3, foo.factory.live_tracked_refs_.SubtleRefCountForDebug());
-  }
-
-  EXPECT_EQ(1, foo.factory.live_tracked_refs_.SubtleRefCountForDebug());
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/template_util_unittest.cc b/base/template_util_unittest.cc
deleted file mode 100644
index 2c42445..0000000
--- a/base/template_util_unittest.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/template_util.h"
-
-#include <string>
-
-#include "base/containers/flat_tree.h"
-#include "base/test/move_only_int.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-enum SimpleEnum { SIMPLE_ENUM };
-enum EnumWithExplicitType : uint64_t { ENUM_WITH_EXPLICIT_TYPE };
-enum class ScopedEnum { SCOPED_ENUM };
-enum class ScopedEnumWithOperator { SCOPED_ENUM_WITH_OPERATOR };
-std::ostream& operator<<(std::ostream& os, ScopedEnumWithOperator v) {
-  return os;
-}
-struct SimpleStruct {};
-struct StructWithOperator {};
-std::ostream& operator<<(std::ostream& os, const StructWithOperator& v) {
-  return os;
-}
-
-// is_non_const_reference<Type>
-static_assert(!is_non_const_reference<int>::value, "IsNonConstReference");
-static_assert(!is_non_const_reference<const int&>::value,
-              "IsNonConstReference");
-static_assert(is_non_const_reference<int&>::value, "IsNonConstReference");
-
-// A few standard types that definitely support printing.
-static_assert(internal::SupportsOstreamOperator<int>::value,
-              "ints should be printable");
-static_assert(internal::SupportsOstreamOperator<const char*>::value,
-              "C strings should be printable");
-static_assert(internal::SupportsOstreamOperator<std::string>::value,
-              "std::string should be printable");
-
-// Various kinds of enums operator<< support.
-static_assert(internal::SupportsOstreamOperator<SimpleEnum>::value,
-              "simple enum should be printable by value");
-static_assert(internal::SupportsOstreamOperator<const SimpleEnum&>::value,
-              "simple enum should be printable by const ref");
-static_assert(internal::SupportsOstreamOperator<EnumWithExplicitType>::value,
-              "enum with explicit type should be printable by value");
-static_assert(
-    internal::SupportsOstreamOperator<const EnumWithExplicitType&>::value,
-    "enum with explicit type should be printable by const ref");
-static_assert(!internal::SupportsOstreamOperator<ScopedEnum>::value,
-              "scoped enum should not be printable by value");
-static_assert(!internal::SupportsOstreamOperator<const ScopedEnum&>::value,
-              "simple enum should not be printable by const ref");
-static_assert(internal::SupportsOstreamOperator<ScopedEnumWithOperator>::value,
-              "scoped enum with operator<< should be printable by value");
-static_assert(
-    internal::SupportsOstreamOperator<const ScopedEnumWithOperator&>::value,
-    "scoped enum with operator<< should be printable by const ref");
-
-// operator<< support on structs.
-static_assert(!internal::SupportsOstreamOperator<SimpleStruct>::value,
-              "simple struct should not be printable by value");
-static_assert(!internal::SupportsOstreamOperator<const SimpleStruct&>::value,
-              "simple struct should not be printable by const ref");
-static_assert(internal::SupportsOstreamOperator<StructWithOperator>::value,
-              "struct with operator<< should be printable by value");
-static_assert(
-    internal::SupportsOstreamOperator<const StructWithOperator&>::value,
-    "struct with operator<< should be printable by const ref");
-
-// base::is_trivially_copyable
-class TrivialCopy {
- public:
-  TrivialCopy(int d) : data_(d) {}
-
- protected:
-  int data_;
-};
-
-class TrivialCopyButWithDestructor : public TrivialCopy {
- public:
-  TrivialCopyButWithDestructor(int d) : TrivialCopy(d) {}
-  ~TrivialCopyButWithDestructor() { data_ = 0; }
-};
-
-static_assert(base::is_trivially_copyable<TrivialCopy>::value,
-              "TrivialCopy should be detected as trivially copyable");
-static_assert(!base::is_trivially_copyable<TrivialCopyButWithDestructor>::value,
-              "TrivialCopyButWithDestructor should not be detected as "
-              "trivially copyable");
-
-class NoCopy {
- public:
-  NoCopy(const NoCopy&) = delete;
-};
-
-static_assert(
-    !base::is_trivially_copy_constructible<std::vector<NoCopy>>::value,
-    "is_trivially_copy_constructible<std::vector<T>> must be compiled.");
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
deleted file mode 100644
index 576729c..0000000
--- a/base/test/BUILD.gn
+++ /dev/null
@@ -1,443 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/compiled_action.gni")
-import("//build/config/ui.gni")
-import("//build/config/nacl/config.gni")
-
-if (is_android) {
-  import("//build/config/android/rules.gni")
-}
-
-static_library("test_config") {
-  testonly = true
-  sources = [
-    "test_switches.cc",
-    "test_switches.h",
-    "test_timeouts.cc",
-    "test_timeouts.h",
-  ]
-  deps = [
-    "//base",
-  ]
-}
-
-static_library("test_support") {
-  testonly = true
-  sources = [
-    "../trace_event/trace_config_memory_test_util.h",
-    "android/java_handler_thread_helpers.cc",
-    "android/java_handler_thread_helpers.h",
-    "android/url_utils.cc",
-    "android/url_utils.h",
-    "bind_test_util.h",
-    "copy_only_int.h",
-    "fuzzed_data_provider.cc",
-    "fuzzed_data_provider.h",
-    "gtest_util.cc",
-    "gtest_util.h",
-    "gtest_xml_unittest_result_printer.cc",
-    "gtest_xml_unittest_result_printer.h",
-    "gtest_xml_util.cc",
-    "gtest_xml_util.h",
-    "histogram_tester.cc",
-    "histogram_tester.h",
-    "icu_test_util.cc",
-    "icu_test_util.h",
-    "ios/wait_util.h",
-    "ios/wait_util.mm",
-    "launcher/test_result.cc",
-    "launcher/test_result.h",
-    "launcher/test_results_tracker.h",
-    "launcher/unit_test_launcher.h",
-    "mock_callback.h",
-    "mock_chrome_application_mac.h",
-    "mock_chrome_application_mac.mm",
-    "mock_devices_changed_observer.cc",
-    "mock_devices_changed_observer.h",
-    "mock_entropy_provider.cc",
-    "mock_entropy_provider.h",
-    "mock_log.cc",
-    "mock_log.h",
-    "move_only_int.h",
-    "multiprocess_test.h",
-    "multiprocess_test_android.cc",
-    "null_task_runner.cc",
-    "null_task_runner.h",
-    "perf_log.cc",
-    "perf_log.h",
-    "perf_test_suite.cc",
-    "perf_test_suite.h",
-    "perf_time_logger.cc",
-    "perf_time_logger.h",
-    "power_monitor_test_base.cc",
-    "power_monitor_test_base.h",
-    "scoped_command_line.cc",
-    "scoped_command_line.h",
-    "scoped_environment_variable_override.cc",
-    "scoped_environment_variable_override.h",
-    "scoped_feature_list.cc",
-    "scoped_feature_list.h",
-    "scoped_mock_time_message_loop_task_runner.cc",
-    "scoped_mock_time_message_loop_task_runner.h",
-    "scoped_path_override.cc",
-    "scoped_path_override.h",
-    "scoped_task_environment.cc",
-    "scoped_task_environment.h",
-    "sequenced_task_runner_test_template.cc",
-    "sequenced_task_runner_test_template.h",
-    "simple_test_clock.cc",
-    "simple_test_clock.h",
-    "simple_test_tick_clock.cc",
-    "simple_test_tick_clock.h",
-    "task_runner_test_template.cc",
-    "task_runner_test_template.h",
-    "test_discardable_memory_allocator.cc",
-    "test_discardable_memory_allocator.h",
-    "test_file_util.cc",
-    "test_file_util.h",
-    "test_file_util_android.cc",
-    "test_file_util_linux.cc",
-    "test_file_util_mac.cc",
-    "test_file_util_win.cc",
-    "test_io_thread.cc",
-    "test_io_thread.h",
-    "test_listener_ios.h",
-    "test_listener_ios.mm",
-    "test_message_loop.cc",
-    "test_message_loop.h",
-    "test_mock_time_task_runner.cc",
-    "test_mock_time_task_runner.h",
-    "test_pending_task.cc",
-    "test_pending_task.h",
-    "test_reg_util_win.cc",
-    "test_reg_util_win.h",
-    "test_shared_memory_util.cc",
-    "test_shared_memory_util.h",
-    "test_shortcut_win.cc",
-    "test_shortcut_win.h",
-    "test_simple_task_runner.cc",
-    "test_simple_task_runner.h",
-    "test_suite.cc",
-    "test_suite.h",
-    "test_support_android.cc",
-    "test_support_android.h",
-    "test_support_ios.h",
-    "test_support_ios.mm",
-    "test_ui_thread_android.cc",
-    "test_ui_thread_android.h",
-    "thread_test_helper.cc",
-    "thread_test_helper.h",
-    "trace_event_analyzer.cc",
-    "trace_event_analyzer.h",
-    "trace_to_file.cc",
-    "trace_to_file.h",
-    "user_action_tester.cc",
-    "user_action_tester.h",
-    "values_test_util.cc",
-    "values_test_util.h",
-  ]
-
-  if (is_ios) {
-    sources += [ "launcher/unit_test_launcher_ios.cc" ]
-  } else if (!is_nacl_nonsfi) {
-    sources += [
-      "launcher/test_launcher.cc",
-      "launcher/test_launcher.h",
-      "launcher/test_launcher_tracer.cc",
-      "launcher/test_launcher_tracer.h",
-      "launcher/test_results_tracker.cc",
-      "launcher/unit_test_launcher.cc",
-      "multiprocess_test.cc",
-    ]
-  }
-
-  configs += [ "//build/config:precompiled_headers" ]
-
-  data = [
-    # The isolate needs this script for setting up the test. It's not actually
-    # needed to run this target locally.
-    "//testing/test_env.py",
-  ]
-
-  public_deps = [
-    ":test_config",
-    "//base",
-    "//base:base_static",
-    "//base:i18n",
-  ]
-  deps = [
-    "//base/third_party/dynamic_annotations",
-    "//testing/gmock",
-    "//testing/gtest",
-    "//third_party/icu:icuuc",
-    "//third_party/libxml",
-  ]
-
-  if (is_posix || is_fuchsia) {
-    sources += [
-      "scoped_locale.cc",
-      "scoped_locale.h",
-      "test_file_util_posix.cc",
-    ]
-  }
-
-  if (is_linux) {
-    public_deps += [ ":fontconfig_util_linux" ]
-    data_deps = [
-      "//third_party/test_fonts",
-    ]
-    if (current_toolchain == host_toolchain) {
-      data_deps += [ ":do_generate_fontconfig_caches" ]
-      data += [ "$root_out_dir/fontconfig_caches/" ]
-    }
-  }
-
-  if (is_ios) {
-    set_sources_assignment_filter([])
-    sources += [ "test_file_util_mac.cc" ]
-    set_sources_assignment_filter(sources_assignment_filter)
-  }
-
-  if (is_mac) {
-    libs = [ "AppKit.framework" ]
-  }
-
-  if (is_android) {
-    set_sources_assignment_filter([])
-    sources += [ "test_file_util_linux.cc" ]
-    set_sources_assignment_filter(sources_assignment_filter)
-    deps += [
-      ":base_unittests_jni_headers",
-      ":test_support_jni_headers",
-    ]
-    public_deps += [ ":test_support_java" ]
-  }
-
-  if (is_nacl_nonsfi) {
-    sources += [
-      "launcher/test_launcher.h",
-      "launcher/test_result.h",
-      "launcher/unit_test_launcher.h",
-      "launcher/unit_test_launcher_nacl_nonsfi.cc",
-    ]
-    sources -= [
-      "gtest_xml_util.cc",
-      "gtest_xml_util.h",
-      "icu_test_util.cc",
-      "icu_test_util.h",
-      "perf_test_suite.cc",
-      "perf_test_suite.h",
-      "scoped_path_override.cc",
-      "scoped_path_override.h",
-      "test_discardable_memory_allocator.cc",
-      "test_discardable_memory_allocator.h",
-      "test_file_util.cc",
-      "test_file_util.h",
-      "test_file_util_posix.cc",
-      "test_suite.cc",
-      "test_suite.h",
-      "trace_to_file.cc",
-      "trace_to_file.h",
-    ]
-    public_deps -= [ "//base:i18n" ]
-    deps -= [
-      "//third_party/icu:icuuc",
-      "//third_party/libxml",
-    ]
-  }
-}
-
-config("perf_test_config") {
-  defines = [ "PERF_TEST" ]
-}
-
-# This is a source set instead of a static library because it seems like some
-# linkers get confused when "main" is in a static library, and if you link to
-# this, you always want the object file anyway.
-source_set("test_support_perf") {
-  testonly = true
-  sources = [
-    "run_all_perftests.cc",
-  ]
-  deps = [
-    ":test_support",
-    "//base",
-    "//testing/gtest",
-  ]
-
-  public_configs = [ ":perf_test_config" ]
-}
-
-static_library("test_launcher_nacl_nonsfi") {
-  testonly = true
-  sources = [
-    "launcher/test_launcher_nacl_nonsfi.cc",
-    "launcher/test_launcher_nacl_nonsfi.h",
-  ]
-  deps = [
-    ":test_support",
-  ]
-}
-
-static_library("run_all_unittests") {
-  testonly = true
-  sources = [
-    "run_all_unittests.cc",
-  ]
-  deps = [
-    ":test_support",
-  ]
-}
-
-# These sources are linked into both the base_unittests binary and the test
-# shared library target below.
-source_set("native_library_test_utils") {
-  testonly = true
-  sources = [
-    "native_library_test_utils.cc",
-    "native_library_test_utils.h",
-  ]
-}
-
-# This shared library is dynamically loaded by NativeLibrary unittests.
-shared_library("test_shared_library") {
-  testonly = true
-  sources = [
-    "test_shared_library.cc",
-  ]
-
-  deps = [
-    ":native_library_test_utils",
-  ]
-}
-
-static_library("run_all_base_unittests") {
-  # Only targets in base should depend on this, targets outside base
-  # should depend on run_all_unittests above.
-  visibility = [ "//base/*" ]
-  testonly = true
-  sources = [
-    "run_all_base_unittests.cc",
-  ]
-  deps = [
-    ":test_support",
-  ]
-}
-
-if (is_linux) {
-  source_set("fontconfig_util_linux") {
-    sources = [
-      "fontconfig_util_linux.cc",
-      "fontconfig_util_linux.h",
-    ]
-    deps = [
-      "//base",
-      "//third_party/fontconfig",
-    ]
-  }
-
-  if (current_toolchain == host_toolchain) {
-    executable("generate_fontconfig_caches") {
-      testonly = true
-      sources = [
-        "generate_fontconfig_caches.cc",
-      ]
-      deps = [
-        ":fontconfig_util_linux",
-        "//base",
-        "//build/config:exe_and_shlib_deps",
-      ]
-    }
-
-    compiled_action("do_generate_fontconfig_caches") {
-      testonly = true
-      tool = ":generate_fontconfig_caches"
-      data_deps = [
-        "//third_party/test_fonts",
-      ]
-      args = []
-      outputs = [
-        "$root_out_dir/fontconfig_caches/STAMP",
-      ]
-    }
-  }
-
-  shared_library("malloc_wrapper") {
-    testonly = true
-    sources = [
-      "malloc_wrapper.cc",
-    ]
-    deps = [
-      "//base",
-      "//build/config:exe_and_shlib_deps",
-    ]
-  }
-}
-
-if (is_android) {
-  generate_jni("base_unittests_jni_headers") {
-    sources = [
-      "android/java/src/org/chromium/base/ContentUriTestUtils.java",
-      "android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java",
-      "android/java/src/org/chromium/base/TestUiThread.java",
-    ]
-    jni_package = "base"
-  }
-
-  generate_jni("test_support_jni_headers") {
-    sources = [
-      "android/java/src/org/chromium/base/MainReturnCodeResult.java",
-      "android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java",
-      "android/javatests/src/org/chromium/base/test/util/UrlUtils.java",
-    ]
-    jni_package = "base"
-  }
-
-  android_library("test_support_java") {
-    testonly = true
-    deps = [
-      "//base:base_java",
-      "//testing/android/native_test:native_main_runner_java",
-      "//third_party/android_tools:android_support_annotations_java",
-      "//third_party/jsr-305:jsr_305_javalib",
-    ]
-    srcjar_deps = [ ":test_support_java_aidl" ]
-    java_files = [
-      "android/java/src/org/chromium/base/MainReturnCodeResult.java",
-      "android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java",
-      "android/java/src/org/chromium/base/MultiprocessTestClientService.java",
-      "android/java/src/org/chromium/base/MultiprocessTestClientService0.java",
-      "android/java/src/org/chromium/base/MultiprocessTestClientService1.java",
-      "android/java/src/org/chromium/base/MultiprocessTestClientService2.java",
-      "android/java/src/org/chromium/base/MultiprocessTestClientService3.java",
-      "android/java/src/org/chromium/base/MultiprocessTestClientService4.java",
-      "android/java/src/org/chromium/base/MultiprocessTestClientServiceDelegate.java",
-    ]
-  }
-
-  android_aidl("test_support_java_aidl") {
-    testonly = true
-    import_include = [
-      "android/java/src",
-      "//base/android/java/src",
-    ]
-    sources = [
-      "android/java/src/org/chromium/base/ITestCallback.aidl",
-      "android/java/src/org/chromium/base/ITestController.aidl",
-    ]
-  }
-}
-
-# Trivial executable which outputs space-delimited argv to stdout,
-# used for testing.
-executable("test_child_process") {
-  testonly = true
-  sources = [
-    "test_child_process.cc",
-  ]
-  deps = [
-    "//build/config:exe_and_shlib_deps",
-  ]
-}
diff --git a/base/test/histogram_tester_unittest.cc b/base/test/histogram_tester_unittest.cc
deleted file mode 100644
index e49ed97..0000000
--- a/base/test/histogram_tester_unittest.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/histogram_tester.h"
-
-#include <memory>
-
-#include "base/metrics/histogram_macros.h"
-#include "base/metrics/histogram_samples.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::ElementsAre;
-using ::testing::IsEmpty;
-
-namespace {
-
-const char kHistogram1[] = "Test1";
-const char kHistogram2[] = "Test2";
-const char kHistogram3[] = "Test3";
-const char kHistogram4[] = "Test4";
-const char kHistogram5[] = "Test5";
-
-}  // namespace
-
-namespace base {
-
-typedef testing::Test HistogramTesterTest;
-
-TEST_F(HistogramTesterTest, Scope) {
-  // Record a histogram before the creation of the recorder.
-  UMA_HISTOGRAM_BOOLEAN(kHistogram1, true);
-
-  HistogramTester tester;
-
-  // Verify that no histogram is recorded.
-  tester.ExpectTotalCount(kHistogram1, 0);
-
-  // Record a histogram after the creation of the recorder.
-  UMA_HISTOGRAM_BOOLEAN(kHistogram1, true);
-
-  // Verify that one histogram is recorded.
-  std::unique_ptr<HistogramSamples> samples(
-      tester.GetHistogramSamplesSinceCreation(kHistogram1));
-  EXPECT_TRUE(samples);
-  EXPECT_EQ(1, samples->TotalCount());
-}
-
-TEST_F(HistogramTesterTest, GetHistogramSamplesSinceCreationNotNull) {
-  // Chose the histogram name uniquely, to ensure nothing was recorded for it so
-  // far.
-  static const char kHistogram[] =
-      "GetHistogramSamplesSinceCreationNotNullHistogram";
-  HistogramTester tester;
-
-  // Verify that the returned samples are empty but not null.
-  std::unique_ptr<HistogramSamples> samples(
-      tester.GetHistogramSamplesSinceCreation(kHistogram1));
-  EXPECT_TRUE(samples);
-  tester.ExpectTotalCount(kHistogram, 0);
-}
-
-TEST_F(HistogramTesterTest, TestUniqueSample) {
-  HistogramTester tester;
-
-  // Record into a sample thrice
-  UMA_HISTOGRAM_COUNTS_100(kHistogram2, 2);
-  UMA_HISTOGRAM_COUNTS_100(kHistogram2, 2);
-  UMA_HISTOGRAM_COUNTS_100(kHistogram2, 2);
-
-  tester.ExpectUniqueSample(kHistogram2, 2, 3);
-}
-
-TEST_F(HistogramTesterTest, TestBucketsSample) {
-  HistogramTester tester;
-
-  // Record into a sample twice
-  UMA_HISTOGRAM_COUNTS_100(kHistogram3, 2);
-  UMA_HISTOGRAM_COUNTS_100(kHistogram3, 2);
-  UMA_HISTOGRAM_COUNTS_100(kHistogram3, 2);
-  UMA_HISTOGRAM_COUNTS_100(kHistogram3, 2);
-  UMA_HISTOGRAM_COUNTS_100(kHistogram3, 3);
-
-  tester.ExpectBucketCount(kHistogram3, 2, 4);
-  tester.ExpectBucketCount(kHistogram3, 3, 1);
-
-  tester.ExpectTotalCount(kHistogram3, 5);
-}
-
-TEST_F(HistogramTesterTest, TestBucketsSampleWithScope) {
-  // Record into a sample twice, once before the tester creation and once after.
-  UMA_HISTOGRAM_COUNTS_100(kHistogram4, 2);
-
-  HistogramTester tester;
-  UMA_HISTOGRAM_COUNTS_100(kHistogram4, 3);
-
-  tester.ExpectBucketCount(kHistogram4, 2, 0);
-  tester.ExpectBucketCount(kHistogram4, 3, 1);
-
-  tester.ExpectTotalCount(kHistogram4, 1);
-}
-
-TEST_F(HistogramTesterTest, TestGetAllSamples) {
-  HistogramTester tester;
-  UMA_HISTOGRAM_ENUMERATION(kHistogram5, 2, 5);
-  UMA_HISTOGRAM_ENUMERATION(kHistogram5, 3, 5);
-  UMA_HISTOGRAM_ENUMERATION(kHistogram5, 3, 5);
-  UMA_HISTOGRAM_ENUMERATION(kHistogram5, 5, 5);
-
-  EXPECT_THAT(tester.GetAllSamples(kHistogram5),
-              ElementsAre(Bucket(2, 1), Bucket(3, 2), Bucket(5, 1)));
-}
-
-TEST_F(HistogramTesterTest, TestGetAllSamples_NoSamples) {
-  HistogramTester tester;
-  EXPECT_THAT(tester.GetAllSamples(kHistogram5), IsEmpty());
-}
-
-TEST_F(HistogramTesterTest, TestGetTotalCountsForPrefix) {
-  HistogramTester tester;
-  UMA_HISTOGRAM_ENUMERATION("Test1.Test2.Test3", 2, 5);
-
-  // Regression check for bug https://crbug.com/659977.
-  EXPECT_TRUE(tester.GetTotalCountsForPrefix("Test2.").empty());
-
-  EXPECT_EQ(1u, tester.GetTotalCountsForPrefix("Test1.").size());
-}
-
-}  // namespace base
diff --git a/base/test/mock_callback_unittest.cc b/base/test/mock_callback_unittest.cc
deleted file mode 100644
index c5f109f..0000000
--- a/base/test/mock_callback_unittest.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/mock_callback.h"
-
-#include "base/callback.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-using testing::InSequence;
-using testing::Return;
-
-namespace base {
-namespace {
-
-TEST(MockCallbackTest, ZeroArgs) {
-  MockCallback<Closure> mock_closure;
-  EXPECT_CALL(mock_closure, Run());
-  mock_closure.Get().Run();
-
-  MockCallback<Callback<int()>> mock_int_callback;
-  {
-    InSequence sequence;
-    EXPECT_CALL(mock_int_callback, Run()).WillOnce(Return(42));
-    EXPECT_CALL(mock_int_callback, Run()).WillOnce(Return(88));
-  }
-  EXPECT_EQ(42, mock_int_callback.Get().Run());
-  EXPECT_EQ(88, mock_int_callback.Get().Run());
-}
-
-TEST(MockCallbackTest, WithArgs) {
-  MockCallback<Callback<int(int, int)>> mock_two_int_callback;
-  EXPECT_CALL(mock_two_int_callback, Run(1, 2)).WillOnce(Return(42));
-  EXPECT_CALL(mock_two_int_callback, Run(0, 0)).WillRepeatedly(Return(-1));
-  Callback<int(int, int)> two_int_callback = mock_two_int_callback.Get();
-  EXPECT_EQ(-1, two_int_callback.Run(0, 0));
-  EXPECT_EQ(42, two_int_callback.Run(1, 2));
-  EXPECT_EQ(-1, two_int_callback.Run(0, 0));
-}
-
-TEST(MockCallbackTest, ZeroArgsOnce) {
-  MockCallback<OnceClosure> mock_closure;
-  EXPECT_CALL(mock_closure, Run());
-  mock_closure.Get().Run();
-
-  MockCallback<OnceCallback<int()>> mock_int_callback;
-  EXPECT_CALL(mock_int_callback, Run()).WillOnce(Return(88));
-  EXPECT_EQ(88, mock_int_callback.Get().Run());
-}
-
-TEST(MockCallbackTest, WithArgsOnce) {
-  MockCallback<OnceCallback<int(int, int)>> mock_two_int_callback;
-  EXPECT_CALL(mock_two_int_callback, Run(1, 2)).WillOnce(Return(42));
-  OnceCallback<int(int, int)> two_int_callback = mock_two_int_callback.Get();
-  EXPECT_EQ(42, std::move(two_int_callback).Run(1, 2));
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/test/scoped_feature_list_unittest.cc b/base/test/scoped_feature_list_unittest.cc
deleted file mode 100644
index 03d9897..0000000
--- a/base/test/scoped_feature_list_unittest.cc
+++ /dev/null
@@ -1,297 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/scoped_feature_list.h"
-
-#include <map>
-#include <string>
-#include <utility>
-
-#include "base/metrics/field_trial.h"
-#include "base/metrics/field_trial_params.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace test {
-
-namespace {
-
-const Feature kTestFeature1{"TestFeature1", FEATURE_DISABLED_BY_DEFAULT};
-const Feature kTestFeature2{"TestFeature2", FEATURE_DISABLED_BY_DEFAULT};
-
-void ExpectFeatures(const std::string& enabled_features,
-                    const std::string& disabled_features) {
-  FeatureList* list = FeatureList::GetInstance();
-  std::string actual_enabled_features;
-  std::string actual_disabled_features;
-
-  list->GetFeatureOverrides(&actual_enabled_features,
-                            &actual_disabled_features);
-
-  EXPECT_EQ(enabled_features, actual_enabled_features);
-  EXPECT_EQ(disabled_features, actual_disabled_features);
-}
-
-}  // namespace
-
-class ScopedFeatureListTest : public testing::Test {
- public:
-  ScopedFeatureListTest() {
-    // Clear default feature list.
-    std::unique_ptr<FeatureList> feature_list(new FeatureList);
-    feature_list->InitializeFromCommandLine(std::string(), std::string());
-    original_feature_list_ = FeatureList::ClearInstanceForTesting();
-    FeatureList::SetInstance(std::move(feature_list));
-  }
-
-  ~ScopedFeatureListTest() override {
-    // Restore feature list.
-    if (original_feature_list_) {
-      FeatureList::ClearInstanceForTesting();
-      FeatureList::RestoreInstanceForTesting(std::move(original_feature_list_));
-    }
-  }
-
- private:
-  // Save the present FeatureList and restore it after test finish.
-  std::unique_ptr<FeatureList> original_feature_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedFeatureListTest);
-};
-
-TEST_F(ScopedFeatureListTest, BasicScoped) {
-  ExpectFeatures(std::string(), std::string());
-  EXPECT_FALSE(FeatureList::IsEnabled(kTestFeature1));
-  {
-    test::ScopedFeatureList feature_list1;
-    feature_list1.InitFromCommandLine("TestFeature1", std::string());
-    ExpectFeatures("TestFeature1", std::string());
-    EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature1));
-  }
-  ExpectFeatures(std::string(), std::string());
-  EXPECT_FALSE(FeatureList::IsEnabled(kTestFeature1));
-}
-
-TEST_F(ScopedFeatureListTest, EnableWithFeatureParameters) {
-  const char kParam1[] = "param_1";
-  const char kParam2[] = "param_2";
-  const char kValue1[] = "value_1";
-  const char kValue2[] = "value_2";
-  std::map<std::string, std::string> parameters;
-  parameters[kParam1] = kValue1;
-  parameters[kParam2] = kValue2;
-
-  ExpectFeatures(std::string(), std::string());
-  EXPECT_EQ(nullptr, FeatureList::GetFieldTrial(kTestFeature1));
-  EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature1, kParam1));
-  EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature1, kParam2));
-  FieldTrial::ActiveGroups active_groups;
-  FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-  EXPECT_EQ(0u, active_groups.size());
-
-  {
-    test::ScopedFeatureList feature_list;
-
-    feature_list.InitAndEnableFeatureWithParameters(kTestFeature1, parameters);
-    EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature1));
-    EXPECT_EQ(kValue1,
-              GetFieldTrialParamValueByFeature(kTestFeature1, kParam1));
-    EXPECT_EQ(kValue2,
-              GetFieldTrialParamValueByFeature(kTestFeature1, kParam2));
-    active_groups.clear();
-    FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-    EXPECT_EQ(1u, active_groups.size());
-  }
-
-  ExpectFeatures(std::string(), std::string());
-  EXPECT_EQ(nullptr, FeatureList::GetFieldTrial(kTestFeature1));
-  EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature1, kParam1));
-  EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature1, kParam2));
-  active_groups.clear();
-  FieldTrialList::GetActiveFieldTrialGroups(&active_groups);
-  EXPECT_EQ(0u, active_groups.size());
-}
-
-TEST_F(ScopedFeatureListTest, OverrideWithFeatureParameters) {
-  FieldTrialList field_trial_list(nullptr);
-  scoped_refptr<FieldTrial> trial =
-      FieldTrialList::CreateFieldTrial("foo", "bar");
-  const char kParam[] = "param_1";
-  const char kValue[] = "value_1";
-  std::map<std::string, std::string> parameters;
-  parameters[kParam] = kValue;
-
-  test::ScopedFeatureList feature_list1;
-  feature_list1.InitFromCommandLine("TestFeature1<foo,TestFeature2",
-                                    std::string());
-
-  // Check initial state.
-  ExpectFeatures("TestFeature1<foo,TestFeature2", std::string());
-  EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature1));
-  EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature2));
-  EXPECT_EQ(trial.get(), FeatureList::GetFieldTrial(kTestFeature1));
-  EXPECT_EQ(nullptr, FeatureList::GetFieldTrial(kTestFeature2));
-  EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature1, kParam));
-  EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature2, kParam));
-
-  {
-    // Override feature with existing field trial.
-    test::ScopedFeatureList feature_list2;
-
-    feature_list2.InitAndEnableFeatureWithParameters(kTestFeature1, parameters);
-    EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature1));
-    EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature2));
-    EXPECT_EQ(kValue, GetFieldTrialParamValueByFeature(kTestFeature1, kParam));
-    EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature2, kParam));
-    EXPECT_NE(trial.get(), FeatureList::GetFieldTrial(kTestFeature1));
-    EXPECT_NE(nullptr, FeatureList::GetFieldTrial(kTestFeature1));
-    EXPECT_EQ(nullptr, FeatureList::GetFieldTrial(kTestFeature2));
-  }
-
-  // Check that initial state is restored.
-  ExpectFeatures("TestFeature1<foo,TestFeature2", std::string());
-  EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature1));
-  EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature2));
-  EXPECT_EQ(trial.get(), FeatureList::GetFieldTrial(kTestFeature1));
-  EXPECT_EQ(nullptr, FeatureList::GetFieldTrial(kTestFeature2));
-  EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature1, kParam));
-  EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature2, kParam));
-
-  {
-    // Override feature with no existing field trial.
-    test::ScopedFeatureList feature_list2;
-
-    feature_list2.InitAndEnableFeatureWithParameters(kTestFeature2, parameters);
-    EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature1));
-    EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature2));
-    EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature1, kParam));
-    EXPECT_EQ(kValue, GetFieldTrialParamValueByFeature(kTestFeature2, kParam));
-    EXPECT_EQ(trial.get(), FeatureList::GetFieldTrial(kTestFeature1));
-    EXPECT_NE(nullptr, FeatureList::GetFieldTrial(kTestFeature2));
-  }
-
-  // Check that initial state is restored.
-  ExpectFeatures("TestFeature1<foo,TestFeature2", std::string());
-  EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature1));
-  EXPECT_TRUE(FeatureList::IsEnabled(kTestFeature2));
-  EXPECT_EQ(trial.get(), FeatureList::GetFieldTrial(kTestFeature1));
-  EXPECT_EQ(nullptr, FeatureList::GetFieldTrial(kTestFeature2));
-  EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature1, kParam));
-  EXPECT_EQ("", GetFieldTrialParamValueByFeature(kTestFeature2, kParam));
-}
-
-TEST_F(ScopedFeatureListTest, EnableFeatureOverrideDisable) {
-  test::ScopedFeatureList feature_list1;
-  feature_list1.InitWithFeatures({}, {kTestFeature1});
-
-  {
-    test::ScopedFeatureList feature_list2;
-    feature_list2.InitWithFeatures({kTestFeature1}, {});
-    ExpectFeatures("TestFeature1", std::string());
-  }
-}
-
-TEST_F(ScopedFeatureListTest, FeatureOverrideNotMakeDuplicate) {
-  test::ScopedFeatureList feature_list1;
-  feature_list1.InitWithFeatures({}, {kTestFeature1});
-
-  {
-    test::ScopedFeatureList feature_list2;
-    feature_list2.InitWithFeatures({}, {kTestFeature1});
-    ExpectFeatures(std::string(), "TestFeature1");
-  }
-}
-
-TEST_F(ScopedFeatureListTest, FeatureOverrideFeatureWithDefault) {
-  test::ScopedFeatureList feature_list1;
-  feature_list1.InitFromCommandLine("*TestFeature1", std::string());
-
-  {
-    test::ScopedFeatureList feature_list2;
-    feature_list2.InitWithFeatures({kTestFeature1}, {});
-    ExpectFeatures("TestFeature1", std::string());
-  }
-}
-
-TEST_F(ScopedFeatureListTest, FeatureOverrideFeatureWithDefault2) {
-  test::ScopedFeatureList feature_list1;
-  feature_list1.InitFromCommandLine("*TestFeature1", std::string());
-
-  {
-    test::ScopedFeatureList feature_list2;
-    feature_list2.InitWithFeatures({}, {kTestFeature1});
-    ExpectFeatures(std::string(), "TestFeature1");
-  }
-}
-
-TEST_F(ScopedFeatureListTest, FeatureOverrideFeatureWithEnabledFieldTrial) {
-  test::ScopedFeatureList feature_list1;
-
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-  FieldTrialList field_trial_list(nullptr);
-  FieldTrial* trial = FieldTrialList::CreateFieldTrial("TrialExample", "A");
-  feature_list->RegisterFieldTrialOverride(
-      kTestFeature1.name, FeatureList::OVERRIDE_ENABLE_FEATURE, trial);
-  feature_list1.InitWithFeatureList(std::move(feature_list));
-
-  {
-    test::ScopedFeatureList feature_list2;
-    feature_list2.InitWithFeatures({kTestFeature1}, {});
-    ExpectFeatures("TestFeature1", std::string());
-  }
-}
-
-TEST_F(ScopedFeatureListTest, FeatureOverrideFeatureWithDisabledFieldTrial) {
-  test::ScopedFeatureList feature_list1;
-
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-  FieldTrialList field_trial_list(nullptr);
-  FieldTrial* trial = FieldTrialList::CreateFieldTrial("TrialExample", "A");
-  feature_list->RegisterFieldTrialOverride(
-      kTestFeature1.name, FeatureList::OVERRIDE_DISABLE_FEATURE, trial);
-  feature_list1.InitWithFeatureList(std::move(feature_list));
-
-  {
-    test::ScopedFeatureList feature_list2;
-    feature_list2.InitWithFeatures({kTestFeature1}, {});
-    ExpectFeatures("TestFeature1", std::string());
-  }
-}
-
-TEST_F(ScopedFeatureListTest, FeatureOverrideKeepsOtherExistingFeature) {
-  test::ScopedFeatureList feature_list1;
-  feature_list1.InitWithFeatures({}, {kTestFeature1});
-
-  {
-    test::ScopedFeatureList feature_list2;
-    feature_list2.InitWithFeatures({}, {kTestFeature2});
-    EXPECT_FALSE(FeatureList::IsEnabled(kTestFeature1));
-    EXPECT_FALSE(FeatureList::IsEnabled(kTestFeature2));
-  }
-}
-
-TEST_F(ScopedFeatureListTest, FeatureOverrideKeepsOtherExistingFeature2) {
-  test::ScopedFeatureList feature_list1;
-  feature_list1.InitWithFeatures({}, {kTestFeature1});
-
-  {
-    test::ScopedFeatureList feature_list2;
-    feature_list2.InitWithFeatures({kTestFeature2}, {});
-    ExpectFeatures("TestFeature2", "TestFeature1");
-  }
-}
-
-TEST_F(ScopedFeatureListTest, FeatureOverrideKeepsOtherExistingDefaultFeature) {
-  test::ScopedFeatureList feature_list1;
-  feature_list1.InitFromCommandLine("*TestFeature1", std::string());
-
-  {
-    test::ScopedFeatureList feature_list2;
-    feature_list2.InitWithFeatures({}, {kTestFeature2});
-    ExpectFeatures("*TestFeature1", "TestFeature2");
-  }
-}
-
-}  // namespace test
-}  // namespace base
diff --git a/base/test/scoped_mock_time_message_loop_task_runner_unittest.cc b/base/test/scoped_mock_time_message_loop_task_runner_unittest.cc
deleted file mode 100644
index b08323d..0000000
--- a/base/test/scoped_mock_time_message_loop_task_runner_unittest.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/scoped_mock_time_message_loop_task_runner.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback_forward.h"
-#include "base/containers/circular_deque.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/message_loop/message_loop_current.h"
-#include "base/test/test_mock_time_task_runner.h"
-#include "base/test/test_pending_task.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-TaskRunner* GetCurrentTaskRunner() {
-  return MessageLoopCurrent::Get()->task_runner().get();
-}
-
-void AssignTrue(bool* out) {
-  *out = true;
-}
-
-// Pops a task from the front of |pending_tasks| and returns it.
-TestPendingTask PopFront(base::circular_deque<TestPendingTask>* pending_tasks) {
-  TestPendingTask task = std::move(pending_tasks->front());
-  pending_tasks->pop_front();
-  return task;
-}
-
-class ScopedMockTimeMessageLoopTaskRunnerTest : public testing::Test {
- public:
-  ScopedMockTimeMessageLoopTaskRunnerTest()
-      : original_task_runner_(new TestMockTimeTaskRunner()) {
-    MessageLoopCurrent::Get()->SetTaskRunner(original_task_runner_);
-  }
-
- protected:
-  TestMockTimeTaskRunner* original_task_runner() {
-    return original_task_runner_.get();
-  }
-
- private:
-  scoped_refptr<TestMockTimeTaskRunner> original_task_runner_;
-
-  MessageLoop message_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedMockTimeMessageLoopTaskRunnerTest);
-};
-
-// Verifies a new TaskRunner is installed while a
-// ScopedMockTimeMessageLoopTaskRunner exists and the previous one is installed
-// after destruction.
-TEST_F(ScopedMockTimeMessageLoopTaskRunnerTest, CurrentTaskRunners) {
-  auto scoped_task_runner_ =
-      std::make_unique<ScopedMockTimeMessageLoopTaskRunner>();
-  EXPECT_EQ(scoped_task_runner_->task_runner(), GetCurrentTaskRunner());
-  scoped_task_runner_.reset();
-  EXPECT_EQ(original_task_runner(), GetCurrentTaskRunner());
-}
-
-TEST_F(ScopedMockTimeMessageLoopTaskRunnerTest,
-       IncompleteTasksAreCopiedToPreviousTaskRunnerAfterDestruction) {
-  auto scoped_task_runner_ =
-      std::make_unique<ScopedMockTimeMessageLoopTaskRunner>();
-
-  bool task_10_has_run = false;
-  bool task_11_has_run = false;
-
-  Closure task_1 = DoNothing();
-  Closure task_2 = DoNothing();
-  Closure task_10 = Bind(&AssignTrue, &task_10_has_run);
-  Closure task_11 = Bind(&AssignTrue, &task_11_has_run);
-
-  constexpr TimeDelta task_1_delay = TimeDelta::FromSeconds(1);
-  constexpr TimeDelta task_2_delay = TimeDelta::FromSeconds(2);
-  constexpr TimeDelta task_10_delay = TimeDelta::FromSeconds(10);
-  constexpr TimeDelta task_11_delay = TimeDelta::FromSeconds(11);
-
-  constexpr TimeDelta step_time_by = TimeDelta::FromSeconds(5);
-
-  GetCurrentTaskRunner()->PostDelayedTask(FROM_HERE, task_1, task_1_delay);
-  GetCurrentTaskRunner()->PostDelayedTask(FROM_HERE, task_2, task_2_delay);
-  GetCurrentTaskRunner()->PostDelayedTask(FROM_HERE, task_10, task_10_delay);
-  GetCurrentTaskRunner()->PostDelayedTask(FROM_HERE, task_11, task_11_delay);
-
-  scoped_task_runner_->task_runner()->FastForwardBy(step_time_by);
-
-  scoped_task_runner_.reset();
-
-  base::circular_deque<TestPendingTask> pending_tasks =
-      original_task_runner()->TakePendingTasks();
-
-  EXPECT_EQ(2U, pending_tasks.size());
-
-  TestPendingTask pending_task = PopFront(&pending_tasks);
-  EXPECT_FALSE(task_10_has_run);
-  std::move(pending_task.task).Run();
-  EXPECT_TRUE(task_10_has_run);
-  EXPECT_EQ(task_10_delay - step_time_by, pending_task.delay);
-
-  pending_task = PopFront(&pending_tasks);
-  EXPECT_FALSE(task_11_has_run);
-  std::move(pending_task.task).Run();
-  EXPECT_TRUE(task_11_has_run);
-  EXPECT_EQ(task_11_delay - step_time_by, pending_task.delay);
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/test/scoped_task_environment_unittest.cc b/base/test/scoped_task_environment_unittest.cc
deleted file mode 100644
index 1c10d69..0000000
--- a/base/test/scoped_task_environment_unittest.cc
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/scoped_task_environment.h"
-
-#include <memory>
-
-#include "base/atomicops.h"
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/synchronization/atomic_flag.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/sequence_local_storage_slot.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/tick_clock.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_POSIX)
-#include <unistd.h>
-#include "base/files/file_descriptor_watcher_posix.h"
-#endif  // defined(OS_POSIX)
-
-namespace base {
-namespace test {
-
-namespace {
-
-class ScopedTaskEnvironmentTest
-    : public testing::TestWithParam<ScopedTaskEnvironment::MainThreadType> {};
-
-void VerifyRunUntilIdleDidNotReturnAndSetFlag(
-    AtomicFlag* run_until_idle_returned,
-    AtomicFlag* task_ran) {
-  EXPECT_FALSE(run_until_idle_returned->IsSet());
-  task_ran->Set();
-}
-
-void RunUntilIdleTest(
-    ScopedTaskEnvironment::MainThreadType main_thread_type,
-    ScopedTaskEnvironment::ExecutionMode execution_control_mode) {
-  AtomicFlag run_until_idle_returned;
-  ScopedTaskEnvironment scoped_task_environment(main_thread_type,
-                                                execution_control_mode);
-
-  AtomicFlag first_main_thread_task_ran;
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&VerifyRunUntilIdleDidNotReturnAndSetFlag,
-                          Unretained(&run_until_idle_returned),
-                          Unretained(&first_main_thread_task_ran)));
-
-  AtomicFlag first_task_scheduler_task_ran;
-  PostTask(FROM_HERE, BindOnce(&VerifyRunUntilIdleDidNotReturnAndSetFlag,
-                               Unretained(&run_until_idle_returned),
-                               Unretained(&first_task_scheduler_task_ran)));
-
-  AtomicFlag second_task_scheduler_task_ran;
-  AtomicFlag second_main_thread_task_ran;
-  PostTaskAndReply(FROM_HERE,
-                   BindOnce(&VerifyRunUntilIdleDidNotReturnAndSetFlag,
-                            Unretained(&run_until_idle_returned),
-                            Unretained(&second_task_scheduler_task_ran)),
-                   BindOnce(&VerifyRunUntilIdleDidNotReturnAndSetFlag,
-                            Unretained(&run_until_idle_returned),
-                            Unretained(&second_main_thread_task_ran)));
-
-  scoped_task_environment.RunUntilIdle();
-  run_until_idle_returned.Set();
-
-  EXPECT_TRUE(first_main_thread_task_ran.IsSet());
-  EXPECT_TRUE(first_task_scheduler_task_ran.IsSet());
-  EXPECT_TRUE(second_task_scheduler_task_ran.IsSet());
-  EXPECT_TRUE(second_main_thread_task_ran.IsSet());
-}
-
-}  // namespace
-
-TEST_P(ScopedTaskEnvironmentTest, QueuedRunUntilIdle) {
-  RunUntilIdleTest(GetParam(), ScopedTaskEnvironment::ExecutionMode::QUEUED);
-}
-
-TEST_P(ScopedTaskEnvironmentTest, AsyncRunUntilIdle) {
-  RunUntilIdleTest(GetParam(), ScopedTaskEnvironment::ExecutionMode::ASYNC);
-}
-
-// Verify that tasks posted to an ExecutionMode::QUEUED ScopedTaskEnvironment do
-// not run outside of RunUntilIdle().
-TEST_P(ScopedTaskEnvironmentTest, QueuedTasksDoNotRunOutsideOfRunUntilIdle) {
-  ScopedTaskEnvironment scoped_task_environment(
-      GetParam(), ScopedTaskEnvironment::ExecutionMode::QUEUED);
-
-  AtomicFlag run_until_idle_called;
-  PostTask(FROM_HERE, BindOnce(
-                          [](AtomicFlag* run_until_idle_called) {
-                            EXPECT_TRUE(run_until_idle_called->IsSet());
-                          },
-                          Unretained(&run_until_idle_called)));
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  run_until_idle_called.Set();
-  scoped_task_environment.RunUntilIdle();
-
-  AtomicFlag other_run_until_idle_called;
-  PostTask(FROM_HERE, BindOnce(
-                          [](AtomicFlag* other_run_until_idle_called) {
-                            EXPECT_TRUE(other_run_until_idle_called->IsSet());
-                          },
-                          Unretained(&other_run_until_idle_called)));
-  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
-  other_run_until_idle_called.Set();
-  scoped_task_environment.RunUntilIdle();
-}
-
-// Verify that a task posted to an ExecutionMode::ASYNC ScopedTaskEnvironment
-// can run without a call to RunUntilIdle().
-TEST_P(ScopedTaskEnvironmentTest, AsyncTasksRunAsTheyArePosted) {
-  ScopedTaskEnvironment scoped_task_environment(
-      GetParam(), ScopedTaskEnvironment::ExecutionMode::ASYNC);
-
-  WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
-                         WaitableEvent::InitialState::NOT_SIGNALED);
-  PostTask(FROM_HERE,
-           BindOnce([](WaitableEvent* task_ran) { task_ran->Signal(); },
-                    Unretained(&task_ran)));
-  task_ran.Wait();
-}
-
-// Verify that a task posted to an ExecutionMode::ASYNC ScopedTaskEnvironment
-// after a call to RunUntilIdle() can run without another call to
-// RunUntilIdle().
-TEST_P(ScopedTaskEnvironmentTest,
-       AsyncTasksRunAsTheyArePostedAfterRunUntilIdle) {
-  ScopedTaskEnvironment scoped_task_environment(
-      GetParam(), ScopedTaskEnvironment::ExecutionMode::ASYNC);
-
-  scoped_task_environment.RunUntilIdle();
-
-  WaitableEvent task_ran(WaitableEvent::ResetPolicy::MANUAL,
-                         WaitableEvent::InitialState::NOT_SIGNALED);
-  PostTask(FROM_HERE,
-           BindOnce([](WaitableEvent* task_ran) { task_ran->Signal(); },
-                    Unretained(&task_ran)));
-  task_ran.Wait();
-}
-
-TEST_P(ScopedTaskEnvironmentTest, DelayedTasks) {
-  // Use a QUEUED execution-mode environment, so that no tasks are actually
-  // executed until RunUntilIdle()/FastForwardBy() are invoked.
-  ScopedTaskEnvironment scoped_task_environment(
-      GetParam(), ScopedTaskEnvironment::ExecutionMode::QUEUED);
-
-  subtle::Atomic32 counter = 0;
-
-  constexpr base::TimeDelta kShortTaskDelay = TimeDelta::FromDays(1);
-  // Should run only in MOCK_TIME environment when time is fast-forwarded.
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      Bind(
-          [](subtle::Atomic32* counter) {
-            subtle::NoBarrier_AtomicIncrement(counter, 4);
-          },
-          Unretained(&counter)),
-      kShortTaskDelay);
-  // TODO(gab): This currently doesn't run because the TaskScheduler's clock
-  // isn't mocked but it should be.
-  PostDelayedTask(FROM_HERE,
-                  Bind(
-                      [](subtle::Atomic32* counter) {
-                        subtle::NoBarrier_AtomicIncrement(counter, 128);
-                      },
-                      Unretained(&counter)),
-                  kShortTaskDelay);
-
-  constexpr base::TimeDelta kLongTaskDelay = TimeDelta::FromDays(7);
-  // Same as first task, longer delays to exercise
-  // FastForwardUntilNoTasksRemain().
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      Bind(
-          [](subtle::Atomic32* counter) {
-            subtle::NoBarrier_AtomicIncrement(counter, 8);
-          },
-          Unretained(&counter)),
-      TimeDelta::FromDays(5));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      Bind(
-          [](subtle::Atomic32* counter) {
-            subtle::NoBarrier_AtomicIncrement(counter, 16);
-          },
-          Unretained(&counter)),
-      kLongTaskDelay);
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, Bind(
-                     [](subtle::Atomic32* counter) {
-                       subtle::NoBarrier_AtomicIncrement(counter, 1);
-                     },
-                     Unretained(&counter)));
-  PostTask(FROM_HERE, Bind(
-                          [](subtle::Atomic32* counter) {
-                            subtle::NoBarrier_AtomicIncrement(counter, 2);
-                          },
-                          Unretained(&counter)));
-
-  // This expectation will fail flakily if the preceding PostTask() is executed
-  // asynchronously, indicating a problem with the QUEUED execution mode.
-  int expected_value = 0;
-  EXPECT_EQ(expected_value, counter);
-
-  // RunUntilIdle() should process non-delayed tasks only in all queues.
-  scoped_task_environment.RunUntilIdle();
-  expected_value += 1;
-  expected_value += 2;
-  EXPECT_EQ(expected_value, counter);
-
-  if (GetParam() == ScopedTaskEnvironment::MainThreadType::MOCK_TIME) {
-    // Delay inferior to the delay of the first posted task.
-    constexpr base::TimeDelta kInferiorTaskDelay = TimeDelta::FromSeconds(1);
-    static_assert(kInferiorTaskDelay < kShortTaskDelay,
-                  "|kInferiorTaskDelay| should be "
-                  "set to a value inferior to the first posted task's delay.");
-    scoped_task_environment.FastForwardBy(kInferiorTaskDelay);
-    EXPECT_EQ(expected_value, counter);
-
-    scoped_task_environment.FastForwardBy(kShortTaskDelay - kInferiorTaskDelay);
-    expected_value += 4;
-    EXPECT_EQ(expected_value, counter);
-
-    scoped_task_environment.FastForwardUntilNoTasksRemain();
-    expected_value += 8;
-    expected_value += 16;
-    EXPECT_EQ(expected_value, counter);
-  }
-}
-
-// Regression test for https://crbug.com/824770.
-TEST_P(ScopedTaskEnvironmentTest, SupportsSequenceLocalStorageOnMainThread) {
-  ScopedTaskEnvironment scoped_task_environment(
-      GetParam(), ScopedTaskEnvironment::ExecutionMode::ASYNC);
-
-  SequenceLocalStorageSlot<int> sls_slot;
-  sls_slot.Set(5);
-  EXPECT_EQ(5, sls_slot.Get());
-}
-
-#if defined(OS_POSIX)
-TEST_F(ScopedTaskEnvironmentTest, SupportsFileDescriptorWatcherOnIOMainThread) {
-  ScopedTaskEnvironment scoped_task_environment(
-      ScopedTaskEnvironment::MainThreadType::IO,
-      ScopedTaskEnvironment::ExecutionMode::ASYNC);
-
-  int pipe_fds_[2];
-  ASSERT_EQ(0, pipe(pipe_fds_));
-
-  RunLoop run_loop;
-
-  // The write end of a newly created pipe is immediately writable.
-  auto controller = FileDescriptorWatcher::WatchWritable(
-      pipe_fds_[1], run_loop.QuitClosure());
-
-  // This will hang if the notification doesn't occur as expected.
-  run_loop.Run();
-}
-#endif  // defined(OS_POSIX)
-
-// Verify that the TickClock returned by
-// |ScopedTaskEnvironment::GetMockTickClock| gets updated when the
-// FastForward(By|UntilNoTasksRemain) functions are called.
-TEST_F(ScopedTaskEnvironmentTest, FastForwardAdvanceTickClock) {
-  // Use a QUEUED execution-mode environment, so that no tasks are actually
-  // executed until RunUntilIdle()/FastForwardBy() are invoked.
-  ScopedTaskEnvironment scoped_task_environment(
-      ScopedTaskEnvironment::MainThreadType::MOCK_TIME,
-      ScopedTaskEnvironment::ExecutionMode::QUEUED);
-
-  constexpr base::TimeDelta kShortTaskDelay = TimeDelta::FromDays(1);
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE, base::DoNothing(),
-                                                 kShortTaskDelay);
-
-  constexpr base::TimeDelta kLongTaskDelay = TimeDelta::FromDays(7);
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE, base::DoNothing(),
-                                                 kLongTaskDelay);
-
-  const base::TickClock* tick_clock =
-      scoped_task_environment.GetMockTickClock();
-  base::TimeTicks tick_clock_ref = tick_clock->NowTicks();
-
-  // Make sure that |FastForwardBy| advances the clock.
-  scoped_task_environment.FastForwardBy(kShortTaskDelay);
-  EXPECT_EQ(kShortTaskDelay, tick_clock->NowTicks() - tick_clock_ref);
-
-  // Make sure that |FastForwardUntilNoTasksRemain| advances the clock.
-  scoped_task_environment.FastForwardUntilNoTasksRemain();
-  EXPECT_EQ(kLongTaskDelay, tick_clock->NowTicks() - tick_clock_ref);
-
-  // Fast-forwarding to a time at which there's no tasks should also advance the
-  // clock.
-  scoped_task_environment.FastForwardBy(kLongTaskDelay);
-  EXPECT_EQ(kLongTaskDelay * 2, tick_clock->NowTicks() - tick_clock_ref);
-}
-
-INSTANTIATE_TEST_CASE_P(
-    MainThreadDefault,
-    ScopedTaskEnvironmentTest,
-    ::testing::Values(ScopedTaskEnvironment::MainThreadType::DEFAULT));
-INSTANTIATE_TEST_CASE_P(
-    MainThreadMockTime,
-    ScopedTaskEnvironmentTest,
-    ::testing::Values(ScopedTaskEnvironment::MainThreadType::MOCK_TIME));
-INSTANTIATE_TEST_CASE_P(
-    MainThreadUI,
-    ScopedTaskEnvironmentTest,
-    ::testing::Values(ScopedTaskEnvironment::MainThreadType::UI));
-INSTANTIATE_TEST_CASE_P(
-    MainThreadIO,
-    ScopedTaskEnvironmentTest,
-    ::testing::Values(ScopedTaskEnvironment::MainThreadType::IO));
-
-}  // namespace test
-}  // namespace base
diff --git a/base/test/test_mock_time_task_runner_unittest.cc b/base/test/test_mock_time_task_runner_unittest.cc
deleted file mode 100644
index 04be466..0000000
--- a/base/test/test_mock_time_task_runner_unittest.cc
+++ /dev/null
@@ -1,262 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/test_mock_time_task_runner.h"
-
-#include "base/cancelable_callback.h"
-#include "base/memory/ref_counted.h"
-#include "base/run_loop.h"
-#include "base/test/gtest_util.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-// Basic usage should work the same from default and bound
-// TestMockTimeTaskRunners.
-TEST(TestMockTimeTaskRunnerTest, Basic) {
-  static constexpr TestMockTimeTaskRunner::Type kTestCases[] = {
-      TestMockTimeTaskRunner::Type::kStandalone,
-      TestMockTimeTaskRunner::Type::kBoundToThread};
-
-  for (auto type : kTestCases) {
-    SCOPED_TRACE(static_cast<int>(type));
-
-    auto mock_time_task_runner = MakeRefCounted<TestMockTimeTaskRunner>(type);
-    int counter = 0;
-
-    mock_time_task_runner->PostTask(
-        FROM_HERE,
-        base::Bind([](int* counter) { *counter += 1; }, Unretained(&counter)));
-    mock_time_task_runner->PostTask(
-        FROM_HERE,
-        base::Bind([](int* counter) { *counter += 32; }, Unretained(&counter)));
-    mock_time_task_runner->PostDelayedTask(
-        FROM_HERE,
-        base::Bind([](int* counter) { *counter += 256; }, Unretained(&counter)),
-        TimeDelta::FromSeconds(3));
-    mock_time_task_runner->PostDelayedTask(
-        FROM_HERE,
-        base::Bind([](int* counter) { *counter += 64; }, Unretained(&counter)),
-        TimeDelta::FromSeconds(1));
-    mock_time_task_runner->PostDelayedTask(
-        FROM_HERE,
-        base::Bind([](int* counter) { *counter += 1024; },
-                   Unretained(&counter)),
-        TimeDelta::FromMinutes(20));
-    mock_time_task_runner->PostDelayedTask(
-        FROM_HERE,
-        base::Bind([](int* counter) { *counter += 4096; },
-                   Unretained(&counter)),
-        TimeDelta::FromDays(20));
-
-    int expected_value = 0;
-    EXPECT_EQ(expected_value, counter);
-    mock_time_task_runner->RunUntilIdle();
-    expected_value += 1;
-    expected_value += 32;
-    EXPECT_EQ(expected_value, counter);
-
-    mock_time_task_runner->RunUntilIdle();
-    EXPECT_EQ(expected_value, counter);
-
-    mock_time_task_runner->FastForwardBy(TimeDelta::FromSeconds(1));
-    expected_value += 64;
-    EXPECT_EQ(expected_value, counter);
-
-    mock_time_task_runner->FastForwardBy(TimeDelta::FromSeconds(5));
-    expected_value += 256;
-    EXPECT_EQ(expected_value, counter);
-
-    mock_time_task_runner->FastForwardUntilNoTasksRemain();
-    expected_value += 1024;
-    expected_value += 4096;
-    EXPECT_EQ(expected_value, counter);
-  }
-}
-
-// A default TestMockTimeTaskRunner shouldn't result in a thread association.
-TEST(TestMockTimeTaskRunnerTest, DefaultUnbound) {
-  auto unbound_mock_time_task_runner = MakeRefCounted<TestMockTimeTaskRunner>();
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-  EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
-  EXPECT_DEATH_IF_SUPPORTED({ RunLoop().RunUntilIdle(); }, "");
-}
-
-TEST(TestMockTimeTaskRunnerTest, RunLoopDriveableWhenBound) {
-  auto bound_mock_time_task_runner = MakeRefCounted<TestMockTimeTaskRunner>(
-      TestMockTimeTaskRunner::Type::kBoundToThread);
-
-  int counter = 0;
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::Bind([](int* counter) { *counter += 1; }, Unretained(&counter)));
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      base::Bind([](int* counter) { *counter += 32; }, Unretained(&counter)));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      base::Bind([](int* counter) { *counter += 256; }, Unretained(&counter)),
-      TimeDelta::FromSeconds(3));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      base::Bind([](int* counter) { *counter += 64; }, Unretained(&counter)),
-      TimeDelta::FromSeconds(1));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      base::Bind([](int* counter) { *counter += 1024; }, Unretained(&counter)),
-      TimeDelta::FromMinutes(20));
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE,
-      base::Bind([](int* counter) { *counter += 4096; }, Unretained(&counter)),
-      TimeDelta::FromDays(20));
-
-  int expected_value = 0;
-  EXPECT_EQ(expected_value, counter);
-  RunLoop().RunUntilIdle();
-  expected_value += 1;
-  expected_value += 32;
-  EXPECT_EQ(expected_value, counter);
-
-  RunLoop().RunUntilIdle();
-  EXPECT_EQ(expected_value, counter);
-
-  {
-    RunLoop run_loop;
-    ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, run_loop.QuitClosure(), TimeDelta::FromSeconds(1));
-    ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE,
-        base::Bind([](int* counter) { *counter += 8192; },
-                   Unretained(&counter)),
-        TimeDelta::FromSeconds(1));
-
-    // The QuitClosure() should be ordered between the 64 and the 8192
-    // increments and should preempt the latter.
-    run_loop.Run();
-    expected_value += 64;
-    EXPECT_EQ(expected_value, counter);
-
-    // Running until idle should process the 8192 increment whose delay has
-    // expired in the previous Run().
-    RunLoop().RunUntilIdle();
-    expected_value += 8192;
-    EXPECT_EQ(expected_value, counter);
-  }
-
-  {
-    RunLoop run_loop;
-    ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE, run_loop.QuitWhenIdleClosure(), TimeDelta::FromSeconds(5));
-    ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-        FROM_HERE,
-        base::Bind([](int* counter) { *counter += 16384; },
-                   Unretained(&counter)),
-        TimeDelta::FromSeconds(5));
-
-    // The QuitWhenIdleClosure() shouldn't preempt equally delayed tasks and as
-    // such the 16384 increment should be processed before quitting.
-    run_loop.Run();
-    expected_value += 256;
-    expected_value += 16384;
-    EXPECT_EQ(expected_value, counter);
-  }
-
-  // Process the remaining tasks (note: do not mimic this elsewhere,
-  // TestMockTimeTaskRunner::FastForwardUntilNoTasksRemain() is a better API to
-  // do this, this is just done here for the purpose of extensively testing the
-  // RunLoop approach).
-  RunLoop run_loop;
-  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
-      FROM_HERE, run_loop.QuitWhenIdleClosure(), TimeDelta::FromDays(50));
-
-  run_loop.Run();
-  expected_value += 1024;
-  expected_value += 4096;
-  EXPECT_EQ(expected_value, counter);
-}
-
-// Regression test that receiving the quit-when-idle signal when already empty
-// works as intended (i.e. that |TestMockTimeTaskRunner::tasks_lock_cv| is
-// properly signaled).
-TEST(TestMockTimeTaskRunnerTest, RunLoopQuitFromIdle) {
-  auto bound_mock_time_task_runner = MakeRefCounted<TestMockTimeTaskRunner>(
-      TestMockTimeTaskRunner::Type::kBoundToThread);
-
-  Thread quitting_thread("quitting thread");
-  quitting_thread.Start();
-
-  RunLoop run_loop;
-  quitting_thread.task_runner()->PostDelayedTask(
-      FROM_HERE, run_loop.QuitWhenIdleClosure(), TestTimeouts::tiny_timeout());
-  run_loop.Run();
-}
-
-TEST(TestMockTimeTaskRunnerTest, TakePendingTasks) {
-  auto task_runner = MakeRefCounted<TestMockTimeTaskRunner>();
-  task_runner->PostTask(FROM_HERE, Bind([]() {}));
-  EXPECT_TRUE(task_runner->HasPendingTask());
-  EXPECT_EQ(1u, task_runner->TakePendingTasks().size());
-  EXPECT_FALSE(task_runner->HasPendingTask());
-}
-
-TEST(TestMockTimeTaskRunnerTest, CancelPendingTask) {
-  auto task_runner = MakeRefCounted<TestMockTimeTaskRunner>();
-  CancelableClosure task1(Bind([]() {}));
-  task_runner->PostDelayedTask(FROM_HERE, task1.callback(),
-                               TimeDelta::FromSeconds(1));
-  EXPECT_TRUE(task_runner->HasPendingTask());
-  EXPECT_EQ(1u, task_runner->GetPendingTaskCount());
-  EXPECT_EQ(TimeDelta::FromSeconds(1), task_runner->NextPendingTaskDelay());
-  task1.Cancel();
-  EXPECT_FALSE(task_runner->HasPendingTask());
-
-  CancelableClosure task2(Bind([]() {}));
-  task_runner->PostDelayedTask(FROM_HERE, task2.callback(),
-                               TimeDelta::FromSeconds(1));
-  task2.Cancel();
-  EXPECT_EQ(0u, task_runner->GetPendingTaskCount());
-
-  CancelableClosure task3(Bind([]() {}));
-  task_runner->PostDelayedTask(FROM_HERE, task3.callback(),
-                               TimeDelta::FromSeconds(1));
-  task3.Cancel();
-  EXPECT_EQ(TimeDelta::Max(), task_runner->NextPendingTaskDelay());
-
-  CancelableClosure task4(Bind([]() {}));
-  task_runner->PostDelayedTask(FROM_HERE, task4.callback(),
-                               TimeDelta::FromSeconds(1));
-  task4.Cancel();
-  EXPECT_TRUE(task_runner->TakePendingTasks().empty());
-}
-
-TEST(TestMockTimeTaskRunnerTest, NoFastForwardToCancelledTask) {
-  auto task_runner = MakeRefCounted<TestMockTimeTaskRunner>();
-  TimeTicks start_time = task_runner->NowTicks();
-  CancelableClosure task(Bind([]() {}));
-  task_runner->PostDelayedTask(FROM_HERE, task.callback(),
-                               TimeDelta::FromSeconds(1));
-  EXPECT_EQ(TimeDelta::FromSeconds(1), task_runner->NextPendingTaskDelay());
-  task.Cancel();
-  task_runner->FastForwardUntilNoTasksRemain();
-  EXPECT_EQ(start_time, task_runner->NowTicks());
-}
-
-TEST(TestMockTimeTaskRunnerTest, AdvanceMockTickClockDoesNotRunTasks) {
-  auto task_runner = MakeRefCounted<TestMockTimeTaskRunner>();
-  TimeTicks start_time = task_runner->NowTicks();
-  task_runner->PostTask(FROM_HERE, BindOnce([]() { ADD_FAILURE(); }));
-  task_runner->PostDelayedTask(FROM_HERE, BindOnce([]() { ADD_FAILURE(); }),
-                               TimeDelta::FromSeconds(1));
-
-  task_runner->AdvanceMockTickClock(TimeDelta::FromSeconds(3));
-  EXPECT_EQ(start_time + TimeDelta::FromSeconds(3), task_runner->NowTicks());
-  EXPECT_EQ(2u, task_runner->GetPendingTaskCount());
-}
-
-}  // namespace base
diff --git a/base/test/test_pending_task_unittest.cc b/base/test/test_pending_task_unittest.cc
deleted file mode 100644
index 6e01c8c..0000000
--- a/base/test/test_pending_task_unittest.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/test_pending_task.h"
-
-#include "base/bind.h"
-#include "base/trace_event/trace_event.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest-spi.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(TestPendingTaskTest, TraceSupport) {
-  base::TestPendingTask task;
-
-  // Check that TestPendingTask can be sent to the trace subsystem.
-  TRACE_EVENT1("test", "TestPendingTask::TraceSupport", "task", task.AsValue());
-
-  // Just a basic check that the trace output has *something* in it.
-  std::unique_ptr<base::trace_event::ConvertableToTraceFormat> task_value(
-      task.AsValue());
-  EXPECT_THAT(task_value->ToString(), ::testing::HasSubstr("post_time"));
-}
-
-TEST(TestPendingTaskTest, ToString) {
-  base::TestPendingTask task;
-
-  // Just a basic check that ToString has *something* in it.
-  EXPECT_THAT(task.ToString(), ::testing::StartsWith("TestPendingTask("));
-}
-
-TEST(TestPendingTaskTest, GTestPrettyPrint) {
-  base::TestPendingTask task;
-
-  // Check that gtest is calling the TestPendingTask's PrintTo method.
-  EXPECT_THAT(::testing::PrintToString(task),
-              ::testing::StartsWith("TestPendingTask("));
-
-  // Check that pretty printing works with the gtest iostreams operator.
-  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << task, "TestPendingTask(");
-}
-
-TEST(TestPendingTaskTest, ShouldRunBefore) {
-  base::TestPendingTask task_first;
-  task_first.delay = base::TimeDelta::FromMilliseconds(1);
-  base::TestPendingTask task_after;
-  task_after.delay = base::TimeDelta::FromMilliseconds(2);
-
-  EXPECT_FALSE(task_after.ShouldRunBefore(task_first))
-      << task_after << ".ShouldRunBefore(" << task_first << ")\n";
-  EXPECT_TRUE(task_first.ShouldRunBefore(task_after))
-      << task_first << ".ShouldRunBefore(" << task_after << ")\n";
-}
-
-}  // namespace base
diff --git a/base/test/test_reg_util_win_unittest.cc b/base/test/test_reg_util_win_unittest.cc
deleted file mode 100644
index ca3bc99..0000000
--- a/base/test/test_reg_util_win_unittest.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/test_reg_util_win.h"
-
-#include <memory>
-
-#include "base/compiler_specific.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace registry_util {
-
-namespace {
-const wchar_t kTestKeyPath[] = L"Software\\Chromium\\Foo\\Baz\\TestKey";
-const wchar_t kTestValueName[] = L"TestValue";
-}  // namespace
-
-class RegistryOverrideManagerTest : public testing::Test {
- protected:
-  RegistryOverrideManagerTest() {
-    // We assign a fake test key path to our test RegistryOverrideManager
-    // so we don't interfere with any actual RegistryOverrideManagers running
-    // on the system. This fake path will be auto-deleted by other
-    // RegistryOverrideManagers in case we crash.
-    fake_test_key_root_ = registry_util::GenerateTempKeyPath();
-
-    // Ensure a clean test environment.
-    base::win::RegKey key(HKEY_CURRENT_USER);
-    key.DeleteKey(fake_test_key_root_.c_str());
-    key.DeleteKey(kTestKeyPath);
-  }
-
-  ~RegistryOverrideManagerTest() override {
-    base::win::RegKey key(HKEY_CURRENT_USER);
-    key.DeleteKey(fake_test_key_root_.c_str());
-  }
-
-  void AssertKeyExists(const base::string16& key_path) {
-    base::win::RegKey key;
-    ASSERT_EQ(ERROR_SUCCESS,
-              key.Open(HKEY_CURRENT_USER, key_path.c_str(), KEY_READ))
-        << key_path << " does not exist.";
-  }
-
-  void AssertKeyAbsent(const base::string16& key_path) {
-    base::win::RegKey key;
-    ASSERT_NE(ERROR_SUCCESS,
-              key.Open(HKEY_CURRENT_USER, key_path.c_str(), KEY_READ))
-        << key_path << " exists but it should not.";
-  }
-
-  void CreateKey(const base::string16& key_path) {
-    base::win::RegKey key;
-    ASSERT_EQ(ERROR_SUCCESS,
-              key.Create(HKEY_CURRENT_USER, key_path.c_str(), KEY_ALL_ACCESS));
-  }
-
-  base::string16 FakeOverrideManagerPath(const base::Time& time) {
-    return fake_test_key_root_ + L"\\" +
-           base::Int64ToString16(time.ToInternalValue());
-  }
-
-  void CreateManager(const base::Time& timestamp) {
-    manager_.reset(new RegistryOverrideManager(timestamp, fake_test_key_root_));
-    manager_->OverrideRegistry(HKEY_CURRENT_USER);
-  }
-
-  base::string16 fake_test_key_root_;
-  std::unique_ptr<RegistryOverrideManager> manager_;
-};
-
-TEST_F(RegistryOverrideManagerTest, Basic) {
-  ASSERT_NO_FATAL_FAILURE(CreateManager(base::Time::Now()));
-
-  base::win::RegKey create_key;
-  EXPECT_EQ(ERROR_SUCCESS,
-            create_key.Create(HKEY_CURRENT_USER, kTestKeyPath, KEY_ALL_ACCESS));
-  EXPECT_TRUE(create_key.Valid());
-  EXPECT_EQ(ERROR_SUCCESS, create_key.WriteValue(kTestValueName, 42));
-  create_key.Close();
-
-  ASSERT_NO_FATAL_FAILURE(AssertKeyExists(kTestKeyPath));
-
-  DWORD value;
-  base::win::RegKey read_key;
-  EXPECT_EQ(ERROR_SUCCESS,
-            read_key.Open(HKEY_CURRENT_USER, kTestKeyPath, KEY_READ));
-  EXPECT_TRUE(read_key.Valid());
-  EXPECT_EQ(ERROR_SUCCESS, read_key.ReadValueDW(kTestValueName, &value));
-  EXPECT_EQ(42u, value);
-  read_key.Close();
-
-  manager_.reset();
-
-  ASSERT_NO_FATAL_FAILURE(AssertKeyAbsent(kTestKeyPath));
-}
-
-TEST_F(RegistryOverrideManagerTest, DeleteStaleKeys) {
-  base::Time::Exploded kTestTimeExploded = {2013, 11, 1, 4, 0, 0, 0, 0};
-  base::Time kTestTime;
-  EXPECT_TRUE(base::Time::FromUTCExploded(kTestTimeExploded, &kTestTime));
-
-  base::string16 path_garbage = fake_test_key_root_ + L"\\Blah";
-  base::string16 path_very_stale =
-      FakeOverrideManagerPath(kTestTime - base::TimeDelta::FromDays(100));
-  base::string16 path_stale =
-      FakeOverrideManagerPath(kTestTime - base::TimeDelta::FromDays(5));
-  base::string16 path_current =
-      FakeOverrideManagerPath(kTestTime - base::TimeDelta::FromMinutes(1));
-  base::string16 path_future =
-      FakeOverrideManagerPath(kTestTime + base::TimeDelta::FromMinutes(1));
-
-  ASSERT_NO_FATAL_FAILURE(CreateKey(path_garbage));
-  ASSERT_NO_FATAL_FAILURE(CreateKey(path_very_stale));
-  ASSERT_NO_FATAL_FAILURE(CreateKey(path_stale));
-  ASSERT_NO_FATAL_FAILURE(CreateKey(path_current));
-  ASSERT_NO_FATAL_FAILURE(CreateKey(path_future));
-
-  ASSERT_NO_FATAL_FAILURE(CreateManager(kTestTime));
-  manager_.reset();
-
-  ASSERT_NO_FATAL_FAILURE(AssertKeyAbsent(path_garbage));
-  ASSERT_NO_FATAL_FAILURE(AssertKeyAbsent(path_very_stale));
-  ASSERT_NO_FATAL_FAILURE(AssertKeyAbsent(path_stale));
-  ASSERT_NO_FATAL_FAILURE(AssertKeyExists(path_current));
-  ASSERT_NO_FATAL_FAILURE(AssertKeyExists(path_future));
-}
-
-}  // namespace registry_util
diff --git a/base/test/trace_event_analyzer_unittest.cc b/base/test/trace_event_analyzer_unittest.cc
deleted file mode 100644
index 6461b0f..0000000
--- a/base/test/trace_event_analyzer_unittest.cc
+++ /dev/null
@@ -1,961 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/trace_event_analyzer.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/bind.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted_memory.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "base/trace_event/trace_buffer.h"
-#include "base/trace_event/trace_event_argument.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace trace_analyzer {
-
-namespace {
-
-class TraceEventAnalyzerTest : public testing::Test {
- public:
-  void ManualSetUp();
-  void OnTraceDataCollected(
-      base::WaitableEvent* flush_complete_event,
-      const scoped_refptr<base::RefCountedString>& json_events_str,
-      bool has_more_events);
-  void BeginTracing();
-  void EndTracing();
-
-  base::trace_event::TraceResultBuffer::SimpleOutput output_;
-  base::trace_event::TraceResultBuffer buffer_;
-};
-
-void TraceEventAnalyzerTest::ManualSetUp() {
-  ASSERT_TRUE(base::trace_event::TraceLog::GetInstance());
-  buffer_.SetOutputCallback(output_.GetCallback());
-  output_.json_output.clear();
-}
-
-void TraceEventAnalyzerTest::OnTraceDataCollected(
-    base::WaitableEvent* flush_complete_event,
-    const scoped_refptr<base::RefCountedString>& json_events_str,
-    bool has_more_events) {
-  buffer_.AddFragment(json_events_str->data());
-  if (!has_more_events)
-    flush_complete_event->Signal();
-}
-
-void TraceEventAnalyzerTest::BeginTracing() {
-  output_.json_output.clear();
-  buffer_.Start();
-  base::trace_event::TraceLog::GetInstance()->SetEnabled(
-      base::trace_event::TraceConfig("*", ""),
-      base::trace_event::TraceLog::RECORDING_MODE);
-}
-
-void TraceEventAnalyzerTest::EndTracing() {
-  base::trace_event::TraceLog::GetInstance()->SetDisabled();
-  base::WaitableEvent flush_complete_event(
-      base::WaitableEvent::ResetPolicy::AUTOMATIC,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  base::trace_event::TraceLog::GetInstance()->Flush(
-      base::Bind(&TraceEventAnalyzerTest::OnTraceDataCollected,
-                 base::Unretained(this),
-                 base::Unretained(&flush_complete_event)));
-  flush_complete_event.Wait();
-  buffer_.Finish();
-}
-
-}  // namespace
-
-TEST_F(TraceEventAnalyzerTest, NoEvents) {
-  ManualSetUp();
-
-  // Create an empty JSON event string:
-  buffer_.Start();
-  buffer_.Finish();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-
-  // Search for all events and verify that nothing is returned.
-  TraceEventVector found;
-  analyzer->FindEvents(Query::Bool(true), &found);
-  EXPECT_EQ(0u, found.size());
-}
-
-TEST_F(TraceEventAnalyzerTest, TraceEvent) {
-  ManualSetUp();
-
-  int int_num = 2;
-  double double_num = 3.5;
-  const char str[] = "the string";
-
-  TraceEvent event;
-  event.arg_numbers["false"] = 0.0;
-  event.arg_numbers["true"] = 1.0;
-  event.arg_numbers["int"] = static_cast<double>(int_num);
-  event.arg_numbers["double"] = double_num;
-  event.arg_strings["string"] = str;
-  event.arg_values["dict"] = WrapUnique(new base::DictionaryValue());
-
-  ASSERT_TRUE(event.HasNumberArg("false"));
-  ASSERT_TRUE(event.HasNumberArg("true"));
-  ASSERT_TRUE(event.HasNumberArg("int"));
-  ASSERT_TRUE(event.HasNumberArg("double"));
-  ASSERT_TRUE(event.HasStringArg("string"));
-  ASSERT_FALSE(event.HasNumberArg("notfound"));
-  ASSERT_FALSE(event.HasStringArg("notfound"));
-  ASSERT_TRUE(event.HasArg("dict"));
-  ASSERT_FALSE(event.HasArg("notfound"));
-
-  EXPECT_FALSE(event.GetKnownArgAsBool("false"));
-  EXPECT_TRUE(event.GetKnownArgAsBool("true"));
-  EXPECT_EQ(int_num, event.GetKnownArgAsInt("int"));
-  EXPECT_EQ(double_num, event.GetKnownArgAsDouble("double"));
-  EXPECT_STREQ(str, event.GetKnownArgAsString("string").c_str());
-
-  std::unique_ptr<base::Value> arg;
-  EXPECT_TRUE(event.GetArgAsValue("dict", &arg));
-  EXPECT_EQ(base::Value::Type::DICTIONARY, arg->type());
-}
-
-TEST_F(TraceEventAnalyzerTest, QueryEventMember) {
-  ManualSetUp();
-
-  TraceEvent event;
-  event.thread.process_id = 3;
-  event.thread.thread_id = 4;
-  event.timestamp = 1.5;
-  event.phase = TRACE_EVENT_PHASE_BEGIN;
-  event.category = "category";
-  event.name = "name";
-  event.id = "1";
-  event.arg_numbers["num"] = 7.0;
-  event.arg_strings["str"] = "the string";
-
-  // Other event with all different members:
-  TraceEvent other;
-  other.thread.process_id = 5;
-  other.thread.thread_id = 6;
-  other.timestamp = 2.5;
-  other.phase = TRACE_EVENT_PHASE_END;
-  other.category = "category2";
-  other.name = "name2";
-  other.id = "2";
-  other.arg_numbers["num2"] = 8.0;
-  other.arg_strings["str2"] = "the string 2";
-
-  event.other_event = &other;
-  ASSERT_TRUE(event.has_other_event());
-  double duration = event.GetAbsTimeToOtherEvent();
-
-  Query event_pid = Query::EventPidIs(event.thread.process_id);
-  Query event_tid = Query::EventTidIs(event.thread.thread_id);
-  Query event_time = Query::EventTimeIs(event.timestamp);
-  Query event_duration = Query::EventDurationIs(duration);
-  Query event_phase = Query::EventPhaseIs(event.phase);
-  Query event_category = Query::EventCategoryIs(event.category);
-  Query event_name = Query::EventNameIs(event.name);
-  Query event_id = Query::EventIdIs(event.id);
-  Query event_has_arg1 = Query::EventHasNumberArg("num");
-  Query event_has_arg2 = Query::EventHasStringArg("str");
-  Query event_arg1 =
-      (Query::EventArg("num") == Query::Double(event.arg_numbers["num"]));
-  Query event_arg2 =
-      (Query::EventArg("str") == Query::String(event.arg_strings["str"]));
-  Query event_has_other = Query::EventHasOther();
-  Query other_pid = Query::OtherPidIs(other.thread.process_id);
-  Query other_tid = Query::OtherTidIs(other.thread.thread_id);
-  Query other_time = Query::OtherTimeIs(other.timestamp);
-  Query other_phase = Query::OtherPhaseIs(other.phase);
-  Query other_category = Query::OtherCategoryIs(other.category);
-  Query other_name = Query::OtherNameIs(other.name);
-  Query other_id = Query::OtherIdIs(other.id);
-  Query other_has_arg1 = Query::OtherHasNumberArg("num2");
-  Query other_has_arg2 = Query::OtherHasStringArg("str2");
-  Query other_arg1 =
-      (Query::OtherArg("num2") == Query::Double(other.arg_numbers["num2"]));
-  Query other_arg2 =
-      (Query::OtherArg("str2") == Query::String(other.arg_strings["str2"]));
-
-  EXPECT_TRUE(event_pid.Evaluate(event));
-  EXPECT_TRUE(event_tid.Evaluate(event));
-  EXPECT_TRUE(event_time.Evaluate(event));
-  EXPECT_TRUE(event_duration.Evaluate(event));
-  EXPECT_TRUE(event_phase.Evaluate(event));
-  EXPECT_TRUE(event_category.Evaluate(event));
-  EXPECT_TRUE(event_name.Evaluate(event));
-  EXPECT_TRUE(event_id.Evaluate(event));
-  EXPECT_TRUE(event_has_arg1.Evaluate(event));
-  EXPECT_TRUE(event_has_arg2.Evaluate(event));
-  EXPECT_TRUE(event_arg1.Evaluate(event));
-  EXPECT_TRUE(event_arg2.Evaluate(event));
-  EXPECT_TRUE(event_has_other.Evaluate(event));
-  EXPECT_TRUE(other_pid.Evaluate(event));
-  EXPECT_TRUE(other_tid.Evaluate(event));
-  EXPECT_TRUE(other_time.Evaluate(event));
-  EXPECT_TRUE(other_phase.Evaluate(event));
-  EXPECT_TRUE(other_category.Evaluate(event));
-  EXPECT_TRUE(other_name.Evaluate(event));
-  EXPECT_TRUE(other_id.Evaluate(event));
-  EXPECT_TRUE(other_has_arg1.Evaluate(event));
-  EXPECT_TRUE(other_has_arg2.Evaluate(event));
-  EXPECT_TRUE(other_arg1.Evaluate(event));
-  EXPECT_TRUE(other_arg2.Evaluate(event));
-
-  // Evaluate event queries against other to verify the queries fail when the
-  // event members are wrong.
-  EXPECT_FALSE(event_pid.Evaluate(other));
-  EXPECT_FALSE(event_tid.Evaluate(other));
-  EXPECT_FALSE(event_time.Evaluate(other));
-  EXPECT_FALSE(event_duration.Evaluate(other));
-  EXPECT_FALSE(event_phase.Evaluate(other));
-  EXPECT_FALSE(event_category.Evaluate(other));
-  EXPECT_FALSE(event_name.Evaluate(other));
-  EXPECT_FALSE(event_id.Evaluate(other));
-  EXPECT_FALSE(event_has_arg1.Evaluate(other));
-  EXPECT_FALSE(event_has_arg2.Evaluate(other));
-  EXPECT_FALSE(event_arg1.Evaluate(other));
-  EXPECT_FALSE(event_arg2.Evaluate(other));
-  EXPECT_FALSE(event_has_other.Evaluate(other));
-}
-
-TEST_F(TraceEventAnalyzerTest, BooleanOperators) {
-  ManualSetUp();
-
-  BeginTracing();
-  {
-    TRACE_EVENT_INSTANT1("cat1", "name1", TRACE_EVENT_SCOPE_THREAD, "num", 1);
-    TRACE_EVENT_INSTANT1("cat1", "name2", TRACE_EVENT_SCOPE_THREAD, "num", 2);
-    TRACE_EVENT_INSTANT1("cat2", "name3", TRACE_EVENT_SCOPE_THREAD, "num", 3);
-    TRACE_EVENT_INSTANT1("cat2", "name4", TRACE_EVENT_SCOPE_THREAD, "num", 4);
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer);
-  analyzer->SetIgnoreMetadataEvents(true);
-
-  TraceEventVector found;
-
-  // ==
-
-  analyzer->FindEvents(Query::EventCategory() == Query::String("cat1"), &found);
-  ASSERT_EQ(2u, found.size());
-  EXPECT_STREQ("name1", found[0]->name.c_str());
-  EXPECT_STREQ("name2", found[1]->name.c_str());
-
-  analyzer->FindEvents(Query::EventArg("num") == Query::Int(2), &found);
-  ASSERT_EQ(1u, found.size());
-  EXPECT_STREQ("name2", found[0]->name.c_str());
-
-  // !=
-
-  analyzer->FindEvents(Query::EventCategory() != Query::String("cat1"), &found);
-  ASSERT_EQ(2u, found.size());
-  EXPECT_STREQ("name3", found[0]->name.c_str());
-  EXPECT_STREQ("name4", found[1]->name.c_str());
-
-  analyzer->FindEvents(Query::EventArg("num") != Query::Int(2), &found);
-  ASSERT_EQ(3u, found.size());
-  EXPECT_STREQ("name1", found[0]->name.c_str());
-  EXPECT_STREQ("name3", found[1]->name.c_str());
-  EXPECT_STREQ("name4", found[2]->name.c_str());
-
-  // <
-  analyzer->FindEvents(Query::EventArg("num") < Query::Int(2), &found);
-  ASSERT_EQ(1u, found.size());
-  EXPECT_STREQ("name1", found[0]->name.c_str());
-
-  // <=
-  analyzer->FindEvents(Query::EventArg("num") <= Query::Int(2), &found);
-  ASSERT_EQ(2u, found.size());
-  EXPECT_STREQ("name1", found[0]->name.c_str());
-  EXPECT_STREQ("name2", found[1]->name.c_str());
-
-  // >
-  analyzer->FindEvents(Query::EventArg("num") > Query::Int(3), &found);
-  ASSERT_EQ(1u, found.size());
-  EXPECT_STREQ("name4", found[0]->name.c_str());
-
-  // >=
-  analyzer->FindEvents(Query::EventArg("num") >= Query::Int(4), &found);
-  ASSERT_EQ(1u, found.size());
-  EXPECT_STREQ("name4", found[0]->name.c_str());
-
-  // &&
-  analyzer->FindEvents(Query::EventName() != Query::String("name1") &&
-                       Query::EventArg("num") < Query::Int(3), &found);
-  ASSERT_EQ(1u, found.size());
-  EXPECT_STREQ("name2", found[0]->name.c_str());
-
-  // ||
-  analyzer->FindEvents(Query::EventName() == Query::String("name1") ||
-                       Query::EventArg("num") == Query::Int(3), &found);
-  ASSERT_EQ(2u, found.size());
-  EXPECT_STREQ("name1", found[0]->name.c_str());
-  EXPECT_STREQ("name3", found[1]->name.c_str());
-
-  // !
-  analyzer->FindEvents(!(Query::EventName() == Query::String("name1") ||
-                         Query::EventArg("num") == Query::Int(3)), &found);
-  ASSERT_EQ(2u, found.size());
-  EXPECT_STREQ("name2", found[0]->name.c_str());
-  EXPECT_STREQ("name4", found[1]->name.c_str());
-}
-
-TEST_F(TraceEventAnalyzerTest, ArithmeticOperators) {
-  ManualSetUp();
-
-  BeginTracing();
-  {
-    // These events are searched for:
-    TRACE_EVENT_INSTANT2("cat1", "math1", TRACE_EVENT_SCOPE_THREAD,
-                         "a", 10, "b", 5);
-    TRACE_EVENT_INSTANT2("cat1", "math2", TRACE_EVENT_SCOPE_THREAD,
-                         "a", 10, "b", 10);
-    // Extra events that never match, for noise:
-    TRACE_EVENT_INSTANT2("noise", "math3", TRACE_EVENT_SCOPE_THREAD,
-                         "a", 1,  "b", 3);
-    TRACE_EVENT_INSTANT2("noise", "math4", TRACE_EVENT_SCOPE_THREAD,
-                         "c", 10, "d", 5);
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-
-  TraceEventVector found;
-
-  // Verify that arithmetic operators function:
-
-  // +
-  analyzer->FindEvents(Query::EventArg("a") + Query::EventArg("b") ==
-                       Query::Int(20), &found);
-  EXPECT_EQ(1u, found.size());
-  EXPECT_STREQ("math2", found.front()->name.c_str());
-
-  // -
-  analyzer->FindEvents(Query::EventArg("a") - Query::EventArg("b") ==
-                       Query::Int(5), &found);
-  EXPECT_EQ(1u, found.size());
-  EXPECT_STREQ("math1", found.front()->name.c_str());
-
-  // *
-  analyzer->FindEvents(Query::EventArg("a") * Query::EventArg("b") ==
-                       Query::Int(50), &found);
-  EXPECT_EQ(1u, found.size());
-  EXPECT_STREQ("math1", found.front()->name.c_str());
-
-  // /
-  analyzer->FindEvents(Query::EventArg("a") / Query::EventArg("b") ==
-                       Query::Int(2), &found);
-  EXPECT_EQ(1u, found.size());
-  EXPECT_STREQ("math1", found.front()->name.c_str());
-
-  // %
-  analyzer->FindEvents(Query::EventArg("a") % Query::EventArg("b") ==
-                       Query::Int(0), &found);
-  EXPECT_EQ(2u, found.size());
-
-  // - (negate)
-  analyzer->FindEvents(-Query::EventArg("b") == Query::Int(-10), &found);
-  EXPECT_EQ(1u, found.size());
-  EXPECT_STREQ("math2", found.front()->name.c_str());
-}
-
-TEST_F(TraceEventAnalyzerTest, StringPattern) {
-  ManualSetUp();
-
-  BeginTracing();
-  {
-    TRACE_EVENT_INSTANT0("cat1", "name1", TRACE_EVENT_SCOPE_THREAD);
-    TRACE_EVENT_INSTANT0("cat1", "name2", TRACE_EVENT_SCOPE_THREAD);
-    TRACE_EVENT_INSTANT0("cat1", "no match", TRACE_EVENT_SCOPE_THREAD);
-    TRACE_EVENT_INSTANT0("cat1", "name3x", TRACE_EVENT_SCOPE_THREAD);
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-  analyzer->SetIgnoreMetadataEvents(true);
-
-  TraceEventVector found;
-
-  analyzer->FindEvents(Query::EventName() == Query::Pattern("name?"), &found);
-  ASSERT_EQ(2u, found.size());
-  EXPECT_STREQ("name1", found[0]->name.c_str());
-  EXPECT_STREQ("name2", found[1]->name.c_str());
-
-  analyzer->FindEvents(Query::EventName() == Query::Pattern("name*"), &found);
-  ASSERT_EQ(3u, found.size());
-  EXPECT_STREQ("name1", found[0]->name.c_str());
-  EXPECT_STREQ("name2", found[1]->name.c_str());
-  EXPECT_STREQ("name3x", found[2]->name.c_str());
-
-  analyzer->FindEvents(Query::EventName() != Query::Pattern("name*"), &found);
-  ASSERT_EQ(1u, found.size());
-  EXPECT_STREQ("no match", found[0]->name.c_str());
-}
-
-// Test that duration queries work.
-TEST_F(TraceEventAnalyzerTest, BeginEndDuration) {
-  ManualSetUp();
-
-  const base::TimeDelta kSleepTime = base::TimeDelta::FromMilliseconds(200);
-  // We will search for events that have a duration of greater than 90% of the
-  // sleep time, so that there is no flakiness.
-  int64_t duration_cutoff_us = (kSleepTime.InMicroseconds() * 9) / 10;
-
-  BeginTracing();
-  {
-    TRACE_EVENT_BEGIN0("cat1", "name1"); // found by duration query
-    TRACE_EVENT_BEGIN0("noise", "name2"); // not searched for, just noise
-    {
-      TRACE_EVENT_BEGIN0("cat2", "name3"); // found by duration query
-      // next event not searched for, just noise
-      TRACE_EVENT_INSTANT0("noise", "name4", TRACE_EVENT_SCOPE_THREAD);
-      base::PlatformThread::Sleep(kSleepTime);
-      TRACE_EVENT_BEGIN0("cat2", "name5"); // not found (duration too short)
-      TRACE_EVENT_END0("cat2", "name5"); // not found (duration too short)
-      TRACE_EVENT_END0("cat2", "name3"); // found by duration query
-    }
-    TRACE_EVENT_END0("noise", "name2"); // not searched for, just noise
-    TRACE_EVENT_END0("cat1", "name1"); // found by duration query
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-  analyzer->AssociateBeginEndEvents();
-
-  TraceEventVector found;
-  analyzer->FindEvents(
-      Query::MatchBeginWithEnd() &&
-      Query::EventDuration() >
-          Query::Int(static_cast<int>(duration_cutoff_us)) &&
-      (Query::EventCategory() == Query::String("cat1") ||
-       Query::EventCategory() == Query::String("cat2") ||
-       Query::EventCategory() == Query::String("cat3")),
-      &found);
-  ASSERT_EQ(2u, found.size());
-  EXPECT_STREQ("name1", found[0]->name.c_str());
-  EXPECT_STREQ("name3", found[1]->name.c_str());
-}
-
-// Test that duration queries work.
-TEST_F(TraceEventAnalyzerTest, CompleteDuration) {
-  ManualSetUp();
-
-  const base::TimeDelta kSleepTime = base::TimeDelta::FromMilliseconds(200);
-  // We will search for events that have a duration of greater than 90% of the
-  // sleep time, so that there is no flakiness.
-  int64_t duration_cutoff_us = (kSleepTime.InMicroseconds() * 9) / 10;
-
-  BeginTracing();
-  {
-    TRACE_EVENT0("cat1", "name1"); // found by duration query
-    TRACE_EVENT0("noise", "name2"); // not searched for, just noise
-    {
-      TRACE_EVENT0("cat2", "name3"); // found by duration query
-      // next event not searched for, just noise
-      TRACE_EVENT_INSTANT0("noise", "name4", TRACE_EVENT_SCOPE_THREAD);
-      base::PlatformThread::Sleep(kSleepTime);
-      TRACE_EVENT0("cat2", "name5"); // not found (duration too short)
-    }
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-  analyzer->AssociateBeginEndEvents();
-
-  TraceEventVector found;
-  analyzer->FindEvents(
-      Query::EventCompleteDuration() >
-          Query::Int(static_cast<int>(duration_cutoff_us)) &&
-      (Query::EventCategory() == Query::String("cat1") ||
-       Query::EventCategory() == Query::String("cat2") ||
-       Query::EventCategory() == Query::String("cat3")),
-      &found);
-  ASSERT_EQ(2u, found.size());
-  EXPECT_STREQ("name1", found[0]->name.c_str());
-  EXPECT_STREQ("name3", found[1]->name.c_str());
-}
-
-// Test AssociateBeginEndEvents
-TEST_F(TraceEventAnalyzerTest, BeginEndAssocations) {
-  ManualSetUp();
-
-  BeginTracing();
-  {
-    TRACE_EVENT_END0("cat1", "name1"); // does not match out of order begin
-    TRACE_EVENT_BEGIN0("cat1", "name2");
-    TRACE_EVENT_INSTANT0("cat1", "name3", TRACE_EVENT_SCOPE_THREAD);
-    TRACE_EVENT_BEGIN0("cat1", "name1");
-    TRACE_EVENT_END0("cat1", "name2");
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-  analyzer->AssociateBeginEndEvents();
-
-  TraceEventVector found;
-  analyzer->FindEvents(Query::MatchBeginWithEnd(), &found);
-  ASSERT_EQ(1u, found.size());
-  EXPECT_STREQ("name2", found[0]->name.c_str());
-}
-
-// Test MergeAssociatedEventArgs
-TEST_F(TraceEventAnalyzerTest, MergeAssociatedEventArgs) {
-  ManualSetUp();
-
-  const char arg_string[] = "arg_string";
-  BeginTracing();
-  {
-    TRACE_EVENT_BEGIN0("cat1", "name1");
-    TRACE_EVENT_END1("cat1", "name1", "arg", arg_string);
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-  analyzer->AssociateBeginEndEvents();
-
-  TraceEventVector found;
-  analyzer->FindEvents(Query::MatchBeginName("name1"), &found);
-  ASSERT_EQ(1u, found.size());
-  std::string arg_actual;
-  EXPECT_FALSE(found[0]->GetArgAsString("arg", &arg_actual));
-
-  analyzer->MergeAssociatedEventArgs();
-  EXPECT_TRUE(found[0]->GetArgAsString("arg", &arg_actual));
-  EXPECT_STREQ(arg_string, arg_actual.c_str());
-}
-
-// Test AssociateAsyncBeginEndEvents
-TEST_F(TraceEventAnalyzerTest, AsyncBeginEndAssocations) {
-  ManualSetUp();
-
-  BeginTracing();
-  {
-    TRACE_EVENT_ASYNC_END0("cat1", "name1", 0xA); // no match / out of order
-    TRACE_EVENT_ASYNC_BEGIN0("cat1", "name1", 0xB);
-    TRACE_EVENT_ASYNC_BEGIN0("cat1", "name1", 0xC);
-    TRACE_EVENT_INSTANT0("cat1", "name1", TRACE_EVENT_SCOPE_THREAD); // noise
-    TRACE_EVENT0("cat1", "name1"); // noise
-    TRACE_EVENT_ASYNC_END0("cat1", "name1", 0xB);
-    TRACE_EVENT_ASYNC_END0("cat1", "name1", 0xC);
-    TRACE_EVENT_ASYNC_BEGIN0("cat1", "name1", 0xA); // no match / out of order
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-  analyzer->AssociateAsyncBeginEndEvents();
-
-  TraceEventVector found;
-  analyzer->FindEvents(Query::MatchAsyncBeginWithNext(), &found);
-  ASSERT_EQ(2u, found.size());
-  EXPECT_STRCASEEQ("0xb", found[0]->id.c_str());
-  EXPECT_STRCASEEQ("0xc", found[1]->id.c_str());
-}
-
-// Test AssociateAsyncBeginEndEvents
-TEST_F(TraceEventAnalyzerTest, AsyncBeginEndAssocationsWithSteps) {
-  ManualSetUp();
-
-  BeginTracing();
-  {
-    TRACE_EVENT_ASYNC_STEP_INTO0("c", "n", 0xA, "s1");
-    TRACE_EVENT_ASYNC_END0("c", "n", 0xA);
-    TRACE_EVENT_ASYNC_BEGIN0("c", "n", 0xB);
-    TRACE_EVENT_ASYNC_BEGIN0("c", "n", 0xC);
-    TRACE_EVENT_ASYNC_STEP_PAST0("c", "n", 0xB, "s1");
-    TRACE_EVENT_ASYNC_STEP_INTO0("c", "n", 0xC, "s1");
-    TRACE_EVENT_ASYNC_STEP_INTO1("c", "n", 0xC, "s2", "a", 1);
-    TRACE_EVENT_ASYNC_END0("c", "n", 0xB);
-    TRACE_EVENT_ASYNC_END0("c", "n", 0xC);
-    TRACE_EVENT_ASYNC_BEGIN0("c", "n", 0xA);
-    TRACE_EVENT_ASYNC_STEP_INTO0("c", "n", 0xA, "s2");
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-  analyzer->AssociateAsyncBeginEndEvents();
-
-  TraceEventVector found;
-  analyzer->FindEvents(Query::MatchAsyncBeginWithNext(), &found);
-  ASSERT_EQ(3u, found.size());
-
-  EXPECT_STRCASEEQ("0xb", found[0]->id.c_str());
-  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_STEP_PAST, found[0]->other_event->phase);
-  EXPECT_EQ(found[0], found[0]->other_event->prev_event);
-  EXPECT_TRUE(found[0]->other_event->other_event);
-  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_END,
-            found[0]->other_event->other_event->phase);
-  EXPECT_EQ(found[0]->other_event,
-            found[0]->other_event->other_event->prev_event);
-
-  EXPECT_STRCASEEQ("0xc", found[1]->id.c_str());
-  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_STEP_INTO, found[1]->other_event->phase);
-  EXPECT_EQ(found[1], found[1]->other_event->prev_event);
-  EXPECT_TRUE(found[1]->other_event->other_event);
-  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_STEP_INTO,
-            found[1]->other_event->other_event->phase);
-  EXPECT_EQ(found[1]->other_event,
-            found[1]->other_event->other_event->prev_event);
-  double arg_actual = 0;
-  EXPECT_TRUE(found[1]->other_event->other_event->GetArgAsNumber(
-                  "a", &arg_actual));
-  EXPECT_EQ(1.0, arg_actual);
-  EXPECT_TRUE(found[1]->other_event->other_event->other_event);
-  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_END,
-            found[1]->other_event->other_event->other_event->phase);
-
-  EXPECT_STRCASEEQ("0xa", found[2]->id.c_str());
-  EXPECT_EQ(TRACE_EVENT_PHASE_ASYNC_STEP_INTO, found[2]->other_event->phase);
-}
-
-// Test that the TraceAnalyzer custom associations work.
-TEST_F(TraceEventAnalyzerTest, CustomAssociations) {
-  ManualSetUp();
-
-  // Add events that begin/end in pipelined ordering with unique ID parameter
-  // to match up the begin/end pairs.
-  BeginTracing();
-  {
-    // no begin match
-    TRACE_EVENT_INSTANT1("cat1", "end", TRACE_EVENT_SCOPE_THREAD, "id", 1);
-    // end is cat4
-    TRACE_EVENT_INSTANT1("cat2", "begin", TRACE_EVENT_SCOPE_THREAD, "id", 2);
-    // end is cat5
-    TRACE_EVENT_INSTANT1("cat3", "begin", TRACE_EVENT_SCOPE_THREAD, "id", 3);
-    TRACE_EVENT_INSTANT1("cat4", "end", TRACE_EVENT_SCOPE_THREAD, "id", 2);
-    TRACE_EVENT_INSTANT1("cat5", "end", TRACE_EVENT_SCOPE_THREAD, "id", 3);
-    // no end match
-    TRACE_EVENT_INSTANT1("cat6", "begin", TRACE_EVENT_SCOPE_THREAD, "id", 1);
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-
-  // begin, end, and match queries to find proper begin/end pairs.
-  Query begin(Query::EventName() == Query::String("begin"));
-  Query end(Query::EventName() == Query::String("end"));
-  Query match(Query::EventArg("id") == Query::OtherArg("id"));
-  analyzer->AssociateEvents(begin, end, match);
-
-  TraceEventVector found;
-
-  // cat1 has no other_event.
-  analyzer->FindEvents(Query::EventCategory() == Query::String("cat1") &&
-                       Query::EventHasOther(), &found);
-  EXPECT_EQ(0u, found.size());
-
-  // cat1 has no other_event.
-  analyzer->FindEvents(Query::EventCategory() == Query::String("cat1") &&
-                       !Query::EventHasOther(), &found);
-  EXPECT_EQ(1u, found.size());
-
-  // cat6 has no other_event.
-  analyzer->FindEvents(Query::EventCategory() == Query::String("cat6") &&
-                       !Query::EventHasOther(), &found);
-  EXPECT_EQ(1u, found.size());
-
-  // cat2 and cat4 are associated.
-  analyzer->FindEvents(Query::EventCategory() == Query::String("cat2") &&
-                       Query::OtherCategory() == Query::String("cat4"), &found);
-  EXPECT_EQ(1u, found.size());
-
-  // cat4 and cat2 are not associated.
-  analyzer->FindEvents(Query::EventCategory() == Query::String("cat4") &&
-                       Query::OtherCategory() == Query::String("cat2"), &found);
-  EXPECT_EQ(0u, found.size());
-
-  // cat3 and cat5 are associated.
-  analyzer->FindEvents(Query::EventCategory() == Query::String("cat3") &&
-                       Query::OtherCategory() == Query::String("cat5"), &found);
-  EXPECT_EQ(1u, found.size());
-
-  // cat5 and cat3 are not associated.
-  analyzer->FindEvents(Query::EventCategory() == Query::String("cat5") &&
-                       Query::OtherCategory() == Query::String("cat3"), &found);
-  EXPECT_EQ(0u, found.size());
-}
-
-// Verify that Query literals and types are properly casted.
-TEST_F(TraceEventAnalyzerTest, Literals) {
-  ManualSetUp();
-
-  // Since these queries don't refer to the event data, the dummy event below
-  // will never be accessed.
-  TraceEvent dummy;
-  char char_num = 5;
-  short short_num = -5;
-  EXPECT_TRUE((Query::Double(5.0) == Query::Int(char_num)).Evaluate(dummy));
-  EXPECT_TRUE((Query::Double(-5.0) == Query::Int(short_num)).Evaluate(dummy));
-  EXPECT_TRUE((Query::Double(1.0) == Query::Uint(1u)).Evaluate(dummy));
-  EXPECT_TRUE((Query::Double(1.0) == Query::Int(1)).Evaluate(dummy));
-  EXPECT_TRUE((Query::Double(-1.0) == Query::Int(-1)).Evaluate(dummy));
-  EXPECT_TRUE((Query::Double(1.0) == Query::Double(1.0f)).Evaluate(dummy));
-  EXPECT_TRUE((Query::Bool(true) == Query::Int(1)).Evaluate(dummy));
-  EXPECT_TRUE((Query::Bool(false) == Query::Int(0)).Evaluate(dummy));
-  EXPECT_TRUE((Query::Bool(true) == Query::Double(1.0f)).Evaluate(dummy));
-  EXPECT_TRUE((Query::Bool(false) == Query::Double(0.0f)).Evaluate(dummy));
-}
-
-// Test GetRateStats.
-TEST_F(TraceEventAnalyzerTest, RateStats) {
-  std::vector<TraceEvent> events;
-  events.reserve(100);
-  TraceEventVector event_ptrs;
-  double timestamp = 0.0;
-  double little_delta = 1.0;
-  double big_delta = 10.0;
-  double tiny_delta = 0.1;
-  RateStats stats;
-  RateStatsOptions options;
-
-  // Insert 10 events, each apart by little_delta.
-  for (int i = 0; i < 10; ++i) {
-    timestamp += little_delta;
-    TraceEvent event;
-    event.timestamp = timestamp;
-    events.push_back(std::move(event));
-    event_ptrs.push_back(&events.back());
-  }
-
-  ASSERT_TRUE(GetRateStats(event_ptrs, &stats, nullptr));
-  EXPECT_EQ(little_delta, stats.mean_us);
-  EXPECT_EQ(little_delta, stats.min_us);
-  EXPECT_EQ(little_delta, stats.max_us);
-  EXPECT_EQ(0.0, stats.standard_deviation_us);
-
-  // Add an event apart by big_delta.
-  {
-    timestamp += big_delta;
-    TraceEvent event;
-    event.timestamp = timestamp;
-    events.push_back(std::move(event));
-    event_ptrs.push_back(&events.back());
-  }
-
-  ASSERT_TRUE(GetRateStats(event_ptrs, &stats, nullptr));
-  EXPECT_LT(little_delta, stats.mean_us);
-  EXPECT_EQ(little_delta, stats.min_us);
-  EXPECT_EQ(big_delta, stats.max_us);
-  EXPECT_LT(0.0, stats.standard_deviation_us);
-
-  // Trim off the biggest delta and verify stats.
-  options.trim_min = 0;
-  options.trim_max = 1;
-  ASSERT_TRUE(GetRateStats(event_ptrs, &stats, &options));
-  EXPECT_EQ(little_delta, stats.mean_us);
-  EXPECT_EQ(little_delta, stats.min_us);
-  EXPECT_EQ(little_delta, stats.max_us);
-  EXPECT_EQ(0.0, stats.standard_deviation_us);
-
-  // Add an event apart by tiny_delta.
-  {
-    timestamp += tiny_delta;
-    TraceEvent event;
-    event.timestamp = timestamp;
-    events.push_back(std::move(event));
-    event_ptrs.push_back(&events.back());
-  }
-
-  // Trim off both the biggest and tiniest delta and verify stats.
-  options.trim_min = 1;
-  options.trim_max = 1;
-  ASSERT_TRUE(GetRateStats(event_ptrs, &stats, &options));
-  EXPECT_EQ(little_delta, stats.mean_us);
-  EXPECT_EQ(little_delta, stats.min_us);
-  EXPECT_EQ(little_delta, stats.max_us);
-  EXPECT_EQ(0.0, stats.standard_deviation_us);
-
-  // Verify smallest allowed number of events.
-  {
-    TraceEvent event;
-    TraceEventVector few_event_ptrs;
-    few_event_ptrs.push_back(&event);
-    few_event_ptrs.push_back(&event);
-    ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats, nullptr));
-    few_event_ptrs.push_back(&event);
-    ASSERT_TRUE(GetRateStats(few_event_ptrs, &stats, nullptr));
-
-    // Trim off more than allowed and verify failure.
-    options.trim_min = 0;
-    options.trim_max = 1;
-    ASSERT_FALSE(GetRateStats(few_event_ptrs, &stats, &options));
-  }
-}
-
-// Test FindFirstOf and FindLastOf.
-TEST_F(TraceEventAnalyzerTest, FindOf) {
-  size_t num_events = 100;
-  size_t index = 0;
-  TraceEventVector event_ptrs;
-  EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(true), 0, &index));
-  EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(true), 10, &index));
-  EXPECT_FALSE(FindLastOf(event_ptrs, Query::Bool(true), 0, &index));
-  EXPECT_FALSE(FindLastOf(event_ptrs, Query::Bool(true), 10, &index));
-
-  std::vector<TraceEvent> events;
-  events.resize(num_events);
-  for (size_t i = 0; i < events.size(); ++i)
-    event_ptrs.push_back(&events[i]);
-  size_t bam_index = num_events/2;
-  events[bam_index].name = "bam";
-  Query query_bam = Query::EventName() == Query::String(events[bam_index].name);
-
-  // FindFirstOf
-  EXPECT_FALSE(FindFirstOf(event_ptrs, Query::Bool(false), 0, &index));
-  EXPECT_TRUE(FindFirstOf(event_ptrs, Query::Bool(true), 0, &index));
-  EXPECT_EQ(0u, index);
-  EXPECT_TRUE(FindFirstOf(event_ptrs, Query::Bool(true), 5, &index));
-  EXPECT_EQ(5u, index);
-
-  EXPECT_FALSE(FindFirstOf(event_ptrs, query_bam, bam_index + 1, &index));
-  EXPECT_TRUE(FindFirstOf(event_ptrs, query_bam, 0, &index));
-  EXPECT_EQ(bam_index, index);
-  EXPECT_TRUE(FindFirstOf(event_ptrs, query_bam, bam_index, &index));
-  EXPECT_EQ(bam_index, index);
-
-  // FindLastOf
-  EXPECT_FALSE(FindLastOf(event_ptrs, Query::Bool(false), 1000, &index));
-  EXPECT_TRUE(FindLastOf(event_ptrs, Query::Bool(true), 1000, &index));
-  EXPECT_EQ(num_events - 1, index);
-  EXPECT_TRUE(FindLastOf(event_ptrs, Query::Bool(true), num_events - 5,
-                         &index));
-  EXPECT_EQ(num_events - 5, index);
-
-  EXPECT_FALSE(FindLastOf(event_ptrs, query_bam, bam_index - 1, &index));
-  EXPECT_TRUE(FindLastOf(event_ptrs, query_bam, num_events, &index));
-  EXPECT_EQ(bam_index, index);
-  EXPECT_TRUE(FindLastOf(event_ptrs, query_bam, bam_index, &index));
-  EXPECT_EQ(bam_index, index);
-}
-
-// Test FindClosest.
-TEST_F(TraceEventAnalyzerTest, FindClosest) {
-  size_t index_1 = 0;
-  size_t index_2 = 0;
-  TraceEventVector event_ptrs;
-  EXPECT_FALSE(FindClosest(event_ptrs, Query::Bool(true), 0,
-                           &index_1, &index_2));
-
-  size_t num_events = 5;
-  std::vector<TraceEvent> events;
-  events.resize(num_events);
-  for (size_t i = 0; i < events.size(); ++i) {
-    // timestamps go up exponentially so the lower index is always closer in
-    // time than the higher index.
-    events[i].timestamp = static_cast<double>(i) * static_cast<double>(i);
-    event_ptrs.push_back(&events[i]);
-  }
-  events[0].name = "one";
-  events[2].name = "two";
-  events[4].name = "three";
-  Query query_named = Query::EventName() != Query::String(std::string());
-  Query query_one = Query::EventName() == Query::String("one");
-
-  // Only one event matches query_one, so two closest can't be found.
-  EXPECT_FALSE(FindClosest(event_ptrs, query_one, 0, &index_1, &index_2));
-
-  EXPECT_TRUE(FindClosest(event_ptrs, query_one, 3, &index_1, nullptr));
-  EXPECT_EQ(0u, index_1);
-
-  EXPECT_TRUE(FindClosest(event_ptrs, query_named, 1, &index_1, &index_2));
-  EXPECT_EQ(0u, index_1);
-  EXPECT_EQ(2u, index_2);
-
-  EXPECT_TRUE(FindClosest(event_ptrs, query_named, 4, &index_1, &index_2));
-  EXPECT_EQ(4u, index_1);
-  EXPECT_EQ(2u, index_2);
-
-  EXPECT_TRUE(FindClosest(event_ptrs, query_named, 3, &index_1, &index_2));
-  EXPECT_EQ(2u, index_1);
-  EXPECT_EQ(0u, index_2);
-}
-
-// Test CountMatches.
-TEST_F(TraceEventAnalyzerTest, CountMatches) {
-  TraceEventVector event_ptrs;
-  EXPECT_EQ(0u, CountMatches(event_ptrs, Query::Bool(true), 0, 10));
-
-  size_t num_events = 5;
-  size_t num_named = 3;
-  std::vector<TraceEvent> events;
-  events.resize(num_events);
-  for (size_t i = 0; i < events.size(); ++i)
-    event_ptrs.push_back(&events[i]);
-  events[0].name = "one";
-  events[2].name = "two";
-  events[4].name = "three";
-  Query query_named = Query::EventName() != Query::String(std::string());
-  Query query_one = Query::EventName() == Query::String("one");
-
-  EXPECT_EQ(0u, CountMatches(event_ptrs, Query::Bool(false)));
-  EXPECT_EQ(num_events, CountMatches(event_ptrs, Query::Bool(true)));
-  EXPECT_EQ(num_events - 1, CountMatches(event_ptrs, Query::Bool(true),
-                                         1, num_events));
-  EXPECT_EQ(1u, CountMatches(event_ptrs, query_one));
-  EXPECT_EQ(num_events - 1, CountMatches(event_ptrs, !query_one));
-  EXPECT_EQ(num_named, CountMatches(event_ptrs, query_named));
-}
-
-TEST_F(TraceEventAnalyzerTest, ComplexArgument) {
-  ManualSetUp();
-
-  BeginTracing();
-  {
-    std::unique_ptr<base::trace_event::TracedValue> value(
-        new base::trace_event::TracedValue);
-    value->SetString("property", "value");
-    TRACE_EVENT1("cat", "name", "arg", std::move(value));
-  }
-  EndTracing();
-
-  std::unique_ptr<TraceAnalyzer> analyzer(
-      TraceAnalyzer::Create(output_.json_output));
-  ASSERT_TRUE(analyzer.get());
-
-  TraceEventVector events;
-  analyzer->FindEvents(Query::EventName() == Query::String("name"), &events);
-
-  EXPECT_EQ(1u, events.size());
-  EXPECT_EQ("cat", events[0]->category);
-  EXPECT_EQ("name", events[0]->name);
-  EXPECT_TRUE(events[0]->HasArg("arg"));
-
-  std::unique_ptr<base::Value> arg;
-  events[0]->GetArgAsValue("arg", &arg);
-  base::DictionaryValue* arg_dict;
-  EXPECT_TRUE(arg->GetAsDictionary(&arg_dict));
-  std::string property;
-  EXPECT_TRUE(arg_dict->GetString("property", &property));
-  EXPECT_EQ("value", property);
-}
-
-}  // namespace trace_analyzer
diff --git a/base/test/user_action_tester_unittest.cc b/base/test/user_action_tester_unittest.cc
deleted file mode 100644
index a51849f..0000000
--- a/base/test/user_action_tester_unittest.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/test/user_action_tester.h"
-
-#include "base/metrics/user_metrics.h"
-#include "base/metrics/user_metrics_action.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-const char kUserAction1[] = "user.action.1";
-const char kUserAction2[] = "user.action.2";
-const char kUserAction3[] = "user.action.3";
-
-// Record an action and cause all ActionCallback observers to be notified.
-void RecordAction(const char user_action[]) {
-  base::RecordAction(base::UserMetricsAction(user_action));
-}
-
-}  // namespace
-
-// Verify user action counts are zero initially.
-TEST(UserActionTesterTest, GetActionCountWhenNoActionsHaveBeenRecorded) {
-  UserActionTester user_action_tester;
-  EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction1));
-}
-
-// Verify user action counts are tracked properly.
-TEST(UserActionTesterTest, GetActionCountWhenActionsHaveBeenRecorded) {
-  UserActionTester user_action_tester;
-
-  RecordAction(kUserAction1);
-  RecordAction(kUserAction2);
-  RecordAction(kUserAction2);
-
-  EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction1));
-  EXPECT_EQ(2, user_action_tester.GetActionCount(kUserAction2));
-  EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction3));
-}
-
-// Verify no seg faults occur when resetting action counts when none have been
-// recorded.
-TEST(UserActionTesterTest, ResetCountsWhenNoActionsHaveBeenRecorded) {
-  UserActionTester user_action_tester;
-  user_action_tester.ResetCounts();
-}
-
-// Verify user action counts are set to zero on a ResetCounts.
-TEST(UserActionTesterTest, ResetCountsWhenActionsHaveBeenRecorded) {
-  UserActionTester user_action_tester;
-
-  RecordAction(kUserAction1);
-  RecordAction(kUserAction1);
-  RecordAction(kUserAction2);
-  user_action_tester.ResetCounts();
-
-  EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction1));
-  EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction2));
-  EXPECT_EQ(0, user_action_tester.GetActionCount(kUserAction3));
-}
-
-// Verify the UserActionsTester is notified when base::RecordAction is called.
-TEST(UserActionTesterTest, VerifyUserActionTesterListensForUserActions) {
-  UserActionTester user_action_tester;
-
-  base::RecordAction(base::UserMetricsAction(kUserAction1));
-
-  EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction1));
-}
-
-// Verify the UserActionsTester is notified when base::RecordComputedAction is
-// called.
-TEST(UserActionTesterTest,
-     VerifyUserActionTesterListensForComputedUserActions) {
-  UserActionTester user_action_tester;
-
-  base::RecordComputedAction(kUserAction1);
-
-  EXPECT_EQ(1, user_action_tester.GetActionCount(kUserAction1));
-}
-
-}  // namespace base
diff --git a/base/third_party/dynamic_annotations/BUILD.gn b/base/third_party/dynamic_annotations/BUILD.gn
deleted file mode 100644
index 0fc4bf7..0000000
--- a/base/third_party/dynamic_annotations/BUILD.gn
+++ /dev/null
@@ -1,27 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-if (is_nacl) {
-  # Native client doesn't need dynamic annotations, so we provide a
-  # dummy target in order for clients to not have to special-case the
-  # dependency.
-  source_set("dynamic_annotations") {
-    sources = [
-      "dynamic_annotations.h",
-    ]
-  }
-} else {
-  # Should be static library, see documentation on //base:base for discussion.
-  static_library("dynamic_annotations") {
-    sources = [
-      "../valgrind/valgrind.h",
-      "dynamic_annotations.c",
-      "dynamic_annotations.h",
-    ]
-    if (is_android && !is_debug) {
-      configs -= [ "//build/config/compiler:default_optimization" ]
-      configs += [ "//build/config/compiler:optimize_max" ]
-    }
-  }
-}
diff --git a/base/third_party/libevent/BUILD.gn b/base/third_party/libevent/BUILD.gn
deleted file mode 100644
index e934454..0000000
--- a/base/third_party/libevent/BUILD.gn
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/nacl/config.gni")
-
-static_library("libevent") {
-  sources = [
-    "buffer.c",
-    "evbuffer.c",
-    "evdns.c",
-    "evdns.h",
-    "event-config.h",
-    "event-internal.h",
-    "event.c",
-    "event.h",
-    "event_tagging.c",
-    "evhttp.h",
-    "evrpc-internal.h",
-    "evrpc.c",
-    "evrpc.h",
-    "evsignal.h",
-    "evutil.c",
-    "evutil.h",
-    "http-internal.h",
-    "http.c",
-    "log.c",
-    "log.h",
-    "min_heap.h",
-    "poll.c",
-    "select.c",
-    "signal.c",
-    "strlcpy-internal.h",
-    "strlcpy.c",
-  ]
-
-  defines = [ "HAVE_CONFIG_H" ]
-
-  if (is_mac || is_ios) {
-    sources += [
-      "kqueue.c",
-      "mac/config.h",
-      "mac/event-config.h",
-    ]
-    include_dirs = [ "mac" ]
-  } else if (is_linux) {
-    sources += [
-      "epoll.c",
-      "linux/config.h",
-      "linux/event-config.h",
-    ]
-    include_dirs = [ "linux" ]
-  } else if (is_android) {
-    sources += [
-      "android/config.h",
-      "android/event-config.h",
-      "epoll.c",
-    ]
-    include_dirs = [ "android" ]
-  } else if (is_nacl_nonsfi) {
-    sources -= [
-      "evdns.c",
-      "event_tagging.c",
-      "evrpc.c",
-      "http.c",
-      "select.c",
-      "signal.c",
-    ]
-    sources += [
-      "nacl_nonsfi/config.h",
-      "nacl_nonsfi/event-config.h",
-      "nacl_nonsfi/random.c",
-      "nacl_nonsfi/signal_stub.c",
-    ]
-    include_dirs = [ "nacl_nonsfi" ]
-  }
-
-  configs -= [ "//build/config/compiler:chromium_code" ]
-  configs += [ "//build/config/compiler:no_chromium_code" ]
-}
diff --git a/base/third_party/symbolize/BUILD.gn b/base/third_party/symbolize/BUILD.gn
deleted file mode 100644
index 0dc7c2f..0000000
--- a/base/third_party/symbolize/BUILD.gn
+++ /dev/null
@@ -1,36 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/compiler/compiler.gni")
-
-declare_args() {
-  # Stack traces will not include function names. Instead they will contain
-  # file and offset information that can be used with
-  # tools/valgrind/asan/asan_symbolize.py. By piping stderr through this script,
-  # and also enabling symbol_level = 2, you can get much more detailed stack
-  # traces with file names and line numbers, even in non-ASAN builds.
-  print_unsymbolized_stack_traces = is_asan || is_lsan || is_msan || is_tsan
-}
-
-static_library("symbolize") {
-  visibility = [ "//base/*" ]
-  sources = [
-    "config.h",
-    "demangle.cc",
-    "demangle.h",
-    "glog/logging.h",
-    "glog/raw_logging.h",
-    "symbolize.cc",
-    "symbolize.h",
-    "utilities.h",
-  ]
-
-  defines = []
-  if (print_unsymbolized_stack_traces) {
-    defines += [ "PRINT_UNSYMBOLIZED_STACK_TRACES" ]
-  }
-
-  configs -= [ "//build/config/compiler:chromium_code" ]
-  configs += [ "//build/config/compiler:no_chromium_code" ]
-}
diff --git a/base/third_party/xdg_mime/BUILD.gn b/base/third_party/xdg_mime/BUILD.gn
deleted file mode 100644
index ac9e2c9..0000000
--- a/base/third_party/xdg_mime/BUILD.gn
+++ /dev/null
@@ -1,28 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-static_library("xdg_mime") {
-  visibility = [ "//base/*" ]
-  sources = [
-    "xdgmime.c",
-    "xdgmime.h",
-    "xdgmimealias.c",
-    "xdgmimealias.h",
-    "xdgmimecache.c",
-    "xdgmimecache.h",
-    "xdgmimeglob.c",
-    "xdgmimeglob.h",
-    "xdgmimeicon.c",
-    "xdgmimeicon.h",
-    "xdgmimeint.c",
-    "xdgmimeint.h",
-    "xdgmimemagic.c",
-    "xdgmimemagic.h",
-    "xdgmimeparent.c",
-    "xdgmimeparent.h",
-  ]
-
-  configs -= [ "//build/config/compiler:chromium_code" ]
-  configs += [ "//build/config/compiler:no_chromium_code" ]
-}
diff --git a/base/third_party/xdg_user_dirs/BUILD.gn b/base/third_party/xdg_user_dirs/BUILD.gn
deleted file mode 100644
index a5626e9..0000000
--- a/base/third_party/xdg_user_dirs/BUILD.gn
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2013 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-static_library("xdg_user_dirs") {
-  visibility = [ "//base/*" ]
-  sources = [
-    "xdg_user_dir_lookup.cc",
-    "xdg_user_dir_lookup.h",
-  ]
-}
diff --git a/base/thread_annotations_unittest.cc b/base/thread_annotations_unittest.cc
deleted file mode 100644
index b4aafef..0000000
--- a/base/thread_annotations_unittest.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "thread_annotations.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-class LOCKABLE Lock {
- public:
-  void Acquire() EXCLUSIVE_LOCK_FUNCTION() {}
-  void Release() UNLOCK_FUNCTION() {}
-};
-
-class SCOPED_LOCKABLE AutoLock {
- public:
-  AutoLock(Lock& lock) EXCLUSIVE_LOCK_FUNCTION(lock) : lock_(lock) {
-    lock.Acquire();
-  }
-  ~AutoLock() UNLOCK_FUNCTION() { lock_.Release(); }
-
- private:
-  Lock& lock_;
-};
-
-class ThreadSafe {
- public:
-  void ExplicitIncrement();
-  void ImplicitIncrement();
-
- private:
-  Lock lock_;
-  int counter_ GUARDED_BY(lock_);
-};
-
-void ThreadSafe::ExplicitIncrement() {
-  lock_.Acquire();
-  ++counter_;
-  lock_.Release();
-}
-
-void ThreadSafe::ImplicitIncrement() {
-  AutoLock auto_lock(lock_);
-  counter_++;
-}
-
-TEST(ThreadAnnotationsTest, ExplicitIncrement) {
-  ThreadSafe thread_safe;
-  thread_safe.ExplicitIncrement();
-}
-TEST(ThreadAnnotationsTest, ImplicitIncrement) {
-  ThreadSafe thread_safe;
-  thread_safe.ImplicitIncrement();
-}
-
-}  // anonymous namespace
diff --git a/base/thread_annotations_unittest.nc b/base/thread_annotations_unittest.nc
deleted file mode 100644
index ea64a7e..0000000
--- a/base/thread_annotations_unittest.nc
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This is a "No Compile Test" suite.
-// https://dev.chromium.org/developers/testing/no-compile-tests
-
-#include "base/thread_annotations.h"
-
-namespace {
-
-class LOCKABLE Lock {
- public:
-  void Acquire() EXCLUSIVE_LOCK_FUNCTION() {}
-  void Release() UNLOCK_FUNCTION() {}
-};
-
-class SCOPED_LOCKABLE AutoLock {
- public:
-  AutoLock(Lock& lock) EXCLUSIVE_LOCK_FUNCTION(lock) : lock_(lock) {
-    lock.Acquire();
-  }
-  ~AutoLock() UNLOCK_FUNCTION() { lock_.Release(); }
-
- private:
-  Lock& lock_;
-};
-class ThreadSafe {
- public:
-  void BuggyIncrement();
- private:
-  Lock lock_;
-  int counter_ GUARDED_BY(lock_);
-};
-
-#if defined(NCTEST_LOCK_WITHOUT_UNLOCK)  // [r"fatal error: mutex 'lock_' is still held at the end of function"]
-
-void ThreadSafe::BuggyIncrement() {
-  lock_.Acquire();
-  ++counter_;
-  // Forgot to release the lock.
-}
-
-#elif defined(NCTEST_ACCESS_WITHOUT_LOCK)  // [r"fatal error: writing variable 'counter_' requires holding mutex 'lock_' exclusively"]
-
-void ThreadSafe::BuggyIncrement() {
-  // Member access without holding the lock guarding it.
-  ++counter_;
-}
-
-#elif defined(NCTEST_ACCESS_WITHOUT_SCOPED_LOCK)  // [r"fatal error: writing variable 'counter_' requires holding mutex 'lock_' exclusively"]
-
-void ThreadSafe::BuggyIncrement() {
-  {
-    AutoLock auto_lock(lock_);
-    // The AutoLock will go out of scope before the guarded member access.
-  }
-  ++counter_;
-}
-
-#elif defined(NCTEST_GUARDED_BY_WRONG_TYPE)  // [r"fatal error: 'guarded_by' attribute requires arguments whose type is annotated"]
-
-int not_lockable;
-int global_counter GUARDED_BY(not_lockable);
-
-// Defined to avoid link error.
-void ThreadSafe::BuggyIncrement() { }
-
-#endif
-
-}  // anonymous namespace
diff --git a/base/threading/platform_thread_unittest.cc b/base/threading/platform_thread_unittest.cc
deleted file mode 100644
index 968f0e0..0000000
--- a/base/threading/platform_thread_unittest.cc
+++ /dev/null
@@ -1,367 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_POSIX)
-#include "base/threading/platform_thread_internal_posix.h"
-#elif defined(OS_WIN)
-#include <windows.h>
-#endif
-
-namespace base {
-
-// Trivial tests that thread runs and doesn't crash on create, join, or detach -
-
-namespace {
-
-class TrivialThread : public PlatformThread::Delegate {
- public:
-  TrivialThread() : run_event_(WaitableEvent::ResetPolicy::MANUAL,
-                               WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  void ThreadMain() override { run_event_.Signal(); }
-
-  WaitableEvent& run_event() { return run_event_; }
-
- private:
-  WaitableEvent run_event_;
-
-  DISALLOW_COPY_AND_ASSIGN(TrivialThread);
-};
-
-}  // namespace
-
-TEST(PlatformThreadTest, TrivialJoin) {
-  TrivialThread thread;
-  PlatformThreadHandle handle;
-
-  ASSERT_FALSE(thread.run_event().IsSignaled());
-  ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
-  PlatformThread::Join(handle);
-  ASSERT_TRUE(thread.run_event().IsSignaled());
-}
-
-TEST(PlatformThreadTest, TrivialJoinTimesTen) {
-  TrivialThread thread[10];
-  PlatformThreadHandle handle[arraysize(thread)];
-
-  for (size_t n = 0; n < arraysize(thread); n++)
-    ASSERT_FALSE(thread[n].run_event().IsSignaled());
-  for (size_t n = 0; n < arraysize(thread); n++)
-    ASSERT_TRUE(PlatformThread::Create(0, &thread[n], &handle[n]));
-  for (size_t n = 0; n < arraysize(thread); n++)
-    PlatformThread::Join(handle[n]);
-  for (size_t n = 0; n < arraysize(thread); n++)
-    ASSERT_TRUE(thread[n].run_event().IsSignaled());
-}
-
-// The following detach tests are by nature racy. The run_event approximates the
-// end and termination of the thread, but threads could persist shortly after
-// the test completes.
-TEST(PlatformThreadTest, TrivialDetach) {
-  TrivialThread thread;
-  PlatformThreadHandle handle;
-
-  ASSERT_FALSE(thread.run_event().IsSignaled());
-  ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
-  PlatformThread::Detach(handle);
-  thread.run_event().Wait();
-}
-
-TEST(PlatformThreadTest, TrivialDetachTimesTen) {
-  TrivialThread thread[10];
-  PlatformThreadHandle handle[arraysize(thread)];
-
-  for (size_t n = 0; n < arraysize(thread); n++)
-    ASSERT_FALSE(thread[n].run_event().IsSignaled());
-  for (size_t n = 0; n < arraysize(thread); n++) {
-    ASSERT_TRUE(PlatformThread::Create(0, &thread[n], &handle[n]));
-    PlatformThread::Detach(handle[n]);
-  }
-  for (size_t n = 0; n < arraysize(thread); n++)
-    thread[n].run_event().Wait();
-}
-
-// Tests of basic thread functions ---------------------------------------------
-
-namespace {
-
-class FunctionTestThread : public PlatformThread::Delegate {
- public:
-  FunctionTestThread()
-      : thread_id_(kInvalidThreadId),
-        termination_ready_(WaitableEvent::ResetPolicy::MANUAL,
-                           WaitableEvent::InitialState::NOT_SIGNALED),
-        terminate_thread_(WaitableEvent::ResetPolicy::MANUAL,
-                          WaitableEvent::InitialState::NOT_SIGNALED),
-        done_(false) {}
-  ~FunctionTestThread() override {
-    EXPECT_TRUE(terminate_thread_.IsSignaled())
-        << "Need to mark thread for termination and join the underlying thread "
-        << "before destroying a FunctionTestThread as it owns the "
-        << "WaitableEvent blocking the underlying thread's main.";
-  }
-
-  // Grabs |thread_id_|, runs an optional test on that thread, signals
-  // |termination_ready_|, and then waits for |terminate_thread_| to be
-  // signaled before exiting.
-  void ThreadMain() override {
-    thread_id_ = PlatformThread::CurrentId();
-    EXPECT_NE(thread_id_, kInvalidThreadId);
-
-    // Make sure that the thread ID is the same across calls.
-    EXPECT_EQ(thread_id_, PlatformThread::CurrentId());
-
-    // Run extra tests.
-    RunTest();
-
-    termination_ready_.Signal();
-    terminate_thread_.Wait();
-
-    done_ = true;
-  }
-
-  PlatformThreadId thread_id() const {
-    EXPECT_TRUE(termination_ready_.IsSignaled()) << "Thread ID still unknown";
-    return thread_id_;
-  }
-
-  bool IsRunning() const {
-    return termination_ready_.IsSignaled() && !done_;
-  }
-
-  // Blocks until this thread is started and ready to be terminated.
-  void WaitForTerminationReady() { termination_ready_.Wait(); }
-
-  // Marks this thread for termination (callers must then join this thread to be
-  // guaranteed of termination).
-  void MarkForTermination() { terminate_thread_.Signal(); }
-
- private:
-  // Runs an optional test on the newly created thread.
-  virtual void RunTest() {}
-
-  PlatformThreadId thread_id_;
-
-  mutable WaitableEvent termination_ready_;
-  WaitableEvent terminate_thread_;
-  bool done_;
-
-  DISALLOW_COPY_AND_ASSIGN(FunctionTestThread);
-};
-
-}  // namespace
-
-TEST(PlatformThreadTest, Function) {
-  PlatformThreadId main_thread_id = PlatformThread::CurrentId();
-
-  FunctionTestThread thread;
-  PlatformThreadHandle handle;
-
-  ASSERT_FALSE(thread.IsRunning());
-  ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
-  thread.WaitForTerminationReady();
-  ASSERT_TRUE(thread.IsRunning());
-  EXPECT_NE(thread.thread_id(), main_thread_id);
-
-  thread.MarkForTermination();
-  PlatformThread::Join(handle);
-  ASSERT_FALSE(thread.IsRunning());
-
-  // Make sure that the thread ID is the same across calls.
-  EXPECT_EQ(main_thread_id, PlatformThread::CurrentId());
-}
-
-TEST(PlatformThreadTest, FunctionTimesTen) {
-  PlatformThreadId main_thread_id = PlatformThread::CurrentId();
-
-  FunctionTestThread thread[10];
-  PlatformThreadHandle handle[arraysize(thread)];
-
-  for (size_t n = 0; n < arraysize(thread); n++)
-    ASSERT_FALSE(thread[n].IsRunning());
-
-  for (size_t n = 0; n < arraysize(thread); n++)
-    ASSERT_TRUE(PlatformThread::Create(0, &thread[n], &handle[n]));
-  for (size_t n = 0; n < arraysize(thread); n++)
-    thread[n].WaitForTerminationReady();
-
-  for (size_t n = 0; n < arraysize(thread); n++) {
-    ASSERT_TRUE(thread[n].IsRunning());
-    EXPECT_NE(thread[n].thread_id(), main_thread_id);
-
-    // Make sure no two threads get the same ID.
-    for (size_t i = 0; i < n; ++i) {
-      EXPECT_NE(thread[i].thread_id(), thread[n].thread_id());
-    }
-  }
-
-  for (size_t n = 0; n < arraysize(thread); n++)
-    thread[n].MarkForTermination();
-  for (size_t n = 0; n < arraysize(thread); n++)
-    PlatformThread::Join(handle[n]);
-  for (size_t n = 0; n < arraysize(thread); n++)
-    ASSERT_FALSE(thread[n].IsRunning());
-
-  // Make sure that the thread ID is the same across calls.
-  EXPECT_EQ(main_thread_id, PlatformThread::CurrentId());
-}
-
-namespace {
-
-const ThreadPriority kThreadPriorityTestValues[] = {
-// The order should be higher to lower to cover as much cases as possible on
-// Linux trybots running without CAP_SYS_NICE permission.
-#if !defined(OS_ANDROID)
-    // PlatformThread::GetCurrentThreadPriority() on Android does not support
-    // REALTIME_AUDIO case. See http://crbug.com/505474.
-    ThreadPriority::REALTIME_AUDIO,
-#endif
-    ThreadPriority::DISPLAY,
-    // This redundant BACKGROUND priority is to test backgrounding from other
-    // priorities, and unbackgrounding.
-    ThreadPriority::BACKGROUND,
-    ThreadPriority::NORMAL,
-    ThreadPriority::BACKGROUND};
-
-class ThreadPriorityTestThread : public FunctionTestThread {
- public:
-  explicit ThreadPriorityTestThread(ThreadPriority priority)
-      : priority_(priority) {}
-  ~ThreadPriorityTestThread() override = default;
-
- private:
-  void RunTest() override {
-    // Confirm that the current thread's priority is as expected.
-    EXPECT_EQ(ThreadPriority::NORMAL,
-              PlatformThread::GetCurrentThreadPriority());
-
-    // Alter and verify the current thread's priority.
-    PlatformThread::SetCurrentThreadPriority(priority_);
-    EXPECT_EQ(priority_, PlatformThread::GetCurrentThreadPriority());
-  }
-
-  const ThreadPriority priority_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadPriorityTestThread);
-};
-
-}  // namespace
-
-// Test changing a created thread's priority (which has different semantics on
-// some platforms).
-TEST(PlatformThreadTest, ThreadPriorityCurrentThread) {
-  const bool increase_priority_allowed =
-      PlatformThread::CanIncreaseCurrentThreadPriority();
-
-// Bump the priority in order to verify that new threads are started with normal
-// priority. Skip this on Mac since this platform doesn't allow changing the
-// priority of the main thread. Also skip this on platforms that don't allow
-// increasing the priority of a thread.
-#if !defined(OS_MACOSX)
-  if (increase_priority_allowed)
-    PlatformThread::SetCurrentThreadPriority(ThreadPriority::DISPLAY);
-#endif
-
-  // Toggle each supported priority on the thread and confirm it affects it.
-  for (size_t i = 0; i < arraysize(kThreadPriorityTestValues); ++i) {
-    if (!increase_priority_allowed &&
-        kThreadPriorityTestValues[i] >
-            PlatformThread::GetCurrentThreadPriority()) {
-      continue;
-    }
-
-    ThreadPriorityTestThread thread(kThreadPriorityTestValues[i]);
-    PlatformThreadHandle handle;
-
-    ASSERT_FALSE(thread.IsRunning());
-    ASSERT_TRUE(PlatformThread::Create(0, &thread, &handle));
-    thread.WaitForTerminationReady();
-    ASSERT_TRUE(thread.IsRunning());
-
-    thread.MarkForTermination();
-    PlatformThread::Join(handle);
-    ASSERT_FALSE(thread.IsRunning());
-  }
-}
-
-// This tests internal PlatformThread APIs used under some POSIX platforms,
-// with the exception of Mac OS X, iOS and Fuchsia.
-#if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_IOS) && \
-    !defined(OS_FUCHSIA)
-TEST(PlatformThreadTest, GetNiceValueToThreadPriority) {
-  using internal::NiceValueToThreadPriority;
-  using internal::kThreadPriorityToNiceValueMap;
-
-  EXPECT_EQ(ThreadPriority::BACKGROUND,
-            kThreadPriorityToNiceValueMap[0].priority);
-  EXPECT_EQ(ThreadPriority::NORMAL,
-            kThreadPriorityToNiceValueMap[1].priority);
-  EXPECT_EQ(ThreadPriority::DISPLAY,
-            kThreadPriorityToNiceValueMap[2].priority);
-  EXPECT_EQ(ThreadPriority::REALTIME_AUDIO,
-            kThreadPriorityToNiceValueMap[3].priority);
-
-  static const int kBackgroundNiceValue =
-      kThreadPriorityToNiceValueMap[0].nice_value;
-  static const int kNormalNiceValue =
-      kThreadPriorityToNiceValueMap[1].nice_value;
-  static const int kDisplayNiceValue =
-      kThreadPriorityToNiceValueMap[2].nice_value;
-  static const int kRealtimeAudioNiceValue =
-      kThreadPriorityToNiceValueMap[3].nice_value;
-
-  // The tests below assume the nice values specified in the map are within
-  // the range below (both ends exclusive).
-  static const int kHighestNiceValue = 19;
-  static const int kLowestNiceValue = -20;
-
-  EXPECT_GT(kHighestNiceValue, kBackgroundNiceValue);
-  EXPECT_GT(kBackgroundNiceValue, kNormalNiceValue);
-  EXPECT_GT(kNormalNiceValue, kDisplayNiceValue);
-  EXPECT_GT(kDisplayNiceValue, kRealtimeAudioNiceValue);
-  EXPECT_GT(kRealtimeAudioNiceValue, kLowestNiceValue);
-
-  EXPECT_EQ(ThreadPriority::BACKGROUND,
-            NiceValueToThreadPriority(kHighestNiceValue));
-  EXPECT_EQ(ThreadPriority::BACKGROUND,
-            NiceValueToThreadPriority(kBackgroundNiceValue + 1));
-  EXPECT_EQ(ThreadPriority::BACKGROUND,
-            NiceValueToThreadPriority(kBackgroundNiceValue));
-  EXPECT_EQ(ThreadPriority::BACKGROUND,
-            NiceValueToThreadPriority(kNormalNiceValue + 1));
-  EXPECT_EQ(ThreadPriority::NORMAL,
-            NiceValueToThreadPriority(kNormalNiceValue));
-  EXPECT_EQ(ThreadPriority::NORMAL,
-            NiceValueToThreadPriority(kDisplayNiceValue + 1));
-  EXPECT_EQ(ThreadPriority::DISPLAY,
-            NiceValueToThreadPriority(kDisplayNiceValue));
-  EXPECT_EQ(ThreadPriority::DISPLAY,
-            NiceValueToThreadPriority(kRealtimeAudioNiceValue + 1));
-  EXPECT_EQ(ThreadPriority::REALTIME_AUDIO,
-            NiceValueToThreadPriority(kRealtimeAudioNiceValue));
-  EXPECT_EQ(ThreadPriority::REALTIME_AUDIO,
-            NiceValueToThreadPriority(kLowestNiceValue));
-}
-#endif  // defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_IOS) &&
-        // !defined(OS_FUCHSIA)
-
-TEST(PlatformThreadTest, SetHugeThreadName) {
-  // Construct an excessively long thread name.
-  std::string long_name(1024, 'a');
-
-  // SetName has no return code, so just verify that implementations
-  // don't [D]CHECK().
-  PlatformThread::SetName(long_name);
-}
-
-}  // namespace base
diff --git a/base/threading/post_task_and_reply_impl_unittest.cc b/base/threading/post_task_and_reply_impl_unittest.cc
deleted file mode 100644
index 319327d..0000000
--- a/base/threading/post_task_and_reply_impl_unittest.cc
+++ /dev/null
@@ -1,198 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/post_task_and_reply_impl.h"
-
-#include <utility>
-
-#include "base/auto_reset.h"
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/test/test_mock_time_task_runner.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::_;
-
-namespace base {
-namespace internal {
-
-namespace {
-
-class PostTaskAndReplyTaskRunner : public internal::PostTaskAndReplyImpl {
- public:
-  explicit PostTaskAndReplyTaskRunner(TaskRunner* destination)
-      : destination_(destination) {}
-
- private:
-  bool PostTask(const Location& from_here, OnceClosure task) override {
-    return destination_->PostTask(from_here, std::move(task));
-  }
-
-  // Non-owning.
-  TaskRunner* const destination_;
-};
-
-class ObjectToDelete : public RefCounted<ObjectToDelete> {
- public:
-  // |delete_flag| is set to true when this object is deleted
-  ObjectToDelete(bool* delete_flag) : delete_flag_(delete_flag) {
-    EXPECT_FALSE(*delete_flag_);
-  }
-
- private:
-  friend class RefCounted<ObjectToDelete>;
-  ~ObjectToDelete() { *delete_flag_ = true; }
-
-  bool* const delete_flag_;
-
-  DISALLOW_COPY_AND_ASSIGN(ObjectToDelete);
-};
-
-class MockObject {
- public:
-  MockObject() = default;
-
-  MOCK_METHOD1(Task, void(scoped_refptr<ObjectToDelete>));
-  MOCK_METHOD1(Reply, void(scoped_refptr<ObjectToDelete>));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockObject);
-};
-
-class MockRunsTasksInCurrentSequenceTaskRunner : public TestMockTimeTaskRunner {
- public:
-  MockRunsTasksInCurrentSequenceTaskRunner(
-      TestMockTimeTaskRunner::Type type =
-          TestMockTimeTaskRunner::Type::kStandalone)
-      : TestMockTimeTaskRunner(type) {}
-
-  void RunUntilIdleWithRunsTasksInCurrentSequence() {
-    AutoReset<bool> reset(&runs_tasks_in_current_sequence_, true);
-    RunUntilIdle();
-  }
-
-  void ClearPendingTasksWithRunsTasksInCurrentSequence() {
-    AutoReset<bool> reset(&runs_tasks_in_current_sequence_, true);
-    ClearPendingTasks();
-  }
-
-  // TestMockTimeTaskRunner:
-  bool RunsTasksInCurrentSequence() const override {
-    return runs_tasks_in_current_sequence_;
-  }
-
- private:
-  ~MockRunsTasksInCurrentSequenceTaskRunner() override = default;
-
-  bool runs_tasks_in_current_sequence_ = false;
-
-  DISALLOW_COPY_AND_ASSIGN(MockRunsTasksInCurrentSequenceTaskRunner);
-};
-
-class PostTaskAndReplyImplTest : public testing::Test {
- protected:
-  PostTaskAndReplyImplTest() = default;
-
-  void PostTaskAndReplyToMockObject() {
-    // Expect the post to succeed.
-    EXPECT_TRUE(
-        PostTaskAndReplyTaskRunner(post_runner_.get())
-            .PostTaskAndReply(
-                FROM_HERE,
-                BindOnce(&MockObject::Task, Unretained(&mock_object_),
-                         MakeRefCounted<ObjectToDelete>(&delete_task_flag_)),
-                BindOnce(&MockObject::Reply, Unretained(&mock_object_),
-                         MakeRefCounted<ObjectToDelete>(&delete_reply_flag_))));
-
-    // Expect the first task to be posted to |post_runner_|.
-    EXPECT_TRUE(post_runner_->HasPendingTask());
-    EXPECT_FALSE(reply_runner_->HasPendingTask());
-    EXPECT_FALSE(delete_task_flag_);
-    EXPECT_FALSE(delete_reply_flag_);
-  }
-
-  scoped_refptr<MockRunsTasksInCurrentSequenceTaskRunner> post_runner_ =
-      MakeRefCounted<MockRunsTasksInCurrentSequenceTaskRunner>();
-  scoped_refptr<MockRunsTasksInCurrentSequenceTaskRunner> reply_runner_ =
-      MakeRefCounted<MockRunsTasksInCurrentSequenceTaskRunner>(
-          TestMockTimeTaskRunner::Type::kBoundToThread);
-  testing::StrictMock<MockObject> mock_object_;
-  bool delete_task_flag_ = false;
-  bool delete_reply_flag_ = false;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PostTaskAndReplyImplTest);
-};
-
-}  // namespace
-
-TEST_F(PostTaskAndReplyImplTest, PostTaskAndReply) {
-  PostTaskAndReplyToMockObject();
-
-  EXPECT_CALL(mock_object_, Task(_));
-  post_runner_->RunUntilIdleWithRunsTasksInCurrentSequence();
-  testing::Mock::VerifyAndClear(&mock_object_);
-  // The task should have been deleted right after being run.
-  EXPECT_TRUE(delete_task_flag_);
-  EXPECT_FALSE(delete_reply_flag_);
-
-  // Expect the reply to be posted to |reply_runner_|.
-  EXPECT_FALSE(post_runner_->HasPendingTask());
-  EXPECT_TRUE(reply_runner_->HasPendingTask());
-
-  EXPECT_CALL(mock_object_, Reply(_));
-  reply_runner_->RunUntilIdleWithRunsTasksInCurrentSequence();
-  testing::Mock::VerifyAndClear(&mock_object_);
-  EXPECT_TRUE(delete_task_flag_);
-  // The reply should have been deleted right after being run.
-  EXPECT_TRUE(delete_reply_flag_);
-
-  // Expect no pending task in |post_runner_| and |reply_runner_|.
-  EXPECT_FALSE(post_runner_->HasPendingTask());
-  EXPECT_FALSE(reply_runner_->HasPendingTask());
-}
-
-TEST_F(PostTaskAndReplyImplTest, TaskDoesNotRun) {
-  PostTaskAndReplyToMockObject();
-
-  // Clear the |post_runner_|. Both callbacks should be scheduled for deletion
-  // on the |reply_runner_|.
-  post_runner_->ClearPendingTasksWithRunsTasksInCurrentSequence();
-  EXPECT_FALSE(post_runner_->HasPendingTask());
-  EXPECT_TRUE(reply_runner_->HasPendingTask());
-  EXPECT_FALSE(delete_task_flag_);
-  EXPECT_FALSE(delete_reply_flag_);
-
-  // Run the |reply_runner_|. Both callbacks should be deleted.
-  reply_runner_->RunUntilIdleWithRunsTasksInCurrentSequence();
-  EXPECT_TRUE(delete_task_flag_);
-  EXPECT_TRUE(delete_reply_flag_);
-}
-
-TEST_F(PostTaskAndReplyImplTest, ReplyDoesNotRun) {
-  PostTaskAndReplyToMockObject();
-
-  EXPECT_CALL(mock_object_, Task(_));
-  post_runner_->RunUntilIdleWithRunsTasksInCurrentSequence();
-  testing::Mock::VerifyAndClear(&mock_object_);
-  // The task should have been deleted right after being run.
-  EXPECT_TRUE(delete_task_flag_);
-  EXPECT_FALSE(delete_reply_flag_);
-
-  // Expect the reply to be posted to |reply_runner_|.
-  EXPECT_FALSE(post_runner_->HasPendingTask());
-  EXPECT_TRUE(reply_runner_->HasPendingTask());
-
-  // Clear the |reply_runner_| queue without running tasks. The reply callback
-  // should be deleted.
-  reply_runner_->ClearPendingTasksWithRunsTasksInCurrentSequence();
-  EXPECT_TRUE(delete_task_flag_);
-  EXPECT_TRUE(delete_reply_flag_);
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/threading/scoped_blocking_call_unittest.cc b/base/threading/scoped_blocking_call_unittest.cc
deleted file mode 100644
index 5e030f3..0000000
--- a/base/threading/scoped_blocking_call_unittest.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/scoped_blocking_call.h"
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/test/gtest_util.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class MockBlockingObserver : public internal::BlockingObserver {
- public:
-  MockBlockingObserver() = default;
-
-  MOCK_METHOD1(BlockingStarted, void(BlockingType));
-  MOCK_METHOD0(BlockingTypeUpgraded, void());
-  MOCK_METHOD0(BlockingEnded, void());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockBlockingObserver);
-};
-
-class ScopedBlockingCallTest : public testing::Test {
- protected:
-  ScopedBlockingCallTest() {
-    internal::SetBlockingObserverForCurrentThread(&observer_);
-  }
-
-  ~ScopedBlockingCallTest() override {
-    internal::ClearBlockingObserverForTesting();
-  }
-
-  testing::StrictMock<MockBlockingObserver> observer_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ScopedBlockingCallTest);
-};
-
-}  // namespace
-
-TEST_F(ScopedBlockingCallTest, MayBlock) {
-  EXPECT_CALL(observer_, BlockingStarted(BlockingType::MAY_BLOCK));
-  ScopedBlockingCall scoped_blocking_call(BlockingType::MAY_BLOCK);
-  testing::Mock::VerifyAndClear(&observer_);
-  EXPECT_CALL(observer_, BlockingEnded());
-}
-
-TEST_F(ScopedBlockingCallTest, WillBlock) {
-  EXPECT_CALL(observer_, BlockingStarted(BlockingType::WILL_BLOCK));
-  ScopedBlockingCall scoped_blocking_call(BlockingType::WILL_BLOCK);
-  testing::Mock::VerifyAndClear(&observer_);
-  EXPECT_CALL(observer_, BlockingEnded());
-}
-
-TEST_F(ScopedBlockingCallTest, MayBlockWillBlock) {
-  EXPECT_CALL(observer_, BlockingStarted(BlockingType::MAY_BLOCK));
-  ScopedBlockingCall scoped_blocking_call_a(BlockingType::MAY_BLOCK);
-  testing::Mock::VerifyAndClear(&observer_);
-
-  {
-    EXPECT_CALL(observer_, BlockingTypeUpgraded());
-    ScopedBlockingCall scoped_blocking_call_b(BlockingType::WILL_BLOCK);
-    testing::Mock::VerifyAndClear(&observer_);
-  }
-
-  EXPECT_CALL(observer_, BlockingEnded());
-}
-
-TEST_F(ScopedBlockingCallTest, WillBlockMayBlock) {
-  EXPECT_CALL(observer_, BlockingStarted(BlockingType::WILL_BLOCK));
-  ScopedBlockingCall scoped_blocking_call_a(BlockingType::WILL_BLOCK);
-  testing::Mock::VerifyAndClear(&observer_);
-
-  { ScopedBlockingCall scoped_blocking_call_b(BlockingType::MAY_BLOCK); }
-
-  EXPECT_CALL(observer_, BlockingEnded());
-}
-
-TEST_F(ScopedBlockingCallTest, MayBlockMayBlock) {
-  EXPECT_CALL(observer_, BlockingStarted(BlockingType::MAY_BLOCK));
-  ScopedBlockingCall scoped_blocking_call_a(BlockingType::MAY_BLOCK);
-  testing::Mock::VerifyAndClear(&observer_);
-
-  { ScopedBlockingCall scoped_blocking_call_b(BlockingType::MAY_BLOCK); }
-
-  EXPECT_CALL(observer_, BlockingEnded());
-}
-
-TEST_F(ScopedBlockingCallTest, WillBlockWillBlock) {
-  EXPECT_CALL(observer_, BlockingStarted(BlockingType::WILL_BLOCK));
-  ScopedBlockingCall scoped_blocking_call_a(BlockingType::WILL_BLOCK);
-  testing::Mock::VerifyAndClear(&observer_);
-
-  { ScopedBlockingCall scoped_blocking_call_b(BlockingType::WILL_BLOCK); }
-
-  EXPECT_CALL(observer_, BlockingEnded());
-}
-
-TEST_F(ScopedBlockingCallTest, MayBlockWillBlockTwice) {
-  EXPECT_CALL(observer_, BlockingStarted(BlockingType::MAY_BLOCK));
-  ScopedBlockingCall scoped_blocking_call_a(BlockingType::MAY_BLOCK);
-  testing::Mock::VerifyAndClear(&observer_);
-
-  {
-    EXPECT_CALL(observer_, BlockingTypeUpgraded());
-    ScopedBlockingCall scoped_blocking_call_b(BlockingType::WILL_BLOCK);
-    testing::Mock::VerifyAndClear(&observer_);
-
-    {
-      ScopedBlockingCall scoped_blocking_call_c(BlockingType::MAY_BLOCK);
-      ScopedBlockingCall scoped_blocking_call_d(BlockingType::WILL_BLOCK);
-    }
-  }
-
-  EXPECT_CALL(observer_, BlockingEnded());
-}
-
-TEST(ScopedBlockingCallDestructionOrderTest, InvalidDestructionOrder) {
-  auto scoped_blocking_call_a =
-      std::make_unique<ScopedBlockingCall>(BlockingType::WILL_BLOCK);
-  auto scoped_blocking_call_b =
-      std::make_unique<ScopedBlockingCall>(BlockingType::WILL_BLOCK);
-
-  EXPECT_DCHECK_DEATH({ scoped_blocking_call_a.reset(); });
-}
-
-}  // namespace base
diff --git a/base/threading/sequence_local_storage_map_unittest.cc b/base/threading/sequence_local_storage_map_unittest.cc
deleted file mode 100644
index a45bbc3..0000000
--- a/base/threading/sequence_local_storage_map_unittest.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/sequence_local_storage_map.h"
-
-#include <memory>
-#include <utility>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace internal {
-
-namespace {
-
-constexpr int kSlotId = 1;
-
-class SetOnDestroy {
- public:
-  SetOnDestroy(bool* was_destroyed_ptr)
-      : was_destroyed_ptr_(was_destroyed_ptr) {
-    DCHECK(was_destroyed_ptr_);
-    DCHECK(!(*was_destroyed_ptr_));
-  }
-  ~SetOnDestroy() {
-    DCHECK(!(*was_destroyed_ptr_));
-    *was_destroyed_ptr_ = true;
-  }
-
- private:
-  bool* const was_destroyed_ptr_;
-
-  DISALLOW_COPY_AND_ASSIGN(SetOnDestroy);
-};
-
-template <typename T, typename... Args>
-SequenceLocalStorageMap::ValueDestructorPair CreateValueDestructorPair(
-    Args... args) {
-  T* value = new T(args...);
-  SequenceLocalStorageMap::ValueDestructorPair::DestructorFunc* destructor =
-      [](void* ptr) { std::default_delete<T>()(static_cast<T*>(ptr)); };
-
-  SequenceLocalStorageMap::ValueDestructorPair value_destructor_pair{
-      value, destructor};
-
-  return value_destructor_pair;
-}
-
-}  // namespace
-
-// Verify that setting a value in the SequenceLocalStorageMap, then getting
-// it will yield the same value.
-TEST(SequenceLocalStorageMapTest, SetGet) {
-  SequenceLocalStorageMap sequence_local_storage_map;
-  ScopedSetSequenceLocalStorageMapForCurrentThread
-      scoped_sequence_local_storage_map(&sequence_local_storage_map);
-
-  SequenceLocalStorageMap::ValueDestructorPair value_destructor_pair =
-      CreateValueDestructorPair<int>(5);
-
-  sequence_local_storage_map.Set(kSlotId, std::move(value_destructor_pair));
-
-  EXPECT_EQ(*static_cast<int*>(sequence_local_storage_map.Get(kSlotId)), 5);
-}
-
-// Verify that the destructor is called on a value stored in the
-// SequenceLocalStorageMap when SequenceLocalStorageMap is destroyed.
-TEST(SequenceLocalStorageMapTest, Destructor) {
-  bool set_on_destruction = false;
-
-  {
-    SequenceLocalStorageMap sequence_local_storage_map;
-    ScopedSetSequenceLocalStorageMapForCurrentThread
-        scoped_sequence_local_storage_map(&sequence_local_storage_map);
-
-    SequenceLocalStorageMap::ValueDestructorPair value_destructor_pair =
-        CreateValueDestructorPair<SetOnDestroy>(&set_on_destruction);
-
-    sequence_local_storage_map.Set(kSlotId, std::move(value_destructor_pair));
-  }
-
-  EXPECT_TRUE(set_on_destruction);
-}
-
-// Verify that overwriting a value already in the SequenceLocalStorageMap
-// calls value's destructor.
-TEST(SequenceLocalStorageMapTest, DestructorCalledOnSetOverwrite) {
-  bool set_on_destruction = false;
-  bool set_on_destruction2 = false;
-  {
-    SequenceLocalStorageMap sequence_local_storage_map;
-    ScopedSetSequenceLocalStorageMapForCurrentThread
-        scoped_sequence_local_storage_map(&sequence_local_storage_map);
-
-    SequenceLocalStorageMap::ValueDestructorPair value_destructor_pair =
-        CreateValueDestructorPair<SetOnDestroy>(&set_on_destruction);
-    SequenceLocalStorageMap::ValueDestructorPair value_destructor_pair2 =
-        CreateValueDestructorPair<SetOnDestroy>(&set_on_destruction2);
-
-    sequence_local_storage_map.Set(kSlotId, std::move(value_destructor_pair));
-
-    ASSERT_FALSE(set_on_destruction);
-
-    // Overwrites the old value in the slot.
-    sequence_local_storage_map.Set(kSlotId, std::move(value_destructor_pair2));
-
-    // Destructor should've been called for the old value in the slot, and not
-    // yet called for the new value.
-    EXPECT_TRUE(set_on_destruction);
-    EXPECT_FALSE(set_on_destruction2);
-  }
-  EXPECT_TRUE(set_on_destruction2);
-}
-
-}  // namespace internal
-}  // namespace base
diff --git a/base/threading/sequence_local_storage_slot_unittest.cc b/base/threading/sequence_local_storage_slot_unittest.cc
deleted file mode 100644
index 4a9f6a9..0000000
--- a/base/threading/sequence_local_storage_slot_unittest.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/sequence_local_storage_slot.h"
-
-#include <utility>
-
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/threading/sequence_local_storage_map.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class SequenceLocalStorageSlotTest : public testing::Test {
- protected:
-  SequenceLocalStorageSlotTest()
-      : scoped_sequence_local_storage_(&sequence_local_storage_) {}
-
-  internal::SequenceLocalStorageMap sequence_local_storage_;
-  internal::ScopedSetSequenceLocalStorageMapForCurrentThread
-      scoped_sequence_local_storage_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SequenceLocalStorageSlotTest);
-};
-
-}  // namespace
-
-// Verify that a value stored with Set() can be retrieved with Get().
-TEST_F(SequenceLocalStorageSlotTest, GetSet) {
-  SequenceLocalStorageSlot<int> slot;
-  slot.Set(5);
-  EXPECT_EQ(slot.Get(), 5);
-}
-
-// Verify that setting an object in a SequenceLocalStorageSlot creates a copy
-// of that object independent of the original one.
-TEST_F(SequenceLocalStorageSlotTest, SetObjectIsIndependent) {
-  bool should_be_false = false;
-
-  SequenceLocalStorageSlot<bool> slot;
-
-  slot.Set(should_be_false);
-
-  EXPECT_FALSE(slot.Get());
-  slot.Get() = true;
-  EXPECT_TRUE(slot.Get());
-
-  EXPECT_NE(should_be_false, slot.Get());
-}
-
-// Verify that multiple slots work and that calling Get after overwriting
-// a value in a slot yields the new value.
-TEST_F(SequenceLocalStorageSlotTest, GetSetMultipleSlots) {
-  SequenceLocalStorageSlot<int> slot1;
-  SequenceLocalStorageSlot<int> slot2;
-  SequenceLocalStorageSlot<int> slot3;
-
-  slot1.Set(1);
-  slot2.Set(2);
-  slot3.Set(3);
-
-  EXPECT_EQ(slot1.Get(), 1);
-  EXPECT_EQ(slot2.Get(), 2);
-  EXPECT_EQ(slot3.Get(), 3);
-
-  slot3.Set(4);
-  slot2.Set(5);
-  slot1.Set(6);
-
-  EXPECT_EQ(slot3.Get(), 4);
-  EXPECT_EQ(slot2.Get(), 5);
-  EXPECT_EQ(slot1.Get(), 6);
-}
-
-// Verify that changing the the value returned by Get() changes the value
-// in sequence local storage.
-TEST_F(SequenceLocalStorageSlotTest, GetReferenceModifiable) {
-  SequenceLocalStorageSlot<bool> slot;
-  slot.Set(false);
-  slot.Get() = true;
-  EXPECT_TRUE(slot.Get());
-}
-
-// Verify that a move-only type can be stored in sequence local storage.
-TEST_F(SequenceLocalStorageSlotTest, SetGetWithMoveOnlyType) {
-  std::unique_ptr<int> int_unique_ptr = std::make_unique<int>(5);
-
-  SequenceLocalStorageSlot<std::unique_ptr<int>> slot;
-  slot.Set(std::move(int_unique_ptr));
-
-  EXPECT_EQ(*slot.Get(), 5);
-}
-
-// Verify that a Get() without a previous Set() on a slot returns a
-// default-constructed value.
-TEST_F(SequenceLocalStorageSlotTest, GetWithoutSetDefaultConstructs) {
-  struct DefaultConstructable {
-    int x = 0x12345678;
-  };
-
-  SequenceLocalStorageSlot<DefaultConstructable> slot;
-
-  EXPECT_EQ(slot.Get().x, 0x12345678);
-}
-
-// Verify that a Get() without a previous Set() on a slot with a POD-type
-// returns a default-constructed value.
-// Note: this test could be flaky and give a false pass. If it's flaky, the test
-// might've "passed" because the memory for the slot happened to be zeroed.
-TEST_F(SequenceLocalStorageSlotTest, GetWithoutSetDefaultConstructsPOD) {
-  SequenceLocalStorageSlot<void*> slot;
-
-  EXPECT_EQ(slot.Get(), nullptr);
-}
-
-// Verify that the value of a slot is specific to a SequenceLocalStorageMap
-TEST(SequenceLocalStorageSlotMultipleMapTest, SetGetMultipleMapsOneSlot) {
-  SequenceLocalStorageSlot<unsigned int> slot;
-  internal::SequenceLocalStorageMap sequence_local_storage_maps[5];
-
-  // Set the value of the slot to be the index of the current
-  // SequenceLocalStorageMaps in the vector
-  for (unsigned int i = 0; i < arraysize(sequence_local_storage_maps); ++i) {
-    internal::ScopedSetSequenceLocalStorageMapForCurrentThread
-        scoped_sequence_local_storage(&sequence_local_storage_maps[i]);
-
-    slot.Set(i);
-  }
-
-  for (unsigned int i = 0; i < arraysize(sequence_local_storage_maps); ++i) {
-    internal::ScopedSetSequenceLocalStorageMapForCurrentThread
-        scoped_sequence_local_storage(&sequence_local_storage_maps[i]);
-
-    EXPECT_EQ(slot.Get(), i);
-  }
-}
-
-}  // namespace base
diff --git a/base/threading/sequenced_task_runner_handle_unittest.cc b/base/threading/sequenced_task_runner_handle_unittest.cc
deleted file mode 100644
index 48394da..0000000
--- a/base/threading/sequenced_task_runner_handle_unittest.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/sequenced_task_runner_handle.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/location.h"
-#include "base/memory/ref_counted.h"
-#include "base/run_loop.h"
-#include "base/sequence_checker_impl.h"
-#include "base/sequenced_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/test/test_simple_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-class SequencedTaskRunnerHandleTest : public ::testing::Test {
- protected:
-  // Verifies that the context it runs on has a SequencedTaskRunnerHandle
-  // and that posting to it results in the posted task running in that same
-  // context (sequence).
-  static void VerifyCurrentSequencedTaskRunner() {
-    ASSERT_TRUE(SequencedTaskRunnerHandle::IsSet());
-    scoped_refptr<SequencedTaskRunner> task_runner =
-        SequencedTaskRunnerHandle::Get();
-    ASSERT_TRUE(task_runner);
-
-    // Use SequenceCheckerImpl to make sure it's not a no-op in Release builds.
-    std::unique_ptr<SequenceCheckerImpl> sequence_checker(
-        new SequenceCheckerImpl);
-    task_runner->PostTask(
-        FROM_HERE,
-        base::BindOnce(&SequencedTaskRunnerHandleTest::CheckValidSequence,
-                       std::move(sequence_checker)));
-  }
-
-  static void CheckValidSequence(
-      std::unique_ptr<SequenceCheckerImpl> sequence_checker) {
-    EXPECT_TRUE(sequence_checker->CalledOnValidSequence());
-  }
-
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
-};
-
-TEST_F(SequencedTaskRunnerHandleTest, FromMessageLoop) {
-  VerifyCurrentSequencedTaskRunner();
-  RunLoop().RunUntilIdle();
-}
-
-TEST_F(SequencedTaskRunnerHandleTest, FromTaskSchedulerSequencedTask) {
-  base::CreateSequencedTaskRunnerWithTraits({})->PostTask(
-      FROM_HERE,
-      base::BindOnce(
-          &SequencedTaskRunnerHandleTest::VerifyCurrentSequencedTaskRunner));
-  scoped_task_environment_.RunUntilIdle();
-}
-
-TEST_F(SequencedTaskRunnerHandleTest, NoHandleFromUnsequencedTask) {
-  base::PostTask(FROM_HERE, base::BindOnce([]() {
-                   EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
-                 }));
-  scoped_task_environment_.RunUntilIdle();
-}
-
-TEST(SequencedTaskRunnerHandleTestWithoutMessageLoop, FromHandleInScope) {
-  scoped_refptr<SequencedTaskRunner> test_task_runner(new TestSimpleTaskRunner);
-  EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-  {
-    SequencedTaskRunnerHandle handle(test_task_runner);
-    EXPECT_TRUE(SequencedTaskRunnerHandle::IsSet());
-    EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-    EXPECT_EQ(test_task_runner, SequencedTaskRunnerHandle::Get());
-  }
-  EXPECT_FALSE(SequencedTaskRunnerHandle::IsSet());
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-}
-
-}  // namespace
-}  // namespace base
diff --git a/base/threading/simple_thread_unittest.cc b/base/threading/simple_thread_unittest.cc
deleted file mode 100644
index 4e618f9..0000000
--- a/base/threading/simple_thread_unittest.cc
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-
-#include "base/atomic_sequence_num.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/gtest_util.h"
-#include "base/threading/simple_thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class SetIntRunner : public DelegateSimpleThread::Delegate {
- public:
-  SetIntRunner(int* ptr, int val) : ptr_(ptr), val_(val) { }
-  ~SetIntRunner() override = default;
-
- private:
-  void Run() override { *ptr_ = val_; }
-
-  int* ptr_;
-  int val_;
-
-  DISALLOW_COPY_AND_ASSIGN(SetIntRunner);
-};
-
-// Signals |started_| when Run() is invoked and waits until |released_| is
-// signaled to return, signaling |done_| before doing so. Useful for tests that
-// care to control Run()'s flow.
-class ControlledRunner : public DelegateSimpleThread::Delegate {
- public:
-  ControlledRunner()
-      : started_(WaitableEvent::ResetPolicy::MANUAL,
-                 WaitableEvent::InitialState::NOT_SIGNALED),
-        released_(WaitableEvent::ResetPolicy::MANUAL,
-                  WaitableEvent::InitialState::NOT_SIGNALED),
-        done_(WaitableEvent::ResetPolicy::MANUAL,
-              WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  ~ControlledRunner() override { ReleaseAndWaitUntilDone(); }
-
-  void WaitUntilStarted() { started_.Wait(); }
-
-  void ReleaseAndWaitUntilDone() {
-    released_.Signal();
-    done_.Wait();
-  }
-
- private:
-  void Run() override {
-    started_.Signal();
-    released_.Wait();
-    done_.Signal();
-  }
-
-  WaitableEvent started_;
-  WaitableEvent released_;
-  WaitableEvent done_;
-
-  DISALLOW_COPY_AND_ASSIGN(ControlledRunner);
-};
-
-class WaitEventRunner : public DelegateSimpleThread::Delegate {
- public:
-  explicit WaitEventRunner(WaitableEvent* event) : event_(event) { }
-  ~WaitEventRunner() override = default;
-
- private:
-  void Run() override {
-    EXPECT_FALSE(event_->IsSignaled());
-    event_->Signal();
-    EXPECT_TRUE(event_->IsSignaled());
-  }
-
-  WaitableEvent* event_;
-
-  DISALLOW_COPY_AND_ASSIGN(WaitEventRunner);
-};
-
-class SeqRunner : public DelegateSimpleThread::Delegate {
- public:
-  explicit SeqRunner(AtomicSequenceNumber* seq) : seq_(seq) { }
-
- private:
-  void Run() override { seq_->GetNext(); }
-
-  AtomicSequenceNumber* seq_;
-
-  DISALLOW_COPY_AND_ASSIGN(SeqRunner);
-};
-
-// We count up on a sequence number, firing on the event when we've hit our
-// expected amount, otherwise we wait on the event.  This will ensure that we
-// have all threads outstanding until we hit our expected thread pool size.
-class VerifyPoolRunner : public DelegateSimpleThread::Delegate {
- public:
-  VerifyPoolRunner(AtomicSequenceNumber* seq,
-                   int total, WaitableEvent* event)
-      : seq_(seq), total_(total), event_(event) { }
-
- private:
-  void Run() override {
-    if (seq_->GetNext() == total_) {
-      event_->Signal();
-    } else {
-      event_->Wait();
-    }
-  }
-
-  AtomicSequenceNumber* seq_;
-  int total_;
-  WaitableEvent* event_;
-
-  DISALLOW_COPY_AND_ASSIGN(VerifyPoolRunner);
-};
-
-}  // namespace
-
-TEST(SimpleThreadTest, CreateAndJoin) {
-  int stack_int = 0;
-
-  SetIntRunner runner(&stack_int, 7);
-  EXPECT_EQ(0, stack_int);
-
-  DelegateSimpleThread thread(&runner, "int_setter");
-  EXPECT_FALSE(thread.HasBeenStarted());
-  EXPECT_FALSE(thread.HasBeenJoined());
-  EXPECT_EQ(0, stack_int);
-
-  thread.Start();
-  EXPECT_TRUE(thread.HasBeenStarted());
-  EXPECT_FALSE(thread.HasBeenJoined());
-
-  thread.Join();
-  EXPECT_TRUE(thread.HasBeenStarted());
-  EXPECT_TRUE(thread.HasBeenJoined());
-  EXPECT_EQ(7, stack_int);
-}
-
-TEST(SimpleThreadTest, WaitForEvent) {
-  // Create a thread, and wait for it to signal us.
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-
-  WaitEventRunner runner(&event);
-  DelegateSimpleThread thread(&runner, "event_waiter");
-
-  EXPECT_FALSE(event.IsSignaled());
-  thread.Start();
-  event.Wait();
-  EXPECT_TRUE(event.IsSignaled());
-  thread.Join();
-}
-
-TEST(SimpleThreadTest, NonJoinableStartAndDieOnJoin) {
-  ControlledRunner runner;
-
-  SimpleThread::Options options;
-  options.joinable = false;
-  DelegateSimpleThread thread(&runner, "non_joinable", options);
-
-  EXPECT_FALSE(thread.HasBeenStarted());
-  thread.Start();
-  EXPECT_TRUE(thread.HasBeenStarted());
-
-  // Note: this is not quite the same as |thread.HasBeenStarted()| which
-  // represents ThreadMain() getting ready to invoke Run() whereas
-  // |runner.WaitUntilStarted()| ensures Run() was actually invoked.
-  runner.WaitUntilStarted();
-
-  EXPECT_FALSE(thread.HasBeenJoined());
-  EXPECT_DCHECK_DEATH({ thread.Join(); });
-}
-
-TEST(SimpleThreadTest, NonJoinableInactiveDelegateDestructionIsOkay) {
-  std::unique_ptr<ControlledRunner> runner(new ControlledRunner);
-
-  SimpleThread::Options options;
-  options.joinable = false;
-  std::unique_ptr<DelegateSimpleThread> thread(
-      new DelegateSimpleThread(runner.get(), "non_joinable", options));
-
-  thread->Start();
-  runner->WaitUntilStarted();
-
-  // Deleting a non-joinable SimpleThread after Run() was invoked is okay.
-  thread.reset();
-
-  runner->WaitUntilStarted();
-  runner->ReleaseAndWaitUntilDone();
-  // It should be safe to destroy a Delegate after its Run() method completed.
-  runner.reset();
-}
-
-TEST(SimpleThreadTest, ThreadPool) {
-  AtomicSequenceNumber seq;
-  SeqRunner runner(&seq);
-  DelegateSimpleThreadPool pool("seq_runner", 10);
-
-  // Add work before we're running.
-  pool.AddWork(&runner, 300);
-
-  EXPECT_EQ(seq.GetNext(), 0);
-  pool.Start();
-
-  // Add work while we're running.
-  pool.AddWork(&runner, 300);
-
-  pool.JoinAll();
-
-  EXPECT_EQ(seq.GetNext(), 601);
-
-  // We can reuse our pool.  Verify that all 10 threads can actually run in
-  // parallel, so this test will only pass if there are actually 10 threads.
-  AtomicSequenceNumber seq2;
-  WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-  // Changing 9 to 10, for example, would cause us JoinAll() to never return.
-  VerifyPoolRunner verifier(&seq2, 9, &event);
-  pool.Start();
-
-  pool.AddWork(&verifier, 10);
-
-  pool.JoinAll();
-  EXPECT_EQ(seq2.GetNext(), 10);
-}
-
-}  // namespace base
diff --git a/base/threading/thread_checker_unittest.cc b/base/threading/thread_checker_unittest.cc
deleted file mode 100644
index 5fbbc52..0000000
--- a/base/threading/thread_checker_unittest.cc
+++ /dev/null
@@ -1,245 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/thread_checker.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/sequence_token.h"
-#include "base/test/gtest_util.h"
-#include "base/test/test_simple_task_runner.h"
-#include "base/threading/simple_thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-// A thread that runs a callback.
-class RunCallbackThread : public SimpleThread {
- public:
-  explicit RunCallbackThread(const Closure& callback)
-      : SimpleThread("RunCallbackThread"), callback_(callback) {}
-
- private:
-  // SimpleThread:
-  void Run() override { callback_.Run(); }
-
-  const Closure callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(RunCallbackThread);
-};
-
-// Runs a callback on a new thread synchronously.
-void RunCallbackOnNewThreadSynchronously(const Closure& callback) {
-  RunCallbackThread run_callback_thread(callback);
-  run_callback_thread.Start();
-  run_callback_thread.Join();
-}
-
-void ExpectCalledOnValidThread(ThreadCheckerImpl* thread_checker) {
-  ASSERT_TRUE(thread_checker);
-
-  // This should bind |thread_checker| to the current thread if it wasn't
-  // already bound to a thread.
-  EXPECT_TRUE(thread_checker->CalledOnValidThread());
-
-  // Since |thread_checker| is now bound to the current thread, another call to
-  // CalledOnValidThread() should return true.
-  EXPECT_TRUE(thread_checker->CalledOnValidThread());
-}
-
-void ExpectNotCalledOnValidThread(ThreadCheckerImpl* thread_checker) {
-  ASSERT_TRUE(thread_checker);
-  EXPECT_FALSE(thread_checker->CalledOnValidThread());
-}
-
-void ExpectNotCalledOnValidThreadWithSequenceTokenAndThreadTaskRunnerHandle(
-    ThreadCheckerImpl* thread_checker,
-    SequenceToken sequence_token) {
-  ThreadTaskRunnerHandle thread_task_runner_handle(
-      MakeRefCounted<TestSimpleTaskRunner>());
-  ScopedSetSequenceTokenForCurrentThread
-      scoped_set_sequence_token_for_current_thread(sequence_token);
-  ExpectNotCalledOnValidThread(thread_checker);
-}
-
-}  // namespace
-
-TEST(ThreadCheckerTest, AllowedSameThreadNoSequenceToken) {
-  ThreadCheckerImpl thread_checker;
-  EXPECT_TRUE(thread_checker.CalledOnValidThread());
-}
-
-TEST(ThreadCheckerTest,
-     AllowedSameThreadAndSequenceDifferentTasksWithThreadTaskRunnerHandle) {
-  ThreadTaskRunnerHandle thread_task_runner_handle(
-      MakeRefCounted<TestSimpleTaskRunner>());
-
-  std::unique_ptr<ThreadCheckerImpl> thread_checker;
-  const SequenceToken sequence_token = SequenceToken::Create();
-
-  {
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(sequence_token);
-    thread_checker.reset(new ThreadCheckerImpl);
-  }
-
-  {
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(sequence_token);
-    EXPECT_TRUE(thread_checker->CalledOnValidThread());
-  }
-}
-
-TEST(ThreadCheckerTest,
-     AllowedSameThreadSequenceAndTaskNoThreadTaskRunnerHandle) {
-  ScopedSetSequenceTokenForCurrentThread
-      scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-  ThreadCheckerImpl thread_checker;
-  EXPECT_TRUE(thread_checker.CalledOnValidThread());
-}
-
-TEST(ThreadCheckerTest,
-     DisallowedSameThreadAndSequenceDifferentTasksNoThreadTaskRunnerHandle) {
-  std::unique_ptr<ThreadCheckerImpl> thread_checker;
-
-  {
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-    thread_checker.reset(new ThreadCheckerImpl);
-  }
-
-  {
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-    EXPECT_FALSE(thread_checker->CalledOnValidThread());
-  }
-}
-
-TEST(ThreadCheckerTest, DisallowedDifferentThreadsNoSequenceToken) {
-  ThreadCheckerImpl thread_checker;
-  RunCallbackOnNewThreadSynchronously(
-      Bind(&ExpectNotCalledOnValidThread, Unretained(&thread_checker)));
-}
-
-TEST(ThreadCheckerTest, DisallowedDifferentThreadsSameSequence) {
-  ThreadTaskRunnerHandle thread_task_runner_handle(
-      MakeRefCounted<TestSimpleTaskRunner>());
-  const SequenceToken sequence_token(SequenceToken::Create());
-
-  ScopedSetSequenceTokenForCurrentThread
-      scoped_set_sequence_token_for_current_thread(sequence_token);
-  ThreadCheckerImpl thread_checker;
-  EXPECT_TRUE(thread_checker.CalledOnValidThread());
-
-  RunCallbackOnNewThreadSynchronously(Bind(
-      &ExpectNotCalledOnValidThreadWithSequenceTokenAndThreadTaskRunnerHandle,
-      Unretained(&thread_checker), sequence_token));
-}
-
-TEST(ThreadCheckerTest, DisallowedSameThreadDifferentSequence) {
-  std::unique_ptr<ThreadCheckerImpl> thread_checker;
-
-  ThreadTaskRunnerHandle thread_task_runner_handle(
-      MakeRefCounted<TestSimpleTaskRunner>());
-
-  {
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-    thread_checker.reset(new ThreadCheckerImpl);
-  }
-
-  {
-    // Different SequenceToken.
-    ScopedSetSequenceTokenForCurrentThread
-        scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-    EXPECT_FALSE(thread_checker->CalledOnValidThread());
-  }
-
-  // No SequenceToken.
-  EXPECT_FALSE(thread_checker->CalledOnValidThread());
-}
-
-TEST(ThreadCheckerTest, DetachFromThread) {
-  ThreadCheckerImpl thread_checker;
-  thread_checker.DetachFromThread();
-
-  // Verify that CalledOnValidThread() returns true when called on a different
-  // thread after a call to DetachFromThread().
-  RunCallbackOnNewThreadSynchronously(
-      Bind(&ExpectCalledOnValidThread, Unretained(&thread_checker)));
-
-  EXPECT_FALSE(thread_checker.CalledOnValidThread());
-}
-
-TEST(ThreadCheckerTest, DetachFromThreadWithSequenceToken) {
-  ThreadTaskRunnerHandle thread_task_runner_handle(
-      MakeRefCounted<TestSimpleTaskRunner>());
-  ScopedSetSequenceTokenForCurrentThread
-      scoped_set_sequence_token_for_current_thread(SequenceToken::Create());
-  ThreadCheckerImpl thread_checker;
-  thread_checker.DetachFromThread();
-
-  // Verify that CalledOnValidThread() returns true when called on a different
-  // thread after a call to DetachFromThread().
-  RunCallbackOnNewThreadSynchronously(
-      Bind(&ExpectCalledOnValidThread, Unretained(&thread_checker)));
-
-  EXPECT_FALSE(thread_checker.CalledOnValidThread());
-}
-
-namespace {
-
-// This fixture is a helper for unit testing the thread checker macros as it is
-// not possible to inline ExpectDeathOnOtherThread() and
-// ExpectNoDeathOnOtherThreadAfterDetach() as lambdas since binding
-// |Unretained(&my_sequence_checker)| wouldn't compile on non-dcheck builds
-// where it won't be defined.
-class ThreadCheckerMacroTest : public testing::Test {
- public:
-  ThreadCheckerMacroTest() = default;
-
-  void ExpectDeathOnOtherThread() {
-#if DCHECK_IS_ON()
-    EXPECT_DCHECK_DEATH({ DCHECK_CALLED_ON_VALID_THREAD(my_thread_checker_); });
-#else
-    // Happily no-ops on non-dcheck builds.
-    DCHECK_CALLED_ON_VALID_THREAD(my_thread_checker_);
-#endif
-  }
-
-  void ExpectNoDeathOnOtherThreadAfterDetach() {
-    DCHECK_CALLED_ON_VALID_THREAD(my_thread_checker_);
-    DCHECK_CALLED_ON_VALID_THREAD(my_thread_checker_)
-        << "Make sure it compiles when DCHECK is off";
-  }
-
- protected:
-  THREAD_CHECKER(my_thread_checker_);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ThreadCheckerMacroTest);
-};
-
-}  // namespace
-
-TEST_F(ThreadCheckerMacroTest, Macros) {
-  THREAD_CHECKER(my_thread_checker);
-
-  RunCallbackOnNewThreadSynchronously(Bind(
-      &ThreadCheckerMacroTest::ExpectDeathOnOtherThread, Unretained(this)));
-
-  DETACH_FROM_THREAD(my_thread_checker_);
-
-  RunCallbackOnNewThreadSynchronously(
-      Bind(&ThreadCheckerMacroTest::ExpectNoDeathOnOtherThreadAfterDetach,
-           Unretained(this)));
-}
-
-}  // namespace base
diff --git a/base/threading/thread_collision_warner_unittest.cc b/base/threading/thread_collision_warner_unittest.cc
deleted file mode 100644
index cd56768..0000000
--- a/base/threading/thread_collision_warner_unittest.cc
+++ /dev/null
@@ -1,382 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/thread_collision_warner.h"
-
-#include <memory>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/simple_thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-// '' : local class member function does not have a body
-MSVC_PUSH_DISABLE_WARNING(4822)
-
-
-#if defined(NDEBUG)
-
-// Would cause a memory leak otherwise.
-#undef DFAKE_MUTEX
-#define DFAKE_MUTEX(obj) std::unique_ptr<base::AsserterBase> obj
-
-// In Release, we expect the AsserterBase::warn() to not happen.
-#define EXPECT_NDEBUG_FALSE_DEBUG_TRUE EXPECT_FALSE
-
-#else
-
-// In Debug, we expect the AsserterBase::warn() to happen.
-#define EXPECT_NDEBUG_FALSE_DEBUG_TRUE EXPECT_TRUE
-
-#endif
-
-
-namespace {
-
-// This is the asserter used with ThreadCollisionWarner instead of the default
-// DCheckAsserter. The method fail_state is used to know if a collision took
-// place.
-class AssertReporter : public base::AsserterBase {
- public:
-  AssertReporter()
-      : failed_(false) {}
-
-  void warn() override { failed_ = true; }
-
-  ~AssertReporter() override = default;
-
-  bool fail_state() const { return failed_; }
-  void reset() { failed_ = false; }
-
- private:
-  bool failed_;
-};
-
-}  // namespace
-
-TEST(ThreadCollisionTest, BookCriticalSection) {
-  AssertReporter* local_reporter = new AssertReporter();
-
-  base::ThreadCollisionWarner warner(local_reporter);
-  EXPECT_FALSE(local_reporter->fail_state());
-
-  {  // Pin section.
-    DFAKE_SCOPED_LOCK_THREAD_LOCKED(warner);
-    EXPECT_FALSE(local_reporter->fail_state());
-    {  // Pin section.
-      DFAKE_SCOPED_LOCK_THREAD_LOCKED(warner);
-      EXPECT_FALSE(local_reporter->fail_state());
-    }
-  }
-}
-
-TEST(ThreadCollisionTest, ScopedRecursiveBookCriticalSection) {
-  AssertReporter* local_reporter = new AssertReporter();
-
-  base::ThreadCollisionWarner warner(local_reporter);
-  EXPECT_FALSE(local_reporter->fail_state());
-
-  {  // Pin section.
-    DFAKE_SCOPED_RECURSIVE_LOCK(warner);
-    EXPECT_FALSE(local_reporter->fail_state());
-    {  // Pin section again (allowed by DFAKE_SCOPED_RECURSIVE_LOCK)
-      DFAKE_SCOPED_RECURSIVE_LOCK(warner);
-      EXPECT_FALSE(local_reporter->fail_state());
-    }  // Unpin section.
-  }  // Unpin section.
-
-  // Check that section is not pinned
-  {  // Pin section.
-    DFAKE_SCOPED_LOCK(warner);
-    EXPECT_FALSE(local_reporter->fail_state());
-  }  // Unpin section.
-}
-
-TEST(ThreadCollisionTest, ScopedBookCriticalSection) {
-  AssertReporter* local_reporter = new AssertReporter();
-
-  base::ThreadCollisionWarner warner(local_reporter);
-  EXPECT_FALSE(local_reporter->fail_state());
-
-  {  // Pin section.
-    DFAKE_SCOPED_LOCK(warner);
-    EXPECT_FALSE(local_reporter->fail_state());
-  }  // Unpin section.
-
-  {  // Pin section.
-    DFAKE_SCOPED_LOCK(warner);
-    EXPECT_FALSE(local_reporter->fail_state());
-    {
-      // Pin section again (not allowed by DFAKE_SCOPED_LOCK)
-      DFAKE_SCOPED_LOCK(warner);
-      EXPECT_NDEBUG_FALSE_DEBUG_TRUE(local_reporter->fail_state());
-      // Reset the status of warner for further tests.
-      local_reporter->reset();
-    }  // Unpin section.
-  }  // Unpin section.
-
-  {
-    // Pin section.
-    DFAKE_SCOPED_LOCK(warner);
-    EXPECT_FALSE(local_reporter->fail_state());
-  }  // Unpin section.
-}
-
-TEST(ThreadCollisionTest, MTBookCriticalSectionTest) {
-  class NonThreadSafeQueue {
-   public:
-    explicit NonThreadSafeQueue(base::AsserterBase* asserter)
-        : push_pop_(asserter) {
-    }
-
-    void push(int value) {
-      DFAKE_SCOPED_LOCK_THREAD_LOCKED(push_pop_);
-    }
-
-    int pop() {
-      DFAKE_SCOPED_LOCK_THREAD_LOCKED(push_pop_);
-      return 0;
-    }
-
-   private:
-    DFAKE_MUTEX(push_pop_);
-
-    DISALLOW_COPY_AND_ASSIGN(NonThreadSafeQueue);
-  };
-
-  class QueueUser : public base::DelegateSimpleThread::Delegate {
-   public:
-    explicit QueueUser(NonThreadSafeQueue* queue) : queue_(queue) {}
-
-    void Run() override {
-      queue_->push(0);
-      queue_->pop();
-    }
-
-   private:
-    NonThreadSafeQueue* queue_;
-  };
-
-  AssertReporter* local_reporter = new AssertReporter();
-
-  NonThreadSafeQueue queue(local_reporter);
-
-  QueueUser queue_user_a(&queue);
-  QueueUser queue_user_b(&queue);
-
-  base::DelegateSimpleThread thread_a(&queue_user_a, "queue_user_thread_a");
-  base::DelegateSimpleThread thread_b(&queue_user_b, "queue_user_thread_b");
-
-  thread_a.Start();
-  thread_b.Start();
-
-  thread_a.Join();
-  thread_b.Join();
-
-  EXPECT_NDEBUG_FALSE_DEBUG_TRUE(local_reporter->fail_state());
-}
-
-TEST(ThreadCollisionTest, MTScopedBookCriticalSectionTest) {
-  // Queue with a 5 seconds push execution time, hopefuly the two used threads
-  // in the test will enter the push at same time.
-  class NonThreadSafeQueue {
-   public:
-    explicit NonThreadSafeQueue(base::AsserterBase* asserter)
-        : push_pop_(asserter) {
-    }
-
-    void push(int value) {
-      DFAKE_SCOPED_LOCK(push_pop_);
-      base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(5));
-    }
-
-    int pop() {
-      DFAKE_SCOPED_LOCK(push_pop_);
-      return 0;
-    }
-
-   private:
-    DFAKE_MUTEX(push_pop_);
-
-    DISALLOW_COPY_AND_ASSIGN(NonThreadSafeQueue);
-  };
-
-  class QueueUser : public base::DelegateSimpleThread::Delegate {
-   public:
-    explicit QueueUser(NonThreadSafeQueue* queue) : queue_(queue) {}
-
-    void Run() override {
-      queue_->push(0);
-      queue_->pop();
-    }
-
-   private:
-    NonThreadSafeQueue* queue_;
-  };
-
-  AssertReporter* local_reporter = new AssertReporter();
-
-  NonThreadSafeQueue queue(local_reporter);
-
-  QueueUser queue_user_a(&queue);
-  QueueUser queue_user_b(&queue);
-
-  base::DelegateSimpleThread thread_a(&queue_user_a, "queue_user_thread_a");
-  base::DelegateSimpleThread thread_b(&queue_user_b, "queue_user_thread_b");
-
-  thread_a.Start();
-  thread_b.Start();
-
-  thread_a.Join();
-  thread_b.Join();
-
-  EXPECT_NDEBUG_FALSE_DEBUG_TRUE(local_reporter->fail_state());
-}
-
-TEST(ThreadCollisionTest, MTSynchedScopedBookCriticalSectionTest) {
-  // Queue with a 2 seconds push execution time, hopefuly the two used threads
-  // in the test will enter the push at same time.
-  class NonThreadSafeQueue {
-   public:
-    explicit NonThreadSafeQueue(base::AsserterBase* asserter)
-        : push_pop_(asserter) {
-    }
-
-    void push(int value) {
-      DFAKE_SCOPED_LOCK(push_pop_);
-      base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(2));
-    }
-
-    int pop() {
-      DFAKE_SCOPED_LOCK(push_pop_);
-      return 0;
-    }
-
-   private:
-    DFAKE_MUTEX(push_pop_);
-
-    DISALLOW_COPY_AND_ASSIGN(NonThreadSafeQueue);
-  };
-
-  // This time the QueueUser class protects the non thread safe queue with
-  // a lock.
-  class QueueUser : public base::DelegateSimpleThread::Delegate {
-   public:
-    QueueUser(NonThreadSafeQueue* queue, base::Lock* lock)
-        : queue_(queue), lock_(lock) {}
-
-    void Run() override {
-      {
-        base::AutoLock auto_lock(*lock_);
-        queue_->push(0);
-      }
-      {
-        base::AutoLock auto_lock(*lock_);
-        queue_->pop();
-      }
-    }
-   private:
-    NonThreadSafeQueue* queue_;
-    base::Lock* lock_;
-  };
-
-  AssertReporter* local_reporter = new AssertReporter();
-
-  NonThreadSafeQueue queue(local_reporter);
-
-  base::Lock lock;
-
-  QueueUser queue_user_a(&queue, &lock);
-  QueueUser queue_user_b(&queue, &lock);
-
-  base::DelegateSimpleThread thread_a(&queue_user_a, "queue_user_thread_a");
-  base::DelegateSimpleThread thread_b(&queue_user_b, "queue_user_thread_b");
-
-  thread_a.Start();
-  thread_b.Start();
-
-  thread_a.Join();
-  thread_b.Join();
-
-  EXPECT_FALSE(local_reporter->fail_state());
-}
-
-TEST(ThreadCollisionTest, MTSynchedScopedRecursiveBookCriticalSectionTest) {
-  // Queue with a 2 seconds push execution time, hopefuly the two used threads
-  // in the test will enter the push at same time.
-  class NonThreadSafeQueue {
-   public:
-    explicit NonThreadSafeQueue(base::AsserterBase* asserter)
-        : push_pop_(asserter) {
-    }
-
-    void push(int) {
-      DFAKE_SCOPED_RECURSIVE_LOCK(push_pop_);
-      bar();
-      base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(2));
-    }
-
-    int pop() {
-      DFAKE_SCOPED_RECURSIVE_LOCK(push_pop_);
-      return 0;
-    }
-
-    void bar() {
-      DFAKE_SCOPED_RECURSIVE_LOCK(push_pop_);
-    }
-
-   private:
-    DFAKE_MUTEX(push_pop_);
-
-    DISALLOW_COPY_AND_ASSIGN(NonThreadSafeQueue);
-  };
-
-  // This time the QueueUser class protects the non thread safe queue with
-  // a lock.
-  class QueueUser : public base::DelegateSimpleThread::Delegate {
-   public:
-    QueueUser(NonThreadSafeQueue* queue, base::Lock* lock)
-        : queue_(queue), lock_(lock) {}
-
-    void Run() override {
-      {
-        base::AutoLock auto_lock(*lock_);
-        queue_->push(0);
-      }
-      {
-        base::AutoLock auto_lock(*lock_);
-        queue_->bar();
-      }
-      {
-        base::AutoLock auto_lock(*lock_);
-        queue_->pop();
-      }
-    }
-   private:
-    NonThreadSafeQueue* queue_;
-    base::Lock* lock_;
-  };
-
-  AssertReporter* local_reporter = new AssertReporter();
-
-  NonThreadSafeQueue queue(local_reporter);
-
-  base::Lock lock;
-
-  QueueUser queue_user_a(&queue, &lock);
-  QueueUser queue_user_b(&queue, &lock);
-
-  base::DelegateSimpleThread thread_a(&queue_user_a, "queue_user_thread_a");
-  base::DelegateSimpleThread thread_b(&queue_user_b, "queue_user_thread_b");
-
-  thread_a.Start();
-  thread_b.Start();
-
-  thread_a.Join();
-  thread_b.Join();
-
-  EXPECT_FALSE(local_reporter->fail_state());
-}
diff --git a/base/threading/thread_id_name_manager_unittest.cc b/base/threading/thread_id_name_manager_unittest.cc
deleted file mode 100644
index 350dc0f..0000000
--- a/base/threading/thread_id_name_manager_unittest.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/thread_id_name_manager.h"
-
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-typedef PlatformTest ThreadIdNameManagerTest;
-
-namespace {
-
-const char kAThread[] = "a thread";
-const char kBThread[] = "b thread";
-
-TEST_F(ThreadIdNameManagerTest, AddThreads) {
-  base::ThreadIdNameManager* manager = base::ThreadIdNameManager::GetInstance();
-  base::Thread thread_a(kAThread);
-  base::Thread thread_b(kBThread);
-
-  thread_a.StartAndWaitForTesting();
-  thread_b.StartAndWaitForTesting();
-
-  EXPECT_STREQ(kAThread, manager->GetName(thread_a.GetThreadId()));
-  EXPECT_STREQ(kBThread, manager->GetName(thread_b.GetThreadId()));
-
-  thread_b.Stop();
-  thread_a.Stop();
-}
-
-TEST_F(ThreadIdNameManagerTest, RemoveThreads) {
-  base::ThreadIdNameManager* manager = base::ThreadIdNameManager::GetInstance();
-  base::Thread thread_a(kAThread);
-
-  thread_a.StartAndWaitForTesting();
-  {
-    base::Thread thread_b(kBThread);
-    thread_b.StartAndWaitForTesting();
-    thread_b.Stop();
-  }
-  EXPECT_STREQ(kAThread, manager->GetName(thread_a.GetThreadId()));
-
-  thread_a.Stop();
-  EXPECT_STREQ("", manager->GetName(thread_a.GetThreadId()));
-}
-
-TEST_F(ThreadIdNameManagerTest, RestartThread) {
-  base::ThreadIdNameManager* manager = base::ThreadIdNameManager::GetInstance();
-  base::Thread thread_a(kAThread);
-
-  thread_a.StartAndWaitForTesting();
-  base::PlatformThreadId a_id = thread_a.GetThreadId();
-  EXPECT_STREQ(kAThread, manager->GetName(a_id));
-  thread_a.Stop();
-
-  thread_a.StartAndWaitForTesting();
-  EXPECT_STREQ("", manager->GetName(a_id));
-  EXPECT_STREQ(kAThread, manager->GetName(thread_a.GetThreadId()));
-  thread_a.Stop();
-}
-
-TEST_F(ThreadIdNameManagerTest, ThreadNameInterning) {
-  base::ThreadIdNameManager* manager = base::ThreadIdNameManager::GetInstance();
-
-  base::PlatformThreadId a_id = base::PlatformThread::CurrentId();
-  base::PlatformThread::SetName("First Name");
-  std::string version = manager->GetName(a_id);
-
-  base::PlatformThread::SetName("New name");
-  EXPECT_NE(version, manager->GetName(a_id));
-  base::PlatformThread::SetName("");
-}
-
-TEST_F(ThreadIdNameManagerTest, ResettingNameKeepsCorrectInternedValue) {
-  base::ThreadIdNameManager* manager = base::ThreadIdNameManager::GetInstance();
-
-  base::PlatformThreadId a_id = base::PlatformThread::CurrentId();
-  base::PlatformThread::SetName("Test Name");
-  std::string version = manager->GetName(a_id);
-
-  base::PlatformThread::SetName("New name");
-  EXPECT_NE(version, manager->GetName(a_id));
-
-  base::PlatformThread::SetName("Test Name");
-  EXPECT_EQ(version, manager->GetName(a_id));
-
-  base::PlatformThread::SetName("");
-}
-
-}  // namespace
diff --git a/base/threading/thread_local_storage_unittest.cc b/base/threading/thread_local_storage_unittest.cc
deleted file mode 100644
index 006f928..0000000
--- a/base/threading/thread_local_storage_unittest.cc
+++ /dev/null
@@ -1,278 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/thread_local_storage.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#include <process.h>
-#endif
-
-#include "base/macros.h"
-#include "base/no_destructor.h"
-#include "base/threading/simple_thread.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-// Ignore warnings about ptr->int conversions that we use when
-// storing ints into ThreadLocalStorage.
-#pragma warning(disable : 4311 4312)
-#endif
-
-namespace base {
-
-#if defined(OS_POSIX)
-
-namespace internal {
-
-// This class is friended by ThreadLocalStorage.
-class ThreadLocalStorageTestInternal {
- public:
-  static bool HasBeenDestroyed() {
-    return ThreadLocalStorage::HasBeenDestroyed();
-  }
-};
-
-}  // namespace internal
-
-#endif  // defined(OS_POSIX)
-
-namespace {
-
-const int kInitialTlsValue = 0x5555;
-const int kFinalTlsValue = 0x7777;
-// How many times must a destructor be called before we really are done.
-const int kNumberDestructorCallRepetitions = 3;
-
-void ThreadLocalStorageCleanup(void* value);
-
-ThreadLocalStorage::Slot& TLSSlot() {
-  static NoDestructor<ThreadLocalStorage::Slot> slot(
-      &ThreadLocalStorageCleanup);
-  return *slot;
-}
-
-class ThreadLocalStorageRunner : public DelegateSimpleThread::Delegate {
- public:
-  explicit ThreadLocalStorageRunner(int* tls_value_ptr)
-      : tls_value_ptr_(tls_value_ptr) {}
-
-  ~ThreadLocalStorageRunner() override = default;
-
-  void Run() override {
-    *tls_value_ptr_ = kInitialTlsValue;
-    TLSSlot().Set(tls_value_ptr_);
-
-    int* ptr = static_cast<int*>(TLSSlot().Get());
-    EXPECT_EQ(ptr, tls_value_ptr_);
-    EXPECT_EQ(*ptr, kInitialTlsValue);
-    *tls_value_ptr_ = 0;
-
-    ptr = static_cast<int*>(TLSSlot().Get());
-    EXPECT_EQ(ptr, tls_value_ptr_);
-    EXPECT_EQ(*ptr, 0);
-
-    *ptr = kFinalTlsValue + kNumberDestructorCallRepetitions;
-  }
-
- private:
-  int* tls_value_ptr_;
-  DISALLOW_COPY_AND_ASSIGN(ThreadLocalStorageRunner);
-};
-
-
-void ThreadLocalStorageCleanup(void *value) {
-  int *ptr = reinterpret_cast<int*>(value);
-  // Destructors should never be called with a NULL.
-  ASSERT_NE(reinterpret_cast<int*>(NULL), ptr);
-  if (*ptr == kFinalTlsValue)
-    return;  // We've been called enough times.
-  ASSERT_LT(kFinalTlsValue, *ptr);
-  ASSERT_GE(kFinalTlsValue + kNumberDestructorCallRepetitions, *ptr);
-  --*ptr;  // Move closer to our target.
-  // Tell tls that we're not done with this thread, and still need destruction.
-  TLSSlot().Set(value);
-}
-
-#if defined(OS_POSIX)
-constexpr intptr_t kDummyValue = 0xABCD;
-constexpr size_t kKeyCount = 20;
-
-// The order in which pthread keys are destructed is not specified by the POSIX
-// specification. Hopefully, of the 20 keys we create, some of them should be
-// destroyed after the TLS key is destroyed.
-class UseTLSDuringDestructionRunner {
- public:
-  UseTLSDuringDestructionRunner() = default;
-
-  // The order in which pthread_key destructors are called is not well defined.
-  // Hopefully, by creating 10 both before and after initializing TLS on the
-  // thread, at least 1 will be called after TLS destruction.
-  void Run() {
-    ASSERT_FALSE(internal::ThreadLocalStorageTestInternal::HasBeenDestroyed());
-
-    // Create 10 pthread keys before initializing TLS on the thread.
-    size_t slot_index = 0;
-    for (; slot_index < 10; ++slot_index) {
-      CreateTlsKeyWithDestructor(slot_index);
-    }
-
-    // Initialize the Chrome TLS system. It's possible that base::Thread has
-    // already initialized Chrome TLS, but we don't rely on that.
-    slot_.Set(reinterpret_cast<void*>(kDummyValue));
-
-    // Create 10 pthread keys after initializing TLS on the thread.
-    for (; slot_index < kKeyCount; ++slot_index) {
-      CreateTlsKeyWithDestructor(slot_index);
-    }
-  }
-
-  bool teardown_works_correctly() { return teardown_works_correctly_; }
-
- private:
-  struct TLSState {
-    pthread_key_t key;
-    bool* teardown_works_correctly;
-  };
-
-  // The POSIX TLS destruction API takes as input a single C-function, which is
-  // called with the current |value| of a (key, value) pair. We need this
-  // function to do two things: set the |value| to nullptr, which requires
-  // knowing the associated |key|, and update the |teardown_works_correctly_|
-  // state.
-  //
-  // To accomplish this, we set the value to an instance of TLSState, which
-  // contains |key| as well as a pointer to |teardown_works_correctly|.
-  static void ThreadLocalDestructor(void* value) {
-    TLSState* state = static_cast<TLSState*>(value);
-    int result = pthread_setspecific(state->key, nullptr);
-    ASSERT_EQ(result, 0);
-
-    // If this path is hit, then the thread local destructor was called after
-    // the Chrome-TLS destructor and the internal state was updated correctly.
-    // No further checks are necessary.
-    if (internal::ThreadLocalStorageTestInternal::HasBeenDestroyed()) {
-      *(state->teardown_works_correctly) = true;
-      return;
-    }
-
-    // If this path is hit, then the thread local destructor was called before
-    // the Chrome-TLS destructor is hit. The ThreadLocalStorage::Slot should
-    // still function correctly.
-    ASSERT_EQ(reinterpret_cast<intptr_t>(slot_.Get()), kDummyValue);
-  }
-
-  void CreateTlsKeyWithDestructor(size_t index) {
-    ASSERT_LT(index, kKeyCount);
-
-    tls_states_[index].teardown_works_correctly = &teardown_works_correctly_;
-    int result = pthread_key_create(
-        &(tls_states_[index].key),
-        UseTLSDuringDestructionRunner::ThreadLocalDestructor);
-    ASSERT_EQ(result, 0);
-
-    result = pthread_setspecific(tls_states_[index].key, &tls_states_[index]);
-    ASSERT_EQ(result, 0);
-  }
-
-  static base::ThreadLocalStorage::Slot slot_;
-  bool teardown_works_correctly_ = false;
-  TLSState tls_states_[kKeyCount];
-
-  DISALLOW_COPY_AND_ASSIGN(UseTLSDuringDestructionRunner);
-};
-
-base::ThreadLocalStorage::Slot UseTLSDuringDestructionRunner::slot_;
-
-void* UseTLSTestThreadRun(void* input) {
-  UseTLSDuringDestructionRunner* runner =
-      static_cast<UseTLSDuringDestructionRunner*>(input);
-  runner->Run();
-  return nullptr;
-}
-
-#endif  // defined(OS_POSIX)
-
-}  // namespace
-
-TEST(ThreadLocalStorageTest, Basics) {
-  ThreadLocalStorage::Slot slot;
-  slot.Set(reinterpret_cast<void*>(123));
-  int value = reinterpret_cast<intptr_t>(slot.Get());
-  EXPECT_EQ(value, 123);
-}
-
-#if defined(THREAD_SANITIZER) || \
-    (defined(OS_WIN) && defined(ARCH_CPU_X86_64) && !defined(NDEBUG))
-// Do not run the test under ThreadSanitizer. Because this test iterates its
-// own TSD destructor for the maximum possible number of times, TSan can't jump
-// in after the last destructor invocation, therefore the destructor remains
-// unsynchronized with the following users of the same TSD slot. This results
-// in race reports between the destructor and functions in other tests.
-//
-// It is disabled on Win x64 with incremental linking (i.e. "Debug") pending
-// resolution of http://crbug.com/251251.
-#define MAYBE_TLSDestructors DISABLED_TLSDestructors
-#else
-#define MAYBE_TLSDestructors TLSDestructors
-#endif
-TEST(ThreadLocalStorageTest, MAYBE_TLSDestructors) {
-  // Create a TLS index with a destructor.  Create a set of
-  // threads that set the TLS, while the destructor cleans it up.
-  // After the threads finish, verify that the value is cleaned up.
-  const int kNumThreads = 5;
-  int values[kNumThreads];
-  ThreadLocalStorageRunner* thread_delegates[kNumThreads];
-  DelegateSimpleThread* threads[kNumThreads];
-
-  // Spawn the threads.
-  for (int index = 0; index < kNumThreads; index++) {
-    values[index] = kInitialTlsValue;
-    thread_delegates[index] = new ThreadLocalStorageRunner(&values[index]);
-    threads[index] = new DelegateSimpleThread(thread_delegates[index],
-                                              "tls thread");
-    threads[index]->Start();
-  }
-
-  // Wait for the threads to finish.
-  for (int index = 0; index < kNumThreads; index++) {
-    threads[index]->Join();
-    delete threads[index];
-    delete thread_delegates[index];
-
-    // Verify that the destructor was called and that we reset.
-    EXPECT_EQ(values[index], kFinalTlsValue);
-  }
-}
-
-TEST(ThreadLocalStorageTest, TLSReclaim) {
-  // Creates and destroys many TLS slots and ensures they all zero-inited.
-  for (int i = 0; i < 1000; ++i) {
-    ThreadLocalStorage::Slot slot(nullptr);
-    EXPECT_EQ(nullptr, slot.Get());
-    slot.Set(reinterpret_cast<void*>(0xBAADF00D));
-    EXPECT_EQ(reinterpret_cast<void*>(0xBAADF00D), slot.Get());
-  }
-}
-
-#if defined(OS_POSIX)
-// Unlike POSIX, Windows does not iterate through the OS TLS to cleanup any
-// values there. Instead a per-module thread destruction function is called.
-// However, it is not possible to perform a check after this point (as the code
-// is detached from the thread), so this check remains POSIX only.
-TEST(ThreadLocalStorageTest, UseTLSDuringDestruction) {
-  UseTLSDuringDestructionRunner runner;
-  pthread_t thread;
-  int result = pthread_create(&thread, nullptr, UseTLSTestThreadRun, &runner);
-  ASSERT_EQ(result, 0);
-
-  result = pthread_join(thread, nullptr);
-  ASSERT_EQ(result, 0);
-
-  EXPECT_TRUE(runner.teardown_works_correctly());
-}
-#endif  // defined(OS_POSIX)
-
-}  // namespace base
diff --git a/base/threading/thread_local_unittest.cc b/base/threading/thread_local_unittest.cc
deleted file mode 100644
index 54f2ad2..0000000
--- a/base/threading/thread_local_unittest.cc
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/logging.h"
-#include "base/threading/simple_thread.h"
-#include "base/threading/thread_local.h"
-#include "base/synchronization/waitable_event.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class ThreadLocalTesterBase : public base::DelegateSimpleThreadPool::Delegate {
- public:
-  typedef base::ThreadLocalPointer<char> TLPType;
-
-  ThreadLocalTesterBase(TLPType* tlp, base::WaitableEvent* done)
-      : tlp_(tlp),
-        done_(done) {
-  }
-  ~ThreadLocalTesterBase() override = default;
-
- protected:
-  TLPType* tlp_;
-  base::WaitableEvent* done_;
-};
-
-class SetThreadLocal : public ThreadLocalTesterBase {
- public:
-  SetThreadLocal(TLPType* tlp, base::WaitableEvent* done)
-      : ThreadLocalTesterBase(tlp, done), val_(nullptr) {}
-  ~SetThreadLocal() override = default;
-
-  void set_value(char* val) { val_ = val; }
-
-  void Run() override {
-    DCHECK(!done_->IsSignaled());
-    tlp_->Set(val_);
-    done_->Signal();
-  }
-
- private:
-  char* val_;
-};
-
-class GetThreadLocal : public ThreadLocalTesterBase {
- public:
-  GetThreadLocal(TLPType* tlp, base::WaitableEvent* done)
-      : ThreadLocalTesterBase(tlp, done), ptr_(nullptr) {}
-  ~GetThreadLocal() override = default;
-
-  void set_ptr(char** ptr) { ptr_ = ptr; }
-
-  void Run() override {
-    DCHECK(!done_->IsSignaled());
-    *ptr_ = tlp_->Get();
-    done_->Signal();
-  }
-
- private:
-  char** ptr_;
-};
-
-}  // namespace
-
-// In this test, we start 2 threads which will access a ThreadLocalPointer.  We
-// make sure the default is NULL, and the pointers are unique to the threads.
-TEST(ThreadLocalTest, Pointer) {
-  base::DelegateSimpleThreadPool tp1("ThreadLocalTest tp1", 1);
-  base::DelegateSimpleThreadPool tp2("ThreadLocalTest tp1", 1);
-  tp1.Start();
-  tp2.Start();
-
-  base::ThreadLocalPointer<char> tlp;
-
-  static char* const kBogusPointer = reinterpret_cast<char*>(0x1234);
-
-  char* tls_val;
-  base::WaitableEvent done(WaitableEvent::ResetPolicy::MANUAL,
-                           WaitableEvent::InitialState::NOT_SIGNALED);
-
-  GetThreadLocal getter(&tlp, &done);
-  getter.set_ptr(&tls_val);
-
-  // Check that both threads defaulted to NULL.
-  tls_val = kBogusPointer;
-  done.Reset();
-  tp1.AddWork(&getter);
-  done.Wait();
-  EXPECT_EQ(static_cast<char*>(nullptr), tls_val);
-
-  tls_val = kBogusPointer;
-  done.Reset();
-  tp2.AddWork(&getter);
-  done.Wait();
-  EXPECT_EQ(static_cast<char*>(nullptr), tls_val);
-
-  SetThreadLocal setter(&tlp, &done);
-  setter.set_value(kBogusPointer);
-
-  // Have thread 1 set their pointer value to kBogusPointer.
-  done.Reset();
-  tp1.AddWork(&setter);
-  done.Wait();
-
-  tls_val = nullptr;
-  done.Reset();
-  tp1.AddWork(&getter);
-  done.Wait();
-  EXPECT_EQ(kBogusPointer, tls_val);
-
-  // Make sure thread 2 is still NULL
-  tls_val = kBogusPointer;
-  done.Reset();
-  tp2.AddWork(&getter);
-  done.Wait();
-  EXPECT_EQ(static_cast<char*>(nullptr), tls_val);
-
-  // Set thread 2 to kBogusPointer + 1.
-  setter.set_value(kBogusPointer + 1);
-
-  done.Reset();
-  tp2.AddWork(&setter);
-  done.Wait();
-
-  tls_val = nullptr;
-  done.Reset();
-  tp2.AddWork(&getter);
-  done.Wait();
-  EXPECT_EQ(kBogusPointer + 1, tls_val);
-
-  // Make sure thread 1 is still kBogusPointer.
-  tls_val = nullptr;
-  done.Reset();
-  tp1.AddWork(&getter);
-  done.Wait();
-  EXPECT_EQ(kBogusPointer, tls_val);
-
-  tp1.JoinAll();
-  tp2.JoinAll();
-}
-
-TEST(ThreadLocalTest, Boolean) {
-  {
-    base::ThreadLocalBoolean tlb;
-    EXPECT_FALSE(tlb.Get());
-
-    tlb.Set(false);
-    EXPECT_FALSE(tlb.Get());
-
-    tlb.Set(true);
-    EXPECT_TRUE(tlb.Get());
-  }
-
-  // Our slot should have been freed, we're all reset.
-  {
-    base::ThreadLocalBoolean tlb;
-    EXPECT_FALSE(tlb.Get());
-  }
-}
-
-}  // namespace base
diff --git a/base/threading/thread_restrictions_unittest.cc b/base/threading/thread_restrictions_unittest.cc
deleted file mode 100644
index a957a9a..0000000
--- a/base/threading/thread_restrictions_unittest.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/thread_restrictions.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/test/gtest_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-class ThreadRestrictionsTest : public testing::Test {
- public:
-  ThreadRestrictionsTest() = default;
-  ~ThreadRestrictionsTest() override {
-    internal::ResetThreadRestrictionsForTesting();
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ThreadRestrictionsTest);
-};
-
-}  // namespace
-
-TEST_F(ThreadRestrictionsTest, BlockingAllowedByDefault) {
-  AssertBlockingAllowed();
-}
-
-TEST_F(ThreadRestrictionsTest, ScopedDisallowBlocking) {
-  {
-    ScopedDisallowBlocking scoped_disallow_blocking;
-    EXPECT_DCHECK_DEATH({ AssertBlockingAllowed(); });
-  }
-  AssertBlockingAllowed();
-}
-
-TEST_F(ThreadRestrictionsTest, ScopedAllowBlocking) {
-  ScopedDisallowBlocking scoped_disallow_blocking;
-  {
-    ScopedAllowBlocking scoped_allow_blocking;
-    AssertBlockingAllowed();
-  }
-  EXPECT_DCHECK_DEATH({ AssertBlockingAllowed(); });
-}
-
-TEST_F(ThreadRestrictionsTest, ScopedAllowBlockingForTesting) {
-  ScopedDisallowBlocking scoped_disallow_blocking;
-  {
-    ScopedAllowBlockingForTesting scoped_allow_blocking_for_testing;
-    AssertBlockingAllowed();
-  }
-  EXPECT_DCHECK_DEATH({ AssertBlockingAllowed(); });
-}
-
-TEST_F(ThreadRestrictionsTest, BaseSyncPrimitivesAllowedByDefault) {}
-
-TEST_F(ThreadRestrictionsTest, DisallowBaseSyncPrimitives) {
-  DisallowBaseSyncPrimitives();
-  EXPECT_DCHECK_DEATH({ internal::AssertBaseSyncPrimitivesAllowed(); });
-}
-
-TEST_F(ThreadRestrictionsTest, ScopedAllowBaseSyncPrimitives) {
-  DisallowBaseSyncPrimitives();
-  ScopedAllowBaseSyncPrimitives scoped_allow_base_sync_primitives;
-  internal::AssertBaseSyncPrimitivesAllowed();
-}
-
-TEST_F(ThreadRestrictionsTest, ScopedAllowBaseSyncPrimitivesResetsState) {
-  DisallowBaseSyncPrimitives();
-  { ScopedAllowBaseSyncPrimitives scoped_allow_base_sync_primitives; }
-  EXPECT_DCHECK_DEATH({ internal::AssertBaseSyncPrimitivesAllowed(); });
-}
-
-TEST_F(ThreadRestrictionsTest,
-       ScopedAllowBaseSyncPrimitivesWithBlockingDisallowed) {
-  ScopedDisallowBlocking scoped_disallow_blocking;
-  DisallowBaseSyncPrimitives();
-
-  // This should DCHECK because blocking is not allowed in this scope
-  // and OutsideBlockingScope is not passed to the constructor.
-  EXPECT_DCHECK_DEATH(
-      { ScopedAllowBaseSyncPrimitives scoped_allow_base_sync_primitives; });
-}
-
-TEST_F(ThreadRestrictionsTest,
-       ScopedAllowBaseSyncPrimitivesOutsideBlockingScope) {
-  ScopedDisallowBlocking scoped_disallow_blocking;
-  DisallowBaseSyncPrimitives();
-  ScopedAllowBaseSyncPrimitivesOutsideBlockingScope
-      scoped_allow_base_sync_primitives;
-  internal::AssertBaseSyncPrimitivesAllowed();
-}
-
-TEST_F(ThreadRestrictionsTest,
-       ScopedAllowBaseSyncPrimitivesOutsideBlockingScopeResetsState) {
-  DisallowBaseSyncPrimitives();
-  {
-    ScopedAllowBaseSyncPrimitivesOutsideBlockingScope
-        scoped_allow_base_sync_primitives;
-  }
-  EXPECT_DCHECK_DEATH({ internal::AssertBaseSyncPrimitivesAllowed(); });
-}
-
-TEST_F(ThreadRestrictionsTest, ScopedAllowBaseSyncPrimitivesForTesting) {
-  DisallowBaseSyncPrimitives();
-  ScopedAllowBaseSyncPrimitivesForTesting
-      scoped_allow_base_sync_primitives_for_testing;
-  internal::AssertBaseSyncPrimitivesAllowed();
-}
-
-TEST_F(ThreadRestrictionsTest,
-       ScopedAllowBaseSyncPrimitivesForTestingResetsState) {
-  DisallowBaseSyncPrimitives();
-  {
-    ScopedAllowBaseSyncPrimitivesForTesting
-        scoped_allow_base_sync_primitives_for_testing;
-  }
-  EXPECT_DCHECK_DEATH({ internal::AssertBaseSyncPrimitivesAllowed(); });
-}
-
-TEST_F(ThreadRestrictionsTest,
-       ScopedAllowBaseSyncPrimitivesForTestingWithBlockingDisallowed) {
-  ScopedDisallowBlocking scoped_disallow_blocking;
-  DisallowBaseSyncPrimitives();
-  // This should not DCHECK.
-  ScopedAllowBaseSyncPrimitivesForTesting
-      scoped_allow_base_sync_primitives_for_testing;
-}
-
-}  // namespace base
diff --git a/base/threading/thread_task_runner_handle_unittest.cc b/base/threading/thread_task_runner_handle_unittest.cc
deleted file mode 100644
index 1aa02d1..0000000
--- a/base/threading/thread_task_runner_handle_unittest.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/thread_task_runner_handle.h"
-
-#include "base/memory/ref_counted.h"
-#include "base/test/gtest_util.h"
-#include "base/test/test_simple_task_runner.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(ThreadTaskRunnerHandleTest, Basic) {
-  scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner);
-
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-  {
-    ThreadTaskRunnerHandle ttrh1(task_runner);
-    EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
-    EXPECT_EQ(task_runner, ThreadTaskRunnerHandle::Get());
-  }
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-}
-
-TEST(ThreadTaskRunnerHandleTest, DeathOnImplicitOverride) {
-  scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner);
-  scoped_refptr<SingleThreadTaskRunner> overidding_task_runner(
-      new TestSimpleTaskRunner);
-
-  ThreadTaskRunnerHandle ttrh(task_runner);
-  EXPECT_DCHECK_DEATH(
-      { ThreadTaskRunnerHandle overriding_ttrh(overidding_task_runner); });
-}
-
-TEST(ThreadTaskRunnerHandleTest, OverrideForTestingExistingTTRH) {
-  scoped_refptr<SingleThreadTaskRunner> task_runner_1(new TestSimpleTaskRunner);
-  scoped_refptr<SingleThreadTaskRunner> task_runner_2(new TestSimpleTaskRunner);
-  scoped_refptr<SingleThreadTaskRunner> task_runner_3(new TestSimpleTaskRunner);
-  scoped_refptr<SingleThreadTaskRunner> task_runner_4(new TestSimpleTaskRunner);
-
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-  {
-    // TTRH in place prior to override.
-    ThreadTaskRunnerHandle ttrh1(task_runner_1);
-    EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
-    EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
-
-    {
-      // Override.
-      ScopedClosureRunner undo_override_2 =
-          ThreadTaskRunnerHandle::OverrideForTesting(task_runner_2);
-      EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
-      EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get());
-
-      {
-        // Nested override.
-        ScopedClosureRunner undo_override_3 =
-            ThreadTaskRunnerHandle::OverrideForTesting(task_runner_3);
-        EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
-        EXPECT_EQ(task_runner_3, ThreadTaskRunnerHandle::Get());
-      }
-
-      // Back to single override.
-      EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
-      EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get());
-
-      {
-        // Backup to double override with another TTRH.
-        ScopedClosureRunner undo_override_4 =
-            ThreadTaskRunnerHandle::OverrideForTesting(task_runner_4);
-        EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
-        EXPECT_EQ(task_runner_4, ThreadTaskRunnerHandle::Get());
-      }
-    }
-
-    // Back to simple TTRH.
-    EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
-    EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
-  }
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-}
-
-TEST(ThreadTaskRunnerHandleTest, OverrideForTestingNoExistingTTRH) {
-  scoped_refptr<SingleThreadTaskRunner> task_runner_1(new TestSimpleTaskRunner);
-  scoped_refptr<SingleThreadTaskRunner> task_runner_2(new TestSimpleTaskRunner);
-
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-  {
-    // Override with no TTRH in place.
-    ScopedClosureRunner undo_override_1 =
-        ThreadTaskRunnerHandle::OverrideForTesting(task_runner_1);
-    EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
-    EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
-
-    {
-      // Nested override works the same.
-      ScopedClosureRunner undo_override_2 =
-          ThreadTaskRunnerHandle::OverrideForTesting(task_runner_2);
-      EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
-      EXPECT_EQ(task_runner_2, ThreadTaskRunnerHandle::Get());
-    }
-
-    // Back to single override.
-    EXPECT_TRUE(ThreadTaskRunnerHandle::IsSet());
-    EXPECT_EQ(task_runner_1, ThreadTaskRunnerHandle::Get());
-  }
-  EXPECT_FALSE(ThreadTaskRunnerHandle::IsSet());
-}
-
-TEST(ThreadTaskRunnerHandleTest, DeathOnTTRHOverOverride) {
-  scoped_refptr<SingleThreadTaskRunner> task_runner(new TestSimpleTaskRunner);
-  scoped_refptr<SingleThreadTaskRunner> overidding_task_runner(
-      new TestSimpleTaskRunner);
-
-  ScopedClosureRunner undo_override =
-      ThreadTaskRunnerHandle::OverrideForTesting(task_runner);
-  EXPECT_DCHECK_DEATH(
-      { ThreadTaskRunnerHandle overriding_ttrh(overidding_task_runner); });
-}
-
-}  // namespace base
diff --git a/base/threading/thread_unittest.cc b/base/threading/thread_unittest.cc
deleted file mode 100644
index a1a9ed3..0000000
--- a/base/threading/thread_unittest.cc
+++ /dev/null
@@ -1,579 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/thread.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/debug/leak_annotations.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/message_loop/message_loop_current.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/gtest_util.h"
-#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/platform_test.h"
-
-using base::Thread;
-
-typedef PlatformTest ThreadTest;
-
-namespace {
-
-void ToggleValue(bool* value) {
-  ANNOTATE_BENIGN_RACE(value, "Test-only data race on boolean "
-                       "in base/thread_unittest");
-  *value = !*value;
-}
-
-class SleepInsideInitThread : public Thread {
- public:
-  SleepInsideInitThread() : Thread("none") {
-    init_called_ = false;
-    ANNOTATE_BENIGN_RACE(
-        this, "Benign test-only data race on vptr - http://crbug.com/98219");
-  }
-  ~SleepInsideInitThread() override { Stop(); }
-
-  void Init() override {
-    base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(500));
-    init_called_ = true;
-  }
-  bool InitCalled() { return init_called_; }
-
- private:
-  bool init_called_;
-
-  DISALLOW_COPY_AND_ASSIGN(SleepInsideInitThread);
-};
-
-enum ThreadEvent {
-  // Thread::Init() was called.
-  THREAD_EVENT_INIT = 0,
-
-  // The MessageLoop for the thread was deleted.
-  THREAD_EVENT_MESSAGE_LOOP_DESTROYED,
-
-  // Thread::CleanUp() was called.
-  THREAD_EVENT_CLEANUP,
-
-  // Keep at end of list.
-  THREAD_NUM_EVENTS
-};
-
-typedef std::vector<ThreadEvent> EventList;
-
-class CaptureToEventList : public Thread {
- public:
-  // This Thread pushes events into the vector |event_list| to show
-  // the order they occured in. |event_list| must remain valid for the
-  // lifetime of this thread.
-  explicit CaptureToEventList(EventList* event_list)
-      : Thread("none"),
-        event_list_(event_list) {
-  }
-
-  ~CaptureToEventList() override { Stop(); }
-
-  void Init() override { event_list_->push_back(THREAD_EVENT_INIT); }
-
-  void CleanUp() override { event_list_->push_back(THREAD_EVENT_CLEANUP); }
-
- private:
-  EventList* event_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(CaptureToEventList);
-};
-
-// Observer that writes a value into |event_list| when a message loop has been
-// destroyed.
-class CapturingDestructionObserver
-    : public base::MessageLoopCurrent::DestructionObserver {
- public:
-  // |event_list| must remain valid throughout the observer's lifetime.
-  explicit CapturingDestructionObserver(EventList* event_list)
-      : event_list_(event_list) {
-  }
-
-  // DestructionObserver implementation:
-  void WillDestroyCurrentMessageLoop() override {
-    event_list_->push_back(THREAD_EVENT_MESSAGE_LOOP_DESTROYED);
-    event_list_ = nullptr;
-  }
-
- private:
-  EventList* event_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(CapturingDestructionObserver);
-};
-
-// Task that adds a destruction observer to the current message loop.
-void RegisterDestructionObserver(
-    base::MessageLoopCurrent::DestructionObserver* observer) {
-  base::MessageLoopCurrent::Get()->AddDestructionObserver(observer);
-}
-
-// Task that calls GetThreadId() of |thread|, stores the result into |id|, then
-// signal |event|.
-void ReturnThreadId(base::Thread* thread,
-                    base::PlatformThreadId* id,
-                    base::WaitableEvent* event) {
-  *id = thread->GetThreadId();
-  event->Signal();
-}
-
-}  // namespace
-
-TEST_F(ThreadTest, StartWithOptions_StackSize) {
-  Thread a("StartWithStackSize");
-  // Ensure that the thread can work with only 12 kb and still process a
-  // message. At the same time, we should scale with the bitness of the system
-  // where 12 kb is definitely not enough.
-  // 12 kb = 3072 Slots on a 32-bit system, so we'll scale based off of that.
-  Thread::Options options;
-#if defined(ADDRESS_SANITIZER) || !defined(NDEBUG)
-  // ASan bloats the stack variables and overflows the 3072 slot stack. Some
-  // debug builds also grow the stack too much.
-  options.stack_size = 2 * 3072 * sizeof(uintptr_t);
-#else
-  options.stack_size = 3072 * sizeof(uintptr_t);
-#endif
-  EXPECT_TRUE(a.StartWithOptions(options));
-  EXPECT_TRUE(a.message_loop());
-  EXPECT_TRUE(a.IsRunning());
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  a.task_runner()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&base::WaitableEvent::Signal, base::Unretained(&event)));
-  event.Wait();
-}
-
-// Intentional test-only race for otherwise untestable code, won't fix.
-// https://crbug.com/634383
-#if !defined(THREAD_SANITIZER)
-TEST_F(ThreadTest, StartWithOptions_NonJoinable) {
-  Thread* a = new Thread("StartNonJoinable");
-  // Non-joinable threads have to be leaked for now (see
-  // Thread::Options::joinable for details).
-  ANNOTATE_LEAKING_OBJECT_PTR(a);
-
-  Thread::Options options;
-  options.joinable = false;
-  EXPECT_TRUE(a->StartWithOptions(options));
-  EXPECT_TRUE(a->message_loop());
-  EXPECT_TRUE(a->IsRunning());
-
-  // Without this call this test is racy. The above IsRunning() succeeds because
-  // of an early-return condition while between Start() and StopSoon(), after
-  // invoking StopSoon() below this early-return condition is no longer
-  // satisfied and the real |is_running_| bit has to be checked. It could still
-  // be false if the message loop hasn't started for real in practice. This is
-  // only a requirement for this test because the non-joinable property forces
-  // it to use StopSoon() and not wait for a complete Stop().
-  EXPECT_TRUE(a->WaitUntilThreadStarted());
-
-  // Make the thread block until |block_event| is signaled.
-  base::WaitableEvent block_event(
-      base::WaitableEvent::ResetPolicy::AUTOMATIC,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  a->task_runner()->PostTask(FROM_HERE,
-                             base::BindOnce(&base::WaitableEvent::Wait,
-                                            base::Unretained(&block_event)));
-
-  a->StopSoon();
-  EXPECT_TRUE(a->IsRunning());
-
-  // Unblock the task and give a bit of extra time to unwind QuitWhenIdle().
-  block_event.Signal();
-  base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(20));
-
-  // The thread should now have stopped on its own.
-  EXPECT_FALSE(a->IsRunning());
-}
-#endif
-
-TEST_F(ThreadTest, TwoTasksOnJoinableThread) {
-  bool was_invoked = false;
-  {
-    Thread a("TwoTasksOnJoinableThread");
-    EXPECT_TRUE(a.Start());
-    EXPECT_TRUE(a.message_loop());
-
-    // Test that all events are dispatched before the Thread object is
-    // destroyed.  We do this by dispatching a sleep event before the
-    // event that will toggle our sentinel value.
-    a.task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(static_cast<void (*)(base::TimeDelta)>(
-                                      &base::PlatformThread::Sleep),
-                                  base::TimeDelta::FromMilliseconds(20)));
-    a.task_runner()->PostTask(FROM_HERE,
-                              base::BindOnce(&ToggleValue, &was_invoked));
-  }
-  EXPECT_TRUE(was_invoked);
-}
-
-TEST_F(ThreadTest, DestroyWhileRunningIsSafe) {
-  Thread a("DestroyWhileRunningIsSafe");
-  EXPECT_TRUE(a.Start());
-  EXPECT_TRUE(a.WaitUntilThreadStarted());
-}
-
-// TODO(gab): Enable this test when destroying a non-joinable Thread instance
-// is supported (proposal @ https://crbug.com/629139#c14).
-TEST_F(ThreadTest, DISABLED_DestroyWhileRunningNonJoinableIsSafe) {
-  {
-    Thread a("DestroyWhileRunningNonJoinableIsSafe");
-    Thread::Options options;
-    options.joinable = false;
-    EXPECT_TRUE(a.StartWithOptions(options));
-    EXPECT_TRUE(a.WaitUntilThreadStarted());
-  }
-
-  // Attempt to catch use-after-frees from the non-joinable thread in the
-  // scope of this test if any.
-  base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(20));
-}
-
-TEST_F(ThreadTest, StopSoon) {
-  Thread a("StopSoon");
-  EXPECT_TRUE(a.Start());
-  EXPECT_TRUE(a.message_loop());
-  EXPECT_TRUE(a.IsRunning());
-  a.StopSoon();
-  a.Stop();
-  EXPECT_FALSE(a.message_loop());
-  EXPECT_FALSE(a.IsRunning());
-}
-
-TEST_F(ThreadTest, StopTwiceNop) {
-  Thread a("StopTwiceNop");
-  EXPECT_TRUE(a.Start());
-  EXPECT_TRUE(a.message_loop());
-  EXPECT_TRUE(a.IsRunning());
-  a.StopSoon();
-  // Calling StopSoon() a second time should be a nop.
-  a.StopSoon();
-  a.Stop();
-  // Same with Stop().
-  a.Stop();
-  EXPECT_FALSE(a.message_loop());
-  EXPECT_FALSE(a.IsRunning());
-  // Calling them when not running should also nop.
-  a.StopSoon();
-  a.Stop();
-}
-
-// TODO(gab): Enable this test in conjunction with re-enabling the sequence
-// check in Thread::Stop() as part of http://crbug.com/629139.
-TEST_F(ThreadTest, DISABLED_StopOnNonOwningThreadIsDeath) {
-  Thread a("StopOnNonOwningThreadDeath");
-  EXPECT_TRUE(a.StartAndWaitForTesting());
-
-  Thread b("NonOwningThread");
-  b.Start();
-  EXPECT_DCHECK_DEATH({
-    // Stopping |a| on |b| isn't allowed.
-    b.task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(&Thread::Stop, base::Unretained(&a)));
-    // Block here so the DCHECK on |b| always happens in this scope.
-    base::PlatformThread::Sleep(base::TimeDelta::Max());
-  });
-}
-
-TEST_F(ThreadTest, TransferOwnershipAndStop) {
-  std::unique_ptr<Thread> a =
-      std::make_unique<Thread>("TransferOwnershipAndStop");
-  EXPECT_TRUE(a->StartAndWaitForTesting());
-  EXPECT_TRUE(a->IsRunning());
-
-  Thread b("TakingOwnershipThread");
-  b.Start();
-
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-
-  // a->DetachFromSequence() should allow |b| to use |a|'s Thread API.
-  a->DetachFromSequence();
-  b.task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(
-                     [](std::unique_ptr<Thread> thread_to_stop,
-                        base::WaitableEvent* event_to_signal) -> void {
-                       thread_to_stop->Stop();
-                       event_to_signal->Signal();
-                     },
-                     std::move(a), base::Unretained(&event)));
-
-  event.Wait();
-}
-
-TEST_F(ThreadTest, StartTwice) {
-  Thread a("StartTwice");
-
-  EXPECT_FALSE(a.message_loop());
-  EXPECT_FALSE(a.IsRunning());
-
-  EXPECT_TRUE(a.Start());
-  EXPECT_TRUE(a.message_loop());
-  EXPECT_TRUE(a.IsRunning());
-
-  a.Stop();
-  EXPECT_FALSE(a.message_loop());
-  EXPECT_FALSE(a.IsRunning());
-
-  EXPECT_TRUE(a.Start());
-  EXPECT_TRUE(a.message_loop());
-  EXPECT_TRUE(a.IsRunning());
-
-  a.Stop();
-  EXPECT_FALSE(a.message_loop());
-  EXPECT_FALSE(a.IsRunning());
-}
-
-// Intentional test-only race for otherwise untestable code, won't fix.
-// https://crbug.com/634383
-#if !defined(THREAD_SANITIZER)
-TEST_F(ThreadTest, StartTwiceNonJoinableNotAllowed) {
-  LOG(ERROR) << __FUNCTION__;
-  Thread* a = new Thread("StartTwiceNonJoinable");
-  // Non-joinable threads have to be leaked for now (see
-  // Thread::Options::joinable for details).
-  ANNOTATE_LEAKING_OBJECT_PTR(a);
-
-  Thread::Options options;
-  options.joinable = false;
-  EXPECT_TRUE(a->StartWithOptions(options));
-  EXPECT_TRUE(a->message_loop());
-  EXPECT_TRUE(a->IsRunning());
-
-  // Signaled when last task on |a| is processed.
-  base::WaitableEvent last_task_event(
-      base::WaitableEvent::ResetPolicy::AUTOMATIC,
-      base::WaitableEvent::InitialState::NOT_SIGNALED);
-  a->task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&base::WaitableEvent::Signal,
-                                base::Unretained(&last_task_event)));
-
-  // StopSoon() is non-blocking, Yield() to |a|, wait for last task to be
-  // processed and a little more for QuitWhenIdle() to unwind before considering
-  // the thread "stopped".
-  a->StopSoon();
-  base::PlatformThread::YieldCurrentThread();
-  last_task_event.Wait();
-  base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(20));
-
-  // This test assumes that the above was sufficient to let the thread fully
-  // stop.
-  ASSERT_FALSE(a->IsRunning());
-
-  // Restarting it should not be allowed.
-  EXPECT_DCHECK_DEATH(a->Start());
-}
-#endif
-
-TEST_F(ThreadTest, ThreadName) {
-  Thread a("ThreadName");
-  EXPECT_TRUE(a.Start());
-  EXPECT_EQ("ThreadName", a.thread_name());
-}
-
-TEST_F(ThreadTest, ThreadId) {
-  Thread a("ThreadId0");
-  Thread b("ThreadId1");
-  a.Start();
-  b.Start();
-
-  // Post a task that calls GetThreadId() on the created thread.
-  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-                            base::WaitableEvent::InitialState::NOT_SIGNALED);
-  base::PlatformThreadId id_from_new_thread;
-  a.task_runner()->PostTask(
-      FROM_HERE,
-      base::BindOnce(ReturnThreadId, &a, &id_from_new_thread, &event));
-
-  // Call GetThreadId() on the current thread before calling event.Wait() so
-  // that this test can find a race issue with TSAN.
-  base::PlatformThreadId id_from_current_thread = a.GetThreadId();
-
-  // Check if GetThreadId() returns consistent value in both threads.
-  event.Wait();
-  EXPECT_EQ(id_from_current_thread, id_from_new_thread);
-
-  // A started thread should have a valid ID.
-  EXPECT_NE(base::kInvalidThreadId, a.GetThreadId());
-  EXPECT_NE(base::kInvalidThreadId, b.GetThreadId());
-
-  // Each thread should have a different thread ID.
-  EXPECT_NE(a.GetThreadId(), b.GetThreadId());
-}
-
-TEST_F(ThreadTest, ThreadIdWithRestart) {
-  Thread a("ThreadIdWithRestart");
-  base::PlatformThreadId previous_id = base::kInvalidThreadId;
-
-  for (size_t i = 0; i < 16; ++i) {
-    EXPECT_TRUE(a.Start());
-    base::PlatformThreadId current_id = a.GetThreadId();
-    EXPECT_NE(previous_id, current_id);
-    previous_id = current_id;
-    a.Stop();
-  }
-}
-
-// Make sure Init() is called after Start() and before
-// WaitUntilThreadInitialized() returns.
-TEST_F(ThreadTest, SleepInsideInit) {
-  SleepInsideInitThread t;
-  EXPECT_FALSE(t.InitCalled());
-  t.StartAndWaitForTesting();
-  EXPECT_TRUE(t.InitCalled());
-}
-
-// Make sure that the destruction sequence is:
-//
-//  (1) Thread::CleanUp()
-//  (2) MessageLoop::~MessageLoop()
-//      MessageLoopCurrent::DestructionObservers called.
-TEST_F(ThreadTest, CleanUp) {
-  EventList captured_events;
-  CapturingDestructionObserver loop_destruction_observer(&captured_events);
-
-  {
-    // Start a thread which writes its event into |captured_events|.
-    CaptureToEventList t(&captured_events);
-    EXPECT_TRUE(t.Start());
-    EXPECT_TRUE(t.message_loop());
-    EXPECT_TRUE(t.IsRunning());
-
-    // Register an observer that writes into |captured_events| once the
-    // thread's message loop is destroyed.
-    t.task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&RegisterDestructionObserver,
-                       base::Unretained(&loop_destruction_observer)));
-
-    // Upon leaving this scope, the thread is deleted.
-  }
-
-  // Check the order of events during shutdown.
-  ASSERT_EQ(static_cast<size_t>(THREAD_NUM_EVENTS), captured_events.size());
-  EXPECT_EQ(THREAD_EVENT_INIT, captured_events[0]);
-  EXPECT_EQ(THREAD_EVENT_CLEANUP, captured_events[1]);
-  EXPECT_EQ(THREAD_EVENT_MESSAGE_LOOP_DESTROYED, captured_events[2]);
-}
-
-TEST_F(ThreadTest, ThreadNotStarted) {
-  Thread a("Inert");
-  EXPECT_FALSE(a.task_runner());
-}
-
-TEST_F(ThreadTest, MultipleWaitUntilThreadStarted) {
-  Thread a("MultipleWaitUntilThreadStarted");
-  EXPECT_TRUE(a.Start());
-  // It's OK to call WaitUntilThreadStarted() multiple times.
-  EXPECT_TRUE(a.WaitUntilThreadStarted());
-  EXPECT_TRUE(a.WaitUntilThreadStarted());
-}
-
-TEST_F(ThreadTest, FlushForTesting) {
-  Thread a("FlushForTesting");
-
-  // Flushing a non-running thread should be a no-op.
-  a.FlushForTesting();
-
-  ASSERT_TRUE(a.Start());
-
-  // Flushing a thread with no tasks shouldn't block.
-  a.FlushForTesting();
-
-  constexpr base::TimeDelta kSleepPerTestTask =
-      base::TimeDelta::FromMilliseconds(50);
-  constexpr size_t kNumSleepTasks = 5;
-
-  const base::TimeTicks ticks_before_post = base::TimeTicks::Now();
-
-  for (size_t i = 0; i < kNumSleepTasks; ++i) {
-    a.task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&base::PlatformThread::Sleep, kSleepPerTestTask));
-  }
-
-  // All tasks should have executed, as reflected by the elapsed time.
-  a.FlushForTesting();
-  EXPECT_GE(base::TimeTicks::Now() - ticks_before_post,
-            kNumSleepTasks * kSleepPerTestTask);
-
-  a.Stop();
-
-  // Flushing a stopped thread should be a no-op.
-  a.FlushForTesting();
-}
-
-namespace {
-
-// A Thread which uses a MessageLoop on the stack. It won't start a real
-// underlying thread (instead its messages can be processed by a RunLoop on the
-// stack).
-class ExternalMessageLoopThread : public Thread {
- public:
-  ExternalMessageLoopThread() : Thread("ExternalMessageLoopThread") {}
-
-  ~ExternalMessageLoopThread() override { Stop(); }
-
-  void InstallMessageLoop() { SetMessageLoop(&external_message_loop_); }
-
-  void VerifyUsingExternalMessageLoop(
-      bool expected_using_external_message_loop) {
-    EXPECT_EQ(expected_using_external_message_loop,
-              using_external_message_loop());
-  }
-
- private:
-  base::MessageLoop external_message_loop_;
-
-  DISALLOW_COPY_AND_ASSIGN(ExternalMessageLoopThread);
-};
-
-}  // namespace
-
-TEST_F(ThreadTest, ExternalMessageLoop) {
-  ExternalMessageLoopThread a;
-  EXPECT_FALSE(a.message_loop());
-  EXPECT_FALSE(a.IsRunning());
-  a.VerifyUsingExternalMessageLoop(false);
-
-  a.InstallMessageLoop();
-  EXPECT_TRUE(a.message_loop());
-  EXPECT_TRUE(a.IsRunning());
-  a.VerifyUsingExternalMessageLoop(true);
-
-  bool ran = false;
-  a.task_runner()->PostTask(
-      FROM_HERE, base::BindOnce([](bool* toggled) { *toggled = true; }, &ran));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_TRUE(ran);
-
-  a.Stop();
-  EXPECT_FALSE(a.message_loop());
-  EXPECT_FALSE(a.IsRunning());
-  a.VerifyUsingExternalMessageLoop(true);
-
-  // Confirm that running any remaining tasks posted from Stop() goes smoothly
-  // (e.g. https://codereview.chromium.org/2135413003/#ps300001 crashed if
-  // StopSoon() posted Thread::ThreadQuitHelper() while |run_loop_| was null).
-  base::RunLoop().RunUntilIdle();
-}
diff --git a/base/threading/watchdog_unittest.cc b/base/threading/watchdog_unittest.cc
deleted file mode 100644
index f534a86..0000000
--- a/base/threading/watchdog_unittest.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/watchdog.h"
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/synchronization/spin_wait.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-//------------------------------------------------------------------------------
-// Provide a derived class to facilitate testing.
-
-class WatchdogCounter : public Watchdog {
- public:
-  WatchdogCounter(const TimeDelta& duration,
-                  const std::string& thread_watched_name,
-                  bool enabled)
-      : Watchdog(duration, thread_watched_name, enabled),
-        alarm_counter_(0) {
-  }
-
-  ~WatchdogCounter() override = default;
-
-  void Alarm() override {
-    alarm_counter_++;
-    Watchdog::Alarm();
-  }
-
-  int alarm_counter() { return alarm_counter_; }
-
- private:
-  int alarm_counter_;
-
-  DISALLOW_COPY_AND_ASSIGN(WatchdogCounter);
-};
-
-class WatchdogTest : public testing::Test {
- public:
-  void SetUp() override { Watchdog::ResetStaticData(); }
-};
-
-}  // namespace
-
-//------------------------------------------------------------------------------
-// Actual tests
-
-// Minimal constructor/destructor test.
-TEST_F(WatchdogTest, StartupShutdownTest) {
-  Watchdog watchdog1(TimeDelta::FromMilliseconds(300), "Disabled", false);
-  Watchdog watchdog2(TimeDelta::FromMilliseconds(300), "Enabled", true);
-}
-
-// Test ability to call Arm and Disarm repeatedly.
-TEST_F(WatchdogTest, ArmDisarmTest) {
-  Watchdog watchdog1(TimeDelta::FromMilliseconds(300), "Disabled", false);
-  watchdog1.Arm();
-  watchdog1.Disarm();
-  watchdog1.Arm();
-  watchdog1.Disarm();
-
-  Watchdog watchdog2(TimeDelta::FromMilliseconds(300), "Enabled", true);
-  watchdog2.Arm();
-  watchdog2.Disarm();
-  watchdog2.Arm();
-  watchdog2.Disarm();
-}
-
-// Make sure a basic alarm fires when the time has expired.
-TEST_F(WatchdogTest, AlarmTest) {
-  WatchdogCounter watchdog(TimeDelta::FromMilliseconds(10), "Enabled", true);
-  watchdog.Arm();
-  SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromMinutes(5),
-                                   watchdog.alarm_counter() > 0);
-  EXPECT_EQ(1, watchdog.alarm_counter());
-}
-
-// Make sure a basic alarm fires when the time has expired.
-TEST_F(WatchdogTest, AlarmPriorTimeTest) {
-  WatchdogCounter watchdog(TimeDelta(), "Enabled2", true);
-  // Set a time in the past.
-  watchdog.ArmSomeTimeDeltaAgo(TimeDelta::FromSeconds(2));
-  // It should instantly go off, but certainly in less than 5 minutes.
-  SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromMinutes(5),
-                                   watchdog.alarm_counter() > 0);
-
-  EXPECT_EQ(1, watchdog.alarm_counter());
-}
-
-// Make sure a disable alarm does nothing, even if we arm it.
-TEST_F(WatchdogTest, ConstructorDisabledTest) {
-  WatchdogCounter watchdog(TimeDelta::FromMilliseconds(10), "Disabled", false);
-  watchdog.Arm();
-  // Alarm should not fire, as it was disabled.
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(500));
-  EXPECT_EQ(0, watchdog.alarm_counter());
-}
-
-// Make sure Disarming will prevent firing, even after Arming.
-TEST_F(WatchdogTest, DisarmTest) {
-  WatchdogCounter watchdog(TimeDelta::FromSeconds(1), "Enabled3", true);
-
-  TimeTicks start = TimeTicks::Now();
-  watchdog.Arm();
-  // Sleep a bit, but not past the alarm point.
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(100));
-  watchdog.Disarm();
-  TimeTicks end = TimeTicks::Now();
-
-  if (end - start > TimeDelta::FromMilliseconds(500)) {
-    LOG(WARNING) << "100ms sleep took over 500ms, making the results of this "
-                 << "timing-sensitive test suspicious.  Aborting now.";
-    return;
-  }
-
-  // Alarm should not have fired before it was disarmed.
-  EXPECT_EQ(0, watchdog.alarm_counter());
-
-  // Sleep past the point where it would have fired if it wasn't disarmed,
-  // and verify that it didn't fire.
-  PlatformThread::Sleep(TimeDelta::FromSeconds(1));
-  EXPECT_EQ(0, watchdog.alarm_counter());
-
-  // ...but even after disarming, we can still use the alarm...
-  // Set a time greater than the timeout into the past.
-  watchdog.ArmSomeTimeDeltaAgo(TimeDelta::FromSeconds(10));
-  // It should almost instantly go off, but certainly in less than 5 minutes.
-  SPIN_FOR_TIMEDELTA_OR_UNTIL_TRUE(TimeDelta::FromMinutes(5),
-                                   watchdog.alarm_counter() > 0);
-
-  EXPECT_EQ(1, watchdog.alarm_counter());
-}
-
-}  // namespace base
diff --git a/base/time/pr_time_unittest.cc b/base/time/pr_time_unittest.cc
deleted file mode 100644
index 341d778..0000000
--- a/base/time/pr_time_unittest.cc
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-#include <time.h>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/third_party/nspr/prtime.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using base::Time;
-
-namespace {
-
-// time_t representation of 15th Oct 2007 12:45:00 PDT
-PRTime comparison_time_pdt = 1192477500 * Time::kMicrosecondsPerSecond;
-
-// Time with positive tz offset and fractional seconds:
-// 2013-07-08T11:28:12.441381+02:00
-PRTime comparison_time_2 = INT64_C(1373275692441381);   // represented as GMT
-
-// Specialized test fixture allowing time strings without timezones to be
-// tested by comparing them to a known time in the local zone.
-class PRTimeTest : public testing::Test {
- protected:
-  void SetUp() override {
-    // Use mktime to get a time_t, and turn it into a PRTime by converting
-    // seconds to microseconds.  Use 15th Oct 2007 12:45:00 local.  This
-    // must be a time guaranteed to be outside of a DST fallback hour in
-    // any timezone.
-    struct tm local_comparison_tm = {
-      0,            // second
-      45,           // minute
-      12,           // hour
-      15,           // day of month
-      10 - 1,       // month
-      2007 - 1900,  // year
-      0,            // day of week (ignored, output only)
-      0,            // day of year (ignored, output only)
-      -1            // DST in effect, -1 tells mktime to figure it out
-    };
-    comparison_time_local_ =
-        mktime(&local_comparison_tm) * Time::kMicrosecondsPerSecond;
-    ASSERT_GT(comparison_time_local_, 0);
-
-    const int microseconds = 441381;
-    struct tm local_comparison_tm_2 = {
-      12,           // second
-      28,           // minute
-      11,           // hour
-      8,            // day of month
-      7 - 1,        // month
-      2013 - 1900,  // year
-      0,            // day of week (ignored, output only)
-      0,            // day of year (ignored, output only)
-      -1            // DST in effect, -1 tells mktime to figure it out
-    };
-    comparison_time_local_2_ =
-        mktime(&local_comparison_tm_2) * Time::kMicrosecondsPerSecond;
-    ASSERT_GT(comparison_time_local_2_, 0);
-    comparison_time_local_2_ += microseconds;
-  }
-
-  PRTime comparison_time_local_;
-  PRTime comparison_time_local_2_;
-};
-
-// Tests the PR_ParseTimeString nspr helper function for
-// a variety of time strings.
-TEST_F(PRTimeTest, ParseTimeTest1) {
-  time_t current_time = 0;
-  time(&current_time);
-
-  struct tm local_time = {};
-  char time_buf[64] = {};
-#if defined(OS_WIN)
-  localtime_s(&local_time, &current_time);
-  asctime_s(time_buf, arraysize(time_buf), &local_time);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  localtime_r(&current_time, &local_time);
-  asctime_r(&local_time, time_buf);
-#endif
-
-  PRTime current_time64 = static_cast<PRTime>(current_time) * PR_USEC_PER_SEC;
-
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString(time_buf, PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(current_time64, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTest2) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("Mon, 15 Oct 2007 19:45:00 GMT",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_pdt, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTest3) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("15 Oct 07 12:45:00", PR_FALSE,
-                                       &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_local_, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTest4) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("15 Oct 07 19:45 GMT", PR_FALSE,
-                                       &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_pdt, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTest5) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("Mon Oct 15 12:45 PDT 2007",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_pdt, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTest6) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("Monday, Oct 15, 2007 12:45 PM",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_local_, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTest7) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("10/15/07 12:45:00 PM", PR_FALSE,
-                                       &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_local_, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTest8) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("10/15/07 12:45:00. PM", PR_FALSE,
-                                       &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_local_, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTest9) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("10/15/07 12:45:00.0 PM", PR_FALSE,
-                                       &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_local_, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTest10) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("15-OCT-2007 12:45pm", PR_FALSE,
-                                       &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_local_, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTest11) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("16 Oct 2007 4:45-JST (Tuesday)",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_pdt, parsed_time);
-}
-
-// hh:mm timezone offset.
-TEST_F(PRTimeTest, ParseTimeTest12) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.441381+02:00",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_2, parsed_time);
-}
-
-// hhmm timezone offset.
-TEST_F(PRTimeTest, ParseTimeTest13) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.441381+0200",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_2, parsed_time);
-}
-
-// hh timezone offset.
-TEST_F(PRTimeTest, ParseTimeTest14) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.4413819+02",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_2, parsed_time);
-}
-
-// 5 digits fractional second.
-TEST_F(PRTimeTest, ParseTimeTest15) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("2013-07-08T09:28:12.44138Z",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_2-1, parsed_time);
-}
-
-// Fractional seconds, local timezone.
-TEST_F(PRTimeTest, ParseTimeTest16) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("2013-07-08T11:28:12.441381",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_local_2_, parsed_time);
-}
-
-// "Z" (=GMT) timezone.
-TEST_F(PRTimeTest, ParseTimeTest17) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("2013-07-08T09:28:12.441381Z",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_2, parsed_time);
-}
-
-// "T" delimiter replaced by space.
-TEST_F(PRTimeTest, ParseTimeTest18) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("2013-07-08 09:28:12.441381Z",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_2, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTestInvalid1) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("201-07-08T09:28:12.441381Z",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_FAILURE, result);
-}
-
-TEST_F(PRTimeTest, ParseTimeTestInvalid2) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("2013-007-08T09:28:12.441381Z",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_FAILURE, result);
-}
-
-TEST_F(PRTimeTest, ParseTimeTestInvalid3) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("2013-07-008T09:28:12.441381Z",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_FAILURE, result);
-}
-
-// This test should not crash when compiled with Visual C++ 2005 (see
-// http://crbug.com/4387).
-TEST_F(PRTimeTest, ParseTimeTestOutOfRange) {
-  PRTime parsed_time = 0;
-  // Note the lack of timezone in the time string.  The year has to be 3001.
-  // The date has to be after 23:59:59, December 31, 3000, US Pacific Time, so
-  // we use January 2, 3001 to make sure it's after the magic maximum in any
-  // timezone.
-  PRStatus result = PR_ParseTimeString("Sun Jan  2 00:00:00 3001",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-}
-
-TEST_F(PRTimeTest, ParseTimeTestNotNormalized1) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("Mon Oct 15 12:44:60 PDT 2007",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_pdt, parsed_time);
-}
-
-TEST_F(PRTimeTest, ParseTimeTestNotNormalized2) {
-  PRTime parsed_time = 0;
-  PRStatus result = PR_ParseTimeString("Sun Oct 14 36:45 PDT 2007",
-                                       PR_FALSE, &parsed_time);
-  EXPECT_EQ(PR_SUCCESS, result);
-  EXPECT_EQ(comparison_time_pdt, parsed_time);
-}
-
-}  // namespace
diff --git a/base/time/time_unittest.cc b/base/time/time_unittest.cc
deleted file mode 100644
index 0471dd4..0000000
--- a/base/time/time_unittest.cc
+++ /dev/null
@@ -1,1588 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/time/time.h"
-
-#include <stdint.h>
-#include <time.h>
-#include <limits>
-#include <string>
-
-#include "base/build_time.h"
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/strings/stringprintf.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time_override.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_ANDROID)
-#include "base/android/jni_android.h"
-#elif defined(OS_IOS)
-#include "base/ios/ios_util.h"
-#elif defined(OS_WIN)
-#include <windows.h>
-#endif
-
-namespace base {
-
-namespace {
-
-TEST(TimeTestOutOfBounds, FromExplodedOutOfBoundsTime) {
-  // FromUTCExploded must set time to Time(0) and failure, if the day is set to
-  // 31 on a 28-30 day month. Test |exploded| returns Time(0) on 31st of
-  // February and 31st of April. New implementation handles this.
-
-  const struct DateTestData {
-    Time::Exploded explode;
-    bool is_valid;
-  } kDateTestData[] = {
-      // 31st of February
-      {{2016, 2, 0, 31, 12, 30, 0, 0}, true},
-      // 31st of April
-      {{2016, 4, 0, 31, 8, 43, 0, 0}, true},
-      // Negative month
-      {{2016, -5, 0, 2, 4, 10, 0, 0}, false},
-      // Negative date of month
-      {{2016, 6, 0, -15, 2, 50, 0, 0}, false},
-      // Negative hours
-      {{2016, 7, 0, 10, -11, 29, 0, 0}, false},
-      // Negative minutes
-      {{2016, 3, 0, 14, 10, -29, 0, 0}, false},
-      // Negative seconds
-      {{2016, 10, 0, 25, 7, 47, -30, 0}, false},
-      // Negative milliseconds
-      {{2016, 10, 0, 25, 7, 47, 20, -500}, false},
-      // Hours are too large
-      {{2016, 7, 0, 10, 26, 29, 0, 0}, false},
-      // Minutes are too large
-      {{2016, 3, 0, 14, 10, 78, 0, 0}, false},
-      // Seconds are too large
-      {{2016, 10, 0, 25, 7, 47, 234, 0}, false},
-      // Milliseconds are too large
-      {{2016, 10, 0, 25, 6, 31, 23, 1643}, false},
-      // Test overflow. Time is valid, but overflow case
-      // results in Time(0).
-      {{9840633, 1, 0, 1, 1, 1, 0, 0}, true},
-      // Underflow will fail as well.
-      {{-9840633, 1, 0, 1, 1, 1, 0, 0}, true},
-      // Test integer overflow and underflow cases for the values themselves.
-      {{std::numeric_limits<int>::min(), 1, 0, 1, 1, 1, 0, 0}, true},
-      {{std::numeric_limits<int>::max(), 1, 0, 1, 1, 1, 0, 0}, true},
-      {{2016, std::numeric_limits<int>::min(), 0, 1, 1, 1, 0, 0}, false},
-      {{2016, std::numeric_limits<int>::max(), 0, 1, 1, 1, 0, 0}, false},
-  };
-
-  for (const auto& test : kDateTestData) {
-    EXPECT_EQ(test.explode.HasValidValues(), test.is_valid);
-
-    base::Time result;
-    EXPECT_FALSE(base::Time::FromUTCExploded(test.explode, &result));
-    EXPECT_TRUE(result.is_null());
-    EXPECT_FALSE(base::Time::FromLocalExploded(test.explode, &result));
-    EXPECT_TRUE(result.is_null());
-  }
-}
-
-// Specialized test fixture allowing time strings without timezones to be
-// tested by comparing them to a known time in the local zone.
-// See also pr_time_unittests.cc
-class TimeTest : public testing::Test {
- protected:
-  void SetUp() override {
-    // Use mktime to get a time_t, and turn it into a PRTime by converting
-    // seconds to microseconds.  Use 15th Oct 2007 12:45:00 local.  This
-    // must be a time guaranteed to be outside of a DST fallback hour in
-    // any timezone.
-    struct tm local_comparison_tm = {
-      0,            // second
-      45,           // minute
-      12,           // hour
-      15,           // day of month
-      10 - 1,       // month
-      2007 - 1900,  // year
-      0,            // day of week (ignored, output only)
-      0,            // day of year (ignored, output only)
-      -1            // DST in effect, -1 tells mktime to figure it out
-    };
-
-    time_t converted_time = mktime(&local_comparison_tm);
-    ASSERT_GT(converted_time, 0);
-    comparison_time_local_ = Time::FromTimeT(converted_time);
-
-    // time_t representation of 15th Oct 2007 12:45:00 PDT
-    comparison_time_pdt_ = Time::FromTimeT(1192477500);
-  }
-
-  Time comparison_time_local_;
-  Time comparison_time_pdt_;
-};
-
-// Test conversion to/from TimeDeltas elapsed since the Windows epoch.
-// Conversions should be idempotent and non-lossy.
-TEST_F(TimeTest, DeltaSinceWindowsEpoch) {
-  const TimeDelta delta = TimeDelta::FromMicroseconds(123);
-  EXPECT_EQ(delta,
-            Time::FromDeltaSinceWindowsEpoch(delta).ToDeltaSinceWindowsEpoch());
-
-  const Time now = Time::Now();
-  const Time actual =
-      Time::FromDeltaSinceWindowsEpoch(now.ToDeltaSinceWindowsEpoch());
-  EXPECT_EQ(now, actual);
-
-  // Null times should remain null after a round-trip conversion. This is an
-  // important invariant for the common use case of serialization +
-  // deserialization.
-  const Time should_be_null =
-      Time::FromDeltaSinceWindowsEpoch(Time().ToDeltaSinceWindowsEpoch());
-  EXPECT_TRUE(should_be_null.is_null());
-}
-
-// Test conversion to/from time_t.
-TEST_F(TimeTest, TimeT) {
-  EXPECT_EQ(10, Time().FromTimeT(10).ToTimeT());
-  EXPECT_EQ(10.0, Time().FromTimeT(10).ToDoubleT());
-
-  // Conversions of 0 should stay 0.
-  EXPECT_EQ(0, Time().ToTimeT());
-  EXPECT_EQ(0, Time::FromTimeT(0).ToInternalValue());
-}
-
-// Test conversions to/from time_t and exploding/unexploding (utc time).
-TEST_F(TimeTest, UTCTimeT) {
-  // C library time and exploded time.
-  time_t now_t_1 = time(nullptr);
-  struct tm tms;
-#if defined(OS_WIN)
-  gmtime_s(&tms, &now_t_1);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  gmtime_r(&now_t_1, &tms);
-#endif
-
-  // Convert to ours.
-  Time our_time_1 = Time::FromTimeT(now_t_1);
-  Time::Exploded exploded;
-  our_time_1.UTCExplode(&exploded);
-
-  // This will test both our exploding and our time_t -> Time conversion.
-  EXPECT_EQ(tms.tm_year + 1900, exploded.year);
-  EXPECT_EQ(tms.tm_mon + 1, exploded.month);
-  EXPECT_EQ(tms.tm_mday, exploded.day_of_month);
-  EXPECT_EQ(tms.tm_hour, exploded.hour);
-  EXPECT_EQ(tms.tm_min, exploded.minute);
-  EXPECT_EQ(tms.tm_sec, exploded.second);
-
-  // Convert exploded back to the time struct.
-  Time our_time_2;
-  EXPECT_TRUE(Time::FromUTCExploded(exploded, &our_time_2));
-  EXPECT_TRUE(our_time_1 == our_time_2);
-
-  time_t now_t_2 = our_time_2.ToTimeT();
-  EXPECT_EQ(now_t_1, now_t_2);
-}
-
-// Test conversions to/from time_t and exploding/unexploding (local time).
-TEST_F(TimeTest, LocalTimeT) {
-#if defined(OS_IOS) && TARGET_OS_SIMULATOR
-  // The function CFTimeZoneCopySystem() fails to determine the system timezone
-  // when running iOS 11.0 simulator on an host running High Sierra and return
-  // the "GMT" timezone. This causes Time::LocalExplode and localtime_r values
-  // to differ by the local timezone offset. Disable the test if simulating
-  // iOS 10.0 as it is not possible to check the version of the host mac.
-  // TODO(crbug.com/782033): remove this once support for iOS pre-11.0 is
-  // dropped or when the bug in CFTimeZoneCopySystem() is fixed.
-  if (ios::IsRunningOnIOS10OrLater() && !ios::IsRunningOnIOS11OrLater()) {
-    return;
-  }
-#endif
-
-  // C library time and exploded time.
-  time_t now_t_1 = time(nullptr);
-  struct tm tms;
-#if defined(OS_WIN)
-  localtime_s(&tms, &now_t_1);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  localtime_r(&now_t_1, &tms);
-#endif
-
-  // Convert to ours.
-  Time our_time_1 = Time::FromTimeT(now_t_1);
-  Time::Exploded exploded;
-  our_time_1.LocalExplode(&exploded);
-
-  // This will test both our exploding and our time_t -> Time conversion.
-  EXPECT_EQ(tms.tm_year + 1900, exploded.year);
-  EXPECT_EQ(tms.tm_mon + 1, exploded.month);
-  EXPECT_EQ(tms.tm_mday, exploded.day_of_month);
-  EXPECT_EQ(tms.tm_hour, exploded.hour);
-  EXPECT_EQ(tms.tm_min, exploded.minute);
-  EXPECT_EQ(tms.tm_sec, exploded.second);
-
-  // Convert exploded back to the time struct.
-  Time our_time_2;
-  EXPECT_TRUE(Time::FromLocalExploded(exploded, &our_time_2));
-  EXPECT_TRUE(our_time_1 == our_time_2);
-
-  time_t now_t_2 = our_time_2.ToTimeT();
-  EXPECT_EQ(now_t_1, now_t_2);
-}
-
-// Test conversions to/from javascript time.
-TEST_F(TimeTest, JsTime) {
-  Time epoch = Time::FromJsTime(0.0);
-  EXPECT_EQ(epoch, Time::UnixEpoch());
-  Time t = Time::FromJsTime(700000.3);
-  EXPECT_EQ(700.0003, t.ToDoubleT());
-  t = Time::FromDoubleT(800.73);
-  EXPECT_EQ(800730.0, t.ToJsTime());
-}
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-TEST_F(TimeTest, FromTimeVal) {
-  Time now = Time::Now();
-  Time also_now = Time::FromTimeVal(now.ToTimeVal());
-  EXPECT_EQ(now, also_now);
-}
-#endif  // defined(OS_POSIX) || defined(OS_FUCHSIA)
-
-TEST_F(TimeTest, FromExplodedWithMilliseconds) {
-  // Some platform implementations of FromExploded are liable to drop
-  // milliseconds if we aren't careful.
-  Time now = Time::NowFromSystemTime();
-  Time::Exploded exploded1 = {0};
-  now.UTCExplode(&exploded1);
-  exploded1.millisecond = 500;
-  Time time;
-  EXPECT_TRUE(Time::FromUTCExploded(exploded1, &time));
-  Time::Exploded exploded2 = {0};
-  time.UTCExplode(&exploded2);
-  EXPECT_EQ(exploded1.millisecond, exploded2.millisecond);
-}
-
-TEST_F(TimeTest, ZeroIsSymmetric) {
-  Time zero_time(Time::FromTimeT(0));
-  EXPECT_EQ(0, zero_time.ToTimeT());
-
-  EXPECT_EQ(0.0, zero_time.ToDoubleT());
-}
-
-TEST_F(TimeTest, LocalExplode) {
-  Time a = Time::Now();
-  Time::Exploded exploded;
-  a.LocalExplode(&exploded);
-
-  Time b;
-  EXPECT_TRUE(Time::FromLocalExploded(exploded, &b));
-
-  // The exploded structure doesn't have microseconds, and on Mac & Linux, the
-  // internal OS conversion uses seconds, which will cause truncation. So we
-  // can only make sure that the delta is within one second.
-  EXPECT_TRUE((a - b) < TimeDelta::FromSeconds(1));
-}
-
-TEST_F(TimeTest, UTCExplode) {
-  Time a = Time::Now();
-  Time::Exploded exploded;
-  a.UTCExplode(&exploded);
-
-  Time b;
-  EXPECT_TRUE(Time::FromUTCExploded(exploded, &b));
-  EXPECT_TRUE((a - b) < TimeDelta::FromSeconds(1));
-}
-
-TEST_F(TimeTest, LocalMidnight) {
-  Time::Exploded exploded;
-  Time::Now().LocalMidnight().LocalExplode(&exploded);
-  EXPECT_EQ(0, exploded.hour);
-  EXPECT_EQ(0, exploded.minute);
-  EXPECT_EQ(0, exploded.second);
-  EXPECT_EQ(0, exploded.millisecond);
-}
-
-TEST_F(TimeTest, ParseTimeTest1) {
-  time_t current_time = 0;
-  time(&current_time);
-
-  struct tm local_time = {};
-  char time_buf[64] = {};
-#if defined(OS_WIN)
-  localtime_s(&local_time, &current_time);
-  asctime_s(time_buf, arraysize(time_buf), &local_time);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  localtime_r(&current_time, &local_time);
-  asctime_r(&local_time, time_buf);
-#endif
-
-  Time parsed_time;
-  EXPECT_TRUE(Time::FromString(time_buf, &parsed_time));
-  EXPECT_EQ(current_time, parsed_time.ToTimeT());
-}
-
-TEST_F(TimeTest, DayOfWeekSunday) {
-  Time time;
-  EXPECT_TRUE(Time::FromString("Sun, 06 May 2012 12:00:00 GMT", &time));
-  Time::Exploded exploded;
-  time.UTCExplode(&exploded);
-  EXPECT_EQ(0, exploded.day_of_week);
-}
-
-TEST_F(TimeTest, DayOfWeekWednesday) {
-  Time time;
-  EXPECT_TRUE(Time::FromString("Wed, 09 May 2012 12:00:00 GMT", &time));
-  Time::Exploded exploded;
-  time.UTCExplode(&exploded);
-  EXPECT_EQ(3, exploded.day_of_week);
-}
-
-TEST_F(TimeTest, DayOfWeekSaturday) {
-  Time time;
-  EXPECT_TRUE(Time::FromString("Sat, 12 May 2012 12:00:00 GMT", &time));
-  Time::Exploded exploded;
-  time.UTCExplode(&exploded);
-  EXPECT_EQ(6, exploded.day_of_week);
-}
-
-TEST_F(TimeTest, ParseTimeTest2) {
-  Time parsed_time;
-  EXPECT_TRUE(Time::FromString("Mon, 15 Oct 2007 19:45:00 GMT", &parsed_time));
-  EXPECT_EQ(comparison_time_pdt_, parsed_time);
-}
-
-TEST_F(TimeTest, ParseTimeTest3) {
-  Time parsed_time;
-  EXPECT_TRUE(Time::FromString("15 Oct 07 12:45:00", &parsed_time));
-  EXPECT_EQ(comparison_time_local_, parsed_time);
-}
-
-TEST_F(TimeTest, ParseTimeTest4) {
-  Time parsed_time;
-  EXPECT_TRUE(Time::FromString("15 Oct 07 19:45 GMT", &parsed_time));
-  EXPECT_EQ(comparison_time_pdt_, parsed_time);
-}
-
-TEST_F(TimeTest, ParseTimeTest5) {
-  Time parsed_time;
-  EXPECT_TRUE(Time::FromString("Mon Oct 15 12:45 PDT 2007", &parsed_time));
-  EXPECT_EQ(comparison_time_pdt_, parsed_time);
-}
-
-TEST_F(TimeTest, ParseTimeTest6) {
-  Time parsed_time;
-  EXPECT_TRUE(Time::FromString("Monday, Oct 15, 2007 12:45 PM", &parsed_time));
-  EXPECT_EQ(comparison_time_local_, parsed_time);
-}
-
-TEST_F(TimeTest, ParseTimeTest7) {
-  Time parsed_time;
-  EXPECT_TRUE(Time::FromString("10/15/07 12:45:00 PM", &parsed_time));
-  EXPECT_EQ(comparison_time_local_, parsed_time);
-}
-
-TEST_F(TimeTest, ParseTimeTest8) {
-  Time parsed_time;
-  EXPECT_TRUE(Time::FromString("15-OCT-2007 12:45pm", &parsed_time));
-  EXPECT_EQ(comparison_time_local_, parsed_time);
-}
-
-TEST_F(TimeTest, ParseTimeTest9) {
-  Time parsed_time;
-  EXPECT_TRUE(Time::FromString("16 Oct 2007 4:45-JST (Tuesday)", &parsed_time));
-  EXPECT_EQ(comparison_time_pdt_, parsed_time);
-}
-
-TEST_F(TimeTest, ParseTimeTest10) {
-  Time parsed_time;
-  EXPECT_TRUE(Time::FromString("15/10/07 12:45", &parsed_time));
-  EXPECT_EQ(parsed_time, comparison_time_local_);
-}
-
-// Test some of edge cases around epoch, etc.
-TEST_F(TimeTest, ParseTimeTestEpoch0) {
-  Time parsed_time;
-
-  // time_t == epoch == 0
-  EXPECT_TRUE(Time::FromString("Thu Jan 01 01:00:00 +0100 1970",
-                               &parsed_time));
-  EXPECT_EQ(0, parsed_time.ToTimeT());
-  EXPECT_TRUE(Time::FromString("Thu Jan 01 00:00:00 GMT 1970",
-                               &parsed_time));
-  EXPECT_EQ(0, parsed_time.ToTimeT());
-}
-
-TEST_F(TimeTest, ParseTimeTestEpoch1) {
-  Time parsed_time;
-
-  // time_t == 1 second after epoch == 1
-  EXPECT_TRUE(Time::FromString("Thu Jan 01 01:00:01 +0100 1970",
-                               &parsed_time));
-  EXPECT_EQ(1, parsed_time.ToTimeT());
-  EXPECT_TRUE(Time::FromString("Thu Jan 01 00:00:01 GMT 1970",
-                               &parsed_time));
-  EXPECT_EQ(1, parsed_time.ToTimeT());
-}
-
-TEST_F(TimeTest, ParseTimeTestEpoch2) {
-  Time parsed_time;
-
-  // time_t == 2 seconds after epoch == 2
-  EXPECT_TRUE(Time::FromString("Thu Jan 01 01:00:02 +0100 1970",
-                               &parsed_time));
-  EXPECT_EQ(2, parsed_time.ToTimeT());
-  EXPECT_TRUE(Time::FromString("Thu Jan 01 00:00:02 GMT 1970",
-                               &parsed_time));
-  EXPECT_EQ(2, parsed_time.ToTimeT());
-}
-
-TEST_F(TimeTest, ParseTimeTestEpochNeg1) {
-  Time parsed_time;
-
-  // time_t == 1 second before epoch == -1
-  EXPECT_TRUE(Time::FromString("Thu Jan 01 00:59:59 +0100 1970",
-                               &parsed_time));
-  EXPECT_EQ(-1, parsed_time.ToTimeT());
-  EXPECT_TRUE(Time::FromString("Wed Dec 31 23:59:59 GMT 1969",
-                               &parsed_time));
-  EXPECT_EQ(-1, parsed_time.ToTimeT());
-}
-
-// If time_t is 32 bits, a date after year 2038 will overflow time_t and
-// cause timegm() to return -1.  The parsed time should not be 1 second
-// before epoch.
-TEST_F(TimeTest, ParseTimeTestEpochNotNeg1) {
-  Time parsed_time;
-
-  EXPECT_TRUE(Time::FromString("Wed Dec 31 23:59:59 GMT 2100",
-                               &parsed_time));
-  EXPECT_NE(-1, parsed_time.ToTimeT());
-}
-
-TEST_F(TimeTest, ParseTimeTestEpochNeg2) {
-  Time parsed_time;
-
-  // time_t == 2 seconds before epoch == -2
-  EXPECT_TRUE(Time::FromString("Thu Jan 01 00:59:58 +0100 1970",
-                               &parsed_time));
-  EXPECT_EQ(-2, parsed_time.ToTimeT());
-  EXPECT_TRUE(Time::FromString("Wed Dec 31 23:59:58 GMT 1969",
-                               &parsed_time));
-  EXPECT_EQ(-2, parsed_time.ToTimeT());
-}
-
-TEST_F(TimeTest, ParseTimeTestEpoch1960) {
-  Time parsed_time;
-
-  // time_t before Epoch, in 1960
-  EXPECT_TRUE(Time::FromString("Wed Jun 29 19:40:01 +0100 1960",
-                               &parsed_time));
-  EXPECT_EQ(-299999999, parsed_time.ToTimeT());
-  EXPECT_TRUE(Time::FromString("Wed Jun 29 18:40:01 GMT 1960",
-                               &parsed_time));
-  EXPECT_EQ(-299999999, parsed_time.ToTimeT());
-  EXPECT_TRUE(Time::FromString("Wed Jun 29 17:40:01 GMT 1960",
-                               &parsed_time));
-  EXPECT_EQ(-300003599, parsed_time.ToTimeT());
-}
-
-TEST_F(TimeTest, ParseTimeTestEmpty) {
-  Time parsed_time;
-  EXPECT_FALSE(Time::FromString("", &parsed_time));
-}
-
-TEST_F(TimeTest, ParseTimeTestInvalidString) {
-  Time parsed_time;
-  EXPECT_FALSE(Time::FromString("Monday morning 2000", &parsed_time));
-}
-
-TEST_F(TimeTest, ExplodeBeforeUnixEpoch) {
-  static const int kUnixEpochYear = 1970;  // In case this changes (ha!).
-  Time t;
-  Time::Exploded exploded;
-
-  t = Time::UnixEpoch() - TimeDelta::FromMicroseconds(1);
-  t.UTCExplode(&exploded);
-  EXPECT_TRUE(exploded.HasValidValues());
-  // Should be 1969-12-31 23:59:59 999 milliseconds (and 999 microseconds).
-  EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
-  EXPECT_EQ(12, exploded.month);
-  EXPECT_EQ(31, exploded.day_of_month);
-  EXPECT_EQ(23, exploded.hour);
-  EXPECT_EQ(59, exploded.minute);
-  EXPECT_EQ(59, exploded.second);
-  EXPECT_EQ(999, exploded.millisecond);
-
-  t = Time::UnixEpoch() - TimeDelta::FromMicroseconds(1000);
-  t.UTCExplode(&exploded);
-  EXPECT_TRUE(exploded.HasValidValues());
-  // Should be 1969-12-31 23:59:59 999 milliseconds.
-  EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
-  EXPECT_EQ(12, exploded.month);
-  EXPECT_EQ(31, exploded.day_of_month);
-  EXPECT_EQ(23, exploded.hour);
-  EXPECT_EQ(59, exploded.minute);
-  EXPECT_EQ(59, exploded.second);
-  EXPECT_EQ(999, exploded.millisecond);
-
-  t = Time::UnixEpoch() - TimeDelta::FromMicroseconds(1001);
-  t.UTCExplode(&exploded);
-  EXPECT_TRUE(exploded.HasValidValues());
-  // Should be 1969-12-31 23:59:59 998 milliseconds (and 999 microseconds).
-  EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
-  EXPECT_EQ(12, exploded.month);
-  EXPECT_EQ(31, exploded.day_of_month);
-  EXPECT_EQ(23, exploded.hour);
-  EXPECT_EQ(59, exploded.minute);
-  EXPECT_EQ(59, exploded.second);
-  EXPECT_EQ(998, exploded.millisecond);
-
-  t = Time::UnixEpoch() - TimeDelta::FromMilliseconds(1000);
-  t.UTCExplode(&exploded);
-  EXPECT_TRUE(exploded.HasValidValues());
-  // Should be 1969-12-31 23:59:59.
-  EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
-  EXPECT_EQ(12, exploded.month);
-  EXPECT_EQ(31, exploded.day_of_month);
-  EXPECT_EQ(23, exploded.hour);
-  EXPECT_EQ(59, exploded.minute);
-  EXPECT_EQ(59, exploded.second);
-  EXPECT_EQ(0, exploded.millisecond);
-
-  t = Time::UnixEpoch() - TimeDelta::FromMilliseconds(1001);
-  t.UTCExplode(&exploded);
-  EXPECT_TRUE(exploded.HasValidValues());
-  // Should be 1969-12-31 23:59:58 999 milliseconds.
-  EXPECT_EQ(kUnixEpochYear - 1, exploded.year);
-  EXPECT_EQ(12, exploded.month);
-  EXPECT_EQ(31, exploded.day_of_month);
-  EXPECT_EQ(23, exploded.hour);
-  EXPECT_EQ(59, exploded.minute);
-  EXPECT_EQ(58, exploded.second);
-  EXPECT_EQ(999, exploded.millisecond);
-
-  // Make sure we still handle at/after Unix epoch correctly.
-  t = Time::UnixEpoch();
-  t.UTCExplode(&exploded);
-  EXPECT_TRUE(exploded.HasValidValues());
-  // Should be 1970-12-31 00:00:00 0 milliseconds.
-  EXPECT_EQ(kUnixEpochYear, exploded.year);
-  EXPECT_EQ(1, exploded.month);
-  EXPECT_EQ(1, exploded.day_of_month);
-  EXPECT_EQ(0, exploded.hour);
-  EXPECT_EQ(0, exploded.minute);
-  EXPECT_EQ(0, exploded.second);
-  EXPECT_EQ(0, exploded.millisecond);
-
-  t = Time::UnixEpoch() + TimeDelta::FromMicroseconds(1);
-  t.UTCExplode(&exploded);
-  EXPECT_TRUE(exploded.HasValidValues());
-  // Should be 1970-01-01 00:00:00 0 milliseconds (and 1 microsecond).
-  EXPECT_EQ(kUnixEpochYear, exploded.year);
-  EXPECT_EQ(1, exploded.month);
-  EXPECT_EQ(1, exploded.day_of_month);
-  EXPECT_EQ(0, exploded.hour);
-  EXPECT_EQ(0, exploded.minute);
-  EXPECT_EQ(0, exploded.second);
-  EXPECT_EQ(0, exploded.millisecond);
-
-  t = Time::UnixEpoch() + TimeDelta::FromMicroseconds(1000);
-  t.UTCExplode(&exploded);
-  EXPECT_TRUE(exploded.HasValidValues());
-  // Should be 1970-01-01 00:00:00 1 millisecond.
-  EXPECT_EQ(kUnixEpochYear, exploded.year);
-  EXPECT_EQ(1, exploded.month);
-  EXPECT_EQ(1, exploded.day_of_month);
-  EXPECT_EQ(0, exploded.hour);
-  EXPECT_EQ(0, exploded.minute);
-  EXPECT_EQ(0, exploded.second);
-  EXPECT_EQ(1, exploded.millisecond);
-
-  t = Time::UnixEpoch() + TimeDelta::FromMilliseconds(1000);
-  t.UTCExplode(&exploded);
-  EXPECT_TRUE(exploded.HasValidValues());
-  // Should be 1970-01-01 00:00:01.
-  EXPECT_EQ(kUnixEpochYear, exploded.year);
-  EXPECT_EQ(1, exploded.month);
-  EXPECT_EQ(1, exploded.day_of_month);
-  EXPECT_EQ(0, exploded.hour);
-  EXPECT_EQ(0, exploded.minute);
-  EXPECT_EQ(1, exploded.second);
-  EXPECT_EQ(0, exploded.millisecond);
-
-  t = Time::UnixEpoch() + TimeDelta::FromMilliseconds(1001);
-  t.UTCExplode(&exploded);
-  EXPECT_TRUE(exploded.HasValidValues());
-  // Should be 1970-01-01 00:00:01 1 millisecond.
-  EXPECT_EQ(kUnixEpochYear, exploded.year);
-  EXPECT_EQ(1, exploded.month);
-  EXPECT_EQ(1, exploded.day_of_month);
-  EXPECT_EQ(0, exploded.hour);
-  EXPECT_EQ(0, exploded.minute);
-  EXPECT_EQ(1, exploded.second);
-  EXPECT_EQ(1, exploded.millisecond);
-}
-
-TEST_F(TimeTest, Max) {
-  Time max = Time::Max();
-  EXPECT_TRUE(max.is_max());
-  EXPECT_EQ(max, Time::Max());
-  EXPECT_GT(max, Time::Now());
-  EXPECT_GT(max, Time());
-}
-
-TEST_F(TimeTest, MaxConversions) {
-  Time t = Time::Max();
-  EXPECT_EQ(std::numeric_limits<int64_t>::max(), t.ToInternalValue());
-
-  t = Time::FromDoubleT(std::numeric_limits<double>::infinity());
-  EXPECT_TRUE(t.is_max());
-  EXPECT_EQ(std::numeric_limits<double>::infinity(), t.ToDoubleT());
-
-  t = Time::FromJsTime(std::numeric_limits<double>::infinity());
-  EXPECT_TRUE(t.is_max());
-  EXPECT_EQ(std::numeric_limits<double>::infinity(), t.ToJsTime());
-
-  t = Time::FromTimeT(std::numeric_limits<time_t>::max());
-  EXPECT_TRUE(t.is_max());
-  EXPECT_EQ(std::numeric_limits<time_t>::max(), t.ToTimeT());
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-  struct timeval tval;
-  tval.tv_sec = std::numeric_limits<time_t>::max();
-  tval.tv_usec = static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1;
-  t = Time::FromTimeVal(tval);
-  EXPECT_TRUE(t.is_max());
-  tval = t.ToTimeVal();
-  EXPECT_EQ(std::numeric_limits<time_t>::max(), tval.tv_sec);
-  EXPECT_EQ(static_cast<suseconds_t>(Time::kMicrosecondsPerSecond) - 1,
-      tval.tv_usec);
-#endif
-
-#if defined(OS_MACOSX)
-  t = Time::FromCFAbsoluteTime(std::numeric_limits<CFAbsoluteTime>::infinity());
-  EXPECT_TRUE(t.is_max());
-  EXPECT_EQ(std::numeric_limits<CFAbsoluteTime>::infinity(),
-            t.ToCFAbsoluteTime());
-#endif
-
-#if defined(OS_WIN)
-  FILETIME ftime;
-  ftime.dwHighDateTime = std::numeric_limits<DWORD>::max();
-  ftime.dwLowDateTime = std::numeric_limits<DWORD>::max();
-  t = Time::FromFileTime(ftime);
-  EXPECT_TRUE(t.is_max());
-  ftime = t.ToFileTime();
-  EXPECT_EQ(std::numeric_limits<DWORD>::max(), ftime.dwHighDateTime);
-  EXPECT_EQ(std::numeric_limits<DWORD>::max(), ftime.dwLowDateTime);
-#endif
-}
-
-#if defined(OS_MACOSX)
-TEST_F(TimeTest, TimeTOverflow) {
-  Time t = Time::FromInternalValue(std::numeric_limits<int64_t>::max() - 1);
-  EXPECT_FALSE(t.is_max());
-  EXPECT_EQ(std::numeric_limits<time_t>::max(), t.ToTimeT());
-}
-#endif
-
-#if defined(OS_ANDROID)
-TEST_F(TimeTest, FromLocalExplodedCrashOnAndroid) {
-  // This crashed inside Time:: FromLocalExploded() on Android 4.1.2.
-  // See http://crbug.com/287821
-  Time::Exploded midnight = {2013,  // year
-                             10,    // month
-                             0,     // day_of_week
-                             13,    // day_of_month
-                             0,     // hour
-                             0,     // minute
-                             0,     // second
-  };
-  // The string passed to putenv() must be a char* and the documentation states
-  // that it 'becomes part of the environment', so use a static buffer.
-  static char buffer[] = "TZ=America/Santiago";
-  putenv(buffer);
-  tzset();
-  Time t;
-  EXPECT_TRUE(Time::FromLocalExploded(midnight, &t));
-  EXPECT_EQ(1381633200, t.ToTimeT());
-}
-#endif  // OS_ANDROID
-
-TEST_F(TimeTest, FromExploded_MinMax) {
-  Time::Exploded exploded = {0};
-  exploded.month = 1;
-  exploded.day_of_month = 1;
-
-  Time parsed_time;
-
-  if (Time::kExplodedMinYear != std::numeric_limits<int>::min()) {
-    exploded.year = Time::kExplodedMinYear;
-    EXPECT_TRUE(Time::FromUTCExploded(exploded, &parsed_time));
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-    // On Windows, January 1, 1601 00:00:00 is actually the null time.
-    EXPECT_FALSE(parsed_time.is_null());
-#endif
-
-#if !defined(OS_ANDROID) && !defined(OS_MACOSX)
-    // The dates earlier than |kExplodedMinYear| that don't work are OS version
-    // dependent on Android and Mac (for example, macOS 10.13 seems to support
-    // dates before 1902).
-    exploded.year--;
-    EXPECT_FALSE(Time::FromUTCExploded(exploded, &parsed_time));
-    EXPECT_TRUE(parsed_time.is_null());
-#endif
-  }
-
-  if (Time::kExplodedMaxYear != std::numeric_limits<int>::max()) {
-    exploded.year = Time::kExplodedMaxYear;
-    exploded.month = 12;
-    exploded.day_of_month = 31;
-    exploded.hour = 23;
-    exploded.minute = 59;
-    exploded.second = 59;
-    exploded.millisecond = 999;
-    EXPECT_TRUE(Time::FromUTCExploded(exploded, &parsed_time));
-    EXPECT_FALSE(parsed_time.is_null());
-
-    exploded.year++;
-    EXPECT_FALSE(Time::FromUTCExploded(exploded, &parsed_time));
-    EXPECT_TRUE(parsed_time.is_null());
-  }
-}
-
-class TimeOverride {
- public:
-  static Time Now() {
-    now_time_ += TimeDelta::FromSeconds(1);
-    return now_time_;
-  }
-
-  static Time now_time_;
-};
-
-// static
-Time TimeOverride::now_time_;
-
-TEST_F(TimeTest, NowOverride) {
-  TimeOverride::now_time_ = Time::UnixEpoch();
-
-  // Choose a reference time that we know to be in the past but close to now.
-  Time build_time = GetBuildTime();
-
-  // Override is not active. All Now() methods should return a time greater than
-  // the build time.
-  EXPECT_LT(build_time, Time::Now());
-  EXPECT_GT(Time::Max(), Time::Now());
-  EXPECT_LT(build_time, subtle::TimeNowIgnoringOverride());
-  EXPECT_GT(Time::Max(), subtle::TimeNowIgnoringOverride());
-  EXPECT_LT(build_time, Time::NowFromSystemTime());
-  EXPECT_GT(Time::Max(), Time::NowFromSystemTime());
-  EXPECT_LT(build_time, subtle::TimeNowFromSystemTimeIgnoringOverride());
-  EXPECT_GT(Time::Max(), subtle::TimeNowFromSystemTimeIgnoringOverride());
-
-  {
-    // Set override.
-    subtle::ScopedTimeClockOverrides overrides(&TimeOverride::Now, nullptr,
-                                               nullptr);
-
-    // Overridden value is returned and incremented when Now() or
-    // NowFromSystemTime() is called.
-    EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(1), Time::Now());
-    EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(2), Time::Now());
-    EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(3),
-              Time::NowFromSystemTime());
-    EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(4),
-              Time::NowFromSystemTime());
-
-    // IgnoringOverride methods still return real time.
-    EXPECT_LT(build_time, subtle::TimeNowIgnoringOverride());
-    EXPECT_GT(Time::Max(), subtle::TimeNowIgnoringOverride());
-    EXPECT_LT(build_time, subtle::TimeNowFromSystemTimeIgnoringOverride());
-    EXPECT_GT(Time::Max(), subtle::TimeNowFromSystemTimeIgnoringOverride());
-
-    // IgnoringOverride methods didn't call NowOverrideClock::Now().
-    EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(5), Time::Now());
-    EXPECT_EQ(Time::UnixEpoch() + TimeDelta::FromSeconds(6),
-              Time::NowFromSystemTime());
-  }
-
-  // All methods return real time again.
-  EXPECT_LT(build_time, Time::Now());
-  EXPECT_GT(Time::Max(), Time::Now());
-  EXPECT_LT(build_time, subtle::TimeNowIgnoringOverride());
-  EXPECT_GT(Time::Max(), subtle::TimeNowIgnoringOverride());
-  EXPECT_LT(build_time, Time::NowFromSystemTime());
-  EXPECT_GT(Time::Max(), Time::NowFromSystemTime());
-  EXPECT_LT(build_time, subtle::TimeNowFromSystemTimeIgnoringOverride());
-  EXPECT_GT(Time::Max(), subtle::TimeNowFromSystemTimeIgnoringOverride());
-}
-
-TEST(TimeTicks, Deltas) {
-  for (int index = 0; index < 50; index++) {
-    TimeTicks ticks_start = TimeTicks::Now();
-    base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
-    TimeTicks ticks_stop = TimeTicks::Now();
-    TimeDelta delta = ticks_stop - ticks_start;
-    // Note:  Although we asked for a 10ms sleep, if the
-    // time clock has a finer granularity than the Sleep()
-    // clock, it is quite possible to wakeup early.  Here
-    // is how that works:
-    //      Time(ms timer)      Time(us timer)
-    //          5                   5010
-    //          6                   6010
-    //          7                   7010
-    //          8                   8010
-    //          9                   9000
-    // Elapsed  4ms                 3990us
-    //
-    // Unfortunately, our InMilliseconds() function truncates
-    // rather than rounds.  We should consider fixing this
-    // so that our averages come out better.
-    EXPECT_GE(delta.InMilliseconds(), 9);
-    EXPECT_GE(delta.InMicroseconds(), 9000);
-    EXPECT_EQ(delta.InSeconds(), 0);
-  }
-}
-
-static void HighResClockTest(TimeTicks (*GetTicks)()) {
-  // IsHighResolution() is false on some systems.  Since the product still works
-  // even if it's false, it makes this entire test questionable.
-  if (!TimeTicks::IsHighResolution())
-    return;
-
-  // Why do we loop here?
-  // We're trying to measure that intervals increment in a VERY small amount
-  // of time --  less than 15ms.  Unfortunately, if we happen to have a
-  // context switch in the middle of our test, the context switch could easily
-  // exceed our limit.  So, we iterate on this several times.  As long as we're
-  // able to detect the fine-granularity timers at least once, then the test
-  // has succeeded.
-
-  const int kTargetGranularityUs = 15000;  // 15ms
-
-  bool success = false;
-  int retries = 100;  // Arbitrary.
-  TimeDelta delta;
-  while (!success && retries--) {
-    TimeTicks ticks_start = GetTicks();
-    // Loop until we can detect that the clock has changed.  Non-HighRes timers
-    // will increment in chunks, e.g. 15ms.  By spinning until we see a clock
-    // change, we detect the minimum time between measurements.
-    do {
-      delta = GetTicks() - ticks_start;
-    } while (delta.InMilliseconds() == 0);
-
-    if (delta.InMicroseconds() <= kTargetGranularityUs)
-      success = true;
-  }
-
-  // In high resolution mode, we expect to see the clock increment
-  // in intervals less than 15ms.
-  EXPECT_TRUE(success);
-}
-
-TEST(TimeTicks, HighRes) {
-  HighResClockTest(&TimeTicks::Now);
-}
-
-class TimeTicksOverride {
- public:
-  static TimeTicks Now() {
-    now_ticks_ += TimeDelta::FromSeconds(1);
-    return now_ticks_;
-  }
-
-  static TimeTicks now_ticks_;
-};
-
-// static
-TimeTicks TimeTicksOverride::now_ticks_;
-
-TEST(TimeTicks, NowOverride) {
-  TimeTicksOverride::now_ticks_ = TimeTicks::Min();
-
-  // Override is not active. All Now() methods should return a sensible value.
-  EXPECT_LT(TimeTicks::Min(), TimeTicks::UnixEpoch());
-  EXPECT_LT(TimeTicks::UnixEpoch(), TimeTicks::Now());
-  EXPECT_GT(TimeTicks::Max(), TimeTicks::Now());
-  EXPECT_LT(TimeTicks::UnixEpoch(), subtle::TimeTicksNowIgnoringOverride());
-  EXPECT_GT(TimeTicks::Max(), subtle::TimeTicksNowIgnoringOverride());
-
-  {
-    // Set override.
-    subtle::ScopedTimeClockOverrides overrides(nullptr, &TimeTicksOverride::Now,
-                                               nullptr);
-
-    // Overridden value is returned and incremented when Now() is called.
-    EXPECT_EQ(TimeTicks::Min() + TimeDelta::FromSeconds(1), TimeTicks::Now());
-    EXPECT_EQ(TimeTicks::Min() + TimeDelta::FromSeconds(2), TimeTicks::Now());
-
-    // NowIgnoringOverride() still returns real ticks.
-    EXPECT_LT(TimeTicks::UnixEpoch(), subtle::TimeTicksNowIgnoringOverride());
-    EXPECT_GT(TimeTicks::Max(), subtle::TimeTicksNowIgnoringOverride());
-
-    // IgnoringOverride methods didn't call NowOverrideTickClock::NowTicks().
-    EXPECT_EQ(TimeTicks::Min() + TimeDelta::FromSeconds(3), TimeTicks::Now());
-  }
-
-  // All methods return real ticks again.
-  EXPECT_LT(TimeTicks::UnixEpoch(), TimeTicks::Now());
-  EXPECT_GT(TimeTicks::Max(), TimeTicks::Now());
-  EXPECT_LT(TimeTicks::UnixEpoch(), subtle::TimeTicksNowIgnoringOverride());
-  EXPECT_GT(TimeTicks::Max(), subtle::TimeTicksNowIgnoringOverride());
-}
-
-class ThreadTicksOverride {
- public:
-  static ThreadTicks Now() {
-    now_ticks_ += TimeDelta::FromSeconds(1);
-    return now_ticks_;
-  }
-
-  static ThreadTicks now_ticks_;
-};
-
-// static
-ThreadTicks ThreadTicksOverride::now_ticks_;
-
-// IOS doesn't support ThreadTicks::Now().
-#if defined(OS_IOS)
-#define MAYBE_NowOverride DISABLED_NowOverride
-#else
-#define MAYBE_NowOverride NowOverride
-#endif
-TEST(ThreadTicks, MAYBE_NowOverride) {
-  ThreadTicksOverride::now_ticks_ = ThreadTicks::Min();
-
-  // Override is not active. All Now() methods should return a sensible value.
-  ThreadTicks initial_thread_ticks = ThreadTicks::Now();
-  EXPECT_LE(initial_thread_ticks, ThreadTicks::Now());
-  EXPECT_GT(ThreadTicks::Max(), ThreadTicks::Now());
-  EXPECT_LE(initial_thread_ticks, subtle::ThreadTicksNowIgnoringOverride());
-  EXPECT_GT(ThreadTicks::Max(), subtle::ThreadTicksNowIgnoringOverride());
-
-  {
-    // Set override.
-    subtle::ScopedTimeClockOverrides overrides(nullptr, nullptr,
-                                               &ThreadTicksOverride::Now);
-
-    // Overridden value is returned and incremented when Now() is called.
-    EXPECT_EQ(ThreadTicks::Min() + TimeDelta::FromSeconds(1),
-              ThreadTicks::Now());
-    EXPECT_EQ(ThreadTicks::Min() + TimeDelta::FromSeconds(2),
-              ThreadTicks::Now());
-
-    // NowIgnoringOverride() still returns real ticks.
-    EXPECT_LE(initial_thread_ticks, subtle::ThreadTicksNowIgnoringOverride());
-    EXPECT_GT(ThreadTicks::Max(), subtle::ThreadTicksNowIgnoringOverride());
-
-    // IgnoringOverride methods didn't call NowOverrideTickClock::NowTicks().
-    EXPECT_EQ(ThreadTicks::Min() + TimeDelta::FromSeconds(3),
-              ThreadTicks::Now());
-  }
-
-  // All methods return real ticks again.
-  EXPECT_LE(initial_thread_ticks, ThreadTicks::Now());
-  EXPECT_GT(ThreadTicks::Max(), ThreadTicks::Now());
-  EXPECT_LE(initial_thread_ticks, subtle::ThreadTicksNowIgnoringOverride());
-  EXPECT_GT(ThreadTicks::Max(), subtle::ThreadTicksNowIgnoringOverride());
-}
-
-// Fails frequently on Android http://crbug.com/352633 with:
-// Expected: (delta_thread.InMicroseconds()) > (0), actual: 0 vs 0
-#if defined(OS_ANDROID)
-#define MAYBE_ThreadNow DISABLED_ThreadNow
-#else
-#define MAYBE_ThreadNow ThreadNow
-#endif
-TEST(ThreadTicks, MAYBE_ThreadNow) {
-  if (ThreadTicks::IsSupported()) {
-    ThreadTicks::WaitUntilInitialized();
-    TimeTicks begin = TimeTicks::Now();
-    ThreadTicks begin_thread = ThreadTicks::Now();
-    // Make sure that ThreadNow value is non-zero.
-    EXPECT_GT(begin_thread, ThreadTicks());
-    // Sleep for 10 milliseconds to get the thread de-scheduled.
-    base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(10));
-    ThreadTicks end_thread = ThreadTicks::Now();
-    TimeTicks end = TimeTicks::Now();
-    TimeDelta delta = end - begin;
-    TimeDelta delta_thread = end_thread - begin_thread;
-    // Make sure that some thread time have elapsed.
-    EXPECT_GT(delta_thread.InMicroseconds(), 0);
-    // But the thread time is at least 9ms less than clock time.
-    TimeDelta difference = delta - delta_thread;
-    EXPECT_GE(difference.InMicroseconds(), 9000);
-  }
-}
-
-TEST(TimeTicks, SnappedToNextTickBasic) {
-  base::TimeTicks phase = base::TimeTicks::FromInternalValue(4000);
-  base::TimeDelta interval = base::TimeDelta::FromMicroseconds(1000);
-  base::TimeTicks timestamp;
-
-  // Timestamp in previous interval.
-  timestamp = base::TimeTicks::FromInternalValue(3500);
-  EXPECT_EQ(4000,
-            timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
-
-  // Timestamp in next interval.
-  timestamp = base::TimeTicks::FromInternalValue(4500);
-  EXPECT_EQ(5000,
-            timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
-
-  // Timestamp multiple intervals before.
-  timestamp = base::TimeTicks::FromInternalValue(2500);
-  EXPECT_EQ(3000,
-            timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
-
-  // Timestamp multiple intervals after.
-  timestamp = base::TimeTicks::FromInternalValue(6500);
-  EXPECT_EQ(7000,
-            timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
-
-  // Timestamp on previous interval.
-  timestamp = base::TimeTicks::FromInternalValue(3000);
-  EXPECT_EQ(3000,
-            timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
-
-  // Timestamp on next interval.
-  timestamp = base::TimeTicks::FromInternalValue(5000);
-  EXPECT_EQ(5000,
-            timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
-
-  // Timestamp equal to phase.
-  timestamp = base::TimeTicks::FromInternalValue(4000);
-  EXPECT_EQ(4000,
-            timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
-}
-
-TEST(TimeTicks, SnappedToNextTickOverflow) {
-  // int(big_timestamp / interval) < 0, so this causes a crash if the number of
-  // intervals elapsed is attempted to be stored in an int.
-  base::TimeTicks phase = base::TimeTicks::FromInternalValue(0);
-  base::TimeDelta interval = base::TimeDelta::FromMicroseconds(4000);
-  base::TimeTicks big_timestamp =
-      base::TimeTicks::FromInternalValue(8635916564000);
-
-  EXPECT_EQ(8635916564000,
-            big_timestamp.SnappedToNextTick(phase, interval).ToInternalValue());
-  EXPECT_EQ(8635916564000,
-            big_timestamp.SnappedToNextTick(big_timestamp, interval)
-                .ToInternalValue());
-}
-
-#if defined(OS_ANDROID)
-TEST(TimeTicks, Android_FromUptimeMillis_ClocksMatch) {
-  JNIEnv* const env = android::AttachCurrentThread();
-  android::ScopedJavaLocalRef<jclass> clazz(
-      android::GetClass(env, "android/os/SystemClock"));
-  ASSERT_TRUE(clazz.obj());
-  const jmethodID method_id =
-      android::MethodID::Get<android::MethodID::TYPE_STATIC>(
-          env, clazz.obj(), "uptimeMillis", "()J");
-  ASSERT_FALSE(!method_id);
-  // Subtract 1ms from the expected lower bound to allow millisecon-level
-  // truncation performed in uptimeMillis().
-  const TimeTicks lower_bound_ticks =
-      TimeTicks::Now() - TimeDelta::FromMilliseconds(1);
-  const TimeTicks converted_ticks = TimeTicks::FromUptimeMillis(
-      env->CallStaticLongMethod(clazz.obj(), method_id));
-  const TimeTicks upper_bound_ticks = TimeTicks::Now();
-  EXPECT_LE(lower_bound_ticks, converted_ticks);
-  EXPECT_GE(upper_bound_ticks, converted_ticks);
-}
-#endif  // OS_ANDROID
-
-TEST(TimeDelta, FromAndIn) {
-  // static_assert also checks that the contained expression is a constant
-  // expression, meaning all its components are suitable for initializing global
-  // variables.
-  static_assert(TimeDelta::FromDays(2) == TimeDelta::FromHours(48), "");
-  static_assert(TimeDelta::FromHours(3) == TimeDelta::FromMinutes(180), "");
-  static_assert(TimeDelta::FromMinutes(2) == TimeDelta::FromSeconds(120), "");
-  static_assert(TimeDelta::FromSeconds(2) == TimeDelta::FromMilliseconds(2000),
-                "");
-  static_assert(
-      TimeDelta::FromMilliseconds(2) == TimeDelta::FromMicroseconds(2000), "");
-  static_assert(
-      TimeDelta::FromSecondsD(2.3) == TimeDelta::FromMilliseconds(2300), "");
-  static_assert(
-      TimeDelta::FromMillisecondsD(2.5) == TimeDelta::FromMicroseconds(2500),
-      "");
-  EXPECT_EQ(TimeDelta::FromDays(13).InDays(), 13);
-  EXPECT_EQ(TimeDelta::FromHours(13).InHours(), 13);
-  EXPECT_EQ(TimeDelta::FromMinutes(13).InMinutes(), 13);
-  EXPECT_EQ(TimeDelta::FromSeconds(13).InSeconds(), 13);
-  EXPECT_EQ(TimeDelta::FromSeconds(13).InSecondsF(), 13.0);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(13).InMilliseconds(), 13);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(13).InMillisecondsF(), 13.0);
-  EXPECT_EQ(TimeDelta::FromSecondsD(13.1).InSeconds(), 13);
-  EXPECT_EQ(TimeDelta::FromSecondsD(13.1).InSecondsF(), 13.1);
-  EXPECT_EQ(TimeDelta::FromMillisecondsD(13.3).InMilliseconds(), 13);
-  EXPECT_EQ(TimeDelta::FromMillisecondsD(13.3).InMillisecondsF(), 13.3);
-  EXPECT_EQ(TimeDelta::FromMicroseconds(13).InMicroseconds(), 13);
-  EXPECT_EQ(TimeDelta::FromMicrosecondsD(13.3).InMicroseconds(), 13);
-  EXPECT_EQ(TimeDelta::FromMillisecondsD(3.45678).InMillisecondsF(), 3.456);
-  EXPECT_EQ(TimeDelta::FromNanoseconds(12345).InNanoseconds(), 12000);
-  EXPECT_EQ(TimeDelta::FromNanosecondsD(12345.678).InNanoseconds(), 12000);
-}
-
-#if defined(OS_POSIX) || defined(OS_FUCHSIA)
-TEST(TimeDelta, TimeSpecConversion) {
-  TimeDelta delta = TimeDelta::FromSeconds(0);
-  struct timespec result = delta.ToTimeSpec();
-  EXPECT_EQ(result.tv_sec, 0);
-  EXPECT_EQ(result.tv_nsec, 0);
-  EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
-
-  delta = TimeDelta::FromSeconds(1);
-  result = delta.ToTimeSpec();
-  EXPECT_EQ(result.tv_sec, 1);
-  EXPECT_EQ(result.tv_nsec, 0);
-  EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
-
-  delta = TimeDelta::FromMicroseconds(1);
-  result = delta.ToTimeSpec();
-  EXPECT_EQ(result.tv_sec, 0);
-  EXPECT_EQ(result.tv_nsec, 1000);
-  EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
-
-  delta = TimeDelta::FromMicroseconds(Time::kMicrosecondsPerSecond + 1);
-  result = delta.ToTimeSpec();
-  EXPECT_EQ(result.tv_sec, 1);
-  EXPECT_EQ(result.tv_nsec, 1000);
-  EXPECT_EQ(delta, TimeDelta::FromTimeSpec(result));
-}
-#endif  // defined(OS_POSIX) || defined(OS_FUCHSIA)
-
-// Our internal time format is serialized in things like databases, so it's
-// important that it's consistent across all our platforms.  We use the 1601
-// Windows epoch as the internal format across all platforms.
-TEST(TimeDelta, WindowsEpoch) {
-  Time::Exploded exploded;
-  exploded.year = 1970;
-  exploded.month = 1;
-  exploded.day_of_week = 0;  // Should be unusued.
-  exploded.day_of_month = 1;
-  exploded.hour = 0;
-  exploded.minute = 0;
-  exploded.second = 0;
-  exploded.millisecond = 0;
-  Time t;
-  EXPECT_TRUE(Time::FromUTCExploded(exploded, &t));
-  // Unix 1970 epoch.
-  EXPECT_EQ(INT64_C(11644473600000000), t.ToInternalValue());
-
-  // We can't test 1601 epoch, since the system time functions on Linux
-  // only compute years starting from 1900.
-}
-
-// We could define this separately for Time, TimeTicks and TimeDelta but the
-// definitions would be identical anyway.
-template <class Any>
-std::string AnyToString(Any any) {
-  std::ostringstream oss;
-  oss << any;
-  return oss.str();
-}
-
-TEST(TimeDelta, Magnitude) {
-  constexpr int64_t zero = 0;
-  static_assert(TimeDelta::FromMicroseconds(zero) ==
-                    TimeDelta::FromMicroseconds(zero).magnitude(),
-                "");
-
-  constexpr int64_t one = 1;
-  constexpr int64_t negative_one = -1;
-  static_assert(TimeDelta::FromMicroseconds(one) ==
-                    TimeDelta::FromMicroseconds(one).magnitude(),
-                "");
-  static_assert(TimeDelta::FromMicroseconds(one) ==
-                    TimeDelta::FromMicroseconds(negative_one).magnitude(),
-                "");
-
-  constexpr int64_t max_int64_minus_one =
-      std::numeric_limits<int64_t>::max() - 1;
-  constexpr int64_t min_int64_plus_two =
-      std::numeric_limits<int64_t>::min() + 2;
-  static_assert(
-      TimeDelta::FromMicroseconds(max_int64_minus_one) ==
-          TimeDelta::FromMicroseconds(max_int64_minus_one).magnitude(),
-      "");
-  static_assert(TimeDelta::FromMicroseconds(max_int64_minus_one) ==
-                    TimeDelta::FromMicroseconds(min_int64_plus_two).magnitude(),
-                "");
-}
-
-TEST(TimeDelta, ZeroMinMax) {
-  constexpr TimeDelta kZero;
-  static_assert(kZero.is_zero(), "");
-
-  constexpr TimeDelta kMax = TimeDelta::Max();
-  static_assert(kMax.is_max(), "");
-  static_assert(kMax == TimeDelta::Max(), "");
-  static_assert(kMax > TimeDelta::FromDays(100 * 365), "");
-  static_assert(kMax > kZero, "");
-
-  constexpr TimeDelta kMin = TimeDelta::Min();
-  static_assert(kMin.is_min(), "");
-  static_assert(kMin == TimeDelta::Min(), "");
-  static_assert(kMin < TimeDelta::FromDays(-100 * 365), "");
-  static_assert(kMin < kZero, "");
-}
-
-TEST(TimeDelta, MaxConversions) {
-  // static_assert also confirms constexpr works as intended.
-  constexpr TimeDelta kMax = TimeDelta::Max();
-  static_assert(kMax.ToInternalValue() == std::numeric_limits<int64_t>::max(),
-                "");
-  EXPECT_EQ(kMax.InDays(), std::numeric_limits<int>::max());
-  EXPECT_EQ(kMax.InHours(), std::numeric_limits<int>::max());
-  EXPECT_EQ(kMax.InMinutes(), std::numeric_limits<int>::max());
-  EXPECT_EQ(kMax.InSecondsF(), std::numeric_limits<double>::infinity());
-  EXPECT_EQ(kMax.InSeconds(), std::numeric_limits<int64_t>::max());
-  EXPECT_EQ(kMax.InMillisecondsF(), std::numeric_limits<double>::infinity());
-  EXPECT_EQ(kMax.InMilliseconds(), std::numeric_limits<int64_t>::max());
-  EXPECT_EQ(kMax.InMillisecondsRoundedUp(), std::numeric_limits<int64_t>::max());
-
-  static_assert(TimeDelta::FromDays(std::numeric_limits<int>::max()).is_max(),
-                "");
-
-  static_assert(TimeDelta::FromHours(std::numeric_limits<int>::max()).is_max(),
-                "");
-
-  static_assert(
-      TimeDelta::FromMinutes(std::numeric_limits<int>::max()).is_max(), "");
-
-  constexpr int64_t max_int = std::numeric_limits<int64_t>::max();
-  constexpr int64_t min_int = std::numeric_limits<int64_t>::min();
-
-  static_assert(
-      TimeDelta::FromSeconds(max_int / Time::kMicrosecondsPerSecond + 1)
-          .is_max(),
-      "");
-
-  static_assert(
-      TimeDelta::FromMilliseconds(max_int / Time::kMillisecondsPerSecond + 1)
-          .is_max(),
-      "");
-
-  static_assert(TimeDelta::FromMicroseconds(max_int).is_max(), "");
-
-  static_assert(
-      TimeDelta::FromSeconds(min_int / Time::kMicrosecondsPerSecond - 1)
-          .is_min(),
-      "");
-
-  static_assert(
-      TimeDelta::FromMilliseconds(min_int / Time::kMillisecondsPerSecond - 1)
-          .is_min(),
-      "");
-
-  static_assert(TimeDelta::FromMicroseconds(min_int).is_min(), "");
-
-  static_assert(
-      TimeDelta::FromMicroseconds(std::numeric_limits<int64_t>::min()).is_min(),
-      "");
-
-  // Floating point arithmetic resulting in infinity isn't constexpr in C++14.
-  EXPECT_TRUE(TimeDelta::FromSecondsD(std::numeric_limits<double>::infinity())
-                  .is_max());
-
-  // Note that max_int/min_int will be rounded when converted to doubles - they
-  // can't be exactly represented.
-  constexpr double max_d = static_cast<double>(max_int);
-  constexpr double min_d = static_cast<double>(min_int);
-
-  static_assert(
-      TimeDelta::FromSecondsD(max_d / Time::kMicrosecondsPerSecond + 1)
-          .is_max(),
-      "");
-
-  // Floating point arithmetic resulting in infinity isn't constexpr in C++14.
-  EXPECT_TRUE(
-      TimeDelta::FromMillisecondsD(std::numeric_limits<double>::infinity())
-          .is_max());
-
-  static_assert(
-      TimeDelta::FromMillisecondsD(max_d / Time::kMillisecondsPerSecond * 2)
-          .is_max(),
-      "");
-
-  static_assert(
-      TimeDelta::FromSecondsD(min_d / Time::kMicrosecondsPerSecond - 1)
-          .is_min(),
-      "");
-
-  static_assert(
-      TimeDelta::FromMillisecondsD(min_d / Time::kMillisecondsPerSecond * 2)
-          .is_min(),
-      "");
-}
-
-TEST(TimeDelta, NumericOperators) {
-  constexpr double d = 0.5;
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            (TimeDelta::FromMilliseconds(1000) * d));
-  static_assert(TimeDelta::FromMilliseconds(2000) ==
-                    (TimeDelta::FromMilliseconds(1000) / d),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            (TimeDelta::FromMilliseconds(1000) *= d));
-  static_assert(TimeDelta::FromMilliseconds(2000) ==
-                    (TimeDelta::FromMilliseconds(1000) /= d),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            (d * TimeDelta::FromMilliseconds(1000)));
-
-  constexpr float f = 0.5;
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            (TimeDelta::FromMilliseconds(1000) * f));
-  static_assert(TimeDelta::FromMilliseconds(2000) ==
-                    (TimeDelta::FromMilliseconds(1000) / f),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            (TimeDelta::FromMilliseconds(1000) *= f));
-  static_assert(TimeDelta::FromMilliseconds(2000) ==
-                    (TimeDelta::FromMilliseconds(1000) /= f),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            (f * TimeDelta::FromMilliseconds(1000)));
-
-  constexpr int i = 2;
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            (TimeDelta::FromMilliseconds(1000) * i));
-  static_assert(TimeDelta::FromMilliseconds(500) ==
-                    (TimeDelta::FromMilliseconds(1000) / i),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            (TimeDelta::FromMilliseconds(1000) *= i));
-  static_assert(TimeDelta::FromMilliseconds(500) ==
-                    (TimeDelta::FromMilliseconds(1000) /= i),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            (i * TimeDelta::FromMilliseconds(1000)));
-
-  constexpr int64_t i64 = 2;
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            (TimeDelta::FromMilliseconds(1000) * i64));
-  static_assert(TimeDelta::FromMilliseconds(500) ==
-                    (TimeDelta::FromMilliseconds(1000) / i64),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            (TimeDelta::FromMilliseconds(1000) *= i64));
-  static_assert(TimeDelta::FromMilliseconds(500) ==
-                    (TimeDelta::FromMilliseconds(1000) /= i64),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            (i64 * TimeDelta::FromMilliseconds(1000)));
-
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            (TimeDelta::FromMilliseconds(1000) * 0.5));
-  static_assert(TimeDelta::FromMilliseconds(2000) ==
-                    (TimeDelta::FromMilliseconds(1000) / 0.5),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            (TimeDelta::FromMilliseconds(1000) *= 0.5));
-  static_assert(TimeDelta::FromMilliseconds(2000) ==
-                    (TimeDelta::FromMilliseconds(1000) /= 0.5),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            (0.5 * TimeDelta::FromMilliseconds(1000)));
-
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            (TimeDelta::FromMilliseconds(1000) * 2));
-  static_assert(TimeDelta::FromMilliseconds(500) ==
-                    (TimeDelta::FromMilliseconds(1000) / 2),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            (TimeDelta::FromMilliseconds(1000) *= 2));
-  static_assert(TimeDelta::FromMilliseconds(500) ==
-                    (TimeDelta::FromMilliseconds(1000) /= 2),
-                "");
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            (2 * TimeDelta::FromMilliseconds(1000)));
-}
-
-// Basic test of operators between TimeDeltas (without overflow -- next test
-// handles overflow).
-TEST(TimeDelta, TimeDeltaOperators) {
-  constexpr TimeDelta kElevenSeconds = TimeDelta::FromSeconds(11);
-  constexpr TimeDelta kThreeSeconds = TimeDelta::FromSeconds(3);
-
-  EXPECT_EQ(TimeDelta::FromSeconds(14), kElevenSeconds + kThreeSeconds);
-  EXPECT_EQ(TimeDelta::FromSeconds(14), kThreeSeconds + kElevenSeconds);
-  EXPECT_EQ(TimeDelta::FromSeconds(8), kElevenSeconds - kThreeSeconds);
-  EXPECT_EQ(TimeDelta::FromSeconds(-8), kThreeSeconds - kElevenSeconds);
-  static_assert(3 == kElevenSeconds / kThreeSeconds, "");
-  static_assert(0 == kThreeSeconds / kElevenSeconds, "");
-  static_assert(TimeDelta::FromSeconds(2) == kElevenSeconds % kThreeSeconds,
-                "");
-}
-
-TEST(TimeDelta, Overflows) {
-  // Some sanity checks. static_assert's used were possible to verify constexpr
-  // evaluation at the same time.
-  static_assert(TimeDelta::Max().is_max(), "");
-  static_assert(-TimeDelta::Max() < TimeDelta(), "");
-  static_assert(-TimeDelta::Max() > TimeDelta::Min(), "");
-  static_assert(TimeDelta() > -TimeDelta::Max(), "");
-
-  TimeDelta large_delta = TimeDelta::Max() - TimeDelta::FromMilliseconds(1);
-  TimeDelta large_negative = -large_delta;
-  EXPECT_GT(TimeDelta(), large_negative);
-  EXPECT_FALSE(large_delta.is_max());
-  EXPECT_FALSE((-large_negative).is_min());
-  constexpr TimeDelta kOneSecond = TimeDelta::FromSeconds(1);
-
-  // Test +, -, * and / operators.
-  EXPECT_TRUE((large_delta + kOneSecond).is_max());
-  EXPECT_TRUE((large_negative + (-kOneSecond)).is_min());
-  EXPECT_TRUE((large_negative - kOneSecond).is_min());
-  EXPECT_TRUE((large_delta - (-kOneSecond)).is_max());
-  EXPECT_TRUE((large_delta * 2).is_max());
-  EXPECT_TRUE((large_delta * -2).is_min());
-  EXPECT_TRUE((large_delta / 0.5).is_max());
-  EXPECT_TRUE((large_delta / -0.5).is_min());
-
-  // Test that double conversions overflow to infinity.
-  EXPECT_EQ((large_delta + kOneSecond).InSecondsF(),
-            std::numeric_limits<double>::infinity());
-  EXPECT_EQ((large_delta + kOneSecond).InMillisecondsF(),
-            std::numeric_limits<double>::infinity());
-  EXPECT_EQ((large_delta + kOneSecond).InMicrosecondsF(),
-            std::numeric_limits<double>::infinity());
-
-  // Test +=, -=, *= and /= operators.
-  TimeDelta delta = large_delta;
-  delta += kOneSecond;
-  EXPECT_TRUE(delta.is_max());
-  delta = large_negative;
-  delta += -kOneSecond;
-  EXPECT_TRUE((delta).is_min());
-
-  delta = large_negative;
-  delta -= kOneSecond;
-  EXPECT_TRUE((delta).is_min());
-  delta = large_delta;
-  delta -= -kOneSecond;
-  EXPECT_TRUE(delta.is_max());
-
-  delta = large_delta;
-  delta *= 2;
-  EXPECT_TRUE(delta.is_max());
-  delta = large_negative;
-  delta *= 1.5;
-  EXPECT_TRUE((delta).is_min());
-
-  delta = large_delta;
-  delta /= 0.5;
-  EXPECT_TRUE(delta.is_max());
-  delta = large_negative;
-  delta /= 0.5;
-  EXPECT_TRUE((delta).is_min());
-
-  // Test operations with Time and TimeTicks.
-  EXPECT_TRUE((large_delta + Time::Now()).is_max());
-  EXPECT_TRUE((large_delta + TimeTicks::Now()).is_max());
-  EXPECT_TRUE((Time::Now() + large_delta).is_max());
-  EXPECT_TRUE((TimeTicks::Now() + large_delta).is_max());
-
-  Time time_now = Time::Now();
-  EXPECT_EQ(kOneSecond, (time_now + kOneSecond) - time_now);
-  EXPECT_EQ(-kOneSecond, (time_now - kOneSecond) - time_now);
-
-  TimeTicks ticks_now = TimeTicks::Now();
-  EXPECT_EQ(-kOneSecond, (ticks_now - kOneSecond) - ticks_now);
-  EXPECT_EQ(kOneSecond, (ticks_now + kOneSecond) - ticks_now);
-}
-
-TEST(TimeDeltaLogging, DCheckEqCompiles) {
-  DCHECK_EQ(TimeDelta(), TimeDelta());
-}
-
-TEST(TimeDeltaLogging, EmptyIsZero) {
-  constexpr TimeDelta kZero;
-  EXPECT_EQ("0 s", AnyToString(kZero));
-}
-
-TEST(TimeDeltaLogging, FiveHundredMs) {
-  constexpr TimeDelta kFiveHundredMs = TimeDelta::FromMilliseconds(500);
-  EXPECT_EQ("0.5 s", AnyToString(kFiveHundredMs));
-}
-
-TEST(TimeDeltaLogging, MinusTenSeconds) {
-  constexpr TimeDelta kMinusTenSeconds = TimeDelta::FromSeconds(-10);
-  EXPECT_EQ("-10 s", AnyToString(kMinusTenSeconds));
-}
-
-TEST(TimeDeltaLogging, DoesNotMessUpFormattingFlags) {
-  std::ostringstream oss;
-  std::ios_base::fmtflags flags_before = oss.flags();
-  oss << TimeDelta();
-  EXPECT_EQ(flags_before, oss.flags());
-}
-
-TEST(TimeDeltaLogging, DoesNotMakeStreamBad) {
-  std::ostringstream oss;
-  oss << TimeDelta();
-  EXPECT_TRUE(oss.good());
-}
-
-TEST(TimeLogging, DCheckEqCompiles) {
-  DCHECK_EQ(Time(), Time());
-}
-
-TEST(TimeLogging, ChromeBirthdate) {
-  Time birthdate;
-  ASSERT_TRUE(Time::FromString("Tue, 02 Sep 2008 09:42:18 GMT", &birthdate));
-  EXPECT_EQ("2008-09-02 09:42:18.000 UTC", AnyToString(birthdate));
-}
-
-TEST(TimeLogging, DoesNotMessUpFormattingFlags) {
-  std::ostringstream oss;
-  std::ios_base::fmtflags flags_before = oss.flags();
-  oss << Time();
-  EXPECT_EQ(flags_before, oss.flags());
-}
-
-TEST(TimeLogging, DoesNotMakeStreamBad) {
-  std::ostringstream oss;
-  oss << Time();
-  EXPECT_TRUE(oss.good());
-}
-
-TEST(TimeTicksLogging, DCheckEqCompiles) {
-  DCHECK_EQ(TimeTicks(), TimeTicks());
-}
-
-TEST(TimeTicksLogging, ZeroTime) {
-  TimeTicks zero;
-  EXPECT_EQ("0 bogo-microseconds", AnyToString(zero));
-}
-
-TEST(TimeTicksLogging, FortyYearsLater) {
-  TimeTicks forty_years_later =
-      TimeTicks() + TimeDelta::FromDays(365.25 * 40);
-  EXPECT_EQ("1262304000000000 bogo-microseconds",
-            AnyToString(forty_years_later));
-}
-
-TEST(TimeTicksLogging, DoesNotMessUpFormattingFlags) {
-  std::ostringstream oss;
-  std::ios_base::fmtflags flags_before = oss.flags();
-  oss << TimeTicks();
-  EXPECT_EQ(flags_before, oss.flags());
-}
-
-TEST(TimeTicksLogging, DoesNotMakeStreamBad) {
-  std::ostringstream oss;
-  oss << TimeTicks();
-  EXPECT_TRUE(oss.good());
-}
-
-}  // namespace
-
-}  // namespace base
diff --git a/base/time/time_win_unittest.cc b/base/time/time_win_unittest.cc
deleted file mode 100644
index 24cd731..0000000
--- a/base/time/time_win_unittest.cc
+++ /dev/null
@@ -1,365 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <windows.h>
-#include <mmsystem.h>
-#include <process.h>
-#include <stdint.h>
-
-#include <cmath>
-#include <limits>
-#include <vector>
-
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-#include "base/win/registry.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace {
-
-// For TimeDelta::ConstexprInitialization
-constexpr int kExpectedDeltaInMilliseconds = 10;
-constexpr TimeDelta kConstexprTimeDelta =
-    TimeDelta::FromMilliseconds(kExpectedDeltaInMilliseconds);
-
-class MockTimeTicks : public TimeTicks {
- public:
-  static DWORD Ticker() {
-    return static_cast<int>(InterlockedIncrement(&ticker_));
-  }
-
-  static void InstallTicker() {
-    old_tick_function_ = SetMockTickFunction(&Ticker);
-    ticker_ = -5;
-  }
-
-  static void UninstallTicker() {
-    SetMockTickFunction(old_tick_function_);
-  }
-
- private:
-  static volatile LONG ticker_;
-  static TickFunctionType old_tick_function_;
-};
-
-volatile LONG MockTimeTicks::ticker_;
-MockTimeTicks::TickFunctionType MockTimeTicks::old_tick_function_;
-
-HANDLE g_rollover_test_start;
-
-unsigned __stdcall RolloverTestThreadMain(void* param) {
-  int64_t counter = reinterpret_cast<int64_t>(param);
-  DWORD rv = WaitForSingleObject(g_rollover_test_start, INFINITE);
-  EXPECT_EQ(rv, WAIT_OBJECT_0);
-
-  TimeTicks last = TimeTicks::Now();
-  for (int index = 0; index < counter; index++) {
-    TimeTicks now = TimeTicks::Now();
-    int64_t milliseconds = (now - last).InMilliseconds();
-    // This is a tight loop; we could have looped faster than our
-    // measurements, so the time might be 0 millis.
-    EXPECT_GE(milliseconds, 0);
-    EXPECT_LT(milliseconds, 250);
-    last = now;
-  }
-  return 0;
-}
-
-}  // namespace
-
-// This test spawns many threads, and can occasionally fail due to resource
-// exhaustion in the presence of ASan.
-#if defined(ADDRESS_SANITIZER)
-#define MAYBE_WinRollover DISABLED_WinRollover
-#else
-#define MAYBE_WinRollover WinRollover
-#endif
-TEST(TimeTicks, MAYBE_WinRollover) {
-  // The internal counter rolls over at ~49days.  We'll use a mock
-  // timer to test this case.
-  // Basic test algorithm:
-  //   1) Set clock to rollover - N
-  //   2) Create N threads
-  //   3) Start the threads
-  //   4) Each thread loops through TimeTicks() N times
-  //   5) Each thread verifies integrity of result.
-
-  const int kThreads = 8;
-  // Use int64_t so we can cast into a void* without a compiler warning.
-  const int64_t kChecks = 10;
-
-  // It takes a lot of iterations to reproduce the bug!
-  // (See bug 1081395)
-  for (int loop = 0; loop < 4096; loop++) {
-    // Setup
-    MockTimeTicks::InstallTicker();
-    g_rollover_test_start = CreateEvent(0, TRUE, FALSE, 0);
-    HANDLE threads[kThreads];
-
-    for (int index = 0; index < kThreads; index++) {
-      void* argument = reinterpret_cast<void*>(kChecks);
-      unsigned thread_id;
-      threads[index] = reinterpret_cast<HANDLE>(
-        _beginthreadex(NULL, 0, RolloverTestThreadMain, argument, 0,
-          &thread_id));
-      EXPECT_NE((HANDLE)NULL, threads[index]);
-    }
-
-    // Start!
-    SetEvent(g_rollover_test_start);
-
-    // Wait for threads to finish
-    for (int index = 0; index < kThreads; index++) {
-      DWORD rv = WaitForSingleObject(threads[index], INFINITE);
-      EXPECT_EQ(rv, WAIT_OBJECT_0);
-      // Since using _beginthreadex() (as opposed to _beginthread),
-      // an explicit CloseHandle() is supposed to be called.
-      CloseHandle(threads[index]);
-    }
-
-    CloseHandle(g_rollover_test_start);
-
-    // Teardown
-    MockTimeTicks::UninstallTicker();
-  }
-}
-
-TEST(TimeTicks, SubMillisecondTimers) {
-  // IsHighResolution() is false on some systems.  Since the product still works
-  // even if it's false, it makes this entire test questionable.
-  if (!TimeTicks::IsHighResolution())
-    return;
-
-  const int kRetries = 1000;
-  bool saw_submillisecond_timer = false;
-
-  // Run kRetries attempts to see a sub-millisecond timer.
-  for (int index = 0; index < kRetries; index++) {
-    TimeTicks last_time = TimeTicks::Now();
-    TimeDelta delta;
-    // Spin until the clock has detected a change.
-    do {
-      delta = TimeTicks::Now() - last_time;
-    } while (delta.InMicroseconds() == 0);
-    if (delta.InMicroseconds() < 1000) {
-      saw_submillisecond_timer = true;
-      break;
-    }
-  }
-  EXPECT_TRUE(saw_submillisecond_timer);
-}
-
-TEST(TimeTicks, TimeGetTimeCaps) {
-  // Test some basic assumptions that we expect about how timeGetDevCaps works.
-
-  TIMECAPS caps;
-  MMRESULT status = timeGetDevCaps(&caps, sizeof(caps));
-  ASSERT_EQ(static_cast<MMRESULT>(MMSYSERR_NOERROR), status);
-
-  EXPECT_GE(static_cast<int>(caps.wPeriodMin), 1);
-  EXPECT_GT(static_cast<int>(caps.wPeriodMax), 1);
-  EXPECT_GE(static_cast<int>(caps.wPeriodMin), 1);
-  EXPECT_GT(static_cast<int>(caps.wPeriodMax), 1);
-  printf("timeGetTime range is %d to %dms\n", caps.wPeriodMin,
-    caps.wPeriodMax);
-}
-
-TEST(TimeTicks, QueryPerformanceFrequency) {
-  // Test some basic assumptions that we expect about QPC.
-
-  LARGE_INTEGER frequency;
-  BOOL rv = QueryPerformanceFrequency(&frequency);
-  EXPECT_EQ(TRUE, rv);
-  EXPECT_GT(frequency.QuadPart, 1000000);  // Expect at least 1MHz
-  printf("QueryPerformanceFrequency is %5.2fMHz\n",
-    frequency.QuadPart / 1000000.0);
-}
-
-TEST(TimeTicks, TimerPerformance) {
-  // Verify that various timer mechanisms can always complete quickly.
-  // Note:  This is a somewhat arbitrary test.
-  const int kLoops = 10000;
-
-  typedef TimeTicks (*TestFunc)();
-  struct TestCase {
-    TestFunc func;
-    const char *description;
-  };
-  // Cheating a bit here:  assumes sizeof(TimeTicks) == sizeof(Time)
-  // in order to create a single test case list.
-  static_assert(sizeof(TimeTicks) == sizeof(Time),
-                "TimeTicks and Time must be the same size");
-  std::vector<TestCase> cases;
-  cases.push_back({reinterpret_cast<TestFunc>(&Time::Now), "Time::Now"});
-  cases.push_back({&TimeTicks::Now, "TimeTicks::Now"});
-
-  if (ThreadTicks::IsSupported()) {
-    ThreadTicks::WaitUntilInitialized();
-    cases.push_back(
-        {reinterpret_cast<TestFunc>(&ThreadTicks::Now), "ThreadTicks::Now"});
-  }
-
-  for (const auto& test_case : cases) {
-    TimeTicks start = TimeTicks::Now();
-    for (int index = 0; index < kLoops; index++)
-      test_case.func();
-    TimeTicks stop = TimeTicks::Now();
-    // Turning off the check for acceptible delays.  Without this check,
-    // the test really doesn't do much other than measure.  But the
-    // measurements are still useful for testing timers on various platforms.
-    // The reason to remove the check is because the tests run on many
-    // buildbots, some of which are VMs.  These machines can run horribly
-    // slow, and there is really no value for checking against a max timer.
-    //const int kMaxTime = 35;  // Maximum acceptible milliseconds for test.
-    //EXPECT_LT((stop - start).InMilliseconds(), kMaxTime);
-    printf("%s: %1.2fus per call\n", test_case.description,
-           (stop - start).InMillisecondsF() * 1000 / kLoops);
-  }
-}
-
-TEST(TimeTicks, TSCTicksPerSecond) {
-  if (ThreadTicks::IsSupported()) {
-    ThreadTicks::WaitUntilInitialized();
-
-    // Read the CPU frequency from the registry.
-    base::win::RegKey processor_key(
-        HKEY_LOCAL_MACHINE,
-        L"Hardware\\Description\\System\\CentralProcessor\\0", KEY_QUERY_VALUE);
-    ASSERT_TRUE(processor_key.Valid());
-    DWORD processor_mhz_from_registry;
-    ASSERT_EQ(ERROR_SUCCESS,
-              processor_key.ReadValueDW(L"~MHz", &processor_mhz_from_registry));
-
-    // Expect the measured TSC frequency to be similar to the processor
-    // frequency from the registry (0.5% error).
-    double tsc_mhz_measured = ThreadTicks::TSCTicksPerSecond() / 1e6;
-    EXPECT_NEAR(tsc_mhz_measured, processor_mhz_from_registry,
-                0.005 * processor_mhz_from_registry);
-  }
-}
-
-TEST(TimeTicks, FromQPCValue) {
-  if (!TimeTicks::IsHighResolution())
-    return;
-
-  LARGE_INTEGER frequency;
-  ASSERT_TRUE(QueryPerformanceFrequency(&frequency));
-  const int64_t ticks_per_second = frequency.QuadPart;
-  ASSERT_GT(ticks_per_second, 0);
-
-  // Generate the tick values to convert, advancing the tick count by varying
-  // amounts.  These values will ensure that both the fast and overflow-safe
-  // conversion logic in FromQPCValue() is tested, and across the entire range
-  // of possible QPC tick values.
-  std::vector<int64_t> test_cases;
-  test_cases.push_back(0);
-  const int kNumAdvancements = 100;
-  int64_t ticks = 0;
-  int64_t ticks_increment = 10;
-  for (int i = 0; i < kNumAdvancements; ++i) {
-    test_cases.push_back(ticks);
-    ticks += ticks_increment;
-    ticks_increment = ticks_increment * 6 / 5;
-  }
-  test_cases.push_back(Time::kQPCOverflowThreshold - 1);
-  test_cases.push_back(Time::kQPCOverflowThreshold);
-  test_cases.push_back(Time::kQPCOverflowThreshold + 1);
-  ticks = Time::kQPCOverflowThreshold + 10;
-  ticks_increment = 10;
-  for (int i = 0; i < kNumAdvancements; ++i) {
-    test_cases.push_back(ticks);
-    ticks += ticks_increment;
-    ticks_increment = ticks_increment * 6 / 5;
-  }
-  test_cases.push_back(std::numeric_limits<int64_t>::max());
-
-  // Test that the conversions using FromQPCValue() match those computed here
-  // using simple floating-point arithmetic.  The floating-point math provides
-  // enough precision for all reasonable values to confirm that the
-  // implementation is correct to the microsecond, and for "very large" values
-  // it confirms that the answer is very close to correct.
-  for (int64_t ticks : test_cases) {
-    const double expected_microseconds_since_origin =
-        (static_cast<double>(ticks) * Time::kMicrosecondsPerSecond) /
-            ticks_per_second;
-    const TimeTicks converted_value = TimeTicks::FromQPCValue(ticks);
-    const double converted_microseconds_since_origin =
-        static_cast<double>((converted_value - TimeTicks()).InMicroseconds());
-    // When we test with very large numbers we end up in a range where adjacent
-    // double values are far apart - 512.0 apart in one test failure. In that
-    // situation it makes no sense for our epsilon to be 1.0 - it should be
-    // the difference between adjacent doubles.
-    double epsilon = nextafter(expected_microseconds_since_origin, INFINITY) -
-                     expected_microseconds_since_origin;
-    // Epsilon must be at least 1.0 because converted_microseconds_since_origin
-    // comes from an integral value and the rounding is not perfect.
-    if (epsilon < 1.0)
-      epsilon = 1.0;
-    EXPECT_NEAR(expected_microseconds_since_origin,
-                converted_microseconds_since_origin, epsilon)
-        << "ticks=" << ticks << ", to be converted via logic path: "
-        << (ticks < Time::kQPCOverflowThreshold ? "FAST" : "SAFE");
-  }
-}
-
-TEST(TimeDelta, ConstexprInitialization) {
-  // Make sure that TimeDelta works around crbug.com/635974
-  EXPECT_EQ(kExpectedDeltaInMilliseconds, kConstexprTimeDelta.InMilliseconds());
-}
-
-TEST(TimeDelta, FromFileTime) {
-  FILETIME ft;
-  ft.dwLowDateTime = 1001;
-  ft.dwHighDateTime = 0;
-
-  // 100100 ns ~= 100 us.
-  EXPECT_EQ(TimeDelta::FromMicroseconds(100), TimeDelta::FromFileTime(ft));
-
-  ft.dwLowDateTime = 0;
-  ft.dwHighDateTime = 1;
-
-  // 2^32 * 100 ns ~= 2^32 * 10 us.
-  EXPECT_EQ(TimeDelta::FromMicroseconds((1ull << 32) / 10),
-            TimeDelta::FromFileTime(ft));
-}
-
-TEST(HighResolutionTimer, GetUsage) {
-  EXPECT_EQ(0.0, Time::GetHighResolutionTimerUsage());
-
-  Time::ResetHighResolutionTimerUsage();
-
-  // 0% usage since the timer isn't activated regardless of how much time has
-  // elapsed.
-  EXPECT_EQ(0.0, Time::GetHighResolutionTimerUsage());
-  Sleep(10);
-  EXPECT_EQ(0.0, Time::GetHighResolutionTimerUsage());
-
-  Time::ActivateHighResolutionTimer(true);
-  Time::ResetHighResolutionTimerUsage();
-
-  Sleep(20);
-  // 100% usage since the timer has been activated entire time.
-  EXPECT_EQ(100.0, Time::GetHighResolutionTimerUsage());
-
-  Time::ActivateHighResolutionTimer(false);
-  Sleep(20);
-  double usage1 = Time::GetHighResolutionTimerUsage();
-  // usage1 should be about 50%.
-  EXPECT_LT(usage1, 100.0);
-  EXPECT_GT(usage1, 0.0);
-
-  Time::ActivateHighResolutionTimer(true);
-  Sleep(10);
-  Time::ActivateHighResolutionTimer(false);
-  double usage2 = Time::GetHighResolutionTimerUsage();
-  // usage2 should be about 60%.
-  EXPECT_LT(usage2, 100.0);
-  EXPECT_GT(usage2, usage1);
-
-  Time::ResetHighResolutionTimerUsage();
-  EXPECT_EQ(0.0, Time::GetHighResolutionTimerUsage());
-}
-
-}  // namespace base
diff --git a/base/timer/hi_res_timer_manager_unittest.cc b/base/timer/hi_res_timer_manager_unittest.cc
deleted file mode 100644
index 3860c09..0000000
--- a/base/timer/hi_res_timer_manager_unittest.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/timer/hi_res_timer_manager.h"
-
-#include <memory>
-#include <utility>
-
-#include "base/power_monitor/power_monitor.h"
-#include "base/power_monitor/power_monitor_device_source.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-#if defined(OS_WIN)
-TEST(HiResTimerManagerTest, ToggleOnOff) {
-  // The power monitor creates Window to receive power notifications from
-  // Windows, which makes this test flaky if you run while the machine
-  // goes in or out of AC power.
-  test::ScopedTaskEnvironment scoped_task_environment(
-      test::ScopedTaskEnvironment::MainThreadType::UI);
-  std::unique_ptr<base::PowerMonitorSource> power_monitor_source(
-      new base::PowerMonitorDeviceSource());
-  std::unique_ptr<base::PowerMonitor> power_monitor(
-      new base::PowerMonitor(std::move(power_monitor_source)));
-
-  HighResolutionTimerManager manager;
-  // Simulate a on-AC power event to get to a known initial state.
-  manager.OnPowerStateChange(false);
-
-  // Loop a few times to test power toggling.
-  for (int times = 0; times != 3; ++times) {
-    // The manager has the high resolution clock enabled now.
-    EXPECT_TRUE(manager.hi_res_clock_available());
-    // But the Time class has it off, because it hasn't been activated.
-    EXPECT_FALSE(base::Time::IsHighResolutionTimerInUse());
-
-    // Activate the high resolution timer.
-    base::Time::ActivateHighResolutionTimer(true);
-    EXPECT_TRUE(base::Time::IsHighResolutionTimerInUse());
-
-    // Simulate a on-battery power event.
-    manager.OnPowerStateChange(true);
-    EXPECT_FALSE(manager.hi_res_clock_available());
-    EXPECT_FALSE(base::Time::IsHighResolutionTimerInUse());
-
-    // Back to on-AC power.
-    manager.OnPowerStateChange(false);
-    EXPECT_TRUE(manager.hi_res_clock_available());
-    EXPECT_TRUE(base::Time::IsHighResolutionTimerInUse());
-
-    // De-activate the high resolution timer.
-    base::Time::ActivateHighResolutionTimer(false);
-  }
-}
-#endif  // defined(OS_WIN)
-
-}  // namespace base
diff --git a/base/timer/mock_timer_unittest.cc b/base/timer/mock_timer_unittest.cc
deleted file mode 100644
index 61716a4..0000000
--- a/base/timer/mock_timer_unittest.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/timer/mock_timer.h"
-
-#include "base/macros.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-void CallMeMaybe(int *number) {
-  (*number)++;
-}
-
-TEST(MockTimerTest, FiresOnce) {
-  int calls = 0;
-  base::MockTimer timer(false, false);
-  base::TimeDelta delay = base::TimeDelta::FromSeconds(2);
-  timer.Start(FROM_HERE, delay,
-              base::Bind(&CallMeMaybe,
-                         base::Unretained(&calls)));
-  EXPECT_EQ(delay, timer.GetCurrentDelay());
-  EXPECT_TRUE(timer.IsRunning());
-  timer.Fire();
-  EXPECT_FALSE(timer.IsRunning());
-  EXPECT_EQ(1, calls);
-}
-
-TEST(MockTimerTest, FiresRepeatedly) {
-  int calls = 0;
-  base::MockTimer timer(true, true);
-  base::TimeDelta delay = base::TimeDelta::FromSeconds(2);
-  timer.Start(FROM_HERE, delay,
-              base::Bind(&CallMeMaybe,
-                         base::Unretained(&calls)));
-  timer.Fire();
-  EXPECT_TRUE(timer.IsRunning());
-  timer.Fire();
-  timer.Fire();
-  EXPECT_TRUE(timer.IsRunning());
-  EXPECT_EQ(3, calls);
-}
-
-TEST(MockTimerTest, Stops) {
-  int calls = 0;
-  base::MockTimer timer(true, true);
-  base::TimeDelta delay = base::TimeDelta::FromSeconds(2);
-  timer.Start(FROM_HERE, delay,
-              base::Bind(&CallMeMaybe,
-                         base::Unretained(&calls)));
-  EXPECT_TRUE(timer.IsRunning());
-  timer.Stop();
-  EXPECT_FALSE(timer.IsRunning());
-}
-
-class HasWeakPtr : public base::SupportsWeakPtr<HasWeakPtr> {
- public:
-  HasWeakPtr() = default;
-  virtual ~HasWeakPtr() = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(HasWeakPtr);
-};
-
-TEST(MockTimerTest, DoesNotRetainClosure) {
-  HasWeakPtr *has_weak_ptr = new HasWeakPtr();
-  base::WeakPtr<HasWeakPtr> weak_ptr(has_weak_ptr->AsWeakPtr());
-  base::MockTimer timer(false, false);
-  base::TimeDelta delay = base::TimeDelta::FromSeconds(2);
-  ASSERT_TRUE(weak_ptr.get());
-  timer.Start(FROM_HERE, delay,
-              base::Bind(base::DoNothing::Repeatedly<HasWeakPtr*>(),
-                         base::Owned(has_weak_ptr)));
-  ASSERT_TRUE(weak_ptr.get());
-  timer.Fire();
-  ASSERT_FALSE(weak_ptr.get());
-}
-
-}  // namespace
diff --git a/base/timer/timer_unittest.cc b/base/timer/timer_unittest.cc
deleted file mode 100644
index ae587bf..0000000
--- a/base/timer/timer_unittest.cc
+++ /dev/null
@@ -1,904 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/timer/timer.h"
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/sequenced_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/test/test_mock_time_task_runner.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread.h"
-#include "base/time/tick_clock.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-// The message loops on which each timer should be tested.
-const MessageLoop::Type testing_message_loops[] = {
-    MessageLoop::TYPE_DEFAULT, MessageLoop::TYPE_IO,
-#if !defined(OS_IOS)  // iOS does not allow direct running of the UI loop.
-    MessageLoop::TYPE_UI,
-#endif
-};
-
-const int kNumTestingMessageLoops = arraysize(testing_message_loops);
-
-class Receiver {
- public:
-  Receiver() : count_(0) {}
-  void OnCalled() { count_++; }
-  bool WasCalled() { return count_ > 0; }
-  int TimesCalled() { return count_; }
-
- private:
-  int count_;
-};
-
-// A basic helper class that can start a one-shot timer and signal a
-// WaitableEvent when this timer fires.
-class OneShotTimerTesterBase {
- public:
-  // |did_run|, if provided, will be signaled when Run() fires.
-  explicit OneShotTimerTesterBase(
-      WaitableEvent* did_run = nullptr,
-      const TimeDelta& delay = TimeDelta::FromMilliseconds(10))
-      : did_run_(did_run), delay_(delay) {}
-
-  virtual ~OneShotTimerTesterBase() = default;
-
-  void Start() {
-    started_time_ = TimeTicks::Now();
-    timer_->Start(FROM_HERE, delay_, this, &OneShotTimerTesterBase::Run);
-  }
-
-  bool IsRunning() { return timer_->IsRunning(); }
-
-  TimeTicks started_time() const { return started_time_; }
-  TimeDelta delay() const { return delay_; }
-
- protected:
-  virtual void Run() {
-    if (did_run_) {
-      EXPECT_FALSE(did_run_->IsSignaled());
-      did_run_->Signal();
-    }
-  }
-
-  std::unique_ptr<OneShotTimer> timer_ = std::make_unique<OneShotTimer>();
-
- private:
-  WaitableEvent* const did_run_;
-  const TimeDelta delay_;
-  TimeTicks started_time_;
-
-  DISALLOW_COPY_AND_ASSIGN(OneShotTimerTesterBase);
-};
-
-// Extends functionality of OneShotTimerTesterBase with the abilities to wait
-// until the timer fires and to change task runner for the timer.
-class OneShotTimerTester : public OneShotTimerTesterBase {
- public:
-  // |did_run|, if provided, will be signaled when Run() fires.
-  explicit OneShotTimerTester(
-      WaitableEvent* did_run = nullptr,
-      const TimeDelta& delay = TimeDelta::FromMilliseconds(10))
-      : OneShotTimerTesterBase(did_run, delay),
-        quit_closure_(run_loop_.QuitClosure()) {}
-
-  ~OneShotTimerTester() override = default;
-
-  void SetTaskRunner(scoped_refptr<SequencedTaskRunner> task_runner) {
-    timer_->SetTaskRunner(std::move(task_runner));
-
-    // Run() will be invoked on |task_runner| but |run_loop_|'s QuitClosure
-    // needs to run on this thread (where the MessageLoop lives).
-    quit_closure_ = Bind(IgnoreResult(&SequencedTaskRunner::PostTask),
-                         SequencedTaskRunnerHandle::Get(), FROM_HERE,
-                         run_loop_.QuitClosure());
-  }
-
-  // Blocks until Run() executes and confirms that Run() didn't fire before
-  // |delay_| expired.
-  void WaitAndConfirmTimerFiredAfterDelay() {
-    run_loop_.Run();
-
-    EXPECT_NE(TimeTicks(), started_time());
-    EXPECT_GE(TimeTicks::Now() - started_time(), delay());
-  }
-
- protected:
-  // Overridable method to do things on Run() before signaling events/closures
-  // managed by this helper.
-  virtual void OnRun() {}
-
- private:
-  void Run() override {
-    OnRun();
-    OneShotTimerTesterBase::Run();
-    quit_closure_.Run();
-  }
-
-  RunLoop run_loop_;
-  Closure quit_closure_;
-
-  DISALLOW_COPY_AND_ASSIGN(OneShotTimerTester);
-};
-
-class OneShotSelfDeletingTimerTester : public OneShotTimerTester {
- protected:
-  void OnRun() override { timer_.reset(); }
-};
-
-constexpr int kNumRepeats = 10;
-
-class RepeatingTimerTester {
- public:
-  explicit RepeatingTimerTester(WaitableEvent* did_run, const TimeDelta& delay)
-      : counter_(kNumRepeats),
-        quit_closure_(run_loop_.QuitClosure()),
-        did_run_(did_run),
-        delay_(delay) {}
-
-  void Start() {
-    started_time_ = TimeTicks::Now();
-    timer_.Start(FROM_HERE, delay_, this, &RepeatingTimerTester::Run);
-  }
-
-  void WaitAndConfirmTimerFiredRepeatedlyAfterDelay() {
-    run_loop_.Run();
-
-    EXPECT_NE(TimeTicks(), started_time_);
-    EXPECT_GE(TimeTicks::Now() - started_time_, kNumRepeats * delay_);
-  }
-
- private:
-  void Run() {
-    if (--counter_ == 0) {
-      if (did_run_) {
-        EXPECT_FALSE(did_run_->IsSignaled());
-        did_run_->Signal();
-      }
-      timer_.Stop();
-      quit_closure_.Run();
-    }
-  }
-
-  RepeatingTimer timer_;
-  int counter_;
-
-  RunLoop run_loop_;
-  Closure quit_closure_;
-  WaitableEvent* const did_run_;
-
-  const TimeDelta delay_;
-  TimeTicks started_time_;
-
-  DISALLOW_COPY_AND_ASSIGN(RepeatingTimerTester);
-};
-
-// Basic test with same setup as RunTest_OneShotTimers_Cancel below to confirm
-// that |did_run_a| would be signaled in that test if it wasn't for the
-// deletion.
-void RunTest_OneShotTimers(MessageLoop::Type message_loop_type) {
-  MessageLoop loop(message_loop_type);
-
-  WaitableEvent did_run_a(WaitableEvent::ResetPolicy::MANUAL,
-                          WaitableEvent::InitialState::NOT_SIGNALED);
-  OneShotTimerTester a(&did_run_a);
-  a.Start();
-
-  OneShotTimerTester b;
-  b.Start();
-
-  b.WaitAndConfirmTimerFiredAfterDelay();
-
-  EXPECT_TRUE(did_run_a.IsSignaled());
-}
-
-void RunTest_OneShotTimers_Cancel(MessageLoop::Type message_loop_type) {
-  MessageLoop loop(message_loop_type);
-
-  WaitableEvent did_run_a(WaitableEvent::ResetPolicy::MANUAL,
-                          WaitableEvent::InitialState::NOT_SIGNALED);
-  OneShotTimerTester* a = new OneShotTimerTester(&did_run_a);
-
-  // This should run before the timer expires.
-  SequencedTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, a);
-
-  // Now start the timer.
-  a->Start();
-
-  OneShotTimerTester b;
-  b.Start();
-
-  b.WaitAndConfirmTimerFiredAfterDelay();
-
-  EXPECT_FALSE(did_run_a.IsSignaled());
-}
-
-void RunTest_OneShotSelfDeletingTimer(MessageLoop::Type message_loop_type) {
-  MessageLoop loop(message_loop_type);
-
-  OneShotSelfDeletingTimerTester f;
-  f.Start();
-  f.WaitAndConfirmTimerFiredAfterDelay();
-}
-
-void RunTest_RepeatingTimer(MessageLoop::Type message_loop_type,
-                            const TimeDelta& delay) {
-  MessageLoop loop(message_loop_type);
-
-  RepeatingTimerTester f(nullptr, delay);
-  f.Start();
-  f.WaitAndConfirmTimerFiredRepeatedlyAfterDelay();
-}
-
-void RunTest_RepeatingTimer_Cancel(MessageLoop::Type message_loop_type,
-                                   const TimeDelta& delay) {
-  MessageLoop loop(message_loop_type);
-
-  WaitableEvent did_run_a(WaitableEvent::ResetPolicy::MANUAL,
-                          WaitableEvent::InitialState::NOT_SIGNALED);
-  RepeatingTimerTester* a = new RepeatingTimerTester(&did_run_a, delay);
-
-  // This should run before the timer expires.
-  SequencedTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, a);
-
-  // Now start the timer.
-  a->Start();
-
-  RepeatingTimerTester b(nullptr, delay);
-  b.Start();
-
-  b.WaitAndConfirmTimerFiredRepeatedlyAfterDelay();
-
-  // |a| should not have fired despite |b| starting after it on the same
-  // sequence and being complete by now.
-  EXPECT_FALSE(did_run_a.IsSignaled());
-}
-
-class DelayTimerTarget {
- public:
-  bool signaled() const { return signaled_; }
-
-  void Signal() {
-    ASSERT_FALSE(signaled_);
-    signaled_ = true;
-  }
-
- private:
-  bool signaled_ = false;
-};
-
-void RunTest_DelayTimer_NoCall(MessageLoop::Type message_loop_type) {
-  MessageLoop loop(message_loop_type);
-
-  // If Delay is never called, the timer shouldn't go off.
-  DelayTimerTarget target;
-  DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target,
-                   &DelayTimerTarget::Signal);
-
-  OneShotTimerTester tester;
-  tester.Start();
-  tester.WaitAndConfirmTimerFiredAfterDelay();
-
-  ASSERT_FALSE(target.signaled());
-}
-
-void RunTest_DelayTimer_OneCall(MessageLoop::Type message_loop_type) {
-  MessageLoop loop(message_loop_type);
-
-  DelayTimerTarget target;
-  DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(1), &target,
-                   &DelayTimerTarget::Signal);
-  timer.Reset();
-
-  OneShotTimerTester tester(nullptr, TimeDelta::FromMilliseconds(100));
-  tester.Start();
-  tester.WaitAndConfirmTimerFiredAfterDelay();
-
-  ASSERT_TRUE(target.signaled());
-}
-
-struct ResetHelper {
-  ResetHelper(DelayTimer* timer, DelayTimerTarget* target)
-      : timer_(timer), target_(target) {}
-
-  void Reset() {
-    ASSERT_FALSE(target_->signaled());
-    timer_->Reset();
-  }
-
- private:
-  DelayTimer* const timer_;
-  DelayTimerTarget* const target_;
-};
-
-void RunTest_DelayTimer_Reset(MessageLoop::Type message_loop_type) {
-  MessageLoop loop(message_loop_type);
-
-  // If Delay is never called, the timer shouldn't go off.
-  DelayTimerTarget target;
-  DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target,
-                   &DelayTimerTarget::Signal);
-  timer.Reset();
-
-  ResetHelper reset_helper(&timer, &target);
-
-  OneShotTimer timers[20];
-  for (size_t i = 0; i < arraysize(timers); ++i) {
-    timers[i].Start(FROM_HERE, TimeDelta::FromMilliseconds(i * 10),
-                    &reset_helper, &ResetHelper::Reset);
-  }
-
-  OneShotTimerTester tester(nullptr, TimeDelta::FromMilliseconds(300));
-  tester.Start();
-  tester.WaitAndConfirmTimerFiredAfterDelay();
-
-  ASSERT_TRUE(target.signaled());
-}
-
-class DelayTimerFatalTarget {
- public:
-  void Signal() {
-    ASSERT_TRUE(false);
-  }
-};
-
-void RunTest_DelayTimer_Deleted(MessageLoop::Type message_loop_type) {
-  MessageLoop loop(message_loop_type);
-
-  DelayTimerFatalTarget target;
-
-  {
-    DelayTimer timer(FROM_HERE, TimeDelta::FromMilliseconds(50), &target,
-                     &DelayTimerFatalTarget::Signal);
-    timer.Reset();
-  }
-
-  // When the timer is deleted, the DelayTimerFatalTarget should never be
-  // called.
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(100));
-}
-
-}  // namespace
-
-//-----------------------------------------------------------------------------
-// Each test is run against each type of MessageLoop.  That way we are sure
-// that timers work properly in all configurations.
-
-TEST(TimerTest, OneShotTimers) {
-  for (int i = 0; i < kNumTestingMessageLoops; i++) {
-    RunTest_OneShotTimers(testing_message_loops[i]);
-  }
-}
-
-TEST(TimerTest, OneShotTimers_Cancel) {
-  for (int i = 0; i < kNumTestingMessageLoops; i++) {
-    RunTest_OneShotTimers_Cancel(testing_message_loops[i]);
-  }
-}
-
-// If underline timer does not handle properly, we will crash or fail
-// in full page heap environment.
-TEST(TimerTest, OneShotSelfDeletingTimer) {
-  for (int i = 0; i < kNumTestingMessageLoops; i++) {
-    RunTest_OneShotSelfDeletingTimer(testing_message_loops[i]);
-  }
-}
-
-TEST(TimerTest, OneShotTimer_CustomTaskRunner) {
-  // A MessageLoop is required for the timer events on the other thread to
-  // communicate back to the Timer under test.
-  MessageLoop loop;
-
-  Thread other_thread("OneShotTimer_CustomTaskRunner");
-  other_thread.Start();
-
-  WaitableEvent did_run(WaitableEvent::ResetPolicy::MANUAL,
-                        WaitableEvent::InitialState::NOT_SIGNALED);
-  OneShotTimerTester f(&did_run);
-  f.SetTaskRunner(other_thread.task_runner());
-  f.Start();
-  EXPECT_TRUE(f.IsRunning() || did_run.IsSignaled());
-
-  f.WaitAndConfirmTimerFiredAfterDelay();
-  EXPECT_TRUE(did_run.IsSignaled());
-
-  // |f| should already have communicated back to this |loop| before invoking
-  // Run() and as such this thread should already be aware that |f| is no longer
-  // running.
-  EXPECT_TRUE(loop.IsIdleForTesting());
-  EXPECT_FALSE(f.IsRunning());
-}
-
-TEST(TimerTest, OneShotTimerWithTickClock) {
-  scoped_refptr<TestMockTimeTaskRunner> task_runner(
-      new TestMockTimeTaskRunner(Time::Now(), TimeTicks::Now()));
-  MessageLoop message_loop;
-  message_loop.SetTaskRunner(task_runner);
-  Receiver receiver;
-  OneShotTimer timer(task_runner->GetMockTickClock());
-  timer.Start(FROM_HERE, TimeDelta::FromSeconds(1),
-              Bind(&Receiver::OnCalled, Unretained(&receiver)));
-  task_runner->FastForwardBy(TimeDelta::FromSeconds(1));
-  EXPECT_TRUE(receiver.WasCalled());
-}
-
-TEST(TimerTest, RepeatingTimer) {
-  for (int i = 0; i < kNumTestingMessageLoops; i++) {
-    RunTest_RepeatingTimer(testing_message_loops[i],
-                           TimeDelta::FromMilliseconds(10));
-  }
-}
-
-TEST(TimerTest, RepeatingTimer_Cancel) {
-  for (int i = 0; i < kNumTestingMessageLoops; i++) {
-    RunTest_RepeatingTimer_Cancel(testing_message_loops[i],
-                                  TimeDelta::FromMilliseconds(10));
-  }
-}
-
-TEST(TimerTest, RepeatingTimerZeroDelay) {
-  for (int i = 0; i < kNumTestingMessageLoops; i++) {
-    RunTest_RepeatingTimer(testing_message_loops[i],
-                           TimeDelta::FromMilliseconds(0));
-  }
-}
-
-TEST(TimerTest, RepeatingTimerZeroDelay_Cancel) {
-  for (int i = 0; i < kNumTestingMessageLoops; i++) {
-    RunTest_RepeatingTimer_Cancel(testing_message_loops[i],
-                                  TimeDelta::FromMilliseconds(0));
-  }
-}
-
-TEST(TimerTest, RepeatingTimerWithTickClock) {
-  scoped_refptr<TestMockTimeTaskRunner> task_runner(
-      new TestMockTimeTaskRunner(Time::Now(), TimeTicks::Now()));
-  MessageLoop message_loop;
-  message_loop.SetTaskRunner(task_runner);
-  Receiver receiver;
-  const int expected_times_called = 10;
-  RepeatingTimer timer(task_runner->GetMockTickClock());
-  timer.Start(FROM_HERE, TimeDelta::FromSeconds(1),
-              Bind(&Receiver::OnCalled, Unretained(&receiver)));
-  task_runner->FastForwardBy(TimeDelta::FromSeconds(expected_times_called));
-  timer.Stop();
-  EXPECT_EQ(expected_times_called, receiver.TimesCalled());
-}
-
-TEST(TimerTest, DelayTimer_NoCall) {
-  for (int i = 0; i < kNumTestingMessageLoops; i++) {
-    RunTest_DelayTimer_NoCall(testing_message_loops[i]);
-  }
-}
-
-TEST(TimerTest, DelayTimer_OneCall) {
-  for (int i = 0; i < kNumTestingMessageLoops; i++) {
-    RunTest_DelayTimer_OneCall(testing_message_loops[i]);
-  }
-}
-
-// It's flaky on the buildbot, http://crbug.com/25038.
-TEST(TimerTest, DISABLED_DelayTimer_Reset) {
-  for (int i = 0; i < kNumTestingMessageLoops; i++) {
-    RunTest_DelayTimer_Reset(testing_message_loops[i]);
-  }
-}
-
-TEST(TimerTest, DelayTimer_Deleted) {
-  for (int i = 0; i < kNumTestingMessageLoops; i++) {
-    RunTest_DelayTimer_Deleted(testing_message_loops[i]);
-  }
-}
-
-TEST(TimerTest, DelayTimerWithTickClock) {
-  scoped_refptr<TestMockTimeTaskRunner> task_runner(
-      new TestMockTimeTaskRunner(Time::Now(), TimeTicks::Now()));
-  MessageLoop message_loop;
-  message_loop.SetTaskRunner(task_runner);
-  Receiver receiver;
-  DelayTimer timer(FROM_HERE, TimeDelta::FromSeconds(1), &receiver,
-                   &Receiver::OnCalled, task_runner->GetMockTickClock());
-  task_runner->FastForwardBy(TimeDelta::FromMilliseconds(999));
-  EXPECT_FALSE(receiver.WasCalled());
-  timer.Reset();
-  task_runner->FastForwardBy(TimeDelta::FromMilliseconds(999));
-  EXPECT_FALSE(receiver.WasCalled());
-  timer.Reset();
-  task_runner->FastForwardBy(TimeDelta::FromSeconds(1));
-  EXPECT_TRUE(receiver.WasCalled());
-}
-
-TEST(TimerTest, MessageLoopShutdown) {
-  // This test is designed to verify that shutdown of the
-  // message loop does not cause crashes if there were pending
-  // timers not yet fired.  It may only trigger exceptions
-  // if debug heap checking is enabled.
-  WaitableEvent did_run(WaitableEvent::ResetPolicy::MANUAL,
-                        WaitableEvent::InitialState::NOT_SIGNALED);
-  {
-    OneShotTimerTesterBase a(&did_run);
-    OneShotTimerTesterBase b(&did_run);
-    OneShotTimerTesterBase c(&did_run);
-    OneShotTimerTesterBase d(&did_run);
-    {
-      MessageLoop loop;
-      a.Start();
-      b.Start();
-    }  // MessageLoop destructs by falling out of scope.
-  }  // OneShotTimers destruct.  SHOULD NOT CRASH, of course.
-
-  EXPECT_FALSE(did_run.IsSignaled());
-}
-
-// Ref counted class which owns a Timer. The class passes a reference to itself
-// via the |user_task| parameter in Timer::Start(). |Timer::user_task_| might
-// end up holding the last reference to the class.
-class OneShotSelfOwningTimerTester
-    : public RefCounted<OneShotSelfOwningTimerTester> {
- public:
-  OneShotSelfOwningTimerTester() = default;
-
-  void StartTimer() {
-    // Start timer with long delay in order to test the timer getting destroyed
-    // while a timer task is still pending.
-    timer_.Start(FROM_HERE, TimeDelta::FromDays(1),
-                 base::Bind(&OneShotSelfOwningTimerTester::Run, this));
-  }
-
- private:
-  friend class RefCounted<OneShotSelfOwningTimerTester>;
-  ~OneShotSelfOwningTimerTester() = default;
-
-  void Run() {
-    ADD_FAILURE() << "Timer unexpectedly fired.";
-  }
-
-  OneShotTimer timer_;
-
-  DISALLOW_COPY_AND_ASSIGN(OneShotSelfOwningTimerTester);
-};
-
-TEST(TimerTest, MessageLoopShutdownSelfOwningTimer) {
-  // This test verifies that shutdown of the message loop does not cause crashes
-  // if there is a pending timer not yet fired and |Timer::user_task_| owns the
-  // timer. The test may only trigger exceptions if debug heap checking is
-  // enabled.
-
-  MessageLoop loop;
-  scoped_refptr<OneShotSelfOwningTimerTester> tester =
-      new OneShotSelfOwningTimerTester();
-
-  std::move(tester)->StartTimer();
-  // |Timer::user_task_| owns sole reference to |tester|.
-
-  // MessageLoop destructs by falling out of scope. SHOULD NOT CRASH.
-}
-
-void TimerTestCallback() {
-}
-
-TEST(TimerTest, NonRepeatIsRunning) {
-  {
-    MessageLoop loop;
-    Timer timer(false, false);
-    EXPECT_FALSE(timer.IsRunning());
-    timer.Start(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback));
-    EXPECT_TRUE(timer.IsRunning());
-    timer.Stop();
-    EXPECT_FALSE(timer.IsRunning());
-    EXPECT_TRUE(timer.user_task().is_null());
-  }
-
-  {
-    Timer timer(true, false);
-    MessageLoop loop;
-    EXPECT_FALSE(timer.IsRunning());
-    timer.Start(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback));
-    EXPECT_TRUE(timer.IsRunning());
-    timer.Stop();
-    EXPECT_FALSE(timer.IsRunning());
-    ASSERT_FALSE(timer.user_task().is_null());
-    timer.Reset();
-    EXPECT_TRUE(timer.IsRunning());
-  }
-}
-
-TEST(TimerTest, NonRepeatMessageLoopDeath) {
-  Timer timer(false, false);
-  {
-    MessageLoop loop;
-    EXPECT_FALSE(timer.IsRunning());
-    timer.Start(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback));
-    EXPECT_TRUE(timer.IsRunning());
-  }
-  EXPECT_FALSE(timer.IsRunning());
-  EXPECT_TRUE(timer.user_task().is_null());
-}
-
-TEST(TimerTest, RetainRepeatIsRunning) {
-  MessageLoop loop;
-  Timer timer(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback),
-              true);
-  EXPECT_FALSE(timer.IsRunning());
-  timer.Reset();
-  EXPECT_TRUE(timer.IsRunning());
-  timer.Stop();
-  EXPECT_FALSE(timer.IsRunning());
-  timer.Reset();
-  EXPECT_TRUE(timer.IsRunning());
-}
-
-TEST(TimerTest, RetainNonRepeatIsRunning) {
-  MessageLoop loop;
-  Timer timer(FROM_HERE, TimeDelta::FromDays(1), Bind(&TimerTestCallback),
-              false);
-  EXPECT_FALSE(timer.IsRunning());
-  timer.Reset();
-  EXPECT_TRUE(timer.IsRunning());
-  timer.Stop();
-  EXPECT_FALSE(timer.IsRunning());
-  timer.Reset();
-  EXPECT_TRUE(timer.IsRunning());
-}
-
-//-----------------------------------------------------------------------------
-
-namespace {
-
-bool g_callback_happened1 = false;
-bool g_callback_happened2 = false;
-
-void ClearAllCallbackHappened() {
-  g_callback_happened1 = false;
-  g_callback_happened2 = false;
-}
-
-void SetCallbackHappened1() {
-  g_callback_happened1 = true;
-  RunLoop::QuitCurrentWhenIdleDeprecated();
-}
-
-void SetCallbackHappened2() {
-  g_callback_happened2 = true;
-  RunLoop::QuitCurrentWhenIdleDeprecated();
-}
-
-}  // namespace
-
-TEST(TimerTest, ContinuationStopStart) {
-  {
-    ClearAllCallbackHappened();
-    MessageLoop loop;
-    Timer timer(false, false);
-    timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10),
-                Bind(&SetCallbackHappened1));
-    timer.Stop();
-    timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(40),
-                Bind(&SetCallbackHappened2));
-    RunLoop().Run();
-    EXPECT_FALSE(g_callback_happened1);
-    EXPECT_TRUE(g_callback_happened2);
-  }
-}
-
-TEST(TimerTest, ContinuationReset) {
-  {
-    ClearAllCallbackHappened();
-    MessageLoop loop;
-    Timer timer(false, false);
-    timer.Start(FROM_HERE, TimeDelta::FromMilliseconds(10),
-                Bind(&SetCallbackHappened1));
-    timer.Reset();
-    // Since Reset happened before task ran, the user_task must not be cleared:
-    ASSERT_FALSE(timer.user_task().is_null());
-    RunLoop().Run();
-    EXPECT_TRUE(g_callback_happened1);
-  }
-}
-
-namespace {
-
-// Fixture for tests requiring ScopedTaskEnvironment. Includes a WaitableEvent
-// so that cases may Wait() on one thread and Signal() (explicitly, or
-// implicitly via helper methods) on another.
-class TimerSequenceTest : public testing::Test {
- public:
-  TimerSequenceTest()
-      : event_(WaitableEvent::ResetPolicy::AUTOMATIC,
-               WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  // Block until Signal() is called on another thread.
-  void Wait() { event_.Wait(); }
-
-  void Signal() { event_.Signal(); }
-
-  // Helper to augment a task with a subsequent call to Signal().
-  Closure TaskWithSignal(const Closure& task) {
-    return Bind(&TimerSequenceTest::RunTaskAndSignal, Unretained(this), task);
-  }
-
-  // Create the timer.
-  void CreateTimer() { timer_.reset(new OneShotTimer); }
-
-  // Schedule an event on the timer.
-  void StartTimer(TimeDelta delay, const Closure& task) {
-    timer_->Start(FROM_HERE, delay, task);
-  }
-
-  void SetTaskRunnerForTimer(scoped_refptr<SequencedTaskRunner> task_runner) {
-    timer_->SetTaskRunner(std::move(task_runner));
-  }
-
-  // Tell the timer to abandon the task.
-  void AbandonTask() {
-    EXPECT_TRUE(timer_->IsRunning());
-    // Reset() to call Timer::AbandonScheduledTask()
-    timer_->Reset();
-    EXPECT_TRUE(timer_->IsRunning());
-    timer_->Stop();
-    EXPECT_FALSE(timer_->IsRunning());
-  }
-
-  static void VerifyAffinity(const SequencedTaskRunner* task_runner) {
-    EXPECT_TRUE(task_runner->RunsTasksInCurrentSequence());
-  }
-
-  // Delete the timer.
-  void DeleteTimer() { timer_.reset(); }
-
- private:
-  void RunTaskAndSignal(const Closure& task) {
-    task.Run();
-    Signal();
-  }
-
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
-  WaitableEvent event_;
-  std::unique_ptr<OneShotTimer> timer_;
-
-  DISALLOW_COPY_AND_ASSIGN(TimerSequenceTest);
-};
-
-}  // namespace
-
-TEST_F(TimerSequenceTest, OneShotTimerTaskOnPoolSequence) {
-  scoped_refptr<SequencedTaskRunner> task_runner =
-      base::CreateSequencedTaskRunnerWithTraits({});
-
-  base::RunLoop run_loop_;
-
-  // Timer is created on this thread.
-  CreateTimer();
-
-  // Task will execute on a pool thread.
-  SetTaskRunnerForTimer(task_runner);
-  StartTimer(TimeDelta::FromMilliseconds(1),
-             Bind(IgnoreResult(&SequencedTaskRunner::PostTask),
-                  SequencedTaskRunnerHandle::Get(), FROM_HERE,
-                  run_loop_.QuitClosure()));
-
-  // Spin the loop so that the delayed task fires on it, which will forward it
-  // to |task_runner|. And since the Timer's task is one that posts back to this
-  // MessageLoop to quit, we finally unblock.
-  run_loop_.Run();
-
-  // Timer will be destroyed on this thread.
-  DeleteTimer();
-}
-
-TEST_F(TimerSequenceTest, OneShotTimerUsedOnPoolSequence) {
-  scoped_refptr<SequencedTaskRunner> task_runner =
-      base::CreateSequencedTaskRunnerWithTraits({});
-
-  // Timer is created on this thread.
-  CreateTimer();
-
-  // Task will be scheduled from a pool thread.
-  task_runner->PostTask(
-      FROM_HERE, BindOnce(&TimerSequenceTest::StartTimer, Unretained(this),
-                          TimeDelta::FromMilliseconds(1),
-                          Bind(&TimerSequenceTest::Signal, Unretained(this))));
-  Wait();
-
-  // Timer must be destroyed on pool thread, too.
-  task_runner->PostTask(
-      FROM_HERE,
-      TaskWithSignal(Bind(&TimerSequenceTest::DeleteTimer, Unretained(this))));
-  Wait();
-}
-
-TEST_F(TimerSequenceTest, OneShotTimerTwoSequencesAbandonTask) {
-  scoped_refptr<SequencedTaskRunner> task_runner1 =
-      base::CreateSequencedTaskRunnerWithTraits({});
-  scoped_refptr<SequencedTaskRunner> task_runner2 =
-      base::CreateSequencedTaskRunnerWithTraits({});
-
-  // Create timer on sequence #1.
-  task_runner1->PostTask(
-      FROM_HERE,
-      TaskWithSignal(Bind(&TimerSequenceTest::CreateTimer, Unretained(this))));
-  Wait();
-
-  // And tell it to execute on a different sequence (#2).
-  task_runner1->PostTask(
-      FROM_HERE, TaskWithSignal(Bind(&TimerSequenceTest::SetTaskRunnerForTimer,
-                                     Unretained(this), task_runner2)));
-  Wait();
-
-  // Task will be scheduled from sequence #1.
-  task_runner1->PostTask(
-      FROM_HERE, BindOnce(&TimerSequenceTest::StartTimer, Unretained(this),
-                          TimeDelta::FromHours(1), DoNothing()));
-
-  // Abandon task - must be called from scheduling sequence (#1).
-  task_runner1->PostTask(
-      FROM_HERE,
-      TaskWithSignal(Bind(&TimerSequenceTest::AbandonTask, Unretained(this))));
-  Wait();
-
-  // Timer must be destroyed on the sequence it was scheduled from (#1).
-  task_runner1->PostTask(
-      FROM_HERE,
-      TaskWithSignal(Bind(&TimerSequenceTest::DeleteTimer, Unretained(this))));
-  Wait();
-}
-
-TEST_F(TimerSequenceTest, OneShotTimerUsedAndTaskedOnDifferentSequences) {
-  scoped_refptr<SequencedTaskRunner> task_runner1 =
-      base::CreateSequencedTaskRunnerWithTraits({});
-  scoped_refptr<SequencedTaskRunner> task_runner2 =
-      base::CreateSequencedTaskRunnerWithTraits({});
-
-  // Create timer on sequence #1.
-  task_runner1->PostTask(
-      FROM_HERE,
-      TaskWithSignal(Bind(&TimerSequenceTest::CreateTimer, Unretained(this))));
-  Wait();
-
-  // And tell it to execute on a different sequence (#2).
-  task_runner1->PostTask(
-      FROM_HERE, TaskWithSignal(Bind(&TimerSequenceTest::SetTaskRunnerForTimer,
-                                     Unretained(this), task_runner2)));
-  Wait();
-
-  // Task will be scheduled from sequence #1.
-  task_runner1->PostTask(
-      FROM_HERE,
-      BindOnce(&TimerSequenceTest::StartTimer, Unretained(this),
-               TimeDelta::FromMilliseconds(1),
-               TaskWithSignal(Bind(&TimerSequenceTest::VerifyAffinity,
-                                   Unretained(task_runner2.get())))));
-
-  Wait();
-
-  // Timer must be destroyed on the sequence it was scheduled from (#1).
-  task_runner1->PostTask(
-      FROM_HERE,
-      TaskWithSignal(Bind(&TimerSequenceTest::DeleteTimer, Unretained(this))));
-  Wait();
-}
-
-}  // namespace base
diff --git a/base/tools_sanity_unittest.cc b/base/tools_sanity_unittest.cc
deleted file mode 100644
index 761559e..0000000
--- a/base/tools_sanity_unittest.cc
+++ /dev/null
@@ -1,387 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This file contains intentional memory errors, some of which may lead to
-// crashes if the test is ran without special memory testing tools. We use these
-// errors to verify the sanity of the tools.
-
-#include <stddef.h>
-
-#include "base/atomicops.h"
-#include "base/debug/asan_invalid_access.h"
-#include "base/debug/profiler.h"
-#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
-#include "base/threading/thread.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-const base::subtle::Atomic32 kMagicValue = 42;
-
-// Helper for memory accesses that can potentially corrupt memory or cause a
-// crash during a native run.
-#if defined(ADDRESS_SANITIZER)
-#if defined(OS_IOS)
-// EXPECT_DEATH is not supported on IOS.
-#define HARMFUL_ACCESS(action,error_regexp) do { action; } while (0)
-#else
-#define HARMFUL_ACCESS(action,error_regexp) EXPECT_DEATH(action,error_regexp)
-#endif  // !OS_IOS
-#else
-#define HARMFUL_ACCESS(action, error_regexp)
-#define HARMFUL_ACCESS_IS_NOOP
-#endif
-
-void DoReadUninitializedValue(char *ptr) {
-  // Comparison with 64 is to prevent clang from optimizing away the
-  // jump -- valgrind only catches jumps and conditional moves, but clang uses
-  // the borrow flag if the condition is just `*ptr == '\0'`.  We no longer
-  // support valgrind, but this constant should be fine to keep as-is.
-  if (*ptr == 64) {
-    VLOG(1) << "Uninit condition is true";
-  } else {
-    VLOG(1) << "Uninit condition is false";
-  }
-}
-
-void ReadUninitializedValue(char *ptr) {
-#if defined(MEMORY_SANITIZER)
-  EXPECT_DEATH(DoReadUninitializedValue(ptr),
-               "use-of-uninitialized-value");
-#else
-  DoReadUninitializedValue(ptr);
-#endif
-}
-
-#ifndef HARMFUL_ACCESS_IS_NOOP
-void ReadValueOutOfArrayBoundsLeft(char *ptr) {
-  char c = ptr[-2];
-  VLOG(1) << "Reading a byte out of bounds: " << c;
-}
-
-void ReadValueOutOfArrayBoundsRight(char *ptr, size_t size) {
-  char c = ptr[size + 1];
-  VLOG(1) << "Reading a byte out of bounds: " << c;
-}
-
-void WriteValueOutOfArrayBoundsLeft(char *ptr) {
-  ptr[-1] = kMagicValue;
-}
-
-void WriteValueOutOfArrayBoundsRight(char *ptr, size_t size) {
-  ptr[size] = kMagicValue;
-}
-#endif  // HARMFUL_ACCESS_IS_NOOP
-
-void MakeSomeErrors(char *ptr, size_t size) {
-  ReadUninitializedValue(ptr);
-
-  HARMFUL_ACCESS(ReadValueOutOfArrayBoundsLeft(ptr),
-                 "2 bytes to the left");
-  HARMFUL_ACCESS(ReadValueOutOfArrayBoundsRight(ptr, size),
-                 "1 bytes to the right");
-  HARMFUL_ACCESS(WriteValueOutOfArrayBoundsLeft(ptr),
-                 "1 bytes to the left");
-  HARMFUL_ACCESS(WriteValueOutOfArrayBoundsRight(ptr, size),
-                 "0 bytes to the right");
-}
-
-}  // namespace
-
-// A memory leak detector should report an error in this test.
-TEST(ToolsSanityTest, MemoryLeak) {
-  // Without the |volatile|, clang optimizes away the next two lines.
-  int* volatile leak = new int[256];  // Leak some memory intentionally.
-  leak[4] = 1;  // Make sure the allocated memory is used.
-}
-
-#if (defined(ADDRESS_SANITIZER) && defined(OS_IOS))
-// Because iOS doesn't support death tests, each of the following tests will
-// crash the whole program under Asan.
-#define MAYBE_AccessesToNewMemory DISABLED_AccessesToNewMemory
-#define MAYBE_AccessesToMallocMemory DISABLED_AccessesToMallocMemory
-#else
-#define MAYBE_AccessesToNewMemory AccessesToNewMemory
-#define MAYBE_AccessesToMallocMemory AccessesToMallocMemory
-#endif  // (defined(ADDRESS_SANITIZER) && defined(OS_IOS))
-
-// The following tests pass with Clang r170392, but not r172454, which
-// makes AddressSanitizer detect errors in them. We disable these tests under
-// AddressSanitizer until we fully switch to Clang r172454. After that the
-// tests should be put back under the (defined(OS_IOS) || defined(OS_WIN))
-// clause above.
-// See also http://crbug.com/172614.
-#if defined(ADDRESS_SANITIZER)
-#define MAYBE_SingleElementDeletedWithBraces \
-    DISABLED_SingleElementDeletedWithBraces
-#define MAYBE_ArrayDeletedWithoutBraces DISABLED_ArrayDeletedWithoutBraces
-#else
-#define MAYBE_ArrayDeletedWithoutBraces ArrayDeletedWithoutBraces
-#define MAYBE_SingleElementDeletedWithBraces SingleElementDeletedWithBraces
-#endif  // defined(ADDRESS_SANITIZER)
-
-TEST(ToolsSanityTest, MAYBE_AccessesToNewMemory) {
-  char *foo = new char[10];
-  MakeSomeErrors(foo, 10);
-  delete [] foo;
-  // Use after delete.
-  HARMFUL_ACCESS(foo[5] = 0, "heap-use-after-free");
-}
-
-TEST(ToolsSanityTest, MAYBE_AccessesToMallocMemory) {
-  char *foo = reinterpret_cast<char*>(malloc(10));
-  MakeSomeErrors(foo, 10);
-  free(foo);
-  // Use after free.
-  HARMFUL_ACCESS(foo[5] = 0, "heap-use-after-free");
-}
-
-#if defined(ADDRESS_SANITIZER)
-
-static int* allocateArray() {
-  // Clang warns about the mismatched new[]/delete if they occur in the same
-  // function.
-  return new int[10];
-}
-
-// This test may corrupt memory if not compiled with AddressSanitizer.
-TEST(ToolsSanityTest, MAYBE_ArrayDeletedWithoutBraces) {
-  // Without the |volatile|, clang optimizes away the next two lines.
-  int* volatile foo = allocateArray();
-  delete foo;
-}
-#endif
-
-#if defined(ADDRESS_SANITIZER)
-static int* allocateScalar() {
-  // Clang warns about the mismatched new/delete[] if they occur in the same
-  // function.
-  return new int;
-}
-
-// This test may corrupt memory if not compiled with AddressSanitizer.
-TEST(ToolsSanityTest, MAYBE_SingleElementDeletedWithBraces) {
-  // Without the |volatile|, clang optimizes away the next two lines.
-  int* volatile foo = allocateScalar();
-  (void) foo;
-  delete [] foo;
-}
-#endif
-
-#if defined(ADDRESS_SANITIZER)
-
-TEST(ToolsSanityTest, DISABLED_AddressSanitizerNullDerefCrashTest) {
-  // Intentionally crash to make sure AddressSanitizer is running.
-  // This test should not be ran on bots.
-  int* volatile zero = NULL;
-  *zero = 0;
-}
-
-TEST(ToolsSanityTest, DISABLED_AddressSanitizerLocalOOBCrashTest) {
-  // Intentionally crash to make sure AddressSanitizer is instrumenting
-  // the local variables.
-  // This test should not be ran on bots.
-  int array[5];
-  // Work around the OOB warning reported by Clang.
-  int* volatile access = &array[5];
-  *access = 43;
-}
-
-namespace {
-int g_asan_test_global_array[10];
-}  // namespace
-
-TEST(ToolsSanityTest, DISABLED_AddressSanitizerGlobalOOBCrashTest) {
-  // Intentionally crash to make sure AddressSanitizer is instrumenting
-  // the global variables.
-  // This test should not be ran on bots.
-
-  // Work around the OOB warning reported by Clang.
-  int* volatile access = g_asan_test_global_array - 1;
-  *access = 43;
-}
-
-#ifndef HARMFUL_ACCESS_IS_NOOP
-TEST(ToolsSanityTest, AsanHeapOverflow) {
-  HARMFUL_ACCESS(debug::AsanHeapOverflow() ,"to the right");
-}
-
-TEST(ToolsSanityTest, AsanHeapUnderflow) {
-  HARMFUL_ACCESS(debug::AsanHeapUnderflow(), "to the left");
-}
-
-TEST(ToolsSanityTest, AsanHeapUseAfterFree) {
-  HARMFUL_ACCESS(debug::AsanHeapUseAfterFree(), "heap-use-after-free");
-}
-
-#if defined(OS_WIN)
-// The ASAN runtime doesn't detect heap corruption, this needs fixing before
-// ASAN builds can ship to the wild. See https://crbug.com/818747.
-TEST(ToolsSanityTest, DISABLED_AsanCorruptHeapBlock) {
-  HARMFUL_ACCESS(debug::AsanCorruptHeapBlock(), "");
-}
-
-TEST(ToolsSanityTest, DISABLED_AsanCorruptHeap) {
-  // This test will kill the process by raising an exception, there's no
-  // particular string to look for in the stack trace.
-  EXPECT_DEATH(debug::AsanCorruptHeap(), "");
-}
-#endif  // OS_WIN
-#endif  // !HARMFUL_ACCESS_IS_NOOP
-
-#endif  // ADDRESS_SANITIZER
-
-namespace {
-
-// We use caps here just to ensure that the method name doesn't interfere with
-// the wildcarded suppressions.
-class TOOLS_SANITY_TEST_CONCURRENT_THREAD : public PlatformThread::Delegate {
- public:
-  explicit TOOLS_SANITY_TEST_CONCURRENT_THREAD(bool *value) : value_(value) {}
-  ~TOOLS_SANITY_TEST_CONCURRENT_THREAD() override = default;
-  void ThreadMain() override {
-    *value_ = true;
-
-    // Sleep for a few milliseconds so the two threads are more likely to live
-    // simultaneously. Otherwise we may miss the report due to mutex
-    // lock/unlock's inside thread creation code in pure-happens-before mode...
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(100));
-  }
- private:
-  bool *value_;
-};
-
-class ReleaseStoreThread : public PlatformThread::Delegate {
- public:
-  explicit ReleaseStoreThread(base::subtle::Atomic32 *value) : value_(value) {}
-  ~ReleaseStoreThread() override = default;
-  void ThreadMain() override {
-    base::subtle::Release_Store(value_, kMagicValue);
-
-    // Sleep for a few milliseconds so the two threads are more likely to live
-    // simultaneously. Otherwise we may miss the report due to mutex
-    // lock/unlock's inside thread creation code in pure-happens-before mode...
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(100));
-  }
- private:
-  base::subtle::Atomic32 *value_;
-};
-
-class AcquireLoadThread : public PlatformThread::Delegate {
- public:
-  explicit AcquireLoadThread(base::subtle::Atomic32 *value) : value_(value) {}
-  ~AcquireLoadThread() override = default;
-  void ThreadMain() override {
-    // Wait for the other thread to make Release_Store
-    PlatformThread::Sleep(TimeDelta::FromMilliseconds(100));
-    base::subtle::Acquire_Load(value_);
-  }
- private:
-  base::subtle::Atomic32 *value_;
-};
-
-void RunInParallel(PlatformThread::Delegate *d1, PlatformThread::Delegate *d2) {
-  PlatformThreadHandle a;
-  PlatformThreadHandle b;
-  PlatformThread::Create(0, d1, &a);
-  PlatformThread::Create(0, d2, &b);
-  PlatformThread::Join(a);
-  PlatformThread::Join(b);
-}
-
-#if defined(THREAD_SANITIZER)
-void DataRace() {
-  bool *shared = new bool(false);
-  TOOLS_SANITY_TEST_CONCURRENT_THREAD thread1(shared), thread2(shared);
-  RunInParallel(&thread1, &thread2);
-  EXPECT_TRUE(*shared);
-  delete shared;
-  // We're in a death test - crash.
-  CHECK(0);
-}
-#endif
-
-}  // namespace
-
-#if defined(THREAD_SANITIZER)
-// A data race detector should report an error in this test.
-TEST(ToolsSanityTest, DataRace) {
-  // The suppression regexp must match that in base/debug/tsan_suppressions.cc.
-  EXPECT_DEATH(DataRace(), "1 race:base/tools_sanity_unittest.cc");
-}
-#endif
-
-TEST(ToolsSanityTest, AnnotateBenignRace) {
-  bool shared = false;
-  ANNOTATE_BENIGN_RACE(&shared, "Intentional race - make sure doesn't show up");
-  TOOLS_SANITY_TEST_CONCURRENT_THREAD thread1(&shared), thread2(&shared);
-  RunInParallel(&thread1, &thread2);
-  EXPECT_TRUE(shared);
-}
-
-TEST(ToolsSanityTest, AtomicsAreIgnored) {
-  base::subtle::Atomic32 shared = 0;
-  ReleaseStoreThread thread1(&shared);
-  AcquireLoadThread thread2(&shared);
-  RunInParallel(&thread1, &thread2);
-  EXPECT_EQ(kMagicValue, shared);
-}
-
-#if defined(CFI_ERROR_MSG)
-class A {
- public:
-  A(): n_(0) {}
-  virtual void f() { n_++; }
- protected:
-  int n_;
-};
-
-class B: public A {
- public:
-  void f() override { n_--; }
-};
-
-class C: public B {
- public:
-  void f() override { n_ += 2; }
-};
-
-NOINLINE void KillVptrAndCall(A *obj) {
-  *reinterpret_cast<void **>(obj) = 0;
-  obj->f();
-}
-
-TEST(ToolsSanityTest, BadVirtualCallNull) {
-  A a;
-  B b;
-  EXPECT_DEATH({ KillVptrAndCall(&a); KillVptrAndCall(&b); }, CFI_ERROR_MSG);
-}
-
-NOINLINE void OverwriteVptrAndCall(B *obj, A *vptr) {
-  *reinterpret_cast<void **>(obj) = *reinterpret_cast<void **>(vptr);
-  obj->f();
-}
-
-TEST(ToolsSanityTest, BadVirtualCallWrongType) {
-  A a;
-  B b;
-  C c;
-  EXPECT_DEATH({ OverwriteVptrAndCall(&b, &a); OverwriteVptrAndCall(&b, &c); },
-               CFI_ERROR_MSG);
-}
-
-#endif  // CFI_ERROR_MSG
-
-#undef CFI_ERROR_MSG
-#undef MAYBE_AccessesToNewMemory
-#undef MAYBE_AccessesToMallocMemory
-#undef MAYBE_ArrayDeletedWithoutBraces
-#undef MAYBE_SingleElementDeletedWithBraces
-#undef HARMFUL_ACCESS
-#undef HARMFUL_ACCESS_IS_NOOP
-
-}  // namespace base
diff --git a/base/trace_event/blame_context_unittest.cc b/base/trace_event/blame_context_unittest.cc
deleted file mode 100644
index 12e7857..0000000
--- a/base/trace_event/blame_context_unittest.cc
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/blame_context.h"
-
-#include "base/json/json_writer.h"
-#include "base/message_loop/message_loop.h"
-#include "base/test/trace_event_analyzer.h"
-#include "base/trace_event/trace_event_argument.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-namespace {
-
-const char kTestBlameContextCategory[] = "test";
-const char kDisabledTestBlameContextCategory[] = "disabled-by-default-test";
-const char kTestBlameContextName[] = "TestBlameContext";
-const char kTestBlameContextType[] = "TestBlameContextType";
-const char kTestBlameContextScope[] = "TestBlameContextScope";
-
-class TestBlameContext : public BlameContext {
- public:
-  explicit TestBlameContext(int id)
-      : BlameContext(kTestBlameContextCategory,
-                     kTestBlameContextName,
-                     kTestBlameContextType,
-                     kTestBlameContextScope,
-                     id,
-                     nullptr) {}
-
-  TestBlameContext(int id, const TestBlameContext& parent)
-      : BlameContext(kTestBlameContextCategory,
-                     kTestBlameContextName,
-                     kTestBlameContextType,
-                     kTestBlameContextScope,
-                     id,
-                     &parent) {}
-
- protected:
-  void AsValueInto(trace_event::TracedValue* state) override {
-    BlameContext::AsValueInto(state);
-    state->SetBoolean("crossStreams", false);
-  }
-};
-
-class DisabledTestBlameContext : public BlameContext {
- public:
-  explicit DisabledTestBlameContext(int id)
-      : BlameContext(kDisabledTestBlameContextCategory,
-                     kTestBlameContextName,
-                     kTestBlameContextType,
-                     kTestBlameContextScope,
-                     id,
-                     nullptr) {}
-};
-
-class BlameContextTest : public testing::Test {
- protected:
-  MessageLoop loop_;
-};
-
-TEST_F(BlameContextTest, EnterAndLeave) {
-  using trace_analyzer::Query;
-  trace_analyzer::Start("*");
-  {
-    TestBlameContext blame_context(0x1234);
-    blame_context.Initialize();
-    blame_context.Enter();
-    blame_context.Leave();
-  }
-  auto analyzer = trace_analyzer::Stop();
-
-  trace_analyzer::TraceEventVector events;
-  Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) ||
-            Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT);
-  analyzer->FindEvents(q, &events);
-
-  EXPECT_EQ(2u, events.size());
-  EXPECT_EQ(TRACE_EVENT_PHASE_ENTER_CONTEXT, events[0]->phase);
-  EXPECT_EQ(kTestBlameContextCategory, events[0]->category);
-  EXPECT_EQ(kTestBlameContextName, events[0]->name);
-  EXPECT_EQ("0x1234", events[0]->id);
-  EXPECT_EQ(TRACE_EVENT_PHASE_LEAVE_CONTEXT, events[1]->phase);
-  EXPECT_EQ(kTestBlameContextCategory, events[1]->category);
-  EXPECT_EQ(kTestBlameContextName, events[1]->name);
-  EXPECT_EQ("0x1234", events[1]->id);
-}
-
-TEST_F(BlameContextTest, DifferentCategories) {
-  // Ensure there is no cross talk between blame contexts from different
-  // categories.
-  using trace_analyzer::Query;
-  trace_analyzer::Start("*");
-  {
-    TestBlameContext blame_context(0x1234);
-    DisabledTestBlameContext disabled_blame_context(0x5678);
-    blame_context.Initialize();
-    blame_context.Enter();
-    blame_context.Leave();
-    disabled_blame_context.Initialize();
-    disabled_blame_context.Enter();
-    disabled_blame_context.Leave();
-  }
-  auto analyzer = trace_analyzer::Stop();
-
-  trace_analyzer::TraceEventVector events;
-  Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_ENTER_CONTEXT) ||
-            Query::EventPhaseIs(TRACE_EVENT_PHASE_LEAVE_CONTEXT);
-  analyzer->FindEvents(q, &events);
-
-  // None of the events from the disabled-by-default category should show up.
-  EXPECT_EQ(2u, events.size());
-  EXPECT_EQ(TRACE_EVENT_PHASE_ENTER_CONTEXT, events[0]->phase);
-  EXPECT_EQ(kTestBlameContextCategory, events[0]->category);
-  EXPECT_EQ(kTestBlameContextName, events[0]->name);
-  EXPECT_EQ("0x1234", events[0]->id);
-  EXPECT_EQ(TRACE_EVENT_PHASE_LEAVE_CONTEXT, events[1]->phase);
-  EXPECT_EQ(kTestBlameContextCategory, events[1]->category);
-  EXPECT_EQ(kTestBlameContextName, events[1]->name);
-  EXPECT_EQ("0x1234", events[1]->id);
-}
-
-TEST_F(BlameContextTest, TakeSnapshot) {
-  using trace_analyzer::Query;
-  trace_analyzer::Start("*");
-  {
-    TestBlameContext parent_blame_context(0x5678);
-    TestBlameContext blame_context(0x1234, parent_blame_context);
-    parent_blame_context.Initialize();
-    blame_context.Initialize();
-    blame_context.TakeSnapshot();
-  }
-  auto analyzer = trace_analyzer::Stop();
-
-  trace_analyzer::TraceEventVector events;
-  Query q = Query::EventPhaseIs(TRACE_EVENT_PHASE_SNAPSHOT_OBJECT);
-  analyzer->FindEvents(q, &events);
-
-  // We should have 3 snapshots: one for both calls to Initialize() and one from
-  // the explicit call to TakeSnapshot().
-  EXPECT_EQ(3u, events.size());
-  EXPECT_EQ(kTestBlameContextCategory, events[0]->category);
-  EXPECT_EQ(kTestBlameContextType, events[0]->name);
-  EXPECT_EQ("0x5678", events[0]->id);
-  EXPECT_TRUE(events[0]->HasArg("snapshot"));
-
-  EXPECT_EQ(kTestBlameContextCategory, events[1]->category);
-  EXPECT_EQ(kTestBlameContextType, events[1]->name);
-  EXPECT_EQ("0x1234", events[1]->id);
-  EXPECT_TRUE(events[0]->HasArg("snapshot"));
-
-  EXPECT_EQ(kTestBlameContextCategory, events[2]->category);
-  EXPECT_EQ(kTestBlameContextType, events[2]->name);
-  EXPECT_EQ("0x1234", events[2]->id);
-  EXPECT_TRUE(events[0]->HasArg("snapshot"));
-
-  const char kExpectedSnapshotJson[] =
-      "{"
-          "\"crossStreams\":false,"
-          "\"parent\":{"
-              "\"id_ref\":\"0x5678\","
-              "\"scope\":\"TestBlameContextScope\""
-          "}"
-      "}";
-
-  std::string snapshot_json;
-  JSONWriter::Write(*events[2]->GetKnownArgAsValue("snapshot"), &snapshot_json);
-  EXPECT_EQ(kExpectedSnapshotJson, snapshot_json);
-}
-
-}  // namepace
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/etw_manifest/BUILD.gn b/base/trace_event/etw_manifest/BUILD.gn
deleted file mode 100644
index 19c4ecf..0000000
--- a/base/trace_event/etw_manifest/BUILD.gn
+++ /dev/null
@@ -1,29 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/win/message_compiler.gni")
-
-assert(is_win, "This only runs on Windows.")
-
-message_compiler("chrome_events_win") {
-  visibility = [
-    "//base/*",
-    "//chrome:main_dll",
-  ]
-
-  sources = [
-    "chrome_events_win.man",
-  ]
-
-  user_mode_logging = true
-
-  # The only code generated from chrome_events_win.man is a header file that
-  # is included by trace_event_etw_export_win.cc, so there is no need to
-  # compile any generated code. The other thing which compile_generated_code
-  # controls in this context is linking in the .res file generated from the
-  # manifest. However this is only needed for ETW provider registration which
-  # is done by UIforETW (https://github.com/google/UIforETW) and therefore the
-  # manifest resource can be skipped in Chrome.
-  compile_generated_code = false
-}
diff --git a/base/trace_event/event_name_filter_unittest.cc b/base/trace_event/event_name_filter_unittest.cc
deleted file mode 100644
index 134be0d..0000000
--- a/base/trace_event/event_name_filter_unittest.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/event_name_filter.h"
-
-#include "base/memory/ptr_util.h"
-#include "base/trace_event/trace_event_impl.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-
-const TraceEvent& MakeTraceEvent(const char* name) {
-  static TraceEvent event;
-  event.Reset();
-  event.Initialize(0, TimeTicks(), ThreadTicks(), 'b', nullptr, name, "", 0, 0,
-                   0, nullptr, nullptr, nullptr, nullptr, 0);
-  return event;
-}
-
-TEST(TraceEventNameFilterTest, Whitelist) {
-  auto empty_whitelist =
-      std::make_unique<EventNameFilter::EventNamesWhitelist>();
-  auto filter = std::make_unique<EventNameFilter>(std::move(empty_whitelist));
-
-  // No events should be filtered if the whitelist is empty.
-  EXPECT_FALSE(filter->FilterTraceEvent(MakeTraceEvent("foo")));
-
-  auto whitelist = std::make_unique<EventNameFilter::EventNamesWhitelist>();
-  whitelist->insert("foo");
-  whitelist->insert("bar");
-  filter = std::make_unique<EventNameFilter>(std::move(whitelist));
-  EXPECT_TRUE(filter->FilterTraceEvent(MakeTraceEvent("foo")));
-  EXPECT_FALSE(filter->FilterTraceEvent(MakeTraceEvent("fooz")));
-  EXPECT_FALSE(filter->FilterTraceEvent(MakeTraceEvent("afoo")));
-  EXPECT_TRUE(filter->FilterTraceEvent(MakeTraceEvent("bar")));
-  EXPECT_FALSE(filter->FilterTraceEvent(MakeTraceEvent("foobar")));
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc b/base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc
deleted file mode 100644
index c26149e..0000000
--- a/base/trace_event/heap_profiler_allocation_context_tracker_unittest.cc
+++ /dev/null
@@ -1,350 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include <iterator>
-
-#include "base/memory/ref_counted.h"
-#include "base/pending_task.h"
-#include "base/trace_event/heap_profiler.h"
-#include "base/trace_event/heap_profiler_allocation_context.h"
-#include "base/trace_event/heap_profiler_allocation_context_tracker.h"
-#include "base/trace_event/memory_dump_manager.h"
-#include "base/trace_event/trace_event.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-
-// Define all strings once, because the pseudo stack requires pointer equality,
-// and string interning is unreliable.
-const char kThreadName[] = "TestThread";
-const char kCupcake[] = "Cupcake";
-const char kDonut[] = "Donut";
-const char kEclair[] = "Eclair";
-const char kFroyo[] = "Froyo";
-const char kGingerbread[] = "Gingerbread";
-
-const char kFilteringTraceConfig[] =
-    "{"
-    "  \"event_filters\": ["
-    "    {"
-    "      \"excluded_categories\": [],"
-    "      \"filter_args\": {},"
-    "      \"filter_predicate\": \"heap_profiler_predicate\","
-    "      \"included_categories\": ["
-    "        \"*\","
-    "        \"" TRACE_DISABLED_BY_DEFAULT("Testing") "\"]"
-    "    }"
-    "  ]"
-    "}";
-
-// Asserts that the fixed-size array |expected_backtrace| matches the backtrace
-// in |AllocationContextTracker::GetContextSnapshot|.
-template <size_t N>
-void AssertBacktraceEquals(const StackFrame(&expected_backtrace)[N]) {
-  AllocationContext ctx;
-  ASSERT_TRUE(AllocationContextTracker::GetInstanceForCurrentThread()
-                  ->GetContextSnapshot(&ctx));
-
-  auto* actual = std::begin(ctx.backtrace.frames);
-  auto* actual_bottom = actual + ctx.backtrace.frame_count;
-  auto expected = std::begin(expected_backtrace);
-  auto expected_bottom = std::end(expected_backtrace);
-
-  // Note that this requires the pointers to be equal, this is not doing a deep
-  // string comparison.
-  for (; actual != actual_bottom && expected != expected_bottom;
-       actual++, expected++)
-    ASSERT_EQ(*expected, *actual);
-
-  // Ensure that the height of the stacks is the same.
-  ASSERT_EQ(actual, actual_bottom);
-  ASSERT_EQ(expected, expected_bottom);
-}
-
-void AssertBacktraceContainsOnlyThreadName() {
-  StackFrame t = StackFrame::FromThreadName(kThreadName);
-  AllocationContext ctx;
-  ASSERT_TRUE(AllocationContextTracker::GetInstanceForCurrentThread()
-                  ->GetContextSnapshot(&ctx));
-
-  ASSERT_EQ(1u, ctx.backtrace.frame_count);
-  ASSERT_EQ(t, ctx.backtrace.frames[0]);
-}
-
-class AllocationContextTrackerTest : public testing::Test {
- public:
-  void SetUp() override {
-    AllocationContextTracker::SetCaptureMode(
-        AllocationContextTracker::CaptureMode::PSEUDO_STACK);
-    // Enabling memory-infra category sets default memory dump config which
-    // includes filters for capturing pseudo stack.
-    TraceConfig config(kFilteringTraceConfig);
-    TraceLog::GetInstance()->SetEnabled(config, TraceLog::FILTERING_MODE);
-    AllocationContextTracker::SetCurrentThreadName(kThreadName);
-  }
-
-  void TearDown() override {
-    AllocationContextTracker::SetCaptureMode(
-        AllocationContextTracker::CaptureMode::DISABLED);
-    TraceLog::GetInstance()->SetDisabled(TraceLog::FILTERING_MODE);
-  }
-};
-
-// Check that |TRACE_EVENT| macros push and pop to the pseudo stack correctly.
-TEST_F(AllocationContextTrackerTest, PseudoStackScopedTrace) {
-  StackFrame t = StackFrame::FromThreadName(kThreadName);
-  StackFrame c = StackFrame::FromTraceEventName(kCupcake);
-  StackFrame d = StackFrame::FromTraceEventName(kDonut);
-  StackFrame e = StackFrame::FromTraceEventName(kEclair);
-  StackFrame f = StackFrame::FromTraceEventName(kFroyo);
-
-  AssertBacktraceContainsOnlyThreadName();
-
-  {
-    TRACE_EVENT0("Testing", kCupcake);
-    StackFrame frame_c[] = {t, c};
-    AssertBacktraceEquals(frame_c);
-
-    {
-      TRACE_EVENT0("Testing", kDonut);
-      StackFrame frame_cd[] = {t, c, d};
-      AssertBacktraceEquals(frame_cd);
-    }
-
-    AssertBacktraceEquals(frame_c);
-
-    {
-      TRACE_EVENT0("Testing", kEclair);
-      StackFrame frame_ce[] = {t, c, e};
-      AssertBacktraceEquals(frame_ce);
-    }
-
-    {
-      TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("NotTesting"), kDonut);
-      TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("Testing"), kCupcake);
-      StackFrame frame_cc[] = {t, c, c};
-      AssertBacktraceEquals(frame_cc);
-    }
-
-    AssertBacktraceEquals(frame_c);
-  }
-
-  AssertBacktraceContainsOnlyThreadName();
-
-  {
-    TRACE_EVENT0("Testing", kFroyo);
-    StackFrame frame_f[] = {t, f};
-    AssertBacktraceEquals(frame_f);
-  }
-
-  AssertBacktraceContainsOnlyThreadName();
-}
-
-// Same as |PseudoStackScopedTrace|, but now test the |TRACE_EVENT_BEGIN| and
-// |TRACE_EVENT_END| macros.
-TEST_F(AllocationContextTrackerTest, PseudoStackBeginEndTrace) {
-  StackFrame t = StackFrame::FromThreadName(kThreadName);
-  StackFrame c = StackFrame::FromTraceEventName(kCupcake);
-  StackFrame d = StackFrame::FromTraceEventName(kDonut);
-  StackFrame e = StackFrame::FromTraceEventName(kEclair);
-  StackFrame f = StackFrame::FromTraceEventName(kFroyo);
-
-  StackFrame frame_c[] = {t, c};
-  StackFrame frame_cd[] = {t, c, d};
-  StackFrame frame_ce[] = {t, c, e};
-  StackFrame frame_f[] = {t, f};
-
-  AssertBacktraceContainsOnlyThreadName();
-
-  TRACE_EVENT_BEGIN0("Testing", kCupcake);
-  AssertBacktraceEquals(frame_c);
-
-  TRACE_EVENT_BEGIN0("Testing", kDonut);
-  AssertBacktraceEquals(frame_cd);
-  TRACE_EVENT_END0("Testing", kDonut);
-
-  AssertBacktraceEquals(frame_c);
-
-  TRACE_EVENT_BEGIN0("Testing", kEclair);
-  AssertBacktraceEquals(frame_ce);
-  TRACE_EVENT_END0("Testing", kEclair);
-
-  AssertBacktraceEquals(frame_c);
-  TRACE_EVENT_END0("Testing", kCupcake);
-
-  AssertBacktraceContainsOnlyThreadName();
-
-  TRACE_EVENT_BEGIN0("Testing", kFroyo);
-  AssertBacktraceEquals(frame_f);
-  TRACE_EVENT_END0("Testing", kFroyo);
-
-  AssertBacktraceContainsOnlyThreadName();
-}
-
-TEST_F(AllocationContextTrackerTest, PseudoStackMixedTrace) {
-  StackFrame t = StackFrame::FromThreadName(kThreadName);
-  StackFrame c = StackFrame::FromTraceEventName(kCupcake);
-  StackFrame d = StackFrame::FromTraceEventName(kDonut);
-  StackFrame e = StackFrame::FromTraceEventName(kEclair);
-  StackFrame f = StackFrame::FromTraceEventName(kFroyo);
-
-  StackFrame frame_c[] = {t, c};
-  StackFrame frame_cd[] = {t, c, d};
-  StackFrame frame_e[] = {t, e};
-  StackFrame frame_ef[] = {t, e, f};
-
-  AssertBacktraceContainsOnlyThreadName();
-
-  TRACE_EVENT_BEGIN0("Testing", kCupcake);
-  AssertBacktraceEquals(frame_c);
-
-  {
-    TRACE_EVENT0("Testing", kDonut);
-    AssertBacktraceEquals(frame_cd);
-  }
-
-  AssertBacktraceEquals(frame_c);
-  TRACE_EVENT_END0("Testing", kCupcake);
-  AssertBacktraceContainsOnlyThreadName();
-
-  {
-    TRACE_EVENT0("Testing", kEclair);
-    AssertBacktraceEquals(frame_e);
-
-    TRACE_EVENT_BEGIN0("Testing", kFroyo);
-    AssertBacktraceEquals(frame_ef);
-    TRACE_EVENT_END0("Testing", kFroyo);
-    AssertBacktraceEquals(frame_e);
-  }
-
-  AssertBacktraceContainsOnlyThreadName();
-}
-
-TEST_F(AllocationContextTrackerTest, MixedStackWithProgramCounter) {
-  StackFrame t = StackFrame::FromThreadName(kThreadName);
-  StackFrame c = StackFrame::FromTraceEventName(kCupcake);
-  StackFrame f = StackFrame::FromTraceEventName(kFroyo);
-  const void* pc1 = reinterpret_cast<void*>(0x1000);
-  const void* pc2 = reinterpret_cast<void*>(0x2000);
-  StackFrame n1 = StackFrame::FromProgramCounter(pc1);
-  StackFrame n2 = StackFrame::FromProgramCounter(pc2);
-
-  StackFrame frame_c[] = {t, c};
-  StackFrame frame_cd[] = {t, c, n1};
-  StackFrame frame_e[] = {t, n2, n1};
-  StackFrame frame_ef[] = {t, n2, n1, f};
-
-  AssertBacktraceContainsOnlyThreadName();
-
-  AllocationContextTracker::SetCaptureMode(
-      AllocationContextTracker::CaptureMode::MIXED_STACK);
-
-  TRACE_EVENT_BEGIN0("Testing", kCupcake);
-  AssertBacktraceEquals(frame_c);
-
-  {
-    TRACE_HEAP_PROFILER_API_SCOPED_WITH_PROGRAM_COUNTER e1(pc1);
-    AssertBacktraceEquals(frame_cd);
-  }
-
-  AssertBacktraceEquals(frame_c);
-  TRACE_EVENT_END0("Testing", kCupcake);
-  AssertBacktraceContainsOnlyThreadName();
-
-  {
-    TRACE_HEAP_PROFILER_API_SCOPED_WITH_PROGRAM_COUNTER e1(pc2);
-    TRACE_HEAP_PROFILER_API_SCOPED_WITH_PROGRAM_COUNTER e2(pc1);
-    AssertBacktraceEquals(frame_e);
-
-    TRACE_EVENT0("Testing", kFroyo);
-    AssertBacktraceEquals(frame_ef);
-  }
-
-  AssertBacktraceContainsOnlyThreadName();
-  AllocationContextTracker::SetCaptureMode(
-      AllocationContextTracker::CaptureMode::DISABLED);
-}
-
-TEST_F(AllocationContextTrackerTest, BacktraceTakesTop) {
-  StackFrame t = StackFrame::FromThreadName(kThreadName);
-  StackFrame c = StackFrame::FromTraceEventName(kCupcake);
-  StackFrame f = StackFrame::FromTraceEventName(kFroyo);
-
-  // Push 11 events onto the pseudo stack.
-  TRACE_EVENT0("Testing", kCupcake);
-  TRACE_EVENT0("Testing", kCupcake);
-  TRACE_EVENT0("Testing", kCupcake);
-
-  TRACE_EVENT0("Testing", kCupcake);
-  TRACE_EVENT0("Testing", kCupcake);
-  TRACE_EVENT0("Testing", kCupcake);
-  TRACE_EVENT0("Testing", kCupcake);
-
-  TRACE_EVENT0("Testing", kCupcake);
-  TRACE_EVENT0("Testing", kDonut);
-  TRACE_EVENT0("Testing", kEclair);
-  TRACE_EVENT0("Testing", kFroyo);
-
-  {
-    TRACE_EVENT0("Testing", kGingerbread);
-    AllocationContext ctx;
-    ASSERT_TRUE(AllocationContextTracker::GetInstanceForCurrentThread()
-                    ->GetContextSnapshot(&ctx));
-
-    // The pseudo stack relies on pointer equality, not deep string comparisons.
-    ASSERT_EQ(t, ctx.backtrace.frames[0]);
-    ASSERT_EQ(c, ctx.backtrace.frames[1]);
-    ASSERT_EQ(f, ctx.backtrace.frames[11]);
-  }
-
-  {
-    AllocationContext ctx;
-    ASSERT_TRUE(AllocationContextTracker::GetInstanceForCurrentThread()
-                    ->GetContextSnapshot(&ctx));
-    ASSERT_EQ(t, ctx.backtrace.frames[0]);
-    ASSERT_EQ(c, ctx.backtrace.frames[1]);
-    ASSERT_EQ(f, ctx.backtrace.frames[11]);
-  }
-}
-
-TEST_F(AllocationContextTrackerTest, TrackCategoryName) {
-  const char kContext1[] = "context1";
-  const char kContext2[] = "context2";
-  {
-    // The context from the scoped task event should be used as type name.
-    TRACE_HEAP_PROFILER_API_SCOPED_TASK_EXECUTION event1(kContext1);
-    AllocationContext ctx1;
-    ASSERT_TRUE(AllocationContextTracker::GetInstanceForCurrentThread()
-                    ->GetContextSnapshot(&ctx1));
-    ASSERT_EQ(kContext1, ctx1.type_name);
-
-    // In case of nested events, the last event's context should be used.
-    TRACE_HEAP_PROFILER_API_SCOPED_TASK_EXECUTION event2(kContext2);
-    AllocationContext ctx2;
-    ASSERT_TRUE(AllocationContextTracker::GetInstanceForCurrentThread()
-                    ->GetContextSnapshot(&ctx2));
-    ASSERT_EQ(kContext2, ctx2.type_name);
-  }
-
-  // Type should be nullptr without task event.
-  AllocationContext ctx;
-  ASSERT_TRUE(AllocationContextTracker::GetInstanceForCurrentThread()
-                  ->GetContextSnapshot(&ctx));
-  ASSERT_FALSE(ctx.type_name);
-}
-
-TEST_F(AllocationContextTrackerTest, IgnoreAllocationTest) {
-  TRACE_EVENT0("Testing", kCupcake);
-  TRACE_EVENT0("Testing", kDonut);
-  HEAP_PROFILER_SCOPED_IGNORE;
-  AllocationContext ctx;
-  ASSERT_FALSE(AllocationContextTracker::GetInstanceForCurrentThread()
-                   ->GetContextSnapshot(&ctx));
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/heap_profiler_heap_dump_writer_unittest.cc b/base/trace_event/heap_profiler_heap_dump_writer_unittest.cc
deleted file mode 100644
index 93e8fee..0000000
--- a/base/trace_event/heap_profiler_heap_dump_writer_unittest.cc
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/heap_profiler_heap_dump_writer.h"
-
-#include <stddef.h>
-
-#include <memory>
-#include <set>
-#include <string>
-
-#include "base/json/json_reader.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/trace_event/heap_profiler_allocation_context.h"
-#include "base/trace_event/heap_profiler_stack_frame_deduplicator.h"
-#include "base/trace_event/heap_profiler_type_name_deduplicator.h"
-#include "base/trace_event/trace_event_argument.h"
-#include "base/values.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-using base::trace_event::StackFrame;
-
-// Define all strings once, because the deduplicator requires pointer equality,
-// and string interning is unreliable.
-StackFrame kBrowserMain = StackFrame::FromTraceEventName("BrowserMain");
-StackFrame kRendererMain = StackFrame::FromTraceEventName("RendererMain");
-StackFrame kCreateWidget = StackFrame::FromTraceEventName("CreateWidget");
-StackFrame kInitialize = StackFrame::FromTraceEventName("Initialize");
-StackFrame kGetBitmap = StackFrame::FromTraceEventName("GetBitmap");
-
-const char kInt[] = "int";
-const char kBool[] = "bool";
-const char kString[] = "string";
-
-}  // namespace
-
-namespace base {
-namespace trace_event {
-namespace internal {
-
-std::unique_ptr<const Value> WriteAndReadBack(const std::set<Entry>& entries) {
-  std::unique_ptr<TracedValue> traced_value = Serialize(entries);
-  std::string json;
-  traced_value->AppendAsTraceFormat(&json);
-  return JSONReader::Read(json);
-}
-
-std::unique_ptr<const DictionaryValue> WriteAndReadBackEntry(Entry entry) {
-  std::set<Entry> input_entries;
-  input_entries.insert(entry);
-
-  std::unique_ptr<const Value> json_dict = WriteAndReadBack(input_entries);
-
-  // Note: Ideally these should use |ASSERT_TRUE| instead of |EXPECT_TRUE|, but
-  // |ASSERT_TRUE| can only be used in void functions.
-  const DictionaryValue* dictionary;
-  EXPECT_TRUE(json_dict->GetAsDictionary(&dictionary));
-
-  const ListValue* json_entries;
-  EXPECT_TRUE(dictionary->GetList("entries", &json_entries));
-
-  const DictionaryValue* json_entry;
-  EXPECT_TRUE(json_entries->GetDictionary(0, &json_entry));
-
-  return json_entry->CreateDeepCopy();
-}
-
-// Given a desired stack frame ID and type ID, looks up the entry in the set and
-// asserts that it is present and has the expected size and count.
-void AssertSizeAndCountEq(const std::set<Entry>& entries,
-                          int stack_frame_id,
-                          int type_id,
-                          const AllocationMetrics& expected) {
-  // The comparison operator for |Entry| does not take size into account, so by
-  // setting only stack frame ID and type ID, the real entry can be found.
-  Entry entry;
-  entry.stack_frame_id = stack_frame_id;
-  entry.type_id = type_id;
-  auto it = entries.find(entry);
-
-  ASSERT_NE(entries.end(), it) << "No entry found for sf = " << stack_frame_id
-                               << ", type = " << type_id << ".";
-  ASSERT_EQ(expected.size, it->size) << "Wrong size for sf = " << stack_frame_id
-                                     << ", type = " << type_id << ".";
-  ASSERT_EQ(expected.count, it->count)
-      << "Wrong count for sf = " << stack_frame_id << ", type = " << type_id
-      << ".";
-}
-
-// Given a desired stack frame ID and type ID, asserts that no entry was dumped
-// for that that particular combination of stack frame and type.
-void AssertNotDumped(const std::set<Entry>& entries,
-                     int stack_frame_id,
-                     int type_id) {
-  // The comparison operator for |Entry| does not take size into account, so by
-  // setting only stack frame ID and type ID, the real entry can be found.
-  Entry entry;
-  entry.stack_frame_id = stack_frame_id;
-  entry.type_id = type_id;
-  auto it = entries.find(entry);
-  ASSERT_EQ(entries.end(), it)
-      << "Entry should not be present for sf = " << stack_frame_id
-      << ", type = " << type_id << ".";
-}
-
-TEST(HeapDumpWriterTest, BacktraceIndex) {
-  Entry entry;
-  entry.stack_frame_id = -1;  // -1 means empty backtrace.
-  entry.type_id = 0;
-  entry.size = 1;
-  entry.count = 1;
-
-  std::unique_ptr<const DictionaryValue> json_entry =
-      WriteAndReadBackEntry(entry);
-
-  // For an empty backtrace, the "bt" key cannot reference a stack frame.
-  // Instead it should be set to the empty string.
-  std::string backtrace_index;
-  ASSERT_TRUE(json_entry->GetString("bt", &backtrace_index));
-  ASSERT_EQ("", backtrace_index);
-
-  // Also verify that a non-negative backtrace index is dumped properly.
-  entry.stack_frame_id = 2;
-  json_entry = WriteAndReadBackEntry(entry);
-  ASSERT_TRUE(json_entry->GetString("bt", &backtrace_index));
-  ASSERT_EQ("2", backtrace_index);
-}
-
-TEST(HeapDumpWriterTest, TypeId) {
-  Entry entry;
-  entry.type_id = -1;  // -1 means sum over all types.
-  entry.stack_frame_id = 0;
-  entry.size = 1;
-  entry.count = 1;
-
-  std::unique_ptr<const DictionaryValue> json_entry =
-      WriteAndReadBackEntry(entry);
-
-  // Entries for the cumulative size of all types should not have the "type"
-  // key set.
-  ASSERT_FALSE(json_entry->HasKey("type"));
-
-  // Also verify that a non-negative type ID is dumped properly.
-  entry.type_id = 2;
-  json_entry = WriteAndReadBackEntry(entry);
-  std::string type_id;
-  ASSERT_TRUE(json_entry->GetString("type", &type_id));
-  ASSERT_EQ("2", type_id);
-}
-
-TEST(HeapDumpWriterTest, SizeAndCountAreHexadecimal) {
-  // Take a number between 2^63 and 2^64 (or between 2^31 and 2^32 if |size_t|
-  // is not 64 bits).
-  const size_t large_value =
-      sizeof(size_t) == 8 ? 0xffffffffffffffc5 : 0xffffff9d;
-  const char* large_value_str =
-      sizeof(size_t) == 8 ? "ffffffffffffffc5" : "ffffff9d";
-  Entry entry;
-  entry.type_id = 0;
-  entry.stack_frame_id = 0;
-  entry.size = large_value;
-  entry.count = large_value;
-
-  std::unique_ptr<const DictionaryValue> json_entry =
-      WriteAndReadBackEntry(entry);
-
-  std::string size;
-  ASSERT_TRUE(json_entry->GetString("size", &size));
-  ASSERT_EQ(large_value_str, size);
-
-  std::string count;
-  ASSERT_TRUE(json_entry->GetString("count", &count));
-  ASSERT_EQ(large_value_str, count);
-}
-
-TEST(HeapDumpWriterTest, BacktraceTypeNameTable) {
-  std::unordered_map<AllocationContext, AllocationMetrics> metrics_by_context;
-
-  AllocationContext ctx;
-  ctx.backtrace.frames[0] = kBrowserMain;
-  ctx.backtrace.frames[1] = kCreateWidget;
-  ctx.backtrace.frame_count = 2;
-  ctx.type_name = kInt;
-
-  // 10 bytes with context { type: int, bt: [BrowserMain, CreateWidget] }.
-  metrics_by_context[ctx] = {10, 5};
-
-  ctx.type_name = kBool;
-
-  // 18 bytes with context { type: bool, bt: [BrowserMain, CreateWidget] }.
-  metrics_by_context[ctx] = {18, 18};
-
-  ctx.backtrace.frames[0] = kRendererMain;
-  ctx.backtrace.frames[1] = kInitialize;
-  ctx.backtrace.frame_count = 2;
-
-  // 30 bytes with context { type: bool, bt: [RendererMain, Initialize] }.
-  metrics_by_context[ctx] = {30, 30};
-
-  ctx.type_name = kString;
-
-  // 19 bytes with context { type: string, bt: [RendererMain, Initialize] }.
-  metrics_by_context[ctx] = {19, 4};
-
-  // At this point the heap looks like this:
-  //
-  // |        | CrWidget <- BrMain | Init <- RenMain |     Sum     |
-  // +--------+--------------------+-----------------+-------------+
-  // |        |       size   count |   size    count | size  count |
-  // | int    |         10       5 |      0        0 |   10      5 |
-  // | bool   |         18      18 |     30       30 |   48     48 |
-  // | string |          0       0 |     19        4 |   19      4 |
-  // +--------+--------------------+-----------------+-------------+
-  // | Sum    |         28      23 |     49      34  |   77     57 |
-
-  auto stack_frame_deduplicator = WrapUnique(new StackFrameDeduplicator);
-  auto type_name_deduplicator = WrapUnique(new TypeNameDeduplicator);
-  HeapDumpWriter writer(stack_frame_deduplicator.get(),
-                        type_name_deduplicator.get(), 10u);
-  const std::set<Entry>& dump = writer.Summarize(metrics_by_context);
-
-  // Get the indices of the backtraces and types by adding them again to the
-  // deduplicator. Because they were added before, the same number is returned.
-  StackFrame bt0[] = {kRendererMain, kInitialize};
-  StackFrame bt1[] = {kBrowserMain, kCreateWidget};
-  int bt_renderer_main = stack_frame_deduplicator->Insert(bt0, bt0 + 1);
-  int bt_browser_main = stack_frame_deduplicator->Insert(bt1, bt1 + 1);
-  int bt_renderer_main_initialize =
-      stack_frame_deduplicator->Insert(bt0, bt0 + 2);
-  int bt_browser_main_create_widget =
-      stack_frame_deduplicator->Insert(bt1, bt1 + 2);
-  int type_id_int = type_name_deduplicator->Insert(kInt);
-  int type_id_bool = type_name_deduplicator->Insert(kBool);
-  int type_id_string = type_name_deduplicator->Insert(kString);
-
-  // Full heap should have size 77.
-  AssertSizeAndCountEq(dump, -1, -1, {77, 57});
-
-  // 49 bytes in 34 chunks were allocated in RendererMain and children. Also
-  // check the type breakdown.
-  AssertSizeAndCountEq(dump, bt_renderer_main, -1, {49, 34});
-  AssertSizeAndCountEq(dump, bt_renderer_main, type_id_bool, {30, 30});
-  AssertSizeAndCountEq(dump, bt_renderer_main, type_id_string, {19, 4});
-
-  // 28 bytes in 23 chunks were allocated in BrowserMain and children. Also
-  // check the type breakdown.
-  AssertSizeAndCountEq(dump, bt_browser_main, -1, {28, 23});
-  AssertSizeAndCountEq(dump, bt_browser_main, type_id_int, {10, 5});
-  AssertSizeAndCountEq(dump, bt_browser_main, type_id_bool, {18, 18});
-
-  // In this test all bytes are allocated in leaf nodes, so check again one
-  // level deeper.
-  AssertSizeAndCountEq(dump, bt_renderer_main_initialize, -1, {49, 34});
-  AssertSizeAndCountEq(dump, bt_renderer_main_initialize, type_id_bool,
-                       {30, 30});
-  AssertSizeAndCountEq(dump, bt_renderer_main_initialize, type_id_string,
-                       {19, 4});
-  AssertSizeAndCountEq(dump, bt_browser_main_create_widget, -1, {28, 23});
-  AssertSizeAndCountEq(dump, bt_browser_main_create_widget, type_id_int,
-                       {10, 5});
-  AssertSizeAndCountEq(dump, bt_browser_main_create_widget, type_id_bool,
-                       {18, 18});
-
-  // The type breakdown of the entrie heap should have been dumped as well.
-  AssertSizeAndCountEq(dump, -1, type_id_int, {10, 5});
-  AssertSizeAndCountEq(dump, -1, type_id_bool, {48, 48});
-  AssertSizeAndCountEq(dump, -1, type_id_string, {19, 4});
-}
-
-TEST(HeapDumpWriterTest, InsignificantValuesNotDumped) {
-  std::unordered_map<AllocationContext, AllocationMetrics> metrics_by_context;
-
-  AllocationContext ctx;
-  ctx.backtrace.frames[0] = kBrowserMain;
-  ctx.backtrace.frames[1] = kCreateWidget;
-  ctx.backtrace.frame_count = 2;
-
-  // 0.5 KiB and 1 chunk in BrowserMain -> CreateWidget itself.
-  metrics_by_context[ctx] = {512, 1};
-
-  // 1 MiB and 1 chunk in BrowserMain -> CreateWidget -> GetBitmap.
-  ctx.backtrace.frames[2] = kGetBitmap;
-  ctx.backtrace.frame_count = 3;
-  metrics_by_context[ctx] = {1024 * 1024, 1};
-
-  // 400B and 1 chunk in BrowserMain -> CreateWidget -> Initialize.
-  ctx.backtrace.frames[2] = kInitialize;
-  ctx.backtrace.frame_count = 3;
-  metrics_by_context[ctx] = {400, 1};
-
-  auto stack_frame_deduplicator = WrapUnique(new StackFrameDeduplicator);
-  auto type_name_deduplicator = WrapUnique(new TypeNameDeduplicator);
-  HeapDumpWriter writer(stack_frame_deduplicator.get(),
-                        type_name_deduplicator.get(), 512u);
-  const std::set<Entry>& dump = writer.Summarize(metrics_by_context);
-
-  // Get the indices of the backtraces and types by adding them again to the
-  // deduplicator. Because they were added before, the same number is returned.
-  StackFrame bt0[] = {kBrowserMain, kCreateWidget, kGetBitmap};
-  StackFrame bt1[] = {kBrowserMain, kCreateWidget, kInitialize};
-  int bt_browser_main = stack_frame_deduplicator->Insert(bt0, bt0 + 1);
-  int bt_create_widget = stack_frame_deduplicator->Insert(bt0, bt0 + 2);
-  int bt_get_bitmap = stack_frame_deduplicator->Insert(bt0, bt0 + 3);
-  int bt_initialize = stack_frame_deduplicator->Insert(bt1, bt1 + 3);
-
-  // Full heap should have size of 1 MiB + .9 KiB and 3 chunks.
-  AssertSizeAndCountEq(dump, -1, -1 /* No type specified */,
-                       {1024 * 1024 + 512 + 400, 3});
-
-  // |GetBitmap| allocated 1 MiB and 1 chunk.
-  AssertSizeAndCountEq(dump, bt_get_bitmap, -1, {1024 * 1024, 1});
-
-  // Because |GetBitmap| was dumped, all of its parent nodes should have been
-  // dumped too. |CreateWidget| has 1 MiB in |GetBitmap|, 400 bytes in
-  // |Initialize|, and 512 bytes of its own and each in 1 chunk.
-  AssertSizeAndCountEq(dump, bt_create_widget, -1,
-                       {1024 * 1024 + 400 + 512, 3});
-  AssertSizeAndCountEq(dump, bt_browser_main, -1, {1024 * 1024 + 400 + 512, 3});
-
-  // Initialize was not significant, it should not have been dumped.
-  AssertNotDumped(dump, bt_initialize, -1);
-}
-
-}  // namespace internal
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/heap_profiler_stack_frame_deduplicator_unittest.cc b/base/trace_event/heap_profiler_stack_frame_deduplicator_unittest.cc
deleted file mode 100644
index 194c7aa..0000000
--- a/base/trace_event/heap_profiler_stack_frame_deduplicator_unittest.cc
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/heap_profiler_stack_frame_deduplicator.h"
-
-#include <iterator>
-#include <memory>
-
-#include "base/macros.h"
-#include "base/trace_event/heap_profiler_allocation_context.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-
-// Define all strings once, because the deduplicator requires pointer equality,
-// and string interning is unreliable.
-StackFrame kBrowserMain = StackFrame::FromTraceEventName("BrowserMain");
-StackFrame kRendererMain = StackFrame::FromTraceEventName("RendererMain");
-StackFrame kCreateWidget = StackFrame::FromTraceEventName("CreateWidget");
-StackFrame kInitialize = StackFrame::FromTraceEventName("Initialize");
-StackFrame kMalloc = StackFrame::FromTraceEventName("malloc");
-
-TEST(StackFrameDeduplicatorTest, SingleBacktrace) {
-  StackFrame bt[] = {kBrowserMain, kCreateWidget, kMalloc};
-
-  // The call tree should look like this (index in brackets).
-  //
-  // BrowserMain [0]
-  //   CreateWidget [1]
-  //     malloc [2]
-
-  std::unique_ptr<StackFrameDeduplicator> dedup(new StackFrameDeduplicator);
-  ASSERT_EQ(2, dedup->Insert(std::begin(bt), std::end(bt)));
-
-  auto iter = dedup->begin();
-  ASSERT_EQ(kBrowserMain, (iter + 0)->frame);
-  ASSERT_EQ(-1, (iter + 0)->parent_frame_index);
-
-  ASSERT_EQ(kCreateWidget, (iter + 1)->frame);
-  ASSERT_EQ(0, (iter + 1)->parent_frame_index);
-
-  ASSERT_EQ(kMalloc, (iter + 2)->frame);
-  ASSERT_EQ(1, (iter + 2)->parent_frame_index);
-
-  ASSERT_TRUE(iter + 3 == dedup->end());
-}
-
-TEST(StackFrameDeduplicatorTest, SingleBacktraceWithNull) {
-  StackFrame null_frame = StackFrame::FromTraceEventName(nullptr);
-  StackFrame bt[] = {kBrowserMain, null_frame, kMalloc};
-
-  // Deduplicator doesn't care about what's inside StackFrames,
-  // and handles nullptr StackFrame values as any other.
-  //
-  // So the call tree should look like this (index in brackets).
-  //
-  // BrowserMain [0]
-  //   (null) [1]
-  //     malloc [2]
-
-  std::unique_ptr<StackFrameDeduplicator> dedup(new StackFrameDeduplicator);
-  ASSERT_EQ(2, dedup->Insert(std::begin(bt), std::end(bt)));
-
-  auto iter = dedup->begin();
-  ASSERT_EQ(kBrowserMain, (iter + 0)->frame);
-  ASSERT_EQ(-1, (iter + 0)->parent_frame_index);
-
-  ASSERT_EQ(null_frame, (iter + 1)->frame);
-  ASSERT_EQ(0, (iter + 1)->parent_frame_index);
-
-  ASSERT_EQ(kMalloc, (iter + 2)->frame);
-  ASSERT_EQ(1, (iter + 2)->parent_frame_index);
-
-  ASSERT_TRUE(iter + 3 == dedup->end());
-}
-
-// Test that there can be different call trees (there can be multiple bottom
-// frames). Also verify that frames with the same name but a different caller
-// are represented as distinct nodes.
-TEST(StackFrameDeduplicatorTest, MultipleRoots) {
-  StackFrame bt0[] = {kBrowserMain, kCreateWidget};
-  StackFrame bt1[] = {kRendererMain, kCreateWidget};
-
-  // The call tree should look like this (index in brackets).
-  //
-  // BrowserMain [0]
-  //   CreateWidget [1]
-  // RendererMain [2]
-  //   CreateWidget [3]
-  //
-  // Note that there will be two instances of CreateWidget,
-  // with different parents.
-
-  std::unique_ptr<StackFrameDeduplicator> dedup(new StackFrameDeduplicator);
-  ASSERT_EQ(1, dedup->Insert(std::begin(bt0), std::end(bt0)));
-  ASSERT_EQ(3, dedup->Insert(std::begin(bt1), std::end(bt1)));
-
-  auto iter = dedup->begin();
-  ASSERT_EQ(kBrowserMain, (iter + 0)->frame);
-  ASSERT_EQ(-1, (iter + 0)->parent_frame_index);
-
-  ASSERT_EQ(kCreateWidget, (iter + 1)->frame);
-  ASSERT_EQ(0, (iter + 1)->parent_frame_index);
-
-  ASSERT_EQ(kRendererMain, (iter + 2)->frame);
-  ASSERT_EQ(-1, (iter + 2)->parent_frame_index);
-
-  ASSERT_EQ(kCreateWidget, (iter + 3)->frame);
-  ASSERT_EQ(2, (iter + 3)->parent_frame_index);
-
-  ASSERT_TRUE(iter + 4 == dedup->end());
-}
-
-TEST(StackFrameDeduplicatorTest, Deduplication) {
-  StackFrame bt0[] = {kBrowserMain, kCreateWidget};
-  StackFrame bt1[] = {kBrowserMain, kInitialize};
-
-  // The call tree should look like this (index in brackets).
-  //
-  // BrowserMain [0]
-  //   CreateWidget [1]
-  //   Initialize [2]
-  //
-  // Note that BrowserMain will be re-used.
-
-  std::unique_ptr<StackFrameDeduplicator> dedup(new StackFrameDeduplicator);
-  ASSERT_EQ(1, dedup->Insert(std::begin(bt0), std::end(bt0)));
-  ASSERT_EQ(2, dedup->Insert(std::begin(bt1), std::end(bt1)));
-
-  auto iter = dedup->begin();
-  ASSERT_EQ(kBrowserMain, (iter + 0)->frame);
-  ASSERT_EQ(-1, (iter + 0)->parent_frame_index);
-
-  ASSERT_EQ(kCreateWidget, (iter + 1)->frame);
-  ASSERT_EQ(0, (iter + 1)->parent_frame_index);
-
-  ASSERT_EQ(kInitialize, (iter + 2)->frame);
-  ASSERT_EQ(0, (iter + 2)->parent_frame_index);
-
-  ASSERT_TRUE(iter + 3 == dedup->end());
-
-  // Inserting the same backtrace again should return the index of the existing
-  // node.
-  ASSERT_EQ(1, dedup->Insert(std::begin(bt0), std::end(bt0)));
-  ASSERT_EQ(2, dedup->Insert(std::begin(bt1), std::end(bt1)));
-  ASSERT_TRUE(dedup->begin() + 3 == dedup->end());
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/heap_profiler_type_name_deduplicator_unittest.cc b/base/trace_event/heap_profiler_type_name_deduplicator_unittest.cc
deleted file mode 100644
index f97808b..0000000
--- a/base/trace_event/heap_profiler_type_name_deduplicator_unittest.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <memory>
-#include <string>
-
-#include "base/json/json_reader.h"
-#include "base/trace_event/heap_profiler_type_name_deduplicator.h"
-#include "base/values.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-
-namespace {
-
-// Define all strings once, because the deduplicator requires pointer equality,
-// and string interning is unreliable.
-const char kInt[] = "int";
-const char kBool[] = "bool";
-const char kString[] = "string";
-const char kNeedsEscape[] = "\"quotes\"";
-
-std::unique_ptr<Value> DumpAndReadBack(
-    const TypeNameDeduplicator& deduplicator) {
-  std::string json;
-  deduplicator.AppendAsTraceFormat(&json);
-  return JSONReader::Read(json);
-}
-
-// Inserts a single type name into a new TypeNameDeduplicator instance and
-// checks if the value gets inserted and the exported value for |type_name| is
-// the same as |expected_value|.
-void TestInsertTypeAndReadback(const char* type_name,
-                               const char* expected_value) {
-  std::unique_ptr<TypeNameDeduplicator> dedup(new TypeNameDeduplicator);
-  ASSERT_EQ(1, dedup->Insert(type_name));
-
-  std::unique_ptr<Value> type_names = DumpAndReadBack(*dedup);
-  ASSERT_NE(nullptr, type_names);
-
-  const DictionaryValue* dictionary;
-  ASSERT_TRUE(type_names->GetAsDictionary(&dictionary));
-
-  // When the type name was inserted, it got ID 1. The exported key "1"
-  // should be equal to |expected_value|.
-  std::string value;
-  ASSERT_TRUE(dictionary->GetString("1", &value));
-  ASSERT_EQ(expected_value, value);
-}
-
-}  // namespace
-
-TEST(TypeNameDeduplicatorTest, Deduplication) {
-  // The type IDs should be like this:
-  // 0: [unknown]
-  // 1: int
-  // 2: bool
-  // 3: string
-
-  std::unique_ptr<TypeNameDeduplicator> dedup(new TypeNameDeduplicator);
-  ASSERT_EQ(1, dedup->Insert(kInt));
-  ASSERT_EQ(2, dedup->Insert(kBool));
-  ASSERT_EQ(3, dedup->Insert(kString));
-
-  // Inserting again should return the same IDs.
-  ASSERT_EQ(2, dedup->Insert(kBool));
-  ASSERT_EQ(1, dedup->Insert(kInt));
-  ASSERT_EQ(3, dedup->Insert(kString));
-
-  // A null pointer should yield type ID 0.
-  ASSERT_EQ(0, dedup->Insert(nullptr));
-}
-
-TEST(TypeNameDeduplicatorTest, EscapeTypeName) {
-  // Reading json should not fail, because the type name should have been
-  // escaped properly and exported value should contain quotes.
-  TestInsertTypeAndReadback(kNeedsEscape, kNeedsEscape);
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/java_heap_dump_provider_android_unittest.cc b/base/trace_event/java_heap_dump_provider_android_unittest.cc
deleted file mode 100644
index 9b9eb17..0000000
--- a/base/trace_event/java_heap_dump_provider_android_unittest.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/java_heap_dump_provider_android.h"
-
-#include "base/trace_event/process_memory_dump.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-
-TEST(JavaHeapDumpProviderTest, JavaHeapDump) {
-  auto* jhdp = JavaHeapDumpProvider::GetInstance();
-  MemoryDumpArgs dump_args = {MemoryDumpLevelOfDetail::DETAILED};
-  std::unique_ptr<ProcessMemoryDump> pmd(
-      new ProcessMemoryDump(nullptr, dump_args));
-
-  jhdp->OnMemoryDump(dump_args, pmd.get());
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/memory_allocator_dump_unittest.cc b/base/trace_event/memory_allocator_dump_unittest.cc
deleted file mode 100644
index 3818629..0000000
--- a/base/trace_event/memory_allocator_dump_unittest.cc
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/memory_allocator_dump.h"
-
-#include <stdint.h>
-
-#include "base/format_macros.h"
-#include "base/strings/stringprintf.h"
-#include "base/trace_event/heap_profiler_serialization_state.h"
-#include "base/trace_event/memory_allocator_dump_guid.h"
-#include "base/trace_event/memory_dump_provider.h"
-#include "base/trace_event/process_memory_dump.h"
-#include "base/trace_event/trace_event_argument.h"
-#include "base/values.h"
-#include "build_config.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using testing::ElementsAre;
-using testing::Eq;
-using testing::ByRef;
-using testing::IsEmpty;
-using testing::Contains;
-
-namespace base {
-namespace trace_event {
-
-namespace {
-
-class FakeMemoryAllocatorDumpProvider : public MemoryDumpProvider {
- public:
-  bool OnMemoryDump(const MemoryDumpArgs& args,
-                    ProcessMemoryDump* pmd) override {
-    MemoryAllocatorDump* root_heap =
-        pmd->CreateAllocatorDump("foobar_allocator");
-
-    root_heap->AddScalar(MemoryAllocatorDump::kNameSize,
-                         MemoryAllocatorDump::kUnitsBytes, 4096);
-    root_heap->AddScalar(MemoryAllocatorDump::kNameObjectCount,
-                         MemoryAllocatorDump::kUnitsObjects, 42);
-    root_heap->AddScalar("attr1", "units1", 1234);
-    root_heap->AddString("attr2", "units2", "string_value");
-
-    MemoryAllocatorDump* sub_heap =
-        pmd->CreateAllocatorDump("foobar_allocator/sub_heap");
-    sub_heap->AddScalar(MemoryAllocatorDump::kNameSize,
-                        MemoryAllocatorDump::kUnitsBytes, 1);
-    sub_heap->AddScalar(MemoryAllocatorDump::kNameObjectCount,
-                        MemoryAllocatorDump::kUnitsObjects, 3);
-
-    pmd->CreateAllocatorDump("foobar_allocator/sub_heap/empty");
-    // Leave the rest of sub heap deliberately uninitialized, to check that
-    // CreateAllocatorDump returns a properly zero-initialized object.
-
-    return true;
-  }
-};
-
-void CheckString(const MemoryAllocatorDump* dump,
-                 const std::string& name,
-                 const char* expected_units,
-                 const std::string& expected_value) {
-  MemoryAllocatorDump::Entry expected(name, expected_units, expected_value);
-  EXPECT_THAT(dump->entries(), Contains(Eq(ByRef(expected))));
-}
-
-void CheckScalar(const MemoryAllocatorDump* dump,
-                 const std::string& name,
-                 const char* expected_units,
-                 uint64_t expected_value) {
-  MemoryAllocatorDump::Entry expected(name, expected_units, expected_value);
-  EXPECT_THAT(dump->entries(), Contains(Eq(ByRef(expected))));
-}
-
-}  // namespace
-
-TEST(MemoryAllocatorDumpTest, GuidGeneration) {
-  std::unique_ptr<MemoryAllocatorDump> mad(new MemoryAllocatorDump(
-      "foo", MemoryDumpLevelOfDetail::FIRST, MemoryAllocatorDumpGuid(0x42u)));
-  ASSERT_EQ("42", mad->guid().ToString());
-}
-
-TEST(MemoryAllocatorDumpTest, DumpIntoProcessMemoryDump) {
-  FakeMemoryAllocatorDumpProvider fmadp;
-  MemoryDumpArgs dump_args = {MemoryDumpLevelOfDetail::DETAILED};
-  ProcessMemoryDump pmd(new HeapProfilerSerializationState, dump_args);
-
-  fmadp.OnMemoryDump(dump_args, &pmd);
-
-  ASSERT_EQ(3u, pmd.allocator_dumps().size());
-
-  const MemoryAllocatorDump* root_heap =
-      pmd.GetAllocatorDump("foobar_allocator");
-  ASSERT_NE(nullptr, root_heap);
-  EXPECT_EQ("foobar_allocator", root_heap->absolute_name());
-  CheckScalar(root_heap, MemoryAllocatorDump::kNameSize,
-              MemoryAllocatorDump::kUnitsBytes, 4096);
-  CheckScalar(root_heap, MemoryAllocatorDump::kNameObjectCount,
-              MemoryAllocatorDump::kUnitsObjects, 42);
-  CheckScalar(root_heap, "attr1", "units1", 1234);
-  CheckString(root_heap, "attr2", "units2", "string_value");
-
-  const MemoryAllocatorDump* sub_heap =
-      pmd.GetAllocatorDump("foobar_allocator/sub_heap");
-  ASSERT_NE(nullptr, sub_heap);
-  EXPECT_EQ("foobar_allocator/sub_heap", sub_heap->absolute_name());
-  CheckScalar(sub_heap, MemoryAllocatorDump::kNameSize,
-              MemoryAllocatorDump::kUnitsBytes, 1);
-  CheckScalar(sub_heap, MemoryAllocatorDump::kNameObjectCount,
-              MemoryAllocatorDump::kUnitsObjects, 3);
-  const MemoryAllocatorDump* empty_sub_heap =
-      pmd.GetAllocatorDump("foobar_allocator/sub_heap/empty");
-  ASSERT_NE(nullptr, empty_sub_heap);
-  EXPECT_EQ("foobar_allocator/sub_heap/empty", empty_sub_heap->absolute_name());
-
-  EXPECT_THAT(empty_sub_heap->entries(), IsEmpty());
-
-  // Check that calling serialization routines doesn't cause a crash.
-  std::unique_ptr<TracedValue> traced_value(new TracedValue);
-  pmd.SerializeAllocatorDumpsInto(traced_value.get());
-  pmd.SerializeHeapProfilerDumpsInto(traced_value.get());
-}
-
-TEST(MemoryAllocatorDumpTest, GetSize) {
-  MemoryDumpArgs dump_args = {MemoryDumpLevelOfDetail::DETAILED};
-  ProcessMemoryDump pmd(new HeapProfilerSerializationState, dump_args);
-  MemoryAllocatorDump* dump = pmd.CreateAllocatorDump("allocator_for_size");
-  dump->AddScalar(MemoryAllocatorDump::kNameSize,
-                  MemoryAllocatorDump::kUnitsBytes, 1);
-  dump->AddScalar("foo", MemoryAllocatorDump::kUnitsBytes, 2);
-  EXPECT_EQ(1u, dump->GetSizeInternal());
-}
-
-TEST(MemoryAllocatorDumpTest, ReadValues) {
-  MemoryDumpArgs dump_args = {MemoryDumpLevelOfDetail::DETAILED};
-  ProcessMemoryDump pmd(new HeapProfilerSerializationState, dump_args);
-  MemoryAllocatorDump* dump = pmd.CreateAllocatorDump("allocator_for_size");
-  dump->AddScalar("one", "byte", 1);
-  dump->AddString("one", "object", "one");
-
-  MemoryAllocatorDump::Entry expected_scalar("one", "byte", 1);
-  MemoryAllocatorDump::Entry expected_string("one", "object", "one");
-  EXPECT_THAT(dump->entries(), ElementsAre(Eq(ByRef(expected_scalar)),
-                                           Eq(ByRef(expected_string))));
-}
-
-TEST(MemoryAllocatorDumpTest, MovingAnEntry) {
-  MemoryAllocatorDump::Entry expected_entry("one", "byte", 1);
-  MemoryAllocatorDump::Entry from_entry("one", "byte", 1);
-  MemoryAllocatorDump::Entry to_entry = std::move(from_entry);
-  EXPECT_EQ(expected_entry, to_entry);
-}
-
-// DEATH tests are not supported in Android/iOS/Fuchsia.
-#if !defined(NDEBUG) && !defined(OS_ANDROID) && !defined(OS_IOS) && \
-    !defined(OS_FUCHSIA)
-TEST(MemoryAllocatorDumpTest, ForbidDuplicatesDeathTest) {
-  FakeMemoryAllocatorDumpProvider fmadp;
-  MemoryDumpArgs dump_args = {MemoryDumpLevelOfDetail::DETAILED};
-  ProcessMemoryDump pmd(new HeapProfilerSerializationState, dump_args);
-  pmd.CreateAllocatorDump("foo_allocator");
-  pmd.CreateAllocatorDump("bar_allocator/heap");
-  ASSERT_DEATH(pmd.CreateAllocatorDump("foo_allocator"), "");
-  ASSERT_DEATH(pmd.CreateAllocatorDump("bar_allocator/heap"), "");
-  ASSERT_DEATH(pmd.CreateAllocatorDump(""), "");
-}
-
-TEST(MemoryAllocatorDumpTest, ForbidStringsInBackgroundModeDeathTest) {
-  MemoryDumpArgs dump_args = {MemoryDumpLevelOfDetail::BACKGROUND};
-  ProcessMemoryDump pmd(new HeapProfilerSerializationState, dump_args);
-  MemoryAllocatorDump* dump = pmd.CreateAllocatorDump("malloc");
-  ASSERT_DEATH(dump->AddString("foo", "bar", "baz"), "");
-}
-#endif
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/memory_dump_manager_unittest.cc b/base/trace_event/memory_dump_manager_unittest.cc
deleted file mode 100644
index 8ed5fb3..0000000
--- a/base/trace_event/memory_dump_manager_unittest.cc
+++ /dev/null
@@ -1,884 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/memory_dump_manager.h"
-
-#include <stdint.h>
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/base_switches.h"
-#include "base/callback.h"
-#include "base/command_line.h"
-#include "base/debug/thread_heap_usage_tracker.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/test/test_io_thread.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/trace_event/memory_dump_manager_test_utils.h"
-#include "base/trace_event/memory_dump_provider.h"
-#include "base/trace_event/memory_dump_request_args.h"
-#include "base/trace_event/memory_dump_scheduler.h"
-#include "base/trace_event/memory_infra_background_whitelist.h"
-#include "base/trace_event/process_memory_dump.h"
-#include "build_config.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using testing::_;
-using testing::AtMost;
-using testing::Between;
-using testing::Invoke;
-using testing::Return;
-
-namespace base {
-namespace trace_event {
-
-// GTest matchers for MemoryDumpRequestArgs arguments.
-MATCHER(IsDetailedDump, "") {
-  return arg.level_of_detail == MemoryDumpLevelOfDetail::DETAILED;
-}
-
-MATCHER(IsLightDump, "") {
-  return arg.level_of_detail == MemoryDumpLevelOfDetail::LIGHT;
-}
-
-namespace {
-
-const char* kMDPName = "TestDumpProvider";
-const char* kWhitelistedMDPName = "WhitelistedTestDumpProvider";
-const char* const kTestMDPWhitelist[] = {kWhitelistedMDPName, nullptr};
-
-void RegisterDumpProvider(
-    MemoryDumpProvider* mdp,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-    const MemoryDumpProvider::Options& options,
-    const char* name = kMDPName) {
-  MemoryDumpManager* mdm = MemoryDumpManager::GetInstance();
-  mdm->set_dumper_registrations_ignored_for_testing(false);
-  mdm->RegisterDumpProvider(mdp, name, std::move(task_runner), options);
-  mdm->set_dumper_registrations_ignored_for_testing(true);
-}
-
-void RegisterDumpProvider(
-    MemoryDumpProvider* mdp,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
-  RegisterDumpProvider(mdp, task_runner, MemoryDumpProvider::Options());
-}
-
-void RegisterDumpProviderWithSequencedTaskRunner(
-    MemoryDumpProvider* mdp,
-    scoped_refptr<base::SequencedTaskRunner> task_runner,
-    const MemoryDumpProvider::Options& options) {
-  MemoryDumpManager* mdm = MemoryDumpManager::GetInstance();
-  mdm->set_dumper_registrations_ignored_for_testing(false);
-  mdm->RegisterDumpProviderWithSequencedTaskRunner(mdp, kMDPName, task_runner,
-                                                   options);
-  mdm->set_dumper_registrations_ignored_for_testing(true);
-}
-
-// Posts |task| to |task_runner| and blocks until it is executed.
-void PostTaskAndWait(const Location& from_here,
-                     SequencedTaskRunner* task_runner,
-                     base::OnceClosure task) {
-  base::WaitableEvent event(WaitableEvent::ResetPolicy::MANUAL,
-                            WaitableEvent::InitialState::NOT_SIGNALED);
-  task_runner->PostTask(from_here, std::move(task));
-  task_runner->PostTask(FROM_HERE, base::BindOnce(&WaitableEvent::Signal,
-                                                  base::Unretained(&event)));
-  // The SequencedTaskRunner guarantees that |event| will only be signaled after
-  // |task| is executed.
-  event.Wait();
-}
-
-class MockMemoryDumpProvider : public MemoryDumpProvider {
- public:
-  MOCK_METHOD0(Destructor, void());
-  MOCK_METHOD2(OnMemoryDump,
-               bool(const MemoryDumpArgs& args, ProcessMemoryDump* pmd));
-  MOCK_METHOD1(OnHeapProfilingEnabled, void(bool enabled));
-  MOCK_METHOD1(PollFastMemoryTotal, void(uint64_t* memory_total));
-  MOCK_METHOD0(SuspendFastMemoryPolling, void());
-
-  MockMemoryDumpProvider() : enable_mock_destructor(false) {
-    ON_CALL(*this, OnMemoryDump(_, _))
-        .WillByDefault(
-            Invoke([](const MemoryDumpArgs&, ProcessMemoryDump* pmd) -> bool {
-              return true;
-            }));
-
-    ON_CALL(*this, PollFastMemoryTotal(_))
-        .WillByDefault(
-            Invoke([](uint64_t* memory_total) -> void { NOTREACHED(); }));
-  }
-  ~MockMemoryDumpProvider() override {
-    if (enable_mock_destructor)
-      Destructor();
-  }
-
-  bool enable_mock_destructor;
-};
-
-class TestSequencedTaskRunner : public SequencedTaskRunner {
- public:
-  TestSequencedTaskRunner() = default;
-
-  void set_enabled(bool value) { enabled_ = value; }
-  unsigned no_of_post_tasks() const { return num_of_post_tasks_; }
-
-  bool PostNonNestableDelayedTask(const Location& from_here,
-                                  OnceClosure task,
-                                  TimeDelta delay) override {
-    NOTREACHED();
-    return false;
-  }
-
-  bool PostDelayedTask(const Location& from_here,
-                       OnceClosure task,
-                       TimeDelta delay) override {
-    num_of_post_tasks_++;
-    if (enabled_) {
-      return task_runner_->PostDelayedTask(from_here, std::move(task), delay);
-    }
-    return false;
-  }
-
-  bool RunsTasksInCurrentSequence() const override {
-    return task_runner_->RunsTasksInCurrentSequence();
-  }
-
- private:
-  ~TestSequencedTaskRunner() override = default;
-
-  const scoped_refptr<SequencedTaskRunner> task_runner_ =
-      CreateSequencedTaskRunnerWithTraits({});
-  bool enabled_ = true;
-  unsigned num_of_post_tasks_ = 0;
-};
-
-class TestingThreadHeapUsageTracker : public debug::ThreadHeapUsageTracker {
- public:
-  using ThreadHeapUsageTracker::DisableHeapTrackingForTesting;
-};
-
-}  // namespace
-
-class MemoryDumpManagerTest : public testing::Test {
- public:
-  MemoryDumpManagerTest(bool is_coordinator = false)
-      : is_coordinator_(is_coordinator) {}
-
-  void SetUp() override {
-    // Bring up and initialize MemoryDumpManager while single-threaded (before
-    // instantiating ScopedTaskEnvironment) to avoid data races if worker
-    // threads use tracing globals early.
-    mdm_ = MemoryDumpManager::CreateInstanceForTesting();
-    ASSERT_EQ(mdm_.get(), MemoryDumpManager::GetInstance());
-
-    InitializeMemoryDumpManagerForInProcessTesting(is_coordinator_);
-
-    scoped_task_environment_ = std::make_unique<test::ScopedTaskEnvironment>();
-  }
-
-  void TearDown() override {
-    scoped_task_environment_.reset();
-
-    // Tear down the MemoryDumpManager while single-threaded to mirror logic in
-    // SetUp().
-    mdm_.reset();
-    TraceLog::ResetForTesting();
-  }
-
- protected:
-  // Blocks the current thread (spinning a nested message loop) until the
-  // memory dump is complete. Returns:
-  // - return value: the |success| from the CreateProcessDump() callback.
-  bool RequestProcessDumpAndWait(MemoryDumpType dump_type,
-                                 MemoryDumpLevelOfDetail level_of_detail) {
-    RunLoop run_loop;
-    bool success = false;
-    static uint64_t test_guid = 1;
-    test_guid++;
-    MemoryDumpRequestArgs request_args{test_guid, dump_type, level_of_detail};
-
-    // The signature of the callback delivered by MemoryDumpManager is:
-    // void ProcessMemoryDumpCallback(
-    //     uint64_t dump_guid,
-    //     bool success,
-    //     std::unique_ptr<ProcessMemoryDump> pmd)
-    // The extra arguments prepended to the |callback| below (the ones with the
-    // "curried_" prefix) are just passed from the Bind(). This is just to get
-    // around the limitation of Bind() in supporting only capture-less lambdas.
-    ProcessMemoryDumpCallback callback = Bind(
-        [](bool* curried_success, Closure curried_quit_closure,
-           uint64_t curried_expected_guid, bool success, uint64_t dump_guid,
-           std::unique_ptr<ProcessMemoryDump> pmd) {
-          *curried_success = success;
-          EXPECT_EQ(curried_expected_guid, dump_guid);
-          ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
-                                                  curried_quit_closure);
-        },
-        Unretained(&success), run_loop.QuitClosure(), test_guid);
-
-    mdm_->CreateProcessDump(request_args, callback);
-    run_loop.Run();
-    return success;
-  }
-
-  void EnableForTracing() {
-    mdm_->SetupForTracing(TraceConfig::MemoryDumpConfig());
-  }
-
-  void EnableForTracingWithTraceConfig(const std::string trace_config_string) {
-    TraceConfig trace_config(trace_config_string);
-    mdm_->SetupForTracing(trace_config.memory_dump_config());
-  }
-
-  void DisableTracing() { mdm_->TeardownForTracing(); }
-
-  int GetMaxConsecutiveFailuresCount() const {
-    return MemoryDumpManager::kMaxConsecutiveFailuresCount;
-  }
-
-  const MemoryDumpProvider::Options kDefaultOptions;
-  std::unique_ptr<MemoryDumpManager> mdm_;
-
- private:
-  // To tear down the singleton instance after each test.
-  ShadowingAtExitManager at_exit_manager_;
-
-  std::unique_ptr<test::ScopedTaskEnvironment> scoped_task_environment_;
-
-  // Whether the test MemoryDumpManager should be initialized as the
-  // coordinator.
-  const bool is_coordinator_;
-
-  DISALLOW_COPY_AND_ASSIGN(MemoryDumpManagerTest);
-};
-
-class MemoryDumpManagerTestAsCoordinator : public MemoryDumpManagerTest {
- public:
-  MemoryDumpManagerTestAsCoordinator() : MemoryDumpManagerTest(true) {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MemoryDumpManagerTestAsCoordinator);
-};
-
-// Basic sanity checks. Registers a memory dump provider and checks that it is
-// called.
-TEST_F(MemoryDumpManagerTest, SingleDumper) {
-  MockMemoryDumpProvider mdp;
-  RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get());
-
-  // Now repeat enabling the memory category and check that the dumper is
-  // invoked this time.
-  EnableForTracing();
-  EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3);
-  for (int i = 0; i < 3; ++i) {
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-  }
-  DisableTracing();
-
-  mdm_->UnregisterDumpProvider(&mdp);
-
-  // Finally check the unregister logic: the global dump handler will be invoked
-  // but not the dump provider, as it has been unregistered.
-  EnableForTracing();
-  EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0);
-  for (int i = 0; i < 3; ++i) {
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-  }
-  DisableTracing();
-}
-
-// Checks that requesting dumps with high level of detail actually propagates
-// the level of the detail properly to OnMemoryDump() call on dump providers.
-TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) {
-  MockMemoryDumpProvider mdp;
-
-  RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get());
-  EnableForTracing();
-  EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _));
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::DETAILED));
-  DisableTracing();
-  mdm_->UnregisterDumpProvider(&mdp);
-
-  // Check that requesting dumps with low level of detail actually propagates to
-  // OnMemoryDump() call on dump providers.
-  RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get());
-  EnableForTracing();
-  EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _));
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::LIGHT));
-  DisableTracing();
-  mdm_->UnregisterDumpProvider(&mdp);
-}
-
-// Checks that the HeapProfilerSerializationState object is actually
-// shared over time.
-TEST_F(MemoryDumpManagerTest, HeapProfilerSerializationState) {
-  MockMemoryDumpProvider mdp1;
-  MockMemoryDumpProvider mdp2;
-  RegisterDumpProvider(&mdp1, nullptr);
-  RegisterDumpProvider(&mdp2, nullptr);
-
-  EnableForTracing();
-  const HeapProfilerSerializationState* heap_profiler_serialization_state =
-      mdm_->heap_profiler_serialization_state_for_testing().get();
-  EXPECT_CALL(mdp1, OnMemoryDump(_, _))
-      .Times(2)
-      .WillRepeatedly(
-          Invoke([heap_profiler_serialization_state](
-                     const MemoryDumpArgs&, ProcessMemoryDump* pmd) -> bool {
-            EXPECT_EQ(heap_profiler_serialization_state,
-                      pmd->heap_profiler_serialization_state().get());
-            return true;
-          }));
-  EXPECT_CALL(mdp2, OnMemoryDump(_, _))
-      .Times(2)
-      .WillRepeatedly(
-          Invoke([heap_profiler_serialization_state](
-                     const MemoryDumpArgs&, ProcessMemoryDump* pmd) -> bool {
-            EXPECT_EQ(heap_profiler_serialization_state,
-                      pmd->heap_profiler_serialization_state().get());
-            return true;
-          }));
-
-  for (int i = 0; i < 2; ++i) {
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-  }
-
-  DisableTracing();
-}
-
-// Checks that the (Un)RegisterDumpProvider logic behaves sanely.
-TEST_F(MemoryDumpManagerTest, MultipleDumpers) {
-  MockMemoryDumpProvider mdp1;
-  MockMemoryDumpProvider mdp2;
-
-  // Enable only mdp1.
-  RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get());
-  EnableForTracing();
-  EXPECT_CALL(mdp1, OnMemoryDump(_, _));
-  EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0);
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::DETAILED));
-  DisableTracing();
-
-  // Invert: enable mdp2 and disable mdp1.
-  mdm_->UnregisterDumpProvider(&mdp1);
-  RegisterDumpProvider(&mdp2, nullptr);
-  EnableForTracing();
-  EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0);
-  EXPECT_CALL(mdp2, OnMemoryDump(_, _));
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::DETAILED));
-  DisableTracing();
-
-  // Enable both mdp1 and mdp2.
-  RegisterDumpProvider(&mdp1, nullptr);
-  EnableForTracing();
-  EXPECT_CALL(mdp1, OnMemoryDump(_, _));
-  EXPECT_CALL(mdp2, OnMemoryDump(_, _));
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::DETAILED));
-  DisableTracing();
-}
-
-// Checks that the dump provider invocations depend only on the current
-// registration state and not on previous registrations and dumps.
-// Flaky on iOS, see crbug.com/706874
-#if defined(OS_IOS)
-#define MAYBE_RegistrationConsistency DISABLED_RegistrationConsistency
-#else
-#define MAYBE_RegistrationConsistency RegistrationConsistency
-#endif
-TEST_F(MemoryDumpManagerTest, MAYBE_RegistrationConsistency) {
-  MockMemoryDumpProvider mdp;
-
-  RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get());
-
-  {
-    EXPECT_CALL(mdp, OnMemoryDump(_, _));
-    EnableForTracing();
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-    DisableTracing();
-  }
-
-  mdm_->UnregisterDumpProvider(&mdp);
-
-  {
-    EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0);
-    EnableForTracing();
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-    DisableTracing();
-  }
-
-  RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get());
-  mdm_->UnregisterDumpProvider(&mdp);
-
-  {
-    EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0);
-    EnableForTracing();
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-    DisableTracing();
-  }
-
-  RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get());
-  mdm_->UnregisterDumpProvider(&mdp);
-  RegisterDumpProvider(&mdp, ThreadTaskRunnerHandle::Get());
-
-  {
-    EXPECT_CALL(mdp, OnMemoryDump(_, _));
-    EnableForTracing();
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-    DisableTracing();
-  }
-}
-
-// Checks that the MemoryDumpManager respects the thread affinity when a
-// MemoryDumpProvider specifies a task_runner(). The test starts creating 8
-// threads and registering a MemoryDumpProvider on each of them. At each
-// iteration, one thread is removed, to check the live unregistration logic.
-TEST_F(MemoryDumpManagerTest, RespectTaskRunnerAffinity) {
-  const uint32_t kNumInitialThreads = 8;
-
-  std::vector<std::unique_ptr<Thread>> threads;
-  std::vector<std::unique_ptr<MockMemoryDumpProvider>> mdps;
-
-  // Create the threads and setup the expectations. Given that at each iteration
-  // we will pop out one thread/MemoryDumpProvider, each MDP is supposed to be
-  // invoked a number of times equal to its index.
-  for (uint32_t i = kNumInitialThreads; i > 0; --i) {
-    threads.push_back(WrapUnique(new Thread("test thread")));
-    auto* thread = threads.back().get();
-    thread->Start();
-    scoped_refptr<SingleThreadTaskRunner> task_runner = thread->task_runner();
-    mdps.push_back(WrapUnique(new MockMemoryDumpProvider()));
-    auto* mdp = mdps.back().get();
-    RegisterDumpProvider(mdp, task_runner, kDefaultOptions);
-    EXPECT_CALL(*mdp, OnMemoryDump(_, _))
-        .Times(i)
-        .WillRepeatedly(Invoke(
-            [task_runner](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool {
-              EXPECT_TRUE(task_runner->RunsTasksInCurrentSequence());
-              return true;
-            }));
-  }
-  EnableForTracing();
-
-  while (!threads.empty()) {
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-
-    // Unregister a MDP and destroy one thread at each iteration to check the
-    // live unregistration logic. The unregistration needs to happen on the same
-    // thread the MDP belongs to.
-    {
-      RunLoop run_loop;
-      Closure unregistration =
-          Bind(&MemoryDumpManager::UnregisterDumpProvider,
-               Unretained(mdm_.get()), Unretained(mdps.back().get()));
-      threads.back()->task_runner()->PostTaskAndReply(FROM_HERE, unregistration,
-                                                      run_loop.QuitClosure());
-      run_loop.Run();
-    }
-    mdps.pop_back();
-    threads.back()->Stop();
-    threads.pop_back();
-  }
-
-  DisableTracing();
-}
-
-// Check that the memory dump calls are always posted on task runner for
-// SequencedTaskRunner case and that the dump provider gets disabled when
-// PostTask fails, but the dump still succeeds.
-TEST_F(MemoryDumpManagerTest, PostTaskForSequencedTaskRunner) {
-  std::vector<MockMemoryDumpProvider> mdps(3);
-  scoped_refptr<TestSequencedTaskRunner> task_runner1(
-      MakeRefCounted<TestSequencedTaskRunner>());
-  scoped_refptr<TestSequencedTaskRunner> task_runner2(
-      MakeRefCounted<TestSequencedTaskRunner>());
-  RegisterDumpProviderWithSequencedTaskRunner(&mdps[0], task_runner1,
-                                              kDefaultOptions);
-  RegisterDumpProviderWithSequencedTaskRunner(&mdps[1], task_runner2,
-                                              kDefaultOptions);
-  RegisterDumpProviderWithSequencedTaskRunner(&mdps[2], task_runner2,
-                                              kDefaultOptions);
-  // |mdps[0]| should be disabled permanently after first dump.
-  EXPECT_CALL(mdps[0], OnMemoryDump(_, _)).Times(0);
-  EXPECT_CALL(mdps[1], OnMemoryDump(_, _)).Times(2);
-  EXPECT_CALL(mdps[2], OnMemoryDump(_, _)).Times(2);
-
-  EnableForTracing();
-
-  task_runner1->set_enabled(false);
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::DETAILED));
-  EXPECT_EQ(1u, task_runner1->no_of_post_tasks());
-  EXPECT_EQ(1u, task_runner2->no_of_post_tasks());
-
-  task_runner1->set_enabled(true);
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::DETAILED));
-  EXPECT_EQ(2u, task_runner1->no_of_post_tasks());
-  EXPECT_EQ(2u, task_runner2->no_of_post_tasks());
-  DisableTracing();
-}
-
-// Checks that providers get disabled after 3 consecutive failures, but not
-// otherwise (e.g., if interleaved).
-TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) {
-  MockMemoryDumpProvider mdp1;
-  MockMemoryDumpProvider mdp2;
-
-  RegisterDumpProvider(&mdp1, nullptr);
-  RegisterDumpProvider(&mdp2, nullptr);
-  EnableForTracing();
-
-  EXPECT_CALL(mdp1, OnMemoryDump(_, _))
-      .Times(GetMaxConsecutiveFailuresCount())
-      .WillRepeatedly(Return(false));
-
-  EXPECT_CALL(mdp2, OnMemoryDump(_, _))
-      .WillOnce(Return(false))
-      .WillOnce(Return(true))
-      .WillOnce(Return(false))
-      .WillOnce(Return(false))
-      .WillOnce(Return(true))
-      .WillOnce(Return(false));
-
-  const int kNumDumps = 2 * GetMaxConsecutiveFailuresCount();
-  for (int i = 0; i < kNumDumps; i++) {
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-  }
-
-  DisableTracing();
-}
-
-// Sneakily registers an extra memory dump provider while an existing one is
-// dumping and expect it to take part in the already active tracing session.
-TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) {
-  MockMemoryDumpProvider mdp1;
-  MockMemoryDumpProvider mdp2;
-
-  RegisterDumpProvider(&mdp1, nullptr);
-  EnableForTracing();
-
-  EXPECT_CALL(mdp1, OnMemoryDump(_, _))
-      .Times(4)
-      .WillOnce(Return(true))
-      .WillOnce(
-          Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool {
-            RegisterDumpProvider(&mdp2, nullptr);
-            return true;
-          }))
-      .WillRepeatedly(Return(true));
-
-  // Depending on the insertion order (before or after mdp1), mdp2 might be
-  // called also immediately after it gets registered.
-  EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(Between(2, 3));
-
-  for (int i = 0; i < 4; i++) {
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-  }
-
-  DisableTracing();
-}
-
-// Like RegisterDumperWhileDumping, but unregister the dump provider instead.
-TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) {
-  MockMemoryDumpProvider mdp1;
-  MockMemoryDumpProvider mdp2;
-
-  RegisterDumpProvider(&mdp1, ThreadTaskRunnerHandle::Get(), kDefaultOptions);
-  RegisterDumpProvider(&mdp2, ThreadTaskRunnerHandle::Get(), kDefaultOptions);
-  EnableForTracing();
-
-  EXPECT_CALL(mdp1, OnMemoryDump(_, _))
-      .Times(4)
-      .WillOnce(Return(true))
-      .WillOnce(
-          Invoke([&mdp2](const MemoryDumpArgs&, ProcessMemoryDump*) -> bool {
-            MemoryDumpManager::GetInstance()->UnregisterDumpProvider(&mdp2);
-            return true;
-          }))
-      .WillRepeatedly(Return(true));
-
-  // Depending on the insertion order (before or after mdp1), mdp2 might have
-  // been already called when UnregisterDumpProvider happens.
-  EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(Between(1, 2));
-
-  for (int i = 0; i < 4; i++) {
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-  }
-
-  DisableTracing();
-}
-
-// Checks that the dump does not abort when unregistering a provider while
-// dumping from a different thread than the dumping thread.
-TEST_F(MemoryDumpManagerTest, UnregisterDumperFromThreadWhileDumping) {
-  std::vector<std::unique_ptr<TestIOThread>> threads;
-  std::vector<std::unique_ptr<MockMemoryDumpProvider>> mdps;
-
-  for (int i = 0; i < 2; i++) {
-    threads.push_back(
-        WrapUnique(new TestIOThread(TestIOThread::kAutoStart)));
-    mdps.push_back(WrapUnique(new MockMemoryDumpProvider()));
-    RegisterDumpProvider(mdps.back().get(), threads.back()->task_runner(),
-                         kDefaultOptions);
-  }
-
-  int on_memory_dump_call_count = 0;
-
-  // When OnMemoryDump is called on either of the dump providers, it will
-  // unregister the other one.
-  for (const std::unique_ptr<MockMemoryDumpProvider>& mdp : mdps) {
-    int other_idx = (mdps.front() == mdp);
-    // TestIOThread's task runner must be obtained from the main thread but can
-    // then be used from other threads.
-    scoped_refptr<SingleThreadTaskRunner> other_runner =
-        threads[other_idx]->task_runner();
-    MockMemoryDumpProvider* other_mdp = mdps[other_idx].get();
-    auto on_dump = [this, other_runner, other_mdp, &on_memory_dump_call_count](
-                       const MemoryDumpArgs& args, ProcessMemoryDump* pmd) {
-      PostTaskAndWait(FROM_HERE, other_runner.get(),
-                      base::BindOnce(&MemoryDumpManager::UnregisterDumpProvider,
-                                     base::Unretained(&*mdm_), other_mdp));
-      on_memory_dump_call_count++;
-      return true;
-    };
-
-    // OnMemoryDump is called once for the provider that dumps first, and zero
-    // times for the other provider.
-    EXPECT_CALL(*mdp, OnMemoryDump(_, _))
-        .Times(AtMost(1))
-        .WillOnce(Invoke(on_dump));
-  }
-
-  EnableForTracing();
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::DETAILED));
-  ASSERT_EQ(1, on_memory_dump_call_count);
-
-  DisableTracing();
-}
-
-// If a thread (with a dump provider living on it) is torn down during a dump
-// its dump provider should be skipped but the dump itself should succeed.
-TEST_F(MemoryDumpManagerTest, TearDownThreadWhileDumping) {
-  std::vector<std::unique_ptr<TestIOThread>> threads;
-  std::vector<std::unique_ptr<MockMemoryDumpProvider>> mdps;
-
-  for (int i = 0; i < 2; i++) {
-    threads.push_back(
-        WrapUnique(new TestIOThread(TestIOThread::kAutoStart)));
-    mdps.push_back(WrapUnique(new MockMemoryDumpProvider()));
-    RegisterDumpProvider(mdps.back().get(), threads.back()->task_runner(),
-                         kDefaultOptions);
-  }
-
-  int on_memory_dump_call_count = 0;
-
-  // When OnMemoryDump is called on either of the dump providers, it will
-  // tear down the thread of the other one.
-  for (const std::unique_ptr<MockMemoryDumpProvider>& mdp : mdps) {
-    int other_idx = (mdps.front() == mdp);
-    TestIOThread* other_thread = threads[other_idx].get();
-    // TestIOThread isn't thread-safe and must be stopped on the |main_runner|.
-    scoped_refptr<SequencedTaskRunner> main_runner =
-        SequencedTaskRunnerHandle::Get();
-    auto on_dump = [other_thread, main_runner, &on_memory_dump_call_count](
-                       const MemoryDumpArgs& args, ProcessMemoryDump* pmd) {
-      PostTaskAndWait(
-          FROM_HERE, main_runner.get(),
-          base::BindOnce(&TestIOThread::Stop, base::Unretained(other_thread)));
-      on_memory_dump_call_count++;
-      return true;
-    };
-
-    // OnMemoryDump is called once for the provider that dumps first, and zero
-    // times for the other provider.
-    EXPECT_CALL(*mdp, OnMemoryDump(_, _))
-        .Times(AtMost(1))
-        .WillOnce(Invoke(on_dump));
-  }
-
-  EnableForTracing();
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::DETAILED));
-  ASSERT_EQ(1, on_memory_dump_call_count);
-
-  DisableTracing();
-}
-
-// Checks that the callback is invoked if CreateProcessDump() is called when
-// tracing is not enabled.
-TEST_F(MemoryDumpManagerTest, TriggerDumpWithoutTracing) {
-  MockMemoryDumpProvider mdp;
-  RegisterDumpProvider(&mdp, nullptr);
-  EXPECT_CALL(mdp, OnMemoryDump(_, _));
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::DETAILED));
-}
-
-TEST_F(MemoryDumpManagerTest, BackgroundWhitelisting) {
-  SetDumpProviderWhitelistForTesting(kTestMDPWhitelist);
-
-  // Standard provider with default options (create dump for current process).
-  MockMemoryDumpProvider backgroundMdp;
-  RegisterDumpProvider(&backgroundMdp, nullptr, kDefaultOptions,
-                       kWhitelistedMDPName);
-
-  EnableForTracing();
-
-  EXPECT_CALL(backgroundMdp, OnMemoryDump(_, _)).Times(1);
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::SUMMARY_ONLY,
-                                        MemoryDumpLevelOfDetail::BACKGROUND));
-  DisableTracing();
-}
-
-// Tests the basics of the UnregisterAndDeleteDumpProviderSoon(): the
-// unregistration should actually delete the providers and not leak them.
-TEST_F(MemoryDumpManagerTest, UnregisterAndDeleteDumpProviderSoon) {
-  static const int kNumProviders = 3;
-  int dtor_count = 0;
-  std::vector<std::unique_ptr<MemoryDumpProvider>> mdps;
-  for (int i = 0; i < kNumProviders; ++i) {
-    std::unique_ptr<MockMemoryDumpProvider> mdp(new MockMemoryDumpProvider);
-    mdp->enable_mock_destructor = true;
-    EXPECT_CALL(*mdp, Destructor())
-        .WillOnce(Invoke([&dtor_count]() { dtor_count++; }));
-    RegisterDumpProvider(mdp.get(), nullptr, kDefaultOptions);
-    mdps.push_back(std::move(mdp));
-  }
-
-  while (!mdps.empty()) {
-    mdm_->UnregisterAndDeleteDumpProviderSoon(std::move(mdps.back()));
-    mdps.pop_back();
-  }
-
-  ASSERT_EQ(kNumProviders, dtor_count);
-}
-
-// This test checks against races when unregistering an unbound dump provider
-// from another thread while dumping. It registers one MDP and, when
-// OnMemoryDump() is called, it invokes UnregisterAndDeleteDumpProviderSoon()
-// from another thread. The OnMemoryDump() and the dtor call are expected to
-// happen on the same thread (the MemoryDumpManager utility thread).
-TEST_F(MemoryDumpManagerTest, UnregisterAndDeleteDumpProviderSoonDuringDump) {
-  std::unique_ptr<MockMemoryDumpProvider> mdp(new MockMemoryDumpProvider);
-  mdp->enable_mock_destructor = true;
-  RegisterDumpProvider(mdp.get(), nullptr, kDefaultOptions);
-
-  base::PlatformThreadRef thread_ref;
-  auto self_unregister_from_another_thread = [&mdp, &thread_ref](
-      const MemoryDumpArgs&, ProcessMemoryDump*) -> bool {
-    thread_ref = PlatformThread::CurrentRef();
-    TestIOThread thread_for_unregistration(TestIOThread::kAutoStart);
-    PostTaskAndWait(
-        FROM_HERE, thread_for_unregistration.task_runner().get(),
-        base::BindOnce(&MemoryDumpManager::UnregisterAndDeleteDumpProviderSoon,
-                       base::Unretained(MemoryDumpManager::GetInstance()),
-                       std::move(mdp)));
-    thread_for_unregistration.Stop();
-    return true;
-  };
-  EXPECT_CALL(*mdp, OnMemoryDump(_, _))
-      .Times(1)
-      .WillOnce(Invoke(self_unregister_from_another_thread));
-  EXPECT_CALL(*mdp, Destructor())
-      .Times(1)
-      .WillOnce(Invoke([&thread_ref]() {
-        EXPECT_EQ(thread_ref, PlatformThread::CurrentRef());
-      }));
-
-  EnableForTracing();
-  for (int i = 0; i < 2; ++i) {
-    EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                          MemoryDumpLevelOfDetail::DETAILED));
-  }
-  DisableTracing();
-}
-
-// Mock MDP class that tests if the number of OnMemoryDump() calls are expected.
-// It is implemented without gmocks since EXPECT_CALL implementation is slow
-// when there are 1000s of instances, as required in
-// NoStackOverflowWithTooManyMDPs test.
-class SimpleMockMemoryDumpProvider : public MemoryDumpProvider {
- public:
-  SimpleMockMemoryDumpProvider(int expected_num_dump_calls)
-      : expected_num_dump_calls_(expected_num_dump_calls), num_dump_calls_(0) {}
-
-  ~SimpleMockMemoryDumpProvider() override {
-    EXPECT_EQ(expected_num_dump_calls_, num_dump_calls_);
-  }
-
-  bool OnMemoryDump(const MemoryDumpArgs& args,
-                    ProcessMemoryDump* pmd) override {
-    ++num_dump_calls_;
-    return true;
-  }
-
- private:
-  int expected_num_dump_calls_;
-  int num_dump_calls_;
-};
-
-TEST_F(MemoryDumpManagerTest, NoStackOverflowWithTooManyMDPs) {
-  SetDumpProviderWhitelistForTesting(kTestMDPWhitelist);
-
-  int kMDPCount = 1000;
-  std::vector<std::unique_ptr<SimpleMockMemoryDumpProvider>> mdps;
-  for (int i = 0; i < kMDPCount; ++i) {
-    mdps.push_back(std::make_unique<SimpleMockMemoryDumpProvider>(1));
-    RegisterDumpProvider(mdps.back().get(), nullptr);
-  }
-  for (int i = 0; i < kMDPCount; ++i) {
-    mdps.push_back(std::make_unique<SimpleMockMemoryDumpProvider>(3));
-    RegisterDumpProvider(mdps.back().get(), nullptr, kDefaultOptions,
-                         kWhitelistedMDPName);
-  }
-  std::unique_ptr<Thread> stopped_thread(new Thread("test thread"));
-  stopped_thread->Start();
-  for (int i = 0; i < kMDPCount; ++i) {
-    mdps.push_back(std::make_unique<SimpleMockMemoryDumpProvider>(0));
-    RegisterDumpProvider(mdps.back().get(), stopped_thread->task_runner(),
-                         kDefaultOptions, kWhitelistedMDPName);
-  }
-  stopped_thread->Stop();
-
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::DETAILED));
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
-                                        MemoryDumpLevelOfDetail::BACKGROUND));
-  EXPECT_TRUE(RequestProcessDumpAndWait(MemoryDumpType::SUMMARY_ONLY,
-                                        MemoryDumpLevelOfDetail::BACKGROUND));
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/memory_dump_scheduler_unittest.cc b/base/trace_event/memory_dump_scheduler_unittest.cc
deleted file mode 100644
index d5993b6..0000000
--- a/base/trace_event/memory_dump_scheduler_unittest.cc
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/memory_dump_scheduler.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::AtMost;
-using ::testing::Invoke;
-using ::testing::_;
-
-namespace base {
-namespace trace_event {
-
-namespace {
-
-// Wrapper to use gmock on a callback.
-struct CallbackWrapper {
-  MOCK_METHOD1(OnTick, void(MemoryDumpLevelOfDetail));
-};
-
-}  // namespace
-
-class MemoryDumpSchedulerTest : public testing::Test {
- public:
-  MemoryDumpSchedulerTest()
-      : testing::Test(),
-        evt_(WaitableEvent::ResetPolicy::MANUAL,
-             WaitableEvent::InitialState::NOT_SIGNALED),
-        bg_thread_("MemoryDumpSchedulerTest Thread") {
-    bg_thread_.Start();
-  }
-
- protected:
-  MemoryDumpScheduler scheduler_;
-  WaitableEvent evt_;
-  CallbackWrapper on_tick_;
-  Thread bg_thread_;
-};
-
-TEST_F(MemoryDumpSchedulerTest, SingleTrigger) {
-  const uint32_t kPeriodMs = 1;
-  const auto kLevelOfDetail = MemoryDumpLevelOfDetail::DETAILED;
-  const uint32_t kTicks = 5;
-  MemoryDumpScheduler::Config config;
-  config.triggers.push_back({kLevelOfDetail, kPeriodMs});
-  config.callback = Bind(&CallbackWrapper::OnTick, Unretained(&on_tick_));
-
-  testing::InSequence sequence;
-  EXPECT_CALL(on_tick_, OnTick(_)).Times(kTicks - 1);
-  EXPECT_CALL(on_tick_, OnTick(_))
-      .WillRepeatedly(Invoke(
-          [this, kLevelOfDetail](MemoryDumpLevelOfDetail level_of_detail) {
-            EXPECT_EQ(kLevelOfDetail, level_of_detail);
-            this->evt_.Signal();
-          }));
-
-  // Check that Stop() before Start() doesn't cause any error.
-  scheduler_.Stop();
-
-  const TimeTicks tstart = TimeTicks::Now();
-  scheduler_.Start(config, bg_thread_.task_runner());
-  evt_.Wait();
-  const double time_ms = (TimeTicks::Now() - tstart).InMillisecondsF();
-
-  // It takes N-1 ms to perform N ticks of 1ms each.
-  EXPECT_GE(time_ms, kPeriodMs * (kTicks - 1));
-
-  // Check that stopping twice doesn't cause any problems.
-  scheduler_.Stop();
-  scheduler_.Stop();
-}
-
-TEST_F(MemoryDumpSchedulerTest, MultipleTriggers) {
-  const uint32_t kPeriodLightMs = 3;
-  const uint32_t kPeriodDetailedMs = 9;
-  MemoryDumpScheduler::Config config;
-  const MemoryDumpLevelOfDetail kLight = MemoryDumpLevelOfDetail::LIGHT;
-  const MemoryDumpLevelOfDetail kDetailed = MemoryDumpLevelOfDetail::DETAILED;
-  config.triggers.push_back({kLight, kPeriodLightMs});
-  config.triggers.push_back({kDetailed, kPeriodDetailedMs});
-  config.callback = Bind(&CallbackWrapper::OnTick, Unretained(&on_tick_));
-
-  TimeTicks t1, t2, t3;
-
-  testing::InSequence sequence;
-  EXPECT_CALL(on_tick_, OnTick(kDetailed))
-      .WillOnce(
-          Invoke([&t1](MemoryDumpLevelOfDetail) { t1 = TimeTicks::Now(); }));
-  EXPECT_CALL(on_tick_, OnTick(kLight)).Times(1);
-  EXPECT_CALL(on_tick_, OnTick(kLight)).Times(1);
-  EXPECT_CALL(on_tick_, OnTick(kDetailed))
-      .WillOnce(
-          Invoke([&t2](MemoryDumpLevelOfDetail) { t2 = TimeTicks::Now(); }));
-  EXPECT_CALL(on_tick_, OnTick(kLight))
-      .WillOnce(
-          Invoke([&t3](MemoryDumpLevelOfDetail) { t3 = TimeTicks::Now(); }));
-
-  // Rationale for WillRepeatedly and not just WillOnce: Extra ticks might
-  // happen if the Stop() takes time. Not an interesting case, but we need to
-  // avoid gmock to shout in that case.
-  EXPECT_CALL(on_tick_, OnTick(_))
-      .WillRepeatedly(
-          Invoke([this](MemoryDumpLevelOfDetail) { this->evt_.Signal(); }));
-
-  scheduler_.Start(config, bg_thread_.task_runner());
-  evt_.Wait();
-  scheduler_.Stop();
-  EXPECT_GE((t2 - t1).InMillisecondsF(), kPeriodDetailedMs);
-  EXPECT_GE((t3 - t2).InMillisecondsF(), kPeriodLightMs);
-}
-
-TEST_F(MemoryDumpSchedulerTest, StartStopQuickly) {
-  const uint32_t kPeriodMs = 3;
-  const uint32_t kQuickIterations = 5;
-  const uint32_t kDetailedTicks = 10;
-
-  MemoryDumpScheduler::Config light_config;
-  light_config.triggers.push_back({MemoryDumpLevelOfDetail::LIGHT, kPeriodMs});
-  light_config.callback = Bind(&CallbackWrapper::OnTick, Unretained(&on_tick_));
-
-  MemoryDumpScheduler::Config detailed_config;
-  detailed_config.triggers.push_back(
-      {MemoryDumpLevelOfDetail::DETAILED, kPeriodMs});
-  detailed_config.callback =
-      Bind(&CallbackWrapper::OnTick, Unretained(&on_tick_));
-
-  testing::InSequence sequence;
-  EXPECT_CALL(on_tick_, OnTick(MemoryDumpLevelOfDetail::LIGHT))
-      .Times(AtMost(kQuickIterations));
-  EXPECT_CALL(on_tick_, OnTick(MemoryDumpLevelOfDetail::DETAILED))
-      .Times(kDetailedTicks - 1);
-  EXPECT_CALL(on_tick_, OnTick(MemoryDumpLevelOfDetail::DETAILED))
-      .WillRepeatedly(
-          Invoke([this](MemoryDumpLevelOfDetail) { this->evt_.Signal(); }));
-
-  const TimeTicks tstart = TimeTicks::Now();
-  for (unsigned int i = 0; i < kQuickIterations; i++) {
-    scheduler_.Start(light_config, bg_thread_.task_runner());
-    scheduler_.Stop();
-  }
-
-  scheduler_.Start(detailed_config, bg_thread_.task_runner());
-
-  evt_.Wait();
-  const double time_ms = (TimeTicks::Now() - tstart).InMillisecondsF();
-  scheduler_.Stop();
-
-  // It takes N-1 ms to perform N ticks of 1ms each.
-  EXPECT_GE(time_ms, kPeriodMs * (kDetailedTicks - 1));
-}
-
-TEST_F(MemoryDumpSchedulerTest, StopAndStartOnAnotherThread) {
-  const uint32_t kPeriodMs = 1;
-  const uint32_t kTicks = 3;
-  MemoryDumpScheduler::Config config;
-  config.triggers.push_back({MemoryDumpLevelOfDetail::DETAILED, kPeriodMs});
-  config.callback = Bind(&CallbackWrapper::OnTick, Unretained(&on_tick_));
-
-  scoped_refptr<TaskRunner> expected_task_runner = bg_thread_.task_runner();
-  testing::InSequence sequence;
-  EXPECT_CALL(on_tick_, OnTick(_)).Times(kTicks - 1);
-  EXPECT_CALL(on_tick_, OnTick(_))
-      .WillRepeatedly(
-          Invoke([this, expected_task_runner](MemoryDumpLevelOfDetail) {
-            EXPECT_TRUE(expected_task_runner->RunsTasksInCurrentSequence());
-            this->evt_.Signal();
-          }));
-
-  scheduler_.Start(config, bg_thread_.task_runner());
-  evt_.Wait();
-  scheduler_.Stop();
-  bg_thread_.Stop();
-
-  Thread bg_thread_2("MemoryDumpSchedulerTest Thread 2");
-  bg_thread_2.Start();
-  evt_.Reset();
-  expected_task_runner = bg_thread_2.task_runner();
-  EXPECT_CALL(on_tick_, OnTick(_)).Times(kTicks - 1);
-  EXPECT_CALL(on_tick_, OnTick(_))
-      .WillRepeatedly(
-          Invoke([this, expected_task_runner](MemoryDumpLevelOfDetail) {
-            EXPECT_TRUE(expected_task_runner->RunsTasksInCurrentSequence());
-            this->evt_.Signal();
-          }));
-  scheduler_.Start(config, bg_thread_2.task_runner());
-  evt_.Wait();
-  scheduler_.Stop();
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/memory_peak_detector_unittest.cc b/base/trace_event/memory_peak_detector_unittest.cc
deleted file mode 100644
index bc10c80..0000000
--- a/base/trace_event/memory_peak_detector_unittest.cc
+++ /dev/null
@@ -1,564 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/memory_peak_detector.h"
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/run_loop.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/trace_event/memory_dump_provider.h"
-#include "base/trace_event/memory_dump_provider_info.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::_;
-using ::testing::Invoke;
-using ::testing::Return;
-
-namespace base {
-namespace trace_event {
-
-namespace {
-
-const TimeDelta kMs = TimeDelta::FromMilliseconds(1);
-const MemoryPeakDetector::Config kConfigNoCallbacks(
-    1 /* polling_interval_ms */,
-    60000 /* min_time_between_peaks_ms */,
-    false /* enable_verbose_poll_tracing */
-    );
-
-class MockMemoryDumpProvider : public MemoryDumpProvider {
- public:
-  bool OnMemoryDump(const MemoryDumpArgs&, ProcessMemoryDump*) override {
-    NOTREACHED();
-    return true;
-  }
-
-  MOCK_METHOD1(PollFastMemoryTotal, void(uint64_t*));
-};
-
-// Wrapper to use gmock on a callback.
-struct OnPeakDetectedWrapper {
-  MOCK_METHOD0(OnPeak, void());
-};
-
-}  // namespace
-
-class MemoryPeakDetectorTest : public testing::Test {
- public:
-  struct FriendDeleter {
-    void operator()(MemoryPeakDetector* inst) { delete inst; }
-  };
-
-  MemoryPeakDetectorTest() : testing::Test() {}
-  static const uint64_t kSlidingWindowNumSamples =
-      MemoryPeakDetector::kSlidingWindowNumSamples;
-
-  std::unique_ptr<MemoryPeakDetector, FriendDeleter> NewInstance() {
-    return std::unique_ptr<MemoryPeakDetector, FriendDeleter>(
-        new MemoryPeakDetector());
-  }
-
-  void RestartThreadAndReinitializePeakDetector() {
-    bg_thread_.reset(new Thread("Peak Detector Test Thread"));
-    bg_thread_->Start();
-    peak_detector_ = NewInstance();
-    peak_detector_->Setup(
-        Bind(&MemoryPeakDetectorTest::MockGetDumpProviders, Unretained(this)),
-        bg_thread_->task_runner(),
-        Bind(&OnPeakDetectedWrapper::OnPeak, Unretained(&on_peak_callback_)));
-  }
-
-  void SetUp() override {
-    get_mdp_call_count_ = 0;
-    RestartThreadAndReinitializePeakDetector();
-  }
-
-  void TearDown() override {
-    peak_detector_->TearDown();
-    bg_thread_->FlushForTesting();
-    EXPECT_EQ(MemoryPeakDetector::NOT_INITIALIZED, GetPeakDetectorState());
-    bg_thread_.reset();
-    dump_providers_.clear();
-  }
-
-  // Calls MemoryPeakDetector::state_for_testing() on the bg thread and returns
-  // the result on the current thread.
-  MemoryPeakDetector::State GetPeakDetectorState() {
-    WaitableEvent evt(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-    MemoryPeakDetector::State res = MemoryPeakDetector::NOT_INITIALIZED;
-    auto get_fn = [](MemoryPeakDetector* peak_detector, WaitableEvent* evt,
-                     MemoryPeakDetector::State* res) {
-      *res = peak_detector->state_for_testing();
-      evt->Signal();
-    };
-    bg_thread_->task_runner()->PostTask(
-        FROM_HERE, BindOnce(get_fn, Unretained(&*peak_detector_),
-                            Unretained(&evt), Unretained(&res)));
-    evt.Wait();
-    return res;
-  }
-
-  // Calls MemoryPeakDetector::poll_tasks_count_for_testing() on the bg thread
-  // and returns the result on the current thread.
-  uint32_t GetNumPollingTasksRan() {
-    uint32_t res = 0;
-    auto get_fn = [](MemoryPeakDetector* peak_detector, WaitableEvent* evt,
-                     uint32_t* res) {
-      *res = peak_detector->poll_tasks_count_for_testing();
-      evt->Signal();
-    };
-
-    WaitableEvent evt(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-    bg_thread_->task_runner()->PostTask(
-        FROM_HERE, BindOnce(get_fn, Unretained(&*peak_detector_),
-                            Unretained(&evt), Unretained(&res)));
-    evt.Wait();
-    return res;
-  }
-
-  // Runs the peak detector with a mock MDP with the given
-  // |config|. The mock MDP will invoke the |poll_function| on any call to
-  // PollFastMemoryTotal(), until |num_samples| have been polled.
-  // It returns the number of peaks detected.
-  uint32_t RunWithCustomPollFunction(
-      MemoryPeakDetector::Config config,
-      uint32_t num_samples,
-      RepeatingCallback<uint64_t(uint32_t)> poll_function) {
-    WaitableEvent evt(WaitableEvent::ResetPolicy::MANUAL,
-                      WaitableEvent::InitialState::NOT_SIGNALED);
-    scoped_refptr<MemoryDumpProviderInfo> mdp = CreateMockDumpProvider();
-    dump_providers_.push_back(mdp);
-    uint32_t cur_sample_idx = 0;
-    EXPECT_CALL(GetMockMDP(mdp), PollFastMemoryTotal(_))
-        .WillRepeatedly(Invoke(
-            [&cur_sample_idx, &evt, poll_function, num_samples](uint64_t* mem) {
-              if (cur_sample_idx >= num_samples) {
-                *mem = 1;
-                evt.Signal();
-              } else {
-                *mem = poll_function.Run(cur_sample_idx++);
-              }
-            }));
-
-    uint32_t num_peaks = 0;
-    EXPECT_CALL(on_peak_callback_, OnPeak())
-        .WillRepeatedly(Invoke([&num_peaks] { num_peaks++; }));
-    peak_detector_->Start(config);
-    evt.Wait();  // Wait for |num_samples| invocations of PollFastMemoryTotal().
-    peak_detector_->Stop();
-    EXPECT_EQ(num_samples, cur_sample_idx);
-    EXPECT_EQ(MemoryPeakDetector::DISABLED, GetPeakDetectorState());
-    return num_peaks;
-  }
-
-  // Called on the |bg_thread_|.
-  void MockGetDumpProviders(MemoryPeakDetector::DumpProvidersList* mdps) {
-    get_mdp_call_count_++;
-    *mdps = dump_providers_;
-  }
-
-  uint32_t GetNumGetDumpProvidersCalls() {
-    bg_thread_->FlushForTesting();
-    return get_mdp_call_count_;
-  }
-
-  scoped_refptr<MemoryDumpProviderInfo> CreateMockDumpProvider() {
-    std::unique_ptr<MockMemoryDumpProvider> mdp(new MockMemoryDumpProvider());
-    MemoryDumpProvider::Options opt;
-    opt.is_fast_polling_supported = true;
-    scoped_refptr<MemoryDumpProviderInfo> mdp_info(new MemoryDumpProviderInfo(
-        mdp.get(), "Mock MDP", nullptr, opt,
-        false /* whitelisted_for_background_mode */));
-
-    // The |mdp| instance will be destroyed together with the |mdp_info|.
-    mdp_info->owned_dump_provider = std::move(mdp);
-    return mdp_info;
-  }
-
-  static MockMemoryDumpProvider& GetMockMDP(
-      const scoped_refptr<MemoryDumpProviderInfo>& mdp_info) {
-    return *static_cast<MockMemoryDumpProvider*>(mdp_info->dump_provider);
-  }
-
-  static uint64_t PollFunctionThatCausesPeakViaStdDev(uint32_t sample_idx) {
-    // Start with a baseline of 50 MB.
-    if (sample_idx < kSlidingWindowNumSamples)
-      return 50000 + (sample_idx % 3) * 100;
-
-    // Then 10 samples around 80 MB
-    if (sample_idx < 10 + kSlidingWindowNumSamples)
-      return 80000 + (sample_idx % 3) * 200;
-
-    // Than back to 60 MB.
-    if (sample_idx < 2 * kSlidingWindowNumSamples)
-      return 60000 + (sample_idx % 3) * 100;
-
-    // Then 20 samples around 120 MB.
-    if (sample_idx < 20 + 2 * kSlidingWindowNumSamples)
-      return 120000 + (sample_idx % 3) * 200;
-
-    // Then back to idle to around 50 MB until the end.
-    return 50000 + (sample_idx % 3) * 100;
-  }
-
- protected:
-  MemoryPeakDetector::DumpProvidersList dump_providers_;
-  uint32_t get_mdp_call_count_;
-  std::unique_ptr<MemoryPeakDetector, FriendDeleter> peak_detector_;
-  std::unique_ptr<Thread> bg_thread_;
-  OnPeakDetectedWrapper on_peak_callback_;
-};
-
-const uint64_t MemoryPeakDetectorTest::kSlidingWindowNumSamples;
-
-TEST_F(MemoryPeakDetectorTest, GetDumpProvidersFunctionCalled) {
-  EXPECT_EQ(MemoryPeakDetector::DISABLED, GetPeakDetectorState());
-  peak_detector_->Start(kConfigNoCallbacks);
-  EXPECT_EQ(1u, GetNumGetDumpProvidersCalls());
-  EXPECT_EQ(MemoryPeakDetector::ENABLED, GetPeakDetectorState());
-
-  peak_detector_->Stop();
-  EXPECT_EQ(MemoryPeakDetector::DISABLED, GetPeakDetectorState());
-  EXPECT_EQ(0u, GetNumPollingTasksRan());
-}
-
-TEST_F(MemoryPeakDetectorTest, ThrottleAndNotifyBeforeInitialize) {
-  peak_detector_->TearDown();
-
-  WaitableEvent evt(WaitableEvent::ResetPolicy::MANUAL,
-                    WaitableEvent::InitialState::NOT_SIGNALED);
-  scoped_refptr<MemoryDumpProviderInfo> mdp = CreateMockDumpProvider();
-  EXPECT_CALL(GetMockMDP(mdp), PollFastMemoryTotal(_))
-      .WillRepeatedly(Invoke([&evt](uint64_t*) { evt.Signal(); }));
-  dump_providers_.push_back(mdp);
-  peak_detector_->Throttle();
-  peak_detector_->NotifyMemoryDumpProvidersChanged();
-  EXPECT_EQ(MemoryPeakDetector::NOT_INITIALIZED, GetPeakDetectorState());
-  RestartThreadAndReinitializePeakDetector();
-
-  peak_detector_->Start(kConfigNoCallbacks);
-  EXPECT_EQ(MemoryPeakDetector::RUNNING, GetPeakDetectorState());
-  evt.Wait();  // Wait for a PollFastMemoryTotal() call.
-
-  peak_detector_->Stop();
-  EXPECT_EQ(MemoryPeakDetector::DISABLED, GetPeakDetectorState());
-  EXPECT_EQ(1u, GetNumGetDumpProvidersCalls());
-  EXPECT_GE(GetNumPollingTasksRan(), 1u);
-}
-
-TEST_F(MemoryPeakDetectorTest, DoubleStop) {
-  peak_detector_->Start(kConfigNoCallbacks);
-  EXPECT_EQ(MemoryPeakDetector::ENABLED, GetPeakDetectorState());
-
-  peak_detector_->Stop();
-  EXPECT_EQ(MemoryPeakDetector::DISABLED, GetPeakDetectorState());
-
-  peak_detector_->Stop();
-  EXPECT_EQ(MemoryPeakDetector::DISABLED, GetPeakDetectorState());
-
-  EXPECT_EQ(1u, GetNumGetDumpProvidersCalls());
-  EXPECT_EQ(0u, GetNumPollingTasksRan());
-}
-
-TEST_F(MemoryPeakDetectorTest, OneDumpProviderRegisteredBeforeStart) {
-  WaitableEvent evt(WaitableEvent::ResetPolicy::MANUAL,
-                    WaitableEvent::InitialState::NOT_SIGNALED);
-  scoped_refptr<MemoryDumpProviderInfo> mdp = CreateMockDumpProvider();
-  EXPECT_CALL(GetMockMDP(mdp), PollFastMemoryTotal(_))
-      .WillRepeatedly(Invoke([&evt](uint64_t*) { evt.Signal(); }));
-  dump_providers_.push_back(mdp);
-
-  peak_detector_->Start(kConfigNoCallbacks);
-  evt.Wait();  // Signaled when PollFastMemoryTotal() is called on the MockMDP.
-  EXPECT_EQ(MemoryPeakDetector::RUNNING, GetPeakDetectorState());
-
-  peak_detector_->Stop();
-  EXPECT_EQ(MemoryPeakDetector::DISABLED, GetPeakDetectorState());
-  EXPECT_EQ(1u, GetNumGetDumpProvidersCalls());
-  EXPECT_GT(GetNumPollingTasksRan(), 0u);
-}
-
-TEST_F(MemoryPeakDetectorTest, ReInitializeAndRebindToNewThread) {
-  WaitableEvent evt(WaitableEvent::ResetPolicy::MANUAL,
-                    WaitableEvent::InitialState::NOT_SIGNALED);
-  scoped_refptr<MemoryDumpProviderInfo> mdp = CreateMockDumpProvider();
-  EXPECT_CALL(GetMockMDP(mdp), PollFastMemoryTotal(_))
-      .WillRepeatedly(Invoke([&evt](uint64_t*) { evt.Signal(); }));
-  dump_providers_.push_back(mdp);
-
-  for (int i = 0; i < 5; ++i) {
-    evt.Reset();
-    peak_detector_->Start(kConfigNoCallbacks);
-    evt.Wait();  // Wait for a PollFastMemoryTotal() call.
-    // Check that calling TearDown implicitly does a Stop().
-    peak_detector_->TearDown();
-
-    // Reinitialize and re-bind to a new task runner.
-    RestartThreadAndReinitializePeakDetector();
-  }
-}
-
-TEST_F(MemoryPeakDetectorTest, OneDumpProviderRegisteredOutOfBand) {
-  peak_detector_->Start(kConfigNoCallbacks);
-  EXPECT_EQ(MemoryPeakDetector::ENABLED, GetPeakDetectorState());
-  EXPECT_EQ(1u, GetNumGetDumpProvidersCalls());
-
-  // Check that no poll tasks are posted before any dump provider is registered.
-  PlatformThread::Sleep(5 * kConfigNoCallbacks.polling_interval_ms * kMs);
-  EXPECT_EQ(0u, GetNumPollingTasksRan());
-
-  // Registed the MDP After Start() has been issued and expect that the
-  // PeakDetector transitions ENABLED -> RUNNING on the next
-  // NotifyMemoryDumpProvidersChanged() call.
-  WaitableEvent evt(WaitableEvent::ResetPolicy::MANUAL,
-                    WaitableEvent::InitialState::NOT_SIGNALED);
-  scoped_refptr<MemoryDumpProviderInfo> mdp = CreateMockDumpProvider();
-  EXPECT_CALL(GetMockMDP(mdp), PollFastMemoryTotal(_))
-      .WillRepeatedly(Invoke([&evt](uint64_t*) { evt.Signal(); }));
-  dump_providers_.push_back(mdp);
-  peak_detector_->NotifyMemoryDumpProvidersChanged();
-
-  evt.Wait();  // Signaled when PollFastMemoryTotal() is called on the MockMDP.
-  EXPECT_EQ(MemoryPeakDetector::RUNNING, GetPeakDetectorState());
-  EXPECT_EQ(2u, GetNumGetDumpProvidersCalls());
-
-  // Now simulate the unregisration and expect that the PeakDetector transitions
-  // back to ENABLED.
-  dump_providers_.clear();
-  peak_detector_->NotifyMemoryDumpProvidersChanged();
-  EXPECT_EQ(MemoryPeakDetector::ENABLED, GetPeakDetectorState());
-  EXPECT_EQ(3u, GetNumGetDumpProvidersCalls());
-  uint32_t num_poll_tasks = GetNumPollingTasksRan();
-  EXPECT_GT(num_poll_tasks, 0u);
-
-  // At this point, no more polling tasks should be posted.
-  PlatformThread::Sleep(5 * kConfigNoCallbacks.polling_interval_ms * kMs);
-  peak_detector_->Stop();
-  EXPECT_EQ(MemoryPeakDetector::DISABLED, GetPeakDetectorState());
-  EXPECT_EQ(num_poll_tasks, GetNumPollingTasksRan());
-}
-
-// Test that a sequence of Start()/Stop() back-to-back doesn't end up creating
-// several outstanding timer tasks and instead respects the polling_interval_ms.
-TEST_F(MemoryPeakDetectorTest, StartStopQuickly) {
-  WaitableEvent evt(WaitableEvent::ResetPolicy::MANUAL,
-                    WaitableEvent::InitialState::NOT_SIGNALED);
-  scoped_refptr<MemoryDumpProviderInfo> mdp = CreateMockDumpProvider();
-  dump_providers_.push_back(mdp);
-  const uint32_t kNumPolls = 20;
-  uint32_t polls_done = 0;
-  EXPECT_CALL(GetMockMDP(mdp), PollFastMemoryTotal(_))
-      .WillRepeatedly(Invoke([&polls_done, &evt, kNumPolls](uint64_t*) {
-        if (++polls_done == kNumPolls)
-          evt.Signal();
-      }));
-
-  const TimeTicks tstart = TimeTicks::Now();
-  for (int i = 0; i < 5; i++) {
-    peak_detector_->Start(kConfigNoCallbacks);
-    peak_detector_->Stop();
-  }
-
-  bg_thread_->task_runner()->PostTask(
-      FROM_HERE, base::BindOnce([](uint32_t* polls_done) { *polls_done = 0; },
-                                &polls_done));
-
-  peak_detector_->Start(kConfigNoCallbacks);
-  EXPECT_EQ(MemoryPeakDetector::RUNNING, GetPeakDetectorState());
-  evt.Wait();  // Wait for kNumPolls.
-  const double time_ms = (TimeTicks::Now() - tstart).InMillisecondsF();
-
-  EXPECT_GE(time_ms, (kNumPolls - 1) * kConfigNoCallbacks.polling_interval_ms);
-  peak_detector_->Stop();
-}
-
-TEST_F(MemoryPeakDetectorTest, RegisterAndUnregisterTwoDumpProviders) {
-  WaitableEvent evt1(WaitableEvent::ResetPolicy::MANUAL,
-                     WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent evt2(WaitableEvent::ResetPolicy::MANUAL,
-                     WaitableEvent::InitialState::NOT_SIGNALED);
-  scoped_refptr<MemoryDumpProviderInfo> mdp1 = CreateMockDumpProvider();
-  scoped_refptr<MemoryDumpProviderInfo> mdp2 = CreateMockDumpProvider();
-  EXPECT_CALL(GetMockMDP(mdp1), PollFastMemoryTotal(_))
-      .WillRepeatedly(Invoke([&evt1](uint64_t*) { evt1.Signal(); }));
-  EXPECT_CALL(GetMockMDP(mdp2), PollFastMemoryTotal(_))
-      .WillRepeatedly(Invoke([&evt2](uint64_t*) { evt2.Signal(); }));
-
-  // Register only one MDP and start the detector.
-  dump_providers_.push_back(mdp1);
-  peak_detector_->Start(kConfigNoCallbacks);
-  EXPECT_EQ(MemoryPeakDetector::RUNNING, GetPeakDetectorState());
-
-  // Wait for one poll task and then register also the other one.
-  evt1.Wait();
-  dump_providers_.push_back(mdp2);
-  peak_detector_->NotifyMemoryDumpProvidersChanged();
-  evt2.Wait();
-  EXPECT_EQ(MemoryPeakDetector::RUNNING, GetPeakDetectorState());
-
-  // Now unregister the first MDP and check that everything is still running.
-  dump_providers_.erase(dump_providers_.begin());
-  peak_detector_->NotifyMemoryDumpProvidersChanged();
-  EXPECT_EQ(MemoryPeakDetector::RUNNING, GetPeakDetectorState());
-
-  // Now unregister both and check that the detector goes to idle.
-  dump_providers_.clear();
-  peak_detector_->NotifyMemoryDumpProvidersChanged();
-  EXPECT_EQ(MemoryPeakDetector::ENABLED, GetPeakDetectorState());
-
-  // Now re-register both and check that the detector re-activates posting
-  // new polling tasks.
-  uint32_t num_poll_tasks = GetNumPollingTasksRan();
-  evt1.Reset();
-  evt2.Reset();
-  dump_providers_.push_back(mdp1);
-  dump_providers_.push_back(mdp2);
-  peak_detector_->NotifyMemoryDumpProvidersChanged();
-  evt1.Wait();
-  evt2.Wait();
-  EXPECT_EQ(MemoryPeakDetector::RUNNING, GetPeakDetectorState());
-  EXPECT_GT(GetNumPollingTasksRan(), num_poll_tasks);
-
-  // Stop everything, tear down the MDPs, restart the detector and check that
-  // it detector doesn't accidentally try to re-access them.
-  peak_detector_->Stop();
-  EXPECT_EQ(MemoryPeakDetector::DISABLED, GetPeakDetectorState());
-  dump_providers_.clear();
-  mdp1 = nullptr;
-  mdp2 = nullptr;
-
-  num_poll_tasks = GetNumPollingTasksRan();
-  peak_detector_->Start(kConfigNoCallbacks);
-  EXPECT_EQ(MemoryPeakDetector::ENABLED, GetPeakDetectorState());
-  PlatformThread::Sleep(5 * kConfigNoCallbacks.polling_interval_ms * kMs);
-
-  peak_detector_->Stop();
-  EXPECT_EQ(MemoryPeakDetector::DISABLED, GetPeakDetectorState());
-  EXPECT_EQ(num_poll_tasks, GetNumPollingTasksRan());
-
-  EXPECT_EQ(6u, GetNumGetDumpProvidersCalls());
-}
-
-// Tests the behavior of the static threshold detector, which is supposed to
-// detect a peak whenever an increase >= threshold is detected.
-TEST_F(MemoryPeakDetectorTest, StaticThreshold) {
-  const uint32_t kNumSamples = 2 * kSlidingWindowNumSamples;
-  constexpr uint32_t kNumSamplesPerStep = 10;
-  constexpr uint64_t kThreshold = 1000000;
-  peak_detector_->SetStaticThresholdForTesting(kThreshold);
-  const MemoryPeakDetector::Config kConfig(
-      1 /* polling_interval_ms */, 0 /* min_time_between_peaks_ms */,
-      false /* enable_verbose_poll_tracing */
-      );
-
-  // The mocked PollFastMemoryTotal() will return a step function,
-  // e.g. (1, 1, 1, 5, 5, 5, ...) where the steps are 2x threshold, in order to
-  // trigger only the static threshold logic.
-  auto poll_fn = Bind(
-      [](const uint32_t kNumSamplesPerStep, const uint64_t kThreshold,
-         uint32_t sample_idx) -> uint64_t {
-        return (1 + sample_idx / kNumSamplesPerStep) * 2 * kThreshold;
-      },
-      kNumSamplesPerStep, kThreshold);
-  uint32_t num_peaks = RunWithCustomPollFunction(kConfig, kNumSamples, poll_fn);
-  EXPECT_EQ(kNumSamples / kNumSamplesPerStep - 1, num_peaks);
-}
-
-// Checks the throttling logic of Config's |min_time_between_peaks_ms|.
-TEST_F(MemoryPeakDetectorTest, PeakCallbackThrottling) {
-  const size_t kNumSamples = 2 * kSlidingWindowNumSamples;
-  constexpr uint64_t kThreshold = 1000000;
-  peak_detector_->SetStaticThresholdForTesting(kThreshold);
-  const MemoryPeakDetector::Config kConfig(
-      1 /* polling_interval_ms */, 4 /* min_time_between_peaks_ms */,
-      false /* enable_verbose_poll_tracing */
-      );
-
-  // Each mock value returned is N * 2 * threshold, so all of them would be
-  // eligible to be a peak if throttling wasn't enabled.
-  auto poll_fn = Bind(
-      [](uint64_t kThreshold, uint32_t sample_idx) -> uint64_t {
-        return (sample_idx + 1) * 2 * kThreshold;
-      },
-      kThreshold);
-  uint32_t num_peaks = RunWithCustomPollFunction(kConfig, kNumSamples, poll_fn);
-  const uint32_t kExpectedThrottlingRate =
-      kConfig.min_time_between_peaks_ms / kConfig.polling_interval_ms;
-  EXPECT_LT(num_peaks, kNumSamples / kExpectedThrottlingRate);
-}
-
-TEST_F(MemoryPeakDetectorTest, StdDev) {
-  // Set the threshold to some arbitrarily high value, so that the static
-  // threshold logic is not hit in this test.
-  constexpr uint64_t kThreshold = 1024 * 1024 * 1024;
-  peak_detector_->SetStaticThresholdForTesting(kThreshold);
-  const size_t kNumSamples = 3 * kSlidingWindowNumSamples;
-  const MemoryPeakDetector::Config kConfig(
-      1 /* polling_interval_ms */, 0 /* min_time_between_peaks_ms */,
-      false /* enable_verbose_poll_tracing */
-      );
-
-  auto poll_fn = Bind(&PollFunctionThatCausesPeakViaStdDev);
-  uint32_t num_peaks = RunWithCustomPollFunction(kConfig, kNumSamples, poll_fn);
-  EXPECT_EQ(2u, num_peaks);  // 80 MB, 120 MB.
-}
-
-// Tests that Throttle() actually holds back peak notifications.
-TEST_F(MemoryPeakDetectorTest, Throttle) {
-  constexpr uint64_t kThreshold = 1024 * 1024 * 1024;
-  const uint32_t kNumSamples = 3 * kSlidingWindowNumSamples;
-  peak_detector_->SetStaticThresholdForTesting(kThreshold);
-  const MemoryPeakDetector::Config kConfig(
-      1 /* polling_interval_ms */, 0 /* min_time_between_peaks_ms */,
-      false /* enable_verbose_poll_tracing */
-      );
-
-  auto poll_fn = Bind(
-      [](MemoryPeakDetector* peak_detector, uint32_t sample_idx) -> uint64_t {
-        if (sample_idx % 20 == 20 - 1)
-          peak_detector->Throttle();
-        return PollFunctionThatCausesPeakViaStdDev(sample_idx);
-      },
-      Unretained(&*peak_detector_));
-  uint32_t num_peaks = RunWithCustomPollFunction(kConfig, kNumSamples, poll_fn);
-  EXPECT_EQ(0u, num_peaks);
-}
-
-// Tests that the windows stddev state is not carried over through
-// Stop() -> Start() sequences.
-TEST_F(MemoryPeakDetectorTest, RestartClearsState) {
-  constexpr uint64_t kThreshold = 1024 * 1024 * 1024;
-  peak_detector_->SetStaticThresholdForTesting(kThreshold);
-  const size_t kNumSamples = 3 * kSlidingWindowNumSamples;
-  const MemoryPeakDetector::Config kConfig(
-      1 /* polling_interval_ms */, 0 /* min_time_between_peaks_ms */,
-      false /* enable_verbose_poll_tracing */
-      );
-  auto poll_fn = Bind(
-      [](MemoryPeakDetector* peak_detector,
-         const uint32_t kSlidingWindowNumSamples,
-         MemoryPeakDetector::Config kConfig, uint32_t sample_idx) -> uint64_t {
-        if (sample_idx % kSlidingWindowNumSamples ==
-            kSlidingWindowNumSamples - 1) {
-          peak_detector->Stop();
-          peak_detector->Start(kConfig);
-        }
-        return PollFunctionThatCausesPeakViaStdDev(sample_idx);
-      },
-      Unretained(&*peak_detector_), kSlidingWindowNumSamples, kConfig);
-  uint32_t num_peaks = RunWithCustomPollFunction(kConfig, kNumSamples, poll_fn);
-  EXPECT_EQ(0u, num_peaks);
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/memory_usage_estimator_unittest.cc b/base/trace_event/memory_usage_estimator_unittest.cc
deleted file mode 100644
index 7f8efc7..0000000
--- a/base/trace_event/memory_usage_estimator_unittest.cc
+++ /dev/null
@@ -1,265 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/memory_usage_estimator.h"
-
-#include <stdlib.h>
-
-#include "base/memory/ptr_util.h"
-#include "base/strings/string16.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(ARCH_CPU_64_BITS)
-#define EXPECT_EQ_32_64(_, e, a) EXPECT_EQ(e, a)
-#else
-#define EXPECT_EQ_32_64(e, _, a) EXPECT_EQ(e, a)
-#endif
-
-namespace base {
-namespace trace_event {
-
-namespace {
-
-// Test class with predictable memory usage.
-class Data {
- public:
-  explicit Data(size_t size = 17): size_(size) {
-  }
-
-  size_t size() const { return size_; }
-
-  size_t EstimateMemoryUsage() const {
-    return size_;
-  }
-
-  bool operator < (const Data& other) const {
-    return size_ < other.size_;
-  }
-  bool operator == (const Data& other) const {
-    return size_ == other.size_;
-  }
-
-  struct Hasher {
-    size_t operator () (const Data& data) const {
-      return data.size();
-    }
-  };
-
- private:
-  size_t size_;
-};
-
-}  // namespace
-
-namespace internal {
-
-// This kills variance of bucket_count across STL implementations.
-template <>
-size_t HashMapBucketCountForTesting<Data>(size_t) {
-  return 10;
-}
-template <>
-size_t HashMapBucketCountForTesting<std::pair<const Data, short>>(size_t) {
-  return 10;
-}
-
-}  // namespace internal
-
-TEST(EstimateMemoryUsageTest, String) {
-  std::string string(777, 'a');
-  EXPECT_EQ(string.capacity() + 1, EstimateMemoryUsage(string));
-}
-
-TEST(EstimateMemoryUsageTest, String16) {
-  string16 string(777, 'a');
-  EXPECT_EQ(sizeof(char16) * (string.capacity() + 1),
-            EstimateMemoryUsage(string));
-}
-
-TEST(EstimateMemoryUsageTest, Arrays) {
-  // std::array
-  {
-    std::array<Data, 10> array;
-    EXPECT_EQ(170u, EstimateMemoryUsage(array));
-  }
-
-  // T[N]
-  {
-    Data array[10];
-    EXPECT_EQ(170u, EstimateMemoryUsage(array));
-  }
-
-  // C array
-  {
-    struct Item {
-      char payload[10];
-    };
-    Item* array = new Item[7];
-    EXPECT_EQ(70u, EstimateMemoryUsage(array, 7));
-    delete[] array;
-  }
-}
-
-TEST(EstimateMemoryUsageTest, UniquePtr) {
-  // Empty
-  {
-    std::unique_ptr<Data> ptr;
-    EXPECT_EQ(0u, EstimateMemoryUsage(ptr));
-  }
-
-  // Not empty
-  {
-    std::unique_ptr<Data> ptr(new Data());
-    EXPECT_EQ_32_64(21u, 25u, EstimateMemoryUsage(ptr));
-  }
-
-  // With a pointer
-  {
-    std::unique_ptr<Data*> ptr(new Data*());
-    EXPECT_EQ(sizeof(void*), EstimateMemoryUsage(ptr));
-  }
-
-  // With an array
-  {
-    struct Item {
-      uint32_t payload[10];
-    };
-    std::unique_ptr<Item[]> ptr(new Item[7]);
-    EXPECT_EQ(280u, EstimateMemoryUsage(ptr, 7));
-  }
-}
-
-TEST(EstimateMemoryUsageTest, Vector) {
-  std::vector<Data> vector;
-  vector.reserve(1000);
-
-  // For an empty vector we should return memory usage of its buffer
-  size_t capacity = vector.capacity();
-  size_t expected_size = capacity * sizeof(Data);
-  EXPECT_EQ(expected_size, EstimateMemoryUsage(vector));
-
-  // If vector is not empty, its size should also include memory usages
-  // of all elements.
-  for (size_t i = 0; i != capacity / 2; ++i) {
-    vector.push_back(Data(i));
-    expected_size += EstimateMemoryUsage(vector.back());
-  }
-  EXPECT_EQ(expected_size, EstimateMemoryUsage(vector));
-}
-
-TEST(EstimateMemoryUsageTest, List) {
-  struct POD {
-    short data;
-  };
-  std::list<POD> list;
-  for (int i = 0; i != 1000; ++i) {
-    list.push_back(POD());
-  }
-  EXPECT_EQ_32_64(12000u, 24000u, EstimateMemoryUsage(list));
-}
-
-TEST(EstimateMemoryUsageTest, Set) {
-  std::set<std::pair<int, Data>> set;
-  for (int i = 0; i != 1000; ++i) {
-    set.insert({i, Data(i)});
-  }
-  EXPECT_EQ_32_64(523500u, 547500u, EstimateMemoryUsage(set));
-}
-
-TEST(EstimateMemoryUsageTest, MultiSet) {
-  std::multiset<bool> set;
-  for (int i = 0; i != 1000; ++i) {
-    set.insert((i & 1) != 0);
-  }
-  EXPECT_EQ_32_64(16000u, 32000u, EstimateMemoryUsage(set));
-}
-
-TEST(EstimateMemoryUsageTest, Map) {
-  std::map<Data, int> map;
-  for (int i = 0; i != 1000; ++i) {
-    map.insert({Data(i), i});
-  }
-  EXPECT_EQ_32_64(523500u, 547500u, EstimateMemoryUsage(map));
-}
-
-TEST(EstimateMemoryUsageTest, MultiMap) {
-  std::multimap<char, Data> map;
-  for (int i = 0; i != 1000; ++i) {
-    map.insert({static_cast<char>(i), Data(i)});
-  }
-  EXPECT_EQ_32_64(523500u, 547500u, EstimateMemoryUsage(map));
-}
-
-TEST(EstimateMemoryUsageTest, UnorderedSet) {
-  std::unordered_set<Data, Data::Hasher> set;
-  for (int i = 0; i != 1000; ++i) {
-    set.insert(Data(i));
-  }
-  EXPECT_EQ_32_64(511540u, 523580u, EstimateMemoryUsage(set));
-}
-
-TEST(EstimateMemoryUsageTest, UnorderedMultiSet) {
-  std::unordered_multiset<Data, Data::Hasher> set;
-  for (int i = 0; i != 500; ++i) {
-    set.insert(Data(i));
-    set.insert(Data(i));
-  }
-  EXPECT_EQ_32_64(261540u, 273580u, EstimateMemoryUsage(set));
-}
-
-TEST(EstimateMemoryUsageTest, UnorderedMap) {
-  std::unordered_map<Data, short, Data::Hasher> map;
-  for (int i = 0; i != 1000; ++i) {
-    map.insert({Data(i), static_cast<short>(i)});
-  }
-  EXPECT_EQ_32_64(515540u, 531580u, EstimateMemoryUsage(map));
-}
-
-TEST(EstimateMemoryUsageTest, UnorderedMultiMap) {
-  std::unordered_multimap<Data, short, Data::Hasher> map;
-  for (int i = 0; i != 1000; ++i) {
-    map.insert({Data(i), static_cast<short>(i)});
-  }
-  EXPECT_EQ_32_64(515540u, 531580u, EstimateMemoryUsage(map));
-}
-
-TEST(EstimateMemoryUsageTest, Deque) {
-  std::deque<Data> deque;
-
-  // Pick a large value so that platform-specific accounting
-  // for deque's blocks is small compared to usage of all items.
-  constexpr size_t kDataSize = 100000;
-  for (int i = 0; i != 1500; ++i) {
-    deque.push_back(Data(kDataSize));
-  }
-
-  // Compare against a reasonable minimum (i.e. no overhead).
-  size_t min_expected_usage = deque.size() * (sizeof(Data) + kDataSize);
-  EXPECT_LE(min_expected_usage, EstimateMemoryUsage(deque));
-}
-
-TEST(EstimateMemoryUsageTest, IsStandardContainerComplexIteratorTest) {
-  struct abstract {
-    virtual void method() = 0;
-  };
-
-  static_assert(
-      internal::IsStandardContainerComplexIterator<std::list<int>::iterator>(),
-      "");
-  static_assert(internal::IsStandardContainerComplexIterator<
-                    std::list<int>::const_iterator>(),
-                "");
-  static_assert(internal::IsStandardContainerComplexIterator<
-                    std::list<int>::reverse_iterator>(),
-                "");
-  static_assert(internal::IsStandardContainerComplexIterator<
-                    std::list<int>::const_reverse_iterator>(),
-                "");
-  static_assert(!internal::IsStandardContainerComplexIterator<int>(), "");
-  static_assert(!internal::IsStandardContainerComplexIterator<abstract*>(), "");
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/process_memory_dump_unittest.cc b/base/trace_event/process_memory_dump_unittest.cc
deleted file mode 100644
index b33a39e..0000000
--- a/base/trace_event/process_memory_dump_unittest.cc
+++ /dev/null
@@ -1,584 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/process_memory_dump.h"
-
-#include <stddef.h>
-
-#include "base/memory/aligned_memory.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/shared_memory_tracker.h"
-#include "base/process/process_metrics.h"
-#include "base/trace_event/memory_allocator_dump_guid.h"
-#include "base/trace_event/memory_infra_background_whitelist.h"
-#include "base/trace_event/trace_event_argument.h"
-#include "base/trace_event/trace_log.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#include "winbase.h"
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-#include <sys/mman.h>
-#endif
-
-#if defined(OS_IOS)
-#include "base/ios/ios_util.h"
-#endif
-
-namespace base {
-namespace trace_event {
-
-namespace {
-
-const MemoryDumpArgs kDetailedDumpArgs = {MemoryDumpLevelOfDetail::DETAILED};
-const char* const kTestDumpNameWhitelist[] = {
-    "Whitelisted/TestName", "Whitelisted/TestName_0x?",
-    "Whitelisted/0x?/TestName", "Whitelisted/0x?", nullptr};
-
-TracedValue* GetHeapDump(const ProcessMemoryDump& pmd, const char* name) {
-  auto it = pmd.heap_dumps().find(name);
-  return it == pmd.heap_dumps().end() ? nullptr : it->second.get();
-}
-
-void* Map(size_t size) {
-#if defined(OS_WIN)
-  return ::VirtualAlloc(nullptr, size, MEM_RESERVE | MEM_COMMIT,
-                        PAGE_READWRITE);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  return ::mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON,
-                0, 0);
-#endif
-}
-
-void Unmap(void* addr, size_t size) {
-#if defined(OS_WIN)
-  ::VirtualFree(addr, 0, MEM_DECOMMIT);
-#elif defined(OS_POSIX) || defined(OS_FUCHSIA)
-  ::munmap(addr, size);
-#else
-#error This architecture is not (yet) supported.
-#endif
-}
-
-}  // namespace
-
-TEST(ProcessMemoryDumpTest, MoveConstructor) {
-  auto heap_state = MakeRefCounted<HeapProfilerSerializationState>();
-  heap_state->SetStackFrameDeduplicator(
-      std::make_unique<StackFrameDeduplicator>());
-  heap_state->SetTypeNameDeduplicator(std::make_unique<TypeNameDeduplicator>());
-
-  ProcessMemoryDump pmd1 = ProcessMemoryDump(heap_state, kDetailedDumpArgs);
-  pmd1.CreateAllocatorDump("mad1");
-  pmd1.CreateAllocatorDump("mad2");
-  pmd1.AddOwnershipEdge(MemoryAllocatorDumpGuid(42),
-                        MemoryAllocatorDumpGuid(4242));
-
-  ProcessMemoryDump pmd2(std::move(pmd1));
-
-  EXPECT_EQ(1u, pmd2.allocator_dumps().count("mad1"));
-  EXPECT_EQ(1u, pmd2.allocator_dumps().count("mad2"));
-  EXPECT_EQ(MemoryDumpLevelOfDetail::DETAILED,
-            pmd2.dump_args().level_of_detail);
-  EXPECT_EQ(1u, pmd2.allocator_dumps_edges().size());
-  EXPECT_EQ(heap_state.get(), pmd2.heap_profiler_serialization_state().get());
-
-  // Check that calling serialization routines doesn't cause a crash.
-  auto traced_value = std::make_unique<TracedValue>();
-  pmd2.SerializeAllocatorDumpsInto(traced_value.get());
-  pmd2.SerializeHeapProfilerDumpsInto(traced_value.get());
-}
-
-TEST(ProcessMemoryDumpTest, MoveAssignment) {
-  auto heap_state = MakeRefCounted<HeapProfilerSerializationState>();
-  heap_state->SetStackFrameDeduplicator(
-      std::make_unique<StackFrameDeduplicator>());
-  heap_state->SetTypeNameDeduplicator(std::make_unique<TypeNameDeduplicator>());
-
-  ProcessMemoryDump pmd1 = ProcessMemoryDump(heap_state, kDetailedDumpArgs);
-  pmd1.CreateAllocatorDump("mad1");
-  pmd1.CreateAllocatorDump("mad2");
-  pmd1.AddOwnershipEdge(MemoryAllocatorDumpGuid(42),
-                        MemoryAllocatorDumpGuid(4242));
-
-  ProcessMemoryDump pmd2(nullptr, {MemoryDumpLevelOfDetail::BACKGROUND});
-  pmd2.CreateAllocatorDump("malloc");
-
-  pmd2 = std::move(pmd1);
-  EXPECT_EQ(1u, pmd2.allocator_dumps().count("mad1"));
-  EXPECT_EQ(1u, pmd2.allocator_dumps().count("mad2"));
-  EXPECT_EQ(0u, pmd2.allocator_dumps().count("mad3"));
-  EXPECT_EQ(MemoryDumpLevelOfDetail::DETAILED,
-            pmd2.dump_args().level_of_detail);
-  EXPECT_EQ(1u, pmd2.allocator_dumps_edges().size());
-  EXPECT_EQ(heap_state.get(), pmd2.heap_profiler_serialization_state().get());
-
-  // Check that calling serialization routines doesn't cause a crash.
-  auto traced_value = std::make_unique<TracedValue>();
-  pmd2.SerializeAllocatorDumpsInto(traced_value.get());
-  pmd2.SerializeHeapProfilerDumpsInto(traced_value.get());
-}
-
-TEST(ProcessMemoryDumpTest, Clear) {
-  std::unique_ptr<ProcessMemoryDump> pmd1(
-      new ProcessMemoryDump(nullptr, kDetailedDumpArgs));
-  pmd1->CreateAllocatorDump("mad1");
-  pmd1->CreateAllocatorDump("mad2");
-  ASSERT_FALSE(pmd1->allocator_dumps().empty());
-
-  pmd1->AddOwnershipEdge(MemoryAllocatorDumpGuid(42),
-                         MemoryAllocatorDumpGuid(4242));
-
-  MemoryAllocatorDumpGuid shared_mad_guid1(1);
-  MemoryAllocatorDumpGuid shared_mad_guid2(2);
-  pmd1->CreateSharedGlobalAllocatorDump(shared_mad_guid1);
-  pmd1->CreateSharedGlobalAllocatorDump(shared_mad_guid2);
-
-  pmd1->Clear();
-  ASSERT_TRUE(pmd1->allocator_dumps().empty());
-  ASSERT_TRUE(pmd1->allocator_dumps_edges().empty());
-  ASSERT_EQ(nullptr, pmd1->GetAllocatorDump("mad1"));
-  ASSERT_EQ(nullptr, pmd1->GetAllocatorDump("mad2"));
-  ASSERT_EQ(nullptr, pmd1->GetSharedGlobalAllocatorDump(shared_mad_guid1));
-  ASSERT_EQ(nullptr, pmd1->GetSharedGlobalAllocatorDump(shared_mad_guid2));
-
-  // Check that calling serialization routines doesn't cause a crash.
-  auto traced_value = std::make_unique<TracedValue>();
-  pmd1->SerializeAllocatorDumpsInto(traced_value.get());
-  pmd1->SerializeHeapProfilerDumpsInto(traced_value.get());
-
-  // Check that the pmd can be reused and behaves as expected.
-  auto* mad1 = pmd1->CreateAllocatorDump("mad1");
-  auto* mad3 = pmd1->CreateAllocatorDump("mad3");
-  auto* shared_mad1 = pmd1->CreateSharedGlobalAllocatorDump(shared_mad_guid1);
-  auto* shared_mad2 =
-      pmd1->CreateWeakSharedGlobalAllocatorDump(shared_mad_guid2);
-  ASSERT_EQ(4u, pmd1->allocator_dumps().size());
-  ASSERT_EQ(mad1, pmd1->GetAllocatorDump("mad1"));
-  ASSERT_EQ(nullptr, pmd1->GetAllocatorDump("mad2"));
-  ASSERT_EQ(mad3, pmd1->GetAllocatorDump("mad3"));
-  ASSERT_EQ(shared_mad1, pmd1->GetSharedGlobalAllocatorDump(shared_mad_guid1));
-  ASSERT_EQ(MemoryAllocatorDump::Flags::DEFAULT, shared_mad1->flags());
-  ASSERT_EQ(shared_mad2, pmd1->GetSharedGlobalAllocatorDump(shared_mad_guid2));
-  ASSERT_EQ(MemoryAllocatorDump::Flags::WEAK, shared_mad2->flags());
-
-  traced_value.reset(new TracedValue);
-  pmd1->SerializeAllocatorDumpsInto(traced_value.get());
-  pmd1->SerializeHeapProfilerDumpsInto(traced_value.get());
-
-  pmd1.reset();
-}
-
-TEST(ProcessMemoryDumpTest, TakeAllDumpsFrom) {
-  std::unique_ptr<TracedValue> traced_value(new TracedValue);
-  std::unordered_map<AllocationContext, AllocationMetrics> metrics_by_context;
-  metrics_by_context[AllocationContext()] = {1, 1};
-  TraceEventMemoryOverhead overhead;
-
-  scoped_refptr<HeapProfilerSerializationState>
-      heap_profiler_serialization_state = new HeapProfilerSerializationState;
-  heap_profiler_serialization_state->SetStackFrameDeduplicator(
-      WrapUnique(new StackFrameDeduplicator));
-  heap_profiler_serialization_state->SetTypeNameDeduplicator(
-      WrapUnique(new TypeNameDeduplicator));
-  std::unique_ptr<ProcessMemoryDump> pmd1(new ProcessMemoryDump(
-      heap_profiler_serialization_state.get(), kDetailedDumpArgs));
-  auto* mad1_1 = pmd1->CreateAllocatorDump("pmd1/mad1");
-  auto* mad1_2 = pmd1->CreateAllocatorDump("pmd1/mad2");
-  pmd1->AddOwnershipEdge(mad1_1->guid(), mad1_2->guid());
-  pmd1->DumpHeapUsage(metrics_by_context, overhead, "pmd1/heap_dump1");
-  pmd1->DumpHeapUsage(metrics_by_context, overhead, "pmd1/heap_dump2");
-
-  std::unique_ptr<ProcessMemoryDump> pmd2(new ProcessMemoryDump(
-      heap_profiler_serialization_state.get(), kDetailedDumpArgs));
-  auto* mad2_1 = pmd2->CreateAllocatorDump("pmd2/mad1");
-  auto* mad2_2 = pmd2->CreateAllocatorDump("pmd2/mad2");
-  pmd2->AddOwnershipEdge(mad2_1->guid(), mad2_2->guid());
-  pmd2->DumpHeapUsage(metrics_by_context, overhead, "pmd2/heap_dump1");
-  pmd2->DumpHeapUsage(metrics_by_context, overhead, "pmd2/heap_dump2");
-
-  MemoryAllocatorDumpGuid shared_mad_guid1(1);
-  MemoryAllocatorDumpGuid shared_mad_guid2(2);
-  auto* shared_mad1 = pmd2->CreateSharedGlobalAllocatorDump(shared_mad_guid1);
-  auto* shared_mad2 =
-      pmd2->CreateWeakSharedGlobalAllocatorDump(shared_mad_guid2);
-
-  pmd1->TakeAllDumpsFrom(pmd2.get());
-
-  // Make sure that pmd2 is empty but still usable after it has been emptied.
-  ASSERT_TRUE(pmd2->allocator_dumps().empty());
-  ASSERT_TRUE(pmd2->allocator_dumps_edges().empty());
-  ASSERT_TRUE(pmd2->heap_dumps().empty());
-  pmd2->CreateAllocatorDump("pmd2/this_mad_stays_with_pmd2");
-  ASSERT_EQ(1u, pmd2->allocator_dumps().size());
-  ASSERT_EQ(1u, pmd2->allocator_dumps().count("pmd2/this_mad_stays_with_pmd2"));
-  pmd2->AddOwnershipEdge(MemoryAllocatorDumpGuid(42),
-                         MemoryAllocatorDumpGuid(4242));
-
-  // Check that calling serialization routines doesn't cause a crash.
-  pmd2->SerializeAllocatorDumpsInto(traced_value.get());
-  pmd2->SerializeHeapProfilerDumpsInto(traced_value.get());
-
-  // Free the |pmd2| to check that the memory ownership of the two MAD(s)
-  // has been transferred to |pmd1|.
-  pmd2.reset();
-
-  // Now check that |pmd1| has been effectively merged.
-  ASSERT_EQ(6u, pmd1->allocator_dumps().size());
-  ASSERT_EQ(1u, pmd1->allocator_dumps().count("pmd1/mad1"));
-  ASSERT_EQ(1u, pmd1->allocator_dumps().count("pmd1/mad2"));
-  ASSERT_EQ(1u, pmd1->allocator_dumps().count("pmd2/mad1"));
-  ASSERT_EQ(1u, pmd1->allocator_dumps().count("pmd1/mad2"));
-  ASSERT_EQ(2u, pmd1->allocator_dumps_edges().size());
-  ASSERT_EQ(shared_mad1, pmd1->GetSharedGlobalAllocatorDump(shared_mad_guid1));
-  ASSERT_EQ(shared_mad2, pmd1->GetSharedGlobalAllocatorDump(shared_mad_guid2));
-  ASSERT_TRUE(MemoryAllocatorDump::Flags::WEAK & shared_mad2->flags());
-  ASSERT_EQ(4u, pmd1->heap_dumps().size());
-  ASSERT_TRUE(GetHeapDump(*pmd1, "pmd1/heap_dump1") != nullptr);
-  ASSERT_TRUE(GetHeapDump(*pmd1, "pmd1/heap_dump2") != nullptr);
-  ASSERT_TRUE(GetHeapDump(*pmd1, "pmd2/heap_dump1") != nullptr);
-  ASSERT_TRUE(GetHeapDump(*pmd1, "pmd2/heap_dump2") != nullptr);
-
-  // Check that calling serialization routines doesn't cause a crash.
-  traced_value.reset(new TracedValue);
-  pmd1->SerializeAllocatorDumpsInto(traced_value.get());
-  pmd1->SerializeHeapProfilerDumpsInto(traced_value.get());
-
-  pmd1.reset();
-}
-
-TEST(ProcessMemoryDumpTest, OverrideOwnershipEdge) {
-  std::unique_ptr<ProcessMemoryDump> pmd(
-      new ProcessMemoryDump(nullptr, kDetailedDumpArgs));
-
-  auto* shm_dump1 = pmd->CreateAllocatorDump("shared_mem/seg1");
-  auto* shm_dump2 = pmd->CreateAllocatorDump("shared_mem/seg2");
-  auto* shm_dump3 = pmd->CreateAllocatorDump("shared_mem/seg3");
-  auto* shm_dump4 = pmd->CreateAllocatorDump("shared_mem/seg4");
-
-  // Create one allocation with an auto-assigned guid and mark it as a
-  // suballocation of "fakealloc/allocated_objects".
-  auto* child1_dump = pmd->CreateAllocatorDump("shared_mem/child/seg1");
-  pmd->AddOverridableOwnershipEdge(child1_dump->guid(), shm_dump1->guid(),
-                                   0 /* importance */);
-  auto* child2_dump = pmd->CreateAllocatorDump("shared_mem/child/seg2");
-  pmd->AddOwnershipEdge(child2_dump->guid(), shm_dump2->guid(),
-                        3 /* importance */);
-  MemoryAllocatorDumpGuid shared_mad_guid(1);
-  pmd->CreateSharedGlobalAllocatorDump(shared_mad_guid);
-  pmd->AddOverridableOwnershipEdge(shm_dump3->guid(), shared_mad_guid,
-                                   0 /* importance */);
-  auto* child4_dump = pmd->CreateAllocatorDump("shared_mem/child/seg4");
-  pmd->AddOverridableOwnershipEdge(child4_dump->guid(), shm_dump4->guid(),
-                                   4 /* importance */);
-
-  const ProcessMemoryDump::AllocatorDumpEdgesMap& edges =
-      pmd->allocator_dumps_edges();
-  EXPECT_EQ(4u, edges.size());
-  EXPECT_EQ(shm_dump1->guid(), edges.find(child1_dump->guid())->second.target);
-  EXPECT_EQ(0, edges.find(child1_dump->guid())->second.importance);
-  EXPECT_TRUE(edges.find(child1_dump->guid())->second.overridable);
-  EXPECT_EQ(shm_dump2->guid(), edges.find(child2_dump->guid())->second.target);
-  EXPECT_EQ(3, edges.find(child2_dump->guid())->second.importance);
-  EXPECT_FALSE(edges.find(child2_dump->guid())->second.overridable);
-  EXPECT_EQ(shared_mad_guid, edges.find(shm_dump3->guid())->second.target);
-  EXPECT_EQ(0, edges.find(shm_dump3->guid())->second.importance);
-  EXPECT_TRUE(edges.find(shm_dump3->guid())->second.overridable);
-  EXPECT_EQ(shm_dump4->guid(), edges.find(child4_dump->guid())->second.target);
-  EXPECT_EQ(4, edges.find(child4_dump->guid())->second.importance);
-  EXPECT_TRUE(edges.find(child4_dump->guid())->second.overridable);
-
-  // These should override old edges:
-  pmd->AddOwnershipEdge(child1_dump->guid(), shm_dump1->guid(),
-                        1 /* importance */);
-  pmd->AddOwnershipEdge(shm_dump3->guid(), shared_mad_guid, 2 /* importance */);
-  // This should not change the old edges.
-  pmd->AddOverridableOwnershipEdge(child2_dump->guid(), shm_dump2->guid(),
-                                   0 /* importance */);
-  pmd->AddOwnershipEdge(child4_dump->guid(), shm_dump4->guid(),
-                        0 /* importance */);
-
-  EXPECT_EQ(4u, edges.size());
-  EXPECT_EQ(shm_dump1->guid(), edges.find(child1_dump->guid())->second.target);
-  EXPECT_EQ(1, edges.find(child1_dump->guid())->second.importance);
-  EXPECT_FALSE(edges.find(child1_dump->guid())->second.overridable);
-  EXPECT_EQ(shm_dump2->guid(), edges.find(child2_dump->guid())->second.target);
-  EXPECT_EQ(3, edges.find(child2_dump->guid())->second.importance);
-  EXPECT_FALSE(edges.find(child2_dump->guid())->second.overridable);
-  EXPECT_EQ(shared_mad_guid, edges.find(shm_dump3->guid())->second.target);
-  EXPECT_EQ(2, edges.find(shm_dump3->guid())->second.importance);
-  EXPECT_FALSE(edges.find(shm_dump3->guid())->second.overridable);
-  EXPECT_EQ(shm_dump4->guid(), edges.find(child4_dump->guid())->second.target);
-  EXPECT_EQ(4, edges.find(child4_dump->guid())->second.importance);
-  EXPECT_FALSE(edges.find(child4_dump->guid())->second.overridable);
-}
-
-TEST(ProcessMemoryDumpTest, Suballocations) {
-  std::unique_ptr<ProcessMemoryDump> pmd(
-      new ProcessMemoryDump(nullptr, kDetailedDumpArgs));
-  const std::string allocator_dump_name = "fakealloc/allocated_objects";
-  pmd->CreateAllocatorDump(allocator_dump_name);
-
-  // Create one allocation with an auto-assigned guid and mark it as a
-  // suballocation of "fakealloc/allocated_objects".
-  auto* pic1_dump = pmd->CreateAllocatorDump("picturemanager/picture1");
-  pmd->AddSuballocation(pic1_dump->guid(), allocator_dump_name);
-
-  // Same here, but this time create an allocation with an explicit guid.
-  auto* pic2_dump = pmd->CreateAllocatorDump("picturemanager/picture2",
-                                            MemoryAllocatorDumpGuid(0x42));
-  pmd->AddSuballocation(pic2_dump->guid(), allocator_dump_name);
-
-  // Now check that AddSuballocation() has created anonymous child dumps under
-  // "fakealloc/allocated_objects".
-  auto anon_node_1_it = pmd->allocator_dumps().find(
-      allocator_dump_name + "/__" + pic1_dump->guid().ToString());
-  ASSERT_NE(pmd->allocator_dumps().end(), anon_node_1_it);
-
-  auto anon_node_2_it =
-      pmd->allocator_dumps().find(allocator_dump_name + "/__42");
-  ASSERT_NE(pmd->allocator_dumps().end(), anon_node_2_it);
-
-  // Finally check that AddSuballocation() has created also the
-  // edges between the pictures and the anonymous allocator child dumps.
-  bool found_edge[2]{false, false};
-  for (const auto& e : pmd->allocator_dumps_edges()) {
-    found_edge[0] |= (e.first == pic1_dump->guid() &&
-                      e.second.target == anon_node_1_it->second->guid());
-    found_edge[1] |= (e.first == pic2_dump->guid() &&
-                      e.second.target == anon_node_2_it->second->guid());
-  }
-  ASSERT_TRUE(found_edge[0]);
-  ASSERT_TRUE(found_edge[1]);
-
-  // Check that calling serialization routines doesn't cause a crash.
-  std::unique_ptr<TracedValue> traced_value(new TracedValue);
-  pmd->SerializeAllocatorDumpsInto(traced_value.get());
-  pmd->SerializeHeapProfilerDumpsInto(traced_value.get());
-
-  pmd.reset();
-}
-
-TEST(ProcessMemoryDumpTest, GlobalAllocatorDumpTest) {
-  std::unique_ptr<ProcessMemoryDump> pmd(
-      new ProcessMemoryDump(nullptr, kDetailedDumpArgs));
-  MemoryAllocatorDumpGuid shared_mad_guid(1);
-  auto* shared_mad1 = pmd->CreateWeakSharedGlobalAllocatorDump(shared_mad_guid);
-  ASSERT_EQ(shared_mad_guid, shared_mad1->guid());
-  ASSERT_EQ(MemoryAllocatorDump::Flags::WEAK, shared_mad1->flags());
-
-  auto* shared_mad2 = pmd->GetSharedGlobalAllocatorDump(shared_mad_guid);
-  ASSERT_EQ(shared_mad1, shared_mad2);
-  ASSERT_EQ(MemoryAllocatorDump::Flags::WEAK, shared_mad1->flags());
-
-  auto* shared_mad3 = pmd->CreateWeakSharedGlobalAllocatorDump(shared_mad_guid);
-  ASSERT_EQ(shared_mad1, shared_mad3);
-  ASSERT_EQ(MemoryAllocatorDump::Flags::WEAK, shared_mad1->flags());
-
-  auto* shared_mad4 = pmd->CreateSharedGlobalAllocatorDump(shared_mad_guid);
-  ASSERT_EQ(shared_mad1, shared_mad4);
-  ASSERT_EQ(MemoryAllocatorDump::Flags::DEFAULT, shared_mad1->flags());
-
-  auto* shared_mad5 = pmd->CreateWeakSharedGlobalAllocatorDump(shared_mad_guid);
-  ASSERT_EQ(shared_mad1, shared_mad5);
-  ASSERT_EQ(MemoryAllocatorDump::Flags::DEFAULT, shared_mad1->flags());
-}
-
-TEST(ProcessMemoryDumpTest, SharedMemoryOwnershipTest) {
-  std::unique_ptr<ProcessMemoryDump> pmd(
-      new ProcessMemoryDump(nullptr, kDetailedDumpArgs));
-  const ProcessMemoryDump::AllocatorDumpEdgesMap& edges =
-      pmd->allocator_dumps_edges();
-
-  auto* client_dump2 = pmd->CreateAllocatorDump("discardable/segment2");
-  auto shm_token2 = UnguessableToken::Create();
-  MemoryAllocatorDumpGuid shm_local_guid2 =
-      pmd->GetDumpId(SharedMemoryTracker::GetDumpNameForTracing(shm_token2));
-  MemoryAllocatorDumpGuid shm_global_guid2 =
-      SharedMemoryTracker::GetGlobalDumpIdForTracing(shm_token2);
-  pmd->AddOverridableOwnershipEdge(shm_local_guid2, shm_global_guid2,
-                                   0 /* importance */);
-
-  pmd->CreateSharedMemoryOwnershipEdge(client_dump2->guid(), shm_token2,
-                                       1 /* importance */);
-  EXPECT_EQ(2u, edges.size());
-
-  EXPECT_EQ(shm_global_guid2, edges.find(shm_local_guid2)->second.target);
-  EXPECT_EQ(1, edges.find(shm_local_guid2)->second.importance);
-  EXPECT_FALSE(edges.find(shm_local_guid2)->second.overridable);
-  EXPECT_EQ(shm_local_guid2, edges.find(client_dump2->guid())->second.target);
-  EXPECT_EQ(1, edges.find(client_dump2->guid())->second.importance);
-  EXPECT_FALSE(edges.find(client_dump2->guid())->second.overridable);
-}
-
-TEST(ProcessMemoryDumpTest, BackgroundModeTest) {
-  MemoryDumpArgs background_args = {MemoryDumpLevelOfDetail::BACKGROUND};
-  std::unique_ptr<ProcessMemoryDump> pmd(
-      new ProcessMemoryDump(nullptr, background_args));
-  ProcessMemoryDump::is_black_hole_non_fatal_for_testing_ = true;
-  SetAllocatorDumpNameWhitelistForTesting(kTestDumpNameWhitelist);
-  MemoryAllocatorDump* black_hole_mad = pmd->GetBlackHoleMad();
-
-  // Invalid dump names.
-  EXPECT_EQ(black_hole_mad,
-            pmd->CreateAllocatorDump("NotWhitelisted/TestName"));
-  EXPECT_EQ(black_hole_mad, pmd->CreateAllocatorDump("TestName"));
-  EXPECT_EQ(black_hole_mad, pmd->CreateAllocatorDump("Whitelisted/Test"));
-  EXPECT_EQ(black_hole_mad,
-            pmd->CreateAllocatorDump("Not/Whitelisted/TestName"));
-  EXPECT_EQ(black_hole_mad,
-            pmd->CreateAllocatorDump("Whitelisted/TestName/Google"));
-  EXPECT_EQ(black_hole_mad,
-            pmd->CreateAllocatorDump("Whitelisted/TestName/0x1a2Google"));
-  EXPECT_EQ(black_hole_mad,
-            pmd->CreateAllocatorDump("Whitelisted/TestName/__12/Google"));
-
-  // Suballocations.
-  MemoryAllocatorDumpGuid guid(1);
-  pmd->AddSuballocation(guid, "malloc/allocated_objects");
-  EXPECT_EQ(0u, pmd->allocator_dumps_edges_.size());
-  EXPECT_EQ(0u, pmd->allocator_dumps_.size());
-
-  // Global dumps.
-  EXPECT_NE(black_hole_mad, pmd->CreateSharedGlobalAllocatorDump(guid));
-  EXPECT_NE(black_hole_mad, pmd->CreateWeakSharedGlobalAllocatorDump(guid));
-  EXPECT_NE(black_hole_mad, pmd->GetSharedGlobalAllocatorDump(guid));
-
-  // Valid dump names.
-  EXPECT_NE(black_hole_mad, pmd->CreateAllocatorDump("Whitelisted/TestName"));
-  EXPECT_NE(black_hole_mad,
-            pmd->CreateAllocatorDump("Whitelisted/TestName_0xA1b2"));
-  EXPECT_NE(black_hole_mad,
-            pmd->CreateAllocatorDump("Whitelisted/0xaB/TestName"));
-
-  // GetAllocatorDump is consistent.
-  EXPECT_EQ(black_hole_mad, pmd->GetAllocatorDump("NotWhitelisted/TestName"));
-  EXPECT_NE(black_hole_mad, pmd->GetAllocatorDump("Whitelisted/TestName"));
-
-  // Test whitelisted entries.
-  ASSERT_TRUE(IsMemoryAllocatorDumpNameWhitelisted("Whitelisted/TestName"));
-
-  // Global dumps should be whitelisted.
-  ASSERT_TRUE(IsMemoryAllocatorDumpNameWhitelisted("global/13456"));
-
-  // Global dumps with non-guids should not be.
-  ASSERT_FALSE(IsMemoryAllocatorDumpNameWhitelisted("global/random"));
-
-  // Random names should not.
-  ASSERT_FALSE(IsMemoryAllocatorDumpNameWhitelisted("NotWhitelisted/TestName"));
-
-  // Check hex processing.
-  ASSERT_TRUE(IsMemoryAllocatorDumpNameWhitelisted("Whitelisted/0xA1b2"));
-}
-
-TEST(ProcessMemoryDumpTest, GuidsTest) {
-  MemoryDumpArgs dump_args = {MemoryDumpLevelOfDetail::DETAILED};
-
-  const auto process_token_one = UnguessableToken::Create();
-  const auto process_token_two = UnguessableToken::Create();
-
-  ProcessMemoryDump pmd1(nullptr, dump_args);
-  pmd1.set_process_token_for_testing(process_token_one);
-  MemoryAllocatorDump* mad1 = pmd1.CreateAllocatorDump("foo");
-
-  ProcessMemoryDump pmd2(nullptr, dump_args);
-  pmd2.set_process_token_for_testing(process_token_one);
-  MemoryAllocatorDump* mad2 = pmd2.CreateAllocatorDump("foo");
-
-  // If we don't pass the argument we get a random PMD:
-  ProcessMemoryDump pmd3(nullptr, dump_args);
-  MemoryAllocatorDump* mad3 = pmd3.CreateAllocatorDump("foo");
-
-  // PMD's for different processes produce different GUIDs even for the same
-  // names:
-  ProcessMemoryDump pmd4(nullptr, dump_args);
-  pmd4.set_process_token_for_testing(process_token_two);
-  MemoryAllocatorDump* mad4 = pmd4.CreateAllocatorDump("foo");
-
-  ASSERT_EQ(mad1->guid(), mad2->guid());
-
-  ASSERT_NE(mad2->guid(), mad3->guid());
-  ASSERT_NE(mad3->guid(), mad4->guid());
-  ASSERT_NE(mad4->guid(), mad2->guid());
-
-  ASSERT_EQ(mad1->guid(), pmd1.GetDumpId("foo"));
-}
-
-#if defined(COUNT_RESIDENT_BYTES_SUPPORTED)
-TEST(ProcessMemoryDumpTest, CountResidentBytes) {
-  const size_t page_size = ProcessMemoryDump::GetSystemPageSize();
-
-  // Allocate few page of dirty memory and check if it is resident.
-  const size_t size1 = 5 * page_size;
-  void* memory1 = Map(size1);
-  memset(memory1, 0, size1);
-  size_t res1 = ProcessMemoryDump::CountResidentBytes(memory1, size1);
-  ASSERT_EQ(res1, size1);
-  Unmap(memory1, size1);
-
-  // Allocate a large memory segment (> 8Mib).
-  const size_t kVeryLargeMemorySize = 15 * 1024 * 1024;
-  void* memory2 = Map(kVeryLargeMemorySize);
-  memset(memory2, 0, kVeryLargeMemorySize);
-  size_t res2 =
-      ProcessMemoryDump::CountResidentBytes(memory2, kVeryLargeMemorySize);
-  ASSERT_EQ(res2, kVeryLargeMemorySize);
-  Unmap(memory2, kVeryLargeMemorySize);
-}
-
-TEST(ProcessMemoryDumpTest, CountResidentBytesInSharedMemory) {
-#if defined(OS_IOS)
-  // TODO(crbug.com/748410): Reenable this test.
-  if (!base::ios::IsRunningOnIOS10OrLater()) {
-    return;
-  }
-#endif
-
-  const size_t page_size = ProcessMemoryDump::GetSystemPageSize();
-
-  // Allocate few page of dirty memory and check if it is resident.
-  const size_t size1 = 5 * page_size;
-  SharedMemory shared_memory1;
-  shared_memory1.CreateAndMapAnonymous(size1);
-  memset(shared_memory1.memory(), 0, size1);
-  base::Optional<size_t> res1 =
-      ProcessMemoryDump::CountResidentBytesInSharedMemory(
-          shared_memory1.memory(), shared_memory1.mapped_size());
-  ASSERT_TRUE(res1.has_value());
-  ASSERT_EQ(res1.value(), size1);
-  shared_memory1.Unmap();
-  shared_memory1.Close();
-
-  // Allocate a large memory segment (> 8Mib).
-  const size_t kVeryLargeMemorySize = 15 * 1024 * 1024;
-  SharedMemory shared_memory2;
-  shared_memory2.CreateAndMapAnonymous(kVeryLargeMemorySize);
-  memset(shared_memory2.memory(), 0, kVeryLargeMemorySize);
-  base::Optional<size_t> res2 =
-      ProcessMemoryDump::CountResidentBytesInSharedMemory(
-          shared_memory2.memory(), shared_memory2.mapped_size());
-  ASSERT_TRUE(res2.has_value());
-  ASSERT_EQ(res2.value(), kVeryLargeMemorySize);
-  shared_memory2.Unmap();
-  shared_memory2.Close();
-
-  // Allocate a large memory segment, but touch about half of all pages.
-  const size_t kTouchedMemorySize = 7 * 1024 * 1024;
-  SharedMemory shared_memory3;
-  shared_memory3.CreateAndMapAnonymous(kVeryLargeMemorySize);
-  memset(shared_memory3.memory(), 0, kTouchedMemorySize);
-  base::Optional<size_t> res3 =
-      ProcessMemoryDump::CountResidentBytesInSharedMemory(
-          shared_memory3.memory(), shared_memory3.mapped_size());
-  ASSERT_TRUE(res3.has_value());
-  ASSERT_EQ(res3.value(), kTouchedMemorySize);
-  shared_memory3.Unmap();
-  shared_memory3.Close();
-}
-#endif  // defined(COUNT_RESIDENT_BYTES_SUPPORTED)
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/trace_category_unittest.cc b/base/trace_event/trace_category_unittest.cc
deleted file mode 100644
index 964064e..0000000
--- a/base/trace_event/trace_category_unittest.cc
+++ /dev/null
@@ -1,148 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string.h>
-
-#include <memory>
-
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/synchronization/lock.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread.h"
-#include "base/trace_event/category_registry.h"
-#include "base/trace_event/trace_category.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-
-// Static initializers are generally forbidden. However, in the past we ran in
-// the case of some test using tracing in a static initializer. This test checks
-// That the category registry doesn't rely on static initializers itself and is
-// functional even if called from another static initializer.
-bool Initializer() {
-  return CategoryRegistry::kCategoryMetadata &&
-         CategoryRegistry::kCategoryMetadata->is_valid();
-}
-bool g_initializer_check = Initializer();
-
-class TraceCategoryTest : public testing::Test {
- public:
-  void SetUp() override { CategoryRegistry::Initialize(); }
-
-  void TearDown() override { CategoryRegistry::ResetForTesting(); }
-
-  static bool GetOrCreateCategoryByName(const char* name, TraceCategory** cat) {
-    static LazyInstance<Lock>::Leaky g_lock = LAZY_INSTANCE_INITIALIZER;
-    bool is_new_cat = false;
-    *cat = CategoryRegistry::GetCategoryByName(name);
-    if (!*cat) {
-      AutoLock lock(g_lock.Get());
-      is_new_cat = CategoryRegistry::GetOrCreateCategoryLocked(
-          name, [](TraceCategory*) {}, cat);
-    }
-    return is_new_cat;
-  };
-
-  static CategoryRegistry::Range GetAllCategories() {
-    return CategoryRegistry::GetAllCategories();
-  }
-
-  static void TestRaceThreadMain(WaitableEvent* event) {
-    TraceCategory* cat = nullptr;
-    event->Wait();
-    GetOrCreateCategoryByName("__test_race", &cat);
-    EXPECT_NE(nullptr, cat);
-  }
-};
-
-TEST_F(TraceCategoryTest, Basic) {
-  ASSERT_NE(nullptr, CategoryRegistry::kCategoryMetadata);
-  ASSERT_TRUE(CategoryRegistry::kCategoryMetadata->is_valid());
-  ASSERT_FALSE(CategoryRegistry::kCategoryMetadata->is_enabled());
-
-  // Metadata category is built-in and should create a new category.
-  TraceCategory* cat_meta = nullptr;
-  const char* kMetadataName = CategoryRegistry::kCategoryMetadata->name();
-  ASSERT_FALSE(GetOrCreateCategoryByName(kMetadataName, &cat_meta));
-  ASSERT_EQ(CategoryRegistry::kCategoryMetadata, cat_meta);
-
-  TraceCategory* cat_1 = nullptr;
-  ASSERT_TRUE(GetOrCreateCategoryByName("__test_basic_ab", &cat_1));
-  ASSERT_FALSE(cat_1->is_enabled());
-  ASSERT_EQ(0u, cat_1->enabled_filters());
-  cat_1->set_state_flag(TraceCategory::ENABLED_FOR_RECORDING);
-  cat_1->set_state_flag(TraceCategory::ENABLED_FOR_FILTERING);
-  ASSERT_EQ(TraceCategory::ENABLED_FOR_RECORDING |
-                TraceCategory::ENABLED_FOR_FILTERING,
-            cat_1->state());
-
-  cat_1->set_enabled_filters(129);
-  ASSERT_EQ(129u, cat_1->enabled_filters());
-  ASSERT_EQ(cat_1, CategoryRegistry::GetCategoryByStatePtr(cat_1->state_ptr()));
-
-  cat_1->clear_state_flag(TraceCategory::ENABLED_FOR_FILTERING);
-  ASSERT_EQ(TraceCategory::ENABLED_FOR_RECORDING, cat_1->state());
-  ASSERT_EQ(TraceCategory::ENABLED_FOR_RECORDING, *cat_1->state_ptr());
-  ASSERT_TRUE(cat_1->is_enabled());
-
-  TraceCategory* cat_2 = nullptr;
-  ASSERT_TRUE(GetOrCreateCategoryByName("__test_basic_a", &cat_2));
-  ASSERT_FALSE(cat_2->is_enabled());
-  cat_2->set_state_flag(TraceCategory::ENABLED_FOR_RECORDING);
-
-  TraceCategory* cat_2_copy = nullptr;
-  ASSERT_FALSE(GetOrCreateCategoryByName("__test_basic_a", &cat_2_copy));
-  ASSERT_EQ(cat_2, cat_2_copy);
-
-  TraceCategory* cat_3 = nullptr;
-  ASSERT_TRUE(
-      GetOrCreateCategoryByName("__test_basic_ab,__test_basic_a", &cat_3));
-  ASSERT_FALSE(cat_3->is_enabled());
-  ASSERT_EQ(0u, cat_3->enabled_filters());
-
-  int num_test_categories_seen = 0;
-  for (const TraceCategory& cat : GetAllCategories()) {
-    if (strcmp(cat.name(), kMetadataName) == 0)
-      ASSERT_TRUE(CategoryRegistry::IsBuiltinCategory(&cat));
-
-    if (strncmp(cat.name(), "__test_basic_", 13) == 0) {
-      ASSERT_FALSE(CategoryRegistry::IsBuiltinCategory(&cat));
-      num_test_categories_seen++;
-    }
-  }
-  ASSERT_EQ(3, num_test_categories_seen);
-  ASSERT_TRUE(g_initializer_check);
-}
-
-// Tries to cover the case of multiple threads creating the same category
-// simultaneously. Should never end up with distinct entries with the same name.
-TEST_F(TraceCategoryTest, ThreadRaces) {
-  const int kNumThreads = 32;
-  std::unique_ptr<Thread> threads[kNumThreads];
-  for (int i = 0; i < kNumThreads; i++) {
-    threads[i].reset(new Thread("test thread"));
-    threads[i]->Start();
-  }
-  WaitableEvent sync_event(WaitableEvent::ResetPolicy::MANUAL,
-                           WaitableEvent::InitialState::NOT_SIGNALED);
-  for (int i = 0; i < kNumThreads; i++) {
-    threads[i]->task_runner()->PostTask(
-        FROM_HERE, BindOnce(&TestRaceThreadMain, Unretained(&sync_event)));
-  }
-  sync_event.Signal();
-  for (int i = 0; i < kNumThreads; i++)
-    threads[i]->Stop();
-
-  int num_times_seen = 0;
-  for (const TraceCategory& cat : GetAllCategories()) {
-    if (strcmp(cat.name(), "__test_race") == 0)
-      num_times_seen++;
-  }
-  ASSERT_EQ(1, num_times_seen);
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/trace_config_unittest.cc b/base/trace_event/trace_config_unittest.cc
deleted file mode 100644
index 3cb6d61..0000000
--- a/base/trace_event/trace_config_unittest.cc
+++ /dev/null
@@ -1,673 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include "base/json/json_reader.h"
-#include "base/json/json_writer.h"
-#include "base/macros.h"
-#include "base/trace_event/memory_dump_manager.h"
-#include "base/trace_event/trace_config.h"
-#include "base/trace_event/trace_config_memory_test_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-
-namespace {
-
-const char kDefaultTraceConfigString[] =
-  "{"
-    "\"enable_argument_filter\":false,"
-    "\"enable_systrace\":false,"
-    "\"record_mode\":\"record-until-full\""
-  "}";
-
-const char kCustomTraceConfigString[] =
-    "{"
-    "\"enable_argument_filter\":true,"
-    "\"enable_systrace\":true,"
-    "\"event_filters\":["
-    "{"
-    "\"excluded_categories\":[\"unfiltered_cat\"],"
-    "\"filter_args\":{\"event_name_whitelist\":[\"a snake\",\"a dog\"]},"
-    "\"filter_predicate\":\"event_whitelist_predicate\","
-    "\"included_categories\":[\"*\"]"
-    "}"
-    "],"
-    "\"excluded_categories\":[\"excluded\",\"exc_pattern*\"],"
-    "\"included_categories\":["
-    "\"included\","
-    "\"inc_pattern*\","
-    "\"disabled-by-default-cc\","
-    "\"disabled-by-default-memory-infra\"],"
-    "\"memory_dump_config\":{"
-    "\"allowed_dump_modes\":[\"background\",\"light\",\"detailed\"],"
-    "\"heap_profiler_options\":{"
-    "\"breakdown_threshold_bytes\":10240"
-    "},"
-    "\"triggers\":["
-    "{"
-    "\"min_time_between_dumps_ms\":50,"
-    "\"mode\":\"light\","
-    "\"type\":\"periodic_interval\""
-    "},"
-    "{"
-    "\"min_time_between_dumps_ms\":1000,"
-    "\"mode\":\"detailed\","
-    "\"type\":\"peak_memory_usage\""
-    "}"
-    "]"
-    "},"
-    "\"record_mode\":\"record-continuously\""
-    "}";
-
-void CheckDefaultTraceConfigBehavior(const TraceConfig& tc) {
-  EXPECT_EQ(RECORD_UNTIL_FULL, tc.GetTraceRecordMode());
-  EXPECT_FALSE(tc.IsSystraceEnabled());
-  EXPECT_FALSE(tc.IsArgumentFilterEnabled());
-
-  // Default trace config enables every category filter except the
-  // disabled-by-default-* ones.
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("Category1"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("not-excluded-category"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("disabled-by-default-cc"));
-
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("Category1,not-excluded-category"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("Category1,disabled-by-default-cc"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled(
-      "disabled-by-default-cc,disabled-by-default-cc2"));
-}
-
-}  // namespace
-
-TEST(TraceConfigTest, TraceConfigFromValidLegacyFormat) {
-  // From trace options strings
-  TraceConfig config("", "record-until-full");
-  EXPECT_EQ(RECORD_UNTIL_FULL, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("record-until-full", config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig("", "record-continuously");
-  EXPECT_EQ(RECORD_CONTINUOUSLY, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("record-continuously", config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig("", "trace-to-console");
-  EXPECT_EQ(ECHO_TO_CONSOLE, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("trace-to-console", config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig("", "record-as-much-as-possible");
-  EXPECT_EQ(RECORD_AS_MUCH_AS_POSSIBLE, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("record-as-much-as-possible",
-               config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig("", "enable-systrace, record-continuously");
-  EXPECT_EQ(RECORD_CONTINUOUSLY, config.GetTraceRecordMode());
-  EXPECT_TRUE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("record-continuously,enable-systrace",
-               config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig("", "enable-argument-filter,record-as-much-as-possible");
-  EXPECT_EQ(RECORD_AS_MUCH_AS_POSSIBLE, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_TRUE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("record-as-much-as-possible,enable-argument-filter",
-               config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig(
-    "",
-    "enable-systrace,trace-to-console,enable-argument-filter");
-  EXPECT_EQ(ECHO_TO_CONSOLE, config.GetTraceRecordMode());
-  EXPECT_TRUE(config.IsSystraceEnabled());
-  EXPECT_TRUE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ(
-    "trace-to-console,enable-systrace,enable-argument-filter",
-    config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig(
-    "", "record-continuously, record-until-full, trace-to-console");
-  EXPECT_EQ(ECHO_TO_CONSOLE, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("trace-to-console", config.ToTraceOptionsString().c_str());
-
-  // From TraceRecordMode
-  config = TraceConfig("", RECORD_UNTIL_FULL);
-  EXPECT_EQ(RECORD_UNTIL_FULL, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("record-until-full", config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig("", RECORD_CONTINUOUSLY);
-  EXPECT_EQ(RECORD_CONTINUOUSLY, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("record-continuously", config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig("", ECHO_TO_CONSOLE);
-  EXPECT_EQ(ECHO_TO_CONSOLE, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("trace-to-console", config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig("", RECORD_AS_MUCH_AS_POSSIBLE);
-  EXPECT_EQ(RECORD_AS_MUCH_AS_POSSIBLE, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("record-as-much-as-possible",
-               config.ToTraceOptionsString().c_str());
-
-  // From category filter strings
-  config = TraceConfig("included,-excluded,inc_pattern*,-exc_pattern*", "");
-  EXPECT_STREQ("included,inc_pattern*,-excluded,-exc_pattern*",
-               config.ToCategoryFilterString().c_str());
-
-  config = TraceConfig("only_inc_cat", "");
-  EXPECT_STREQ("only_inc_cat", config.ToCategoryFilterString().c_str());
-
-  config = TraceConfig("-only_exc_cat", "");
-  EXPECT_STREQ("-only_exc_cat", config.ToCategoryFilterString().c_str());
-
-  config = TraceConfig("disabled-by-default-cc,-excluded", "");
-  EXPECT_STREQ("disabled-by-default-cc,-excluded",
-               config.ToCategoryFilterString().c_str());
-
-  config = TraceConfig("disabled-by-default-cc,included", "");
-  EXPECT_STREQ("included,disabled-by-default-cc",
-               config.ToCategoryFilterString().c_str());
-
-  // From both trace options and category filter strings
-  config = TraceConfig("", "");
-  EXPECT_EQ(RECORD_UNTIL_FULL, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("", config.ToCategoryFilterString().c_str());
-  EXPECT_STREQ("record-until-full", config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig("included,-excluded,inc_pattern*,-exc_pattern*",
-                       "enable-systrace, trace-to-console");
-  EXPECT_EQ(ECHO_TO_CONSOLE, config.GetTraceRecordMode());
-  EXPECT_TRUE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("included,inc_pattern*,-excluded,-exc_pattern*",
-               config.ToCategoryFilterString().c_str());
-  EXPECT_STREQ("trace-to-console,enable-systrace",
-               config.ToTraceOptionsString().c_str());
-
-  // From both trace options and category filter strings with spaces.
-  config = TraceConfig(" included , -excluded, inc_pattern*, ,-exc_pattern*   ",
-                       "enable-systrace, ,trace-to-console  ");
-  EXPECT_EQ(ECHO_TO_CONSOLE, config.GetTraceRecordMode());
-  EXPECT_TRUE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("included,inc_pattern*,-excluded,-exc_pattern*",
-               config.ToCategoryFilterString().c_str());
-  EXPECT_STREQ("trace-to-console,enable-systrace",
-               config.ToTraceOptionsString().c_str());
-
-  // From category filter string and TraceRecordMode
-  config = TraceConfig("included,-excluded,inc_pattern*,-exc_pattern*",
-                       RECORD_CONTINUOUSLY);
-  EXPECT_EQ(RECORD_CONTINUOUSLY, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("included,inc_pattern*,-excluded,-exc_pattern*",
-               config.ToCategoryFilterString().c_str());
-  EXPECT_STREQ("record-continuously", config.ToTraceOptionsString().c_str());
-}
-
-TEST(TraceConfigTest, TraceConfigFromInvalidLegacyStrings) {
-  TraceConfig config("", "foo-bar-baz");
-  EXPECT_EQ(RECORD_UNTIL_FULL, config.GetTraceRecordMode());
-  EXPECT_FALSE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("", config.ToCategoryFilterString().c_str());
-  EXPECT_STREQ("record-until-full", config.ToTraceOptionsString().c_str());
-
-  config = TraceConfig("arbitrary-category", "foo-bar-baz, enable-systrace");
-  EXPECT_EQ(RECORD_UNTIL_FULL, config.GetTraceRecordMode());
-  EXPECT_TRUE(config.IsSystraceEnabled());
-  EXPECT_FALSE(config.IsArgumentFilterEnabled());
-  EXPECT_STREQ("arbitrary-category", config.ToCategoryFilterString().c_str());
-  EXPECT_STREQ("record-until-full,enable-systrace",
-               config.ToTraceOptionsString().c_str());
-}
-
-TEST(TraceConfigTest, ConstructDefaultTraceConfig) {
-  TraceConfig tc;
-  EXPECT_STREQ("", tc.ToCategoryFilterString().c_str());
-  EXPECT_STREQ(kDefaultTraceConfigString, tc.ToString().c_str());
-  CheckDefaultTraceConfigBehavior(tc);
-
-  // Constructors from category filter string and trace option string.
-  TraceConfig tc_asterisk("*", "");
-  EXPECT_STREQ("*", tc_asterisk.ToCategoryFilterString().c_str());
-  CheckDefaultTraceConfigBehavior(tc_asterisk);
-
-  TraceConfig tc_empty_category_filter("", "");
-  EXPECT_STREQ("", tc_empty_category_filter.ToCategoryFilterString().c_str());
-  EXPECT_STREQ(kDefaultTraceConfigString,
-               tc_empty_category_filter.ToString().c_str());
-  CheckDefaultTraceConfigBehavior(tc_empty_category_filter);
-
-  // Constructor from JSON formated config string.
-  TraceConfig tc_empty_json_string("");
-  EXPECT_STREQ("", tc_empty_json_string.ToCategoryFilterString().c_str());
-  EXPECT_STREQ(kDefaultTraceConfigString,
-               tc_empty_json_string.ToString().c_str());
-  CheckDefaultTraceConfigBehavior(tc_empty_json_string);
-
-  // Constructor from dictionary value.
-  DictionaryValue dict;
-  TraceConfig tc_dict(dict);
-  EXPECT_STREQ("", tc_dict.ToCategoryFilterString().c_str());
-  EXPECT_STREQ(kDefaultTraceConfigString, tc_dict.ToString().c_str());
-  CheckDefaultTraceConfigBehavior(tc_dict);
-}
-
-TEST(TraceConfigTest, EmptyAndAsteriskCategoryFilterString) {
-  TraceConfig tc_empty("", "");
-  TraceConfig tc_asterisk("*", "");
-
-  EXPECT_STREQ("", tc_empty.ToCategoryFilterString().c_str());
-  EXPECT_STREQ("*", tc_asterisk.ToCategoryFilterString().c_str());
-
-  // Both fall back to default config.
-  CheckDefaultTraceConfigBehavior(tc_empty);
-  CheckDefaultTraceConfigBehavior(tc_asterisk);
-
-  // They differ only for internal checking.
-  EXPECT_FALSE(tc_empty.category_filter().IsCategoryEnabled("Category1"));
-  EXPECT_FALSE(
-      tc_empty.category_filter().IsCategoryEnabled("not-excluded-category"));
-  EXPECT_TRUE(tc_asterisk.category_filter().IsCategoryEnabled("Category1"));
-  EXPECT_TRUE(
-      tc_asterisk.category_filter().IsCategoryEnabled("not-excluded-category"));
-}
-
-TEST(TraceConfigTest, DisabledByDefaultCategoryFilterString) {
-  TraceConfig tc("foo,disabled-by-default-foo", "");
-  EXPECT_STREQ("foo,disabled-by-default-foo",
-               tc.ToCategoryFilterString().c_str());
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("foo"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("disabled-by-default-foo"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("bar"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("disabled-by-default-bar"));
-
-  EXPECT_TRUE(tc.event_filters().empty());
-  // Enabling only the disabled-by-default-* category means the default ones
-  // are also enabled.
-  tc = TraceConfig("disabled-by-default-foo", "");
-  EXPECT_STREQ("disabled-by-default-foo", tc.ToCategoryFilterString().c_str());
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("disabled-by-default-foo"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("foo"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("bar"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("disabled-by-default-bar"));
-}
-
-TEST(TraceConfigTest, TraceConfigFromDict) {
-  // Passing in empty dictionary will result in default trace config.
-  DictionaryValue dict;
-  TraceConfig tc(dict);
-  EXPECT_STREQ(kDefaultTraceConfigString, tc.ToString().c_str());
-  EXPECT_EQ(RECORD_UNTIL_FULL, tc.GetTraceRecordMode());
-  EXPECT_FALSE(tc.IsSystraceEnabled());
-  EXPECT_FALSE(tc.IsArgumentFilterEnabled());
-  EXPECT_STREQ("", tc.ToCategoryFilterString().c_str());
-
-  std::unique_ptr<Value> default_value(
-      JSONReader::Read(kDefaultTraceConfigString));
-  DCHECK(default_value);
-  const DictionaryValue* default_dict = nullptr;
-  bool is_dict = default_value->GetAsDictionary(&default_dict);
-  DCHECK(is_dict);
-  TraceConfig default_tc(*default_dict);
-  EXPECT_STREQ(kDefaultTraceConfigString, default_tc.ToString().c_str());
-  EXPECT_EQ(RECORD_UNTIL_FULL, default_tc.GetTraceRecordMode());
-  EXPECT_FALSE(default_tc.IsSystraceEnabled());
-  EXPECT_FALSE(default_tc.IsArgumentFilterEnabled());
-  EXPECT_STREQ("", default_tc.ToCategoryFilterString().c_str());
-
-  std::unique_ptr<Value> custom_value(
-      JSONReader::Read(kCustomTraceConfigString));
-  DCHECK(custom_value);
-  const DictionaryValue* custom_dict = nullptr;
-  is_dict = custom_value->GetAsDictionary(&custom_dict);
-  DCHECK(is_dict);
-  TraceConfig custom_tc(*custom_dict);
-  EXPECT_STREQ(kCustomTraceConfigString, custom_tc.ToString().c_str());
-  EXPECT_EQ(RECORD_CONTINUOUSLY, custom_tc.GetTraceRecordMode());
-  EXPECT_TRUE(custom_tc.IsSystraceEnabled());
-  EXPECT_TRUE(custom_tc.IsArgumentFilterEnabled());
-  EXPECT_STREQ(
-      "included,inc_pattern*,"
-      "disabled-by-default-cc,disabled-by-default-memory-infra,"
-      "-excluded,-exc_pattern*",
-      custom_tc.ToCategoryFilterString().c_str());
-}
-
-TEST(TraceConfigTest, TraceConfigFromValidString) {
-  // Using some non-empty config string.
-  const char config_string[] =
-      "{"
-      "\"enable_argument_filter\":true,"
-      "\"enable_systrace\":true,"
-      "\"event_filters\":["
-      "{"
-      "\"excluded_categories\":[\"unfiltered_cat\"],"
-      "\"filter_args\":{\"event_name_whitelist\":[\"a snake\",\"a dog\"]},"
-      "\"filter_predicate\":\"event_whitelist_predicate\","
-      "\"included_categories\":[\"*\"]"
-      "}"
-      "],"
-      "\"excluded_categories\":[\"excluded\",\"exc_pattern*\"],"
-      "\"included_categories\":[\"included\","
-      "\"inc_pattern*\","
-      "\"disabled-by-default-cc\"],"
-      "\"record_mode\":\"record-continuously\""
-      "}";
-  TraceConfig tc(config_string);
-
-  EXPECT_STREQ(config_string, tc.ToString().c_str());
-  EXPECT_EQ(RECORD_CONTINUOUSLY, tc.GetTraceRecordMode());
-  EXPECT_TRUE(tc.IsSystraceEnabled());
-  EXPECT_TRUE(tc.IsArgumentFilterEnabled());
-  EXPECT_STREQ(
-      "included,inc_pattern*,disabled-by-default-cc,-excluded,"
-      "-exc_pattern*",
-      tc.ToCategoryFilterString().c_str());
-
-  EXPECT_TRUE(tc.category_filter().IsCategoryEnabled("included"));
-  EXPECT_TRUE(tc.category_filter().IsCategoryEnabled("inc_pattern_category"));
-  EXPECT_TRUE(tc.category_filter().IsCategoryEnabled("disabled-by-default-cc"));
-  EXPECT_FALSE(tc.category_filter().IsCategoryEnabled("excluded"));
-  EXPECT_FALSE(tc.category_filter().IsCategoryEnabled("exc_pattern_category"));
-  EXPECT_FALSE(
-      tc.category_filter().IsCategoryEnabled("disabled-by-default-others"));
-  EXPECT_FALSE(
-      tc.category_filter().IsCategoryEnabled("not-excluded-nor-included"));
-
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("included"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("inc_pattern_category"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("disabled-by-default-cc"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("excluded"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("exc_pattern_category"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("disabled-by-default-others"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("not-excluded-nor-included"));
-
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("included,excluded"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("excluded,exc_pattern_category"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("included"));
-
-  EXPECT_EQ(tc.event_filters().size(), 1u);
-  const TraceConfig::EventFilterConfig& event_filter = tc.event_filters()[0];
-  EXPECT_STREQ("event_whitelist_predicate",
-               event_filter.predicate_name().c_str());
-  EXPECT_EQ(1u, event_filter.category_filter().included_categories().size());
-  EXPECT_STREQ("*",
-               event_filter.category_filter().included_categories()[0].c_str());
-  EXPECT_EQ(1u, event_filter.category_filter().excluded_categories().size());
-  EXPECT_STREQ("unfiltered_cat",
-               event_filter.category_filter().excluded_categories()[0].c_str());
-  EXPECT_TRUE(event_filter.filter_args());
-
-  std::string json_out;
-  base::JSONWriter::Write(*event_filter.filter_args(), &json_out);
-  EXPECT_STREQ(json_out.c_str(),
-               "{\"event_name_whitelist\":[\"a snake\",\"a dog\"]}");
-  std::unordered_set<std::string> filter_values;
-  EXPECT_TRUE(event_filter.GetArgAsSet("event_name_whitelist", &filter_values));
-  EXPECT_EQ(2u, filter_values.size());
-  EXPECT_EQ(1u, filter_values.count("a snake"));
-  EXPECT_EQ(1u, filter_values.count("a dog"));
-
-  const char config_string_2[] = "{\"included_categories\":[\"*\"]}";
-  TraceConfig tc2(config_string_2);
-  EXPECT_TRUE(tc2.category_filter().IsCategoryEnabled(
-      "non-disabled-by-default-pattern"));
-  EXPECT_FALSE(
-      tc2.category_filter().IsCategoryEnabled("disabled-by-default-pattern"));
-  EXPECT_TRUE(tc2.IsCategoryGroupEnabled("non-disabled-by-default-pattern"));
-  EXPECT_FALSE(tc2.IsCategoryGroupEnabled("disabled-by-default-pattern"));
-
-  // Clear
-  tc.Clear();
-  EXPECT_STREQ(tc.ToString().c_str(),
-               "{"
-                 "\"enable_argument_filter\":false,"
-                 "\"enable_systrace\":false,"
-                 "\"record_mode\":\"record-until-full\""
-               "}");
-}
-
-TEST(TraceConfigTest, TraceConfigFromInvalidString) {
-  // The config string needs to be a dictionary correctly formatted as a JSON
-  // string. Otherwise, it will fall back to the default initialization.
-  TraceConfig tc("");
-  EXPECT_STREQ(kDefaultTraceConfigString, tc.ToString().c_str());
-  EXPECT_EQ(RECORD_UNTIL_FULL, tc.GetTraceRecordMode());
-  EXPECT_FALSE(tc.IsSystraceEnabled());
-  EXPECT_FALSE(tc.IsArgumentFilterEnabled());
-  EXPECT_STREQ("", tc.ToCategoryFilterString().c_str());
-  CheckDefaultTraceConfigBehavior(tc);
-
-  tc = TraceConfig("This is an invalid config string.");
-  EXPECT_STREQ(kDefaultTraceConfigString, tc.ToString().c_str());
-  EXPECT_EQ(RECORD_UNTIL_FULL, tc.GetTraceRecordMode());
-  EXPECT_FALSE(tc.IsSystraceEnabled());
-  EXPECT_FALSE(tc.IsArgumentFilterEnabled());
-  EXPECT_STREQ("", tc.ToCategoryFilterString().c_str());
-  CheckDefaultTraceConfigBehavior(tc);
-
-  tc = TraceConfig("[\"This\", \"is\", \"not\", \"a\", \"dictionary\"]");
-  EXPECT_STREQ(kDefaultTraceConfigString, tc.ToString().c_str());
-  EXPECT_EQ(RECORD_UNTIL_FULL, tc.GetTraceRecordMode());
-  EXPECT_FALSE(tc.IsSystraceEnabled());
-  EXPECT_FALSE(tc.IsArgumentFilterEnabled());
-  EXPECT_STREQ("", tc.ToCategoryFilterString().c_str());
-  CheckDefaultTraceConfigBehavior(tc);
-
-  tc = TraceConfig("{\"record_mode\": invalid-value-needs-double-quote}");
-  EXPECT_STREQ(kDefaultTraceConfigString, tc.ToString().c_str());
-  EXPECT_EQ(RECORD_UNTIL_FULL, tc.GetTraceRecordMode());
-  EXPECT_FALSE(tc.IsSystraceEnabled());
-  EXPECT_FALSE(tc.IsArgumentFilterEnabled());
-  EXPECT_STREQ("", tc.ToCategoryFilterString().c_str());
-  CheckDefaultTraceConfigBehavior(tc);
-
-  // If the config string a dictionary formatted as a JSON string, it will
-  // initialize TraceConfig with best effort.
-  tc = TraceConfig("{}");
-  EXPECT_EQ(RECORD_UNTIL_FULL, tc.GetTraceRecordMode());
-  EXPECT_FALSE(tc.IsSystraceEnabled());
-  EXPECT_FALSE(tc.IsArgumentFilterEnabled());
-  EXPECT_STREQ("", tc.ToCategoryFilterString().c_str());
-  CheckDefaultTraceConfigBehavior(tc);
-
-  tc = TraceConfig("{\"arbitrary-key\":\"arbitrary-value\"}");
-  EXPECT_EQ(RECORD_UNTIL_FULL, tc.GetTraceRecordMode());
-  EXPECT_FALSE(tc.IsSystraceEnabled());
-  EXPECT_FALSE(tc.IsArgumentFilterEnabled());
-  EXPECT_STREQ("", tc.ToCategoryFilterString().c_str());
-  CheckDefaultTraceConfigBehavior(tc);
-
-  const char invalid_config_string[] =
-      "{"
-      "\"enable_systrace\":1,"
-      "\"excluded_categories\":[\"excluded\"],"
-      "\"included_categories\":\"not a list\","
-      "\"record_mode\":\"arbitrary-mode\""
-      "}";
-  tc = TraceConfig(invalid_config_string);
-  EXPECT_EQ(RECORD_UNTIL_FULL, tc.GetTraceRecordMode());
-  EXPECT_FALSE(tc.IsSystraceEnabled());
-  EXPECT_FALSE(tc.IsArgumentFilterEnabled());
-
-  const char invalid_config_string_2[] =
-    "{"
-      "\"included_categories\":[\"category\",\"disabled-by-default-pattern\"],"
-      "\"excluded_categories\":[\"category\",\"disabled-by-default-pattern\"]"
-    "}";
-  tc = TraceConfig(invalid_config_string_2);
-  EXPECT_TRUE(tc.category_filter().IsCategoryEnabled("category"));
-  EXPECT_TRUE(
-      tc.category_filter().IsCategoryEnabled("disabled-by-default-pattern"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("category"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("disabled-by-default-pattern"));
-}
-
-TEST(TraceConfigTest, MergingTraceConfigs) {
-  // Merge
-  TraceConfig tc;
-  TraceConfig tc2("included,-excluded,inc_pattern*,-exc_pattern*", "");
-  tc.Merge(tc2);
-  EXPECT_STREQ("{"
-                 "\"enable_argument_filter\":false,"
-                 "\"enable_systrace\":false,"
-                 "\"excluded_categories\":[\"excluded\",\"exc_pattern*\"],"
-                 "\"record_mode\":\"record-until-full\""
-               "}",
-               tc.ToString().c_str());
-}
-
-TEST(TraceConfigTest, IsCategoryGroupEnabled) {
-  // Enabling a disabled- category does not require all categories to be traced
-  // to be included.
-  TraceConfig tc("disabled-by-default-cc,-excluded", "");
-  EXPECT_STREQ("disabled-by-default-cc,-excluded",
-               tc.ToCategoryFilterString().c_str());
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("disabled-by-default-cc"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("some_other_group"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("excluded"));
-
-  // Enabled a disabled- category and also including makes all categories to
-  // be traced require including.
-  tc = TraceConfig("disabled-by-default-cc,included", "");
-  EXPECT_STREQ("included,disabled-by-default-cc",
-               tc.ToCategoryFilterString().c_str());
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("disabled-by-default-cc"));
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled("included"));
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("other_included"));
-
-  // Excluding categories won't enable disabled-by-default ones with the
-  // excluded category is also present in the group.
-  tc = TraceConfig("-excluded", "");
-  EXPECT_STREQ("-excluded", tc.ToCategoryFilterString().c_str());
-  EXPECT_FALSE(tc.IsCategoryGroupEnabled("excluded,disabled-by-default-cc"));
-}
-
-TEST(TraceConfigTest, IsCategoryNameAllowed) {
-  // Test that IsCategoryNameAllowed actually catches categories that are
-  // explicitly forbidden. This method is called in a DCHECK to assert that we
-  // don't have these types of strings as categories.
-  EXPECT_FALSE(
-      TraceConfigCategoryFilter::IsCategoryNameAllowed(" bad_category "));
-  EXPECT_FALSE(
-      TraceConfigCategoryFilter::IsCategoryNameAllowed(" bad_category"));
-  EXPECT_FALSE(
-      TraceConfigCategoryFilter::IsCategoryNameAllowed("bad_category "));
-  EXPECT_FALSE(
-      TraceConfigCategoryFilter::IsCategoryNameAllowed("   bad_category"));
-  EXPECT_FALSE(
-      TraceConfigCategoryFilter::IsCategoryNameAllowed("bad_category   "));
-  EXPECT_FALSE(
-      TraceConfigCategoryFilter::IsCategoryNameAllowed("   bad_category   "));
-  EXPECT_FALSE(TraceConfigCategoryFilter::IsCategoryNameAllowed(""));
-  EXPECT_TRUE(
-      TraceConfigCategoryFilter::IsCategoryNameAllowed("good_category"));
-}
-
-TEST(TraceConfigTest, SetTraceOptionValues) {
-  TraceConfig tc;
-  EXPECT_EQ(RECORD_UNTIL_FULL, tc.GetTraceRecordMode());
-  EXPECT_FALSE(tc.IsSystraceEnabled());
-
-  tc.SetTraceRecordMode(RECORD_AS_MUCH_AS_POSSIBLE);
-  EXPECT_EQ(RECORD_AS_MUCH_AS_POSSIBLE, tc.GetTraceRecordMode());
-
-  tc.EnableSystrace();
-  EXPECT_TRUE(tc.IsSystraceEnabled());
-}
-
-TEST(TraceConfigTest, TraceConfigFromMemoryConfigString) {
-  std::string tc_str1 =
-      TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers(200, 2000);
-  TraceConfig tc1(tc_str1);
-  EXPECT_EQ(tc_str1, tc1.ToString());
-  TraceConfig tc2(
-      TraceConfigMemoryTestUtil::GetTraceConfig_LegacyPeriodicTriggers(200,
-                                                                       2000));
-  EXPECT_EQ(tc_str1, tc2.ToString());
-
-  EXPECT_TRUE(tc1.IsCategoryGroupEnabled(MemoryDumpManager::kTraceCategory));
-  ASSERT_EQ(2u, tc1.memory_dump_config().triggers.size());
-
-  EXPECT_EQ(200u,
-            tc1.memory_dump_config().triggers[0].min_time_between_dumps_ms);
-  EXPECT_EQ(MemoryDumpLevelOfDetail::LIGHT,
-            tc1.memory_dump_config().triggers[0].level_of_detail);
-
-  EXPECT_EQ(2000u,
-            tc1.memory_dump_config().triggers[1].min_time_between_dumps_ms);
-  EXPECT_EQ(MemoryDumpLevelOfDetail::DETAILED,
-            tc1.memory_dump_config().triggers[1].level_of_detail);
-  EXPECT_EQ(
-      2048u,
-      tc1.memory_dump_config().heap_profiler_options.breakdown_threshold_bytes);
-
-  std::string tc_str3 =
-      TraceConfigMemoryTestUtil::GetTraceConfig_BackgroundTrigger(
-          1 /* period_ms */);
-  TraceConfig tc3(tc_str3);
-  EXPECT_EQ(tc_str3, tc3.ToString());
-  EXPECT_TRUE(tc3.IsCategoryGroupEnabled(MemoryDumpManager::kTraceCategory));
-  ASSERT_EQ(1u, tc3.memory_dump_config().triggers.size());
-  EXPECT_EQ(1u, tc3.memory_dump_config().triggers[0].min_time_between_dumps_ms);
-  EXPECT_EQ(MemoryDumpLevelOfDetail::BACKGROUND,
-            tc3.memory_dump_config().triggers[0].level_of_detail);
-
-  std::string tc_str4 =
-      TraceConfigMemoryTestUtil::GetTraceConfig_PeakDetectionTrigger(
-          1 /*heavy_period */);
-  TraceConfig tc4(tc_str4);
-  EXPECT_EQ(tc_str4, tc4.ToString());
-  ASSERT_EQ(1u, tc4.memory_dump_config().triggers.size());
-  EXPECT_EQ(1u, tc4.memory_dump_config().triggers[0].min_time_between_dumps_ms);
-  EXPECT_EQ(MemoryDumpLevelOfDetail::DETAILED,
-            tc4.memory_dump_config().triggers[0].level_of_detail);
-}
-
-TEST(TraceConfigTest, EmptyMemoryDumpConfigTest) {
-  // Empty trigger list should also be specified when converting back to string.
-  TraceConfig tc(TraceConfigMemoryTestUtil::GetTraceConfig_EmptyTriggers());
-  EXPECT_EQ(TraceConfigMemoryTestUtil::GetTraceConfig_EmptyTriggers(),
-            tc.ToString());
-  EXPECT_EQ(0u, tc.memory_dump_config().triggers.size());
-  EXPECT_EQ(
-      static_cast<uint32_t>(TraceConfig::MemoryDumpConfig::HeapProfiler::
-                                kDefaultBreakdownThresholdBytes),
-      tc.memory_dump_config().heap_profiler_options.breakdown_threshold_bytes);
-}
-
-TEST(TraceConfigTest, LegacyStringToMemoryDumpConfig) {
-  TraceConfig tc(MemoryDumpManager::kTraceCategory, "");
-  EXPECT_TRUE(tc.IsCategoryGroupEnabled(MemoryDumpManager::kTraceCategory));
-  EXPECT_NE(std::string::npos, tc.ToString().find("memory_dump_config"));
-  EXPECT_EQ(0u, tc.memory_dump_config().triggers.size());
-  EXPECT_EQ(
-      static_cast<uint32_t>(TraceConfig::MemoryDumpConfig::HeapProfiler::
-                                kDefaultBreakdownThresholdBytes),
-      tc.memory_dump_config().heap_profiler_options.breakdown_threshold_bytes);
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/trace_event_android_unittest.cc b/base/trace_event/trace_event_android_unittest.cc
deleted file mode 100644
index 58bd77e..0000000
--- a/base/trace_event/trace_event_android_unittest.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/trace_event.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-
-TEST(TraceEventAndroidTest, WriteToATrace) {
-  // Just a smoke test to ensure no crash.
-  TraceLog* trace_log = TraceLog::GetInstance();
-  trace_log->StartATrace();
-  TRACE_EVENT0("test", "test-event");
-  trace_log->StopATrace();
-  trace_log->AddClockSyncMetadataEvent();
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/trace_event_argument_unittest.cc b/base/trace_event/trace_event_argument_unittest.cc
deleted file mode 100644
index 448b2d5..0000000
--- a/base/trace_event/trace_event_argument_unittest.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (c) 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/trace_event_argument.h"
-
-#include <stddef.h>
-
-#include <utility>
-
-#include "base/memory/ptr_util.h"
-#include "base/values.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-
-TEST(TraceEventArgumentTest, FlatDictionary) {
-  std::unique_ptr<TracedValue> value(new TracedValue());
-  value->SetBoolean("bool", true);
-  value->SetDouble("double", 0.0);
-  value->SetInteger("int", 2014);
-  value->SetString("string", "string");
-  std::string json = "PREFIX";
-  value->AppendAsTraceFormat(&json);
-  EXPECT_EQ(
-      "PREFIX{\"bool\":true,\"double\":0.0,\"int\":2014,\"string\":\"string\"}",
-      json);
-}
-
-TEST(TraceEventArgumentTest, NoDotPathExpansion) {
-  std::unique_ptr<TracedValue> value(new TracedValue());
-  value->SetBoolean("bo.ol", true);
-  value->SetDouble("doub.le", 0.0);
-  value->SetInteger("in.t", 2014);
-  value->SetString("str.ing", "str.ing");
-  std::string json;
-  value->AppendAsTraceFormat(&json);
-  EXPECT_EQ(
-      "{\"bo.ol\":true,\"doub.le\":0.0,\"in.t\":2014,\"str.ing\":\"str.ing\"}",
-      json);
-}
-
-TEST(TraceEventArgumentTest, Hierarchy) {
-  std::unique_ptr<TracedValue> value(new TracedValue());
-  value->BeginArray("a1");
-  value->AppendInteger(1);
-  value->AppendBoolean(true);
-  value->BeginDictionary();
-  value->SetInteger("i2", 3);
-  value->EndDictionary();
-  value->EndArray();
-  value->SetBoolean("b0", true);
-  value->SetDouble("d0", 0.0);
-  value->BeginDictionary("dict1");
-  value->BeginDictionary("dict2");
-  value->SetBoolean("b2", false);
-  value->EndDictionary();
-  value->SetInteger("i1", 2014);
-  value->SetString("s1", "foo");
-  value->EndDictionary();
-  value->SetInteger("i0", 2014);
-  value->SetString("s0", "foo");
-  std::string json;
-  value->AppendAsTraceFormat(&json);
-  EXPECT_EQ(
-      "{\"a1\":[1,true,{\"i2\":3}],\"b0\":true,\"d0\":0.0,\"dict1\":{\"dict2\":"
-      "{\"b2\":false},\"i1\":2014,\"s1\":\"foo\"},\"i0\":2014,\"s0\":"
-      "\"foo\"}",
-      json);
-}
-
-TEST(TraceEventArgumentTest, LongStrings) {
-  std::string kLongString = "supercalifragilisticexpialidocious";
-  std::string kLongString2 = "0123456789012345678901234567890123456789";
-  char kLongString3[4096];
-  for (size_t i = 0; i < sizeof(kLongString3); ++i)
-    kLongString3[i] = 'a' + (i % 25);
-  kLongString3[sizeof(kLongString3) - 1] = '\0';
-
-  std::unique_ptr<TracedValue> value(new TracedValue());
-  value->SetString("a", "short");
-  value->SetString("b", kLongString);
-  value->BeginArray("c");
-  value->AppendString(kLongString2);
-  value->AppendString("");
-  value->BeginDictionary();
-  value->SetString("a", kLongString3);
-  value->EndDictionary();
-  value->EndArray();
-
-  std::string json;
-  value->AppendAsTraceFormat(&json);
-  EXPECT_EQ("{\"a\":\"short\",\"b\":\"" + kLongString + "\",\"c\":[\"" +
-                kLongString2 + "\",\"\",{\"a\":\"" + kLongString3 + "\"}]}",
-            json);
-}
-
-TEST(TraceEventArgumentTest, PassBaseValue) {
-  Value int_value(42);
-  Value bool_value(true);
-  Value double_value(42.0f);
-
-  auto dict_value = WrapUnique(new DictionaryValue);
-  dict_value->SetBoolean("bool", true);
-  dict_value->SetInteger("int", 42);
-  dict_value->SetDouble("double", 42.0f);
-  dict_value->SetString("string", std::string("a") + "b");
-  dict_value->SetString("string", std::string("a") + "b");
-
-  auto list_value = WrapUnique(new ListValue);
-  list_value->AppendBoolean(false);
-  list_value->AppendInteger(1);
-  list_value->AppendString("in_list");
-  list_value->Append(std::move(dict_value));
-
-  std::unique_ptr<TracedValue> value(new TracedValue());
-  value->BeginDictionary("outer_dict");
-  value->SetValue("inner_list", std::move(list_value));
-  value->EndDictionary();
-
-  dict_value.reset();
-  list_value.reset();
-
-  std::string json;
-  value->AppendAsTraceFormat(&json);
-  EXPECT_EQ(
-      "{\"outer_dict\":{\"inner_list\":[false,1,\"in_list\",{\"bool\":true,"
-      "\"double\":42.0,\"int\":42,\"string\":\"ab\"}]}}",
-      json);
-}
-
-TEST(TraceEventArgumentTest, PassTracedValue) {
-  auto dict_value = std::make_unique<TracedValue>();
-  dict_value->SetInteger("a", 1);
-
-  auto nested_dict_value = std::make_unique<TracedValue>();
-  nested_dict_value->SetInteger("b", 2);
-  nested_dict_value->BeginArray("c");
-  nested_dict_value->AppendString("foo");
-  nested_dict_value->EndArray();
-
-  dict_value->SetValue("e", *nested_dict_value);
-
-  // Check the merged result.
-  std::string json;
-  dict_value->AppendAsTraceFormat(&json);
-  EXPECT_EQ("{\"a\":1,\"e\":{\"b\":2,\"c\":[\"foo\"]}}", json);
-
-  // Check that the passed nestd dict was left unouthced.
-  json = "";
-  nested_dict_value->AppendAsTraceFormat(&json);
-  EXPECT_EQ("{\"b\":2,\"c\":[\"foo\"]}", json);
-
-  // And that it is still usable.
-  nested_dict_value->SetInteger("f", 3);
-  nested_dict_value->BeginDictionary("g");
-  nested_dict_value->EndDictionary();
-  json = "";
-  nested_dict_value->AppendAsTraceFormat(&json);
-  EXPECT_EQ("{\"b\":2,\"c\":[\"foo\"],\"f\":3,\"g\":{}}", json);
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/trace_event_system_stats_monitor_unittest.cc b/base/trace_event/trace_event_system_stats_monitor_unittest.cc
deleted file mode 100644
index 978746d..0000000
--- a/base/trace_event/trace_event_system_stats_monitor_unittest.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/trace_event_system_stats_monitor.h"
-
-#include <sstream>
-#include <string>
-
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/trace_event/trace_event_impl.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-
-#if !defined(OS_IOS)
-// Tests for the system stats monitor.
-// Exists as a class so it can be a friend of TraceEventSystemStatsMonitor.
-class TraceSystemStatsMonitorTest : public testing::Test {
- public:
-  TraceSystemStatsMonitorTest() = default;
-  ~TraceSystemStatsMonitorTest() override = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TraceSystemStatsMonitorTest);
-};
-
-//////////////////////////////////////////////////////////////////////////////
-
-TEST_F(TraceSystemStatsMonitorTest, TraceEventSystemStatsMonitor) {
-  MessageLoop message_loop;
-
-  // Start with no observers of the TraceLog.
-  EXPECT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest());
-
-  // Creating a system stats monitor adds it to the TraceLog observer list.
-  std::unique_ptr<TraceEventSystemStatsMonitor> system_stats_monitor(
-      new TraceEventSystemStatsMonitor(message_loop.task_runner()));
-  EXPECT_EQ(1u, TraceLog::GetInstance()->GetObserverCountForTest());
-  EXPECT_TRUE(
-      TraceLog::GetInstance()->HasEnabledStateObserver(
-          system_stats_monitor.get()));
-
-  // By default the observer isn't dumping memory profiles.
-  EXPECT_FALSE(system_stats_monitor->IsTimerRunningForTest());
-
-  // Simulate enabling tracing.
-  system_stats_monitor->StartProfiling();
-  RunLoop().RunUntilIdle();
-  EXPECT_TRUE(system_stats_monitor->IsTimerRunningForTest());
-
-  // Simulate disabling tracing.
-  system_stats_monitor->StopProfiling();
-  RunLoop().RunUntilIdle();
-  EXPECT_FALSE(system_stats_monitor->IsTimerRunningForTest());
-
-  // Deleting the observer removes it from the TraceLog observer list.
-  system_stats_monitor.reset();
-  EXPECT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest());
-}
-#endif  // !defined(OS_IOS)
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/trace_event/trace_event_unittest.cc b/base/trace_event/trace_event_unittest.cc
deleted file mode 100644
index a413ee5..0000000
--- a/base/trace_event/trace_event_unittest.cc
+++ /dev/null
@@ -1,3169 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/trace_event/trace_event.h"
-
-#include <math.h>
-#include <stddef.h>
-#include <stdint.h>
-
-#include <cstdlib>
-#include <memory>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/json/json_reader.h"
-#include "base/json/json_writer.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted_memory.h"
-#include "base/memory/singleton.h"
-#include "base/process/process_handle.h"
-#include "base/single_thread_task_runner.h"
-#include "base/stl_util.h"
-#include "base/strings/pattern.h"
-#include "base/strings/stringprintf.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread.h"
-#include "base/time/time.h"
-#include "base/trace_event/event_name_filter.h"
-#include "base/trace_event/heap_profiler_event_filter.h"
-#include "base/trace_event/trace_buffer.h"
-#include "base/trace_event/trace_event.h"
-#include "base/trace_event/trace_event_filter.h"
-#include "base/trace_event/trace_event_filter_test_utils.h"
-#include "base/values.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace trace_event {
-
-namespace {
-
-enum CompareOp {
-  IS_EQUAL,
-  IS_NOT_EQUAL,
-};
-
-struct JsonKeyValue {
-  const char* key;
-  const char* value;
-  CompareOp op;
-};
-
-const int kThreadId = 42;
-const int kAsyncId = 5;
-const char kAsyncIdStr[] = "0x5";
-const int kAsyncId2 = 6;
-const char kAsyncId2Str[] = "0x6";
-const int kFlowId = 7;
-const char kFlowIdStr[] = "0x7";
-
-const  char kRecordAllCategoryFilter[] = "*";
-
-class TraceEventTestFixture : public testing::Test {
- public:
-  void OnTraceDataCollected(
-      WaitableEvent* flush_complete_event,
-      const scoped_refptr<base::RefCountedString>& events_str,
-      bool has_more_events);
-  DictionaryValue* FindMatchingTraceEntry(const JsonKeyValue* key_values);
-  DictionaryValue* FindNamePhase(const char* name, const char* phase);
-  DictionaryValue* FindNamePhaseKeyValue(const char* name,
-                                         const char* phase,
-                                         const char* key,
-                                         const char* value);
-  void DropTracedMetadataRecords();
-  bool FindMatchingValue(const char* key,
-                         const char* value);
-  bool FindNonMatchingValue(const char* key,
-                            const char* value);
-  void Clear() {
-    trace_parsed_.Clear();
-    json_output_.json_output.clear();
-  }
-
-  void BeginTrace() {
-    BeginSpecificTrace("*");
-  }
-
-  void BeginSpecificTrace(const std::string& filter) {
-    TraceLog::GetInstance()->SetEnabled(TraceConfig(filter, ""),
-                                        TraceLog::RECORDING_MODE);
-  }
-
-  void CancelTrace() {
-    WaitableEvent flush_complete_event(
-        WaitableEvent::ResetPolicy::AUTOMATIC,
-        WaitableEvent::InitialState::NOT_SIGNALED);
-    CancelTraceAsync(&flush_complete_event);
-    flush_complete_event.Wait();
-  }
-
-  void EndTraceAndFlush() {
-    num_flush_callbacks_ = 0;
-    WaitableEvent flush_complete_event(
-        WaitableEvent::ResetPolicy::AUTOMATIC,
-        WaitableEvent::InitialState::NOT_SIGNALED);
-    EndTraceAndFlushAsync(&flush_complete_event);
-    flush_complete_event.Wait();
-  }
-
-  // Used when testing thread-local buffers which requires the thread initiating
-  // flush to have a message loop.
-  void EndTraceAndFlushInThreadWithMessageLoop() {
-    WaitableEvent flush_complete_event(
-        WaitableEvent::ResetPolicy::AUTOMATIC,
-        WaitableEvent::InitialState::NOT_SIGNALED);
-    Thread flush_thread("flush");
-    flush_thread.Start();
-    flush_thread.task_runner()->PostTask(
-        FROM_HERE,
-        base::BindOnce(&TraceEventTestFixture::EndTraceAndFlushAsync,
-                       base::Unretained(this), &flush_complete_event));
-    flush_complete_event.Wait();
-  }
-
-  void CancelTraceAsync(WaitableEvent* flush_complete_event) {
-    TraceLog::GetInstance()->CancelTracing(
-        base::Bind(&TraceEventTestFixture::OnTraceDataCollected,
-                   base::Unretained(static_cast<TraceEventTestFixture*>(this)),
-                   base::Unretained(flush_complete_event)));
-  }
-
-  void EndTraceAndFlushAsync(WaitableEvent* flush_complete_event) {
-    TraceLog::GetInstance()->SetDisabled(TraceLog::RECORDING_MODE |
-                                         TraceLog::FILTERING_MODE);
-    TraceLog::GetInstance()->Flush(
-        base::Bind(&TraceEventTestFixture::OnTraceDataCollected,
-                   base::Unretained(static_cast<TraceEventTestFixture*>(this)),
-                   base::Unretained(flush_complete_event)));
-  }
-
-  void SetUp() override {
-    const char* name = PlatformThread::GetName();
-    old_thread_name_ = name ? strdup(name) : nullptr;
-
-    TraceLog::ResetForTesting();
-    TraceLog* tracelog = TraceLog::GetInstance();
-    ASSERT_TRUE(tracelog);
-    ASSERT_FALSE(tracelog->IsEnabled());
-    trace_buffer_.SetOutputCallback(json_output_.GetCallback());
-    num_flush_callbacks_ = 0;
-  }
-  void TearDown() override {
-    if (TraceLog::GetInstance())
-      EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled());
-    PlatformThread::SetName(old_thread_name_ ? old_thread_name_ : "");
-    free(old_thread_name_);
-    old_thread_name_ = nullptr;
-    // We want our singleton torn down after each test.
-    TraceLog::ResetForTesting();
-  }
-
-  char* old_thread_name_;
-  ListValue trace_parsed_;
-  TraceResultBuffer trace_buffer_;
-  TraceResultBuffer::SimpleOutput json_output_;
-  size_t num_flush_callbacks_;
-
- private:
-  // We want our singleton torn down after each test.
-  ShadowingAtExitManager at_exit_manager_;
-  Lock lock_;
-};
-
-void TraceEventTestFixture::OnTraceDataCollected(
-    WaitableEvent* flush_complete_event,
-    const scoped_refptr<base::RefCountedString>& events_str,
-    bool has_more_events) {
-  num_flush_callbacks_++;
-  if (num_flush_callbacks_ > 1) {
-    EXPECT_FALSE(events_str->data().empty());
-  }
-  AutoLock lock(lock_);
-  json_output_.json_output.clear();
-  trace_buffer_.Start();
-  trace_buffer_.AddFragment(events_str->data());
-  trace_buffer_.Finish();
-
-  std::unique_ptr<Value> root =
-      base::JSONReader::Read(json_output_.json_output, JSON_PARSE_RFC);
-
-  if (!root.get()) {
-    LOG(ERROR) << json_output_.json_output;
-  }
-
-  ListValue* root_list = nullptr;
-  ASSERT_TRUE(root.get());
-  ASSERT_TRUE(root->GetAsList(&root_list));
-
-  // Move items into our aggregate collection
-  while (root_list->GetSize()) {
-    std::unique_ptr<Value> item;
-    root_list->Remove(0, &item);
-    trace_parsed_.Append(std::move(item));
-  }
-
-  if (!has_more_events)
-    flush_complete_event->Signal();
-}
-
-static bool CompareJsonValues(const std::string& lhs,
-                              const std::string& rhs,
-                              CompareOp op) {
-  switch (op) {
-    case IS_EQUAL:
-      return lhs == rhs;
-    case IS_NOT_EQUAL:
-      return lhs != rhs;
-    default:
-      CHECK(0);
-  }
-  return false;
-}
-
-static bool IsKeyValueInDict(const JsonKeyValue* key_value,
-                             DictionaryValue* dict) {
-  Value* value = nullptr;
-  std::string value_str;
-  if (dict->Get(key_value->key, &value) &&
-      value->GetAsString(&value_str) &&
-      CompareJsonValues(value_str, key_value->value, key_value->op))
-    return true;
-
-  // Recurse to test arguments
-  DictionaryValue* args_dict = nullptr;
-  dict->GetDictionary("args", &args_dict);
-  if (args_dict)
-    return IsKeyValueInDict(key_value, args_dict);
-
-  return false;
-}
-
-static bool IsAllKeyValueInDict(const JsonKeyValue* key_values,
-                                DictionaryValue* dict) {
-  // Scan all key_values, they must all be present and equal.
-  while (key_values && key_values->key) {
-    if (!IsKeyValueInDict(key_values, dict))
-      return false;
-    ++key_values;
-  }
-  return true;
-}
-
-DictionaryValue* TraceEventTestFixture::FindMatchingTraceEntry(
-    const JsonKeyValue* key_values) {
-  // Scan all items
-  size_t trace_parsed_count = trace_parsed_.GetSize();
-  for (size_t i = 0; i < trace_parsed_count; i++) {
-    Value* value = nullptr;
-    trace_parsed_.Get(i, &value);
-    if (!value || value->type() != Value::Type::DICTIONARY)
-      continue;
-    DictionaryValue* dict = static_cast<DictionaryValue*>(value);
-
-    if (IsAllKeyValueInDict(key_values, dict))
-      return dict;
-  }
-  return nullptr;
-}
-
-void TraceEventTestFixture::DropTracedMetadataRecords() {
-  std::unique_ptr<ListValue> old_trace_parsed(trace_parsed_.CreateDeepCopy());
-  size_t old_trace_parsed_size = old_trace_parsed->GetSize();
-  trace_parsed_.Clear();
-
-  for (size_t i = 0; i < old_trace_parsed_size; i++) {
-    Value* value = nullptr;
-    old_trace_parsed->Get(i, &value);
-    if (!value || value->type() != Value::Type::DICTIONARY) {
-      trace_parsed_.Append(value->CreateDeepCopy());
-      continue;
-    }
-    DictionaryValue* dict = static_cast<DictionaryValue*>(value);
-    std::string tmp;
-    if (dict->GetString("ph", &tmp) && tmp == "M")
-      continue;
-
-    trace_parsed_.Append(value->CreateDeepCopy());
-  }
-}
-
-DictionaryValue* TraceEventTestFixture::FindNamePhase(const char* name,
-                                                      const char* phase) {
-  JsonKeyValue key_values[] = {{"name", name, IS_EQUAL},
-                               {"ph", phase, IS_EQUAL},
-                               {nullptr, nullptr, IS_EQUAL}};
-  return FindMatchingTraceEntry(key_values);
-}
-
-DictionaryValue* TraceEventTestFixture::FindNamePhaseKeyValue(
-    const char* name,
-    const char* phase,
-    const char* key,
-    const char* value) {
-  JsonKeyValue key_values[] = {{"name", name, IS_EQUAL},
-                               {"ph", phase, IS_EQUAL},
-                               {key, value, IS_EQUAL},
-                               {nullptr, nullptr, IS_EQUAL}};
-  return FindMatchingTraceEntry(key_values);
-}
-
-bool TraceEventTestFixture::FindMatchingValue(const char* key,
-                                              const char* value) {
-  JsonKeyValue key_values[] = {{key, value, IS_EQUAL},
-                               {nullptr, nullptr, IS_EQUAL}};
-  return FindMatchingTraceEntry(key_values);
-}
-
-bool TraceEventTestFixture::FindNonMatchingValue(const char* key,
-                                                 const char* value) {
-  JsonKeyValue key_values[] = {{key, value, IS_NOT_EQUAL},
-                               {nullptr, nullptr, IS_EQUAL}};
-  return FindMatchingTraceEntry(key_values);
-}
-
-bool IsStringInDict(const char* string_to_match, const DictionaryValue* dict) {
-  for (DictionaryValue::Iterator it(*dict); !it.IsAtEnd(); it.Advance()) {
-    if (it.key().find(string_to_match) != std::string::npos)
-      return true;
-
-    std::string value_str;
-    it.value().GetAsString(&value_str);
-    if (value_str.find(string_to_match) != std::string::npos)
-      return true;
-  }
-
-  // Recurse to test arguments
-  const DictionaryValue* args_dict = nullptr;
-  dict->GetDictionary("args", &args_dict);
-  if (args_dict)
-    return IsStringInDict(string_to_match, args_dict);
-
-  return false;
-}
-
-const DictionaryValue* FindTraceEntry(
-    const ListValue& trace_parsed,
-    const char* string_to_match,
-    const DictionaryValue* match_after_this_item = nullptr) {
-  // Scan all items
-  size_t trace_parsed_count = trace_parsed.GetSize();
-  for (size_t i = 0; i < trace_parsed_count; i++) {
-    const Value* value = nullptr;
-    trace_parsed.Get(i, &value);
-    if (match_after_this_item) {
-      if (value == match_after_this_item)
-        match_after_this_item = nullptr;
-      continue;
-    }
-    if (!value || value->type() != Value::Type::DICTIONARY)
-      continue;
-    const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
-
-    if (IsStringInDict(string_to_match, dict))
-      return dict;
-  }
-  return nullptr;
-}
-
-std::vector<const DictionaryValue*> FindTraceEntries(
-    const ListValue& trace_parsed,
-    const char* string_to_match) {
-  std::vector<const DictionaryValue*> hits;
-  size_t trace_parsed_count = trace_parsed.GetSize();
-  for (size_t i = 0; i < trace_parsed_count; i++) {
-    const Value* value = nullptr;
-    trace_parsed.Get(i, &value);
-    if (!value || value->type() != Value::Type::DICTIONARY)
-      continue;
-    const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
-
-    if (IsStringInDict(string_to_match, dict))
-      hits.push_back(dict);
-  }
-  return hits;
-}
-
-const char kControlCharacters[] = "\001\002\003\n\r";
-
-void TraceWithAllMacroVariants(WaitableEvent* task_complete_event) {
-  {
-    TRACE_EVENT0("all", "TRACE_EVENT0 call");
-    TRACE_EVENT1("all", "TRACE_EVENT1 call", "name1", "value1");
-    TRACE_EVENT2("all", "TRACE_EVENT2 call",
-                 "name1", "\"value1\"",
-                 "name2", "value\\2");
-
-    TRACE_EVENT_INSTANT0("all", "TRACE_EVENT_INSTANT0 call",
-                         TRACE_EVENT_SCOPE_GLOBAL);
-    TRACE_EVENT_INSTANT1("all", "TRACE_EVENT_INSTANT1 call",
-                         TRACE_EVENT_SCOPE_PROCESS, "name1", "value1");
-    TRACE_EVENT_INSTANT2("all", "TRACE_EVENT_INSTANT2 call",
-                         TRACE_EVENT_SCOPE_THREAD,
-                         "name1", "value1",
-                         "name2", "value2");
-
-    TRACE_EVENT_BEGIN0("all", "TRACE_EVENT_BEGIN0 call");
-    TRACE_EVENT_BEGIN1("all", "TRACE_EVENT_BEGIN1 call", "name1", "value1");
-    TRACE_EVENT_BEGIN2("all", "TRACE_EVENT_BEGIN2 call",
-                       "name1", "value1",
-                       "name2", "value2");
-
-    TRACE_EVENT_END0("all", "TRACE_EVENT_END0 call");
-    TRACE_EVENT_END1("all", "TRACE_EVENT_END1 call", "name1", "value1");
-    TRACE_EVENT_END2("all", "TRACE_EVENT_END2 call",
-                     "name1", "value1",
-                     "name2", "value2");
-
-    TRACE_EVENT_ASYNC_BEGIN0("all", "TRACE_EVENT_ASYNC_BEGIN0 call", kAsyncId);
-    TRACE_EVENT_ASYNC_BEGIN1("all", "TRACE_EVENT_ASYNC_BEGIN1 call", kAsyncId,
-                             "name1", "value1");
-    TRACE_EVENT_ASYNC_BEGIN2("all", "TRACE_EVENT_ASYNC_BEGIN2 call", kAsyncId,
-                             "name1", "value1",
-                             "name2", "value2");
-
-    TRACE_EVENT_ASYNC_STEP_INTO0("all", "TRACE_EVENT_ASYNC_STEP_INTO0 call",
-                                 kAsyncId, "step_begin1");
-    TRACE_EVENT_ASYNC_STEP_INTO1("all", "TRACE_EVENT_ASYNC_STEP_INTO1 call",
-                                 kAsyncId, "step_begin2", "name1", "value1");
-
-    TRACE_EVENT_ASYNC_END0("all", "TRACE_EVENT_ASYNC_END0 call", kAsyncId);
-    TRACE_EVENT_ASYNC_END1("all", "TRACE_EVENT_ASYNC_END1 call", kAsyncId,
-                           "name1", "value1");
-    TRACE_EVENT_ASYNC_END2("all", "TRACE_EVENT_ASYNC_END2 call", kAsyncId,
-                           "name1", "value1",
-                           "name2", "value2");
-
-    TRACE_EVENT_FLOW_BEGIN0("all", "TRACE_EVENT_FLOW_BEGIN0 call", kFlowId);
-    TRACE_EVENT_FLOW_STEP0("all", "TRACE_EVENT_FLOW_STEP0 call",
-                           kFlowId, "step1");
-    TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0("all",
-        "TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0 call", kFlowId);
-
-    TRACE_COUNTER1("all", "TRACE_COUNTER1 call", 31415);
-    TRACE_COUNTER2("all", "TRACE_COUNTER2 call",
-                   "a", 30000,
-                   "b", 1415);
-
-    TRACE_COUNTER_WITH_TIMESTAMP1("all", "TRACE_COUNTER_WITH_TIMESTAMP1 call",
-                                  TimeTicks::FromInternalValue(42), 31415);
-    TRACE_COUNTER_WITH_TIMESTAMP2("all", "TRACE_COUNTER_WITH_TIMESTAMP2 call",
-                                  TimeTicks::FromInternalValue(42),
-                                  "a", 30000, "b", 1415);
-
-    TRACE_COUNTER_ID1("all", "TRACE_COUNTER_ID1 call", 0x319009, 31415);
-    TRACE_COUNTER_ID2("all", "TRACE_COUNTER_ID2 call", 0x319009,
-                      "a", 30000, "b", 1415);
-
-    TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("all",
-        "TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call",
-        kAsyncId, kThreadId, TimeTicks::FromInternalValue(12345));
-    TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0("all",
-        "TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0 call",
-        kAsyncId, kThreadId, TimeTicks::FromInternalValue(23456));
-
-    TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("all",
-        "TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call",
-        kAsyncId2, kThreadId, TimeTicks::FromInternalValue(34567));
-    TRACE_EVENT_ASYNC_STEP_PAST0("all", "TRACE_EVENT_ASYNC_STEP_PAST0 call",
-                                 kAsyncId2, "step_end1");
-    TRACE_EVENT_ASYNC_STEP_PAST1("all", "TRACE_EVENT_ASYNC_STEP_PAST1 call",
-                                 kAsyncId2, "step_end2", "name1", "value1");
-
-    TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0("all",
-        "TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0 call",
-        kAsyncId2, kThreadId, TimeTicks::FromInternalValue(45678));
-
-    TRACE_EVENT_OBJECT_CREATED_WITH_ID("all", "tracked object 1", 0x42);
-    TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
-        "all", "tracked object 1", 0x42, "hello");
-    TRACE_EVENT_OBJECT_DELETED_WITH_ID("all", "tracked object 1", 0x42);
-
-    TraceScopedTrackableObject<int> trackable("all", "tracked object 2",
-                                              0x2128506);
-    trackable.snapshot("world");
-
-    TRACE_EVENT_OBJECT_CREATED_WITH_ID(
-        "all", "tracked object 3", TRACE_ID_WITH_SCOPE("scope", 0x42));
-    TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
-        "all", "tracked object 3", TRACE_ID_WITH_SCOPE("scope", 0x42), "hello");
-    TRACE_EVENT_OBJECT_DELETED_WITH_ID(
-        "all", "tracked object 3", TRACE_ID_WITH_SCOPE("scope", 0x42));
-
-    TRACE_EVENT1(kControlCharacters, kControlCharacters,
-                 kControlCharacters, kControlCharacters);
-
-    uint64_t context_id = 0x20151021;
-
-    TRACE_EVENT_ENTER_CONTEXT("all", "TRACE_EVENT_ENTER_CONTEXT call",
-                              TRACE_ID_WITH_SCOPE("scope", context_id));
-    TRACE_EVENT_LEAVE_CONTEXT("all", "TRACE_EVENT_LEAVE_CONTEXT call",
-                              TRACE_ID_WITH_SCOPE("scope", context_id));
-    TRACE_EVENT_SCOPED_CONTEXT("disabled-by-default-cat",
-                               "TRACE_EVENT_SCOPED_CONTEXT disabled call",
-                               context_id);
-    TRACE_EVENT_SCOPED_CONTEXT("all", "TRACE_EVENT_SCOPED_CONTEXT call",
-                               context_id);
-
-    TRACE_LINK_IDS("all", "TRACE_LINK_IDS simple call", 0x1000, 0x2000);
-    TRACE_LINK_IDS("all", "TRACE_LINK_IDS scoped call",
-                   TRACE_ID_WITH_SCOPE("scope 1", 0x1000),
-                   TRACE_ID_WITH_SCOPE("scope 2", 0x2000));
-    TRACE_LINK_IDS("all", "TRACE_LINK_IDS to a local ID", 0x1000,
-                   TRACE_ID_LOCAL(0x2000));
-    TRACE_LINK_IDS("all", "TRACE_LINK_IDS to a global ID", 0x1000,
-                   TRACE_ID_GLOBAL(0x2000));
-    TRACE_LINK_IDS("all", "TRACE_LINK_IDS to a composite ID", 0x1000,
-                   TRACE_ID_WITH_SCOPE("scope 1", 0x2000, 0x3000));
-
-    TRACE_EVENT_ASYNC_BEGIN0("all", "async default process scope", 0x1000);
-    TRACE_EVENT_ASYNC_BEGIN0("all", "async local id", TRACE_ID_LOCAL(0x2000));
-    TRACE_EVENT_ASYNC_BEGIN0("all", "async global id", TRACE_ID_GLOBAL(0x3000));
-    TRACE_EVENT_ASYNC_BEGIN0("all", "async global id with scope string",
-                             TRACE_ID_WITH_SCOPE("scope string",
-                                                 TRACE_ID_GLOBAL(0x4000)));
-  }  // Scope close causes TRACE_EVENT0 etc to send their END events.
-
-  if (task_complete_event)
-    task_complete_event->Signal();
-}
-
-void ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) {
-  const DictionaryValue* item = nullptr;
-
-#define EXPECT_FIND_(string) \
-    item = FindTraceEntry(trace_parsed, string); \
-    EXPECT_TRUE(item);
-#define EXPECT_NOT_FIND_(string) \
-    item = FindTraceEntry(trace_parsed, string); \
-    EXPECT_FALSE(item);
-#define EXPECT_SUB_FIND_(string) \
-    if (item) \
-      EXPECT_TRUE(IsStringInDict(string, item));
-
-  EXPECT_FIND_("TRACE_EVENT0 call");
-  {
-    std::string ph;
-    std::string ph_end;
-    EXPECT_TRUE((item = FindTraceEntry(trace_parsed, "TRACE_EVENT0 call")));
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("X", ph);
-    item = FindTraceEntry(trace_parsed, "TRACE_EVENT0 call", item);
-    EXPECT_FALSE(item);
-  }
-  EXPECT_FIND_("TRACE_EVENT1 call");
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-  EXPECT_FIND_("TRACE_EVENT2 call");
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("\"value1\"");
-  EXPECT_SUB_FIND_("name2");
-  EXPECT_SUB_FIND_("value\\2");
-
-  EXPECT_FIND_("TRACE_EVENT_INSTANT0 call");
-  {
-    std::string scope;
-    EXPECT_TRUE((item && item->GetString("s", &scope)));
-    EXPECT_EQ("g", scope);
-  }
-  EXPECT_FIND_("TRACE_EVENT_INSTANT1 call");
-  {
-    std::string scope;
-    EXPECT_TRUE((item && item->GetString("s", &scope)));
-    EXPECT_EQ("p", scope);
-  }
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-  EXPECT_FIND_("TRACE_EVENT_INSTANT2 call");
-  {
-    std::string scope;
-    EXPECT_TRUE((item && item->GetString("s", &scope)));
-    EXPECT_EQ("t", scope);
-  }
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-  EXPECT_SUB_FIND_("name2");
-  EXPECT_SUB_FIND_("value2");
-
-  EXPECT_FIND_("TRACE_EVENT_BEGIN0 call");
-  EXPECT_FIND_("TRACE_EVENT_BEGIN1 call");
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-  EXPECT_FIND_("TRACE_EVENT_BEGIN2 call");
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-  EXPECT_SUB_FIND_("name2");
-  EXPECT_SUB_FIND_("value2");
-
-  EXPECT_FIND_("TRACE_EVENT_END0 call");
-  EXPECT_FIND_("TRACE_EVENT_END1 call");
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-  EXPECT_FIND_("TRACE_EVENT_END2 call");
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-  EXPECT_SUB_FIND_("name2");
-  EXPECT_SUB_FIND_("value2");
-
-  EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN0 call");
-  EXPECT_SUB_FIND_("id");
-  EXPECT_SUB_FIND_(kAsyncIdStr);
-  EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN1 call");
-  EXPECT_SUB_FIND_("id");
-  EXPECT_SUB_FIND_(kAsyncIdStr);
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-  EXPECT_FIND_("TRACE_EVENT_ASYNC_BEGIN2 call");
-  EXPECT_SUB_FIND_("id");
-  EXPECT_SUB_FIND_(kAsyncIdStr);
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-  EXPECT_SUB_FIND_("name2");
-  EXPECT_SUB_FIND_("value2");
-
-  EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_INTO0 call");
-  EXPECT_SUB_FIND_("id");
-  EXPECT_SUB_FIND_(kAsyncIdStr);
-  EXPECT_SUB_FIND_("step_begin1");
-  EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_INTO1 call");
-  EXPECT_SUB_FIND_("id");
-  EXPECT_SUB_FIND_(kAsyncIdStr);
-  EXPECT_SUB_FIND_("step_begin2");
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-
-  EXPECT_FIND_("TRACE_EVENT_ASYNC_END0 call");
-  EXPECT_SUB_FIND_("id");
-  EXPECT_SUB_FIND_(kAsyncIdStr);
-  EXPECT_FIND_("TRACE_EVENT_ASYNC_END1 call");
-  EXPECT_SUB_FIND_("id");
-  EXPECT_SUB_FIND_(kAsyncIdStr);
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-  EXPECT_FIND_("TRACE_EVENT_ASYNC_END2 call");
-  EXPECT_SUB_FIND_("id");
-  EXPECT_SUB_FIND_(kAsyncIdStr);
-  EXPECT_SUB_FIND_("name1");
-  EXPECT_SUB_FIND_("value1");
-  EXPECT_SUB_FIND_("name2");
-  EXPECT_SUB_FIND_("value2");
-
-  EXPECT_FIND_("TRACE_EVENT_FLOW_BEGIN0 call");
-  EXPECT_SUB_FIND_("id");
-  EXPECT_SUB_FIND_(kFlowIdStr);
-  EXPECT_FIND_("TRACE_EVENT_FLOW_STEP0 call");
-  EXPECT_SUB_FIND_("id");
-  EXPECT_SUB_FIND_(kFlowIdStr);
-  EXPECT_SUB_FIND_("step1");
-  EXPECT_FIND_("TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0 call");
-  EXPECT_SUB_FIND_("id");
-  EXPECT_SUB_FIND_(kFlowIdStr);
-
-  EXPECT_FIND_("TRACE_COUNTER1 call");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("C", ph);
-
-    int value;
-    EXPECT_TRUE((item && item->GetInteger("args.value", &value)));
-    EXPECT_EQ(31415, value);
-  }
-
-  EXPECT_FIND_("TRACE_COUNTER2 call");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("C", ph);
-
-    int value;
-    EXPECT_TRUE((item && item->GetInteger("args.a", &value)));
-    EXPECT_EQ(30000, value);
-
-    EXPECT_TRUE((item && item->GetInteger("args.b", &value)));
-    EXPECT_EQ(1415, value);
-  }
-
-  EXPECT_FIND_("TRACE_COUNTER_WITH_TIMESTAMP1 call");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("C", ph);
-
-    int value;
-    EXPECT_TRUE((item && item->GetInteger("args.value", &value)));
-    EXPECT_EQ(31415, value);
-
-    int ts;
-    EXPECT_TRUE((item && item->GetInteger("ts", &ts)));
-    EXPECT_EQ(42, ts);
-  }
-
-  EXPECT_FIND_("TRACE_COUNTER_WITH_TIMESTAMP2 call");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("C", ph);
-
-    int value;
-    EXPECT_TRUE((item && item->GetInteger("args.a", &value)));
-    EXPECT_EQ(30000, value);
-
-    EXPECT_TRUE((item && item->GetInteger("args.b", &value)));
-    EXPECT_EQ(1415, value);
-
-    int ts;
-    EXPECT_TRUE((item && item->GetInteger("ts", &ts)));
-    EXPECT_EQ(42, ts);
-  }
-
-  EXPECT_FIND_("TRACE_COUNTER_ID1 call");
-  {
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ("0x319009", id);
-
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("C", ph);
-
-    int value;
-    EXPECT_TRUE((item && item->GetInteger("args.value", &value)));
-    EXPECT_EQ(31415, value);
-  }
-
-  EXPECT_FIND_("TRACE_COUNTER_ID2 call");
-  {
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ("0x319009", id);
-
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("C", ph);
-
-    int value;
-    EXPECT_TRUE((item && item->GetInteger("args.a", &value)));
-    EXPECT_EQ(30000, value);
-
-    EXPECT_TRUE((item && item->GetInteger("args.b", &value)));
-    EXPECT_EQ(1415, value);
-  }
-
-  EXPECT_FIND_("TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call");
-  {
-    int val;
-    EXPECT_TRUE((item && item->GetInteger("ts", &val)));
-    EXPECT_EQ(12345, val);
-    EXPECT_TRUE((item && item->GetInteger("tid", &val)));
-    EXPECT_EQ(kThreadId, val);
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ(kAsyncIdStr, id);
-  }
-
-  EXPECT_FIND_("TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0 call");
-  {
-    int val;
-    EXPECT_TRUE((item && item->GetInteger("ts", &val)));
-    EXPECT_EQ(23456, val);
-    EXPECT_TRUE((item && item->GetInteger("tid", &val)));
-    EXPECT_EQ(kThreadId, val);
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ(kAsyncIdStr, id);
-  }
-
-  EXPECT_FIND_("TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call");
-  {
-    int val;
-    EXPECT_TRUE((item && item->GetInteger("ts", &val)));
-    EXPECT_EQ(34567, val);
-    EXPECT_TRUE((item && item->GetInteger("tid", &val)));
-    EXPECT_EQ(kThreadId, val);
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ(kAsyncId2Str, id);
-  }
-
-  EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_PAST0 call");
-  {
-    EXPECT_SUB_FIND_("id");
-    EXPECT_SUB_FIND_(kAsyncId2Str);
-    EXPECT_SUB_FIND_("step_end1");
-    EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_PAST1 call");
-    EXPECT_SUB_FIND_("id");
-    EXPECT_SUB_FIND_(kAsyncId2Str);
-    EXPECT_SUB_FIND_("step_end2");
-    EXPECT_SUB_FIND_("name1");
-    EXPECT_SUB_FIND_("value1");
-  }
-
-  EXPECT_FIND_("TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0 call");
-  {
-    int val;
-    EXPECT_TRUE((item && item->GetInteger("ts", &val)));
-    EXPECT_EQ(45678, val);
-    EXPECT_TRUE((item && item->GetInteger("tid", &val)));
-    EXPECT_EQ(kThreadId, val);
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ(kAsyncId2Str, id);
-  }
-
-  EXPECT_FIND_("tracked object 1");
-  {
-    std::string phase;
-    std::string id;
-    std::string snapshot;
-
-    EXPECT_TRUE((item && item->GetString("ph", &phase)));
-    EXPECT_EQ("N", phase);
-    EXPECT_FALSE((item && item->HasKey("scope")));
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ("0x42", id);
-
-    item = FindTraceEntry(trace_parsed, "tracked object 1", item);
-    EXPECT_TRUE(item);
-    EXPECT_TRUE(item && item->GetString("ph", &phase));
-    EXPECT_EQ("O", phase);
-    EXPECT_FALSE((item && item->HasKey("scope")));
-    EXPECT_TRUE(item && item->GetString("id", &id));
-    EXPECT_EQ("0x42", id);
-    EXPECT_TRUE(item && item->GetString("args.snapshot", &snapshot));
-    EXPECT_EQ("hello", snapshot);
-
-    item = FindTraceEntry(trace_parsed, "tracked object 1", item);
-    EXPECT_TRUE(item);
-    EXPECT_TRUE(item && item->GetString("ph", &phase));
-    EXPECT_EQ("D", phase);
-    EXPECT_FALSE((item && item->HasKey("scope")));
-    EXPECT_TRUE(item && item->GetString("id", &id));
-    EXPECT_EQ("0x42", id);
-  }
-
-  EXPECT_FIND_("tracked object 2");
-  {
-    std::string phase;
-    std::string id;
-    std::string snapshot;
-
-    EXPECT_TRUE(item && item->GetString("ph", &phase));
-    EXPECT_EQ("N", phase);
-    EXPECT_TRUE(item && item->GetString("id", &id));
-    EXPECT_EQ("0x2128506", id);
-
-    item = FindTraceEntry(trace_parsed, "tracked object 2", item);
-    EXPECT_TRUE(item);
-    EXPECT_TRUE(item && item->GetString("ph", &phase));
-    EXPECT_EQ("O", phase);
-    EXPECT_TRUE(item && item->GetString("id", &id));
-    EXPECT_EQ("0x2128506", id);
-    EXPECT_TRUE(item && item->GetString("args.snapshot", &snapshot));
-    EXPECT_EQ("world", snapshot);
-
-    item = FindTraceEntry(trace_parsed, "tracked object 2", item);
-    EXPECT_TRUE(item);
-    EXPECT_TRUE(item && item->GetString("ph", &phase));
-    EXPECT_EQ("D", phase);
-    EXPECT_TRUE(item && item->GetString("id", &id));
-    EXPECT_EQ("0x2128506", id);
-  }
-
-  EXPECT_FIND_("tracked object 3");
-  {
-    std::string phase;
-    std::string scope;
-    std::string id;
-    std::string snapshot;
-
-    EXPECT_TRUE((item && item->GetString("ph", &phase)));
-    EXPECT_EQ("N", phase);
-    EXPECT_TRUE((item && item->GetString("scope", &scope)));
-    EXPECT_EQ("scope", scope);
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ("0x42", id);
-
-    item = FindTraceEntry(trace_parsed, "tracked object 3", item);
-    EXPECT_TRUE(item);
-    EXPECT_TRUE(item && item->GetString("ph", &phase));
-    EXPECT_EQ("O", phase);
-    EXPECT_TRUE((item && item->GetString("scope", &scope)));
-    EXPECT_EQ("scope", scope);
-    EXPECT_TRUE(item && item->GetString("id", &id));
-    EXPECT_EQ("0x42", id);
-    EXPECT_TRUE(item && item->GetString("args.snapshot", &snapshot));
-    EXPECT_EQ("hello", snapshot);
-
-    item = FindTraceEntry(trace_parsed, "tracked object 3", item);
-    EXPECT_TRUE(item);
-    EXPECT_TRUE(item && item->GetString("ph", &phase));
-    EXPECT_EQ("D", phase);
-    EXPECT_TRUE((item && item->GetString("scope", &scope)));
-    EXPECT_EQ("scope", scope);
-    EXPECT_TRUE(item && item->GetString("id", &id));
-    EXPECT_EQ("0x42", id);
-  }
-
-  EXPECT_FIND_(kControlCharacters);
-  EXPECT_SUB_FIND_(kControlCharacters);
-
-  EXPECT_FIND_("TRACE_EVENT_ENTER_CONTEXT call");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("(", ph);
-
-    std::string scope;
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("scope", &scope)));
-    EXPECT_EQ("scope", scope);
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ("0x20151021", id);
-  }
-
-  EXPECT_FIND_("TRACE_EVENT_LEAVE_CONTEXT call");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ(")", ph);
-
-    std::string scope;
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("scope", &scope)));
-    EXPECT_EQ("scope", scope);
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ("0x20151021", id);
-  }
-
-  std::vector<const DictionaryValue*> scoped_context_calls =
-      FindTraceEntries(trace_parsed, "TRACE_EVENT_SCOPED_CONTEXT call");
-  EXPECT_EQ(2u, scoped_context_calls.size());
-  {
-    item = scoped_context_calls[0];
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("(", ph);
-
-    std::string id;
-    EXPECT_FALSE((item && item->HasKey("scope")));
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ("0x20151021", id);
-  }
-
-  {
-    item = scoped_context_calls[1];
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ(")", ph);
-
-    std::string id;
-    EXPECT_FALSE((item && item->HasKey("scope")));
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ("0x20151021", id);
-  }
-
-  EXPECT_FIND_("TRACE_LINK_IDS simple call");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("=", ph);
-
-    EXPECT_FALSE((item && item->HasKey("scope")));
-    std::string id1;
-    EXPECT_TRUE((item && item->GetString("id", &id1)));
-    EXPECT_EQ("0x1000", id1);
-
-    EXPECT_FALSE((item && item->HasKey("args.linked_id.scope")));
-    std::string id2;
-    EXPECT_TRUE((item && item->GetString("args.linked_id.id", &id2)));
-    EXPECT_EQ("0x2000", id2);
-  }
-
-  EXPECT_FIND_("TRACE_LINK_IDS scoped call");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("=", ph);
-
-    std::string scope1;
-    EXPECT_TRUE((item && item->GetString("scope", &scope1)));
-    EXPECT_EQ("scope 1", scope1);
-    std::string id1;
-    EXPECT_TRUE((item && item->GetString("id", &id1)));
-    EXPECT_EQ("0x1000", id1);
-
-    std::string scope2;
-    EXPECT_TRUE((item && item->GetString("args.linked_id.scope", &scope2)));
-    EXPECT_EQ("scope 2", scope2);
-    std::string id2;
-    EXPECT_TRUE((item && item->GetString("args.linked_id.id", &id2)));
-    EXPECT_EQ("0x2000", id2);
-  }
-
-  EXPECT_FIND_("TRACE_LINK_IDS to a local ID");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("=", ph);
-
-    EXPECT_FALSE((item && item->HasKey("scope")));
-    std::string id1;
-    EXPECT_TRUE((item && item->GetString("id", &id1)));
-    EXPECT_EQ("0x1000", id1);
-
-    EXPECT_FALSE((item && item->HasKey("args.linked_id.scope")));
-    std::string id2;
-    EXPECT_TRUE((item && item->GetString("args.linked_id.id2.local", &id2)));
-    EXPECT_EQ("0x2000", id2);
-  }
-
-  EXPECT_FIND_("TRACE_LINK_IDS to a global ID");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("=", ph);
-
-    EXPECT_FALSE((item && item->HasKey("scope")));
-    std::string id1;
-    EXPECT_TRUE((item && item->GetString("id", &id1)));
-    EXPECT_EQ("0x1000", id1);
-
-    EXPECT_FALSE((item && item->HasKey("args.linked_id.scope")));
-    std::string id2;
-    EXPECT_TRUE((item && item->GetString("args.linked_id.id2.global", &id2)));
-    EXPECT_EQ("0x2000", id2);
-  }
-
-  EXPECT_FIND_("TRACE_LINK_IDS to a composite ID");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("=", ph);
-
-    EXPECT_FALSE(item->HasKey("scope"));
-    std::string id1;
-    EXPECT_TRUE(item->GetString("id", &id1));
-    EXPECT_EQ("0x1000", id1);
-
-    std::string scope;
-    EXPECT_TRUE(item->GetString("args.linked_id.scope", &scope));
-    EXPECT_EQ("scope 1", scope);
-    std::string id2;
-    EXPECT_TRUE(item->GetString("args.linked_id.id", &id2));
-    EXPECT_EQ(id2, "0x2000/0x3000");
-  }
-
-  EXPECT_FIND_("async default process scope");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("S", ph);
-
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("id", &id)));
-    EXPECT_EQ("0x1000", id);
-  }
-
-  EXPECT_FIND_("async local id");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("S", ph);
-
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("id2.local", &id)));
-    EXPECT_EQ("0x2000", id);
-  }
-
-  EXPECT_FIND_("async global id");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("S", ph);
-
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("id2.global", &id)));
-    EXPECT_EQ("0x3000", id);
-  }
-
-  EXPECT_FIND_("async global id with scope string");
-  {
-    std::string ph;
-    EXPECT_TRUE((item && item->GetString("ph", &ph)));
-    EXPECT_EQ("S", ph);
-
-    std::string id;
-    EXPECT_TRUE((item && item->GetString("id2.global", &id)));
-    EXPECT_EQ("0x4000", id);
-    std::string scope;
-    EXPECT_TRUE((item && item->GetString("scope", &scope)));
-    EXPECT_EQ("scope string", scope);
-  }
-}
-
-void TraceManyInstantEvents(int thread_id, int num_events,
-                            WaitableEvent* task_complete_event) {
-  for (int i = 0; i < num_events; i++) {
-    TRACE_EVENT_INSTANT2("all", "multi thread event",
-                         TRACE_EVENT_SCOPE_THREAD,
-                         "thread", thread_id,
-                         "event", i);
-  }
-
-  if (task_complete_event)
-    task_complete_event->Signal();
-}
-
-void ValidateInstantEventPresentOnEveryThread(const ListValue& trace_parsed,
-                                              int num_threads,
-                                              int num_events) {
-  std::map<int, std::map<int, bool> > results;
-
-  size_t trace_parsed_count = trace_parsed.GetSize();
-  for (size_t i = 0; i < trace_parsed_count; i++) {
-    const Value* value = nullptr;
-    trace_parsed.Get(i, &value);
-    if (!value || value->type() != Value::Type::DICTIONARY)
-      continue;
-    const DictionaryValue* dict = static_cast<const DictionaryValue*>(value);
-    std::string name;
-    dict->GetString("name", &name);
-    if (name != "multi thread event")
-      continue;
-
-    int thread = 0;
-    int event = 0;
-    EXPECT_TRUE(dict->GetInteger("args.thread", &thread));
-    EXPECT_TRUE(dict->GetInteger("args.event", &event));
-    results[thread][event] = true;
-  }
-
-  EXPECT_FALSE(results[-1][-1]);
-  for (int thread = 0; thread < num_threads; thread++) {
-    for (int event = 0; event < num_events; event++) {
-      EXPECT_TRUE(results[thread][event]);
-    }
-  }
-}
-
-void CheckTraceDefaultCategoryFilters(const TraceLog& trace_log) {
-  // Default enables all category filters except the disabled-by-default-* ones.
-  EXPECT_TRUE(*trace_log.GetCategoryGroupEnabled("foo"));
-  EXPECT_TRUE(*trace_log.GetCategoryGroupEnabled("bar"));
-  EXPECT_TRUE(*trace_log.GetCategoryGroupEnabled("foo,bar"));
-  EXPECT_TRUE(*trace_log.GetCategoryGroupEnabled(
-        "foo,disabled-by-default-foo"));
-  EXPECT_FALSE(*trace_log.GetCategoryGroupEnabled(
-        "disabled-by-default-foo,disabled-by-default-bar"));
-}
-
-}  // namespace
-
-// Simple Test for emitting data and validating it was received.
-TEST_F(TraceEventTestFixture, DataCaptured) {
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-
-  TraceWithAllMacroVariants(nullptr);
-
-  EndTraceAndFlush();
-
-  ValidateAllTraceMacrosCreatedData(trace_parsed_);
-}
-
-// Emit some events and validate that only empty strings are received
-// if we tell Flush() to discard events.
-TEST_F(TraceEventTestFixture, DataDiscarded) {
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-
-  TraceWithAllMacroVariants(nullptr);
-
-  CancelTrace();
-
-  EXPECT_TRUE(trace_parsed_.empty());
-}
-
-class MockEnabledStateChangedObserver :
-      public TraceLog::EnabledStateObserver {
- public:
-  MOCK_METHOD0(OnTraceLogEnabled, void());
-  MOCK_METHOD0(OnTraceLogDisabled, void());
-};
-
-TEST_F(TraceEventTestFixture, EnabledObserverFiresOnEnable) {
-  MockEnabledStateChangedObserver observer;
-  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
-
-  EXPECT_CALL(observer, OnTraceLogEnabled())
-      .Times(1);
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-  testing::Mock::VerifyAndClear(&observer);
-  EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
-
-  // Cleanup.
-  TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
-  TraceLog::GetInstance()->SetDisabled();
-}
-
-TEST_F(TraceEventTestFixture, EnabledObserverDoesntFireOnSecondEnable) {
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-
-  testing::StrictMock<MockEnabledStateChangedObserver> observer;
-  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
-
-  EXPECT_CALL(observer, OnTraceLogEnabled())
-      .Times(0);
-  EXPECT_CALL(observer, OnTraceLogDisabled())
-      .Times(0);
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-  testing::Mock::VerifyAndClear(&observer);
-  EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
-
-  // Cleanup.
-  TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
-  TraceLog::GetInstance()->SetDisabled();
-  TraceLog::GetInstance()->SetDisabled();
-}
-
-TEST_F(TraceEventTestFixture, EnabledObserverFiresOnFirstDisable) {
-  TraceConfig tc_inc_all("*", "");
-  TraceLog::GetInstance()->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE);
-  TraceLog::GetInstance()->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE);
-
-  testing::StrictMock<MockEnabledStateChangedObserver> observer;
-  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
-
-  EXPECT_CALL(observer, OnTraceLogEnabled())
-      .Times(0);
-  EXPECT_CALL(observer, OnTraceLogDisabled())
-      .Times(1);
-  TraceLog::GetInstance()->SetDisabled();
-  testing::Mock::VerifyAndClear(&observer);
-
-  // Cleanup.
-  TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
-  TraceLog::GetInstance()->SetDisabled();
-}
-
-TEST_F(TraceEventTestFixture, EnabledObserverFiresOnDisable) {
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-
-  MockEnabledStateChangedObserver observer;
-  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
-
-  EXPECT_CALL(observer, OnTraceLogDisabled())
-      .Times(1);
-  TraceLog::GetInstance()->SetDisabled();
-  testing::Mock::VerifyAndClear(&observer);
-
-  // Cleanup.
-  TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
-}
-
-// Tests the IsEnabled() state of TraceLog changes before callbacks.
-class AfterStateChangeEnabledStateObserver
-    : public TraceLog::EnabledStateObserver {
- public:
-  AfterStateChangeEnabledStateObserver() = default;
-  ~AfterStateChangeEnabledStateObserver() override = default;
-
-  // TraceLog::EnabledStateObserver overrides:
-  void OnTraceLogEnabled() override {
-    EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
-  }
-
-  void OnTraceLogDisabled() override {
-    EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled());
-  }
-};
-
-TEST_F(TraceEventTestFixture, ObserversFireAfterStateChange) {
-  AfterStateChangeEnabledStateObserver observer;
-  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
-
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-  EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
-
-  TraceLog::GetInstance()->SetDisabled();
-  EXPECT_FALSE(TraceLog::GetInstance()->IsEnabled());
-
-  TraceLog::GetInstance()->RemoveEnabledStateObserver(&observer);
-}
-
-// Tests that a state observer can remove itself during a callback.
-class SelfRemovingEnabledStateObserver
-    : public TraceLog::EnabledStateObserver {
- public:
-  SelfRemovingEnabledStateObserver() = default;
-  ~SelfRemovingEnabledStateObserver() override = default;
-
-  // TraceLog::EnabledStateObserver overrides:
-  void OnTraceLogEnabled() override {}
-
-  void OnTraceLogDisabled() override {
-    TraceLog::GetInstance()->RemoveEnabledStateObserver(this);
-  }
-};
-
-TEST_F(TraceEventTestFixture, SelfRemovingObserver) {
-  ASSERT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest());
-
-  SelfRemovingEnabledStateObserver observer;
-  TraceLog::GetInstance()->AddEnabledStateObserver(&observer);
-  EXPECT_EQ(1u, TraceLog::GetInstance()->GetObserverCountForTest());
-
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-  TraceLog::GetInstance()->SetDisabled();
-  // The observer removed itself on disable.
-  EXPECT_EQ(0u, TraceLog::GetInstance()->GetObserverCountForTest());
-}
-
-bool IsNewTrace() {
-  bool is_new_trace;
-  TRACE_EVENT_IS_NEW_TRACE(&is_new_trace);
-  return is_new_trace;
-}
-
-TEST_F(TraceEventTestFixture, NewTraceRecording) {
-  ASSERT_FALSE(IsNewTrace());
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-  // First call to IsNewTrace() should succeed. But, the second shouldn't.
-  ASSERT_TRUE(IsNewTrace());
-  ASSERT_FALSE(IsNewTrace());
-  EndTraceAndFlush();
-
-  // IsNewTrace() should definitely be false now.
-  ASSERT_FALSE(IsNewTrace());
-
-  // Start another trace. IsNewTrace() should become true again, briefly, as
-  // before.
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-  ASSERT_TRUE(IsNewTrace());
-  ASSERT_FALSE(IsNewTrace());
-
-  // Cleanup.
-  EndTraceAndFlush();
-}
-
-TEST_F(TraceEventTestFixture, TestTraceFlush) {
-  size_t min_traces = 1;
-  size_t max_traces = 1;
-  do {
-    max_traces *= 2;
-    TraceLog::GetInstance()->SetEnabled(TraceConfig(),
-                                        TraceLog::RECORDING_MODE);
-    for (size_t i = 0; i < max_traces; i++) {
-      TRACE_EVENT_INSTANT0("x", "y", TRACE_EVENT_SCOPE_THREAD);
-    }
-    EndTraceAndFlush();
-  } while (num_flush_callbacks_ < 2);
-
-  while (min_traces + 50 <  max_traces) {
-    size_t traces = (min_traces + max_traces) / 2;
-    TraceLog::GetInstance()->SetEnabled(TraceConfig(),
-                                        TraceLog::RECORDING_MODE);
-    for (size_t i = 0; i < traces; i++) {
-      TRACE_EVENT_INSTANT0("x", "y", TRACE_EVENT_SCOPE_THREAD);
-    }
-    EndTraceAndFlush();
-    if (num_flush_callbacks_ < 2) {
-      min_traces = traces - 10;
-    } else {
-      max_traces = traces + 10;
-    }
-  }
-
-  for (size_t traces = min_traces; traces < max_traces; traces++) {
-    TraceLog::GetInstance()->SetEnabled(TraceConfig(),
-                                        TraceLog::RECORDING_MODE);
-    for (size_t i = 0; i < traces; i++) {
-      TRACE_EVENT_INSTANT0("x", "y", TRACE_EVENT_SCOPE_THREAD);
-    }
-    EndTraceAndFlush();
-  }
-}
-
-TEST_F(TraceEventTestFixture, AddMetadataEvent) {
-  int num_calls = 0;
-
-  class Convertable : public ConvertableToTraceFormat {
-   public:
-    explicit Convertable(int* num_calls) : num_calls_(num_calls) {}
-    ~Convertable() override = default;
-    void AppendAsTraceFormat(std::string* out) const override {
-      (*num_calls_)++;
-      out->append("\"metadata_value\"");
-    }
-
-   private:
-    int* num_calls_;
-  };
-
-  std::unique_ptr<ConvertableToTraceFormat> conv1(new Convertable(&num_calls));
-  std::unique_ptr<Convertable> conv2(new Convertable(&num_calls));
-
-  BeginTrace();
-  TRACE_EVENT_API_ADD_METADATA_EVENT(
-      TraceLog::GetCategoryGroupEnabled("__metadata"), "metadata_event_1",
-      "metadata_arg_name", std::move(conv1));
-  TRACE_EVENT_API_ADD_METADATA_EVENT(
-      TraceLog::GetCategoryGroupEnabled("__metadata"), "metadata_event_2",
-      "metadata_arg_name", std::move(conv2));
-  // |AppendAsTraceFormat| should only be called on flush, not when the event
-  // is added.
-  ASSERT_EQ(0, num_calls);
-  EndTraceAndFlush();
-  ASSERT_EQ(2, num_calls);
-  EXPECT_TRUE(FindNamePhaseKeyValue("metadata_event_1", "M",
-                                    "metadata_arg_name", "metadata_value"));
-  EXPECT_TRUE(FindNamePhaseKeyValue("metadata_event_2", "M",
-                                    "metadata_arg_name", "metadata_value"));
-
-  // The metadata event should only be adde to the current trace. In this new
-  // trace, the event should not appear.
-  BeginTrace();
-  EndTraceAndFlush();
-  ASSERT_EQ(2, num_calls);
-}
-
-// Test that categories work.
-TEST_F(TraceEventTestFixture, Categories) {
-  // Test that categories that are used can be retrieved whether trace was
-  // enabled or disabled when the trace event was encountered.
-  TRACE_EVENT_INSTANT0("c1", "name", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("c2", "name", TRACE_EVENT_SCOPE_THREAD);
-  BeginTrace();
-  TRACE_EVENT_INSTANT0("c3", "name", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("c4", "name", TRACE_EVENT_SCOPE_THREAD);
-  // Category groups containing more than one category.
-  TRACE_EVENT_INSTANT0("c5,c6", "name", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("c7,c8", "name", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("c9"), "name",
-                       TRACE_EVENT_SCOPE_THREAD);
-
-  EndTraceAndFlush();
-  std::vector<std::string> cat_groups;
-  TraceLog::GetInstance()->GetKnownCategoryGroups(&cat_groups);
-  EXPECT_TRUE(ContainsValue(cat_groups, "c1"));
-  EXPECT_TRUE(ContainsValue(cat_groups, "c2"));
-  EXPECT_TRUE(ContainsValue(cat_groups, "c3"));
-  EXPECT_TRUE(ContainsValue(cat_groups, "c4"));
-  EXPECT_TRUE(ContainsValue(cat_groups, "c5,c6"));
-  EXPECT_TRUE(ContainsValue(cat_groups, "c7,c8"));
-  EXPECT_TRUE(ContainsValue(cat_groups, "disabled-by-default-c9"));
-  // Make sure metadata isn't returned.
-  EXPECT_FALSE(ContainsValue(cat_groups, "__metadata"));
-
-  const std::vector<std::string> empty_categories;
-  std::vector<std::string> included_categories;
-  std::vector<std::string> excluded_categories;
-
-  // Test that category filtering works.
-
-  // Include nonexistent category -> no events
-  Clear();
-  included_categories.clear();
-  TraceLog::GetInstance()->SetEnabled(TraceConfig("not_found823564786", ""),
-                                      TraceLog::RECORDING_MODE);
-  TRACE_EVENT_INSTANT0("cat1", "name", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("cat2", "name", TRACE_EVENT_SCOPE_THREAD);
-  EndTraceAndFlush();
-  DropTracedMetadataRecords();
-  EXPECT_TRUE(trace_parsed_.empty());
-
-  // Include existent category -> only events of that category
-  Clear();
-  included_categories.clear();
-  TraceLog::GetInstance()->SetEnabled(TraceConfig("inc", ""),
-                                      TraceLog::RECORDING_MODE);
-  TRACE_EVENT_INSTANT0("inc", "name", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("inc2", "name", TRACE_EVENT_SCOPE_THREAD);
-  EndTraceAndFlush();
-  DropTracedMetadataRecords();
-  EXPECT_TRUE(FindMatchingValue("cat", "inc"));
-  EXPECT_FALSE(FindNonMatchingValue("cat", "inc"));
-
-  // Include existent wildcard -> all categories matching wildcard
-  Clear();
-  included_categories.clear();
-  TraceLog::GetInstance()->SetEnabled(
-      TraceConfig("inc_wildcard_*,inc_wildchar_?_end", ""),
-      TraceLog::RECORDING_MODE);
-  TRACE_EVENT_INSTANT0("inc_wildcard_abc", "included",
-      TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("inc_wildcard_", "included", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "included",
-      TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "not_inc",
-      TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("cat1", "not_inc", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("cat2", "not_inc", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("inc_wildcard_category,other_category", "included",
-      TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0(
-      "non_included_category,inc_wildcard_category", "included",
-      TRACE_EVENT_SCOPE_THREAD);
-  EndTraceAndFlush();
-  EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_abc"));
-  EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_"));
-  EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_x_end"));
-  EXPECT_FALSE(FindMatchingValue("name", "not_inc"));
-  EXPECT_TRUE(FindMatchingValue("cat", "inc_wildcard_category,other_category"));
-  EXPECT_TRUE(FindMatchingValue("cat",
-                                "non_included_category,inc_wildcard_category"));
-
-  included_categories.clear();
-
-  // Exclude nonexistent category -> all events
-  Clear();
-  TraceLog::GetInstance()->SetEnabled(TraceConfig("-not_found823564786", ""),
-                                      TraceLog::RECORDING_MODE);
-  TRACE_EVENT_INSTANT0("cat1", "name", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("cat2", "name", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("category1,category2", "name", TRACE_EVENT_SCOPE_THREAD);
-  EndTraceAndFlush();
-  EXPECT_TRUE(FindMatchingValue("cat", "cat1"));
-  EXPECT_TRUE(FindMatchingValue("cat", "cat2"));
-  EXPECT_TRUE(FindMatchingValue("cat", "category1,category2"));
-
-  // Exclude existent category -> only events of other categories
-  Clear();
-  TraceLog::GetInstance()->SetEnabled(TraceConfig("-inc", ""),
-                                      TraceLog::RECORDING_MODE);
-  TRACE_EVENT_INSTANT0("inc", "name", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("inc2", "name", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("inc2,inc", "name", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("inc,inc2", "name", TRACE_EVENT_SCOPE_THREAD);
-  EndTraceAndFlush();
-  EXPECT_TRUE(FindMatchingValue("cat", "inc2"));
-  EXPECT_FALSE(FindMatchingValue("cat", "inc"));
-  EXPECT_TRUE(FindMatchingValue("cat", "inc2,inc"));
-  EXPECT_TRUE(FindMatchingValue("cat", "inc,inc2"));
-
-  // Exclude existent wildcard -> all categories not matching wildcard
-  Clear();
-  TraceLog::GetInstance()->SetEnabled(
-      TraceConfig("-inc_wildcard_*,-inc_wildchar_?_end", ""),
-      TraceLog::RECORDING_MODE);
-  TRACE_EVENT_INSTANT0("inc_wildcard_abc", "not_inc",
-      TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("inc_wildcard_", "not_inc",
-      TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("inc_wildchar_x_end", "not_inc",
-      TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("inc_wildchar_bla_end", "included",
-      TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("cat1", "included", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("cat2", "included", TRACE_EVENT_SCOPE_THREAD);
-  EndTraceAndFlush();
-  EXPECT_TRUE(FindMatchingValue("cat", "inc_wildchar_bla_end"));
-  EXPECT_TRUE(FindMatchingValue("cat", "cat1"));
-  EXPECT_TRUE(FindMatchingValue("cat", "cat2"));
-  EXPECT_FALSE(FindMatchingValue("name", "not_inc"));
-}
-
-
-// Test ASYNC_BEGIN/END events
-TEST_F(TraceEventTestFixture, AsyncBeginEndEvents) {
-  BeginTrace();
-
-  unsigned long long id = 0xfeedbeeffeedbeefull;
-  TRACE_EVENT_ASYNC_BEGIN0("cat", "name1", id);
-  TRACE_EVENT_ASYNC_STEP_INTO0("cat", "name1", id, "step1");
-  TRACE_EVENT_ASYNC_END0("cat", "name1", id);
-  TRACE_EVENT_BEGIN0("cat", "name2");
-  TRACE_EVENT_ASYNC_BEGIN0("cat", "name3", 0);
-  TRACE_EVENT_ASYNC_STEP_PAST0("cat", "name3", 0, "step2");
-
-  EndTraceAndFlush();
-
-  EXPECT_TRUE(FindNamePhase("name1", "S"));
-  EXPECT_TRUE(FindNamePhase("name1", "T"));
-  EXPECT_TRUE(FindNamePhase("name1", "F"));
-
-  std::string id_str;
-  StringAppendF(&id_str, "0x%llx", id);
-
-  EXPECT_TRUE(FindNamePhaseKeyValue("name1", "S", "id", id_str.c_str()));
-  EXPECT_TRUE(FindNamePhaseKeyValue("name1", "T", "id", id_str.c_str()));
-  EXPECT_TRUE(FindNamePhaseKeyValue("name1", "F", "id", id_str.c_str()));
-  EXPECT_TRUE(FindNamePhaseKeyValue("name3", "S", "id", "0x0"));
-  EXPECT_TRUE(FindNamePhaseKeyValue("name3", "p", "id", "0x0"));
-
-  // BEGIN events should not have id
-  EXPECT_FALSE(FindNamePhaseKeyValue("name2", "B", "id", "0"));
-}
-
-// Test ASYNC_BEGIN/END events
-TEST_F(TraceEventTestFixture, AsyncBeginEndPointerMangling) {
-  void* ptr = this;
-
-  TraceLog::GetInstance()->SetProcessID(100);
-  BeginTrace();
-  TRACE_EVENT_ASYNC_BEGIN0("cat", "name1", ptr);
-  TRACE_EVENT_ASYNC_BEGIN0("cat", "name2", ptr);
-  EndTraceAndFlush();
-
-  TraceLog::GetInstance()->SetProcessID(200);
-  BeginTrace();
-  TRACE_EVENT_ASYNC_END0("cat", "name1", ptr);
-  EndTraceAndFlush();
-
-  DictionaryValue* async_begin = FindNamePhase("name1", "S");
-  DictionaryValue* async_begin2 = FindNamePhase("name2", "S");
-  DictionaryValue* async_end = FindNamePhase("name1", "F");
-  EXPECT_TRUE(async_begin);
-  EXPECT_TRUE(async_begin2);
-  EXPECT_TRUE(async_end);
-
-  Value* value = nullptr;
-  std::string async_begin_id_str;
-  std::string async_begin2_id_str;
-  std::string async_end_id_str;
-  ASSERT_TRUE(async_begin->Get("id", &value));
-  ASSERT_TRUE(value->GetAsString(&async_begin_id_str));
-  ASSERT_TRUE(async_begin2->Get("id", &value));
-  ASSERT_TRUE(value->GetAsString(&async_begin2_id_str));
-  ASSERT_TRUE(async_end->Get("id", &value));
-  ASSERT_TRUE(value->GetAsString(&async_end_id_str));
-
-  EXPECT_STREQ(async_begin_id_str.c_str(), async_begin2_id_str.c_str());
-  EXPECT_STRNE(async_begin_id_str.c_str(), async_end_id_str.c_str());
-}
-
-// Test that static strings are not copied.
-TEST_F(TraceEventTestFixture, StaticStringVsString) {
-  TraceLog* tracer = TraceLog::GetInstance();
-  // Make sure old events are flushed:
-  EXPECT_EQ(0u, tracer->GetStatus().event_count);
-  const unsigned char* category_group_enabled =
-      TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED("cat");
-
-  {
-    BeginTrace();
-    // Test that string arguments are copied.
-    TraceEventHandle handle1 =
-        trace_event_internal::AddTraceEvent(
-            TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name1",
-            trace_event_internal::kGlobalScope, trace_event_internal::kNoId,
-            0, trace_event_internal::kNoId,
-            "arg1", std::string("argval"), "arg2", std::string("argval"));
-    // Test that static TRACE_STR_COPY string arguments are copied.
-    TraceEventHandle handle2 =
-        trace_event_internal::AddTraceEvent(
-            TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name2",
-            trace_event_internal::kGlobalScope, trace_event_internal::kNoId,
-            0, trace_event_internal::kNoId,
-            "arg1", TRACE_STR_COPY("argval"),
-            "arg2", TRACE_STR_COPY("argval"));
-    EXPECT_GT(tracer->GetStatus().event_count, 1u);
-    const TraceEvent* event1 = tracer->GetEventByHandle(handle1);
-    const TraceEvent* event2 = tracer->GetEventByHandle(handle2);
-    ASSERT_TRUE(event1);
-    ASSERT_TRUE(event2);
-    EXPECT_STREQ("name1", event1->name());
-    EXPECT_STREQ("name2", event2->name());
-    EXPECT_TRUE(event1->parameter_copy_storage() != nullptr);
-    EXPECT_TRUE(event2->parameter_copy_storage() != nullptr);
-    EXPECT_GT(event1->parameter_copy_storage()->size(), 0u);
-    EXPECT_GT(event2->parameter_copy_storage()->size(), 0u);
-    EndTraceAndFlush();
-  }
-
-  {
-    BeginTrace();
-    // Test that static literal string arguments are not copied.
-    TraceEventHandle handle1 =
-        trace_event_internal::AddTraceEvent(
-            TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name1",
-            trace_event_internal::kGlobalScope, trace_event_internal::kNoId,
-            0, trace_event_internal::kNoId,
-            "arg1", "argval", "arg2", "argval");
-    // Test that static TRACE_STR_COPY NULL string arguments are not copied.
-    const char* str1 = nullptr;
-    const char* str2 = nullptr;
-    TraceEventHandle handle2 =
-        trace_event_internal::AddTraceEvent(
-            TRACE_EVENT_PHASE_INSTANT, category_group_enabled, "name2",
-            trace_event_internal::kGlobalScope, trace_event_internal::kNoId,
-            0, trace_event_internal::kNoId,
-            "arg1", TRACE_STR_COPY(str1),
-            "arg2", TRACE_STR_COPY(str2));
-    EXPECT_GT(tracer->GetStatus().event_count, 1u);
-    const TraceEvent* event1 = tracer->GetEventByHandle(handle1);
-    const TraceEvent* event2 = tracer->GetEventByHandle(handle2);
-    ASSERT_TRUE(event1);
-    ASSERT_TRUE(event2);
-    EXPECT_STREQ("name1", event1->name());
-    EXPECT_STREQ("name2", event2->name());
-    EXPECT_TRUE(event1->parameter_copy_storage() == nullptr);
-    EXPECT_TRUE(event2->parameter_copy_storage() == nullptr);
-    EndTraceAndFlush();
-  }
-}
-
-// Test that data sent from other threads is gathered
-TEST_F(TraceEventTestFixture, DataCapturedOnThread) {
-  BeginTrace();
-
-  Thread thread("1");
-  WaitableEvent task_complete_event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                    WaitableEvent::InitialState::NOT_SIGNALED);
-  thread.Start();
-
-  thread.task_runner()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&TraceWithAllMacroVariants, &task_complete_event));
-  task_complete_event.Wait();
-  thread.Stop();
-
-  EndTraceAndFlush();
-  ValidateAllTraceMacrosCreatedData(trace_parsed_);
-}
-
-// Test that data sent from multiple threads is gathered
-TEST_F(TraceEventTestFixture, DataCapturedManyThreads) {
-  BeginTrace();
-
-  const int num_threads = 4;
-  const int num_events = 4000;
-  Thread* threads[num_threads];
-  WaitableEvent* task_complete_events[num_threads];
-  for (int i = 0; i < num_threads; i++) {
-    threads[i] = new Thread(StringPrintf("Thread %d", i));
-    task_complete_events[i] =
-        new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
-                          WaitableEvent::InitialState::NOT_SIGNALED);
-    threads[i]->Start();
-    threads[i]->task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(&TraceManyInstantEvents, i, num_events,
-                                  task_complete_events[i]));
-  }
-
-  for (int i = 0; i < num_threads; i++) {
-    task_complete_events[i]->Wait();
-  }
-
-  // Let half of the threads end before flush.
-  for (int i = 0; i < num_threads / 2; i++) {
-    threads[i]->Stop();
-    delete threads[i];
-    delete task_complete_events[i];
-  }
-
-  EndTraceAndFlushInThreadWithMessageLoop();
-  ValidateInstantEventPresentOnEveryThread(trace_parsed_,
-                                           num_threads, num_events);
-
-  // Let the other half of the threads end after flush.
-  for (int i = num_threads / 2; i < num_threads; i++) {
-    threads[i]->Stop();
-    delete threads[i];
-    delete task_complete_events[i];
-  }
-}
-
-// Test that thread and process names show up in the trace
-TEST_F(TraceEventTestFixture, ThreadNames) {
-  // Create threads before we enable tracing to make sure
-  // that tracelog still captures them.
-  const int kNumThreads = 4;
-  const int kNumEvents = 10;
-  Thread* threads[kNumThreads];
-  PlatformThreadId thread_ids[kNumThreads];
-  for (int i = 0; i < kNumThreads; i++)
-    threads[i] = new Thread(StringPrintf("Thread %d", i));
-
-  // Enable tracing.
-  BeginTrace();
-
-  // Now run some trace code on these threads.
-  WaitableEvent* task_complete_events[kNumThreads];
-  for (int i = 0; i < kNumThreads; i++) {
-    task_complete_events[i] =
-        new WaitableEvent(WaitableEvent::ResetPolicy::AUTOMATIC,
-                          WaitableEvent::InitialState::NOT_SIGNALED);
-    threads[i]->Start();
-    thread_ids[i] = threads[i]->GetThreadId();
-    threads[i]->task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(&TraceManyInstantEvents, i, kNumEvents,
-                                  task_complete_events[i]));
-  }
-  for (int i = 0; i < kNumThreads; i++) {
-    task_complete_events[i]->Wait();
-  }
-
-  // Shut things down.
-  for (int i = 0; i < kNumThreads; i++) {
-    threads[i]->Stop();
-    delete threads[i];
-    delete task_complete_events[i];
-  }
-
-  EndTraceAndFlush();
-
-  std::string tmp;
-  int tmp_int;
-  const DictionaryValue* item;
-
-  // Make sure we get thread name metadata.
-  // Note, the test suite may have created a ton of threads.
-  // So, we'll have thread names for threads we didn't create.
-  std::vector<const DictionaryValue*> items =
-      FindTraceEntries(trace_parsed_, "thread_name");
-  for (int i = 0; i < static_cast<int>(items.size()); i++) {
-    item = items[i];
-    ASSERT_TRUE(item);
-    EXPECT_TRUE(item->GetInteger("tid", &tmp_int));
-
-    // See if this thread name is one of the threads we just created
-    for (int j = 0; j < kNumThreads; j++) {
-      if (static_cast<int>(thread_ids[j]) != tmp_int)
-        continue;
-
-      std::string expected_name = StringPrintf("Thread %d", j);
-      EXPECT_TRUE(item->GetString("ph", &tmp) && tmp == "M");
-      EXPECT_TRUE(item->GetInteger("pid", &tmp_int) &&
-                  tmp_int == static_cast<int>(base::GetCurrentProcId()));
-      // If the thread name changes or the tid gets reused, the name will be
-      // a comma-separated list of thread names, so look for a substring.
-      EXPECT_TRUE(item->GetString("args.name", &tmp) &&
-                  tmp.find(expected_name) != std::string::npos);
-    }
-  }
-}
-
-TEST_F(TraceEventTestFixture, ThreadNameChanges) {
-  BeginTrace();
-
-  PlatformThread::SetName("");
-  TRACE_EVENT_INSTANT0("drink", "water", TRACE_EVENT_SCOPE_THREAD);
-
-  PlatformThread::SetName("cafe");
-  TRACE_EVENT_INSTANT0("drink", "coffee", TRACE_EVENT_SCOPE_THREAD);
-
-  PlatformThread::SetName("shop");
-  // No event here, so won't appear in combined name.
-
-  PlatformThread::SetName("pub");
-  TRACE_EVENT_INSTANT0("drink", "beer", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("drink", "wine", TRACE_EVENT_SCOPE_THREAD);
-
-  PlatformThread::SetName(" bar");
-  TRACE_EVENT_INSTANT0("drink", "whisky", TRACE_EVENT_SCOPE_THREAD);
-
-  EndTraceAndFlush();
-
-  std::vector<const DictionaryValue*> items =
-      FindTraceEntries(trace_parsed_, "thread_name");
-  EXPECT_EQ(1u, items.size());
-  ASSERT_GT(items.size(), 0u);
-  const DictionaryValue* item = items[0];
-  ASSERT_TRUE(item);
-  int tid;
-  EXPECT_TRUE(item->GetInteger("tid", &tid));
-  EXPECT_EQ(PlatformThread::CurrentId(), static_cast<PlatformThreadId>(tid));
-
-  std::string expected_name = "cafe,pub, bar";
-  std::string tmp;
-  EXPECT_TRUE(item->GetString("args.name", &tmp));
-  EXPECT_EQ(expected_name, tmp);
-}
-
-// Test that the disabled trace categories are included/excluded from the
-// trace output correctly.
-TEST_F(TraceEventTestFixture, DisabledCategories) {
-  BeginTrace();
-  TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("cc"), "first",
-                       TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("included", "first", TRACE_EVENT_SCOPE_THREAD);
-  EndTraceAndFlush();
-  {
-    const DictionaryValue* item = nullptr;
-    ListValue& trace_parsed = trace_parsed_;
-    EXPECT_NOT_FIND_("disabled-by-default-cc");
-    EXPECT_FIND_("included");
-  }
-  Clear();
-
-  BeginSpecificTrace("disabled-by-default-cc");
-  TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("cc"), "second",
-                       TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("other_included", "second", TRACE_EVENT_SCOPE_THREAD);
-  EndTraceAndFlush();
-
-  {
-    const DictionaryValue* item = nullptr;
-    ListValue& trace_parsed = trace_parsed_;
-    EXPECT_FIND_("disabled-by-default-cc");
-    EXPECT_FIND_("other_included");
-  }
-
-  Clear();
-
-  BeginSpecificTrace("other_included");
-  TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("cc") ",other_included",
-                       "first", TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_INSTANT0("other_included," TRACE_DISABLED_BY_DEFAULT("cc"),
-                       "second", TRACE_EVENT_SCOPE_THREAD);
-  EndTraceAndFlush();
-
-  {
-    const DictionaryValue* item = nullptr;
-    ListValue& trace_parsed = trace_parsed_;
-    EXPECT_FIND_("disabled-by-default-cc,other_included");
-    EXPECT_FIND_("other_included,disabled-by-default-cc");
-  }
-}
-
-TEST_F(TraceEventTestFixture, NormallyNoDeepCopy) {
-  // Test that the TRACE_EVENT macros do not deep-copy their string. If they
-  // do so it may indicate a performance regression, but more-over it would
-  // make the DEEP_COPY overloads redundant.
-  std::string name_string("event name");
-
-  BeginTrace();
-  TRACE_EVENT_INSTANT0("category", name_string.c_str(),
-                       TRACE_EVENT_SCOPE_THREAD);
-
-  // Modify the string in place (a wholesale reassignment may leave the old
-  // string intact on the heap).
-  name_string[0] = '@';
-
-  EndTraceAndFlush();
-
-  EXPECT_FALSE(FindTraceEntry(trace_parsed_, "event name"));
-  EXPECT_TRUE(FindTraceEntry(trace_parsed_, name_string.c_str()));
-}
-
-TEST_F(TraceEventTestFixture, DeepCopy) {
-  static const char kOriginalName1[] = "name1";
-  static const char kOriginalName2[] = "name2";
-  static const char kOriginalName3[] = "name3";
-  std::string name1(kOriginalName1);
-  std::string name2(kOriginalName2);
-  std::string name3(kOriginalName3);
-  std::string arg1("arg1");
-  std::string arg2("arg2");
-  std::string val1("val1");
-  std::string val2("val2");
-
-  BeginTrace();
-  TRACE_EVENT_COPY_INSTANT0("category", name1.c_str(),
-                            TRACE_EVENT_SCOPE_THREAD);
-  TRACE_EVENT_COPY_BEGIN1("category", name2.c_str(),
-                          arg1.c_str(), 5);
-  TRACE_EVENT_COPY_END2("category", name3.c_str(),
-                        arg1.c_str(), val1,
-                        arg2.c_str(), val2);
-
-  // As per NormallyNoDeepCopy, modify the strings in place.
-  name1[0] = name2[0] = name3[0] = arg1[0] = arg2[0] = val1[0] = val2[0] = '@';
-
-  EndTraceAndFlush();
-
-  EXPECT_FALSE(FindTraceEntry(trace_parsed_, name1.c_str()));
-  EXPECT_FALSE(FindTraceEntry(trace_parsed_, name2.c_str()));
-  EXPECT_FALSE(FindTraceEntry(trace_parsed_, name3.c_str()));
-
-  const DictionaryValue* entry1 = FindTraceEntry(trace_parsed_, kOriginalName1);
-  const DictionaryValue* entry2 = FindTraceEntry(trace_parsed_, kOriginalName2);
-  const DictionaryValue* entry3 = FindTraceEntry(trace_parsed_, kOriginalName3);
-  ASSERT_TRUE(entry1);
-  ASSERT_TRUE(entry2);
-  ASSERT_TRUE(entry3);
-
-  int i;
-  EXPECT_FALSE(entry2->GetInteger("args.@rg1", &i));
-  EXPECT_TRUE(entry2->GetInteger("args.arg1", &i));
-  EXPECT_EQ(5, i);
-
-  std::string s;
-  EXPECT_TRUE(entry3->GetString("args.arg1", &s));
-  EXPECT_EQ("val1", s);
-  EXPECT_TRUE(entry3->GetString("args.arg2", &s));
-  EXPECT_EQ("val2", s);
-}
-
-// Test that TraceResultBuffer outputs the correct result whether it is added
-// in chunks or added all at once.
-TEST_F(TraceEventTestFixture, TraceResultBuffer) {
-  Clear();
-
-  trace_buffer_.Start();
-  trace_buffer_.AddFragment("bla1");
-  trace_buffer_.AddFragment("bla2");
-  trace_buffer_.AddFragment("bla3,bla4");
-  trace_buffer_.Finish();
-  EXPECT_STREQ(json_output_.json_output.c_str(), "[bla1,bla2,bla3,bla4]");
-
-  Clear();
-
-  trace_buffer_.Start();
-  trace_buffer_.AddFragment("bla1,bla2,bla3,bla4");
-  trace_buffer_.Finish();
-  EXPECT_STREQ(json_output_.json_output.c_str(), "[bla1,bla2,bla3,bla4]");
-}
-
-// Test that trace_event parameters are not evaluated if the tracing
-// system is disabled.
-TEST_F(TraceEventTestFixture, TracingIsLazy) {
-  BeginTrace();
-
-  int a = 0;
-  TRACE_EVENT_INSTANT1("category", "test", TRACE_EVENT_SCOPE_THREAD, "a", a++);
-  EXPECT_EQ(1, a);
-
-  TraceLog::GetInstance()->SetDisabled();
-
-  TRACE_EVENT_INSTANT1("category", "test", TRACE_EVENT_SCOPE_THREAD, "a", a++);
-  EXPECT_EQ(1, a);
-
-  EndTraceAndFlush();
-}
-
-TEST_F(TraceEventTestFixture, TraceEnableDisable) {
-  TraceLog* trace_log = TraceLog::GetInstance();
-  TraceConfig tc_inc_all("*", "");
-  trace_log->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE);
-  EXPECT_TRUE(trace_log->IsEnabled());
-  trace_log->SetDisabled();
-  EXPECT_FALSE(trace_log->IsEnabled());
-
-  trace_log->SetEnabled(tc_inc_all, TraceLog::RECORDING_MODE);
-  EXPECT_TRUE(trace_log->IsEnabled());
-  const std::vector<std::string> empty;
-  trace_log->SetEnabled(TraceConfig(), TraceLog::RECORDING_MODE);
-  EXPECT_TRUE(trace_log->IsEnabled());
-  trace_log->SetDisabled();
-  EXPECT_FALSE(trace_log->IsEnabled());
-  trace_log->SetDisabled();
-  EXPECT_FALSE(trace_log->IsEnabled());
-}
-
-TEST_F(TraceEventTestFixture, TraceCategoriesAfterNestedEnable) {
-  TraceLog* trace_log = TraceLog::GetInstance();
-  trace_log->SetEnabled(TraceConfig("foo,bar", ""), TraceLog::RECORDING_MODE);
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("foo"));
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("bar"));
-  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("baz"));
-  trace_log->SetEnabled(TraceConfig("foo2", ""), TraceLog::RECORDING_MODE);
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("foo2"));
-  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("baz"));
-  // The "" becomes the default catergory set when applied.
-  trace_log->SetEnabled(TraceConfig(), TraceLog::RECORDING_MODE);
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("foo"));
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("baz"));
-  EXPECT_STREQ(
-    "",
-    trace_log->GetCurrentTraceConfig().ToCategoryFilterString().c_str());
-  trace_log->SetDisabled();
-  trace_log->SetDisabled();
-  trace_log->SetDisabled();
-  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("foo"));
-  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("baz"));
-
-  trace_log->SetEnabled(TraceConfig("-foo,-bar", ""), TraceLog::RECORDING_MODE);
-  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("foo"));
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("baz"));
-  trace_log->SetEnabled(TraceConfig("moo", ""), TraceLog::RECORDING_MODE);
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("baz"));
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("moo"));
-  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("foo"));
-  EXPECT_STREQ(
-    "-foo,-bar",
-    trace_log->GetCurrentTraceConfig().ToCategoryFilterString().c_str());
-  trace_log->SetDisabled();
-  trace_log->SetDisabled();
-
-  // Make sure disabled categories aren't cleared if we set in the second.
-  trace_log->SetEnabled(TraceConfig("disabled-by-default-cc,foo", ""),
-                        TraceLog::RECORDING_MODE);
-  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("bar"));
-  trace_log->SetEnabled(TraceConfig("disabled-by-default-gpu", ""),
-                        TraceLog::RECORDING_MODE);
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("disabled-by-default-cc"));
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("disabled-by-default-gpu"));
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("bar"));
-  EXPECT_STREQ(
-    "disabled-by-default-cc,disabled-by-default-gpu",
-    trace_log->GetCurrentTraceConfig().ToCategoryFilterString().c_str());
-  trace_log->SetDisabled();
-  trace_log->SetDisabled();
-}
-
-TEST_F(TraceEventTestFixture, TraceWithDefaultCategoryFilters) {
-  TraceLog* trace_log = TraceLog::GetInstance();
-
-  trace_log->SetEnabled(TraceConfig(), TraceLog::RECORDING_MODE);
-  CheckTraceDefaultCategoryFilters(*trace_log);
-  trace_log->SetDisabled();
-
-  trace_log->SetEnabled(TraceConfig("", ""), TraceLog::RECORDING_MODE);
-  CheckTraceDefaultCategoryFilters(*trace_log);
-  trace_log->SetDisabled();
-
-  trace_log->SetEnabled(TraceConfig("*", ""), TraceLog::RECORDING_MODE);
-  CheckTraceDefaultCategoryFilters(*trace_log);
-  trace_log->SetDisabled();
-
-  trace_log->SetEnabled(TraceConfig(""), TraceLog::RECORDING_MODE);
-  CheckTraceDefaultCategoryFilters(*trace_log);
-  trace_log->SetDisabled();
-}
-
-TEST_F(TraceEventTestFixture, TraceWithDisabledByDefaultCategoryFilters) {
-  TraceLog* trace_log = TraceLog::GetInstance();
-
-  trace_log->SetEnabled(TraceConfig("foo,disabled-by-default-foo", ""),
-                        TraceLog::RECORDING_MODE);
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("foo"));
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("disabled-by-default-foo"));
-  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("bar"));
-  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("disabled-by-default-bar"));
-  trace_log->SetDisabled();
-
-  // Enabling only the disabled-by-default-* category means the default ones
-  // are also enabled.
-  trace_log->SetEnabled(TraceConfig("disabled-by-default-foo", ""),
-                        TraceLog::RECORDING_MODE);
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("disabled-by-default-foo"));
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("foo"));
-  EXPECT_TRUE(*trace_log->GetCategoryGroupEnabled("bar"));
-  EXPECT_FALSE(*trace_log->GetCategoryGroupEnabled("disabled-by-default-bar"));
-  trace_log->SetDisabled();
-}
-
-class MyData : public ConvertableToTraceFormat {
- public:
-  MyData() = default;
-  ~MyData() override = default;
-
-  void AppendAsTraceFormat(std::string* out) const override {
-    out->append("{\"foo\":1}");
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MyData);
-};
-
-TEST_F(TraceEventTestFixture, ConvertableTypes) {
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-
-  std::unique_ptr<ConvertableToTraceFormat> data(new MyData());
-  std::unique_ptr<ConvertableToTraceFormat> data1(new MyData());
-  std::unique_ptr<ConvertableToTraceFormat> data2(new MyData());
-  TRACE_EVENT1("foo", "bar", "data", std::move(data));
-  TRACE_EVENT2("foo", "baz", "data1", std::move(data1), "data2",
-               std::move(data2));
-
-  // Check that std::unique_ptr<DerivedClassOfConvertable> are properly treated
-  // as
-  // convertable and not accidentally casted to bool.
-  std::unique_ptr<MyData> convertData1(new MyData());
-  std::unique_ptr<MyData> convertData2(new MyData());
-  std::unique_ptr<MyData> convertData3(new MyData());
-  std::unique_ptr<MyData> convertData4(new MyData());
-  TRACE_EVENT2("foo", "string_first", "str", "string value 1", "convert",
-               std::move(convertData1));
-  TRACE_EVENT2("foo", "string_second", "convert", std::move(convertData2),
-               "str", "string value 2");
-  TRACE_EVENT2("foo", "both_conv", "convert1", std::move(convertData3),
-               "convert2", std::move(convertData4));
-  EndTraceAndFlush();
-
-  // One arg version.
-  DictionaryValue* dict = FindNamePhase("bar", "X");
-  ASSERT_TRUE(dict);
-
-  const DictionaryValue* args_dict = nullptr;
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-
-  const Value* value = nullptr;
-  const DictionaryValue* convertable_dict = nullptr;
-  EXPECT_TRUE(args_dict->Get("data", &value));
-  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
-
-  int foo_val;
-  EXPECT_TRUE(convertable_dict->GetInteger("foo", &foo_val));
-  EXPECT_EQ(1, foo_val);
-
-  // Two arg version.
-  dict = FindNamePhase("baz", "X");
-  ASSERT_TRUE(dict);
-
-  args_dict = nullptr;
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-
-  value = nullptr;
-  convertable_dict = nullptr;
-  EXPECT_TRUE(args_dict->Get("data1", &value));
-  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
-
-  value = nullptr;
-  convertable_dict = nullptr;
-  EXPECT_TRUE(args_dict->Get("data2", &value));
-  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
-
-  // Convertable with other types.
-  dict = FindNamePhase("string_first", "X");
-  ASSERT_TRUE(dict);
-
-  args_dict = nullptr;
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-
-  std::string str_value;
-  EXPECT_TRUE(args_dict->GetString("str", &str_value));
-  EXPECT_STREQ("string value 1", str_value.c_str());
-
-  value = nullptr;
-  convertable_dict = nullptr;
-  foo_val = 0;
-  EXPECT_TRUE(args_dict->Get("convert", &value));
-  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
-  EXPECT_TRUE(convertable_dict->GetInteger("foo", &foo_val));
-  EXPECT_EQ(1, foo_val);
-
-  dict = FindNamePhase("string_second", "X");
-  ASSERT_TRUE(dict);
-
-  args_dict = nullptr;
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-
-  EXPECT_TRUE(args_dict->GetString("str", &str_value));
-  EXPECT_STREQ("string value 2", str_value.c_str());
-
-  value = nullptr;
-  convertable_dict = nullptr;
-  foo_val = 0;
-  EXPECT_TRUE(args_dict->Get("convert", &value));
-  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
-  EXPECT_TRUE(convertable_dict->GetInteger("foo", &foo_val));
-  EXPECT_EQ(1, foo_val);
-
-  dict = FindNamePhase("both_conv", "X");
-  ASSERT_TRUE(dict);
-
-  args_dict = nullptr;
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-
-  value = nullptr;
-  convertable_dict = nullptr;
-  foo_val = 0;
-  EXPECT_TRUE(args_dict->Get("convert1", &value));
-  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
-  EXPECT_TRUE(args_dict->Get("convert2", &value));
-  ASSERT_TRUE(value->GetAsDictionary(&convertable_dict));
-}
-
-TEST_F(TraceEventTestFixture, PrimitiveArgs) {
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-
-  TRACE_EVENT1("foo", "event1", "int_one", 1);
-  TRACE_EVENT1("foo", "event2", "int_neg_ten", -10);
-  TRACE_EVENT1("foo", "event3", "float_one", 1.0f);
-  TRACE_EVENT1("foo", "event4", "float_half", .5f);
-  TRACE_EVENT1("foo", "event5", "float_neghalf", -.5f);
-  TRACE_EVENT1("foo", "event6", "float_infinity",
-      std::numeric_limits<float>::infinity());
-  TRACE_EVENT1("foo", "event6b", "float_neg_infinity",
-      -std::numeric_limits<float>::infinity());
-  TRACE_EVENT1("foo", "event7", "double_nan",
-      std::numeric_limits<double>::quiet_NaN());
-  void* p = nullptr;
-  TRACE_EVENT1("foo", "event8", "pointer_null", p);
-  p = reinterpret_cast<void*>(0xbadf00d);
-  TRACE_EVENT1("foo", "event9", "pointer_badf00d", p);
-  TRACE_EVENT1("foo", "event10", "bool_true", true);
-  TRACE_EVENT1("foo", "event11", "bool_false", false);
-  TRACE_EVENT1("foo", "event12", "time_null",
-      base::Time());
-  TRACE_EVENT1("foo", "event13", "time_one",
-      base::Time::FromInternalValue(1));
-  TRACE_EVENT1("foo", "event14", "timeticks_null",
-      base::TimeTicks());
-  TRACE_EVENT1("foo", "event15", "timeticks_one",
-      base::TimeTicks::FromInternalValue(1));
-  EndTraceAndFlush();
-
-  const DictionaryValue* args_dict = nullptr;
-  DictionaryValue* dict = nullptr;
-  const Value* value = nullptr;
-  std::string str_value;
-  int int_value;
-  double double_value;
-  bool bool_value;
-
-  dict = FindNamePhase("event1", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetInteger("int_one", &int_value));
-  EXPECT_EQ(1, int_value);
-
-  dict = FindNamePhase("event2", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetInteger("int_neg_ten", &int_value));
-  EXPECT_EQ(-10, int_value);
-
-  // 1f must be serlized to JSON as "1.0" in order to be a double, not an int.
-  dict = FindNamePhase("event3", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->Get("float_one", &value));
-  EXPECT_TRUE(value->is_double());
-  EXPECT_TRUE(value->GetAsDouble(&double_value));
-  EXPECT_EQ(1, double_value);
-
-  // .5f must be serlized to JSON as "0.5".
-  dict = FindNamePhase("event4", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->Get("float_half", &value));
-  EXPECT_TRUE(value->is_double());
-  EXPECT_TRUE(value->GetAsDouble(&double_value));
-  EXPECT_EQ(0.5, double_value);
-
-  // -.5f must be serlized to JSON as "-0.5".
-  dict = FindNamePhase("event5", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->Get("float_neghalf", &value));
-  EXPECT_TRUE(value->is_double());
-  EXPECT_TRUE(value->GetAsDouble(&double_value));
-  EXPECT_EQ(-0.5, double_value);
-
-  // Infinity is serialized to JSON as a string.
-  dict = FindNamePhase("event6", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetString("float_infinity", &str_value));
-  EXPECT_STREQ("Infinity", str_value.c_str());
-  dict = FindNamePhase("event6b", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetString("float_neg_infinity", &str_value));
-  EXPECT_STREQ("-Infinity", str_value.c_str());
-
-  // NaN is serialized to JSON as a string.
-  dict = FindNamePhase("event7", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetString("double_nan", &str_value));
-  EXPECT_STREQ("NaN", str_value.c_str());
-
-  // NULL pointers should be serialized as "0x0".
-  dict = FindNamePhase("event8", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetString("pointer_null", &str_value));
-  EXPECT_STREQ("0x0", str_value.c_str());
-
-  // Other pointers should be serlized as a hex string.
-  dict = FindNamePhase("event9", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetString("pointer_badf00d", &str_value));
-  EXPECT_STREQ("0xbadf00d", str_value.c_str());
-
-  dict = FindNamePhase("event10", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetBoolean("bool_true", &bool_value));
-  EXPECT_TRUE(bool_value);
-
-  dict = FindNamePhase("event11", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetBoolean("bool_false", &bool_value));
-  EXPECT_FALSE(bool_value);
-
-  dict = FindNamePhase("event12", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetInteger("time_null", &int_value));
-  EXPECT_EQ(0, int_value);
-
-  dict = FindNamePhase("event13", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetInteger("time_one", &int_value));
-  EXPECT_EQ(1, int_value);
-
-  dict = FindNamePhase("event14", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetInteger("timeticks_null", &int_value));
-  EXPECT_EQ(0, int_value);
-
-  dict = FindNamePhase("event15", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetInteger("timeticks_one", &int_value));
-  EXPECT_EQ(1, int_value);
-}
-
-TEST_F(TraceEventTestFixture, NameIsEscaped) {
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(kRecordAllCategoryFilter, ""),
-                                      TraceLog::RECORDING_MODE);
-  TRACE_EVENT0("category", "name\\with\\backspaces");
-  EndTraceAndFlush();
-
-  EXPECT_TRUE(FindMatchingValue("cat", "category"));
-  EXPECT_TRUE(FindMatchingValue("name", "name\\with\\backspaces"));
-}
-
-namespace {
-
-bool IsArgNameWhitelisted(const char* arg_name) {
-  return base::MatchPattern(arg_name, "granular_arg_whitelisted");
-}
-
-bool IsTraceEventArgsWhitelisted(const char* category_group_name,
-                                 const char* event_name,
-                                 ArgumentNameFilterPredicate* arg_filter) {
-  if (base::MatchPattern(category_group_name, "toplevel") &&
-      base::MatchPattern(event_name, "*")) {
-    return true;
-  }
-
-  if (base::MatchPattern(category_group_name, "benchmark") &&
-      base::MatchPattern(event_name, "granularly_whitelisted")) {
-    *arg_filter = base::Bind(&IsArgNameWhitelisted);
-    return true;
-  }
-
-  return false;
-}
-
-}  // namespace
-
-TEST_F(TraceEventTestFixture, ArgsWhitelisting) {
-  TraceLog::GetInstance()->SetArgumentFilterPredicate(
-      base::Bind(&IsTraceEventArgsWhitelisted));
-
-  TraceLog::GetInstance()->SetEnabled(
-    TraceConfig(kRecordAllCategoryFilter, "enable-argument-filter"),
-    TraceLog::RECORDING_MODE);
-
-  TRACE_EVENT1("toplevel", "event1", "int_one", 1);
-  TRACE_EVENT1("whitewashed", "event2", "int_two", 1);
-
-  TRACE_EVENT2("benchmark", "granularly_whitelisted",
-               "granular_arg_whitelisted", "whitelisted_value",
-               "granular_arg_blacklisted", "blacklisted_value");
-
-  EndTraceAndFlush();
-
-  const DictionaryValue* args_dict = nullptr;
-  DictionaryValue* dict = nullptr;
-  int int_value;
-
-  dict = FindNamePhase("event1", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_TRUE(args_dict->GetInteger("int_one", &int_value));
-  EXPECT_EQ(1, int_value);
-
-  dict = FindNamePhase("event2", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-  EXPECT_FALSE(args_dict->GetInteger("int_two", &int_value));
-
-  std::string args_string;
-  EXPECT_TRUE(dict->GetString("args", &args_string));
-  EXPECT_EQ(args_string, "__stripped__");
-
-  dict = FindNamePhase("granularly_whitelisted", "X");
-  ASSERT_TRUE(dict);
-  dict->GetDictionary("args", &args_dict);
-  ASSERT_TRUE(args_dict);
-
-  EXPECT_TRUE(args_dict->GetString("granular_arg_whitelisted", &args_string));
-  EXPECT_EQ(args_string, "whitelisted_value");
-
-  EXPECT_TRUE(args_dict->GetString("granular_arg_blacklisted", &args_string));
-  EXPECT_EQ(args_string, "__stripped__");
-}
-
-TEST_F(TraceEventTestFixture, TraceBufferVectorReportFull) {
-  TraceLog* trace_log = TraceLog::GetInstance();
-  trace_log->SetEnabled(
-      TraceConfig(kRecordAllCategoryFilter, ""), TraceLog::RECORDING_MODE);
-  trace_log->logged_events_.reset(
-      TraceBuffer::CreateTraceBufferVectorOfSize(100));
-  do {
-    TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(
-        "all", "with_timestamp", 0, 0, TimeTicks::Now());
-    TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0(
-        "all", "with_timestamp", 0, 0, TimeTicks::Now());
-  } while (!trace_log->BufferIsFull());
-
-  EndTraceAndFlush();
-
-  const DictionaryValue* trace_full_metadata = nullptr;
-
-  trace_full_metadata = FindTraceEntry(trace_parsed_,
-                                       "overflowed_at_ts");
-  std::string phase;
-  double buffer_limit_reached_timestamp = 0;
-
-  EXPECT_TRUE(trace_full_metadata);
-  EXPECT_TRUE(trace_full_metadata->GetString("ph", &phase));
-  EXPECT_EQ("M", phase);
-  EXPECT_TRUE(trace_full_metadata->GetDouble(
-      "args.overflowed_at_ts", &buffer_limit_reached_timestamp));
-  EXPECT_DOUBLE_EQ(
-      static_cast<double>(
-          trace_log->buffer_limit_reached_timestamp_.ToInternalValue()),
-      buffer_limit_reached_timestamp);
-
-  // Test that buffer_limit_reached_timestamp's value is between the timestamp
-  // of the last trace event and current time.
-  DropTracedMetadataRecords();
-  const DictionaryValue* last_trace_event = nullptr;
-  double last_trace_event_timestamp = 0;
-  EXPECT_TRUE(trace_parsed_.GetDictionary(trace_parsed_.GetSize() - 1,
-                                          &last_trace_event));
-  EXPECT_TRUE(last_trace_event->GetDouble("ts", &last_trace_event_timestamp));
-  EXPECT_LE(last_trace_event_timestamp, buffer_limit_reached_timestamp);
-  EXPECT_LE(buffer_limit_reached_timestamp,
-            trace_log->OffsetNow().ToInternalValue());
-}
-
-TEST_F(TraceEventTestFixture, TraceBufferRingBufferGetReturnChunk) {
-  TraceLog::GetInstance()->SetEnabled(
-      TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY),
-      TraceLog::RECORDING_MODE);
-  TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer();
-  size_t capacity = buffer->Capacity();
-  size_t num_chunks = capacity / TraceBufferChunk::kTraceBufferChunkSize;
-  uint32_t last_seq = 0;
-  size_t chunk_index;
-  EXPECT_EQ(0u, buffer->Size());
-
-  std::unique_ptr<TraceBufferChunk* []> chunks(
-      new TraceBufferChunk*[num_chunks]);
-  for (size_t i = 0; i < num_chunks; ++i) {
-    chunks[i] = buffer->GetChunk(&chunk_index).release();
-    EXPECT_TRUE(chunks[i]);
-    EXPECT_EQ(i, chunk_index);
-    EXPECT_GT(chunks[i]->seq(), last_seq);
-    EXPECT_EQ((i + 1) * TraceBufferChunk::kTraceBufferChunkSize,
-              buffer->Size());
-    last_seq = chunks[i]->seq();
-  }
-
-  // Ring buffer is never full.
-  EXPECT_FALSE(buffer->IsFull());
-
-  // Return all chunks in original order.
-  for (size_t i = 0; i < num_chunks; ++i)
-    buffer->ReturnChunk(i, std::unique_ptr<TraceBufferChunk>(chunks[i]));
-
-  // Should recycle the chunks in the returned order.
-  for (size_t i = 0; i < num_chunks; ++i) {
-    chunks[i] = buffer->GetChunk(&chunk_index).release();
-    EXPECT_TRUE(chunks[i]);
-    EXPECT_EQ(i, chunk_index);
-    EXPECT_GT(chunks[i]->seq(), last_seq);
-    last_seq = chunks[i]->seq();
-  }
-
-  // Return all chunks in reverse order.
-  for (size_t i = 0; i < num_chunks; ++i) {
-    buffer->ReturnChunk(num_chunks - i - 1, std::unique_ptr<TraceBufferChunk>(
-                                                chunks[num_chunks - i - 1]));
-  }
-
-  // Should recycle the chunks in the returned order.
-  for (size_t i = 0; i < num_chunks; ++i) {
-    chunks[i] = buffer->GetChunk(&chunk_index).release();
-    EXPECT_TRUE(chunks[i]);
-    EXPECT_EQ(num_chunks - i - 1, chunk_index);
-    EXPECT_GT(chunks[i]->seq(), last_seq);
-    last_seq = chunks[i]->seq();
-  }
-
-  for (size_t i = 0; i < num_chunks; ++i)
-    buffer->ReturnChunk(i, std::unique_ptr<TraceBufferChunk>(chunks[i]));
-
-  TraceLog::GetInstance()->SetDisabled();
-}
-
-TEST_F(TraceEventTestFixture, TraceBufferRingBufferHalfIteration) {
-  TraceLog::GetInstance()->SetEnabled(
-      TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY),
-      TraceLog::RECORDING_MODE);
-  TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer();
-  size_t capacity = buffer->Capacity();
-  size_t num_chunks = capacity / TraceBufferChunk::kTraceBufferChunkSize;
-  size_t chunk_index;
-  EXPECT_EQ(0u, buffer->Size());
-  EXPECT_FALSE(buffer->NextChunk());
-
-  size_t half_chunks = num_chunks / 2;
-  std::unique_ptr<TraceBufferChunk* []> chunks(
-      new TraceBufferChunk*[half_chunks]);
-
-  for (size_t i = 0; i < half_chunks; ++i) {
-    chunks[i] = buffer->GetChunk(&chunk_index).release();
-    EXPECT_TRUE(chunks[i]);
-    EXPECT_EQ(i, chunk_index);
-  }
-  for (size_t i = 0; i < half_chunks; ++i)
-    buffer->ReturnChunk(i, std::unique_ptr<TraceBufferChunk>(chunks[i]));
-
-  for (size_t i = 0; i < half_chunks; ++i)
-    EXPECT_EQ(chunks[i], buffer->NextChunk());
-  EXPECT_FALSE(buffer->NextChunk());
-  TraceLog::GetInstance()->SetDisabled();
-}
-
-TEST_F(TraceEventTestFixture, TraceBufferRingBufferFullIteration) {
-  TraceLog::GetInstance()->SetEnabled(
-      TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY),
-      TraceLog::RECORDING_MODE);
-  TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer();
-  size_t capacity = buffer->Capacity();
-  size_t num_chunks = capacity / TraceBufferChunk::kTraceBufferChunkSize;
-  size_t chunk_index;
-  EXPECT_EQ(0u, buffer->Size());
-  EXPECT_FALSE(buffer->NextChunk());
-
-  std::unique_ptr<TraceBufferChunk* []> chunks(
-      new TraceBufferChunk*[num_chunks]);
-
-  for (size_t i = 0; i < num_chunks; ++i) {
-    chunks[i] = buffer->GetChunk(&chunk_index).release();
-    EXPECT_TRUE(chunks[i]);
-    EXPECT_EQ(i, chunk_index);
-  }
-  for (size_t i = 0; i < num_chunks; ++i)
-    buffer->ReturnChunk(i, std::unique_ptr<TraceBufferChunk>(chunks[i]));
-
-  for (size_t i = 0; i < num_chunks; ++i)
-    EXPECT_TRUE(chunks[i] == buffer->NextChunk());
-  EXPECT_FALSE(buffer->NextChunk());
-  TraceLog::GetInstance()->SetDisabled();
-}
-
-TEST_F(TraceEventTestFixture, TraceRecordAsMuchAsPossibleMode) {
-  TraceLog::GetInstance()->SetEnabled(
-    TraceConfig(kRecordAllCategoryFilter, RECORD_AS_MUCH_AS_POSSIBLE),
-    TraceLog::RECORDING_MODE);
-  TraceBuffer* buffer = TraceLog::GetInstance()->trace_buffer();
-  EXPECT_EQ(512000000UL, buffer->Capacity());
-  TraceLog::GetInstance()->SetDisabled();
-}
-
-void BlockUntilStopped(WaitableEvent* task_start_event,
-                       WaitableEvent* task_stop_event) {
-  task_start_event->Signal();
-  task_stop_event->Wait();
-}
-
-TEST_F(TraceEventTestFixture, SetCurrentThreadBlocksMessageLoopBeforeTracing) {
-  BeginTrace();
-
-  Thread thread("1");
-  WaitableEvent task_complete_event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                    WaitableEvent::InitialState::NOT_SIGNALED);
-  thread.Start();
-  thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&TraceLog::SetCurrentThreadBlocksMessageLoop,
-                          Unretained(TraceLog::GetInstance())));
-
-  thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&TraceWithAllMacroVariants, &task_complete_event));
-  task_complete_event.Wait();
-
-  WaitableEvent task_start_event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                 WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent task_stop_event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                WaitableEvent::InitialState::NOT_SIGNALED);
-  thread.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(&BlockUntilStopped, &task_start_event, &task_stop_event));
-  task_start_event.Wait();
-
-  EndTraceAndFlush();
-  ValidateAllTraceMacrosCreatedData(trace_parsed_);
-
-  task_stop_event.Signal();
-  thread.Stop();
-}
-
-TEST_F(TraceEventTestFixture, ConvertTraceConfigToInternalOptions) {
-  TraceLog* trace_log = TraceLog::GetInstance();
-  EXPECT_EQ(TraceLog::kInternalRecordUntilFull,
-            trace_log->GetInternalOptionsFromTraceConfig(
-                TraceConfig(kRecordAllCategoryFilter, RECORD_UNTIL_FULL)));
-
-  EXPECT_EQ(TraceLog::kInternalRecordContinuously,
-            trace_log->GetInternalOptionsFromTraceConfig(
-                TraceConfig(kRecordAllCategoryFilter, RECORD_CONTINUOUSLY)));
-
-  EXPECT_EQ(TraceLog::kInternalEchoToConsole,
-            trace_log->GetInternalOptionsFromTraceConfig(
-                TraceConfig(kRecordAllCategoryFilter, ECHO_TO_CONSOLE)));
-
-  EXPECT_EQ(TraceLog::kInternalEchoToConsole,
-            trace_log->GetInternalOptionsFromTraceConfig(
-                TraceConfig("*", "trace-to-console,enable-systrace")));
-}
-
-void SetBlockingFlagAndBlockUntilStopped(WaitableEvent* task_start_event,
-                                         WaitableEvent* task_stop_event) {
-  TraceLog::GetInstance()->SetCurrentThreadBlocksMessageLoop();
-  BlockUntilStopped(task_start_event, task_stop_event);
-}
-
-TEST_F(TraceEventTestFixture, SetCurrentThreadBlocksMessageLoopAfterTracing) {
-  BeginTrace();
-
-  Thread thread("1");
-  WaitableEvent task_complete_event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                    WaitableEvent::InitialState::NOT_SIGNALED);
-  thread.Start();
-
-  thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&TraceWithAllMacroVariants, &task_complete_event));
-  task_complete_event.Wait();
-
-  WaitableEvent task_start_event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                 WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent task_stop_event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                WaitableEvent::InitialState::NOT_SIGNALED);
-  thread.task_runner()->PostTask(FROM_HERE,
-                                 BindOnce(&SetBlockingFlagAndBlockUntilStopped,
-                                          &task_start_event, &task_stop_event));
-  task_start_event.Wait();
-
-  EndTraceAndFlush();
-  ValidateAllTraceMacrosCreatedData(trace_parsed_);
-
-  task_stop_event.Signal();
-  thread.Stop();
-}
-
-TEST_F(TraceEventTestFixture, ThreadOnceBlocking) {
-  BeginTrace();
-
-  Thread thread("1");
-  WaitableEvent task_complete_event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                    WaitableEvent::InitialState::NOT_SIGNALED);
-  thread.Start();
-
-  thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&TraceWithAllMacroVariants, &task_complete_event));
-  task_complete_event.Wait();
-
-  WaitableEvent task_start_event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                 WaitableEvent::InitialState::NOT_SIGNALED);
-  WaitableEvent task_stop_event(WaitableEvent::ResetPolicy::AUTOMATIC,
-                                WaitableEvent::InitialState::NOT_SIGNALED);
-  thread.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(&BlockUntilStopped, &task_start_event, &task_stop_event));
-  task_start_event.Wait();
-
-  // The thread will timeout in this flush.
-  EndTraceAndFlushInThreadWithMessageLoop();
-  Clear();
-
-  // Let the thread's message loop continue to spin.
-  task_stop_event.Signal();
-
-  // The following sequence ensures that the FlushCurrentThread task has been
-  // executed in the thread before continuing.
-  thread.task_runner()->PostTask(
-      FROM_HERE,
-      BindOnce(&BlockUntilStopped, &task_start_event, &task_stop_event));
-  task_start_event.Wait();
-  task_stop_event.Signal();
-  Clear();
-
-  // TraceLog should discover the generation mismatch and recover the thread
-  // local buffer for the thread without any error.
-  BeginTrace();
-  thread.task_runner()->PostTask(
-      FROM_HERE, BindOnce(&TraceWithAllMacroVariants, &task_complete_event));
-  task_complete_event.Wait();
-  EndTraceAndFlushInThreadWithMessageLoop();
-  ValidateAllTraceMacrosCreatedData(trace_parsed_);
-}
-
-std::string* g_log_buffer = nullptr;
-bool MockLogMessageHandler(int, const char*, int, size_t,
-                           const std::string& str) {
-  if (!g_log_buffer)
-    g_log_buffer = new std::string();
-  g_log_buffer->append(str);
-  return false;
-}
-
-TEST_F(TraceEventTestFixture, EchoToConsole) {
-  logging::LogMessageHandlerFunction old_log_message_handler =
-      logging::GetLogMessageHandler();
-  logging::SetLogMessageHandler(MockLogMessageHandler);
-
-  TraceLog::GetInstance()->SetEnabled(
-      TraceConfig(kRecordAllCategoryFilter, ECHO_TO_CONSOLE),
-      TraceLog::RECORDING_MODE);
-  TRACE_EVENT_BEGIN0("a", "begin_end");
-  {
-    TRACE_EVENT0("b", "duration");
-    TRACE_EVENT0("b1", "duration1");
-  }
-  TRACE_EVENT_INSTANT0("c", "instant", TRACE_EVENT_SCOPE_GLOBAL);
-  TRACE_EVENT_END0("a", "begin_end");
-
-  EXPECT_NE(std::string::npos, g_log_buffer->find("begin_end[a]\x1b"));
-  EXPECT_NE(std::string::npos, g_log_buffer->find("| duration[b]\x1b"));
-  EXPECT_NE(std::string::npos, g_log_buffer->find("| | duration1[b1]\x1b"));
-  EXPECT_NE(std::string::npos, g_log_buffer->find("| | duration1[b1] ("));
-  EXPECT_NE(std::string::npos, g_log_buffer->find("| duration[b] ("));
-  EXPECT_NE(std::string::npos, g_log_buffer->find("| instant[c]\x1b"));
-  EXPECT_NE(std::string::npos, g_log_buffer->find("begin_end[a] ("));
-
-  EndTraceAndFlush();
-  delete g_log_buffer;
-  logging::SetLogMessageHandler(old_log_message_handler);
-  g_log_buffer = nullptr;
-}
-
-bool LogMessageHandlerWithTraceEvent(int, const char*, int, size_t,
-                                     const std::string&) {
-  TRACE_EVENT0("log", "trace_event");
-  return false;
-}
-
-TEST_F(TraceEventTestFixture, EchoToConsoleTraceEventRecursion) {
-  logging::LogMessageHandlerFunction old_log_message_handler =
-      logging::GetLogMessageHandler();
-  logging::SetLogMessageHandler(LogMessageHandlerWithTraceEvent);
-
-  TraceLog::GetInstance()->SetEnabled(
-      TraceConfig(kRecordAllCategoryFilter, ECHO_TO_CONSOLE),
-      TraceLog::RECORDING_MODE);
-  {
-    // This should not cause deadlock or infinite recursion.
-    TRACE_EVENT0("b", "duration");
-  }
-
-  EndTraceAndFlush();
-  logging::SetLogMessageHandler(old_log_message_handler);
-}
-
-TEST_F(TraceEventTestFixture, TimeOffset) {
-  BeginTrace();
-  // Let TraceLog timer start from 0.
-  TimeDelta time_offset = TimeTicks::Now() - TimeTicks();
-  TraceLog::GetInstance()->SetTimeOffset(time_offset);
-
-  {
-    TRACE_EVENT0("all", "duration1");
-    TRACE_EVENT0("all", "duration2");
-  }
-  TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(
-      "all", "with_timestamp", 0, 0, TimeTicks::Now());
-  TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0(
-      "all", "with_timestamp", 0, 0, TimeTicks::Now());
-
-  EndTraceAndFlush();
-  DropTracedMetadataRecords();
-
-  double end_time = static_cast<double>(
-      (TimeTicks::Now() - time_offset).ToInternalValue());
-  double last_timestamp = 0;
-  for (size_t i = 0; i < trace_parsed_.GetSize(); ++i) {
-    const DictionaryValue* item;
-    EXPECT_TRUE(trace_parsed_.GetDictionary(i, &item));
-    double timestamp;
-    EXPECT_TRUE(item->GetDouble("ts", &timestamp));
-    EXPECT_GE(timestamp, last_timestamp);
-    EXPECT_LE(timestamp, end_time);
-    last_timestamp = timestamp;
-  }
-}
-
-TEST_F(TraceEventTestFixture, TraceFilteringMode) {
-  const char config_json[] =
-      "{"
-      "  \"event_filters\": ["
-      "     {"
-      "       \"filter_predicate\": \"testing_predicate\", "
-      "       \"included_categories\": [\"*\"]"
-      "     }"
-      "  ]"
-      "}";
-
-  // Run RECORDING_MODE within FILTERING_MODE:
-  TestEventFilter::HitsCounter filter_hits_counter;
-  TestEventFilter::set_filter_return_value(true);
-  TraceLog::GetInstance()->SetFilterFactoryForTesting(TestEventFilter::Factory);
-
-  // Only filtering mode is enabled with test filters.
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(config_json),
-                                      TraceLog::FILTERING_MODE);
-  EXPECT_EQ(TraceLog::FILTERING_MODE, TraceLog::GetInstance()->enabled_modes());
-  {
-    void* ptr = this;
-    TRACE_EVENT0("c0", "name0");
-    TRACE_EVENT_ASYNC_BEGIN0("c1", "name1", ptr);
-    TRACE_EVENT_INSTANT0("c0", "name0", TRACE_EVENT_SCOPE_THREAD);
-    TRACE_EVENT_ASYNC_END0("c1", "name1", ptr);
-  }
-
-  // Recording mode is enabled when filtering mode is turned on.
-  TraceLog::GetInstance()->SetEnabled(TraceConfig("", ""),
-                                      TraceLog::RECORDING_MODE);
-  EXPECT_EQ(TraceLog::RECORDING_MODE | TraceLog::FILTERING_MODE,
-            TraceLog::GetInstance()->enabled_modes());
-  {
-    TRACE_EVENT0("c2", "name2");
-  }
-  // Only recording mode is disabled and filtering mode will continue to run.
-  TraceLog::GetInstance()->SetDisabled(TraceLog::RECORDING_MODE);
-  EXPECT_EQ(TraceLog::FILTERING_MODE, TraceLog::GetInstance()->enabled_modes());
-
-  {
-    TRACE_EVENT0("c0", "name0");
-  }
-  // Filtering mode is disabled and no tracing mode should be enabled.
-  TraceLog::GetInstance()->SetDisabled(TraceLog::FILTERING_MODE);
-  EXPECT_EQ(0, TraceLog::GetInstance()->enabled_modes());
-
-  EndTraceAndFlush();
-  EXPECT_FALSE(FindMatchingValue("cat", "c0"));
-  EXPECT_FALSE(FindMatchingValue("cat", "c1"));
-  EXPECT_FALSE(FindMatchingValue("name", "name0"));
-  EXPECT_FALSE(FindMatchingValue("name", "name1"));
-  EXPECT_TRUE(FindMatchingValue("cat", "c2"));
-  EXPECT_TRUE(FindMatchingValue("name", "name2"));
-  EXPECT_EQ(6u, filter_hits_counter.filter_trace_event_hit_count);
-  EXPECT_EQ(3u, filter_hits_counter.end_event_hit_count);
-  Clear();
-  filter_hits_counter.Reset();
-
-  // Run FILTERING_MODE within RECORDING_MODE:
-  // Only recording mode is enabled and all events must be recorded.
-  TraceLog::GetInstance()->SetEnabled(TraceConfig("", ""),
-                                      TraceLog::RECORDING_MODE);
-  EXPECT_EQ(TraceLog::RECORDING_MODE, TraceLog::GetInstance()->enabled_modes());
-  {
-    TRACE_EVENT0("c0", "name0");
-  }
-
-  // Filtering mode is also enabled and all events must be filtered-out.
-  TestEventFilter::set_filter_return_value(false);
-  TraceLog::GetInstance()->SetEnabled(TraceConfig(config_json),
-                                      TraceLog::FILTERING_MODE);
-  EXPECT_EQ(TraceLog::RECORDING_MODE | TraceLog::FILTERING_MODE,
-            TraceLog::GetInstance()->enabled_modes());
-  {
-    TRACE_EVENT0("c1", "name1");
-  }
-  // Only filtering mode is disabled and recording mode should continue to run
-  // with all events being recorded.
-  TraceLog::GetInstance()->SetDisabled(TraceLog::FILTERING_MODE);
-  EXPECT_EQ(TraceLog::RECORDING_MODE, TraceLog::GetInstance()->enabled_modes());
-
-  {
-    TRACE_EVENT0("c2", "name2");
-  }
-  // Recording mode is disabled and no tracing mode should be enabled.
-  TraceLog::GetInstance()->SetDisabled(TraceLog::RECORDING_MODE);
-  EXPECT_EQ(0, TraceLog::GetInstance()->enabled_modes());
-
-  EndTraceAndFlush();
-  EXPECT_TRUE(FindMatchingValue("cat", "c0"));
-  EXPECT_TRUE(FindMatchingValue("cat", "c2"));
-  EXPECT_TRUE(FindMatchingValue("name", "name0"));
-  EXPECT_TRUE(FindMatchingValue("name", "name2"));
-  EXPECT_FALSE(FindMatchingValue("cat", "c1"));
-  EXPECT_FALSE(FindMatchingValue("name", "name1"));
-  EXPECT_EQ(1u, filter_hits_counter.filter_trace_event_hit_count);
-  EXPECT_EQ(1u, filter_hits_counter.end_event_hit_count);
-  Clear();
-}
-
-TEST_F(TraceEventTestFixture, EventFiltering) {
-  const char config_json[] =
-      "{"
-      "  \"included_categories\": ["
-      "    \"filtered_cat\","
-      "    \"unfiltered_cat\","
-      "    \"" TRACE_DISABLED_BY_DEFAULT("filtered_cat") "\","
-      "    \"" TRACE_DISABLED_BY_DEFAULT("unfiltered_cat") "\"],"
-      "  \"event_filters\": ["
-      "     {"
-      "       \"filter_predicate\": \"testing_predicate\", "
-      "       \"included_categories\": ["
-      "         \"filtered_cat\","
-      "         \"" TRACE_DISABLED_BY_DEFAULT("filtered_cat") "\"]"
-      "     }"
-      "    "
-      "  ]"
-      "}";
-
-  TestEventFilter::HitsCounter filter_hits_counter;
-  TestEventFilter::set_filter_return_value(true);
-  TraceLog::GetInstance()->SetFilterFactoryForTesting(TestEventFilter::Factory);
-
-  TraceConfig trace_config(config_json);
-  TraceLog::GetInstance()->SetEnabled(
-      trace_config, TraceLog::RECORDING_MODE | TraceLog::FILTERING_MODE);
-  ASSERT_TRUE(TraceLog::GetInstance()->IsEnabled());
-
-  TRACE_EVENT0("filtered_cat", "a snake");
-  TRACE_EVENT0("filtered_cat", "a mushroom");
-  TRACE_EVENT0("unfiltered_cat", "a horse");
-
-  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("filtered_cat"), "a dog");
-  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("unfiltered_cat"), "a pony");
-
-  // This is scoped so we can test the end event being filtered.
-  { TRACE_EVENT0("filtered_cat", "another cat whoa"); }
-
-  EndTraceAndFlush();
-
-  EXPECT_EQ(4u, filter_hits_counter.filter_trace_event_hit_count);
-  EXPECT_EQ(1u, filter_hits_counter.end_event_hit_count);
-}
-
-TEST_F(TraceEventTestFixture, EventWhitelistFiltering) {
-  std::string config_json = StringPrintf(
-      "{"
-      "  \"included_categories\": ["
-      "    \"filtered_cat\","
-      "    \"unfiltered_cat\","
-      "    \"" TRACE_DISABLED_BY_DEFAULT("filtered_cat") "\"],"
-      "  \"event_filters\": ["
-      "     {"
-      "       \"filter_predicate\": \"%s\", "
-      "       \"included_categories\": ["
-      "         \"filtered_cat\","
-      "         \"" TRACE_DISABLED_BY_DEFAULT("*") "\"], "
-      "       \"filter_args\": {"
-      "           \"event_name_whitelist\": [\"a snake\", \"a dog\"]"
-      "         }"
-      "     }"
-      "    "
-      "  ]"
-      "}",
-      EventNameFilter::kName);
-
-  TraceConfig trace_config(config_json);
-  TraceLog::GetInstance()->SetEnabled(
-      trace_config, TraceLog::RECORDING_MODE | TraceLog::FILTERING_MODE);
-  EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
-
-  TRACE_EVENT0("filtered_cat", "a snake");
-  TRACE_EVENT0("filtered_cat", "a mushroom");
-  TRACE_EVENT0("unfiltered_cat", "a cat");
-  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("filtered_cat"), "a dog");
-  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("filtered_cat"), "a pony");
-
-  EndTraceAndFlush();
-
-  EXPECT_TRUE(FindMatchingValue("name", "a snake"));
-  EXPECT_FALSE(FindMatchingValue("name", "a mushroom"));
-  EXPECT_TRUE(FindMatchingValue("name", "a cat"));
-  EXPECT_TRUE(FindMatchingValue("name", "a dog"));
-  EXPECT_FALSE(FindMatchingValue("name", "a pony"));
-}
-
-TEST_F(TraceEventTestFixture, HeapProfilerFiltering) {
-  std::string config_json = StringPrintf(
-      "{"
-      "  \"included_categories\": ["
-      "    \"filtered_cat\","
-      "    \"unfiltered_cat\","
-      "    \"" TRACE_DISABLED_BY_DEFAULT("filtered_cat") "\","
-      "    \"" TRACE_DISABLED_BY_DEFAULT("unfiltered_cat") "\"],"
-      "  \"excluded_categories\": [\"excluded_cat\"],"
-      "  \"event_filters\": ["
-      "     {"
-      "       \"filter_predicate\": \"%s\", "
-      "       \"included_categories\": ["
-      "         \"*\","
-      "         \"" TRACE_DISABLED_BY_DEFAULT("filtered_cat") "\"]"
-      "     }"
-      "  ]"
-      "}",
-      HeapProfilerEventFilter::kName);
-
-  TraceConfig trace_config(config_json);
-  TraceLog::GetInstance()->SetEnabled(
-      trace_config, TraceLog::RECORDING_MODE | TraceLog::FILTERING_MODE);
-  EXPECT_TRUE(TraceLog::GetInstance()->IsEnabled());
-
-  TRACE_EVENT0("filtered_cat", "a snake");
-  TRACE_EVENT0("excluded_cat", "a mushroom");
-  TRACE_EVENT0("unfiltered_cat", "a cat");
-  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("filtered_cat"), "a dog");
-  TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("unfiltered_cat"), "a pony");
-
-  EndTraceAndFlush();
-
-  // The predicate should not change behavior of the trace events.
-  EXPECT_TRUE(FindMatchingValue("name", "a snake"));
-  EXPECT_FALSE(FindMatchingValue("name", "a mushroom"));
-  EXPECT_TRUE(FindMatchingValue("name", "a cat"));
-  EXPECT_TRUE(FindMatchingValue("name", "a dog"));
-  EXPECT_TRUE(FindMatchingValue("name", "a pony"));
-}
-
-TEST_F(TraceEventTestFixture, ClockSyncEventsAreAlwaysAddedToTrace) {
-  BeginSpecificTrace("-*");
-  TRACE_EVENT_CLOCK_SYNC_RECEIVER(1);
-  EndTraceAndFlush();
-  EXPECT_TRUE(FindNamePhase("clock_sync", "c"));
-}
-
-}  // namespace trace_event
-}  // namespace base
diff --git a/base/tuple_unittest.cc b/base/tuple_unittest.cc
deleted file mode 100644
index 4b38797..0000000
--- a/base/tuple_unittest.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/tuple.h"
-
-#include "base/compiler_specific.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-void DoAdd(int a, int b, int c, int* res) {
-  *res = a + b + c;
-}
-
-struct Addy {
-  Addy() = default;
-  void DoAdd(int a, int b, int c, int d, int* res) {
-    *res = a + b + c + d;
-  }
-};
-
-struct Addz {
-  Addz() = default;
-  void DoAdd(int a, int b, int c, int d, int e, int* res) {
-    *res = a + b + c + d + e;
-  }
-};
-
-}  // namespace
-
-TEST(TupleTest, Basic) {
-  std::tuple<> t0 = std::make_tuple();
-  ALLOW_UNUSED_LOCAL(t0);
-  std::tuple<int> t1(1);
-  std::tuple<int, const char*> t2 =
-      std::make_tuple(1, static_cast<const char*>("wee"));
-  ALLOW_UNUSED_LOCAL(t2);
-  std::tuple<int, int, int> t3(1, 2, 3);
-  ALLOW_UNUSED_LOCAL(t3);
-  std::tuple<int, int, int, int*> t4(1, 2, 3, &std::get<0>(t1));
-  std::tuple<int, int, int, int, int*> t5(1, 2, 3, 4, &std::get<0>(t4));
-  std::tuple<int, int, int, int, int, int*> t6(1, 2, 3, 4, 5, &std::get<0>(t4));
-
-  EXPECT_EQ(1, std::get<0>(t1));
-  DispatchToFunction(&DoAdd, t4);
-  EXPECT_EQ(6, std::get<0>(t1));
-
-  int res = 0;
-  DispatchToFunction(&DoAdd, std::make_tuple(9, 8, 7, &res));
-  EXPECT_EQ(24, res);
-
-  Addy addy;
-  EXPECT_EQ(1, std::get<0>(t4));
-  DispatchToMethod(&addy, &Addy::DoAdd, t5);
-  EXPECT_EQ(10, std::get<0>(t4));
-
-  Addz addz;
-  EXPECT_EQ(10, std::get<0>(t4));
-  DispatchToMethod(&addz, &Addz::DoAdd, t6);
-  EXPECT_EQ(15, std::get<0>(t4));
-}
-
-namespace {
-
-struct CopyLogger {
-  CopyLogger() { ++TimesConstructed; }
-  CopyLogger(const CopyLogger& tocopy) { ++TimesConstructed; ++TimesCopied; }
-  ~CopyLogger() = default;
-
-  static int TimesCopied;
-  static int TimesConstructed;
-};
-
-void SomeLoggerMethRef(const CopyLogger& logy, const CopyLogger* ptr, bool* b) {
-  *b = &logy == ptr;
-}
-
-void SomeLoggerMethCopy(CopyLogger logy, const CopyLogger* ptr, bool* b) {
-  *b = &logy == ptr;
-}
-
-int CopyLogger::TimesCopied = 0;
-int CopyLogger::TimesConstructed = 0;
-
-}  // namespace
-
-TEST(TupleTest, Copying) {
-  CopyLogger logger;
-  EXPECT_EQ(0, CopyLogger::TimesCopied);
-  EXPECT_EQ(1, CopyLogger::TimesConstructed);
-
-  bool res = false;
-
-  // Creating the tuple should copy the class to store internally in the tuple.
-  std::tuple<CopyLogger, CopyLogger*, bool*> tuple(logger, &logger, &res);
-  std::get<CopyLogger*>(tuple) = &std::get<CopyLogger>(tuple);
-  EXPECT_EQ(2, CopyLogger::TimesConstructed);
-  EXPECT_EQ(1, CopyLogger::TimesCopied);
-
-  // Our internal Logger and the one passed to the function should be the same.
-  res = false;
-  DispatchToFunction(&SomeLoggerMethRef, tuple);
-  EXPECT_TRUE(res);
-  EXPECT_EQ(2, CopyLogger::TimesConstructed);
-  EXPECT_EQ(1, CopyLogger::TimesCopied);
-
-  // Now they should be different, since the function call will make a copy.
-  res = false;
-  DispatchToFunction(&SomeLoggerMethCopy, tuple);
-  EXPECT_FALSE(res);
-  EXPECT_EQ(3, CopyLogger::TimesConstructed);
-  EXPECT_EQ(2, CopyLogger::TimesCopied);
-}
-
-}  // namespace base
diff --git a/base/unguessable_token_unittest.cc b/base/unguessable_token_unittest.cc
deleted file mode 100644
index b70cc72..0000000
--- a/base/unguessable_token_unittest.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/unguessable_token.h"
-
-#include <memory>
-#include <sstream>
-#include <type_traits>
-
-#include "base/value_conversions.h"
-#include "base/values.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-void TestSmallerThanOperator(const UnguessableToken& a,
-                             const UnguessableToken& b) {
-  EXPECT_TRUE(a < b);
-  EXPECT_FALSE(b < a);
-}
-
-TEST(UnguessableTokenTest, VerifyEqualityOperators) {
-  // Deserialize is used for testing purposes.
-  // Use UnguessableToken::Create() in production code instead.
-  UnguessableToken token = UnguessableToken::Deserialize(1, 2);
-  UnguessableToken same_token = UnguessableToken::Deserialize(1, 2);
-  UnguessableToken diff_token = UnguessableToken::Deserialize(1, 3);
-
-  EXPECT_TRUE(token == token);
-  EXPECT_FALSE(token != token);
-
-  EXPECT_TRUE(token == same_token);
-  EXPECT_FALSE(token != same_token);
-
-  EXPECT_FALSE(token == diff_token);
-  EXPECT_FALSE(diff_token == token);
-  EXPECT_TRUE(token != diff_token);
-  EXPECT_TRUE(diff_token != token);
-}
-
-TEST(UnguessableTokenTest, VerifyConstructors) {
-  UnguessableToken token = UnguessableToken::Create();
-  EXPECT_FALSE(token.is_empty());
-  EXPECT_TRUE(token);
-
-  UnguessableToken copied_token(token);
-  EXPECT_TRUE(copied_token);
-  EXPECT_EQ(token, copied_token);
-
-  UnguessableToken uninitialized;
-  EXPECT_TRUE(uninitialized.is_empty());
-  EXPECT_FALSE(uninitialized);
-
-  EXPECT_TRUE(UnguessableToken().is_empty());
-  EXPECT_FALSE(UnguessableToken());
-}
-
-TEST(UnguessableTokenTest, VerifySerialization) {
-  UnguessableToken token = UnguessableToken::Create();
-
-  uint64_t high = token.GetHighForSerialization();
-  uint64_t low = token.GetLowForSerialization();
-
-  EXPECT_TRUE(high);
-  EXPECT_TRUE(low);
-
-  UnguessableToken Deserialized = UnguessableToken::Deserialize(high, low);
-  EXPECT_EQ(token, Deserialized);
-}
-
-TEST(UnguessableTokenTest, VerifyValueSerialization) {
-  UnguessableToken token = UnguessableToken::Create();
-  std::unique_ptr<Value> value = CreateUnguessableTokenValue(token);
-
-  UnguessableToken deserialized;
-  EXPECT_TRUE(GetValueAsUnguessableToken(*value, &deserialized));
-  EXPECT_EQ(token, deserialized);
-}
-
-// Common case (~88% of the time) - no leading zeroes in high_ nor low_.
-TEST(UnguessableTokenTest, VerifyToString1) {
-  UnguessableToken token =
-      UnguessableToken::Deserialize(0x1234567890ABCDEF, 0xFEDCBA0987654321);
-  std::string expected = "1234567890ABCDEFFEDCBA0987654321";
-
-  EXPECT_EQ(expected, token.ToString());
-
-  std::string expected_stream = "(1234567890ABCDEFFEDCBA0987654321)";
-  std::stringstream stream;
-  stream << token;
-  EXPECT_EQ(expected_stream, stream.str());
-}
-
-// Less common case - leading zeroes in high_ or low_ (testing with both).
-TEST(UnguessableTokenTest, VerifyToString2) {
-  UnguessableToken token = UnguessableToken::Deserialize(0x123, 0xABC);
-  std::string expected = "00000000000001230000000000000ABC";
-
-  EXPECT_EQ(expected, token.ToString());
-
-  std::string expected_stream = "(00000000000001230000000000000ABC)";
-  std::stringstream stream;
-  stream << token;
-  EXPECT_EQ(expected_stream, stream.str());
-}
-
-TEST(UnguessableTokenTest, VerifyToStringUniqueness) {
-  const UnguessableToken token1 =
-      UnguessableToken::Deserialize(0x0000000012345678, 0x0000000123456789);
-  const UnguessableToken token2 =
-      UnguessableToken::Deserialize(0x0000000123456781, 0x0000000023456789);
-  EXPECT_NE(token1.ToString(), token2.ToString());
-}
-
-TEST(UnguessableTokenTest, VerifySmallerThanOperator) {
-  // Deserialize is used for testing purposes.
-  // Use UnguessableToken::Create() in production code instead.
-  {
-    SCOPED_TRACE("a.low < b.low and a.high == b.high.");
-    TestSmallerThanOperator(UnguessableToken::Deserialize(0, 1),
-                            UnguessableToken::Deserialize(0, 5));
-  }
-  {
-    SCOPED_TRACE("a.low == b.low and a.high < b.high.");
-    TestSmallerThanOperator(UnguessableToken::Deserialize(1, 0),
-                            UnguessableToken::Deserialize(5, 0));
-  }
-  {
-    SCOPED_TRACE("a.low < b.low and a.high < b.high.");
-    TestSmallerThanOperator(UnguessableToken::Deserialize(1, 1),
-                            UnguessableToken::Deserialize(5, 5));
-  }
-  {
-    SCOPED_TRACE("a.low > b.low and a.high < b.high.");
-    TestSmallerThanOperator(UnguessableToken::Deserialize(1, 10),
-                            UnguessableToken::Deserialize(10, 1));
-  }
-}
-
-TEST(UnguessableTokenTest, VerifyHash) {
-  UnguessableToken token = UnguessableToken::Create();
-
-  EXPECT_EQ(base::HashInts64(token.GetHighForSerialization(),
-                             token.GetLowForSerialization()),
-            UnguessableTokenHash()(token));
-}
-
-TEST(UnguessableTokenTest, VerifyBasicUniqueness) {
-  EXPECT_NE(UnguessableToken::Create(), UnguessableToken::Create());
-
-  UnguessableToken token = UnguessableToken::Create();
-  EXPECT_NE(token.GetHighForSerialization(), token.GetLowForSerialization());
-}
-}
diff --git a/base/value_iterators_unittest.cc b/base/value_iterators_unittest.cc
deleted file mode 100644
index ed86182..0000000
--- a/base/value_iterators_unittest.cc
+++ /dev/null
@@ -1,335 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/value_iterators.h"
-
-#include <type_traits>
-
-#include "base/memory/ptr_util.h"
-#include "base/values.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace detail {
-
-namespace {
-
-// Implementation of std::equal variant that is missing in C++11.
-template <class BinaryPredicate, class InputIterator1, class InputIterator2>
-bool are_equal(InputIterator1 first1,
-               InputIterator1 last1,
-               InputIterator2 first2,
-               InputIterator2 last2,
-               BinaryPredicate pred) {
-  for (; first1 != last1 && first2 != last2; ++first1, ++first2) {
-    if (!pred(*first1, *first2))
-      return false;
-  }
-  return first1 == last1 && first2 == last2;
-}
-
-}  // namespace
-
-TEST(ValueIteratorsTest, SameDictStorage) {
-  static_assert(std::is_same<Value::DictStorage, DictStorage>::value,
-                "DictStorage differs between Value and Value Iterators.");
-}
-
-TEST(ValueIteratorsTest, IsAssignable) {
-  static_assert(
-      !std::is_assignable<dict_iterator::reference::first_type, std::string>(),
-      "Can assign strings to dict_iterator");
-
-  static_assert(
-      std::is_assignable<dict_iterator::reference::second_type, Value>(),
-      "Can't assign Values to dict_iterator");
-
-  static_assert(!std::is_assignable<const_dict_iterator::reference::first_type,
-                                    std::string>(),
-                "Can assign strings to const_dict_iterator");
-
-  static_assert(
-      !std::is_assignable<const_dict_iterator::reference::second_type, Value>(),
-      "Can assign Values to const_dict_iterator");
-}
-
-TEST(ValueIteratorsTest, DictIteratorOperatorStar) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-
-  using iterator = dict_iterator;
-  iterator iter(storage.begin());
-  EXPECT_EQ("0", (*iter).first);
-  EXPECT_EQ(Value(0), (*iter).second);
-
-  (*iter).second = Value(1);
-  EXPECT_EQ(Value(1), *storage["0"]);
-}
-
-TEST(ValueIteratorsTest, DictIteratorOperatorArrow) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-
-  using iterator = dict_iterator;
-  iterator iter(storage.begin());
-  EXPECT_EQ("0", iter->first);
-  EXPECT_EQ(Value(0), iter->second);
-
-  iter->second = Value(1);
-  EXPECT_EQ(Value(1), *storage["0"]);
-}
-
-TEST(ValueIteratorsTest, DictIteratorPreIncrement) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-  storage.emplace("1", std::make_unique<Value>(1));
-
-  using iterator = dict_iterator;
-  iterator iter(storage.begin());
-  EXPECT_EQ("0", iter->first);
-  EXPECT_EQ(Value(0), iter->second);
-
-  iterator& iter_ref = ++iter;
-  EXPECT_EQ(&iter, &iter_ref);
-
-  EXPECT_EQ("1", iter_ref->first);
-  EXPECT_EQ(Value(1), iter_ref->second);
-}
-
-TEST(ValueIteratorsTest, DictIteratorPostIncrement) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-  storage.emplace("1", std::make_unique<Value>(1));
-
-  using iterator = dict_iterator;
-  iterator iter(storage.begin());
-  iterator iter_old = iter++;
-
-  EXPECT_EQ("0", iter_old->first);
-  EXPECT_EQ(Value(0), iter_old->second);
-
-  EXPECT_EQ("1", iter->first);
-  EXPECT_EQ(Value(1), iter->second);
-}
-
-TEST(ValueIteratorsTest, DictIteratorPreDecrement) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-  storage.emplace("1", std::make_unique<Value>(1));
-
-  using iterator = dict_iterator;
-  iterator iter(++storage.begin());
-  EXPECT_EQ("1", iter->first);
-  EXPECT_EQ(Value(1), iter->second);
-
-  iterator& iter_ref = --iter;
-  EXPECT_EQ(&iter, &iter_ref);
-
-  EXPECT_EQ("0", iter_ref->first);
-  EXPECT_EQ(Value(0), iter_ref->second);
-}
-
-TEST(ValueIteratorsTest, DictIteratorPostDecrement) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-  storage.emplace("1", std::make_unique<Value>(1));
-
-  using iterator = dict_iterator;
-  iterator iter(++storage.begin());
-  iterator iter_old = iter--;
-
-  EXPECT_EQ("1", iter_old->first);
-  EXPECT_EQ(Value(1), iter_old->second);
-
-  EXPECT_EQ("0", iter->first);
-  EXPECT_EQ(Value(0), iter->second);
-}
-
-TEST(ValueIteratorsTest, DictIteratorOperatorEQ) {
-  DictStorage storage;
-  using iterator = dict_iterator;
-  EXPECT_EQ(iterator(storage.begin()), iterator(storage.begin()));
-  EXPECT_EQ(iterator(storage.end()), iterator(storage.end()));
-}
-
-TEST(ValueIteratorsTest, DictIteratorOperatorNE) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-
-  using iterator = dict_iterator;
-  EXPECT_NE(iterator(storage.begin()), iterator(storage.end()));
-}
-
-TEST(ValueIteratorsTest, ConstDictIteratorOperatorStar) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-
-  using iterator = const_dict_iterator;
-  iterator iter(storage.begin());
-  EXPECT_EQ("0", (*iter).first);
-  EXPECT_EQ(Value(0), (*iter).second);
-}
-
-TEST(ValueIteratorsTest, ConstDictIteratorOperatorArrow) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-
-  using iterator = const_dict_iterator;
-  iterator iter(storage.begin());
-  EXPECT_EQ("0", iter->first);
-  EXPECT_EQ(Value(0), iter->second);
-}
-
-TEST(ValueIteratorsTest, ConstDictIteratorPreIncrement) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-  storage.emplace("1", std::make_unique<Value>(1));
-
-  using iterator = const_dict_iterator;
-  iterator iter(storage.begin());
-  EXPECT_EQ("0", iter->first);
-  EXPECT_EQ(Value(0), iter->second);
-
-  iterator& iter_ref = ++iter;
-  EXPECT_EQ(&iter, &iter_ref);
-
-  EXPECT_EQ("1", iter_ref->first);
-  EXPECT_EQ(Value(1), iter_ref->second);
-}
-
-TEST(ValueIteratorsTest, ConstDictIteratorPostIncrement) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-  storage.emplace("1", std::make_unique<Value>(1));
-
-  using iterator = const_dict_iterator;
-  iterator iter(storage.begin());
-  iterator iter_old = iter++;
-
-  EXPECT_EQ("0", iter_old->first);
-  EXPECT_EQ(Value(0), iter_old->second);
-
-  EXPECT_EQ("1", iter->first);
-  EXPECT_EQ(Value(1), iter->second);
-}
-
-TEST(ValueIteratorsTest, ConstDictIteratorPreDecrement) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-  storage.emplace("1", std::make_unique<Value>(1));
-
-  using iterator = const_dict_iterator;
-  iterator iter(++storage.begin());
-  EXPECT_EQ("1", iter->first);
-  EXPECT_EQ(Value(1), iter->second);
-
-  iterator& iter_ref = --iter;
-  EXPECT_EQ(&iter, &iter_ref);
-
-  EXPECT_EQ("0", iter_ref->first);
-  EXPECT_EQ(Value(0), iter_ref->second);
-}
-
-TEST(ValueIteratorsTest, ConstDictIteratorPostDecrement) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-  storage.emplace("1", std::make_unique<Value>(1));
-
-  using iterator = const_dict_iterator;
-  iterator iter(++storage.begin());
-  iterator iter_old = iter--;
-
-  EXPECT_EQ("1", iter_old->first);
-  EXPECT_EQ(Value(1), iter_old->second);
-
-  EXPECT_EQ("0", iter->first);
-  EXPECT_EQ(Value(0), iter->second);
-}
-
-TEST(ValueIteratorsTest, ConstDictIteratorOperatorEQ) {
-  DictStorage storage;
-  using iterator = const_dict_iterator;
-  EXPECT_EQ(iterator(storage.begin()), iterator(storage.begin()));
-  EXPECT_EQ(iterator(storage.end()), iterator(storage.end()));
-}
-
-TEST(ValueIteratorsTest, ConstDictIteratorOperatorNE) {
-  DictStorage storage;
-  storage.emplace("0", std::make_unique<Value>(0));
-
-  using iterator = const_dict_iterator;
-  EXPECT_NE(iterator(storage.begin()), iterator(storage.end()));
-}
-
-TEST(ValueIteratorsTest, DictIteratorProxy) {
-  DictStorage storage;
-  storage.emplace("null", std::make_unique<Value>(Value::Type::NONE));
-  storage.emplace("bool", std::make_unique<Value>(Value::Type::BOOLEAN));
-  storage.emplace("int", std::make_unique<Value>(Value::Type::INTEGER));
-  storage.emplace("double", std::make_unique<Value>(Value::Type::DOUBLE));
-  storage.emplace("string", std::make_unique<Value>(Value::Type::STRING));
-  storage.emplace("blob", std::make_unique<Value>(Value::Type::BINARY));
-  storage.emplace("dict", std::make_unique<Value>(Value::Type::DICTIONARY));
-  storage.emplace("list", std::make_unique<Value>(Value::Type::LIST));
-
-  using iterator = const_dict_iterator;
-  using iterator_proxy = dict_iterator_proxy;
-  iterator_proxy proxy(&storage);
-
-  auto equal_to = [](const DictStorage::value_type& lhs,
-                     const iterator::reference& rhs) {
-    return std::tie(lhs.first, *lhs.second) == std::tie(rhs.first, rhs.second);
-  };
-
-  EXPECT_TRUE(are_equal(storage.begin(), storage.end(), proxy.begin(),
-                        proxy.end(), equal_to));
-
-  EXPECT_TRUE(are_equal(storage.rbegin(), storage.rend(), proxy.rbegin(),
-                        proxy.rend(), equal_to));
-
-  EXPECT_TRUE(are_equal(storage.cbegin(), storage.cend(), proxy.cbegin(),
-                        proxy.cend(), equal_to));
-
-  EXPECT_TRUE(are_equal(storage.crbegin(), storage.crend(), proxy.crbegin(),
-                        proxy.crend(), equal_to));
-}
-
-TEST(ValueIteratorsTest, ConstDictIteratorProxy) {
-  DictStorage storage;
-  storage.emplace("null", std::make_unique<Value>(Value::Type::NONE));
-  storage.emplace("bool", std::make_unique<Value>(Value::Type::BOOLEAN));
-  storage.emplace("int", std::make_unique<Value>(Value::Type::INTEGER));
-  storage.emplace("double", std::make_unique<Value>(Value::Type::DOUBLE));
-  storage.emplace("string", std::make_unique<Value>(Value::Type::STRING));
-  storage.emplace("blob", std::make_unique<Value>(Value::Type::BINARY));
-  storage.emplace("dict", std::make_unique<Value>(Value::Type::DICTIONARY));
-  storage.emplace("list", std::make_unique<Value>(Value::Type::LIST));
-
-  using iterator = const_dict_iterator;
-  using iterator_proxy = const_dict_iterator_proxy;
-  iterator_proxy proxy(&storage);
-
-  auto equal_to = [](const DictStorage::value_type& lhs,
-                     const iterator::reference& rhs) {
-    return std::tie(lhs.first, *lhs.second) == std::tie(rhs.first, rhs.second);
-  };
-
-  EXPECT_TRUE(are_equal(storage.begin(), storage.end(), proxy.begin(),
-                        proxy.end(), equal_to));
-
-  EXPECT_TRUE(are_equal(storage.rbegin(), storage.rend(), proxy.rbegin(),
-                        proxy.rend(), equal_to));
-
-  EXPECT_TRUE(are_equal(storage.cbegin(), storage.cend(), proxy.cbegin(),
-                        proxy.cend(), equal_to));
-
-  EXPECT_TRUE(are_equal(storage.crbegin(), storage.crend(), proxy.crbegin(),
-                        proxy.crend(), equal_to));
-}
-
-}  // namespace detail
-
-}  // namespace base
diff --git a/base/values_unittest.cc b/base/values_unittest.cc
deleted file mode 100644
index b8efac7..0000000
--- a/base/values_unittest.cc
+++ /dev/null
@@ -1,1922 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/values.h"
-
-#include <stddef.h>
-
-#include <functional>
-#include <limits>
-#include <memory>
-#include <string>
-#include <type_traits>
-#include <utility>
-#include <vector>
-
-#include "base/containers/adapters.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string16.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TEST(ValuesTest, TestNothrow) {
-  static_assert(std::is_nothrow_move_constructible<Value>::value,
-                "IsNothrowMoveConstructible");
-  static_assert(std::is_nothrow_default_constructible<Value>::value,
-                "IsNothrowDefaultConstructible");
-  static_assert(std::is_nothrow_constructible<Value, std::string&&>::value,
-                "IsNothrowMoveConstructibleFromString");
-  static_assert(
-      std::is_nothrow_constructible<Value, Value::BlobStorage&&>::value,
-      "IsNothrowMoveConstructibleFromBlob");
-  static_assert(
-      std::is_nothrow_constructible<Value, Value::ListStorage&&>::value,
-      "IsNothrowMoveConstructibleFromList");
-  static_assert(std::is_nothrow_move_assignable<Value>::value,
-                "IsNothrowMoveAssignable");
-  static_assert(
-      std::is_nothrow_constructible<ListValue, Value::ListStorage&&>::value,
-      "ListIsNothrowMoveConstructibleFromList");
-}
-
-// Group of tests for the value constructors.
-TEST(ValuesTest, ConstructBool) {
-  Value true_value(true);
-  EXPECT_EQ(Value::Type::BOOLEAN, true_value.type());
-  EXPECT_TRUE(true_value.GetBool());
-
-  Value false_value(false);
-  EXPECT_EQ(Value::Type::BOOLEAN, false_value.type());
-  EXPECT_FALSE(false_value.GetBool());
-}
-
-TEST(ValuesTest, ConstructInt) {
-  Value value(-37);
-  EXPECT_EQ(Value::Type::INTEGER, value.type());
-  EXPECT_EQ(-37, value.GetInt());
-}
-
-TEST(ValuesTest, ConstructDouble) {
-  Value value(-4.655);
-  EXPECT_EQ(Value::Type::DOUBLE, value.type());
-  EXPECT_EQ(-4.655, value.GetDouble());
-}
-
-TEST(ValuesTest, ConstructStringFromConstCharPtr) {
-  const char* str = "foobar";
-  Value value(str);
-  EXPECT_EQ(Value::Type::STRING, value.type());
-  EXPECT_EQ("foobar", value.GetString());
-}
-
-TEST(ValuesTest, ConstructStringFromStringPiece) {
-  std::string str = "foobar";
-  Value value{StringPiece(str)};
-  EXPECT_EQ(Value::Type::STRING, value.type());
-  EXPECT_EQ("foobar", value.GetString());
-}
-
-TEST(ValuesTest, ConstructStringFromStdStringRRef) {
-  std::string str = "foobar";
-  Value value(std::move(str));
-  EXPECT_EQ(Value::Type::STRING, value.type());
-  EXPECT_EQ("foobar", value.GetString());
-}
-
-TEST(ValuesTest, ConstructStringFromConstChar16Ptr) {
-  string16 str = ASCIIToUTF16("foobar");
-  Value value(str.c_str());
-  EXPECT_EQ(Value::Type::STRING, value.type());
-  EXPECT_EQ("foobar", value.GetString());
-}
-
-TEST(ValuesTest, ConstructStringFromStringPiece16) {
-  string16 str = ASCIIToUTF16("foobar");
-  Value value{StringPiece16(str)};
-  EXPECT_EQ(Value::Type::STRING, value.type());
-  EXPECT_EQ("foobar", value.GetString());
-}
-
-TEST(ValuesTest, ConstructBinary) {
-  Value value(Value::BlobStorage({0xF, 0x0, 0x0, 0xB, 0xA, 0x2}));
-  EXPECT_EQ(Value::Type::BINARY, value.type());
-  EXPECT_EQ(Value::BlobStorage({0xF, 0x0, 0x0, 0xB, 0xA, 0x2}),
-            value.GetBlob());
-}
-
-TEST(ValuesTest, ConstructDict) {
-  DictionaryValue value;
-  EXPECT_EQ(Value::Type::DICTIONARY, value.type());
-}
-
-TEST(ValuesTest, ConstructDictFromStorage) {
-  Value::DictStorage storage;
-  storage.emplace("foo", std::make_unique<Value>("bar"));
-  {
-    DictionaryValue value(storage);
-    EXPECT_EQ(Value::Type::DICTIONARY, value.type());
-    EXPECT_EQ(Value::Type::STRING, value.FindKey("foo")->type());
-    EXPECT_EQ("bar", value.FindKey("foo")->GetString());
-  }
-
-  *storage["foo"] = base::Value("baz");
-  {
-    DictionaryValue value(std::move(storage));
-    EXPECT_EQ(Value::Type::DICTIONARY, value.type());
-    EXPECT_EQ(Value::Type::STRING, value.FindKey("foo")->type());
-    EXPECT_EQ("baz", value.FindKey("foo")->GetString());
-  }
-}
-
-TEST(ValuesTest, ConstructList) {
-  ListValue value;
-  EXPECT_EQ(Value::Type::LIST, value.type());
-}
-
-TEST(ValuesTest, ConstructListFromStorage) {
-  Value::ListStorage storage;
-  storage.emplace_back("foo");
-  {
-    ListValue value(storage);
-    EXPECT_EQ(Value::Type::LIST, value.type());
-    EXPECT_EQ(1u, value.GetList().size());
-    EXPECT_EQ(Value::Type::STRING, value.GetList()[0].type());
-    EXPECT_EQ("foo", value.GetList()[0].GetString());
-  }
-
-  storage.back() = base::Value("bar");
-  {
-    ListValue value(std::move(storage));
-    EXPECT_EQ(Value::Type::LIST, value.type());
-    EXPECT_EQ(1u, value.GetList().size());
-    EXPECT_EQ(Value::Type::STRING, value.GetList()[0].type());
-    EXPECT_EQ("bar", value.GetList()[0].GetString());
-  }
-}
-
-// Group of tests for the copy constructors and copy-assigmnent. For equality
-// checks comparisons of the interesting fields are done instead of relying on
-// Equals being correct.
-TEST(ValuesTest, CopyBool) {
-  Value true_value(true);
-  Value copied_true_value(true_value.Clone());
-  EXPECT_EQ(true_value.type(), copied_true_value.type());
-  EXPECT_EQ(true_value.GetBool(), copied_true_value.GetBool());
-
-  Value false_value(false);
-  Value copied_false_value(false_value.Clone());
-  EXPECT_EQ(false_value.type(), copied_false_value.type());
-  EXPECT_EQ(false_value.GetBool(), copied_false_value.GetBool());
-
-  Value blank;
-
-  blank = true_value.Clone();
-  EXPECT_EQ(true_value.type(), blank.type());
-  EXPECT_EQ(true_value.GetBool(), blank.GetBool());
-
-  blank = false_value.Clone();
-  EXPECT_EQ(false_value.type(), blank.type());
-  EXPECT_EQ(false_value.GetBool(), blank.GetBool());
-}
-
-TEST(ValuesTest, CopyInt) {
-  Value value(74);
-  Value copied_value(value.Clone());
-  EXPECT_EQ(value.type(), copied_value.type());
-  EXPECT_EQ(value.GetInt(), copied_value.GetInt());
-
-  Value blank;
-
-  blank = value.Clone();
-  EXPECT_EQ(value.type(), blank.type());
-  EXPECT_EQ(value.GetInt(), blank.GetInt());
-}
-
-TEST(ValuesTest, CopyDouble) {
-  Value value(74.896);
-  Value copied_value(value.Clone());
-  EXPECT_EQ(value.type(), copied_value.type());
-  EXPECT_EQ(value.GetDouble(), copied_value.GetDouble());
-
-  Value blank;
-
-  blank = value.Clone();
-  EXPECT_EQ(value.type(), blank.type());
-  EXPECT_EQ(value.GetDouble(), blank.GetDouble());
-}
-
-TEST(ValuesTest, CopyString) {
-  Value value("foobar");
-  Value copied_value(value.Clone());
-  EXPECT_EQ(value.type(), copied_value.type());
-  EXPECT_EQ(value.GetString(), copied_value.GetString());
-
-  Value blank;
-
-  blank = value.Clone();
-  EXPECT_EQ(value.type(), blank.type());
-  EXPECT_EQ(value.GetString(), blank.GetString());
-}
-
-TEST(ValuesTest, CopyBinary) {
-  Value value(Value::BlobStorage({0xF, 0x0, 0x0, 0xB, 0xA, 0x2}));
-  Value copied_value(value.Clone());
-  EXPECT_EQ(value.type(), copied_value.type());
-  EXPECT_EQ(value.GetBlob(), copied_value.GetBlob());
-
-  Value blank;
-
-  blank = value.Clone();
-  EXPECT_EQ(value.type(), blank.type());
-  EXPECT_EQ(value.GetBlob(), blank.GetBlob());
-}
-
-TEST(ValuesTest, CopyDictionary) {
-  Value::DictStorage storage;
-  storage.emplace("Int", std::make_unique<Value>(123));
-  Value value(std::move(storage));
-
-  Value copied_value(value.Clone());
-  EXPECT_EQ(value, copied_value);
-
-  Value blank;
-  blank = value.Clone();
-  EXPECT_EQ(value, blank);
-}
-
-TEST(ValuesTest, CopyList) {
-  Value::ListStorage storage;
-  storage.emplace_back(123);
-  Value value(std::move(storage));
-
-  Value copied_value(value.Clone());
-  EXPECT_EQ(value, copied_value);
-
-  Value blank;
-  blank = value.Clone();
-  EXPECT_EQ(value, blank);
-}
-
-// Group of tests for the move constructors and move-assigmnent.
-TEST(ValuesTest, MoveBool) {
-  Value true_value(true);
-  Value moved_true_value(std::move(true_value));
-  EXPECT_EQ(Value::Type::BOOLEAN, moved_true_value.type());
-  EXPECT_TRUE(moved_true_value.GetBool());
-
-  Value false_value(false);
-  Value moved_false_value(std::move(false_value));
-  EXPECT_EQ(Value::Type::BOOLEAN, moved_false_value.type());
-  EXPECT_FALSE(moved_false_value.GetBool());
-
-  Value blank;
-
-  blank = Value(true);
-  EXPECT_EQ(Value::Type::BOOLEAN, blank.type());
-  EXPECT_TRUE(blank.GetBool());
-
-  blank = Value(false);
-  EXPECT_EQ(Value::Type::BOOLEAN, blank.type());
-  EXPECT_FALSE(blank.GetBool());
-}
-
-TEST(ValuesTest, MoveInt) {
-  Value value(74);
-  Value moved_value(std::move(value));
-  EXPECT_EQ(Value::Type::INTEGER, moved_value.type());
-  EXPECT_EQ(74, moved_value.GetInt());
-
-  Value blank;
-
-  blank = Value(47);
-  EXPECT_EQ(Value::Type::INTEGER, blank.type());
-  EXPECT_EQ(47, blank.GetInt());
-}
-
-TEST(ValuesTest, MoveDouble) {
-  Value value(74.896);
-  Value moved_value(std::move(value));
-  EXPECT_EQ(Value::Type::DOUBLE, moved_value.type());
-  EXPECT_EQ(74.896, moved_value.GetDouble());
-
-  Value blank;
-
-  blank = Value(654.38);
-  EXPECT_EQ(Value::Type::DOUBLE, blank.type());
-  EXPECT_EQ(654.38, blank.GetDouble());
-}
-
-TEST(ValuesTest, MoveString) {
-  Value value("foobar");
-  Value moved_value(std::move(value));
-  EXPECT_EQ(Value::Type::STRING, moved_value.type());
-  EXPECT_EQ("foobar", moved_value.GetString());
-
-  Value blank;
-
-  blank = Value("foobar");
-  EXPECT_EQ(Value::Type::STRING, blank.type());
-  EXPECT_EQ("foobar", blank.GetString());
-}
-
-TEST(ValuesTest, MoveBinary) {
-  const Value::BlobStorage buffer = {0xF, 0x0, 0x0, 0xB, 0xA, 0x2};
-  Value value(buffer);
-  Value moved_value(std::move(value));
-  EXPECT_EQ(Value::Type::BINARY, moved_value.type());
-  EXPECT_EQ(buffer, moved_value.GetBlob());
-
-  Value blank;
-
-  blank = Value(buffer);
-  EXPECT_EQ(Value::Type::BINARY, blank.type());
-  EXPECT_EQ(buffer, blank.GetBlob());
-}
-
-TEST(ValuesTest, MoveConstructDictionary) {
-  Value::DictStorage storage;
-  storage.emplace("Int", std::make_unique<Value>(123));
-
-  Value value(std::move(storage));
-  Value moved_value(std::move(value));
-  EXPECT_EQ(Value::Type::DICTIONARY, moved_value.type());
-  EXPECT_EQ(123, moved_value.FindKey("Int")->GetInt());
-}
-
-TEST(ValuesTest, MoveAssignDictionary) {
-  Value::DictStorage storage;
-  storage.emplace("Int", std::make_unique<Value>(123));
-
-  Value blank;
-  blank = Value(std::move(storage));
-  EXPECT_EQ(Value::Type::DICTIONARY, blank.type());
-  EXPECT_EQ(123, blank.FindKey("Int")->GetInt());
-}
-
-TEST(ValuesTest, MoveList) {
-  Value::ListStorage storage;
-  storage.emplace_back(123);
-  Value value(storage);
-  Value moved_value(std::move(value));
-  EXPECT_EQ(Value::Type::LIST, moved_value.type());
-  EXPECT_EQ(123, moved_value.GetList().back().GetInt());
-
-  Value blank;
-  blank = Value(std::move(storage));
-  EXPECT_EQ(Value::Type::LIST, blank.type());
-  EXPECT_EQ(123, blank.GetList().back().GetInt());
-}
-
-TEST(ValuesTest, FindKey) {
-  Value::DictStorage storage;
-  storage.emplace("foo", std::make_unique<Value>("bar"));
-  Value dict(std::move(storage));
-  EXPECT_NE(nullptr, dict.FindKey("foo"));
-  EXPECT_EQ(nullptr, dict.FindKey("baz"));
-
-  // Single not found key.
-  bool found = dict.FindKey("notfound");
-  EXPECT_FALSE(found);
-}
-
-TEST(ValuesTest, FindKeyChangeValue) {
-  Value::DictStorage storage;
-  storage.emplace("foo", std::make_unique<Value>("bar"));
-  Value dict(std::move(storage));
-  Value* found = dict.FindKey("foo");
-  EXPECT_NE(nullptr, found);
-  EXPECT_EQ("bar", found->GetString());
-
-  *found = Value(123);
-  EXPECT_EQ(123, dict.FindKey("foo")->GetInt());
-}
-
-TEST(ValuesTest, FindKeyConst) {
-  Value::DictStorage storage;
-  storage.emplace("foo", std::make_unique<Value>("bar"));
-  const Value dict(std::move(storage));
-  EXPECT_NE(nullptr, dict.FindKey("foo"));
-  EXPECT_EQ(nullptr, dict.FindKey("baz"));
-}
-
-TEST(ValuesTest, FindKeyOfType) {
-  Value::DictStorage storage;
-  storage.emplace("null", std::make_unique<Value>(Value::Type::NONE));
-  storage.emplace("bool", std::make_unique<Value>(Value::Type::BOOLEAN));
-  storage.emplace("int", std::make_unique<Value>(Value::Type::INTEGER));
-  storage.emplace("double", std::make_unique<Value>(Value::Type::DOUBLE));
-  storage.emplace("string", std::make_unique<Value>(Value::Type::STRING));
-  storage.emplace("blob", std::make_unique<Value>(Value::Type::BINARY));
-  storage.emplace("list", std::make_unique<Value>(Value::Type::LIST));
-  storage.emplace("dict", std::make_unique<Value>(Value::Type::DICTIONARY));
-
-  Value dict(std::move(storage));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("null", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::NONE));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("bool", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::BOOLEAN));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("int", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::INTEGER));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("double", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::DOUBLE));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("string", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::STRING));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("blob", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::BINARY));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("list", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::LIST));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("dict", Value::Type::DICTIONARY));
-}
-
-TEST(ValuesTest, FindKeyOfTypeConst) {
-  Value::DictStorage storage;
-  storage.emplace("null", std::make_unique<Value>(Value::Type::NONE));
-  storage.emplace("bool", std::make_unique<Value>(Value::Type::BOOLEAN));
-  storage.emplace("int", std::make_unique<Value>(Value::Type::INTEGER));
-  storage.emplace("double", std::make_unique<Value>(Value::Type::DOUBLE));
-  storage.emplace("string", std::make_unique<Value>(Value::Type::STRING));
-  storage.emplace("blob", std::make_unique<Value>(Value::Type::BINARY));
-  storage.emplace("list", std::make_unique<Value>(Value::Type::LIST));
-  storage.emplace("dict", std::make_unique<Value>(Value::Type::DICTIONARY));
-
-  const Value dict(std::move(storage));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("null", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("null", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::NONE));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("bool", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("bool", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::BOOLEAN));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("int", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("int", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::INTEGER));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("double", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("double", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::DOUBLE));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("string", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("string", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::STRING));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("blob", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("blob", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::BINARY));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("list", Value::Type::LIST));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("list", Value::Type::DICTIONARY));
-
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::NONE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::BOOLEAN));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::INTEGER));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::DOUBLE));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::STRING));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::BINARY));
-  EXPECT_EQ(nullptr, dict.FindKeyOfType("dict", Value::Type::LIST));
-  EXPECT_NE(nullptr, dict.FindKeyOfType("dict", Value::Type::DICTIONARY));
-}
-
-TEST(ValuesTest, SetKey) {
-  Value::DictStorage storage;
-  storage.emplace("null", std::make_unique<Value>(Value::Type::NONE));
-  storage.emplace("bool", std::make_unique<Value>(Value::Type::BOOLEAN));
-  storage.emplace("int", std::make_unique<Value>(Value::Type::INTEGER));
-  storage.emplace("double", std::make_unique<Value>(Value::Type::DOUBLE));
-  storage.emplace("string", std::make_unique<Value>(Value::Type::STRING));
-  storage.emplace("blob", std::make_unique<Value>(Value::Type::BINARY));
-  storage.emplace("list", std::make_unique<Value>(Value::Type::LIST));
-  storage.emplace("dict", std::make_unique<Value>(Value::Type::DICTIONARY));
-
-  Value dict(Value::Type::DICTIONARY);
-  dict.SetKey(StringPiece("null"), Value(Value::Type::NONE));
-  dict.SetKey(StringPiece("bool"), Value(Value::Type::BOOLEAN));
-  dict.SetKey(std::string("int"), Value(Value::Type::INTEGER));
-  dict.SetKey(std::string("double"), Value(Value::Type::DOUBLE));
-  dict.SetKey(std::string("string"), Value(Value::Type::STRING));
-  dict.SetKey("blob", Value(Value::Type::BINARY));
-  dict.SetKey("list", Value(Value::Type::LIST));
-  dict.SetKey("dict", Value(Value::Type::DICTIONARY));
-
-  EXPECT_EQ(Value(std::move(storage)), dict);
-}
-
-TEST(ValuesTest, FindPath) {
-  // Construct a dictionary path {root}.foo.bar = 123
-  Value foo(Value::Type::DICTIONARY);
-  foo.SetKey("bar", Value(123));
-
-  Value root(Value::Type::DICTIONARY);
-  root.SetKey("foo", std::move(foo));
-
-  // No key (stupid but well-defined and takes work to prevent).
-  Value* found = root.FindPath(std::vector<StringPiece>{});
-  EXPECT_EQ(&root, found);
-
-  // Double key, second not found.
-  found = root.FindPath(std::vector<StringPiece>{"foo", "notfound"});
-  EXPECT_FALSE(found);
-
-  // Double key, found.
-  found = root.FindPath(std::vector<StringPiece>{"foo", "bar"});
-  EXPECT_TRUE(found);
-  EXPECT_TRUE(found->is_int());
-  EXPECT_EQ(123, found->GetInt());
-}
-
-TEST(ValuesTest, SetPath) {
-  Value root(Value::Type::DICTIONARY);
-
-  Value* inserted = root.SetPath({"one", "two"}, Value(123));
-  Value* found = root.FindPathOfType({"one", "two"}, Value::Type::INTEGER);
-  ASSERT_TRUE(found);
-  EXPECT_EQ(inserted, found);
-  EXPECT_EQ(123, found->GetInt());
-
-  inserted = root.SetPath(std::vector<StringPiece>{"foo", "bar"}, Value(123));
-  found = root.FindPathOfType({"foo", "bar"}, Value::Type::INTEGER);
-  ASSERT_TRUE(found);
-  EXPECT_EQ(inserted, found);
-  EXPECT_EQ(123, found->GetInt());
-
-  // Overwrite with a different value.
-  root.SetPath({"foo", "bar"}, Value("hello"));
-  found = root.FindPathOfType(std::vector<StringPiece>{"foo", "bar"},
-                              Value::Type::STRING);
-  ASSERT_TRUE(found);
-  EXPECT_EQ("hello", found->GetString());
-
-  // Can't change existing non-dictionary keys to dictionaries.
-  found =
-      root.SetPath(std::vector<StringPiece>{"foo", "bar", "baz"}, Value(123));
-  EXPECT_FALSE(found);
-}
-
-TEST(ValuesTest, RemoveKey) {
-  Value root(Value::Type::DICTIONARY);
-  root.SetKey("one", Value(123));
-
-  // Removal of missing key should fail.
-  EXPECT_FALSE(root.RemoveKey("two"));
-
-  // Removal of existing key should succeed.
-  EXPECT_TRUE(root.RemoveKey("one"));
-
-  // Second removal of previously existing key should fail.
-  EXPECT_FALSE(root.RemoveKey("one"));
-}
-
-TEST(ValuesTest, RemovePath) {
-  Value root(Value::Type::DICTIONARY);
-  root.SetPath({"one", "two", "three"}, Value(123));
-
-  // Removal of missing key should fail.
-  EXPECT_FALSE(root.RemovePath({"one", "two", "four"}));
-
-  // Removal of existing key should succeed.
-  EXPECT_TRUE(root.RemovePath({"one", "two", "three"}));
-
-  // Second removal of previously existing key should fail.
-  EXPECT_FALSE(root.RemovePath({"one", "two", "three"}));
-
-  // Intermediate empty dictionaries should be cleared.
-  EXPECT_FALSE(root.FindKey("one"));
-
-  root.SetPath({"one", "two", "three"}, Value(123));
-  root.SetPath({"one", "two", "four"}, Value(124));
-
-  EXPECT_TRUE(root.RemovePath(std::vector<StringPiece>{"one", "two", "three"}));
-  // Intermediate non-empty dictionaries should be kept.
-  EXPECT_TRUE(root.FindKey("one"));
-  EXPECT_TRUE(root.FindPath({"one", "two"}));
-  EXPECT_TRUE(root.FindPath({"one", "two", "four"}));
-}
-
-TEST(ValuesTest, Basic) {
-  // Test basic dictionary getting/setting
-  DictionaryValue settings;
-  std::string homepage = "http://google.com";
-  ASSERT_FALSE(settings.GetString("global.homepage", &homepage));
-  ASSERT_EQ(std::string("http://google.com"), homepage);
-
-  ASSERT_FALSE(settings.Get("global", nullptr));
-  settings.SetBoolean("global", true);
-  ASSERT_TRUE(settings.Get("global", nullptr));
-  settings.SetString("global.homepage", "http://scurvy.com");
-  ASSERT_TRUE(settings.Get("global", nullptr));
-  homepage = "http://google.com";
-  ASSERT_TRUE(settings.GetString("global.homepage", &homepage));
-  ASSERT_EQ(std::string("http://scurvy.com"), homepage);
-
-  // Test storing a dictionary in a list.
-  ListValue* toolbar_bookmarks;
-  ASSERT_FALSE(
-    settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks));
-
-  std::unique_ptr<ListValue> new_toolbar_bookmarks(new ListValue);
-  settings.Set("global.toolbar.bookmarks", std::move(new_toolbar_bookmarks));
-  ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &toolbar_bookmarks));
-
-  std::unique_ptr<DictionaryValue> new_bookmark(new DictionaryValue);
-  new_bookmark->SetString("name", "Froogle");
-  new_bookmark->SetString("url", "http://froogle.com");
-  toolbar_bookmarks->Append(std::move(new_bookmark));
-
-  ListValue* bookmark_list;
-  ASSERT_TRUE(settings.GetList("global.toolbar.bookmarks", &bookmark_list));
-  DictionaryValue* bookmark;
-  ASSERT_EQ(1U, bookmark_list->GetSize());
-  ASSERT_TRUE(bookmark_list->GetDictionary(0, &bookmark));
-  std::string bookmark_name = "Unnamed";
-  ASSERT_TRUE(bookmark->GetString("name", &bookmark_name));
-  ASSERT_EQ(std::string("Froogle"), bookmark_name);
-  std::string bookmark_url;
-  ASSERT_TRUE(bookmark->GetString("url", &bookmark_url));
-  ASSERT_EQ(std::string("http://froogle.com"), bookmark_url);
-}
-
-TEST(ValuesTest, List) {
-  std::unique_ptr<ListValue> mixed_list(new ListValue());
-  mixed_list->Set(0, std::make_unique<Value>(true));
-  mixed_list->Set(1, std::make_unique<Value>(42));
-  mixed_list->Set(2, std::make_unique<Value>(88.8));
-  mixed_list->Set(3, std::make_unique<Value>("foo"));
-  ASSERT_EQ(4u, mixed_list->GetSize());
-
-  Value* value = nullptr;
-  bool bool_value = false;
-  int int_value = 0;
-  double double_value = 0.0;
-  std::string string_value;
-
-  ASSERT_FALSE(mixed_list->Get(4, &value));
-
-  ASSERT_FALSE(mixed_list->GetInteger(0, &int_value));
-  ASSERT_EQ(0, int_value);
-  ASSERT_FALSE(mixed_list->GetBoolean(1, &bool_value));
-  ASSERT_FALSE(bool_value);
-  ASSERT_FALSE(mixed_list->GetString(2, &string_value));
-  ASSERT_EQ("", string_value);
-  ASSERT_FALSE(mixed_list->GetInteger(2, &int_value));
-  ASSERT_EQ(0, int_value);
-  ASSERT_FALSE(mixed_list->GetBoolean(3, &bool_value));
-  ASSERT_FALSE(bool_value);
-
-  ASSERT_TRUE(mixed_list->GetBoolean(0, &bool_value));
-  ASSERT_TRUE(bool_value);
-  ASSERT_TRUE(mixed_list->GetInteger(1, &int_value));
-  ASSERT_EQ(42, int_value);
-  // implicit conversion from Integer to Double should be possible.
-  ASSERT_TRUE(mixed_list->GetDouble(1, &double_value));
-  ASSERT_EQ(42, double_value);
-  ASSERT_TRUE(mixed_list->GetDouble(2, &double_value));
-  ASSERT_EQ(88.8, double_value);
-  ASSERT_TRUE(mixed_list->GetString(3, &string_value));
-  ASSERT_EQ("foo", string_value);
-
-  // Try searching in the mixed list.
-  base::Value sought_value(42);
-  base::Value not_found_value(false);
-
-  ASSERT_NE(mixed_list->end(), mixed_list->Find(sought_value));
-  ASSERT_TRUE((*mixed_list->Find(sought_value)).GetAsInteger(&int_value));
-  ASSERT_EQ(42, int_value);
-  ASSERT_EQ(mixed_list->end(), mixed_list->Find(not_found_value));
-}
-
-TEST(ValuesTest, BinaryValue) {
-  // Default constructor creates a BinaryValue with a buffer of size 0.
-  auto binary = std::make_unique<Value>(Value::Type::BINARY);
-  ASSERT_TRUE(binary.get());
-  ASSERT_TRUE(binary->GetBlob().empty());
-
-  // Test the common case of a non-empty buffer
-  Value::BlobStorage buffer(15);
-  char* original_buffer = buffer.data();
-  binary.reset(new Value(std::move(buffer)));
-  ASSERT_TRUE(binary.get());
-  ASSERT_TRUE(binary->GetBlob().data());
-  ASSERT_EQ(original_buffer, binary->GetBlob().data());
-  ASSERT_EQ(15U, binary->GetBlob().size());
-
-  char stack_buffer[42];
-  memset(stack_buffer, '!', 42);
-  binary = Value::CreateWithCopiedBuffer(stack_buffer, 42);
-  ASSERT_TRUE(binary.get());
-  ASSERT_TRUE(binary->GetBlob().data());
-  ASSERT_NE(stack_buffer, binary->GetBlob().data());
-  ASSERT_EQ(42U, binary->GetBlob().size());
-  ASSERT_EQ(0, memcmp(stack_buffer, binary->GetBlob().data(),
-                      binary->GetBlob().size()));
-}
-
-TEST(ValuesTest, StringValue) {
-  // Test overloaded StringValue constructor.
-  std::unique_ptr<Value> narrow_value(new Value("narrow"));
-  ASSERT_TRUE(narrow_value.get());
-  ASSERT_TRUE(narrow_value->is_string());
-  std::unique_ptr<Value> utf16_value(new Value(ASCIIToUTF16("utf16")));
-  ASSERT_TRUE(utf16_value.get());
-  ASSERT_TRUE(utf16_value->is_string());
-
-  // Test overloaded GetAsString.
-  std::string narrow = "http://google.com";
-  string16 utf16 = ASCIIToUTF16("http://google.com");
-  const Value* string_value = nullptr;
-  ASSERT_TRUE(narrow_value->GetAsString(&narrow));
-  ASSERT_TRUE(narrow_value->GetAsString(&utf16));
-  ASSERT_TRUE(narrow_value->GetAsString(&string_value));
-  ASSERT_EQ(std::string("narrow"), narrow);
-  ASSERT_EQ(ASCIIToUTF16("narrow"), utf16);
-  ASSERT_EQ(string_value->GetString(), narrow);
-
-  ASSERT_TRUE(utf16_value->GetAsString(&narrow));
-  ASSERT_TRUE(utf16_value->GetAsString(&utf16));
-  ASSERT_TRUE(utf16_value->GetAsString(&string_value));
-  ASSERT_EQ(std::string("utf16"), narrow);
-  ASSERT_EQ(ASCIIToUTF16("utf16"), utf16);
-  ASSERT_EQ(string_value->GetString(), narrow);
-
-  // Don't choke on NULL values.
-  ASSERT_TRUE(narrow_value->GetAsString(static_cast<string16*>(nullptr)));
-  ASSERT_TRUE(narrow_value->GetAsString(static_cast<std::string*>(nullptr)));
-  ASSERT_TRUE(narrow_value->GetAsString(static_cast<const Value**>(nullptr)));
-}
-
-TEST(ValuesTest, ListDeletion) {
-  ListValue list;
-  list.Append(std::make_unique<Value>());
-  EXPECT_FALSE(list.empty());
-  list.Clear();
-  EXPECT_TRUE(list.empty());
-}
-
-TEST(ValuesTest, ListRemoval) {
-  std::unique_ptr<Value> removed_item;
-
-  {
-    ListValue list;
-    list.Append(std::make_unique<Value>());
-    EXPECT_EQ(1U, list.GetSize());
-    EXPECT_FALSE(list.Remove(std::numeric_limits<size_t>::max(),
-                             &removed_item));
-    EXPECT_FALSE(list.Remove(1, &removed_item));
-    EXPECT_TRUE(list.Remove(0, &removed_item));
-    ASSERT_TRUE(removed_item);
-    EXPECT_EQ(0U, list.GetSize());
-  }
-  removed_item.reset();
-
-  {
-    ListValue list;
-    list.Append(std::make_unique<Value>());
-    EXPECT_TRUE(list.Remove(0, nullptr));
-    EXPECT_EQ(0U, list.GetSize());
-  }
-
-  {
-    ListValue list;
-    auto value = std::make_unique<Value>();
-    Value original_value = value->Clone();
-    list.Append(std::move(value));
-    size_t index = 0;
-    list.Remove(original_value, &index);
-    EXPECT_EQ(0U, index);
-    EXPECT_EQ(0U, list.GetSize());
-  }
-}
-
-TEST(ValuesTest, DictionaryDeletion) {
-  std::string key = "test";
-  DictionaryValue dict;
-  dict.Set(key, std::make_unique<Value>());
-  EXPECT_FALSE(dict.empty());
-  EXPECT_FALSE(dict.DictEmpty());
-  EXPECT_EQ(1U, dict.DictSize());
-  dict.Clear();
-  EXPECT_TRUE(dict.empty());
-  EXPECT_TRUE(dict.DictEmpty());
-  EXPECT_EQ(0U, dict.DictSize());
-}
-
-TEST(ValuesTest, DictionarySetReturnsPointer) {
-  {
-    DictionaryValue dict;
-    Value* blank_ptr = dict.Set("foo.bar", std::make_unique<base::Value>());
-    EXPECT_EQ(Value::Type::NONE, blank_ptr->type());
-  }
-
-  {
-    DictionaryValue dict;
-    Value* blank_ptr = dict.SetWithoutPathExpansion(
-        "foo.bar", std::make_unique<base::Value>());
-    EXPECT_EQ(Value::Type::NONE, blank_ptr->type());
-  }
-
-  {
-    DictionaryValue dict;
-    Value* int_ptr = dict.SetInteger("foo.bar", 42);
-    EXPECT_EQ(Value::Type::INTEGER, int_ptr->type());
-    EXPECT_EQ(42, int_ptr->GetInt());
-  }
-
-  {
-    DictionaryValue dict;
-    Value* double_ptr = dict.SetDouble("foo.bar", 3.142);
-    EXPECT_EQ(Value::Type::DOUBLE, double_ptr->type());
-    EXPECT_EQ(3.142, double_ptr->GetDouble());
-  }
-
-  {
-    DictionaryValue dict;
-    Value* string_ptr = dict.SetString("foo.bar", "foo");
-    EXPECT_EQ(Value::Type::STRING, string_ptr->type());
-    EXPECT_EQ("foo", string_ptr->GetString());
-  }
-
-  {
-    DictionaryValue dict;
-    Value* string16_ptr = dict.SetString("foo.bar", ASCIIToUTF16("baz"));
-    EXPECT_EQ(Value::Type::STRING, string16_ptr->type());
-    EXPECT_EQ("baz", string16_ptr->GetString());
-  }
-
-  {
-    DictionaryValue dict;
-    DictionaryValue* dict_ptr = dict.SetDictionary(
-        "foo.bar", std::make_unique<base::DictionaryValue>());
-    EXPECT_EQ(Value::Type::DICTIONARY, dict_ptr->type());
-  }
-
-  {
-    DictionaryValue dict;
-    ListValue* list_ptr =
-        dict.SetList("foo.bar", std::make_unique<base::ListValue>());
-    EXPECT_EQ(Value::Type::LIST, list_ptr->type());
-  }
-}
-
-TEST(ValuesTest, DictionaryRemoval) {
-  std::string key = "test";
-  std::unique_ptr<Value> removed_item;
-
-  {
-    DictionaryValue dict;
-    EXPECT_EQ(0U, dict.DictSize());
-    EXPECT_TRUE(dict.DictEmpty());
-    dict.Set(key, std::make_unique<Value>());
-    EXPECT_TRUE(dict.HasKey(key));
-    EXPECT_FALSE(dict.Remove("absent key", &removed_item));
-    EXPECT_EQ(1U, dict.DictSize());
-    EXPECT_FALSE(dict.DictEmpty());
-
-    EXPECT_TRUE(dict.Remove(key, &removed_item));
-    EXPECT_FALSE(dict.HasKey(key));
-    ASSERT_TRUE(removed_item);
-    EXPECT_EQ(0U, dict.DictSize());
-    EXPECT_TRUE(dict.DictEmpty());
-  }
-
-  {
-    DictionaryValue dict;
-    dict.Set(key, std::make_unique<Value>());
-    EXPECT_TRUE(dict.HasKey(key));
-    EXPECT_TRUE(dict.Remove(key, nullptr));
-    EXPECT_FALSE(dict.HasKey(key));
-  }
-}
-
-TEST(ValuesTest, DictionaryWithoutPathExpansion) {
-  DictionaryValue dict;
-  dict.Set("this.is.expanded", std::make_unique<Value>());
-  dict.SetWithoutPathExpansion("this.isnt.expanded", std::make_unique<Value>());
-
-  EXPECT_FALSE(dict.HasKey("this.is.expanded"));
-  EXPECT_TRUE(dict.HasKey("this"));
-  Value* value1;
-  EXPECT_TRUE(dict.Get("this", &value1));
-  DictionaryValue* value2;
-  ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion("this", &value2));
-  EXPECT_EQ(value1, value2);
-  EXPECT_EQ(1U, value2->size());
-
-  EXPECT_TRUE(dict.HasKey("this.isnt.expanded"));
-  Value* value3;
-  EXPECT_FALSE(dict.Get("this.isnt.expanded", &value3));
-  Value* value4;
-  ASSERT_TRUE(dict.GetWithoutPathExpansion("this.isnt.expanded", &value4));
-  EXPECT_EQ(Value::Type::NONE, value4->type());
-}
-
-// Tests the deprecated version of SetWithoutPathExpansion.
-// TODO(estade): remove.
-TEST(ValuesTest, DictionaryWithoutPathExpansionDeprecated) {
-  DictionaryValue dict;
-  dict.Set("this.is.expanded", std::make_unique<Value>());
-  dict.SetWithoutPathExpansion("this.isnt.expanded", std::make_unique<Value>());
-
-  EXPECT_FALSE(dict.HasKey("this.is.expanded"));
-  EXPECT_TRUE(dict.HasKey("this"));
-  Value* value1;
-  EXPECT_TRUE(dict.Get("this", &value1));
-  DictionaryValue* value2;
-  ASSERT_TRUE(dict.GetDictionaryWithoutPathExpansion("this", &value2));
-  EXPECT_EQ(value1, value2);
-  EXPECT_EQ(1U, value2->size());
-
-  EXPECT_TRUE(dict.HasKey("this.isnt.expanded"));
-  Value* value3;
-  EXPECT_FALSE(dict.Get("this.isnt.expanded", &value3));
-  Value* value4;
-  ASSERT_TRUE(dict.GetWithoutPathExpansion("this.isnt.expanded", &value4));
-  EXPECT_EQ(Value::Type::NONE, value4->type());
-}
-
-TEST(ValuesTest, DictionaryRemovePath) {
-  DictionaryValue dict;
-  dict.SetInteger("a.long.way.down", 1);
-  dict.SetBoolean("a.long.key.path", true);
-
-  std::unique_ptr<Value> removed_item;
-  EXPECT_TRUE(dict.RemovePath("a.long.way.down", &removed_item));
-  ASSERT_TRUE(removed_item);
-  EXPECT_TRUE(removed_item->is_int());
-  EXPECT_FALSE(dict.HasKey("a.long.way.down"));
-  EXPECT_FALSE(dict.HasKey("a.long.way"));
-  EXPECT_TRUE(dict.Get("a.long.key.path", nullptr));
-
-  removed_item.reset();
-  EXPECT_FALSE(dict.RemovePath("a.long.way.down", &removed_item));
-  EXPECT_FALSE(removed_item);
-  EXPECT_TRUE(dict.Get("a.long.key.path", nullptr));
-
-  removed_item.reset();
-  EXPECT_TRUE(dict.RemovePath("a.long.key.path", &removed_item));
-  ASSERT_TRUE(removed_item);
-  EXPECT_TRUE(removed_item->is_bool());
-  EXPECT_TRUE(dict.empty());
-}
-
-TEST(ValuesTest, DeepCopy) {
-  DictionaryValue original_dict;
-  Value* null_weak = original_dict.Set("null", std::make_unique<Value>());
-  Value* bool_weak = original_dict.Set("bool", std::make_unique<Value>(true));
-  Value* int_weak = original_dict.Set("int", std::make_unique<Value>(42));
-  Value* double_weak =
-      original_dict.Set("double", std::make_unique<Value>(3.14));
-  Value* string_weak =
-      original_dict.Set("string", std::make_unique<Value>("hello"));
-  Value* string16_weak = original_dict.Set(
-      "string16", std::make_unique<Value>(ASCIIToUTF16("hello16")));
-
-  Value* binary_weak = original_dict.Set(
-      "binary", std::make_unique<Value>(Value::BlobStorage(42, '!')));
-
-  Value::ListStorage storage;
-  storage.emplace_back(0);
-  storage.emplace_back(1);
-  Value* list_weak =
-      original_dict.Set("list", std::make_unique<Value>(std::move(storage)));
-  Value* list_element_0_weak = &list_weak->GetList()[0];
-  Value* list_element_1_weak = &list_weak->GetList()[1];
-
-  DictionaryValue* dict_weak = original_dict.SetDictionary(
-      "dictionary", std::make_unique<DictionaryValue>());
-  dict_weak->SetString("key", "value");
-
-  auto copy_dict = original_dict.CreateDeepCopy();
-  ASSERT_TRUE(copy_dict.get());
-  ASSERT_NE(copy_dict.get(), &original_dict);
-
-  Value* copy_null = nullptr;
-  ASSERT_TRUE(copy_dict->Get("null", &copy_null));
-  ASSERT_TRUE(copy_null);
-  ASSERT_NE(copy_null, null_weak);
-  ASSERT_TRUE(copy_null->is_none());
-
-  Value* copy_bool = nullptr;
-  ASSERT_TRUE(copy_dict->Get("bool", &copy_bool));
-  ASSERT_TRUE(copy_bool);
-  ASSERT_NE(copy_bool, bool_weak);
-  ASSERT_TRUE(copy_bool->is_bool());
-  bool copy_bool_value = false;
-  ASSERT_TRUE(copy_bool->GetAsBoolean(&copy_bool_value));
-  ASSERT_TRUE(copy_bool_value);
-
-  Value* copy_int = nullptr;
-  ASSERT_TRUE(copy_dict->Get("int", &copy_int));
-  ASSERT_TRUE(copy_int);
-  ASSERT_NE(copy_int, int_weak);
-  ASSERT_TRUE(copy_int->is_int());
-  int copy_int_value = 0;
-  ASSERT_TRUE(copy_int->GetAsInteger(&copy_int_value));
-  ASSERT_EQ(42, copy_int_value);
-
-  Value* copy_double = nullptr;
-  ASSERT_TRUE(copy_dict->Get("double", &copy_double));
-  ASSERT_TRUE(copy_double);
-  ASSERT_NE(copy_double, double_weak);
-  ASSERT_TRUE(copy_double->is_double());
-  double copy_double_value = 0;
-  ASSERT_TRUE(copy_double->GetAsDouble(&copy_double_value));
-  ASSERT_EQ(3.14, copy_double_value);
-
-  Value* copy_string = nullptr;
-  ASSERT_TRUE(copy_dict->Get("string", &copy_string));
-  ASSERT_TRUE(copy_string);
-  ASSERT_NE(copy_string, string_weak);
-  ASSERT_TRUE(copy_string->is_string());
-  std::string copy_string_value;
-  string16 copy_string16_value;
-  ASSERT_TRUE(copy_string->GetAsString(&copy_string_value));
-  ASSERT_TRUE(copy_string->GetAsString(&copy_string16_value));
-  ASSERT_EQ(std::string("hello"), copy_string_value);
-  ASSERT_EQ(ASCIIToUTF16("hello"), copy_string16_value);
-
-  Value* copy_string16 = nullptr;
-  ASSERT_TRUE(copy_dict->Get("string16", &copy_string16));
-  ASSERT_TRUE(copy_string16);
-  ASSERT_NE(copy_string16, string16_weak);
-  ASSERT_TRUE(copy_string16->is_string());
-  ASSERT_TRUE(copy_string16->GetAsString(&copy_string_value));
-  ASSERT_TRUE(copy_string16->GetAsString(&copy_string16_value));
-  ASSERT_EQ(std::string("hello16"), copy_string_value);
-  ASSERT_EQ(ASCIIToUTF16("hello16"), copy_string16_value);
-
-  Value* copy_binary = nullptr;
-  ASSERT_TRUE(copy_dict->Get("binary", &copy_binary));
-  ASSERT_TRUE(copy_binary);
-  ASSERT_NE(copy_binary, binary_weak);
-  ASSERT_TRUE(copy_binary->is_blob());
-  ASSERT_NE(binary_weak->GetBlob().data(), copy_binary->GetBlob().data());
-  ASSERT_EQ(binary_weak->GetBlob(), copy_binary->GetBlob());
-
-  Value* copy_value = nullptr;
-  ASSERT_TRUE(copy_dict->Get("list", &copy_value));
-  ASSERT_TRUE(copy_value);
-  ASSERT_NE(copy_value, list_weak);
-  ASSERT_TRUE(copy_value->is_list());
-  ListValue* copy_list = nullptr;
-  ASSERT_TRUE(copy_value->GetAsList(&copy_list));
-  ASSERT_TRUE(copy_list);
-  ASSERT_EQ(2U, copy_list->GetSize());
-
-  Value* copy_list_element_0;
-  ASSERT_TRUE(copy_list->Get(0, &copy_list_element_0));
-  ASSERT_TRUE(copy_list_element_0);
-  ASSERT_NE(copy_list_element_0, list_element_0_weak);
-  int copy_list_element_0_value;
-  ASSERT_TRUE(copy_list_element_0->GetAsInteger(&copy_list_element_0_value));
-  ASSERT_EQ(0, copy_list_element_0_value);
-
-  Value* copy_list_element_1;
-  ASSERT_TRUE(copy_list->Get(1, &copy_list_element_1));
-  ASSERT_TRUE(copy_list_element_1);
-  ASSERT_NE(copy_list_element_1, list_element_1_weak);
-  int copy_list_element_1_value;
-  ASSERT_TRUE(copy_list_element_1->GetAsInteger(&copy_list_element_1_value));
-  ASSERT_EQ(1, copy_list_element_1_value);
-
-  copy_value = nullptr;
-  ASSERT_TRUE(copy_dict->Get("dictionary", &copy_value));
-  ASSERT_TRUE(copy_value);
-  ASSERT_NE(copy_value, dict_weak);
-  ASSERT_TRUE(copy_value->is_dict());
-  DictionaryValue* copy_nested_dictionary = nullptr;
-  ASSERT_TRUE(copy_value->GetAsDictionary(&copy_nested_dictionary));
-  ASSERT_TRUE(copy_nested_dictionary);
-  EXPECT_TRUE(copy_nested_dictionary->HasKey("key"));
-}
-
-TEST(ValuesTest, Equals) {
-  auto null1 = std::make_unique<Value>();
-  auto null2 = std::make_unique<Value>();
-  EXPECT_NE(null1.get(), null2.get());
-  EXPECT_EQ(*null1, *null2);
-
-  Value boolean(false);
-  EXPECT_NE(*null1, boolean);
-
-  DictionaryValue dv;
-  dv.SetBoolean("a", false);
-  dv.SetInteger("b", 2);
-  dv.SetDouble("c", 2.5);
-  dv.SetString("d1", "string");
-  dv.SetString("d2", ASCIIToUTF16("http://google.com"));
-  dv.Set("e", std::make_unique<Value>());
-
-  auto copy = dv.CreateDeepCopy();
-  EXPECT_EQ(dv, *copy);
-
-  std::unique_ptr<ListValue> list(new ListValue);
-  list->Append(std::make_unique<Value>());
-  list->Append(WrapUnique(new DictionaryValue));
-  auto list_copy = std::make_unique<Value>(list->Clone());
-
-  ListValue* list_weak = dv.SetList("f", std::move(list));
-  EXPECT_NE(dv, *copy);
-  copy->Set("f", std::move(list_copy));
-  EXPECT_EQ(dv, *copy);
-
-  list_weak->Append(std::make_unique<Value>(true));
-  EXPECT_NE(dv, *copy);
-
-  // Check if Equals detects differences in only the keys.
-  copy = dv.CreateDeepCopy();
-  EXPECT_EQ(dv, *copy);
-  copy->Remove("a", nullptr);
-  copy->SetBoolean("aa", false);
-  EXPECT_NE(dv, *copy);
-}
-
-TEST(ValuesTest, Comparisons) {
-  // Test None Values.
-  Value null1;
-  Value null2;
-  EXPECT_EQ(null1, null2);
-  EXPECT_FALSE(null1 != null2);
-  EXPECT_FALSE(null1 < null2);
-  EXPECT_FALSE(null1 > null2);
-  EXPECT_LE(null1, null2);
-  EXPECT_GE(null1, null2);
-
-  // Test Bool Values.
-  Value bool1(false);
-  Value bool2(true);
-  EXPECT_FALSE(bool1 == bool2);
-  EXPECT_NE(bool1, bool2);
-  EXPECT_LT(bool1, bool2);
-  EXPECT_FALSE(bool1 > bool2);
-  EXPECT_LE(bool1, bool2);
-  EXPECT_FALSE(bool1 >= bool2);
-
-  // Test Int Values.
-  Value int1(1);
-  Value int2(2);
-  EXPECT_FALSE(int1 == int2);
-  EXPECT_NE(int1, int2);
-  EXPECT_LT(int1, int2);
-  EXPECT_FALSE(int1 > int2);
-  EXPECT_LE(int1, int2);
-  EXPECT_FALSE(int1 >= int2);
-
-  // Test Double Values.
-  Value double1(1.0);
-  Value double2(2.0);
-  EXPECT_FALSE(double1 == double2);
-  EXPECT_NE(double1, double2);
-  EXPECT_LT(double1, double2);
-  EXPECT_FALSE(double1 > double2);
-  EXPECT_LE(double1, double2);
-  EXPECT_FALSE(double1 >= double2);
-
-  // Test String Values.
-  Value string1("1");
-  Value string2("2");
-  EXPECT_FALSE(string1 == string2);
-  EXPECT_NE(string1, string2);
-  EXPECT_LT(string1, string2);
-  EXPECT_FALSE(string1 > string2);
-  EXPECT_LE(string1, string2);
-  EXPECT_FALSE(string1 >= string2);
-
-  // Test Binary Values.
-  Value binary1(Value::BlobStorage{0x01});
-  Value binary2(Value::BlobStorage{0x02});
-  EXPECT_FALSE(binary1 == binary2);
-  EXPECT_NE(binary1, binary2);
-  EXPECT_LT(binary1, binary2);
-  EXPECT_FALSE(binary1 > binary2);
-  EXPECT_LE(binary1, binary2);
-  EXPECT_FALSE(binary1 >= binary2);
-
-  // Test Empty List Values.
-  ListValue null_list1;
-  ListValue null_list2;
-  EXPECT_EQ(null_list1, null_list2);
-  EXPECT_FALSE(null_list1 != null_list2);
-  EXPECT_FALSE(null_list1 < null_list2);
-  EXPECT_FALSE(null_list1 > null_list2);
-  EXPECT_LE(null_list1, null_list2);
-  EXPECT_GE(null_list1, null_list2);
-
-  // Test Non Empty List Values.
-  ListValue int_list1;
-  ListValue int_list2;
-  int_list1.AppendInteger(1);
-  int_list2.AppendInteger(2);
-  EXPECT_FALSE(int_list1 == int_list2);
-  EXPECT_NE(int_list1, int_list2);
-  EXPECT_LT(int_list1, int_list2);
-  EXPECT_FALSE(int_list1 > int_list2);
-  EXPECT_LE(int_list1, int_list2);
-  EXPECT_FALSE(int_list1 >= int_list2);
-
-  // Test Empty Dict Values.
-  DictionaryValue null_dict1;
-  DictionaryValue null_dict2;
-  EXPECT_EQ(null_dict1, null_dict2);
-  EXPECT_FALSE(null_dict1 != null_dict2);
-  EXPECT_FALSE(null_dict1 < null_dict2);
-  EXPECT_FALSE(null_dict1 > null_dict2);
-  EXPECT_LE(null_dict1, null_dict2);
-  EXPECT_GE(null_dict1, null_dict2);
-
-  // Test Non Empty Dict Values.
-  DictionaryValue int_dict1;
-  DictionaryValue int_dict2;
-  int_dict1.SetInteger("key", 1);
-  int_dict2.SetInteger("key", 2);
-  EXPECT_FALSE(int_dict1 == int_dict2);
-  EXPECT_NE(int_dict1, int_dict2);
-  EXPECT_LT(int_dict1, int_dict2);
-  EXPECT_FALSE(int_dict1 > int_dict2);
-  EXPECT_LE(int_dict1, int_dict2);
-  EXPECT_FALSE(int_dict1 >= int_dict2);
-
-  // Test Values of different types.
-  std::vector<Value> values;
-  values.emplace_back(std::move(null1));
-  values.emplace_back(std::move(bool1));
-  values.emplace_back(std::move(int1));
-  values.emplace_back(std::move(double1));
-  values.emplace_back(std::move(string1));
-  values.emplace_back(std::move(binary1));
-  values.emplace_back(std::move(int_dict1));
-  values.emplace_back(std::move(int_list1));
-  for (size_t i = 0; i < values.size(); ++i) {
-    for (size_t j = i + 1; j < values.size(); ++j) {
-      EXPECT_FALSE(values[i] == values[j]);
-      EXPECT_NE(values[i], values[j]);
-      EXPECT_LT(values[i], values[j]);
-      EXPECT_FALSE(values[i] > values[j]);
-      EXPECT_LE(values[i], values[j]);
-      EXPECT_FALSE(values[i] >= values[j]);
-    }
-  }
-}
-
-TEST(ValuesTest, DeepCopyCovariantReturnTypes) {
-  DictionaryValue original_dict;
-  Value* null_weak = original_dict.SetKey("null", Value());
-  Value* bool_weak = original_dict.SetKey("bool", Value(true));
-  Value* int_weak = original_dict.SetKey("int", Value(42));
-  Value* double_weak = original_dict.SetKey("double", Value(3.14));
-  Value* string_weak = original_dict.SetKey("string", Value("hello"));
-  Value* string16_weak =
-      original_dict.SetKey("string16", Value(ASCIIToUTF16("hello16")));
-  Value* binary_weak =
-      original_dict.SetKey("binary", Value(Value::BlobStorage(42, '!')));
-
-  Value::ListStorage storage;
-  storage.emplace_back(0);
-  storage.emplace_back(1);
-  Value* list_weak = original_dict.SetKey("list", Value(std::move(storage)));
-
-  auto copy_dict = std::make_unique<Value>(original_dict.Clone());
-  auto copy_null = std::make_unique<Value>(null_weak->Clone());
-  auto copy_bool = std::make_unique<Value>(bool_weak->Clone());
-  auto copy_int = std::make_unique<Value>(int_weak->Clone());
-  auto copy_double = std::make_unique<Value>(double_weak->Clone());
-  auto copy_string = std::make_unique<Value>(string_weak->Clone());
-  auto copy_string16 = std::make_unique<Value>(string16_weak->Clone());
-  auto copy_binary = std::make_unique<Value>(binary_weak->Clone());
-  auto copy_list = std::make_unique<Value>(list_weak->Clone());
-
-  EXPECT_EQ(original_dict, *copy_dict);
-  EXPECT_EQ(*null_weak, *copy_null);
-  EXPECT_EQ(*bool_weak, *copy_bool);
-  EXPECT_EQ(*int_weak, *copy_int);
-  EXPECT_EQ(*double_weak, *copy_double);
-  EXPECT_EQ(*string_weak, *copy_string);
-  EXPECT_EQ(*string16_weak, *copy_string16);
-  EXPECT_EQ(*binary_weak, *copy_binary);
-  EXPECT_EQ(*list_weak, *copy_list);
-}
-
-TEST(ValuesTest, RemoveEmptyChildren) {
-  auto root = std::make_unique<DictionaryValue>();
-  // Remove empty lists and dictionaries.
-  root->Set("empty_dict", std::make_unique<DictionaryValue>());
-  root->Set("empty_list", std::make_unique<ListValue>());
-  root->SetWithoutPathExpansion("a.b.c.d.e",
-                                std::make_unique<DictionaryValue>());
-  root = root->DeepCopyWithoutEmptyChildren();
-  EXPECT_TRUE(root->empty());
-
-  // Make sure we don't prune too much.
-  root->SetBoolean("bool", true);
-  root->Set("empty_dict", std::make_unique<DictionaryValue>());
-  root->SetString("empty_string", std::string());
-  root = root->DeepCopyWithoutEmptyChildren();
-  EXPECT_EQ(2U, root->size());
-
-  // Should do nothing.
-  root = root->DeepCopyWithoutEmptyChildren();
-  EXPECT_EQ(2U, root->size());
-
-  // Nested test cases.  These should all reduce back to the bool and string
-  // set above.
-  {
-    root->Set("a.b.c.d.e", std::make_unique<DictionaryValue>());
-    root = root->DeepCopyWithoutEmptyChildren();
-    EXPECT_EQ(2U, root->size());
-  }
-  {
-    auto inner = std::make_unique<DictionaryValue>();
-    inner->Set("empty_dict", std::make_unique<DictionaryValue>());
-    inner->Set("empty_list", std::make_unique<ListValue>());
-    root->Set("dict_with_empty_children", std::move(inner));
-    root = root->DeepCopyWithoutEmptyChildren();
-    EXPECT_EQ(2U, root->size());
-  }
-  {
-    auto inner = std::make_unique<ListValue>();
-    inner->Append(std::make_unique<DictionaryValue>());
-    inner->Append(std::make_unique<ListValue>());
-    root->Set("list_with_empty_children", std::move(inner));
-    root = root->DeepCopyWithoutEmptyChildren();
-    EXPECT_EQ(2U, root->size());
-  }
-
-  // Nested with siblings.
-  {
-    auto inner = std::make_unique<ListValue>();
-    inner->Append(std::make_unique<DictionaryValue>());
-    inner->Append(std::make_unique<ListValue>());
-    root->Set("list_with_empty_children", std::move(inner));
-    auto inner2 = std::make_unique<DictionaryValue>();
-    inner2->Set("empty_dict", std::make_unique<DictionaryValue>());
-    inner2->Set("empty_list", std::make_unique<ListValue>());
-    root->Set("dict_with_empty_children", std::move(inner2));
-    root = root->DeepCopyWithoutEmptyChildren();
-    EXPECT_EQ(2U, root->size());
-  }
-
-  // Make sure nested values don't get pruned.
-  {
-    auto inner = std::make_unique<ListValue>();
-    auto inner2 = std::make_unique<ListValue>();
-    inner2->Append(std::make_unique<Value>("hello"));
-    inner->Append(std::make_unique<DictionaryValue>());
-    inner->Append(std::move(inner2));
-    root->Set("list_with_empty_children", std::move(inner));
-    root = root->DeepCopyWithoutEmptyChildren();
-    EXPECT_EQ(3U, root->size());
-
-    ListValue* inner_value, *inner_value2;
-    EXPECT_TRUE(root->GetList("list_with_empty_children", &inner_value));
-    EXPECT_EQ(1U, inner_value->GetSize());  // Dictionary was pruned.
-    EXPECT_TRUE(inner_value->GetList(0, &inner_value2));
-    EXPECT_EQ(1U, inner_value2->GetSize());
-  }
-}
-
-TEST(ValuesTest, MergeDictionary) {
-  std::unique_ptr<DictionaryValue> base(new DictionaryValue);
-  base->SetString("base_key", "base_key_value_base");
-  base->SetString("collide_key", "collide_key_value_base");
-  std::unique_ptr<DictionaryValue> base_sub_dict(new DictionaryValue);
-  base_sub_dict->SetString("sub_base_key", "sub_base_key_value_base");
-  base_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_base");
-  base->Set("sub_dict_key", std::move(base_sub_dict));
-
-  std::unique_ptr<DictionaryValue> merge(new DictionaryValue);
-  merge->SetString("merge_key", "merge_key_value_merge");
-  merge->SetString("collide_key", "collide_key_value_merge");
-  std::unique_ptr<DictionaryValue> merge_sub_dict(new DictionaryValue);
-  merge_sub_dict->SetString("sub_merge_key", "sub_merge_key_value_merge");
-  merge_sub_dict->SetString("sub_collide_key", "sub_collide_key_value_merge");
-  merge->Set("sub_dict_key", std::move(merge_sub_dict));
-
-  base->MergeDictionary(merge.get());
-
-  EXPECT_EQ(4U, base->size());
-  std::string base_key_value;
-  EXPECT_TRUE(base->GetString("base_key", &base_key_value));
-  EXPECT_EQ("base_key_value_base", base_key_value); // Base value preserved.
-  std::string collide_key_value;
-  EXPECT_TRUE(base->GetString("collide_key", &collide_key_value));
-  EXPECT_EQ("collide_key_value_merge", collide_key_value); // Replaced.
-  std::string merge_key_value;
-  EXPECT_TRUE(base->GetString("merge_key", &merge_key_value));
-  EXPECT_EQ("merge_key_value_merge", merge_key_value); // Merged in.
-
-  DictionaryValue* res_sub_dict;
-  EXPECT_TRUE(base->GetDictionary("sub_dict_key", &res_sub_dict));
-  EXPECT_EQ(3U, res_sub_dict->size());
-  std::string sub_base_key_value;
-  EXPECT_TRUE(res_sub_dict->GetString("sub_base_key", &sub_base_key_value));
-  EXPECT_EQ("sub_base_key_value_base", sub_base_key_value); // Preserved.
-  std::string sub_collide_key_value;
-  EXPECT_TRUE(res_sub_dict->GetString("sub_collide_key",
-                                      &sub_collide_key_value));
-  EXPECT_EQ("sub_collide_key_value_merge", sub_collide_key_value); // Replaced.
-  std::string sub_merge_key_value;
-  EXPECT_TRUE(res_sub_dict->GetString("sub_merge_key", &sub_merge_key_value));
-  EXPECT_EQ("sub_merge_key_value_merge", sub_merge_key_value); // Merged in.
-}
-
-TEST(ValuesTest, MergeDictionaryDeepCopy) {
-  std::unique_ptr<DictionaryValue> child(new DictionaryValue);
-  DictionaryValue* original_child = child.get();
-  child->SetString("test", "value");
-  EXPECT_EQ(1U, child->size());
-
-  std::string value;
-  EXPECT_TRUE(child->GetString("test", &value));
-  EXPECT_EQ("value", value);
-
-  std::unique_ptr<DictionaryValue> base(new DictionaryValue);
-  base->Set("dict", std::move(child));
-  EXPECT_EQ(1U, base->size());
-
-  DictionaryValue* ptr;
-  EXPECT_TRUE(base->GetDictionary("dict", &ptr));
-  EXPECT_EQ(original_child, ptr);
-
-  std::unique_ptr<DictionaryValue> merged(new DictionaryValue);
-  merged->MergeDictionary(base.get());
-  EXPECT_EQ(1U, merged->size());
-  EXPECT_TRUE(merged->GetDictionary("dict", &ptr));
-  EXPECT_NE(original_child, ptr);
-  EXPECT_TRUE(ptr->GetString("test", &value));
-  EXPECT_EQ("value", value);
-
-  original_child->SetString("test", "overwrite");
-  base.reset();
-  EXPECT_TRUE(ptr->GetString("test", &value));
-  EXPECT_EQ("value", value);
-}
-
-TEST(ValuesTest, DictionaryIterator) {
-  DictionaryValue dict;
-  for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) {
-    ADD_FAILURE();
-  }
-
-  Value value1("value1");
-  dict.SetKey("key1", value1.Clone());
-  bool seen1 = false;
-  for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) {
-    EXPECT_FALSE(seen1);
-    EXPECT_EQ("key1", it.key());
-    EXPECT_EQ(value1, it.value());
-    seen1 = true;
-  }
-  EXPECT_TRUE(seen1);
-
-  Value value2("value2");
-  dict.SetKey("key2", value2.Clone());
-  bool seen2 = seen1 = false;
-  for (DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) {
-    if (it.key() == "key1") {
-      EXPECT_FALSE(seen1);
-      EXPECT_EQ(value1, it.value());
-      seen1 = true;
-    } else if (it.key() == "key2") {
-      EXPECT_FALSE(seen2);
-      EXPECT_EQ(value2, it.value());
-      seen2 = true;
-    } else {
-      ADD_FAILURE();
-    }
-  }
-  EXPECT_TRUE(seen1);
-  EXPECT_TRUE(seen2);
-}
-
-TEST(ValuesTest, StdDictionaryIterator) {
-  DictionaryValue dict;
-  for (auto it = dict.begin(); it != dict.end(); ++it) {
-    ADD_FAILURE();
-  }
-
-  Value value1("value1");
-  dict.SetKey("key1", value1.Clone());
-  bool seen1 = false;
-  for (const auto& it : dict) {
-    EXPECT_FALSE(seen1);
-    EXPECT_EQ("key1", it.first);
-    EXPECT_EQ(value1, *it.second);
-    seen1 = true;
-  }
-  EXPECT_TRUE(seen1);
-
-  Value value2("value2");
-  dict.SetKey("key2", value2.Clone());
-  bool seen2 = seen1 = false;
-  for (const auto& it : dict) {
-    if (it.first == "key1") {
-      EXPECT_FALSE(seen1);
-      EXPECT_EQ(value1, *it.second);
-      seen1 = true;
-    } else if (it.first == "key2") {
-      EXPECT_FALSE(seen2);
-      EXPECT_EQ(value2, *it.second);
-      seen2 = true;
-    } else {
-      ADD_FAILURE();
-    }
-  }
-  EXPECT_TRUE(seen1);
-  EXPECT_TRUE(seen2);
-}
-
-// DictionaryValue/ListValue's Get*() methods should accept NULL as an out-value
-// and still return true/false based on success.
-TEST(ValuesTest, GetWithNullOutValue) {
-  DictionaryValue main_dict;
-  ListValue main_list;
-
-  Value bool_value(false);
-  Value int_value(1234);
-  Value double_value(12.34567);
-  Value string_value("foo");
-  Value binary_value(Value::Type::BINARY);
-  DictionaryValue dict_value;
-  ListValue list_value;
-
-  main_dict.SetKey("bool", bool_value.Clone());
-  main_dict.SetKey("int", int_value.Clone());
-  main_dict.SetKey("double", double_value.Clone());
-  main_dict.SetKey("string", string_value.Clone());
-  main_dict.SetKey("binary", binary_value.Clone());
-  main_dict.SetKey("dict", dict_value.Clone());
-  main_dict.SetKey("list", list_value.Clone());
-
-  main_list.Append(std::make_unique<Value>(bool_value.Clone()));
-  main_list.Append(std::make_unique<Value>(int_value.Clone()));
-  main_list.Append(std::make_unique<Value>(double_value.Clone()));
-  main_list.Append(std::make_unique<Value>(string_value.Clone()));
-  main_list.Append(std::make_unique<Value>(binary_value.Clone()));
-  main_list.Append(std::make_unique<Value>(dict_value.Clone()));
-  main_list.Append(std::make_unique<Value>(list_value.Clone()));
-
-  EXPECT_TRUE(main_dict.Get("bool", nullptr));
-  EXPECT_TRUE(main_dict.Get("int", nullptr));
-  EXPECT_TRUE(main_dict.Get("double", nullptr));
-  EXPECT_TRUE(main_dict.Get("string", nullptr));
-  EXPECT_TRUE(main_dict.Get("binary", nullptr));
-  EXPECT_TRUE(main_dict.Get("dict", nullptr));
-  EXPECT_TRUE(main_dict.Get("list", nullptr));
-  EXPECT_FALSE(main_dict.Get("DNE", nullptr));
-
-  EXPECT_TRUE(main_dict.GetBoolean("bool", nullptr));
-  EXPECT_FALSE(main_dict.GetBoolean("int", nullptr));
-  EXPECT_FALSE(main_dict.GetBoolean("double", nullptr));
-  EXPECT_FALSE(main_dict.GetBoolean("string", nullptr));
-  EXPECT_FALSE(main_dict.GetBoolean("binary", nullptr));
-  EXPECT_FALSE(main_dict.GetBoolean("dict", nullptr));
-  EXPECT_FALSE(main_dict.GetBoolean("list", nullptr));
-  EXPECT_FALSE(main_dict.GetBoolean("DNE", nullptr));
-
-  EXPECT_FALSE(main_dict.GetInteger("bool", nullptr));
-  EXPECT_TRUE(main_dict.GetInteger("int", nullptr));
-  EXPECT_FALSE(main_dict.GetInteger("double", nullptr));
-  EXPECT_FALSE(main_dict.GetInteger("string", nullptr));
-  EXPECT_FALSE(main_dict.GetInteger("binary", nullptr));
-  EXPECT_FALSE(main_dict.GetInteger("dict", nullptr));
-  EXPECT_FALSE(main_dict.GetInteger("list", nullptr));
-  EXPECT_FALSE(main_dict.GetInteger("DNE", nullptr));
-
-  // Both int and double values can be obtained from GetDouble.
-  EXPECT_FALSE(main_dict.GetDouble("bool", nullptr));
-  EXPECT_TRUE(main_dict.GetDouble("int", nullptr));
-  EXPECT_TRUE(main_dict.GetDouble("double", nullptr));
-  EXPECT_FALSE(main_dict.GetDouble("string", nullptr));
-  EXPECT_FALSE(main_dict.GetDouble("binary", nullptr));
-  EXPECT_FALSE(main_dict.GetDouble("dict", nullptr));
-  EXPECT_FALSE(main_dict.GetDouble("list", nullptr));
-  EXPECT_FALSE(main_dict.GetDouble("DNE", nullptr));
-
-  EXPECT_FALSE(main_dict.GetString("bool", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetString("int", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(
-      main_dict.GetString("double", static_cast<std::string*>(nullptr)));
-  EXPECT_TRUE(
-      main_dict.GetString("string", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(
-      main_dict.GetString("binary", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetString("dict", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetString("list", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetString("DNE", static_cast<std::string*>(nullptr)));
-
-  EXPECT_FALSE(main_dict.GetString("bool", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetString("int", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetString("double", static_cast<string16*>(nullptr)));
-  EXPECT_TRUE(main_dict.GetString("string", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetString("binary", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetString("dict", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetString("list", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetString("DNE", static_cast<string16*>(nullptr)));
-
-  EXPECT_FALSE(main_dict.GetBinary("bool", nullptr));
-  EXPECT_FALSE(main_dict.GetBinary("int", nullptr));
-  EXPECT_FALSE(main_dict.GetBinary("double", nullptr));
-  EXPECT_FALSE(main_dict.GetBinary("string", nullptr));
-  EXPECT_TRUE(main_dict.GetBinary("binary", nullptr));
-  EXPECT_FALSE(main_dict.GetBinary("dict", nullptr));
-  EXPECT_FALSE(main_dict.GetBinary("list", nullptr));
-  EXPECT_FALSE(main_dict.GetBinary("DNE", nullptr));
-
-  EXPECT_FALSE(main_dict.GetDictionary("bool", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("int", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("double", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("string", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("binary", nullptr));
-  EXPECT_TRUE(main_dict.GetDictionary("dict", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("list", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionary("DNE", nullptr));
-
-  EXPECT_FALSE(main_dict.GetList("bool", nullptr));
-  EXPECT_FALSE(main_dict.GetList("int", nullptr));
-  EXPECT_FALSE(main_dict.GetList("double", nullptr));
-  EXPECT_FALSE(main_dict.GetList("string", nullptr));
-  EXPECT_FALSE(main_dict.GetList("binary", nullptr));
-  EXPECT_FALSE(main_dict.GetList("dict", nullptr));
-  EXPECT_TRUE(main_dict.GetList("list", nullptr));
-  EXPECT_FALSE(main_dict.GetList("DNE", nullptr));
-
-  EXPECT_TRUE(main_dict.GetWithoutPathExpansion("bool", nullptr));
-  EXPECT_TRUE(main_dict.GetWithoutPathExpansion("int", nullptr));
-  EXPECT_TRUE(main_dict.GetWithoutPathExpansion("double", nullptr));
-  EXPECT_TRUE(main_dict.GetWithoutPathExpansion("string", nullptr));
-  EXPECT_TRUE(main_dict.GetWithoutPathExpansion("binary", nullptr));
-  EXPECT_TRUE(main_dict.GetWithoutPathExpansion("dict", nullptr));
-  EXPECT_TRUE(main_dict.GetWithoutPathExpansion("list", nullptr));
-  EXPECT_FALSE(main_dict.GetWithoutPathExpansion("DNE", nullptr));
-
-  EXPECT_TRUE(main_dict.GetBooleanWithoutPathExpansion("bool", nullptr));
-  EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("int", nullptr));
-  EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("double", nullptr));
-  EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("string", nullptr));
-  EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("binary", nullptr));
-  EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("dict", nullptr));
-  EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("list", nullptr));
-  EXPECT_FALSE(main_dict.GetBooleanWithoutPathExpansion("DNE", nullptr));
-
-  EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("bool", nullptr));
-  EXPECT_TRUE(main_dict.GetIntegerWithoutPathExpansion("int", nullptr));
-  EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("double", nullptr));
-  EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("string", nullptr));
-  EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("binary", nullptr));
-  EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("dict", nullptr));
-  EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("list", nullptr));
-  EXPECT_FALSE(main_dict.GetIntegerWithoutPathExpansion("DNE", nullptr));
-
-  EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("bool", nullptr));
-  EXPECT_TRUE(main_dict.GetDoubleWithoutPathExpansion("int", nullptr));
-  EXPECT_TRUE(main_dict.GetDoubleWithoutPathExpansion("double", nullptr));
-  EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("string", nullptr));
-  EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("binary", nullptr));
-  EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("dict", nullptr));
-  EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("list", nullptr));
-  EXPECT_FALSE(main_dict.GetDoubleWithoutPathExpansion("DNE", nullptr));
-
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "bool", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "int", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "double", static_cast<std::string*>(nullptr)));
-  EXPECT_TRUE(main_dict.GetStringWithoutPathExpansion(
-      "string", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "binary", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "dict", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "list", static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "DNE", static_cast<std::string*>(nullptr)));
-
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "bool", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "int", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "double", static_cast<string16*>(nullptr)));
-  EXPECT_TRUE(main_dict.GetStringWithoutPathExpansion(
-      "string", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "binary", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "dict", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "list", static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_dict.GetStringWithoutPathExpansion(
-      "DNE", static_cast<string16*>(nullptr)));
-
-  // There is no GetBinaryWithoutPathExpansion for some reason, but if there
-  // were it should be tested here...
-
-  EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("bool", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("int", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("double", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("string", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("binary", nullptr));
-  EXPECT_TRUE(main_dict.GetDictionaryWithoutPathExpansion("dict", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("list", nullptr));
-  EXPECT_FALSE(main_dict.GetDictionaryWithoutPathExpansion("DNE", nullptr));
-
-  EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("bool", nullptr));
-  EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("int", nullptr));
-  EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("double", nullptr));
-  EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("string", nullptr));
-  EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("binary", nullptr));
-  EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("dict", nullptr));
-  EXPECT_TRUE(main_dict.GetListWithoutPathExpansion("list", nullptr));
-  EXPECT_FALSE(main_dict.GetListWithoutPathExpansion("DNE", nullptr));
-
-  EXPECT_TRUE(main_list.Get(0, nullptr));
-  EXPECT_TRUE(main_list.Get(1, nullptr));
-  EXPECT_TRUE(main_list.Get(2, nullptr));
-  EXPECT_TRUE(main_list.Get(3, nullptr));
-  EXPECT_TRUE(main_list.Get(4, nullptr));
-  EXPECT_TRUE(main_list.Get(5, nullptr));
-  EXPECT_TRUE(main_list.Get(6, nullptr));
-  EXPECT_FALSE(main_list.Get(7, nullptr));
-
-  EXPECT_TRUE(main_list.GetBoolean(0, nullptr));
-  EXPECT_FALSE(main_list.GetBoolean(1, nullptr));
-  EXPECT_FALSE(main_list.GetBoolean(2, nullptr));
-  EXPECT_FALSE(main_list.GetBoolean(3, nullptr));
-  EXPECT_FALSE(main_list.GetBoolean(4, nullptr));
-  EXPECT_FALSE(main_list.GetBoolean(5, nullptr));
-  EXPECT_FALSE(main_list.GetBoolean(6, nullptr));
-  EXPECT_FALSE(main_list.GetBoolean(7, nullptr));
-
-  EXPECT_FALSE(main_list.GetInteger(0, nullptr));
-  EXPECT_TRUE(main_list.GetInteger(1, nullptr));
-  EXPECT_FALSE(main_list.GetInteger(2, nullptr));
-  EXPECT_FALSE(main_list.GetInteger(3, nullptr));
-  EXPECT_FALSE(main_list.GetInteger(4, nullptr));
-  EXPECT_FALSE(main_list.GetInteger(5, nullptr));
-  EXPECT_FALSE(main_list.GetInteger(6, nullptr));
-  EXPECT_FALSE(main_list.GetInteger(7, nullptr));
-
-  EXPECT_FALSE(main_list.GetDouble(0, nullptr));
-  EXPECT_TRUE(main_list.GetDouble(1, nullptr));
-  EXPECT_TRUE(main_list.GetDouble(2, nullptr));
-  EXPECT_FALSE(main_list.GetDouble(3, nullptr));
-  EXPECT_FALSE(main_list.GetDouble(4, nullptr));
-  EXPECT_FALSE(main_list.GetDouble(5, nullptr));
-  EXPECT_FALSE(main_list.GetDouble(6, nullptr));
-  EXPECT_FALSE(main_list.GetDouble(7, nullptr));
-
-  EXPECT_FALSE(main_list.GetString(0, static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(1, static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(2, static_cast<std::string*>(nullptr)));
-  EXPECT_TRUE(main_list.GetString(3, static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(4, static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(5, static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(6, static_cast<std::string*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(7, static_cast<std::string*>(nullptr)));
-
-  EXPECT_FALSE(main_list.GetString(0, static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(1, static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(2, static_cast<string16*>(nullptr)));
-  EXPECT_TRUE(main_list.GetString(3, static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(4, static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(5, static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(6, static_cast<string16*>(nullptr)));
-  EXPECT_FALSE(main_list.GetString(7, static_cast<string16*>(nullptr)));
-
-  EXPECT_FALSE(main_list.GetDictionary(0, nullptr));
-  EXPECT_FALSE(main_list.GetDictionary(1, nullptr));
-  EXPECT_FALSE(main_list.GetDictionary(2, nullptr));
-  EXPECT_FALSE(main_list.GetDictionary(3, nullptr));
-  EXPECT_FALSE(main_list.GetDictionary(4, nullptr));
-  EXPECT_TRUE(main_list.GetDictionary(5, nullptr));
-  EXPECT_FALSE(main_list.GetDictionary(6, nullptr));
-  EXPECT_FALSE(main_list.GetDictionary(7, nullptr));
-
-  EXPECT_FALSE(main_list.GetList(0, nullptr));
-  EXPECT_FALSE(main_list.GetList(1, nullptr));
-  EXPECT_FALSE(main_list.GetList(2, nullptr));
-  EXPECT_FALSE(main_list.GetList(3, nullptr));
-  EXPECT_FALSE(main_list.GetList(4, nullptr));
-  EXPECT_FALSE(main_list.GetList(5, nullptr));
-  EXPECT_TRUE(main_list.GetList(6, nullptr));
-  EXPECT_FALSE(main_list.GetList(7, nullptr));
-}
-
-TEST(ValuesTest, SelfSwap) {
-  base::Value test(1);
-  std::swap(test, test);
-  EXPECT_EQ(1, test.GetInt());
-}
-
-TEST(ValuesTest, FromToUniquePtrValue) {
-  std::unique_ptr<DictionaryValue> dict = std::make_unique<DictionaryValue>();
-  dict->SetString("name", "Froogle");
-  dict->SetString("url", "http://froogle.com");
-  Value dict_copy = dict->Clone();
-
-  Value dict_converted = Value::FromUniquePtrValue(std::move(dict));
-  EXPECT_EQ(dict_copy, dict_converted);
-
-  std::unique_ptr<Value> val =
-      Value::ToUniquePtrValue(std::move(dict_converted));
-  EXPECT_EQ(dict_copy, *val);
-}
-
-}  // namespace base
diff --git a/base/version_unittest.cc b/base/version_unittest.cc
deleted file mode 100644
index 285ca9c..0000000
--- a/base/version_unittest.cc
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/version.h"
-
-#include <stddef.h>
-#include <stdint.h>
-#include <utility>
-
-#include "base/macros.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-TEST(VersionTest, DefaultConstructor) {
-  base::Version v;
-  EXPECT_FALSE(v.IsValid());
-}
-
-TEST(VersionTest, ValueSemantics) {
-  base::Version v1("1.2.3.4");
-  EXPECT_TRUE(v1.IsValid());
-  base::Version v3;
-  EXPECT_FALSE(v3.IsValid());
-  {
-    base::Version v2(v1);
-    v3 = v2;
-    EXPECT_TRUE(v2.IsValid());
-    EXPECT_EQ(v1, v2);
-  }
-  EXPECT_EQ(v3, v1);
-}
-
-TEST(VersionTest, MoveSemantics) {
-  const std::vector<uint32_t> components = {1, 2, 3, 4};
-  base::Version v1(std::move(components));
-  EXPECT_TRUE(v1.IsValid());
-  base::Version v2("1.2.3.4");
-  EXPECT_EQ(v1, v2);
-}
-
-TEST(VersionTest, GetVersionFromString) {
-  static const struct version_string {
-    const char* input;
-    size_t parts;
-    uint32_t firstpart;
-    bool success;
-  } cases[] = {
-    {"", 0, 0, false},
-    {" ", 0, 0, false},
-    {"\t", 0, 0, false},
-    {"\n", 0, 0, false},
-    {"  ", 0, 0, false},
-    {".", 0, 0, false},
-    {" . ", 0, 0, false},
-    {"0", 1, 0, true},
-    {"0.", 0, 0, false},
-    {"0.0", 2, 0, true},
-    {"4294967295.0", 2, 4294967295, true},
-    {"4294967296.0", 0, 0, false},
-    {"-1.0", 0, 0, false},
-    {"1.-1.0", 0, 0, false},
-    {"1,--1.0", 0, 0, false},
-    {"+1.0", 0, 0, false},
-    {"1.+1.0", 0, 0, false},
-    {"1+1.0", 0, 0, false},
-    {"++1.0", 0, 0, false},
-    {"1.0a", 0, 0, false},
-    {"1.2.3.4.5.6.7.8.9.0", 10, 1, true},
-    {"02.1", 0, 0, false},
-    {"0.01", 2, 0, true},
-    {"f.1", 0, 0, false},
-    {"15.007.20011", 3, 15, true},
-    {"15.5.28.130162", 4, 15, true},
-  };
-
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    base::Version version(cases[i].input);
-    EXPECT_EQ(cases[i].success, version.IsValid());
-    if (cases[i].success) {
-      EXPECT_EQ(cases[i].parts, version.components().size());
-      EXPECT_EQ(cases[i].firstpart, version.components()[0]);
-    }
-  }
-}
-
-TEST(VersionTest, Compare) {
-  static const struct version_compare {
-    const char* lhs;
-    const char* rhs;
-    int expected;
-  } cases[] = {
-      {"1.0", "1.0", 0},
-      {"1.0", "0.0", 1},
-      {"1.0", "2.0", -1},
-      {"1.0", "1.1", -1},
-      {"1.1", "1.0", 1},
-      {"1.0", "1.0.1", -1},
-      {"1.1", "1.0.1", 1},
-      {"1.1", "1.0.1", 1},
-      {"1.0.0", "1.0", 0},
-      {"1.0.3", "1.0.20", -1},
-      {"11.0.10", "15.007.20011", -1},
-      {"11.0.10", "15.5.28.130162", -1},
-      {"15.5.28.130162", "15.5.28.130162", 0},
-  };
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    base::Version lhs(cases[i].lhs);
-    base::Version rhs(cases[i].rhs);
-    EXPECT_EQ(lhs.CompareTo(rhs), cases[i].expected) <<
-        cases[i].lhs << " ? " << cases[i].rhs;
-    // CompareToWildcardString() should have same behavior as CompareTo() when
-    // no wildcards are present.
-    EXPECT_EQ(lhs.CompareToWildcardString(cases[i].rhs), cases[i].expected)
-        << cases[i].lhs << " ? " << cases[i].rhs;
-    EXPECT_EQ(rhs.CompareToWildcardString(cases[i].lhs), -cases[i].expected)
-        << cases[i].lhs << " ? " << cases[i].rhs;
-
-    // Test comparison operators
-    switch (cases[i].expected) {
-    case -1:
-      EXPECT_LT(lhs, rhs);
-      EXPECT_LE(lhs, rhs);
-      EXPECT_NE(lhs, rhs);
-      EXPECT_FALSE(lhs == rhs);
-      EXPECT_FALSE(lhs >= rhs);
-      EXPECT_FALSE(lhs > rhs);
-      break;
-    case 0:
-      EXPECT_FALSE(lhs < rhs);
-      EXPECT_LE(lhs, rhs);
-      EXPECT_FALSE(lhs != rhs);
-      EXPECT_EQ(lhs, rhs);
-      EXPECT_GE(lhs, rhs);
-      EXPECT_FALSE(lhs > rhs);
-      break;
-    case 1:
-      EXPECT_FALSE(lhs < rhs);
-      EXPECT_FALSE(lhs <= rhs);
-      EXPECT_NE(lhs, rhs);
-      EXPECT_FALSE(lhs == rhs);
-      EXPECT_GE(lhs, rhs);
-      EXPECT_GT(lhs, rhs);
-      break;
-    }
-  }
-}
-
-TEST(VersionTest, CompareToWildcardString) {
-  static const struct version_compare {
-    const char* lhs;
-    const char* rhs;
-    int expected;
-  } cases[] = {
-    {"1.0", "1.*", 0},
-    {"1.0", "0.*", 1},
-    {"1.0", "2.*", -1},
-    {"1.2.3", "1.2.3.*", 0},
-    {"10.0", "1.0.*", 1},
-    {"1.0", "3.0.*", -1},
-    {"1.4", "1.3.0.*", 1},
-    {"1.3.9", "1.3.*", 0},
-    {"1.4.1", "1.3.*", 1},
-    {"1.3", "1.4.5.*", -1},
-    {"1.5", "1.4.5.*", 1},
-    {"1.3.9", "1.3.*", 0},
-    {"1.2.0.0.0.0", "1.2.*", 0},
-  };
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    const base::Version version(cases[i].lhs);
-    const int result = version.CompareToWildcardString(cases[i].rhs);
-    EXPECT_EQ(result, cases[i].expected) << cases[i].lhs << "?" << cases[i].rhs;
-  }
-}
-
-TEST(VersionTest, IsValidWildcardString) {
-  static const struct version_compare {
-    const char* version;
-    bool expected;
-  } cases[] = {
-    {"1.0", true},
-    {"", false},
-    {"1.2.3.4.5.6", true},
-    {"1.2.3.*", true},
-    {"1.2.3.5*", false},
-    {"1.2.3.56*", false},
-    {"1.*.3", false},
-    {"20.*", true},
-    {"+2.*", false},
-    {"*", false},
-    {"*.2", false},
-  };
-  for (size_t i = 0; i < arraysize(cases); ++i) {
-    EXPECT_EQ(base::Version::IsValidWildcardString(cases[i].version),
-        cases[i].expected) << cases[i].version << "?" << cases[i].expected;
-  }
-}
-
-}  // namespace
diff --git a/base/vlog_unittest.cc b/base/vlog_unittest.cc
deleted file mode 100644
index 3c3f49c..0000000
--- a/base/vlog_unittest.cc
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/vlog.h"
-
-#include "base/logging.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace logging {
-
-namespace {
-
-TEST(VlogTest, NoVmodule) {
-  int min_log_level = 0;
-  EXPECT_EQ(0,
-            VlogInfo(std::string(), std::string(), &min_log_level)
-                .GetVlogLevel("test1"));
-  EXPECT_EQ(0,
-            VlogInfo("0", std::string(), &min_log_level).GetVlogLevel("test2"));
-  EXPECT_EQ(
-      0, VlogInfo("blah", std::string(), &min_log_level).GetVlogLevel("test3"));
-  EXPECT_EQ(
-      0,
-      VlogInfo("0blah1", std::string(), &min_log_level).GetVlogLevel("test4"));
-  EXPECT_EQ(1,
-            VlogInfo("1", std::string(), &min_log_level).GetVlogLevel("test5"));
-  EXPECT_EQ(5,
-            VlogInfo("5", std::string(), &min_log_level).GetVlogLevel("test6"));
-}
-
-TEST(VlogTest, MatchVlogPattern) {
-  // Degenerate cases.
-  EXPECT_TRUE(MatchVlogPattern("", ""));
-  EXPECT_TRUE(MatchVlogPattern("", "****"));
-  EXPECT_FALSE(MatchVlogPattern("", "x"));
-  EXPECT_FALSE(MatchVlogPattern("x", ""));
-
-  // Basic.
-  EXPECT_TRUE(MatchVlogPattern("blah", "blah"));
-
-  // ? should match exactly one character.
-  EXPECT_TRUE(MatchVlogPattern("blah", "bl?h"));
-  EXPECT_FALSE(MatchVlogPattern("blh", "bl?h"));
-  EXPECT_FALSE(MatchVlogPattern("blaah", "bl?h"));
-  EXPECT_TRUE(MatchVlogPattern("blah", "?lah"));
-  EXPECT_FALSE(MatchVlogPattern("lah", "?lah"));
-  EXPECT_FALSE(MatchVlogPattern("bblah", "?lah"));
-
-  // * can match any number (even 0) of characters.
-  EXPECT_TRUE(MatchVlogPattern("blah", "bl*h"));
-  EXPECT_TRUE(MatchVlogPattern("blabcdefh", "bl*h"));
-  EXPECT_TRUE(MatchVlogPattern("blh", "bl*h"));
-  EXPECT_TRUE(MatchVlogPattern("blah", "*blah"));
-  EXPECT_TRUE(MatchVlogPattern("ohblah", "*blah"));
-  EXPECT_TRUE(MatchVlogPattern("blah", "blah*"));
-  EXPECT_TRUE(MatchVlogPattern("blahhhh", "blah*"));
-  EXPECT_TRUE(MatchVlogPattern("blahhhh", "blah*"));
-  EXPECT_TRUE(MatchVlogPattern("blah", "*blah*"));
-  EXPECT_TRUE(MatchVlogPattern("blahhhh", "*blah*"));
-  EXPECT_TRUE(MatchVlogPattern("bbbblahhhh", "*blah*"));
-
-  // Multiple *s should work fine.
-  EXPECT_TRUE(MatchVlogPattern("ballaah", "b*la*h"));
-  EXPECT_TRUE(MatchVlogPattern("blah", "b*la*h"));
-  EXPECT_TRUE(MatchVlogPattern("bbbblah", "b*la*h"));
-  EXPECT_TRUE(MatchVlogPattern("blaaah", "b*la*h"));
-
-  // There should be no escaping going on.
-  EXPECT_TRUE(MatchVlogPattern("bl\\ah", "bl\\?h"));
-  EXPECT_FALSE(MatchVlogPattern("bl?h", "bl\\?h"));
-  EXPECT_TRUE(MatchVlogPattern("bl\\aaaah", "bl\\*h"));
-  EXPECT_FALSE(MatchVlogPattern("bl*h", "bl\\*h"));
-
-  // Any slash matches any slash.
-  EXPECT_TRUE(MatchVlogPattern("/b\\lah", "/b\\lah"));
-  EXPECT_TRUE(MatchVlogPattern("\\b/lah", "/b\\lah"));
-}
-
-TEST(VlogTest, VmoduleBasic) {
-  const char kVSwitch[] = "-1";
-  const char kVModuleSwitch[] =
-      "foo=,bar=0,baz=blah,,qux=0blah1,quux=1,corge.ext=5";
-  int min_log_level = 0;
-  VlogInfo vlog_info(kVSwitch, kVModuleSwitch, &min_log_level);
-  EXPECT_EQ(-1, vlog_info.GetVlogLevel("/path/to/grault.cc"));
-  EXPECT_EQ(0, vlog_info.GetVlogLevel("/path/to/foo.cc"));
-  EXPECT_EQ(0, vlog_info.GetVlogLevel("D:\\Path\\To\\bar-inl.mm"));
-  EXPECT_EQ(-1, vlog_info.GetVlogLevel("D:\\path\\to what/bar_unittest.m"));
-  EXPECT_EQ(0, vlog_info.GetVlogLevel("baz.h"));
-  EXPECT_EQ(0, vlog_info.GetVlogLevel("/another/path/to/qux.h"));
-  EXPECT_EQ(1, vlog_info.GetVlogLevel("/path/to/quux"));
-  EXPECT_EQ(5, vlog_info.GetVlogLevel("c:\\path/to/corge.ext.h"));
-}
-
-TEST(VlogTest, VmoduleDirs) {
-  const char kVModuleSwitch[] =
-      "foo/bar.cc=1,baz\\*\\qux.cc=2,*quux/*=3,*/*-inl.h=4";
-  int min_log_level = 0;
-  VlogInfo vlog_info(std::string(), kVModuleSwitch, &min_log_level);
-  EXPECT_EQ(0, vlog_info.GetVlogLevel("/foo/bar.cc"));
-  EXPECT_EQ(0, vlog_info.GetVlogLevel("bar.cc"));
-  EXPECT_EQ(1, vlog_info.GetVlogLevel("foo/bar.cc"));
-
-  EXPECT_EQ(0, vlog_info.GetVlogLevel("baz/grault/qux.h"));
-  EXPECT_EQ(0, vlog_info.GetVlogLevel("/baz/grault/qux.cc"));
-  EXPECT_EQ(2, vlog_info.GetVlogLevel("baz/grault/qux.cc"));
-  EXPECT_EQ(2, vlog_info.GetVlogLevel("baz/grault/blah/qux.cc"));
-  EXPECT_EQ(2, vlog_info.GetVlogLevel("baz\\grault\\qux.cc"));
-  EXPECT_EQ(2, vlog_info.GetVlogLevel("baz\\grault//blah\\qux.cc"));
-
-  EXPECT_EQ(0, vlog_info.GetVlogLevel("/foo/bar/baz/quux.cc"));
-  EXPECT_EQ(3, vlog_info.GetVlogLevel("/foo/bar/baz/quux/grault.cc"));
-  EXPECT_EQ(3, vlog_info.GetVlogLevel("/foo\\bar/baz\\quux/grault.cc"));
-
-  EXPECT_EQ(0, vlog_info.GetVlogLevel("foo/bar/test-inl.cc"));
-  EXPECT_EQ(4, vlog_info.GetVlogLevel("foo/bar/test-inl.h"));
-  EXPECT_EQ(4, vlog_info.GetVlogLevel("foo/bar/baz/blah-inl.h"));
-}
-
-}  // namespace
-
-}  // namespace logging
diff --git a/base/win/BUILD.gn b/base/win/BUILD.gn
deleted file mode 100644
index 19c2982..0000000
--- a/base/win/BUILD.gn
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (c) 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/buildflag_header.gni")
-
-declare_args() {
-  # Indicates if the handle verifier should operate in a single module mode. By
-  # default a single instance gets shared by all the modules.
-  single_module_mode_handle_verifier = false
-}
-
-# Ensure that the handle verifier is always used in a single module mode for the
-# component builds.
-if (is_component_build) {
-  single_module_mode_handle_verifier = true
-}
-
-buildflag_header("base_win_buildflags") {
-  header = "base_win_buildflags.h"
-  header_dir = "base/win"
-  flags = [
-    "SINGLE_MODULE_MODE_HANDLE_VERIFIER=$single_module_mode_handle_verifier",
-  ]
-}
-
-static_library("pe_image") {
-  sources = [
-    "pe_image.cc",
-    "pe_image.h",
-  ]
-}
diff --git a/base/win/async_operation_unittest.cc b/base/win/async_operation_unittest.cc
deleted file mode 100644
index b29e181..0000000
--- a/base/win/async_operation_unittest.cc
+++ /dev/null
@@ -1,174 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/async_operation.h"
-
-#include <utility>
-
-#include "base/test/gtest_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace WRL = Microsoft::WRL;
-
-using ABI::Windows::Foundation::IAsyncOperation;
-using ABI::Windows::Foundation::IAsyncOperationCompletedHandler;
-
-// In order to exercise the interface logic of AsyncOperation we define an empty
-// dummy interface, its implementation, and the necessary boilerplate to hook it
-// up with IAsyncOperation and IAsyncOperationCompletedHandler.
-namespace {
-
-// Chosen by fair `uuidgen` invocation. Also applies to the UUIDs below.
-MIDL_INTERFACE("756358C7-8083-4D78-9D27-9278B76096d4")
-IFooBar : public IInspectable{};
-
-class FooBar
-    : public WRL::RuntimeClass<
-          WRL::RuntimeClassFlags<WRL::WinRt | WRL::InhibitRoOriginateError>,
-          IFooBar> {};
-
-}  // namespace
-
-namespace ABI {
-namespace Windows {
-namespace Foundation {
-
-// Provide the required template specializations to register
-// IAsyncOperation<Foobar*> as an AggregateType. This is similar to how it is
-// done for UWP classes.
-template <>
-struct DECLSPEC_UUID("124858e4-f97e-409c-86ae-418c4781144c")
-    IAsyncOperation<FooBar*>
-    : IAsyncOperation_impl<Internal::AggregateType<FooBar*, IFooBar*>> {
-  static const wchar_t* z_get_rc_name_impl() {
-    return L"Windows.Foundation.IAsyncOperation<FooBar>";
-  }
-};
-
-template <>
-struct DECLSPEC_UUID("9e49373c-200c-4715-abd7-4214ba669c81")
-    IAsyncOperationCompletedHandler<FooBar*>
-    : IAsyncOperationCompletedHandler_impl<
-          Internal::AggregateType<FooBar*, IFooBar*>> {
-  static const wchar_t* z_get_rc_name_impl() {
-    return L"Windows.Foundation.AsyncOperationCompletedHandler<FooBar>";
-  }
-};
-
-}  // namespace Foundation
-}  // namespace Windows
-}  // namespace ABI
-
-namespace base {
-namespace win {
-
-namespace {
-
-// Utility method to add a completion callback to |async_op|. |*called_cb| will
-// be set to true once the callback is invoked.
-template <typename T>
-void PutCallback(AsyncOperation<T>* async_op, bool* called_cb) {
-  async_op->put_Completed(
-      WRL::Callback<IAsyncOperationCompletedHandler<T>>(
-          [=](IAsyncOperation<T>* iasync_op, AsyncStatus status) {
-            EXPECT_EQ(async_op, iasync_op);
-            *called_cb = true;
-            return S_OK;
-          })
-          .Get());
-}
-
-}  // namespace
-
-TEST(AsyncOperationTest, TestInt) {
-  bool called_cb = false;
-
-  auto int_op = WRL::Make<AsyncOperation<int>>();
-  PutCallback(int_op.Get(), &called_cb);
-
-  int results;
-  EXPECT_TRUE(FAILED(int_op->GetResults(&results)));
-  EXPECT_FALSE(called_cb);
-  int_op->callback().Run(123);
-
-  EXPECT_TRUE(called_cb);
-  EXPECT_TRUE(SUCCEEDED(int_op->GetResults(&results)));
-  EXPECT_EQ(123, results);
-
-  // GetResults should be idempotent.
-  EXPECT_TRUE(SUCCEEDED(int_op->GetResults(&results)));
-  EXPECT_EQ(123, results);
-}
-
-TEST(AsyncOperationTest, TestBool) {
-  bool called_cb = false;
-
-  auto bool_op = WRL::Make<AsyncOperation<bool>>();
-  PutCallback(bool_op.Get(), &called_cb);
-
-  // AsyncOperation<bool> is an aggregate of bool and boolean, and requires a
-  // pointer to the latter to get the results.
-  boolean results;
-  EXPECT_TRUE(FAILED(bool_op->GetResults(&results)));
-  EXPECT_FALSE(called_cb);
-  bool_op->callback().Run(true);
-
-  EXPECT_TRUE(called_cb);
-  EXPECT_TRUE(SUCCEEDED(bool_op->GetResults(&results)));
-  EXPECT_TRUE(results);
-}
-
-TEST(AsyncOperationTest, TestInterface) {
-  bool called_cb = false;
-
-  auto foobar_op = WRL::Make<AsyncOperation<FooBar*>>();
-  PutCallback(foobar_op.Get(), &called_cb);
-
-  // AsyncOperation<FooBar*> is an aggregate of FooBar* and IFooBar*.
-  WRL::ComPtr<IFooBar> results;
-  EXPECT_TRUE(FAILED(foobar_op->GetResults(&results)));
-  EXPECT_FALSE(called_cb);
-
-  auto foobar = WRL::Make<FooBar>();
-  IFooBar* foobar_ptr = foobar.Get();
-  foobar_op->callback().Run(std::move(foobar));
-
-  EXPECT_TRUE(called_cb);
-  EXPECT_TRUE(SUCCEEDED(foobar_op->GetResults(&results)));
-  EXPECT_EQ(foobar_ptr, results.Get());
-}
-
-TEST(AsyncOperationTest, TestIdempotence) {
-  bool called_cb = false;
-
-  auto int_op = WRL::Make<AsyncOperation<int>>();
-  PutCallback(int_op.Get(), &called_cb);
-
-  int results;
-  EXPECT_TRUE(FAILED(int_op->GetResults(&results)));
-  EXPECT_FALSE(called_cb);
-  // Calling GetResults twice shouldn't change the result.
-  EXPECT_TRUE(FAILED(int_op->GetResults(&results)));
-  EXPECT_FALSE(called_cb);
-
-  int_op->callback().Run(42);
-
-  EXPECT_TRUE(called_cb);
-  EXPECT_TRUE(SUCCEEDED(int_op->GetResults(&results)));
-  EXPECT_EQ(42, results);
-  // Calling GetResults twice shouldn't change the result.
-  EXPECT_TRUE(SUCCEEDED(int_op->GetResults(&results)));
-  EXPECT_EQ(42, results);
-}
-
-TEST(AsyncOperationTest, DoubleCallbackFails) {
-  auto int_op = WRL::Make<AsyncOperation<int>>();
-  auto cb = int_op->callback();
-
-  // Obtaining another callback should result in a DCHECK failure.
-  EXPECT_DCHECK_DEATH(int_op->callback());
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/com_init_check_hook_unittest.cc b/base/win/com_init_check_hook_unittest.cc
deleted file mode 100644
index 32aede4..0000000
--- a/base/win/com_init_check_hook_unittest.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/com_init_check_hook.h"
-
-#include <objbase.h>
-#include <shlobj.h>
-#include <wrl/client.h>
-
-#include "base/test/gtest_util.h"
-#include "base/win/com_init_util.h"
-#include "base/win/patch_util.h"
-#include "base/win/scoped_com_initializer.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-using Microsoft::WRL::ComPtr;
-
-TEST(ComInitCheckHook, AssertNotInitialized) {
-  ComInitCheckHook com_check_hook;
-  AssertComApartmentType(ComApartmentType::NONE);
-  ComPtr<IUnknown> shell_link;
-#if defined(COM_INIT_CHECK_HOOK_ENABLED)
-  EXPECT_DCHECK_DEATH(::CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_ALL,
-                                         IID_PPV_ARGS(&shell_link)));
-#else
-  EXPECT_EQ(CO_E_NOTINITIALIZED,
-            ::CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_ALL,
-                               IID_PPV_ARGS(&shell_link)));
-#endif
-}
-
-TEST(ComInitCheckHook, HookRemoval) {
-  AssertComApartmentType(ComApartmentType::NONE);
-  { ComInitCheckHook com_check_hook; }
-  ComPtr<IUnknown> shell_link;
-  EXPECT_EQ(CO_E_NOTINITIALIZED,
-            ::CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_ALL,
-                               IID_PPV_ARGS(&shell_link)));
-}
-
-TEST(ComInitCheckHook, NoAssertComInitialized) {
-  ComInitCheckHook com_check_hook;
-  ScopedCOMInitializer com_initializer;
-  ComPtr<IUnknown> shell_link;
-  EXPECT_TRUE(SUCCEEDED(::CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_ALL,
-                                           IID_PPV_ARGS(&shell_link))));
-}
-
-TEST(ComInitCheckHook, MultipleHooks) {
-  ComInitCheckHook com_check_hook_1;
-  ComInitCheckHook com_check_hook_2;
-  AssertComApartmentType(ComApartmentType::NONE);
-  ComPtr<IUnknown> shell_link;
-#if defined(COM_INIT_CHECK_HOOK_ENABLED)
-  EXPECT_DCHECK_DEATH(::CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_ALL,
-                                         IID_PPV_ARGS(&shell_link)));
-#else
-  EXPECT_EQ(CO_E_NOTINITIALIZED,
-            ::CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_ALL,
-                               IID_PPV_ARGS(&shell_link)));
-#endif
-}
-
-TEST(ComInitCheckHook, UnexpectedHook) {
-#if defined(COM_INIT_CHECK_HOOK_ENABLED)
-  HMODULE ole32_library = ::LoadLibrary(L"ole32.dll");
-  ASSERT_TRUE(ole32_library);
-
-  uint32_t co_create_instance_padded_address =
-      reinterpret_cast<uint32_t>(
-          GetProcAddress(ole32_library, "CoCreateInstance")) - 5;
-  const unsigned char* co_create_instance_bytes =
-      reinterpret_cast<const unsigned char*>(co_create_instance_padded_address);
-  const unsigned char original_byte = co_create_instance_bytes[0];
-  const unsigned char unexpected_byte = 0xdb;
-  ASSERT_EQ(static_cast<DWORD>(NO_ERROR),
-            internal::ModifyCode(
-                reinterpret_cast<void*>(co_create_instance_padded_address),
-                reinterpret_cast<const void*>(&unexpected_byte),
-                sizeof(unexpected_byte)));
-
-  EXPECT_DCHECK_DEATH({ ComInitCheckHook com_check_hook; });
-
-  // If this call fails, really bad things are going to happen to other tests
-  // so CHECK here.
-  CHECK_EQ(static_cast<DWORD>(NO_ERROR),
-           internal::ModifyCode(
-               reinterpret_cast<void*>(co_create_instance_padded_address),
-               reinterpret_cast<const void*>(&original_byte),
-               sizeof(original_byte)));
-
-  ::FreeLibrary(ole32_library);
-  ole32_library = nullptr;
-#endif
-}
-
-TEST(ComInitCheckHook, ExternallyHooked) {
-#if defined(COM_INIT_CHECK_HOOK_ENABLED)
-  HMODULE ole32_library = ::LoadLibrary(L"ole32.dll");
-  ASSERT_TRUE(ole32_library);
-
-  uint32_t co_create_instance_address = reinterpret_cast<uint32_t>(
-      GetProcAddress(ole32_library, "CoCreateInstance"));
-  const unsigned char* co_create_instance_bytes =
-      reinterpret_cast<const unsigned char*>(co_create_instance_address);
-  const unsigned char original_byte = co_create_instance_bytes[0];
-  const unsigned char jmp_byte = 0xe9;
-  ASSERT_EQ(static_cast<DWORD>(NO_ERROR),
-            internal::ModifyCode(
-                reinterpret_cast<void*>(co_create_instance_address),
-                reinterpret_cast<const void*>(&jmp_byte), sizeof(jmp_byte)));
-
-  // Externally patched instances should crash so we catch these cases on bots.
-  EXPECT_DCHECK_DEATH({ ComInitCheckHook com_check_hook; });
-
-  // If this call fails, really bad things are going to happen to other tests
-  // so CHECK here.
-  CHECK_EQ(
-      static_cast<DWORD>(NO_ERROR),
-      internal::ModifyCode(reinterpret_cast<void*>(co_create_instance_address),
-                           reinterpret_cast<const void*>(&original_byte),
-                           sizeof(original_byte)));
-
-  ::FreeLibrary(ole32_library);
-  ole32_library = nullptr;
-#endif
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/com_init_util_unittest.cc b/base/win/com_init_util_unittest.cc
deleted file mode 100644
index fb897dd..0000000
--- a/base/win/com_init_util_unittest.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/com_init_util.h"
-
-#include "base/test/gtest_util.h"
-#include "base/win/scoped_com_initializer.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-TEST(ComInitUtil, AssertNotInitialized) {
-  EXPECT_DCHECK_DEATH(AssertComInitialized());
-}
-
-TEST(ComInitUtil, AssertUninitialized) {
-  // When COM is uninitialized, the TLS data will remain, but the apartment
-  // status will be updated. This covers that case.
-  {
-    ScopedCOMInitializer com_initializer;
-    ASSERT_TRUE(com_initializer.Succeeded());
-  }
-  EXPECT_DCHECK_DEATH(AssertComInitialized());
-}
-
-TEST(ComInitUtil, AssertSTAInitialized) {
-  ScopedCOMInitializer com_initializer;
-  ASSERT_TRUE(com_initializer.Succeeded());
-
-  AssertComInitialized();
-}
-
-TEST(ComInitUtil, AssertMTAInitialized) {
-  ScopedCOMInitializer com_initializer(ScopedCOMInitializer::kMTA);
-  ASSERT_TRUE(com_initializer.Succeeded());
-
-  AssertComInitialized();
-}
-
-TEST(ComInitUtil, AssertNoneApartmentType) {
-  AssertComApartmentType(ComApartmentType::NONE);
-  EXPECT_DCHECK_DEATH(AssertComApartmentType(ComApartmentType::STA));
-  EXPECT_DCHECK_DEATH(AssertComApartmentType(ComApartmentType::MTA));
-}
-
-TEST(ComInitUtil, AssertNoneApartmentTypeUninitialized) {
-  // When COM is uninitialized, the TLS data will remain, but the apartment
-  // status will be updated. This covers that case.
-  {
-    ScopedCOMInitializer com_initializer;
-    ASSERT_TRUE(com_initializer.Succeeded());
-  }
-  AssertComApartmentType(ComApartmentType::NONE);
-  EXPECT_DCHECK_DEATH(AssertComApartmentType(ComApartmentType::STA));
-  EXPECT_DCHECK_DEATH(AssertComApartmentType(ComApartmentType::MTA));
-}
-
-TEST(ComInitUtil, AssertSTAApartmentType) {
-  ScopedCOMInitializer com_initializer;
-  EXPECT_DCHECK_DEATH(AssertComApartmentType(ComApartmentType::NONE));
-  AssertComApartmentType(ComApartmentType::STA);
-  EXPECT_DCHECK_DEATH(AssertComApartmentType(ComApartmentType::MTA));
-}
-
-TEST(ComInitUtil, AssertMTAApartmentType) {
-  ScopedCOMInitializer com_initializer(ScopedCOMInitializer::kMTA);
-  EXPECT_DCHECK_DEATH(AssertComApartmentType(ComApartmentType::NONE));
-  EXPECT_DCHECK_DEATH(AssertComApartmentType(ComApartmentType::STA));
-  AssertComApartmentType(ComApartmentType::MTA);
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/core_winrt_util_unittest.cc b/base/win/core_winrt_util_unittest.cc
deleted file mode 100644
index 11d08b8..0000000
--- a/base/win/core_winrt_util_unittest.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/core_winrt_util.h"
-
-#include "base/win/com_init_util.h"
-#include "base/win/scoped_com_initializer.h"
-#include "base/win/windows_version.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-TEST(CoreWinrtUtilTest, PreloadFunctions) {
-  if (GetVersion() < VERSION_WIN8)
-    EXPECT_FALSE(ResolveCoreWinRTDelayload());
-  else
-    EXPECT_TRUE(ResolveCoreWinRTDelayload());
-}
-
-TEST(CoreWinrtUtilTest, RoInitializeAndUninitialize) {
-  if (GetVersion() < VERSION_WIN8)
-    return;
-
-  ASSERT_TRUE(ResolveCoreWinRTDelayload());
-  ASSERT_HRESULT_SUCCEEDED(base::win::RoInitialize(RO_INIT_MULTITHREADED));
-  AssertComApartmentType(ComApartmentType::MTA);
-  base::win::RoUninitialize();
-  AssertComApartmentType(ComApartmentType::NONE);
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/enum_variant_unittest.cc b/base/win/enum_variant_unittest.cc
deleted file mode 100644
index 288c97e..0000000
--- a/base/win/enum_variant_unittest.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/enum_variant.h"
-
-#include "base/win/scoped_com_initializer.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-TEST(EnumVariantTest, EmptyEnumVariant) {
-  ScopedCOMInitializer com_initializer;
-
-  EnumVariant* ev = new EnumVariant(0);
-  ev->AddRef();
-
-  IUnknown* iunknown;
-  EXPECT_TRUE(SUCCEEDED(
-      ev->QueryInterface(IID_IUnknown, reinterpret_cast<void**>(&iunknown))));
-  iunknown->Release();
-
-  IEnumVARIANT* ienumvariant;
-  EXPECT_TRUE(SUCCEEDED(
-      ev->QueryInterface(IID_IEnumVARIANT,
-                         reinterpret_cast<void**>(&ienumvariant))));
-  EXPECT_EQ(ev, ienumvariant);
-  ienumvariant->Release();
-
-  VARIANT out_element;
-  ULONG out_received = 0;
-  EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received));
-  EXPECT_EQ(0u, out_received);
-
-  EXPECT_EQ(S_FALSE, ev->Skip(1));
-
-  EXPECT_EQ(S_OK, ev->Reset());
-
-  IEnumVARIANT* ev2 = NULL;
-  EXPECT_EQ(S_OK, ev->Clone(&ev2));
-
-  EXPECT_NE(static_cast<IEnumVARIANT*>(NULL), ev2);
-  EXPECT_NE(ev, ev2);
-  EXPECT_EQ(S_FALSE, ev2->Skip(1));
-  EXPECT_EQ(S_OK, ev2->Reset());
-
-  ULONG ev2_finalrefcount = ev2->Release();
-  EXPECT_EQ(0u, ev2_finalrefcount);
-
-  ULONG ev_finalrefcount = ev->Release();
-  EXPECT_EQ(0u, ev_finalrefcount);
-}
-
-TEST(EnumVariantTest, SimpleEnumVariant) {
-  ScopedCOMInitializer com_initializer;
-
-  EnumVariant* ev = new EnumVariant(3);
-  ev->AddRef();
-  ev->ItemAt(0)->vt = VT_I4;
-  ev->ItemAt(0)->lVal = 10;
-  ev->ItemAt(1)->vt = VT_I4;
-  ev->ItemAt(1)->lVal = 20;
-  ev->ItemAt(2)->vt = VT_I4;
-  ev->ItemAt(2)->lVal = 30;
-
-  // Get elements one at a time.
-  VARIANT out_element;
-  ULONG out_received = 0;
-  EXPECT_EQ(S_OK, ev->Next(1, &out_element, &out_received));
-  EXPECT_EQ(1u, out_received);
-  EXPECT_EQ(VT_I4, out_element.vt);
-  EXPECT_EQ(10, out_element.lVal);
-  EXPECT_EQ(S_OK, ev->Skip(1));
-  EXPECT_EQ(S_OK, ev->Next(1, &out_element, &out_received));
-  EXPECT_EQ(1u, out_received);
-  EXPECT_EQ(VT_I4, out_element.vt);
-  EXPECT_EQ(30, out_element.lVal);
-  EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received));
-
-  // Reset and get all elements at once.
-  VARIANT out_elements[3];
-  EXPECT_EQ(S_OK, ev->Reset());
-  EXPECT_EQ(S_OK, ev->Next(3, out_elements, &out_received));
-  EXPECT_EQ(3u, out_received);
-  EXPECT_EQ(VT_I4, out_elements[0].vt);
-  EXPECT_EQ(10, out_elements[0].lVal);
-  EXPECT_EQ(VT_I4, out_elements[1].vt);
-  EXPECT_EQ(20, out_elements[1].lVal);
-  EXPECT_EQ(VT_I4, out_elements[2].vt);
-  EXPECT_EQ(30, out_elements[2].lVal);
-  EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received));
-
-  // Clone it.
-  IEnumVARIANT* ev2 = NULL;
-  EXPECT_EQ(S_OK, ev->Clone(&ev2));
-  EXPECT_TRUE(ev2 != NULL);
-  EXPECT_EQ(S_FALSE, ev->Next(1, &out_element, &out_received));
-  EXPECT_EQ(S_OK, ev2->Reset());
-  EXPECT_EQ(S_OK, ev2->Next(3, out_elements, &out_received));
-  EXPECT_EQ(3u, out_received);
-  EXPECT_EQ(VT_I4, out_elements[0].vt);
-  EXPECT_EQ(10, out_elements[0].lVal);
-  EXPECT_EQ(VT_I4, out_elements[1].vt);
-  EXPECT_EQ(20, out_elements[1].lVal);
-  EXPECT_EQ(VT_I4, out_elements[2].vt);
-  EXPECT_EQ(30, out_elements[2].lVal);
-  EXPECT_EQ(S_FALSE, ev2->Next(1, &out_element, &out_received));
-
-  ULONG ev2_finalrefcount = ev2->Release();
-  EXPECT_EQ(0u, ev2_finalrefcount);
-
-  ULONG ev_finalrefcount = ev->Release();
-  EXPECT_EQ(0u, ev_finalrefcount);
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/event_trace_consumer_unittest.cc b/base/win/event_trace_consumer_unittest.cc
deleted file mode 100644
index 9c4c242..0000000
--- a/base/win/event_trace_consumer_unittest.cc
+++ /dev/null
@@ -1,367 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Unit tests for event trace consumer base class.
-#include "base/win/event_trace_consumer.h"
-
-#include <list>
-
-#include <objbase.h>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/process/process_handle.h"
-#include "base/strings/stringprintf.h"
-#include "base/win/event_trace_controller.h"
-#include "base/win/event_trace_provider.h"
-#include "base/win/scoped_handle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#include <initguid.h>  // NOLINT - has to be last
-
-namespace base {
-namespace win {
-
-namespace {
-
-typedef std::list<EVENT_TRACE> EventQueue;
-
-class TestConsumer: public EtwTraceConsumerBase<TestConsumer> {
- public:
-  TestConsumer() {
-    sank_event_.Set(::CreateEvent(NULL, TRUE, FALSE, NULL));
-    ClearQueue();
-  }
-
-  ~TestConsumer() {
-    ClearQueue();
-    sank_event_.Close();
-  }
-
-  void ClearQueue() {
-    for (EventQueue::const_iterator it(events_.begin()), end(events_.end());
-         it != end; ++it) {
-      delete[] reinterpret_cast<char*>(it->MofData);
-    }
-
-    events_.clear();
-  }
-
-  static void EnqueueEvent(EVENT_TRACE* event) {
-    events_.push_back(*event);
-    EVENT_TRACE& back = events_.back();
-
-    if (event->MofData != NULL && event->MofLength != 0) {
-      back.MofData = new char[event->MofLength];
-      memcpy(back.MofData, event->MofData, event->MofLength);
-    }
-  }
-
-  static void ProcessEvent(EVENT_TRACE* event) {
-    EnqueueEvent(event);
-    ::SetEvent(sank_event_.Get());
-  }
-
-  static ScopedHandle sank_event_;
-  static EventQueue events_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestConsumer);
-};
-
-ScopedHandle TestConsumer::sank_event_;
-EventQueue TestConsumer::events_;
-
-class EtwTraceConsumerBaseTest: public testing::Test {
- public:
-  EtwTraceConsumerBaseTest()
-      : session_name_(StringPrintf(L"TestSession-%d", GetCurrentProcId())) {
-  }
-
-  void SetUp() override {
-    // Cleanup any potentially dangling sessions.
-    EtwTraceProperties ignore;
-    EtwTraceController::Stop(session_name_.c_str(), &ignore);
-
-    // Allocate a new GUID for each provider test.
-    ASSERT_HRESULT_SUCCEEDED(::CoCreateGuid(&test_provider_));
-  }
-
-  void TearDown() override {
-    // Cleanup any potentially dangling sessions.
-    EtwTraceProperties ignore;
-    EtwTraceController::Stop(session_name_.c_str(), &ignore);
-  }
-
- protected:
-  GUID test_provider_;
-  std::wstring session_name_;
-};
-
-}  // namespace
-
-TEST_F(EtwTraceConsumerBaseTest, Initialize) {
-  TestConsumer consumer_;
-}
-
-TEST_F(EtwTraceConsumerBaseTest, OpenRealtimeSucceedsWhenNoSession) {
-  TestConsumer consumer_;
-  ASSERT_HRESULT_SUCCEEDED(
-      consumer_.OpenRealtimeSession(session_name_.c_str()));
-}
-
-TEST_F(EtwTraceConsumerBaseTest, ConsumerImmediateFailureWhenNoSession) {
-  TestConsumer consumer_;
-  ASSERT_HRESULT_SUCCEEDED(
-      consumer_.OpenRealtimeSession(session_name_.c_str()));
-  ASSERT_HRESULT_FAILED(consumer_.Consume());
-}
-
-namespace {
-
-class EtwTraceConsumerRealtimeTest: public EtwTraceConsumerBaseTest {
- public:
-  void SetUp() override {
-    EtwTraceConsumerBaseTest::SetUp();
-    ASSERT_HRESULT_SUCCEEDED(
-        consumer_.OpenRealtimeSession(session_name_.c_str()));
-  }
-
-  void TearDown() override {
-    consumer_.Close();
-    EtwTraceConsumerBaseTest::TearDown();
-  }
-
-  DWORD ConsumerThread() {
-    ::SetEvent(consumer_ready_.Get());
-    return consumer_.Consume();
-  }
-
-  static DWORD WINAPI ConsumerThreadMainProc(void* arg) {
-    return reinterpret_cast<EtwTraceConsumerRealtimeTest*>(arg)->
-        ConsumerThread();
-  }
-
-  HRESULT StartConsumerThread() {
-    consumer_ready_.Set(::CreateEvent(NULL, TRUE, FALSE, NULL));
-    EXPECT_TRUE(consumer_ready_.IsValid());
-    consumer_thread_.Set(::CreateThread(NULL, 0, ConsumerThreadMainProc, this,
-                                        0, NULL));
-    if (consumer_thread_.Get() == NULL)
-      return HRESULT_FROM_WIN32(::GetLastError());
-
-    HANDLE events[] = { consumer_ready_.Get(), consumer_thread_.Get() };
-    DWORD result = ::WaitForMultipleObjects(arraysize(events), events,
-                                            FALSE, INFINITE);
-    switch (result) {
-      case WAIT_OBJECT_0:
-        // The event was set, the consumer_ is ready.
-        return S_OK;
-      case WAIT_OBJECT_0 + 1: {
-          // The thread finished. This may race with the event, so check
-          // explicitly for the event here, before concluding there's trouble.
-          if (::WaitForSingleObject(consumer_ready_.Get(), 0) == WAIT_OBJECT_0)
-            return S_OK;
-          DWORD exit_code = 0;
-          if (::GetExitCodeThread(consumer_thread_.Get(), &exit_code))
-            return exit_code;
-          return HRESULT_FROM_WIN32(::GetLastError());
-        }
-      default:
-        return E_UNEXPECTED;
-    }
-  }
-
-  // Waits for consumer_ thread to exit, and returns its exit code.
-  HRESULT JoinConsumerThread() {
-    if (::WaitForSingleObject(consumer_thread_.Get(), INFINITE) !=
-        WAIT_OBJECT_0) {
-      return HRESULT_FROM_WIN32(::GetLastError());
-    }
-
-    DWORD exit_code = 0;
-    if (::GetExitCodeThread(consumer_thread_.Get(), &exit_code))
-      return exit_code;
-
-    return HRESULT_FROM_WIN32(::GetLastError());
-  }
-
-  TestConsumer consumer_;
-  ScopedHandle consumer_ready_;
-  ScopedHandle consumer_thread_;
-};
-
-}  // namespace
-
-TEST_F(EtwTraceConsumerRealtimeTest, ConsumerReturnsWhenSessionClosed) {
-  EtwTraceController controller;
-  if (controller.StartRealtimeSession(session_name_.c_str(), 100 * 1024) ==
-      E_ACCESSDENIED) {
-    VLOG(1) << "You must be an administrator to run this test on Vista";
-    return;
-  }
-
-  // Start the consumer_.
-  ASSERT_HRESULT_SUCCEEDED(StartConsumerThread());
-
-  // Wait around for the consumer_ thread a bit.
-  ASSERT_EQ(static_cast<DWORD>(WAIT_TIMEOUT),
-            ::WaitForSingleObject(consumer_thread_.Get(), 50));
-  ASSERT_HRESULT_SUCCEEDED(controller.Stop(NULL));
-
-  // The consumer_ returns success on session stop.
-  ASSERT_HRESULT_SUCCEEDED(JoinConsumerThread());
-}
-
-namespace {
-
-// {57E47923-A549-476f-86CA-503D57F59E62}
-DEFINE_GUID(
-    kTestEventType,
-    0x57e47923, 0xa549, 0x476f, 0x86, 0xca, 0x50, 0x3d, 0x57, 0xf5, 0x9e, 0x62);
-
-}  // namespace
-
-TEST_F(EtwTraceConsumerRealtimeTest, ConsumeEvent) {
-  EtwTraceController controller;
-  if (controller.StartRealtimeSession(session_name_.c_str(), 100 * 1024) ==
-      E_ACCESSDENIED) {
-    VLOG(1) << "You must be an administrator to run this test on Vista";
-    return;
-  }
-
-  ASSERT_HRESULT_SUCCEEDED(controller.EnableProvider(
-      test_provider_, TRACE_LEVEL_VERBOSE, 0xFFFFFFFF));
-
-  EtwTraceProvider provider(test_provider_);
-  ASSERT_EQ(static_cast<DWORD>(ERROR_SUCCESS), provider.Register());
-
-  // Start the consumer_.
-  ASSERT_HRESULT_SUCCEEDED(StartConsumerThread());
-  ASSERT_EQ(0u, TestConsumer::events_.size());
-
-  EtwMofEvent<1> event(kTestEventType, 1, TRACE_LEVEL_ERROR);
-  EXPECT_EQ(static_cast<DWORD>(ERROR_SUCCESS), provider.Log(&event.header));
-  EXPECT_EQ(WAIT_OBJECT_0,
-            ::WaitForSingleObject(TestConsumer::sank_event_.Get(), INFINITE));
-  ASSERT_HRESULT_SUCCEEDED(controller.Stop(NULL));
-  ASSERT_HRESULT_SUCCEEDED(JoinConsumerThread());
-  ASSERT_NE(0u, TestConsumer::events_.size());
-}
-
-namespace {
-
-// We run events through a file session to assert that
-// the content comes through.
-class EtwTraceConsumerDataTest: public EtwTraceConsumerBaseTest {
- public:
-  EtwTraceConsumerDataTest() {
-  }
-
-  void SetUp() override {
-    EtwTraceConsumerBaseTest::SetUp();
-
-    EtwTraceProperties prop;
-    EtwTraceController::Stop(session_name_.c_str(), &prop);
-
-    // Create a temp dir for this test.
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-    // Construct a temp file name in our dir.
-    temp_file_ = temp_dir_.GetPath().Append(L"test.etl");
-  }
-
-  void TearDown() override {
-    EXPECT_TRUE(base::DeleteFile(temp_file_, false));
-
-    EtwTraceConsumerBaseTest::TearDown();
-  }
-
-  HRESULT LogEventToTempSession(PEVENT_TRACE_HEADER header) {
-    EtwTraceController controller;
-
-    // Set up a file session.
-    HRESULT hr = controller.StartFileSession(session_name_.c_str(),
-                                             temp_file_.value().c_str());
-    if (FAILED(hr))
-      return hr;
-
-    // Enable our provider.
-    EXPECT_HRESULT_SUCCEEDED(controller.EnableProvider(
-        test_provider_, TRACE_LEVEL_VERBOSE, 0xFFFFFFFF));
-
-    EtwTraceProvider provider(test_provider_);
-    // Then register our provider, means we get a session handle immediately.
-    EXPECT_EQ(static_cast<DWORD>(ERROR_SUCCESS), provider.Register());
-    // Trace the event, it goes to the temp file.
-    EXPECT_EQ(static_cast<DWORD>(ERROR_SUCCESS), provider.Log(header));
-    EXPECT_HRESULT_SUCCEEDED(controller.DisableProvider(test_provider_));
-    EXPECT_HRESULT_SUCCEEDED(provider.Unregister());
-    EXPECT_HRESULT_SUCCEEDED(controller.Flush(NULL));
-    EXPECT_HRESULT_SUCCEEDED(controller.Stop(NULL));
-
-    return S_OK;
-  }
-
-  HRESULT ConsumeEventFromTempSession() {
-    // Now consume the event(s).
-    TestConsumer consumer_;
-    HRESULT hr = consumer_.OpenFileSession(temp_file_.value().c_str());
-    if (SUCCEEDED(hr))
-      hr = consumer_.Consume();
-    consumer_.Close();
-    // And nab the result.
-    events_.swap(TestConsumer::events_);
-    return hr;
-  }
-
-  HRESULT RoundTripEvent(PEVENT_TRACE_HEADER header, PEVENT_TRACE* trace) {
-    base::DeleteFile(temp_file_, false);
-
-    HRESULT hr = LogEventToTempSession(header);
-    if (SUCCEEDED(hr))
-      hr = ConsumeEventFromTempSession();
-
-    if (FAILED(hr))
-      return hr;
-
-    // We should now have the event in the queue.
-    if (events_.empty())
-      return E_FAIL;
-
-    *trace = &events_.back();
-    return S_OK;
-  }
-
-  EventQueue events_;
-  ScopedTempDir temp_dir_;
-  FilePath temp_file_;
-};
-
-}  // namespace
-
-
-TEST_F(EtwTraceConsumerDataTest, RoundTrip) {
-  EtwMofEvent<1> event(kTestEventType, 1, TRACE_LEVEL_ERROR);
-
-  static const char kData[] = "This is but test data";
-  event.fields[0].DataPtr = reinterpret_cast<ULONG64>(kData);
-  event.fields[0].Length = sizeof(kData);
-
-  PEVENT_TRACE trace = NULL;
-  HRESULT hr = RoundTripEvent(&event.header, &trace);
-  if (hr == E_ACCESSDENIED) {
-    VLOG(1) << "You must be an administrator to run this test on Vista";
-    return;
-  }
-  ASSERT_HRESULT_SUCCEEDED(hr) << "RoundTripEvent failed";
-  ASSERT_TRUE(trace != NULL);
-  ASSERT_EQ(sizeof(kData), trace->MofLength);
-  ASSERT_STREQ(kData, reinterpret_cast<const char*>(trace->MofData));
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/event_trace_controller_unittest.cc b/base/win/event_trace_controller_unittest.cc
deleted file mode 100644
index f19ee31..0000000
--- a/base/win/event_trace_controller_unittest.cc
+++ /dev/null
@@ -1,244 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Unit tests for event trace controller.
-
-#include <objbase.h>
-#include <initguid.h>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/process/process_handle.h"
-#include "base/strings/stringprintf.h"
-#include "base/sys_info.h"
-#include "base/win/event_trace_controller.h"
-#include "base/win/event_trace_provider.h"
-#include "base/win/scoped_handle.h"
-#include "base/win/windows_version.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-DEFINE_GUID(kGuidNull,
-    0x0000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0);
-
-const ULONG kTestProviderFlags = 0xCAFEBABE;
-
-class TestingProvider: public EtwTraceProvider {
- public:
-  explicit TestingProvider(const GUID& provider_name)
-      : EtwTraceProvider(provider_name) {
-    callback_event_.Set(::CreateEvent(NULL, TRUE, FALSE, NULL));
-  }
-
-  void WaitForCallback() {
-    ::WaitForSingleObject(callback_event_.Get(), INFINITE);
-    ::ResetEvent(callback_event_.Get());
-  }
-
- private:
-  void OnEventsEnabled() override { ::SetEvent(callback_event_.Get()); }
-  void PostEventsDisabled() override { ::SetEvent(callback_event_.Get()); }
-
-  ScopedHandle callback_event_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestingProvider);
-};
-
-}  // namespace
-
-TEST(EtwTracePropertiesTest, Initialization) {
-  EtwTraceProperties prop;
-
-  EVENT_TRACE_PROPERTIES* p = prop.get();
-  EXPECT_NE(0u, p->Wnode.BufferSize);
-  EXPECT_EQ(0u, p->Wnode.ProviderId);
-  EXPECT_EQ(0u, p->Wnode.HistoricalContext);
-
-  EXPECT_TRUE(kGuidNull == p->Wnode.Guid);
-  EXPECT_EQ(0u, p->Wnode.ClientContext);
-  EXPECT_EQ(static_cast<ULONG>(WNODE_FLAG_TRACED_GUID), p->Wnode.Flags);
-
-  EXPECT_EQ(0u, p->BufferSize);
-  EXPECT_EQ(0u, p->MinimumBuffers);
-  EXPECT_EQ(0u, p->MaximumBuffers);
-  EXPECT_EQ(0u, p->MaximumFileSize);
-  EXPECT_EQ(0u, p->LogFileMode);
-  EXPECT_EQ(0u, p->FlushTimer);
-  EXPECT_EQ(0u, p->EnableFlags);
-  EXPECT_EQ(0, p->AgeLimit);
-
-  EXPECT_EQ(0u, p->NumberOfBuffers);
-  EXPECT_EQ(0u, p->FreeBuffers);
-  EXPECT_EQ(0u, p->EventsLost);
-  EXPECT_EQ(0u, p->BuffersWritten);
-  EXPECT_EQ(0u, p->LogBuffersLost);
-  EXPECT_EQ(0u, p->RealTimeBuffersLost);
-  EXPECT_EQ(0u, p->LoggerThreadId);
-  EXPECT_NE(0u, p->LogFileNameOffset);
-  EXPECT_NE(0u, p->LoggerNameOffset);
-}
-
-TEST(EtwTracePropertiesTest, Strings) {
-  EtwTraceProperties prop;
-
-  ASSERT_STREQ(L"", prop.GetLoggerFileName());
-  ASSERT_STREQ(L"", prop.GetLoggerName());
-
-  std::wstring name(1023, L'A');
-  ASSERT_HRESULT_SUCCEEDED(prop.SetLoggerFileName(name.c_str()));
-  ASSERT_HRESULT_SUCCEEDED(prop.SetLoggerName(name.c_str()));
-  ASSERT_STREQ(name.c_str(), prop.GetLoggerFileName());
-  ASSERT_STREQ(name.c_str(), prop.GetLoggerName());
-
-  std::wstring name2(1024, L'A');
-  ASSERT_HRESULT_FAILED(prop.SetLoggerFileName(name2.c_str()));
-  ASSERT_HRESULT_FAILED(prop.SetLoggerName(name2.c_str()));
-}
-
-namespace {
-
-class EtwTraceControllerTest : public testing::Test {
- public:
-  EtwTraceControllerTest()
-      : session_name_(StringPrintf(L"TestSession-%d", GetCurrentProcId())) {
-  }
-
-  void SetUp() override {
-    EtwTraceProperties ignore;
-    EtwTraceController::Stop(session_name_.c_str(), &ignore);
-
-    // Allocate a new provider name GUID for each test.
-    ASSERT_HRESULT_SUCCEEDED(::CoCreateGuid(&test_provider_));
-  }
-
-  void TearDown() override {
-    EtwTraceProperties prop;
-    EtwTraceController::Stop(session_name_.c_str(), &prop);
-  }
-
- protected:
-  GUID test_provider_;
-  std::wstring session_name_;
-};
-
-}  // namespace
-
-TEST_F(EtwTraceControllerTest, Initialize) {
-  EtwTraceController controller;
-
-  EXPECT_EQ(0u, controller.session());
-  EXPECT_STREQ(L"", controller.session_name());
-}
-
-
-TEST_F(EtwTraceControllerTest, StartRealTimeSession) {
-  EtwTraceController controller;
-
-  HRESULT hr = controller.StartRealtimeSession(session_name_.c_str(),
-                                               100 * 1024);
-  if (hr == E_ACCESSDENIED) {
-    VLOG(1) << "You must be an administrator to run this test on Vista";
-    return;
-  }
-
-  EXPECT_NE(0u, controller.session());
-  EXPECT_STREQ(session_name_.c_str(), controller.session_name());
-
-  EXPECT_HRESULT_SUCCEEDED(controller.Stop(NULL));
-  EXPECT_EQ(0u, controller.session());
-  EXPECT_STREQ(L"", controller.session_name());
-}
-
-TEST_F(EtwTraceControllerTest, StartFileSession) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-  FilePath temp;
-  ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.GetPath(), &temp));
-
-  EtwTraceController controller;
-  HRESULT hr = controller.StartFileSession(session_name_.c_str(),
-                                           temp.value().c_str());
-  if (hr == E_ACCESSDENIED) {
-    VLOG(1) << "You must be an administrator to run this test on Vista";
-    base::DeleteFile(temp, false);
-    return;
-  }
-
-  EXPECT_NE(0u, controller.session());
-  EXPECT_STREQ(session_name_.c_str(), controller.session_name());
-
-  EXPECT_HRESULT_SUCCEEDED(controller.Stop(NULL));
-  EXPECT_EQ(0u, controller.session());
-  EXPECT_STREQ(L"", controller.session_name());
-  base::DeleteFile(temp, false);
-}
-
-// This test is flaky for unclear reasons. See bugs 525297 and 534184
-TEST_F(EtwTraceControllerTest, DISABLED_EnableDisable) {
-  TestingProvider provider(test_provider_);
-
-  EXPECT_EQ(static_cast<DWORD>(ERROR_SUCCESS), provider.Register());
-  EXPECT_EQ(0u, provider.session_handle());
-
-  EtwTraceController controller;
-  HRESULT hr = controller.StartRealtimeSession(session_name_.c_str(),
-                                               100 * 1024);
-  if (hr == E_ACCESSDENIED) {
-    VLOG(1) << "You must be an administrator to run this test on Vista";
-    return;
-  }
-
-  EXPECT_HRESULT_SUCCEEDED(controller.EnableProvider(test_provider_,
-                           TRACE_LEVEL_VERBOSE, kTestProviderFlags));
-
-  provider.WaitForCallback();
-
-  EXPECT_EQ(TRACE_LEVEL_VERBOSE, provider.enable_level());
-  EXPECT_EQ(kTestProviderFlags, provider.enable_flags());
-
-  EXPECT_HRESULT_SUCCEEDED(controller.DisableProvider(test_provider_));
-
-  provider.WaitForCallback();
-
-  EXPECT_EQ(0, provider.enable_level());
-  EXPECT_EQ(0u, provider.enable_flags());
-
-  EXPECT_EQ(static_cast<DWORD>(ERROR_SUCCESS), provider.Unregister());
-
-  // Enable the provider again, before registering.
-  EXPECT_HRESULT_SUCCEEDED(controller.EnableProvider(test_provider_,
-                           TRACE_LEVEL_VERBOSE, kTestProviderFlags));
-
-  // Register the provider again, the settings above
-  // should take immediate effect.
-  EXPECT_EQ(static_cast<DWORD>(ERROR_SUCCESS), provider.Register());
-
-  EXPECT_EQ(TRACE_LEVEL_VERBOSE, provider.enable_level());
-  EXPECT_EQ(kTestProviderFlags, provider.enable_flags());
-
-  // Consume the callback event of the previous controller.EnableProvider().
-  provider.WaitForCallback();
-
-  EXPECT_HRESULT_SUCCEEDED(controller.Stop(NULL));
-
-  // Windows 7 does not call the callback when Stop() is called so we
-  // can't wait, and enable_level and enable_flags are not zeroed.
-  if (base::win::GetVersion() >= VERSION_WIN8) {
-    provider.WaitForCallback();
-
-    // Session should have wound down.
-    EXPECT_EQ(0, provider.enable_level());
-    EXPECT_EQ(0u, provider.enable_flags());
-  }
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/event_trace_provider_unittest.cc b/base/win/event_trace_provider_unittest.cc
deleted file mode 100644
index 7d57773..0000000
--- a/base/win/event_trace_provider_unittest.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// Unit tests for event trace provider.
-#include "base/win/event_trace_provider.h"
-#include <new>
-#include "testing/gtest/include/gtest/gtest.h"
-#include <initguid.h>  // NOLINT - has to be last
-
-namespace {
-
-using base::win::EtwTraceProvider;
-using base::win::EtwMofEvent;
-
-// {7F0FD37F-FA3C-4cd6-9242-DF60967A2CB2}
-DEFINE_GUID(kTestProvider,
-  0x7f0fd37f, 0xfa3c, 0x4cd6, 0x92, 0x42, 0xdf, 0x60, 0x96, 0x7a, 0x2c, 0xb2);
-
-// {7F0FD37F-FA3C-4cd6-9242-DF60967A2CB2}
-DEFINE_GUID(kTestEventClass,
-  0x7f0fd37f, 0xfa3c, 0x4cd6, 0x92, 0x42, 0xdf, 0x60, 0x96, 0x7a, 0x2c, 0xb2);
-
-}  // namespace
-
-TEST(EtwTraceProviderTest, ToleratesPreCreateInvocations) {
-  // Because the trace provider is used in logging, it's important that
-  // it be possible to use static provider instances without regard to
-  // whether they've been constructed or destructed.
-  // The interface of the class is designed to tolerate this usage.
-  char buf[sizeof(EtwTraceProvider)] = {0};
-  EtwTraceProvider& provider = reinterpret_cast<EtwTraceProvider&>(buf);
-
-  EXPECT_EQ(0u, provider.registration_handle());
-  EXPECT_EQ(0u, provider.session_handle());
-  EXPECT_EQ(0u, provider.enable_flags());
-  EXPECT_EQ(0u, provider.enable_level());
-
-  EXPECT_FALSE(provider.ShouldLog(TRACE_LEVEL_FATAL, 0xfffffff));
-
-  // We expect these not to crash.
-  provider.Log(kTestEventClass, 0, TRACE_LEVEL_FATAL, "foo");
-  provider.Log(kTestEventClass, 0, TRACE_LEVEL_FATAL, L"foo");
-
-  EtwMofEvent<1> dummy(kTestEventClass, 0, TRACE_LEVEL_FATAL);
-  DWORD data = 0;
-  dummy.SetField(0, sizeof(data), &data);
-  provider.Log(dummy.get());
-
-  // Placement-new the provider into our buffer.
-  new (buf) EtwTraceProvider(kTestProvider);
-
-  // Registration is now safe.
-  EXPECT_EQ(static_cast<ULONG>(ERROR_SUCCESS), provider.Register());
-
-  // Destruct the instance, this should unregister it.
-  provider.EtwTraceProvider::~EtwTraceProvider();
-
-  // And post-destruction, all of the above should still be safe.
-  EXPECT_EQ(0u, provider.registration_handle());
-  EXPECT_EQ(0u, provider.session_handle());
-  EXPECT_EQ(0u, provider.enable_flags());
-  EXPECT_EQ(0u, provider.enable_level());
-
-  EXPECT_FALSE(provider.ShouldLog(TRACE_LEVEL_FATAL, 0xfffffff));
-
-  // We expect these not to crash.
-  provider.Log(kTestEventClass, 0, TRACE_LEVEL_FATAL, "foo");
-  provider.Log(kTestEventClass, 0, TRACE_LEVEL_FATAL, L"foo");
-  provider.Log(dummy.get());
-}
-
-TEST(EtwTraceProviderTest, Initialize) {
-  EtwTraceProvider provider(kTestProvider);
-
-  EXPECT_EQ(0u, provider.registration_handle());
-  EXPECT_EQ(0u, provider.session_handle());
-  EXPECT_EQ(0u, provider.enable_flags());
-  EXPECT_EQ(0u, provider.enable_level());
-}
-
-TEST(EtwTraceProviderTest, Register) {
-  EtwTraceProvider provider(kTestProvider);
-
-  ASSERT_EQ(static_cast<ULONG>(ERROR_SUCCESS), provider.Register());
-  EXPECT_NE(0u, provider.registration_handle());
-  ASSERT_EQ(static_cast<ULONG>(ERROR_SUCCESS), provider.Unregister());
-  EXPECT_EQ(0u, provider.registration_handle());
-}
-
-TEST(EtwTraceProviderTest, RegisterWithNoNameFails) {
-  EtwTraceProvider provider;
-
-  EXPECT_TRUE(provider.Register() != ERROR_SUCCESS);
-}
-
-TEST(EtwTraceProviderTest, Enable) {
-  EtwTraceProvider provider(kTestProvider);
-
-  ASSERT_EQ(static_cast<ULONG>(ERROR_SUCCESS), provider.Register());
-  EXPECT_NE(0u, provider.registration_handle());
-
-  // No session so far.
-  EXPECT_EQ(0u, provider.session_handle());
-  EXPECT_EQ(0u, provider.enable_flags());
-  EXPECT_EQ(0u, provider.enable_level());
-
-  ASSERT_EQ(static_cast<ULONG>(ERROR_SUCCESS), provider.Unregister());
-  EXPECT_EQ(0u, provider.registration_handle());
-}
diff --git a/base/win/i18n_unittest.cc b/base/win/i18n_unittest.cc
deleted file mode 100644
index 9af6dbf..0000000
--- a/base/win/i18n_unittest.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains unit tests for Windows internationalization funcs.
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-#include <stddef.h>
-
-#include "base/win/i18n.h"
-#include "base/win/windows_version.h"
-
-namespace base {
-namespace win {
-namespace i18n {
-
-// Tests that at least one user preferred UI language can be obtained.
-TEST(I18NTest, GetUserPreferredUILanguageList) {
-  std::vector<std::wstring> languages;
-  EXPECT_TRUE(GetUserPreferredUILanguageList(&languages));
-  EXPECT_NE(static_cast<std::vector<std::wstring>::size_type>(0),
-            languages.size());
-  for (std::vector<std::wstring>::const_iterator scan = languages.begin(),
-          end = languages.end(); scan != end; ++scan) {
-    EXPECT_FALSE((*scan).empty());
-  }
-}
-
-// Tests that at least one thread preferred UI language can be obtained.
-TEST(I18NTest, GetThreadPreferredUILanguageList) {
-  std::vector<std::wstring> languages;
-  EXPECT_TRUE(GetThreadPreferredUILanguageList(&languages));
-  EXPECT_NE(static_cast<std::vector<std::wstring>::size_type>(0),
-            languages.size());
-  for (std::vector<std::wstring>::const_iterator scan = languages.begin(),
-          end = languages.end(); scan != end; ++scan) {
-    EXPECT_FALSE((*scan).empty());
-  }
-}
-
-}  // namespace i18n
-}  // namespace win
-}  // namespace base
diff --git a/base/win/iunknown_impl_unittest.cc b/base/win/iunknown_impl_unittest.cc
deleted file mode 100644
index c6c3539..0000000
--- a/base/win/iunknown_impl_unittest.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/iunknown_impl.h"
-
-#include "base/win/scoped_com_initializer.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-class TestIUnknownImplSubclass : public IUnknownImpl {
- public:
-  TestIUnknownImplSubclass() {
-    ++instance_count;
-  }
-  ~TestIUnknownImplSubclass() override { --instance_count; }
-  static int instance_count;
-};
-
-// static
-int TestIUnknownImplSubclass::instance_count = 0;
-
-TEST(IUnknownImplTest, IUnknownImpl) {
-  ScopedCOMInitializer com_initializer;
-
-  EXPECT_EQ(0, TestIUnknownImplSubclass::instance_count);
-  IUnknown* u = new TestIUnknownImplSubclass();
-
-  EXPECT_EQ(1, TestIUnknownImplSubclass::instance_count);
-
-  EXPECT_EQ(1u, u->AddRef());
-  EXPECT_EQ(1u, u->AddRef());
-
-  IUnknown* other = NULL;
-  EXPECT_EQ(E_NOINTERFACE, u->QueryInterface(
-      IID_IDispatch, reinterpret_cast<void**>(&other)));
-  EXPECT_EQ(S_OK, u->QueryInterface(
-      IID_IUnknown, reinterpret_cast<void**>(&other)));
-  other->Release();
-
-  EXPECT_EQ(1u, u->Release());
-  EXPECT_EQ(0u, u->Release());
-  EXPECT_EQ(0, TestIUnknownImplSubclass::instance_count);
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/message_window_unittest.cc b/base/win/message_window_unittest.cc
deleted file mode 100644
index 00248bf..0000000
--- a/base/win/message_window_unittest.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/bind.h"
-#include "base/guid.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/win/message_window.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace {
-
-bool HandleMessage(
-    UINT message, WPARAM wparam, LPARAM lparam, LRESULT* result) {
-  // Return |wparam| as the result of WM_USER message.
-  if (message == WM_USER) {
-    *result = wparam;
-    return true;
-  }
-
-  return false;
-}
-
-}  // namespace
-
-// Checks that a window can be created.
-TEST(MessageWindowTest, Create) {
-  win::MessageWindow window;
-  EXPECT_TRUE(window.Create(base::Bind(&HandleMessage)));
-}
-
-// Checks that a named window can be created.
-TEST(MessageWindowTest, CreateNamed) {
-  win::MessageWindow window;
-  EXPECT_TRUE(window.CreateNamed(base::Bind(&HandleMessage),
-              UTF8ToUTF16("test_message_window")));
-}
-
-// Verifies that the created window can receive messages.
-TEST(MessageWindowTest, SendMessage) {
-  win::MessageWindow window;
-  EXPECT_TRUE(window.Create(base::Bind(&HandleMessage)));
-
-  EXPECT_EQ(SendMessage(window.hwnd(), WM_USER, 100, 0), 100);
-}
-
-// Verifies that a named window can be found by name.
-TEST(MessageWindowTest, FindWindow) {
-  string16 name = UTF8ToUTF16(base::GenerateGUID());
-  win::MessageWindow window;
-  EXPECT_TRUE(window.CreateNamed(base::Bind(&HandleMessage), name));
-
-  HWND hwnd = win::MessageWindow::FindWindow(name);
-  EXPECT_TRUE(hwnd != NULL);
-  EXPECT_EQ(SendMessage(hwnd, WM_USER, 200, 0), 200);
-}
-
-}  // namespace base
diff --git a/base/win/object_watcher_unittest.cc b/base/win/object_watcher_unittest.cc
deleted file mode 100644
index 5aa3891..0000000
--- a/base/win/object_watcher_unittest.cc
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/object_watcher.h"
-
-#include <process.h>
-
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-class QuitDelegate : public ObjectWatcher::Delegate {
- public:
-  void OnObjectSignaled(HANDLE object) override {
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-  }
-};
-
-class DecrementCountDelegate : public ObjectWatcher::Delegate {
- public:
-  explicit DecrementCountDelegate(int* counter) : counter_(counter) {
-  }
-  void OnObjectSignaled(HANDLE object) override { --(*counter_); }
-
- private:
-  int* counter_;
-};
-
-void RunTest_BasicSignal(MessageLoop::Type message_loop_type) {
-  MessageLoop message_loop(message_loop_type);
-
-  ObjectWatcher watcher;
-  EXPECT_FALSE(watcher.IsWatching());
-
-  // A manual-reset event that is not yet signaled.
-  HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL);
-
-  QuitDelegate delegate;
-  bool ok = watcher.StartWatchingOnce(event, &delegate);
-  EXPECT_TRUE(ok);
-  EXPECT_TRUE(watcher.IsWatching());
-  EXPECT_EQ(event, watcher.GetWatchedObject());
-
-  SetEvent(event);
-
-  RunLoop().Run();
-
-  EXPECT_FALSE(watcher.IsWatching());
-  CloseHandle(event);
-}
-
-void RunTest_BasicCancel(MessageLoop::Type message_loop_type) {
-  MessageLoop message_loop(message_loop_type);
-
-  ObjectWatcher watcher;
-
-  // A manual-reset event that is not yet signaled.
-  HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL);
-
-  QuitDelegate delegate;
-  bool ok = watcher.StartWatchingOnce(event, &delegate);
-  EXPECT_TRUE(ok);
-
-  watcher.StopWatching();
-
-  CloseHandle(event);
-}
-
-void RunTest_CancelAfterSet(MessageLoop::Type message_loop_type) {
-  MessageLoop message_loop(message_loop_type);
-
-  ObjectWatcher watcher;
-
-  int counter = 1;
-  DecrementCountDelegate delegate(&counter);
-
-  // A manual-reset event that is not yet signaled.
-  HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL);
-
-  bool ok = watcher.StartWatchingOnce(event, &delegate);
-  EXPECT_TRUE(ok);
-
-  SetEvent(event);
-
-  // Let the background thread do its business
-  Sleep(30);
-
-  watcher.StopWatching();
-
-  RunLoop().RunUntilIdle();
-
-  // Our delegate should not have fired.
-  EXPECT_EQ(1, counter);
-
-  CloseHandle(event);
-}
-
-void RunTest_SignalBeforeWatch(MessageLoop::Type message_loop_type) {
-  MessageLoop message_loop(message_loop_type);
-
-  ObjectWatcher watcher;
-
-  // A manual-reset event that is signaled before we begin watching.
-  HANDLE event = CreateEvent(NULL, TRUE, TRUE, NULL);
-
-  QuitDelegate delegate;
-  bool ok = watcher.StartWatchingOnce(event, &delegate);
-  EXPECT_TRUE(ok);
-
-  RunLoop().Run();
-
-  EXPECT_FALSE(watcher.IsWatching());
-  CloseHandle(event);
-}
-
-void RunTest_OutlivesMessageLoop(MessageLoop::Type message_loop_type) {
-  // Simulate a MessageLoop that dies before an ObjectWatcher.  This ordinarily
-  // doesn't happen when people use the Thread class, but it can happen when
-  // people use the Singleton pattern or atexit.
-  HANDLE event = CreateEvent(NULL, TRUE, FALSE, NULL);  // not signaled
-  {
-    ObjectWatcher watcher;
-    {
-      MessageLoop message_loop(message_loop_type);
-
-      QuitDelegate delegate;
-      watcher.StartWatchingOnce(event, &delegate);
-    }
-  }
-  CloseHandle(event);
-}
-
-class QuitAfterMultipleDelegate : public ObjectWatcher::Delegate {
- public:
-  QuitAfterMultipleDelegate(HANDLE event, int iterations)
-      : event_(event), iterations_(iterations) {}
-  void OnObjectSignaled(HANDLE object) override {
-    if (--iterations_) {
-      SetEvent(event_);
-    } else {
-      RunLoop::QuitCurrentWhenIdleDeprecated();
-    }
-  }
-
- private:
-  HANDLE event_;
-  int iterations_;
-};
-
-void RunTest_ExecuteMultipleTimes(MessageLoop::Type message_loop_type) {
-  MessageLoop message_loop(message_loop_type);
-
-  ObjectWatcher watcher;
-  EXPECT_FALSE(watcher.IsWatching());
-
-  // An auto-reset event that is not yet signaled.
-  HANDLE event = CreateEvent(NULL, FALSE, FALSE, NULL);
-
-  QuitAfterMultipleDelegate delegate(event, 2);
-  bool ok = watcher.StartWatchingMultipleTimes(event, &delegate);
-  EXPECT_TRUE(ok);
-  EXPECT_TRUE(watcher.IsWatching());
-  EXPECT_EQ(event, watcher.GetWatchedObject());
-
-  SetEvent(event);
-
-  RunLoop().Run();
-
-  EXPECT_TRUE(watcher.IsWatching());
-  EXPECT_TRUE(watcher.StopWatching());
-  CloseHandle(event);
-}
-
-}  // namespace
-
-//-----------------------------------------------------------------------------
-
-TEST(ObjectWatcherTest, BasicSignal) {
-  RunTest_BasicSignal(MessageLoop::TYPE_DEFAULT);
-  RunTest_BasicSignal(MessageLoop::TYPE_IO);
-  RunTest_BasicSignal(MessageLoop::TYPE_UI);
-}
-
-TEST(ObjectWatcherTest, BasicCancel) {
-  RunTest_BasicCancel(MessageLoop::TYPE_DEFAULT);
-  RunTest_BasicCancel(MessageLoop::TYPE_IO);
-  RunTest_BasicCancel(MessageLoop::TYPE_UI);
-}
-
-TEST(ObjectWatcherTest, CancelAfterSet) {
-  RunTest_CancelAfterSet(MessageLoop::TYPE_DEFAULT);
-  RunTest_CancelAfterSet(MessageLoop::TYPE_IO);
-  RunTest_CancelAfterSet(MessageLoop::TYPE_UI);
-}
-
-TEST(ObjectWatcherTest, SignalBeforeWatch) {
-  RunTest_SignalBeforeWatch(MessageLoop::TYPE_DEFAULT);
-  RunTest_SignalBeforeWatch(MessageLoop::TYPE_IO);
-  RunTest_SignalBeforeWatch(MessageLoop::TYPE_UI);
-}
-
-TEST(ObjectWatcherTest, OutlivesMessageLoop) {
-  RunTest_OutlivesMessageLoop(MessageLoop::TYPE_DEFAULT);
-  RunTest_OutlivesMessageLoop(MessageLoop::TYPE_IO);
-  RunTest_OutlivesMessageLoop(MessageLoop::TYPE_UI);
-}
-
-TEST(ObjectWatcherTest, ExecuteMultipleTimes) {
-  RunTest_ExecuteMultipleTimes(MessageLoop::TYPE_DEFAULT);
-  RunTest_ExecuteMultipleTimes(MessageLoop::TYPE_IO);
-  RunTest_ExecuteMultipleTimes(MessageLoop::TYPE_UI);
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/pe_image_unittest.cc b/base/win/pe_image_unittest.cc
deleted file mode 100644
index 2216449..0000000
--- a/base/win/pe_image_unittest.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file contains unit tests for PEImage.
-#include <algorithm>
-#include <vector>
-
-#include "base/files/file_path.h"
-#include "base/path_service.h"
-#include "base/scoped_native_library.h"
-#include "base/win/pe_image.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-// Just counts the number of invocations.
-bool ImportsCallback(const PEImage& image,
-                     LPCSTR module,
-                     DWORD ordinal,
-                     LPCSTR name,
-                     DWORD hint,
-                     PIMAGE_THUNK_DATA iat,
-                     PVOID cookie) {
-  int* count = reinterpret_cast<int*>(cookie);
-  (*count)++;
-  return true;
-}
-
-// Just counts the number of invocations.
-bool SectionsCallback(const PEImage& image,
-                      PIMAGE_SECTION_HEADER header,
-                      PVOID section_start,
-                      DWORD section_size,
-                      PVOID cookie) {
-  int* count = reinterpret_cast<int*>(cookie);
-  (*count)++;
-  return true;
-}
-
-// Just counts the number of invocations.
-bool RelocsCallback(const PEImage& image,
-                    WORD type,
-                    PVOID address,
-                    PVOID cookie) {
-  int* count = reinterpret_cast<int*>(cookie);
-  (*count)++;
-  return true;
-}
-
-// Just counts the number of invocations.
-bool ImportChunksCallback(const PEImage& image,
-                          LPCSTR module,
-                          PIMAGE_THUNK_DATA name_table,
-                          PIMAGE_THUNK_DATA iat,
-                          PVOID cookie) {
-  int* count = reinterpret_cast<int*>(cookie);
-  (*count)++;
-  return true;
-}
-
-// Just counts the number of invocations.
-bool DelayImportChunksCallback(const PEImage& image,
-                               PImgDelayDescr delay_descriptor,
-                               LPCSTR module,
-                               PIMAGE_THUNK_DATA name_table,
-                               PIMAGE_THUNK_DATA iat,
-                               PVOID cookie) {
-  int* count = reinterpret_cast<int*>(cookie);
-  (*count)++;
-  return true;
-}
-
-// Just counts the number of invocations.
-bool ExportsCallback(const PEImage& image,
-                     DWORD ordinal,
-                     DWORD hint,
-                     LPCSTR name,
-                     PVOID function,
-                     LPCSTR forward,
-                     PVOID cookie) {
-  int* count = reinterpret_cast<int*>(cookie);
-  (*count)++;
-  return true;
-}
-
-}  // namespace
-
-// Tests that we are able to enumerate stuff from a PE file, and that
-// the actual number of items found matches an expected value.
-TEST(PEImageTest, EnumeratesPE) {
-  base::FilePath pe_image_test_path;
-  ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &pe_image_test_path));
-  pe_image_test_path = pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image"));
-
-#if defined(ARCH_CPU_64_BITS)
-  pe_image_test_path =
-      pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_64.dll"));
-  const int sections = 6;
-  const int imports_dlls = 2;
-  const int delay_dlls = 2;
-  const int exports = 3;
-  const int imports = 70;
-  const int delay_imports = 2;
-  const int relocs = 976;
-#else
-  pe_image_test_path =
-      pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_32.dll"));
-  const int sections = 5;
-  const int imports_dlls = 2;
-  const int delay_dlls = 2;
-  const int exports = 3;
-  const int imports = 66;
-  const int delay_imports = 2;
-  const int relocs = 2114;
-#endif
-
-  ScopedNativeLibrary module(pe_image_test_path);
-  ASSERT_TRUE(module.is_valid());
-
-  PEImage pe(module.get());
-  int count = 0;
-  EXPECT_TRUE(pe.VerifyMagic());
-
-  pe.EnumSections(SectionsCallback, &count);
-  EXPECT_EQ(sections, count);
-
-  count = 0;
-  pe.EnumImportChunks(ImportChunksCallback, &count);
-  EXPECT_EQ(imports_dlls, count);
-
-  count = 0;
-  pe.EnumDelayImportChunks(DelayImportChunksCallback, &count);
-  EXPECT_EQ(delay_dlls, count);
-
-  count = 0;
-  pe.EnumExports(ExportsCallback, &count);
-  EXPECT_EQ(exports, count);
-
-  count = 0;
-  pe.EnumAllImports(ImportsCallback, &count);
-  EXPECT_EQ(imports, count);
-
-  count = 0;
-  pe.EnumAllDelayImports(ImportsCallback, &count);
-  EXPECT_EQ(delay_imports, count);
-
-  count = 0;
-  pe.EnumRelocs(RelocsCallback, &count);
-  EXPECT_EQ(relocs, count);
-}
-
-// Tests that we can locate an specific exported symbol, by name and by ordinal.
-TEST(PEImageTest, RetrievesExports) {
-  ScopedNativeLibrary module(FilePath(L"advapi32.dll"));
-  ASSERT_TRUE(module.is_valid());
-
-  PEImage pe(module.get());
-  WORD ordinal;
-
-  EXPECT_TRUE(pe.GetProcOrdinal("RegEnumKeyExW", &ordinal));
-
-  FARPROC address1 = pe.GetProcAddress("RegEnumKeyExW");
-  FARPROC address2 = pe.GetProcAddress(reinterpret_cast<char*>(ordinal));
-  EXPECT_TRUE(address1 != NULL);
-  EXPECT_TRUE(address2 != NULL);
-  EXPECT_TRUE(address1 == address2);
-}
-
-// Tests that we can locate a forwarded export.
-TEST(PEImageTest, ForwardedExport) {
-  base::FilePath pe_image_test_path;
-  ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &pe_image_test_path));
-  pe_image_test_path = pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image"));
-
-#if defined(ARCH_CPU_64_BITS)
-  pe_image_test_path =
-      pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_64.dll"));
-#else
-  pe_image_test_path =
-      pe_image_test_path.Append(FILE_PATH_LITERAL("pe_image_test_32.dll"));
-#endif
-
-  ScopedNativeLibrary module(pe_image_test_path);
-
-  ASSERT_TRUE(module.is_valid());
-
-  PEImage pe(module.get());
-
-  FARPROC addr = pe.GetProcAddress("FwdExport");
-  EXPECT_EQ(FARPROC(-1), addr);
-
-  PDWORD export_entry = pe.GetExportEntry("FwdExport");
-  EXPECT_NE(nullptr, export_entry);
-  PVOID fwd_addr = pe.RVAToAddr(*export_entry);
-  const char expected_fwd[] = "KERNEL32.CreateFileA";
-  EXPECT_STREQ(expected_fwd, reinterpret_cast<char*>(fwd_addr));
-}
-
-// Test that we can get debug id out of a module.
-TEST(PEImageTest, GetDebugId) {
-  ScopedNativeLibrary module(FilePath(L"advapi32.dll"));
-  ASSERT_TRUE(module.is_valid());
-
-  PEImage pe(module.get());
-  GUID guid = {0};
-  DWORD age = 0;
-  LPCSTR pdb_file = nullptr;
-  EXPECT_TRUE(pe.GetDebugId(&guid, &age, &pdb_file));
-  EXPECT_STREQ("advapi32.pdb", pdb_file);
-
-  // Should be valid to call without parameters.
-  EXPECT_TRUE(pe.GetDebugId(nullptr, nullptr, nullptr));
-
-  GUID empty_guid = {0};
-  EXPECT_TRUE(!IsEqualGUID(empty_guid, guid));
-  EXPECT_NE(0U, age);
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/registry_unittest.cc b/base/win/registry_unittest.cc
deleted file mode 100644
index 5a18ffa..0000000
--- a/base/win/registry_unittest.cc
+++ /dev/null
@@ -1,423 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/registry.h"
-
-#include <stdint.h>
-
-#include <cstring>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/run_loop.h"
-#include "base/stl_util.h"
-#include "base/win/windows_version.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-class RegistryTest : public testing::Test {
- protected:
-#if defined(_WIN64)
-  static const REGSAM kNativeViewMask = KEY_WOW64_64KEY;
-  static const REGSAM kRedirectedViewMask = KEY_WOW64_32KEY;
-#else
-  static const REGSAM kNativeViewMask = KEY_WOW64_32KEY;
-  static const REGSAM kRedirectedViewMask = KEY_WOW64_64KEY;
-#endif  //  _WIN64
-
-  RegistryTest() {}
-  void SetUp() override {
-    // Create a temporary key.
-    RegKey key(HKEY_CURRENT_USER, L"", KEY_ALL_ACCESS);
-    key.DeleteKey(kRootKey);
-    ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, kRootKey, KEY_READ));
-    ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, kRootKey, KEY_READ));
-    foo_software_key_ = L"Software\\";
-    foo_software_key_ += kRootKey;
-    foo_software_key_ += L"\\Foo";
-  }
-
-  void TearDown() override {
-    // Clean up the temporary key.
-    RegKey key(HKEY_CURRENT_USER, L"", KEY_SET_VALUE);
-    ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kRootKey));
-    ASSERT_NE(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, kRootKey, KEY_READ));
-  }
-
-  static bool IsRedirectorPresent() {
-#if defined(_WIN64)
-    return true;
-#else
-    return OSInfo::GetInstance()->wow64_status() == OSInfo::WOW64_ENABLED;
-#endif
-  }
-
-  const wchar_t* const kRootKey = L"Base_Registry_Unittest";
-  std::wstring foo_software_key_;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(RegistryTest);
-};
-
-// static
-const REGSAM RegistryTest::kNativeViewMask;
-const REGSAM RegistryTest::kRedirectedViewMask;
-
-TEST_F(RegistryTest, ValueTest) {
-  RegKey key;
-
-  std::wstring foo_key(kRootKey);
-  foo_key += L"\\Foo";
-  ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, foo_key.c_str(),
-                                      KEY_READ));
-
-  {
-    ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, foo_key.c_str(),
-                                      KEY_READ | KEY_SET_VALUE));
-    ASSERT_TRUE(key.Valid());
-
-    const wchar_t kStringValueName[] = L"StringValue";
-    const wchar_t kDWORDValueName[] = L"DWORDValue";
-    const wchar_t kInt64ValueName[] = L"Int64Value";
-    const wchar_t kStringData[] = L"string data";
-    const DWORD kDWORDData = 0xdeadbabe;
-    const int64_t kInt64Data = 0xdeadbabedeadbabeLL;
-
-    // Test value creation
-    ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(kStringValueName, kStringData));
-    ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(kDWORDValueName, kDWORDData));
-    ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(kInt64ValueName, &kInt64Data,
-                                            sizeof(kInt64Data), REG_QWORD));
-    EXPECT_EQ(3U, key.GetValueCount());
-    EXPECT_TRUE(key.HasValue(kStringValueName));
-    EXPECT_TRUE(key.HasValue(kDWORDValueName));
-    EXPECT_TRUE(key.HasValue(kInt64ValueName));
-
-    // Test Read
-    std::wstring string_value;
-    DWORD dword_value = 0;
-    int64_t int64_value = 0;
-    ASSERT_EQ(ERROR_SUCCESS, key.ReadValue(kStringValueName, &string_value));
-    ASSERT_EQ(ERROR_SUCCESS, key.ReadValueDW(kDWORDValueName, &dword_value));
-    ASSERT_EQ(ERROR_SUCCESS, key.ReadInt64(kInt64ValueName, &int64_value));
-    EXPECT_STREQ(kStringData, string_value.c_str());
-    EXPECT_EQ(kDWORDData, dword_value);
-    EXPECT_EQ(kInt64Data, int64_value);
-
-    // Make sure out args are not touched if ReadValue fails
-    const wchar_t* kNonExistent = L"NonExistent";
-    ASSERT_NE(ERROR_SUCCESS, key.ReadValue(kNonExistent, &string_value));
-    ASSERT_NE(ERROR_SUCCESS, key.ReadValueDW(kNonExistent, &dword_value));
-    ASSERT_NE(ERROR_SUCCESS, key.ReadInt64(kNonExistent, &int64_value));
-    EXPECT_STREQ(kStringData, string_value.c_str());
-    EXPECT_EQ(kDWORDData, dword_value);
-    EXPECT_EQ(kInt64Data, int64_value);
-
-    // Test delete
-    ASSERT_EQ(ERROR_SUCCESS, key.DeleteValue(kStringValueName));
-    ASSERT_EQ(ERROR_SUCCESS, key.DeleteValue(kDWORDValueName));
-    ASSERT_EQ(ERROR_SUCCESS, key.DeleteValue(kInt64ValueName));
-    EXPECT_EQ(0U, key.GetValueCount());
-    EXPECT_FALSE(key.HasValue(kStringValueName));
-    EXPECT_FALSE(key.HasValue(kDWORDValueName));
-    EXPECT_FALSE(key.HasValue(kInt64ValueName));
-  }
-}
-
-TEST_F(RegistryTest, BigValueIteratorTest) {
-  RegKey key;
-  std::wstring foo_key(kRootKey);
-  foo_key += L"\\Foo";
-  ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, foo_key.c_str(),
-                                      KEY_READ));
-  ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, foo_key.c_str(),
-                                    KEY_READ | KEY_SET_VALUE));
-  ASSERT_TRUE(key.Valid());
-
-  // Create a test value that is larger than MAX_PATH.
-  std::wstring data(MAX_PATH * 2, L'a');
-
-  ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(data.c_str(), data.c_str()));
-
-  RegistryValueIterator iterator(HKEY_CURRENT_USER, foo_key.c_str());
-  ASSERT_TRUE(iterator.Valid());
-  EXPECT_STREQ(data.c_str(), iterator.Name());
-  EXPECT_STREQ(data.c_str(), iterator.Value());
-  // ValueSize() is in bytes, including NUL.
-  EXPECT_EQ((MAX_PATH * 2 + 1) * sizeof(wchar_t), iterator.ValueSize());
-  ++iterator;
-  EXPECT_FALSE(iterator.Valid());
-}
-
-TEST_F(RegistryTest, TruncatedCharTest) {
-  RegKey key;
-  std::wstring foo_key(kRootKey);
-  foo_key += L"\\Foo";
-  ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, foo_key.c_str(),
-                                      KEY_READ));
-  ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, foo_key.c_str(),
-                                    KEY_READ | KEY_SET_VALUE));
-  ASSERT_TRUE(key.Valid());
-
-  const wchar_t kName[] = L"name";
-  // kData size is not a multiple of sizeof(wchar_t).
-  const uint8_t kData[] = {1, 2, 3, 4, 5};
-  EXPECT_EQ(5u, arraysize(kData));
-  ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(kName, kData,
-                                          arraysize(kData), REG_BINARY));
-
-  RegistryValueIterator iterator(HKEY_CURRENT_USER, foo_key.c_str());
-  ASSERT_TRUE(iterator.Valid());
-  EXPECT_STREQ(kName, iterator.Name());
-  // ValueSize() is in bytes.
-  ASSERT_EQ(arraysize(kData), iterator.ValueSize());
-  // Value() is NUL terminated.
-  int end = (iterator.ValueSize() + sizeof(wchar_t) - 1) / sizeof(wchar_t);
-  EXPECT_NE(L'\0', iterator.Value()[end-1]);
-  EXPECT_EQ(L'\0', iterator.Value()[end]);
-  EXPECT_EQ(0, std::memcmp(kData, iterator.Value(), arraysize(kData)));
-  ++iterator;
-  EXPECT_FALSE(iterator.Valid());
-}
-
-TEST_F(RegistryTest, RecursiveDelete) {
-  RegKey key;
-  // Create kRootKey->Foo
-  //                  \->Bar (TestValue)
-  //                     \->Foo (TestValue)
-  //                        \->Bar
-  //                           \->Foo
-  //                  \->Moo
-  //                  \->Foo
-  // and delete kRootKey->Foo
-  std::wstring foo_key(kRootKey);
-  foo_key += L"\\Foo";
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Create(HKEY_CURRENT_USER, foo_key.c_str(), KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Bar", KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(L"TestValue", L"TestData"));
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Create(HKEY_CURRENT_USER, foo_key.c_str(), KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Moo", KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Create(HKEY_CURRENT_USER, foo_key.c_str(), KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Foo", KEY_WRITE));
-  foo_key += L"\\Bar";
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_CURRENT_USER, foo_key.c_str(), KEY_WRITE));
-  foo_key += L"\\Foo";
-  ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Foo", KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS, key.WriteValue(L"TestValue", L"TestData"));
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_CURRENT_USER, foo_key.c_str(), KEY_READ));
-
-  ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, kRootKey, KEY_WRITE));
-  ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(L"Bar"));
-  ASSERT_NE(ERROR_SUCCESS, key.DeleteEmptyKey(L"Foo"));
-  ASSERT_NE(ERROR_SUCCESS, key.DeleteEmptyKey(L"Foo\\Bar\\Foo"));
-  ASSERT_NE(ERROR_SUCCESS, key.DeleteEmptyKey(L"Foo\\Bar"));
-  ASSERT_EQ(ERROR_SUCCESS, key.DeleteEmptyKey(L"Foo\\Foo"));
-
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_CURRENT_USER, foo_key.c_str(), KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Bar", KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"Foo", KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_CURRENT_USER, foo_key.c_str(), KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(L""));
-  ASSERT_NE(ERROR_SUCCESS,
-            key.Open(HKEY_CURRENT_USER, foo_key.c_str(), KEY_READ));
-
-  ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, kRootKey, KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(L"Foo"));
-  ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(L"Foo"));
-  ASSERT_NE(ERROR_SUCCESS,
-            key.Open(HKEY_CURRENT_USER, foo_key.c_str(), KEY_READ));
-}
-
-// This test requires running as an Administrator as it tests redirected
-// registry writes to HKLM\Software
-// http://msdn.microsoft.com/en-us/library/windows/desktop/aa384253.aspx
-// TODO(wfh): flaky test on Vista.  See http://crbug.com/377917
-TEST_F(RegistryTest, DISABLED_Wow64RedirectedFromNative) {
-  if (!IsRedirectorPresent())
-    return;
-
-  RegKey key;
-
-  // Test redirected key access from non-redirected.
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Create(HKEY_LOCAL_MACHINE,
-                       foo_software_key_.c_str(),
-                       KEY_WRITE | kRedirectedViewMask));
-  ASSERT_NE(ERROR_SUCCESS,
-            key.Open(HKEY_LOCAL_MACHINE, foo_software_key_.c_str(), KEY_READ));
-  ASSERT_NE(ERROR_SUCCESS,
-            key.Open(HKEY_LOCAL_MACHINE,
-                     foo_software_key_.c_str(),
-                     KEY_READ | kNativeViewMask));
-
-  // Open the non-redirected view of the parent and try to delete the test key.
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_LOCAL_MACHINE, L"Software", KEY_SET_VALUE));
-  ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(kRootKey));
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_LOCAL_MACHINE,
-                     L"Software",
-                     KEY_SET_VALUE | kNativeViewMask));
-  ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(kRootKey));
-
-  // Open the redirected view and delete the key created above.
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_LOCAL_MACHINE,
-                     L"Software",
-                     KEY_SET_VALUE | kRedirectedViewMask));
-  ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kRootKey));
-}
-
-// Test for the issue found in http://crbug.com/384587 where OpenKey would call
-// Close() and reset wow64_access_ flag to 0 and cause a NOTREACHED to hit on a
-// subsequent OpenKey call.
-TEST_F(RegistryTest, SameWowFlags) {
-  RegKey key;
-
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_LOCAL_MACHINE,
-                     L"Software",
-                     KEY_READ | KEY_WOW64_64KEY));
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.OpenKey(L"Microsoft",
-                        KEY_READ | KEY_WOW64_64KEY));
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.OpenKey(L"Windows",
-                        KEY_READ | KEY_WOW64_64KEY));
-}
-
-// TODO(wfh): flaky test on Vista.  See http://crbug.com/377917
-TEST_F(RegistryTest, DISABLED_Wow64NativeFromRedirected) {
-  if (!IsRedirectorPresent())
-    return;
-  RegKey key;
-
-  // Test non-redirected key access from redirected.
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Create(HKEY_LOCAL_MACHINE,
-                       foo_software_key_.c_str(),
-                       KEY_WRITE | kNativeViewMask));
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_LOCAL_MACHINE, foo_software_key_.c_str(), KEY_READ));
-  ASSERT_NE(ERROR_SUCCESS,
-            key.Open(HKEY_LOCAL_MACHINE,
-                     foo_software_key_.c_str(),
-                     KEY_READ | kRedirectedViewMask));
-
-  // Open the redirected view of the parent and try to delete the test key
-  // from the non-redirected view.
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_LOCAL_MACHINE,
-                     L"Software",
-                     KEY_SET_VALUE | kRedirectedViewMask));
-  ASSERT_NE(ERROR_SUCCESS, key.DeleteKey(kRootKey));
-
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_LOCAL_MACHINE,
-                     L"Software",
-                     KEY_SET_VALUE | kNativeViewMask));
-  ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(kRootKey));
-}
-
-TEST_F(RegistryTest, OpenSubKey) {
-  RegKey key;
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_CURRENT_USER,
-                     kRootKey,
-                     KEY_READ | KEY_CREATE_SUB_KEY));
-
-  ASSERT_NE(ERROR_SUCCESS, key.OpenKey(L"foo", KEY_READ));
-  ASSERT_EQ(ERROR_SUCCESS, key.CreateKey(L"foo", KEY_READ));
-  ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, kRootKey, KEY_READ));
-  ASSERT_EQ(ERROR_SUCCESS, key.OpenKey(L"foo", KEY_READ));
-
-  std::wstring foo_key(kRootKey);
-  foo_key += L"\\Foo";
-  ASSERT_EQ(ERROR_SUCCESS,
-            key.Open(HKEY_CURRENT_USER, foo_key.c_str(), KEY_READ));
-
-  ASSERT_EQ(ERROR_SUCCESS, key.Open(HKEY_CURRENT_USER, kRootKey, KEY_WRITE));
-  ASSERT_EQ(ERROR_SUCCESS, key.DeleteKey(L"foo"));
-}
-
-class TestChangeDelegate {
- public:
-   TestChangeDelegate() : called_(false) {}
-   ~TestChangeDelegate() {}
-
-   void OnKeyChanged() {
-     RunLoop::QuitCurrentWhenIdleDeprecated();
-     called_ = true;
-   }
-
-   bool WasCalled() {
-     bool was_called = called_;
-     called_ = false;
-     return was_called;
-   }
-
- private:
-  bool called_;
-};
-
-TEST_F(RegistryTest, ChangeCallback) {
-  RegKey key;
-  TestChangeDelegate delegate;
-  MessageLoop message_loop;
-
-  std::wstring foo_key(kRootKey);
-  foo_key += L"\\Foo";
-  ASSERT_EQ(ERROR_SUCCESS, key.Create(HKEY_CURRENT_USER, foo_key.c_str(),
-                                      KEY_READ));
-
-  ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
-                                     Unretained(&delegate))));
-  EXPECT_FALSE(delegate.WasCalled());
-
-  // Make some change.
-  RegKey key2;
-  ASSERT_EQ(ERROR_SUCCESS, key2.Open(HKEY_CURRENT_USER, foo_key.c_str(),
-                                      KEY_READ | KEY_SET_VALUE));
-  ASSERT_TRUE(key2.Valid());
-  EXPECT_EQ(ERROR_SUCCESS, key2.WriteValue(L"name", L"data"));
-
-  // Allow delivery of the notification.
-  EXPECT_FALSE(delegate.WasCalled());
-  base::RunLoop().Run();
-
-  ASSERT_TRUE(delegate.WasCalled());
-  EXPECT_FALSE(delegate.WasCalled());
-
-  ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
-                                     Unretained(&delegate))));
-
-  // Change something else.
-  EXPECT_EQ(ERROR_SUCCESS, key2.WriteValue(L"name2", L"data2"));
-  base::RunLoop().Run();
-  ASSERT_TRUE(delegate.WasCalled());
-
-  ASSERT_TRUE(key.StartWatching(Bind(&TestChangeDelegate::OnKeyChanged,
-                                     Unretained(&delegate))));
-  base::RunLoop().RunUntilIdle();
-  EXPECT_FALSE(delegate.WasCalled());
-}
-
-}  // namespace
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/scoped_bstr_unittest.cc b/base/win/scoped_bstr_unittest.cc
deleted file mode 100644
index d305e5a..0000000
--- a/base/win/scoped_bstr_unittest.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stddef.h>
-
-#include "base/macros.h"
-#include "base/win/scoped_bstr.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-static const wchar_t kTestString1[] = L"123";
-static const wchar_t kTestString2[] = L"456789";
-size_t test1_len = arraysize(kTestString1) - 1;
-size_t test2_len = arraysize(kTestString2) - 1;
-
-void DumbBstrTests() {
-  ScopedBstr b;
-  EXPECT_TRUE(b == NULL);
-  EXPECT_EQ(0u, b.Length());
-  EXPECT_EQ(0u, b.ByteLength());
-  b.Reset(NULL);
-  EXPECT_TRUE(b == NULL);
-  EXPECT_TRUE(b.Release() == NULL);
-  ScopedBstr b2;
-  b.Swap(b2);
-  EXPECT_TRUE(b2 == NULL);
-}
-
-void GiveMeABstr(BSTR* ret) {
-  *ret = SysAllocString(kTestString1);
-}
-
-void BasicBstrTests() {
-  ScopedBstr b1(kTestString1);
-  EXPECT_EQ(test1_len, b1.Length());
-  EXPECT_EQ(test1_len * sizeof(kTestString1[0]), b1.ByteLength());
-
-  ScopedBstr b2;
-  b1.Swap(b2);
-  EXPECT_EQ(test1_len, b2.Length());
-  EXPECT_EQ(0u, b1.Length());
-  EXPECT_EQ(0, lstrcmp(b2, kTestString1));
-  BSTR tmp = b2.Release();
-  EXPECT_TRUE(tmp != NULL);
-  EXPECT_EQ(0, lstrcmp(tmp, kTestString1));
-  EXPECT_TRUE(b2 == NULL);
-  SysFreeString(tmp);
-
-  GiveMeABstr(b2.Receive());
-  EXPECT_TRUE(b2 != NULL);
-  b2.Reset();
-  EXPECT_TRUE(b2.AllocateBytes(100) != NULL);
-  EXPECT_EQ(100u, b2.ByteLength());
-  EXPECT_EQ(100 / sizeof(kTestString1[0]), b2.Length());
-  lstrcpy(static_cast<BSTR>(b2), kTestString1);
-  EXPECT_EQ(test1_len, static_cast<size_t>(lstrlen(b2)));
-  EXPECT_EQ(100 / sizeof(kTestString1[0]), b2.Length());
-  b2.SetByteLen(lstrlen(b2) * sizeof(kTestString2[0]));
-  EXPECT_EQ(b2.Length(), static_cast<size_t>(lstrlen(b2)));
-
-  EXPECT_TRUE(b1.Allocate(kTestString2) != NULL);
-  EXPECT_EQ(test2_len, b1.Length());
-  b1.SetByteLen((test2_len - 1) * sizeof(kTestString2[0]));
-  EXPECT_EQ(test2_len - 1, b1.Length());
-}
-
-}  // namespace
-
-TEST(ScopedBstrTest, ScopedBstr) {
-  DumbBstrTests();
-  BasicBstrTests();
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/scoped_handle_unittest.cc b/base/win/scoped_handle_unittest.cc
deleted file mode 100644
index ca6fb45..0000000
--- a/base/win/scoped_handle_unittest.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <windows.h>
-#include <winternl.h>
-
-#include "base/base_switches.h"
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/scoped_native_library.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_timeouts.h"
-#include "base/win/scoped_handle.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-
-namespace base {
-namespace win {
-
-namespace testing {
-extern "C" bool __declspec(dllexport) RunTest();
-}  // namespace testing
-
-TEST(ScopedHandleTest, ScopedHandle) {
-  // Any illegal error code will do. We just need to test that it is preserved
-  // by ScopedHandle to avoid bug 528394.
-  const DWORD magic_error = 0x12345678;
-
-  HANDLE handle = ::CreateMutex(nullptr, false, nullptr);
-  // Call SetLastError after creating the handle.
-  ::SetLastError(magic_error);
-  base::win::ScopedHandle handle_holder(handle);
-  EXPECT_EQ(magic_error, ::GetLastError());
-
-  // Create a new handle and then set LastError again.
-  handle = ::CreateMutex(nullptr, false, nullptr);
-  ::SetLastError(magic_error);
-  handle_holder.Set(handle);
-  EXPECT_EQ(magic_error, ::GetLastError());
-
-  // Create a new handle and then set LastError again.
-  handle = ::CreateMutex(nullptr, false, nullptr);
-  base::win::ScopedHandle handle_source(handle);
-  ::SetLastError(magic_error);
-  handle_holder = std::move(handle_source);
-  EXPECT_EQ(magic_error, ::GetLastError());
-}
-
-TEST(ScopedHandleTest, ActiveVerifierTrackedHasBeenClosed) {
-  HANDLE handle = ::CreateMutex(nullptr, false, nullptr);
-  ASSERT_NE(HANDLE(nullptr), handle);
-  typedef NTSTATUS(WINAPI * NtCloseFunc)(HANDLE);
-  NtCloseFunc ntclose = reinterpret_cast<NtCloseFunc>(
-      GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtClose"));
-  ASSERT_NE(nullptr, ntclose);
-
-  ASSERT_DEATH({
-    base::win::ScopedHandle handle_holder(handle);
-    ntclose(handle);
-    // Destructing a ScopedHandle with an illegally closed handle should fail.
-  }, "");
-}
-
-TEST(ScopedHandleTest, ActiveVerifierDoubleTracking) {
-  HANDLE handle = ::CreateMutex(nullptr, false, nullptr);
-  ASSERT_NE(HANDLE(nullptr), handle);
-
-  base::win::ScopedHandle handle_holder(handle);
-
-  ASSERT_DEATH({
-    base::win::ScopedHandle handle_holder2(handle);
-  }, "");
-}
-
-TEST(ScopedHandleTest, ActiveVerifierWrongOwner) {
-  HANDLE handle = ::CreateMutex(nullptr, false, nullptr);
-  ASSERT_NE(HANDLE(nullptr), handle);
-
-  base::win::ScopedHandle handle_holder(handle);
-  ASSERT_DEATH({
-    base::win::ScopedHandle handle_holder2;
-    handle_holder2.handle_ = handle;
-  }, "");
-  ASSERT_TRUE(handle_holder.IsValid());
-  handle_holder.Close();
-}
-
-TEST(ScopedHandleTest, ActiveVerifierUntrackedHandle) {
-  HANDLE handle = ::CreateMutex(nullptr, false, nullptr);
-  ASSERT_NE(HANDLE(nullptr), handle);
-
-  ASSERT_DEATH({
-    base::win::ScopedHandle handle_holder;
-    handle_holder.handle_ = handle;
-  }, "");
-
-  ASSERT_TRUE(::CloseHandle(handle));
-}
-
-// Under ASan, the multi-process test crashes during process shutdown for
-// unknown reasons. Disable it for now. http://crbug.com/685262
-#if defined(ADDRESS_SANITIZER)
-#define MAYBE_MultiProcess DISABLED_MultiProcess
-#else
-#define MAYBE_MultiProcess MultiProcess
-#endif
-
-TEST(ScopedHandleTest, MAYBE_MultiProcess) {
-  // Initializing ICU in the child process causes a scoped handle to be created
-  // before the test gets a chance to test the race condition, so disable ICU
-  // for the child process here.
-  CommandLine command_line(base::GetMultiProcessTestChildBaseCommandLine());
-  command_line.AppendSwitch(switches::kTestDoNotInitializeIcu);
-
-  base::Process test_child_process = base::SpawnMultiProcessTestChild(
-      "ActiveVerifierChildProcess", command_line, LaunchOptions());
-
-  int rv = -1;
-  ASSERT_TRUE(test_child_process.WaitForExitWithTimeout(
-      TestTimeouts::action_timeout(), &rv));
-  EXPECT_EQ(0, rv);
-}
-
-MULTIPROCESS_TEST_MAIN(ActiveVerifierChildProcess) {
-  ScopedNativeLibrary module(FilePath(L"scoped_handle_test_dll.dll"));
-
-  if (!module.is_valid())
-    return 1;
-  auto run_test_function = reinterpret_cast<decltype(&testing::RunTest)>(
-      module.GetFunctionPointer("RunTest"));
-  if (!run_test_function)
-    return 1;
-  if (!run_test_function())
-    return 1;
-
-  return 0;
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/scoped_hstring_unittest.cc b/base/win/scoped_hstring_unittest.cc
deleted file mode 100644
index fdcf8ff..0000000
--- a/base/win/scoped_hstring_unittest.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/scoped_hstring.h"
-
-#include <winstring.h>
-
-#include "base/strings/utf_string_conversions.h"
-#include "base/win/core_winrt_util.h"
-#include "base/win/windows_version.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-constexpr wchar_t kTestString1[] = L"123";
-constexpr wchar_t kTestString2[] = L"456789";
-
-}  // namespace
-
-TEST(ScopedHStringTest, Init) {
-  // ScopedHString requires WinRT core functions, which are not available in
-  // older versions.
-  if (GetVersion() < VERSION_WIN8) {
-    EXPECT_FALSE(ScopedHString::ResolveCoreWinRTStringDelayload());
-    return;
-  }
-
-  EXPECT_TRUE(ScopedHString::ResolveCoreWinRTStringDelayload());
-
-  ScopedHString hstring = ScopedHString::Create(kTestString1);
-  std::string buffer = hstring.GetAsUTF8();
-  EXPECT_EQ(kTestString1, base::UTF8ToWide(buffer));
-  base::StringPiece16 contents = hstring.Get();
-  EXPECT_EQ(kTestString1, contents);
-
-  hstring.reset();
-  EXPECT_TRUE(hstring == NULL);
-  EXPECT_EQ(NULL, hstring.get());
-
-  ScopedHString hstring2 = ScopedHString::Create(kTestString2);
-  hstring.swap(hstring2);
-  EXPECT_TRUE(hstring2 == NULL);
-
-  buffer = hstring.GetAsUTF8();
-  EXPECT_EQ(kTestString2, base::UTF8ToWide(buffer));
-  contents = hstring.Get();
-  EXPECT_EQ(kTestString2, contents);
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/scoped_process_information_unittest.cc b/base/win/scoped_process_information_unittest.cc
deleted file mode 100644
index 799b273..0000000
--- a/base/win/scoped_process_information_unittest.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <windows.h>
-
-#include <string>
-
-#include "base/command_line.h"
-#include "base/process/kill.h"
-#include "base/process/process.h"
-#include "base/test/multiprocess_test.h"
-#include "base/win/scoped_process_information.h"
-#include "testing/multiprocess_func_list.h"
-
-namespace {
-
-const DWORD kProcessId = 4321;
-const DWORD kThreadId = 1234;
-const HANDLE kProcessHandle = reinterpret_cast<HANDLE>(7651);
-const HANDLE kThreadHandle = reinterpret_cast<HANDLE>(1567);
-
-void MockCreateProcess(base::win::ScopedProcessInformation* process_info) {
-  PROCESS_INFORMATION process_information = {};
-  process_information.dwProcessId = kProcessId;
-  process_information.dwThreadId = kThreadId;
-  process_information.hProcess = kProcessHandle;
-  process_information.hThread = kThreadHandle;
-  process_info->Set(process_information);
-}
-
-}  // namespace
-
-class ScopedProcessInformationTest : public base::MultiProcessTest {
- protected:
-  void DoCreateProcess(const std::string& main_id,
-                       PROCESS_INFORMATION* process_handle);
-};
-
-MULTIPROCESS_TEST_MAIN(ReturnSeven) {
-  return 7;
-}
-
-MULTIPROCESS_TEST_MAIN(ReturnNine) {
-  return 9;
-}
-
-void ScopedProcessInformationTest::DoCreateProcess(
-    const std::string& main_id, PROCESS_INFORMATION* process_handle) {
-  std::wstring cmd_line = MakeCmdLine(main_id).GetCommandLineString();
-  STARTUPINFO startup_info = {};
-  startup_info.cb = sizeof(startup_info);
-
-  EXPECT_TRUE(::CreateProcess(NULL, &cmd_line[0],
-                              NULL, NULL, false, 0, NULL, NULL,
-                              &startup_info, process_handle));
-}
-
-TEST_F(ScopedProcessInformationTest, InitiallyInvalid) {
-  base::win::ScopedProcessInformation process_info;
-  ASSERT_FALSE(process_info.IsValid());
-}
-
-TEST_F(ScopedProcessInformationTest, Receive) {
-  base::win::ScopedProcessInformation process_info;
-  MockCreateProcess(&process_info);
-
-  EXPECT_TRUE(process_info.IsValid());
-  EXPECT_EQ(kProcessId, process_info.process_id());
-  EXPECT_EQ(kThreadId, process_info.thread_id());
-  EXPECT_EQ(kProcessHandle, process_info.process_handle());
-  EXPECT_EQ(kThreadHandle, process_info.thread_handle());
-  process_info.Take();
-}
-
-TEST_F(ScopedProcessInformationTest, TakeProcess) {
-  base::win::ScopedProcessInformation process_info;
-  MockCreateProcess(&process_info);
-
-  HANDLE process = process_info.TakeProcessHandle();
-  EXPECT_EQ(kProcessHandle, process);
-  EXPECT_EQ(NULL, process_info.process_handle());
-  EXPECT_EQ(0u, process_info.process_id());
-  EXPECT_TRUE(process_info.IsValid());
-  process_info.Take();
-}
-
-TEST_F(ScopedProcessInformationTest, TakeThread) {
-  base::win::ScopedProcessInformation process_info;
-  MockCreateProcess(&process_info);
-
-  HANDLE thread = process_info.TakeThreadHandle();
-  EXPECT_EQ(kThreadHandle, thread);
-  EXPECT_EQ(NULL, process_info.thread_handle());
-  EXPECT_EQ(0u, process_info.thread_id());
-  EXPECT_TRUE(process_info.IsValid());
-  process_info.Take();
-}
-
-TEST_F(ScopedProcessInformationTest, TakeBoth) {
-  base::win::ScopedProcessInformation process_info;
-  MockCreateProcess(&process_info);
-
-  process_info.TakeProcessHandle();
-  process_info.TakeThreadHandle();
-  EXPECT_FALSE(process_info.IsValid());
-  process_info.Take();
-}
-
-TEST_F(ScopedProcessInformationTest, TakeWholeStruct) {
-  base::win::ScopedProcessInformation process_info;
-  MockCreateProcess(&process_info);
-
-  PROCESS_INFORMATION to_discard = process_info.Take();
-  EXPECT_EQ(kProcessId, to_discard.dwProcessId);
-  EXPECT_EQ(kThreadId, to_discard.dwThreadId);
-  EXPECT_EQ(kProcessHandle, to_discard.hProcess);
-  EXPECT_EQ(kThreadHandle, to_discard.hThread);
-  EXPECT_FALSE(process_info.IsValid());
-}
-
-TEST_F(ScopedProcessInformationTest, Duplicate) {
-  PROCESS_INFORMATION temp_process_information;
-  DoCreateProcess("ReturnSeven", &temp_process_information);
-  base::win::ScopedProcessInformation process_info;
-  process_info.Set(temp_process_information);
-
-  base::win::ScopedProcessInformation duplicate;
-  duplicate.DuplicateFrom(process_info);
-
-  ASSERT_TRUE(process_info.IsValid());
-  ASSERT_NE(0u, process_info.process_id());
-  ASSERT_EQ(duplicate.process_id(), process_info.process_id());
-  ASSERT_NE(0u, process_info.thread_id());
-  ASSERT_EQ(duplicate.thread_id(), process_info.thread_id());
-
-  // Validate that we have separate handles that are good.
-  int exit_code = 0;
-  base::Process process(process_info.TakeProcessHandle());
-  ASSERT_TRUE(process.WaitForExit(&exit_code));
-  ASSERT_EQ(7, exit_code);
-
-  exit_code = 0;
-  base::Process dup_process(duplicate.TakeProcessHandle());
-  ASSERT_TRUE(dup_process.WaitForExit(&exit_code));
-  ASSERT_EQ(7, exit_code);
-
-  ASSERT_TRUE(::CloseHandle(process_info.TakeThreadHandle()));
-  ASSERT_TRUE(::CloseHandle(duplicate.TakeThreadHandle()));
-}
-
-TEST_F(ScopedProcessInformationTest, Set) {
-  base::win::ScopedProcessInformation base_process_info;
-  MockCreateProcess(&base_process_info);
-
-  PROCESS_INFORMATION base_struct = base_process_info.Take();
-
-  base::win::ScopedProcessInformation process_info;
-  process_info.Set(base_struct);
-
-  EXPECT_EQ(kProcessId, process_info.process_id());
-  EXPECT_EQ(kThreadId, process_info.thread_id());
-  EXPECT_EQ(kProcessHandle, process_info.process_handle());
-  EXPECT_EQ(kThreadHandle, process_info.thread_handle());
-  base_struct = process_info.Take();
-}
diff --git a/base/win/scoped_variant_unittest.cc b/base/win/scoped_variant_unittest.cc
deleted file mode 100644
index 7d61e28..0000000
--- a/base/win/scoped_variant_unittest.cc
+++ /dev/null
@@ -1,263 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <stdint.h>
-
-#include "base/win/scoped_variant.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-static const wchar_t kTestString1[] = L"Used to create BSTRs";
-static const wchar_t kTestString2[] = L"Also used to create BSTRs";
-
-void GiveMeAVariant(VARIANT* ret) {
-  EXPECT_TRUE(ret != NULL);
-  ret->vt = VT_BSTR;
-  V_BSTR(ret) = ::SysAllocString(kTestString1);
-}
-
-// A dummy IDispatch implementation (if you can call it that).
-// The class does nothing intelligent really.  Only increments a counter
-// when AddRef is called and decrements it when Release is called.
-class FakeComObject : public IDispatch {
- public:
-  FakeComObject() : ref_(0) {
-  }
-
-  STDMETHOD_(DWORD, AddRef)() override {
-    ref_++;
-    return ref_;
-  }
-
-  STDMETHOD_(DWORD, Release)() override {
-    ref_--;
-    return ref_;
-  }
-
-  STDMETHOD(QueryInterface)(REFIID, void**) override { return E_NOTIMPL; }
-
-  STDMETHOD(GetTypeInfoCount)(UINT*) override { return E_NOTIMPL; }
-
-  STDMETHOD(GetTypeInfo)(UINT, LCID, ITypeInfo**) override { return E_NOTIMPL; }
-
-  STDMETHOD(GetIDsOfNames)(REFIID, LPOLESTR*, UINT, LCID, DISPID*) override {
-    return E_NOTIMPL;
-  }
-
-  STDMETHOD(Invoke)(DISPID,
-                    REFIID,
-                    LCID,
-                    WORD,
-                    DISPPARAMS*,
-                    VARIANT*,
-                    EXCEPINFO*,
-                    UINT*) override {
-    return E_NOTIMPL;
-  }
-
-  // A way to check the internal reference count of the class.
-  int ref_count() const {
-    return ref_;
-  }
-
- protected:
-  int ref_;
-};
-
-}  // namespace
-
-TEST(ScopedVariantTest, ScopedVariant) {
-  ScopedVariant var;
-  EXPECT_TRUE(var.type() == VT_EMPTY);
-  // V_BSTR(var.ptr()) = NULL;  <- NOTE: Assignment like that is not supported.
-
-  ScopedVariant var_bstr(L"VT_BSTR");
-  EXPECT_EQ(VT_BSTR, V_VT(var_bstr.ptr()));
-  EXPECT_TRUE(V_BSTR(var_bstr.ptr()) != NULL);  // can't use EXPECT_NE for BSTR
-  var_bstr.Reset();
-  EXPECT_NE(VT_BSTR, V_VT(var_bstr.ptr()));
-  var_bstr.Set(kTestString2);
-  EXPECT_EQ(VT_BSTR, V_VT(var_bstr.ptr()));
-
-  VARIANT tmp = var_bstr.Release();
-  EXPECT_EQ(VT_EMPTY, V_VT(var_bstr.ptr()));
-  EXPECT_EQ(VT_BSTR, V_VT(&tmp));
-  EXPECT_EQ(0, lstrcmp(V_BSTR(&tmp), kTestString2));
-
-  var.Reset(tmp);
-  EXPECT_EQ(VT_BSTR, V_VT(var.ptr()));
-  EXPECT_EQ(0, lstrcmpW(V_BSTR(var.ptr()), kTestString2));
-
-  var_bstr.Swap(var);
-  EXPECT_EQ(VT_EMPTY, V_VT(var.ptr()));
-  EXPECT_EQ(VT_BSTR, V_VT(var_bstr.ptr()));
-  EXPECT_EQ(0, lstrcmpW(V_BSTR(var_bstr.ptr()), kTestString2));
-  var_bstr.Reset();
-
-  // Test the Compare and Copy routines.
-  GiveMeAVariant(var_bstr.Receive());
-  ScopedVariant var_bstr2(V_BSTR(var_bstr.ptr()));
-  EXPECT_EQ(0, var_bstr.Compare(var_bstr2));
-  var_bstr2.Reset();
-  EXPECT_NE(0, var_bstr.Compare(var_bstr2));
-  var_bstr2.Reset(var_bstr.Copy());
-  EXPECT_EQ(0, var_bstr.Compare(var_bstr2));
-  var_bstr2.Reset();
-  var_bstr2.Set(V_BSTR(var_bstr.ptr()));
-  EXPECT_EQ(0, var_bstr.Compare(var_bstr2));
-  var_bstr2.Reset();
-  var_bstr.Reset();
-
-  // Test for the SetDate setter.
-  SYSTEMTIME sys_time;
-  ::GetSystemTime(&sys_time);
-  DATE date;
-  ::SystemTimeToVariantTime(&sys_time, &date);
-  var.Reset();
-  var.SetDate(date);
-  EXPECT_EQ(VT_DATE, var.type());
-  EXPECT_EQ(date, V_DATE(var.ptr()));
-
-  // Simple setter tests.  These do not require resetting the variant
-  // after each test since the variant type is not "leakable" (i.e. doesn't
-  // need to be freed explicitly).
-
-  // We need static cast here since char defaults to int (!?).
-  var.Set(static_cast<int8_t>('v'));
-  EXPECT_EQ(VT_I1, var.type());
-  EXPECT_EQ('v', V_I1(var.ptr()));
-
-  var.Set(static_cast<short>(123));
-  EXPECT_EQ(VT_I2, var.type());
-  EXPECT_EQ(123, V_I2(var.ptr()));
-
-  var.Set(static_cast<int32_t>(123));
-  EXPECT_EQ(VT_I4, var.type());
-  EXPECT_EQ(123, V_I4(var.ptr()));
-
-  var.Set(static_cast<int64_t>(123));
-  EXPECT_EQ(VT_I8, var.type());
-  EXPECT_EQ(123, V_I8(var.ptr()));
-
-  var.Set(static_cast<uint8_t>(123));
-  EXPECT_EQ(VT_UI1, var.type());
-  EXPECT_EQ(123u, V_UI1(var.ptr()));
-
-  var.Set(static_cast<unsigned short>(123));
-  EXPECT_EQ(VT_UI2, var.type());
-  EXPECT_EQ(123u, V_UI2(var.ptr()));
-
-  var.Set(static_cast<uint32_t>(123));
-  EXPECT_EQ(VT_UI4, var.type());
-  EXPECT_EQ(123u, V_UI4(var.ptr()));
-
-  var.Set(static_cast<uint64_t>(123));
-  EXPECT_EQ(VT_UI8, var.type());
-  EXPECT_EQ(123u, V_UI8(var.ptr()));
-
-  var.Set(123.123f);
-  EXPECT_EQ(VT_R4, var.type());
-  EXPECT_EQ(123.123f, V_R4(var.ptr()));
-
-  var.Set(static_cast<double>(123.123));
-  EXPECT_EQ(VT_R8, var.type());
-  EXPECT_EQ(123.123, V_R8(var.ptr()));
-
-  var.Set(true);
-  EXPECT_EQ(VT_BOOL, var.type());
-  EXPECT_EQ(VARIANT_TRUE, V_BOOL(var.ptr()));
-  var.Set(false);
-  EXPECT_EQ(VT_BOOL, var.type());
-  EXPECT_EQ(VARIANT_FALSE, V_BOOL(var.ptr()));
-
-  // Com interface tests
-
-  var.Set(static_cast<IDispatch*>(NULL));
-  EXPECT_EQ(VT_DISPATCH, var.type());
-  EXPECT_EQ(NULL, V_DISPATCH(var.ptr()));
-  var.Reset();
-
-  var.Set(static_cast<IUnknown*>(NULL));
-  EXPECT_EQ(VT_UNKNOWN, var.type());
-  EXPECT_EQ(NULL, V_UNKNOWN(var.ptr()));
-  var.Reset();
-
-  FakeComObject faker;
-  EXPECT_EQ(0, faker.ref_count());
-  var.Set(static_cast<IDispatch*>(&faker));
-  EXPECT_EQ(VT_DISPATCH, var.type());
-  EXPECT_EQ(&faker, V_DISPATCH(var.ptr()));
-  EXPECT_EQ(1, faker.ref_count());
-  var.Reset();
-  EXPECT_EQ(0, faker.ref_count());
-
-  var.Set(static_cast<IUnknown*>(&faker));
-  EXPECT_EQ(VT_UNKNOWN, var.type());
-  EXPECT_EQ(&faker, V_UNKNOWN(var.ptr()));
-  EXPECT_EQ(1, faker.ref_count());
-  var.Reset();
-  EXPECT_EQ(0, faker.ref_count());
-
-  {
-    ScopedVariant disp_var(&faker);
-    EXPECT_EQ(VT_DISPATCH, disp_var.type());
-    EXPECT_EQ(&faker, V_DISPATCH(disp_var.ptr()));
-    EXPECT_EQ(1, faker.ref_count());
-  }
-  EXPECT_EQ(0, faker.ref_count());
-
-  {
-    ScopedVariant ref1(&faker);
-    EXPECT_EQ(1, faker.ref_count());
-    ScopedVariant ref2(static_cast<const VARIANT&>(ref1));
-    EXPECT_EQ(2, faker.ref_count());
-    ScopedVariant ref3;
-    ref3 = static_cast<const VARIANT&>(ref2);
-    EXPECT_EQ(3, faker.ref_count());
-  }
-  EXPECT_EQ(0, faker.ref_count());
-
-  {
-    ScopedVariant unk_var(static_cast<IUnknown*>(&faker));
-    EXPECT_EQ(VT_UNKNOWN, unk_var.type());
-    EXPECT_EQ(&faker, V_UNKNOWN(unk_var.ptr()));
-    EXPECT_EQ(1, faker.ref_count());
-  }
-  EXPECT_EQ(0, faker.ref_count());
-
-  VARIANT raw;
-  raw.vt = VT_UNKNOWN;
-  raw.punkVal = &faker;
-  EXPECT_EQ(0, faker.ref_count());
-  var.Set(raw);
-  EXPECT_EQ(1, faker.ref_count());
-  var.Reset();
-  EXPECT_EQ(0, faker.ref_count());
-
-  {
-    ScopedVariant number(123);
-    EXPECT_EQ(VT_I4, number.type());
-    EXPECT_EQ(123, V_I4(number.ptr()));
-  }
-
-  // SAFEARRAY tests
-  var.Set(static_cast<SAFEARRAY*>(NULL));
-  EXPECT_EQ(VT_EMPTY, var.type());
-
-  SAFEARRAY* sa = ::SafeArrayCreateVector(VT_UI1, 0, 100);
-  ASSERT_TRUE(sa != NULL);
-
-  var.Set(sa);
-  EXPECT_TRUE(ScopedVariant::IsLeakableVarType(var.type()));
-  EXPECT_EQ(VT_ARRAY | VT_UI1, var.type());
-  EXPECT_EQ(sa, V_ARRAY(var.ptr()));
-  // The array is destroyed in the destructor of var.
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/scoped_winrt_initializer_unittest.cc b/base/win/scoped_winrt_initializer_unittest.cc
deleted file mode 100644
index 9df1187..0000000
--- a/base/win/scoped_winrt_initializer_unittest.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/scoped_winrt_initializer.h"
-
-#include "base/test/gtest_util.h"
-#include "base/win/com_init_util.h"
-#include "base/win/scoped_com_initializer.h"
-#include "base/win/windows_version.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-TEST(ScopedWinrtInitializer, BasicFunctionality) {
-  if (GetVersion() < VERSION_WIN8)
-    return;
-
-  AssertComApartmentType(ComApartmentType::NONE);
-  {
-    ScopedWinrtInitializer scoped_winrt_initializer;
-    AssertComApartmentType(ComApartmentType::MTA);
-  }
-  AssertComApartmentType(ComApartmentType::NONE);
-}
-
-TEST(ScopedWinrtInitializer, ApartmentChangeCheck) {
-  if (GetVersion() < VERSION_WIN8)
-    return;
-
-  ScopedCOMInitializer com_initializer;
-  // ScopedCOMInitializer initialized an STA and the following should be a
-  // failed request for an MTA.
-  EXPECT_DCHECK_DEATH({ ScopedWinrtInitializer scoped_winrt_initializer; });
-}
-
-TEST(ScopedWinrtInitializer, VersionCheck) {
-  if (GetVersion() >= VERSION_WIN8)
-    return;
-
-  // ScopedWinrtInitializer is unsupported on versions prior to Windows 8.
-  EXPECT_DCHECK_DEATH({ ScopedWinrtInitializer scoped_winrt_initializer; });
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/shortcut_unittest.cc b/base/win/shortcut_unittest.cc
deleted file mode 100644
index 3c1c26f..0000000
--- a/base/win/shortcut_unittest.cc
+++ /dev/null
@@ -1,330 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/shortcut.h"
-
-#include <stdint.h>
-
-#include <string>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/macros.h"
-#include "base/test/test_file_util.h"
-#include "base/test/test_shortcut_win.h"
-#include "base/win/scoped_com_initializer.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-static const char kFileContents[] = "This is a target.";
-static const char kFileContents2[] = "This is another target.";
-
-class ShortcutTest : public testing::Test {
- protected:
-  void SetUp() override {
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-    ASSERT_TRUE(temp_dir_2_.CreateUniqueTempDir());
-
-    link_file_ = temp_dir_.GetPath().Append(L"My Link.lnk");
-
-    // Shortcut 1's properties
-    {
-      const FilePath target_file(temp_dir_.GetPath().Append(L"Target 1.txt"));
-      WriteFile(target_file, kFileContents, arraysize(kFileContents));
-
-      link_properties_.set_target(target_file);
-      link_properties_.set_working_dir(temp_dir_.GetPath());
-      link_properties_.set_arguments(L"--magic --awesome");
-      link_properties_.set_description(L"Chrome is awesome.");
-      link_properties_.set_icon(link_properties_.target, 4);
-      link_properties_.set_app_id(L"Chrome");
-      link_properties_.set_dual_mode(false);
-
-      // The CLSID below was randomly selected.
-      static constexpr CLSID toast_activator_clsid = {
-          0x08d401c2,
-          0x3f79,
-          0x41d8,
-          {0x89, 0xd0, 0x99, 0x25, 0xee, 0x16, 0x28, 0x63}};
-      link_properties_.set_toast_activator_clsid(toast_activator_clsid);
-    }
-
-    // Shortcut 2's properties (all different from properties of shortcut 1).
-    {
-      const FilePath target_file_2(temp_dir_.GetPath().Append(L"Target 2.txt"));
-      WriteFile(target_file_2, kFileContents2, arraysize(kFileContents2));
-
-      FilePath icon_path_2;
-      CreateTemporaryFileInDir(temp_dir_.GetPath(), &icon_path_2);
-
-      link_properties_2_.set_target(target_file_2);
-      link_properties_2_.set_working_dir(temp_dir_2_.GetPath());
-      link_properties_2_.set_arguments(L"--super --crazy");
-      link_properties_2_.set_description(L"The best in the west.");
-      link_properties_2_.set_icon(icon_path_2, 0);
-      link_properties_2_.set_app_id(L"Chrome.UserLevelCrazySuffix");
-      link_properties_2_.set_dual_mode(true);
-      link_properties_2_.set_toast_activator_clsid(CLSID_NULL);
-    }
-  }
-
-  ScopedCOMInitializer com_initializer_;
-  ScopedTempDir temp_dir_;
-  ScopedTempDir temp_dir_2_;
-
-  // The link file to be created/updated in the shortcut tests below.
-  FilePath link_file_;
-
-  // Properties for the created shortcut.
-  ShortcutProperties link_properties_;
-
-  // Properties for the updated shortcut.
-  ShortcutProperties link_properties_2_;
-};
-
-}  // namespace
-
-TEST_F(ShortcutTest, CreateAndResolveShortcutProperties) {
-  // Test all properties.
-  FilePath file_1(temp_dir_.GetPath().Append(L"Link1.lnk"));
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      file_1, link_properties_, SHORTCUT_CREATE_ALWAYS));
-
-  ShortcutProperties properties_read_1;
-  ASSERT_TRUE(ResolveShortcutProperties(
-      file_1, ShortcutProperties::PROPERTIES_ALL, &properties_read_1));
-  EXPECT_EQ(static_cast<unsigned>(ShortcutProperties::PROPERTIES_ALL),
-            properties_read_1.options);
-  ValidatePathsAreEqual(link_properties_.target, properties_read_1.target);
-  ValidatePathsAreEqual(link_properties_.working_dir,
-                        properties_read_1.working_dir);
-  EXPECT_EQ(link_properties_.arguments, properties_read_1.arguments);
-  EXPECT_EQ(link_properties_.description, properties_read_1.description);
-  ValidatePathsAreEqual(link_properties_.icon, properties_read_1.icon);
-  EXPECT_EQ(link_properties_.icon_index, properties_read_1.icon_index);
-  EXPECT_EQ(link_properties_.app_id, properties_read_1.app_id);
-  EXPECT_EQ(link_properties_.dual_mode, properties_read_1.dual_mode);
-  EXPECT_EQ(link_properties_.toast_activator_clsid,
-            properties_read_1.toast_activator_clsid);
-
-  // Test simple shortcut with no special properties set.
-  FilePath file_2(temp_dir_.GetPath().Append(L"Link2.lnk"));
-  ShortcutProperties only_target_properties;
-  only_target_properties.set_target(link_properties_.target);
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      file_2, only_target_properties, SHORTCUT_CREATE_ALWAYS));
-
-  ShortcutProperties properties_read_2;
-  ASSERT_TRUE(ResolveShortcutProperties(
-      file_2, ShortcutProperties::PROPERTIES_ALL, &properties_read_2));
-  EXPECT_EQ(static_cast<unsigned>(ShortcutProperties::PROPERTIES_ALL),
-            properties_read_2.options);
-  ValidatePathsAreEqual(only_target_properties.target,
-                        properties_read_2.target);
-  ValidatePathsAreEqual(FilePath(), properties_read_2.working_dir);
-  EXPECT_EQ(L"", properties_read_2.arguments);
-  EXPECT_EQ(L"", properties_read_2.description);
-  ValidatePathsAreEqual(FilePath(), properties_read_2.icon);
-  EXPECT_EQ(0, properties_read_2.icon_index);
-  EXPECT_EQ(L"", properties_read_2.app_id);
-  EXPECT_FALSE(properties_read_2.dual_mode);
-  EXPECT_EQ(CLSID_NULL, properties_read_2.toast_activator_clsid);
-}
-
-TEST_F(ShortcutTest, CreateAndResolveShortcut) {
-  ShortcutProperties only_target_properties;
-  only_target_properties.set_target(link_properties_.target);
-
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, only_target_properties, SHORTCUT_CREATE_ALWAYS));
-
-  FilePath resolved_name;
-  EXPECT_TRUE(ResolveShortcut(link_file_, &resolved_name, NULL));
-
-  char read_contents[arraysize(kFileContents)];
-  base::ReadFile(resolved_name, read_contents, arraysize(read_contents));
-  EXPECT_STREQ(kFileContents, read_contents);
-}
-
-TEST_F(ShortcutTest, ResolveShortcutWithArgs) {
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_, SHORTCUT_CREATE_ALWAYS));
-
-  FilePath resolved_name;
-  string16 args;
-  EXPECT_TRUE(ResolveShortcut(link_file_, &resolved_name, &args));
-
-  char read_contents[arraysize(kFileContents)];
-  base::ReadFile(resolved_name, read_contents, arraysize(read_contents));
-  EXPECT_STREQ(kFileContents, read_contents);
-  EXPECT_EQ(link_properties_.arguments, args);
-}
-
-TEST_F(ShortcutTest, CreateShortcutWithOnlySomeProperties) {
-  ShortcutProperties target_and_args_properties;
-  target_and_args_properties.set_target(link_properties_.target);
-  target_and_args_properties.set_arguments(link_properties_.arguments);
-
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, target_and_args_properties,
-      SHORTCUT_CREATE_ALWAYS));
-
-  ValidateShortcut(link_file_, target_and_args_properties);
-}
-
-TEST_F(ShortcutTest, CreateShortcutVerifyProperties) {
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_, SHORTCUT_CREATE_ALWAYS));
-
-  ValidateShortcut(link_file_, link_properties_);
-}
-
-TEST_F(ShortcutTest, UpdateShortcutVerifyProperties) {
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_, SHORTCUT_CREATE_ALWAYS));
-
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_2_, SHORTCUT_UPDATE_EXISTING));
-
-  ValidateShortcut(link_file_, link_properties_2_);
-}
-
-TEST_F(ShortcutTest, UpdateShortcutUpdateOnlyTargetAndResolve) {
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_, SHORTCUT_CREATE_ALWAYS));
-
-  ShortcutProperties update_only_target_properties;
-  update_only_target_properties.set_target(link_properties_2_.target);
-
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, update_only_target_properties,
-      SHORTCUT_UPDATE_EXISTING));
-
-  ShortcutProperties expected_properties = link_properties_;
-  expected_properties.set_target(link_properties_2_.target);
-  ValidateShortcut(link_file_, expected_properties);
-
-  FilePath resolved_name;
-  EXPECT_TRUE(ResolveShortcut(link_file_, &resolved_name, NULL));
-
-  char read_contents[arraysize(kFileContents2)];
-  base::ReadFile(resolved_name, read_contents, arraysize(read_contents));
-  EXPECT_STREQ(kFileContents2, read_contents);
-}
-
-TEST_F(ShortcutTest, UpdateShortcutMakeDualMode) {
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_, SHORTCUT_CREATE_ALWAYS));
-
-  ShortcutProperties make_dual_mode_properties;
-  make_dual_mode_properties.set_dual_mode(true);
-
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, make_dual_mode_properties,
-      SHORTCUT_UPDATE_EXISTING));
-
-  ShortcutProperties expected_properties = link_properties_;
-  expected_properties.set_dual_mode(true);
-  ValidateShortcut(link_file_, expected_properties);
-}
-
-TEST_F(ShortcutTest, UpdateShortcutRemoveDualMode) {
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_2_, SHORTCUT_CREATE_ALWAYS));
-
-  ShortcutProperties remove_dual_mode_properties;
-  remove_dual_mode_properties.set_dual_mode(false);
-
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, remove_dual_mode_properties,
-      SHORTCUT_UPDATE_EXISTING));
-
-  ShortcutProperties expected_properties = link_properties_2_;
-  expected_properties.set_dual_mode(false);
-  ValidateShortcut(link_file_, expected_properties);
-}
-
-TEST_F(ShortcutTest, UpdateShortcutClearArguments) {
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_, SHORTCUT_CREATE_ALWAYS));
-
-  ShortcutProperties clear_arguments_properties;
-  clear_arguments_properties.set_arguments(string16());
-
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, clear_arguments_properties,
-      SHORTCUT_UPDATE_EXISTING));
-
-  ShortcutProperties expected_properties = link_properties_;
-  expected_properties.set_arguments(string16());
-  ValidateShortcut(link_file_, expected_properties);
-}
-
-TEST_F(ShortcutTest, FailUpdateShortcutThatDoesNotExist) {
-  ASSERT_FALSE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_, SHORTCUT_UPDATE_EXISTING));
-  ASSERT_FALSE(PathExists(link_file_));
-}
-
-TEST_F(ShortcutTest, ReplaceShortcutAllProperties) {
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_, SHORTCUT_CREATE_ALWAYS));
-
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_2_, SHORTCUT_REPLACE_EXISTING));
-
-  ValidateShortcut(link_file_, link_properties_2_);
-}
-
-TEST_F(ShortcutTest, ReplaceShortcutSomeProperties) {
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_, SHORTCUT_CREATE_ALWAYS));
-
-  ShortcutProperties new_properties;
-  new_properties.set_target(link_properties_2_.target);
-  new_properties.set_arguments(link_properties_2_.arguments);
-  new_properties.set_description(link_properties_2_.description);
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, new_properties, SHORTCUT_REPLACE_EXISTING));
-
-  // Expect only properties in |new_properties| to be set, all other properties
-  // should have been overwritten.
-  ShortcutProperties expected_properties(new_properties);
-  expected_properties.set_working_dir(FilePath());
-  expected_properties.set_icon(FilePath(), 0);
-  expected_properties.set_app_id(string16());
-  expected_properties.set_dual_mode(false);
-  ValidateShortcut(link_file_, expected_properties);
-}
-
-TEST_F(ShortcutTest, FailReplaceShortcutThatDoesNotExist) {
-  ASSERT_FALSE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_, SHORTCUT_REPLACE_EXISTING));
-  ASSERT_FALSE(PathExists(link_file_));
-}
-
-// Test that the old arguments remain on the replaced shortcut when not
-// otherwise specified.
-TEST_F(ShortcutTest, ReplaceShortcutKeepOldArguments) {
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_, SHORTCUT_CREATE_ALWAYS));
-
-  // Do not explicitly set the arguments.
-  link_properties_2_.options &=
-      ~ShortcutProperties::PROPERTIES_ARGUMENTS;
-  ASSERT_TRUE(CreateOrUpdateShortcutLink(
-      link_file_, link_properties_2_, SHORTCUT_REPLACE_EXISTING));
-
-  ShortcutProperties expected_properties(link_properties_2_);
-  expected_properties.set_arguments(link_properties_.arguments);
-  ValidateShortcut(link_file_, expected_properties);
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/startup_information_unittest.cc b/base/win/startup_information_unittest.cc
deleted file mode 100644
index f5d1f37..0000000
--- a/base/win/startup_information_unittest.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <windows.h>
-#include <stddef.h>
-
-#include <string>
-
-#include "base/command_line.h"
-#include "base/test/multiprocess_test.h"
-#include "base/win/scoped_handle.h"
-#include "base/win/scoped_process_information.h"
-#include "base/win/startup_information.h"
-#include "testing/multiprocess_func_list.h"
-
-const wchar_t kSectionName[] = L"EventTestSection";
-const size_t kSectionSize = 4096;
-
-MULTIPROCESS_TEST_MAIN(FireInheritedEvents) {
-  HANDLE section = ::OpenFileMappingW(PAGE_READWRITE, false, kSectionName);
-  HANDLE* events = reinterpret_cast<HANDLE*>(::MapViewOfFile(section,
-      PAGE_READWRITE, 0, 0, kSectionSize));
-  // This event should not be valid because it wasn't explicitly inherited.
-  if (::SetEvent(events[1]))
-    return -1;
-  // This event should be valid because it was explicitly inherited.
-  if (!::SetEvent(events[0]))
-    return -1;
-
-  return 0;
-}
-
-class StartupInformationTest : public base::MultiProcessTest {};
-
-// Verify that only the explicitly specified event is inherited.
-TEST_F(StartupInformationTest, InheritStdOut) {
-  base::win::StartupInformation startup_info;
-
-  HANDLE section = ::CreateFileMappingW(INVALID_HANDLE_VALUE, NULL,
-                                        PAGE_READWRITE, 0, kSectionSize,
-                                        kSectionName);
-  ASSERT_TRUE(section);
-
-  HANDLE* events = reinterpret_cast<HANDLE*>(::MapViewOfFile(section,
-      FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, kSectionSize));
-
-  // Make two inheritable events.
-  SECURITY_ATTRIBUTES security_attributes = { sizeof(security_attributes),
-                                              NULL, true };
-  events[0] = ::CreateEvent(&security_attributes, false, false, NULL);
-  ASSERT_TRUE(events[0]);
-  events[1] = ::CreateEvent(&security_attributes, false, false, NULL);
-  ASSERT_TRUE(events[1]);
-
-  ASSERT_TRUE(startup_info.InitializeProcThreadAttributeList(1));
-  ASSERT_TRUE(startup_info.UpdateProcThreadAttribute(
-      PROC_THREAD_ATTRIBUTE_HANDLE_LIST, &events[0],
-      sizeof(events[0])));
-
-  std::wstring cmd_line =
-      MakeCmdLine("FireInheritedEvents").GetCommandLineString();
-
-  PROCESS_INFORMATION temp_process_info = {};
-  ASSERT_TRUE(::CreateProcess(NULL, &cmd_line[0],
-                              NULL, NULL, true, EXTENDED_STARTUPINFO_PRESENT,
-                              NULL, NULL, startup_info.startup_info(),
-                              &temp_process_info)) << ::GetLastError();
-  base::win::ScopedProcessInformation process_info(temp_process_info);
-
-  // Only the first event should be signalled
-  EXPECT_EQ(WAIT_OBJECT_0, ::WaitForMultipleObjects(2, events, false,
-                                                    4000));
-}
-
diff --git a/base/win/typed_event_handler_unittest.cc b/base/win/typed_event_handler_unittest.cc
deleted file mode 100644
index 76dba80..0000000
--- a/base/win/typed_event_handler_unittest.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/typed_event_handler.h"
-
-#include <windows.foundation.h>
-
-#include "base/test/bind_test_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-TEST(TypedEventHandlerTest, InvokeSuccess) {
-  bool called_callback = false;
-  TypedEventHandler<IInspectable*, IInspectable*> handler(
-      base::BindLambdaForTesting([&](IInspectable* sender, IInspectable* args) {
-        EXPECT_EQ(reinterpret_cast<IInspectable*>(0x01), sender);
-        EXPECT_EQ(reinterpret_cast<IInspectable*>(0x02), args);
-        called_callback = true;
-        return S_OK;
-      }));
-
-  EXPECT_FALSE(called_callback);
-  HRESULT hr = handler.Invoke(reinterpret_cast<IInspectable*>(0x01),
-                              reinterpret_cast<IInspectable*>(0x02));
-  EXPECT_TRUE(called_callback);
-  EXPECT_EQ(S_OK, hr);
-}
-
-TEST(TypedEventHandlerTest, InvokeFail) {
-  bool called_callback = false;
-  TypedEventHandler<IInspectable*, IInspectable*> handler(
-      base::BindLambdaForTesting([&](IInspectable* sender, IInspectable* args) {
-        EXPECT_EQ(nullptr, sender);
-        EXPECT_EQ(nullptr, args);
-        called_callback = true;
-        return E_FAIL;
-      }));
-
-  EXPECT_FALSE(called_callback);
-  HRESULT hr = handler.Invoke(nullptr, nullptr);
-  EXPECT_TRUE(called_callback);
-  EXPECT_EQ(E_FAIL, hr);
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/wait_chain_unittest.cc b/base/win/wait_chain_unittest.cc
deleted file mode 100644
index 74a0ce5..0000000
--- a/base/win/wait_chain_unittest.cc
+++ /dev/null
@@ -1,317 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/wait_chain.h"
-
-#include <memory>
-#include <string>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/command_line.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
-#include "base/test/multiprocess_test.h"
-#include "base/threading/simple_thread.h"
-#include "base/win/win_util.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-// Appends |handle| as a command line switch.
-void AppendSwitchHandle(CommandLine* command_line,
-                        StringPiece switch_name,
-                        HANDLE handle) {
-  command_line->AppendSwitchASCII(switch_name.as_string(),
-                                  UintToString(HandleToUint32(handle)));
-}
-
-// Retrieves the |handle| associated to |switch_name| from the command line.
-ScopedHandle GetSwitchValueHandle(CommandLine* command_line,
-                                  StringPiece switch_name) {
-  std::string switch_string =
-      command_line->GetSwitchValueASCII(switch_name.as_string());
-  unsigned int switch_uint = 0;
-  if (switch_string.empty() || !StringToUint(switch_string, &switch_uint)) {
-    DLOG(ERROR) << "Missing or invalid " << switch_name << " argument.";
-    return ScopedHandle();
-  }
-  return ScopedHandle(reinterpret_cast<HANDLE>(switch_uint));
-}
-
-// Helper function to create a mutex.
-ScopedHandle CreateMutex(bool inheritable) {
-  SECURITY_ATTRIBUTES security_attributes = {sizeof(SECURITY_ATTRIBUTES),
-                                             nullptr, inheritable};
-  return ScopedHandle(::CreateMutex(&security_attributes, FALSE, NULL));
-}
-
-// Helper function to create an event.
-ScopedHandle CreateEvent(bool inheritable) {
-  SECURITY_ATTRIBUTES security_attributes = {sizeof(SECURITY_ATTRIBUTES),
-                                             nullptr, inheritable};
-  return ScopedHandle(
-      ::CreateEvent(&security_attributes, FALSE, FALSE, nullptr));
-}
-
-// Helper thread class that runs the callback then stops.
-class SingleTaskThread : public SimpleThread {
- public:
-  explicit SingleTaskThread(const Closure& task)
-      : SimpleThread("WaitChainTest SingleTaskThread"), task_(task) {}
-
-  void Run() override { task_.Run(); }
-
- private:
-  Closure task_;
-
-  DISALLOW_COPY_AND_ASSIGN(SingleTaskThread);
-};
-
-// Helper thread to cause a deadlock by acquiring 2 mutexes in a given order.
-class DeadlockThread : public SimpleThread {
- public:
-  DeadlockThread(HANDLE mutex_1, HANDLE mutex_2)
-      : SimpleThread("WaitChainTest DeadlockThread"),
-        wait_event_(CreateEvent(false)),
-        mutex_acquired_event_(CreateEvent(false)),
-        mutex_1_(mutex_1),
-        mutex_2_(mutex_2) {}
-
-  void Run() override {
-    // Acquire the mutex then signal the main thread.
-    EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(mutex_1_, INFINITE));
-    EXPECT_TRUE(::SetEvent(mutex_acquired_event_.Get()));
-
-    // Wait until both threads are holding their mutex before trying to acquire
-    // the other one.
-    EXPECT_EQ(WAIT_OBJECT_0,
-              ::WaitForSingleObject(wait_event_.Get(), INFINITE));
-
-    // To unblock the deadlock, one of the threads will get terminated (via
-    // TerminateThread()) without releasing the mutex. This causes the other
-    // thread to wake up with WAIT_ABANDONED.
-    EXPECT_EQ(WAIT_ABANDONED, ::WaitForSingleObject(mutex_2_, INFINITE));
-  }
-
-  // Blocks until a mutex is acquired.
-  void WaitForMutexAcquired() {
-    EXPECT_EQ(WAIT_OBJECT_0,
-              ::WaitForSingleObject(mutex_acquired_event_.Get(), INFINITE));
-  }
-
-  // Signal the thread to acquire the second mutex.
-  void SignalToAcquireMutex() { EXPECT_TRUE(::SetEvent(wait_event_.Get())); }
-
-  // Terminates the thread.
-  bool Terminate() {
-    ScopedHandle thread_handle(::OpenThread(THREAD_TERMINATE, FALSE, tid()));
-    return ::TerminateThread(thread_handle.Get(), 0);
-  }
-
- private:
-  ScopedHandle wait_event_;
-  ScopedHandle mutex_acquired_event_;
-
-  // The 2 mutex to acquire.
-  HANDLE mutex_1_;
-  HANDLE mutex_2_;
-
-  DISALLOW_COPY_AND_ASSIGN(DeadlockThread);
-};
-
-// Creates a thread that joins |thread_to_join| and then terminates when it
-// finishes execution.
-std::unique_ptr<SingleTaskThread> CreateJoiningThread(
-    SimpleThread* thread_to_join) {
-  std::unique_ptr<SingleTaskThread> thread(new SingleTaskThread(
-      Bind(&SimpleThread::Join, Unretained(thread_to_join))));
-  thread->Start();
-
-  return thread;
-}
-
-// Creates a thread that calls WaitForSingleObject() on the handle and then
-// terminates when it unblocks.
-std::unique_ptr<SingleTaskThread> CreateWaitingThread(HANDLE handle) {
-  std::unique_ptr<SingleTaskThread> thread(new SingleTaskThread(
-      Bind(IgnoreResult(&::WaitForSingleObject), handle, INFINITE)));
-  thread->Start();
-
-  return thread;
-}
-
-// Creates a thread that blocks on |mutex_2| after acquiring |mutex_1|.
-std::unique_ptr<DeadlockThread> CreateDeadlockThread(HANDLE mutex_1,
-                                                     HANDLE mutex_2) {
-  std::unique_ptr<DeadlockThread> thread(new DeadlockThread(mutex_1, mutex_2));
-  thread->Start();
-
-  // Wait until the first mutex is acquired before returning.
-  thread->WaitForMutexAcquired();
-
-  return thread;
-}
-
-// Child process to test the cross-process capability of the WCT api.
-// This process will simulate a hang while holding a mutex that the parent
-// process is waiting on.
-MULTIPROCESS_TEST_MAIN(WaitChainTestProc) {
-  CommandLine* command_line = CommandLine::ForCurrentProcess();
-
-  ScopedHandle mutex = GetSwitchValueHandle(command_line, "mutex");
-  CHECK(mutex.IsValid());
-
-  ScopedHandle sync_event(GetSwitchValueHandle(command_line, "sync_event"));
-  CHECK(sync_event.IsValid());
-
-  // Acquire mutex.
-  CHECK(::WaitForSingleObject(mutex.Get(), INFINITE) == WAIT_OBJECT_0);
-
-  // Signal back to the parent process that the mutex is hold.
-  CHECK(::SetEvent(sync_event.Get()));
-
-  // Wait on a signal from the parent process before terminating.
-  CHECK(::WaitForSingleObject(sync_event.Get(), INFINITE) == WAIT_OBJECT_0);
-
-  return 0;
-}
-
-// Start a child process and passes the |mutex| and the |sync_event| to the
-// command line.
-Process StartChildProcess(HANDLE mutex, HANDLE sync_event) {
-  CommandLine command_line = GetMultiProcessTestChildBaseCommandLine();
-
-  AppendSwitchHandle(&command_line, "mutex", mutex);
-  AppendSwitchHandle(&command_line, "sync_event", sync_event);
-
-  LaunchOptions options;
-  options.handles_to_inherit.push_back(mutex);
-  options.handles_to_inherit.push_back(sync_event);
-  return SpawnMultiProcessTestChild("WaitChainTestProc", command_line, options);
-}
-
-// Returns true if the |wait_chain| is an alternating sequence of thread objects
-// and synchronization objects.
-bool WaitChainStructureIsCorrect(const WaitChainNodeVector& wait_chain) {
-  // Checks thread objects.
-  for (size_t i = 0; i < wait_chain.size(); i += 2) {
-    if (wait_chain[i].ObjectType != WctThreadType)
-      return false;
-  }
-
-  // Check synchronization objects.
-  for (size_t i = 1; i < wait_chain.size(); i += 2) {
-    if (wait_chain[i].ObjectType == WctThreadType)
-      return false;
-  }
-  return true;
-}
-
-// Returns true if the |wait_chain| goes through more than 1 process.
-bool WaitChainIsCrossProcess(const WaitChainNodeVector& wait_chain) {
-  if (wait_chain.size() == 0)
-    return false;
-
-  // Just check that the process id changes somewhere in the chain.
-  // Note: ThreadObjects are every 2 nodes.
-  DWORD first_process = wait_chain[0].ThreadObject.ProcessId;
-  for (size_t i = 2; i < wait_chain.size(); i += 2) {
-    if (first_process != wait_chain[i].ThreadObject.ProcessId)
-      return true;
-  }
-  return false;
-}
-
-}  // namespace
-
-// Creates 2 threads that acquire their designated mutex and then try to
-// acquire each others' mutex to cause a deadlock.
-TEST(WaitChainTest, Deadlock) {
-  // 2 mutexes are needed to get a deadlock.
-  ScopedHandle mutex_1 = CreateMutex(false);
-  ASSERT_TRUE(mutex_1.IsValid());
-  ScopedHandle mutex_2 = CreateMutex(false);
-  ASSERT_TRUE(mutex_2.IsValid());
-
-  std::unique_ptr<DeadlockThread> deadlock_thread_1 =
-      CreateDeadlockThread(mutex_1.Get(), mutex_2.Get());
-  std::unique_ptr<DeadlockThread> deadlock_thread_2 =
-      CreateDeadlockThread(mutex_2.Get(), mutex_1.Get());
-
-  // Signal the threads to try to acquire the other mutex.
-  deadlock_thread_1->SignalToAcquireMutex();
-  deadlock_thread_2->SignalToAcquireMutex();
-  // Sleep to make sure the 2 threads got a chance to execute.
-  Sleep(10);
-
-  // Create a few waiting threads to get a longer wait chain.
-  std::unique_ptr<SingleTaskThread> waiting_thread_1 =
-      CreateJoiningThread(deadlock_thread_1.get());
-  std::unique_ptr<SingleTaskThread> waiting_thread_2 =
-      CreateJoiningThread(waiting_thread_1.get());
-
-  WaitChainNodeVector wait_chain;
-  bool is_deadlock;
-  ASSERT_TRUE(GetThreadWaitChain(waiting_thread_2->tid(), &wait_chain,
-                                 &is_deadlock, nullptr, nullptr));
-
-  EXPECT_EQ(9U, wait_chain.size());
-  EXPECT_TRUE(is_deadlock);
-  EXPECT_TRUE(WaitChainStructureIsCorrect(wait_chain));
-  EXPECT_FALSE(WaitChainIsCrossProcess(wait_chain));
-
-  ASSERT_TRUE(deadlock_thread_1->Terminate());
-
-  // The SimpleThread API expect Join() to be called before destruction.
-  deadlock_thread_2->Join();
-  waiting_thread_2->Join();
-}
-
-// Creates a child process that acquires a mutex and then blocks. A chain of
-// threads then blocks on that mutex.
-TEST(WaitChainTest, CrossProcess) {
-  ScopedHandle mutex = CreateMutex(true);
-  ASSERT_TRUE(mutex.IsValid());
-  ScopedHandle sync_event = CreateEvent(true);
-  ASSERT_TRUE(sync_event.IsValid());
-
-  Process child_process = StartChildProcess(mutex.Get(), sync_event.Get());
-  ASSERT_TRUE(child_process.IsValid());
-
-  // Wait for the child process to signal when it's holding the mutex.
-  EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(sync_event.Get(), INFINITE));
-
-  // Create a few waiting threads to get a longer wait chain.
-  std::unique_ptr<SingleTaskThread> waiting_thread_1 =
-      CreateWaitingThread(mutex.Get());
-  std::unique_ptr<SingleTaskThread> waiting_thread_2 =
-      CreateJoiningThread(waiting_thread_1.get());
-  std::unique_ptr<SingleTaskThread> waiting_thread_3 =
-      CreateJoiningThread(waiting_thread_2.get());
-
-  WaitChainNodeVector wait_chain;
-  bool is_deadlock;
-  ASSERT_TRUE(GetThreadWaitChain(waiting_thread_3->tid(), &wait_chain,
-                                 &is_deadlock, nullptr, nullptr));
-
-  EXPECT_EQ(7U, wait_chain.size());
-  EXPECT_FALSE(is_deadlock);
-  EXPECT_TRUE(WaitChainStructureIsCorrect(wait_chain));
-  EXPECT_TRUE(WaitChainIsCrossProcess(wait_chain));
-
-  // Unblock child process and wait for it to terminate.
-  ASSERT_TRUE(::SetEvent(sync_event.Get()));
-  ASSERT_TRUE(child_process.WaitForExit(nullptr));
-
-  // The SimpleThread API expect Join() to be called before destruction.
-  waiting_thread_3->Join();
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/win_includes_unittest.cc b/base/win/win_includes_unittest.cc
deleted file mode 100644
index 20c6cbc..0000000
--- a/base/win/win_includes_unittest.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// This file ensures that these header files don't include Windows.h and can
-// compile without including Windows.h. This helps to improve compile times.
-
-#include "base/atomicops.h"
-#include "base/files/file_util.h"
-#include "base/files/platform_file.h"
-#include "base/process/process_handle.h"
-#include "base/synchronization/condition_variable.h"
-#include "base/synchronization/lock.h"
-#include "base/threading/platform_thread.h"
-#include "base/threading/thread_local_storage.h"
-#include "base/win/registry.h"
-#include "base/win/scoped_handle.h"
-#include "base/win/win_util.h"
-
-#ifdef _WINDOWS_
-#error Windows.h was included inappropriately.
-#endif
-
-// Make sure windows.h can be included after windows_types.h
-#include "base/win/windows_types.h"
-
-#include <windows.h>
-
-// Check that type sizes match.
-static_assert(sizeof(CHROME_CONDITION_VARIABLE) == sizeof(CONDITION_VARIABLE),
-              "Definition mismatch.");
-static_assert(sizeof(CHROME_SRWLOCK) == sizeof(SRWLOCK),
-              "Definition mismatch.");
diff --git a/base/win/win_util_unittest.cc b/base/win/win_util_unittest.cc
deleted file mode 100644
index 6d5cf61..0000000
--- a/base/win/win_util_unittest.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/win_util.h"
-
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/scoped_native_library.h"
-#include "base/stl_util.h"
-#include "base/win/win_client_metrics.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-namespace {
-
-// Saves the current thread's locale ID when initialized, and restores it when
-// the instance is going out of scope.
-class ThreadLocaleSaver {
- public:
-  ThreadLocaleSaver() : original_locale_id_(GetThreadLocale()) {}
-  ~ThreadLocaleSaver() { SetThreadLocale(original_locale_id_); }
-
- private:
-  LCID original_locale_id_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadLocaleSaver);
-};
-
-}  // namespace
-
-// The test is somewhat silly, because some bots some have UAC enabled and some
-// have it disabled. At least we check that it does not crash.
-TEST(BaseWinUtilTest, TestIsUACEnabled) {
-  UserAccountControlIsEnabled();
-}
-
-TEST(BaseWinUtilTest, TestGetUserSidString) {
-  std::wstring user_sid;
-  EXPECT_TRUE(GetUserSidString(&user_sid));
-  EXPECT_TRUE(!user_sid.empty());
-}
-
-TEST(BaseWinUtilTest, TestGetNonClientMetrics) {
-  NONCLIENTMETRICS_XP metrics = {0};
-  GetNonClientMetrics(&metrics);
-  EXPECT_GT(metrics.cbSize, 0u);
-  EXPECT_GT(metrics.iScrollWidth, 0);
-  EXPECT_GT(metrics.iScrollHeight, 0);
-}
-
-TEST(BaseWinUtilTest, TestGetLoadedModulesSnapshot) {
-  std::vector<HMODULE> snapshot;
-
-  ASSERT_TRUE(GetLoadedModulesSnapshot(::GetCurrentProcess(), &snapshot));
-  size_t original_snapshot_size = snapshot.size();
-  ASSERT_GT(original_snapshot_size, 0u);
-  snapshot.clear();
-
-  // Load in a new module. Pick msvidc32.dll as it is present from WinXP to
-  // Win10 and yet rarely used.
-  const wchar_t dll_name[] = L"msvidc32.dll";
-  ASSERT_EQ(NULL, ::GetModuleHandle(dll_name));
-
-  base::ScopedNativeLibrary new_dll((base::FilePath(dll_name)));
-  ASSERT_NE(static_cast<HMODULE>(NULL), new_dll.get());
-  ASSERT_TRUE(GetLoadedModulesSnapshot(::GetCurrentProcess(), &snapshot));
-  ASSERT_GT(snapshot.size(), original_snapshot_size);
-  ASSERT_TRUE(base::ContainsValue(snapshot, new_dll.get()));
-}
-
-TEST(BaseWinUtilTest, TestUint32ToInvalidHandle) {
-  // Ensure that INVALID_HANDLE_VALUE is preserved when going to a 32-bit value
-  // and back on 64-bit platforms.
-  uint32_t invalid_handle = base::win::HandleToUint32(INVALID_HANDLE_VALUE);
-  EXPECT_EQ(INVALID_HANDLE_VALUE, base::win::Uint32ToHandle(invalid_handle));
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/windows_version_unittest.cc b/base/win/windows_version_unittest.cc
deleted file mode 100644
index f0d6d96..0000000
--- a/base/win/windows_version_unittest.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/windows_version.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-namespace {
-
-TEST(WindowsVersion, GetVersionExAndKernelVersionMatch) {
-  // If this fails, we're running in compatibility mode, or need to update the
-  // application manifest.
-  EXPECT_EQ(OSInfo::GetInstance()->version(),
-            OSInfo::GetInstance()->Kernel32Version());
-}
-
-}  // namespace
-}  // namespace win
-}  // namespace base
diff --git a/base/win/winrt_storage_util_unittest.cc b/base/win/winrt_storage_util_unittest.cc
deleted file mode 100644
index 530ab23..0000000
--- a/base/win/winrt_storage_util_unittest.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/winrt_storage_util.h"
-
-#include <string.h>
-#include <wrl/client.h>
-
-#include "base/strings/string_util.h"
-#include "base/win/core_winrt_util.h"
-#include "base/win/scoped_com_initializer.h"
-#include "base/win/scoped_hstring.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-TEST(WinrtStorageUtilTest, CreateBufferFromData) {
-  ScopedCOMInitializer com_initializer(ScopedCOMInitializer::kMTA);
-
-  if (!ResolveCoreWinRTDelayload() ||
-      !ScopedHString::ResolveCoreWinRTStringDelayload()) {
-    return;
-  }
-
-  const std::vector<uint8_t> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
-  Microsoft::WRL::ComPtr<ABI::Windows::Storage::Streams::IBuffer> buffer;
-  ASSERT_HRESULT_SUCCEEDED(
-      CreateIBufferFromData(data.data(), data.size(), &buffer));
-
-  uint8_t* p_buffer_data;
-  uint32_t length;
-  ASSERT_HRESULT_SUCCEEDED(
-      GetPointerToBufferData(buffer.Get(), &p_buffer_data, &length));
-
-  ASSERT_EQ(data.size(), length);
-  EXPECT_EQ(0, memcmp(p_buffer_data, data.data(), data.size()));
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/win/wrapped_window_proc_unittest.cc b/base/win/wrapped_window_proc_unittest.cc
deleted file mode 100644
index 25ba2d4..0000000
--- a/base/win/wrapped_window_proc_unittest.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/win/wrapped_window_proc.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-
-DWORD kExceptionCode = 12345;
-WPARAM kCrashMsg = 98765;
-
-// A trivial WindowProc that generates an exception.
-LRESULT CALLBACK TestWindowProc(HWND hwnd, UINT message,
-                                WPARAM wparam, LPARAM lparam) {
-  if (message == kCrashMsg)
-    RaiseException(kExceptionCode, 0, 0, NULL);
-  return DefWindowProc(hwnd, message, wparam, lparam);
-}
-
-// This class implements an exception filter that can be queried about a past
-// exception.
-class TestWrappedExceptionFiter {
- public:
-  TestWrappedExceptionFiter() : called_(false) {
-    EXPECT_FALSE(s_filter_);
-    s_filter_ = this;
-  }
-
-  ~TestWrappedExceptionFiter() {
-    EXPECT_EQ(s_filter_, this);
-    s_filter_ = NULL;
-  }
-
-  bool called() {
-    return called_;
-  }
-
-  // The actual exception filter just records the exception.
-  static int Filter(EXCEPTION_POINTERS* info) {
-    EXPECT_FALSE(s_filter_->called_);
-    if (info->ExceptionRecord->ExceptionCode == kExceptionCode)
-      s_filter_->called_ = true;
-    return EXCEPTION_EXECUTE_HANDLER;
-  }
-
- private:
-  bool called_;
-  static TestWrappedExceptionFiter* s_filter_;
-};
-TestWrappedExceptionFiter* TestWrappedExceptionFiter::s_filter_ = NULL;
-
-}  // namespace.
-
-TEST(WrappedWindowProc, CatchesExceptions) {
-  HINSTANCE hinst = GetModuleHandle(NULL);
-  std::wstring class_name(L"TestClass");
-
-  WNDCLASS wc = {0};
-  wc.lpfnWndProc = base::win::WrappedWindowProc<TestWindowProc>;
-  wc.hInstance = hinst;
-  wc.lpszClassName = class_name.c_str();
-  RegisterClass(&wc);
-
-  HWND window = CreateWindow(class_name.c_str(), 0, 0, 0, 0, 0, 0, HWND_MESSAGE,
-                             0, hinst, 0);
-  ASSERT_TRUE(window);
-
-  // Before generating the exception we make sure that the filter will see it.
-  TestWrappedExceptionFiter wrapper;
-  base::win::WinProcExceptionFilter old_filter =
-      base::win::SetWinProcExceptionFilter(TestWrappedExceptionFiter::Filter);
-
-  SendMessage(window, kCrashMsg, 0, 0);
-  EXPECT_TRUE(wrapper.called());
-
-  base::win::SetWinProcExceptionFilter(old_filter);
-}
