diff --git a/base/test/DEPS b/base/test/DEPS
deleted file mode 100644
index 5827c26..0000000
--- a/base/test/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+third_party/libxml",
-]
diff --git a/base/test/OWNERS b/base/test/OWNERS
deleted file mode 100644
index 6807748..0000000
--- a/base/test/OWNERS
+++ /dev/null
@@ -1,16 +0,0 @@
-per-file *task_scheduler*=file://base/task_scheduler/OWNERS
-
-# Metrics-related test utilites:
-per-file *histogram_tester*=file://base/metrics/OWNERS
-per-file *scoped_feature_list*=file://base/metrics/OWNERS
-per-file *user_action_tester*=file://base/metrics/OWNERS
-
-# Tracing test utilities:
-per-file trace_*=file://base/trace_event/OWNERS
-
-# For Android-specific changes:
-per-file *android*=file://base/test/android/OWNERS
-per-file BUILD.gn=file://base/test/android/OWNERS
-
-# Linux fontconfig changes
-per-file *fontconfig*=file://base/nix/OWNERS
diff --git a/base/test/bind_test_util.h b/base/test/bind_test_util.h
deleted file mode 100644
index 0dfcb46..0000000
--- a/base/test/bind_test_util.h
+++ /dev/null
@@ -1,36 +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.
-
-#ifndef BASE_TEST_BIND_TEST_UTIL_H_
-#define BASE_TEST_BIND_TEST_UTIL_H_
-
-#include "base/bind.h"
-
-namespace base {
-namespace internal {
-
-template <typename F, typename Signature>
-struct BindLambdaHelper;
-
-template <typename F, typename R, typename... Args>
-struct BindLambdaHelper<F, R(Args...)> {
-  static R Run(const std::decay_t<F>& f, Args... args) {
-    return f(std::forward<Args>(args)...);
-  }
-};
-
-}  // namespace internal
-
-// A variant of Bind() that can bind capturing lambdas for testing.
-// This doesn't support extra arguments binding as the lambda itself can do.
-template <typename F>
-decltype(auto) BindLambdaForTesting(F&& f) {
-  using Signature = internal::ExtractCallableRunType<std::decay_t<F>>;
-  return BindRepeating(&internal::BindLambdaHelper<F, Signature>::Run,
-                       std::forward<F>(f));
-}
-
-}  // namespace base
-
-#endif  // BASE_TEST_BIND_TEST_UTIL_H_
diff --git a/base/test/copy_only_int.h b/base/test/copy_only_int.h
deleted file mode 100644
index 4e482c9..0000000
--- a/base/test/copy_only_int.h
+++ /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.
-
-#ifndef BASE_TEST_COPY_ONLY_INT_H_
-#define BASE_TEST_COPY_ONLY_INT_H_
-
-#include "base/macros.h"
-
-namespace base {
-
-// A copy-only (not moveable) class that holds an integer. This is designed for
-// testing containers. See also MoveOnlyInt.
-class CopyOnlyInt {
- public:
-  explicit CopyOnlyInt(int data = 1) : data_(data) {}
-  CopyOnlyInt(const CopyOnlyInt& other) = default;
-  ~CopyOnlyInt() { data_ = 0; }
-
-  friend bool operator==(const CopyOnlyInt& lhs, const CopyOnlyInt& rhs) {
-    return lhs.data_ == rhs.data_;
-  }
-
-  friend bool operator!=(const CopyOnlyInt& lhs, const CopyOnlyInt& rhs) {
-    return !operator==(lhs, rhs);
-  }
-
-  friend bool operator<(const CopyOnlyInt& lhs, const CopyOnlyInt& rhs) {
-    return lhs.data_ < rhs.data_;
-  }
-
-  friend bool operator>(const CopyOnlyInt& lhs, const CopyOnlyInt& rhs) {
-    return rhs < lhs;
-  }
-
-  friend bool operator<=(const CopyOnlyInt& lhs, const CopyOnlyInt& rhs) {
-    return !(rhs < lhs);
-  }
-
-  friend bool operator>=(const CopyOnlyInt& lhs, const CopyOnlyInt& rhs) {
-    return !(lhs < rhs);
-  }
-
-  int data() const { return data_; }
-
- private:
-  volatile int data_;
-
-  CopyOnlyInt(CopyOnlyInt&&) = delete;
-  CopyOnlyInt& operator=(CopyOnlyInt&) = delete;
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_COPY_ONLY_INT_H_
diff --git a/base/test/data/file_util/binary_file.bin b/base/test/data/file_util/binary_file.bin
deleted file mode 100644
index f53cc82..0000000
--- a/base/test/data/file_util/binary_file.bin
+++ /dev/null
Binary files differ
diff --git a/base/test/data/file_util/binary_file_diff.bin b/base/test/data/file_util/binary_file_diff.bin
deleted file mode 100644
index 103b26d..0000000
--- a/base/test/data/file_util/binary_file_diff.bin
+++ /dev/null
Binary files differ
diff --git a/base/test/data/file_util/binary_file_same.bin b/base/test/data/file_util/binary_file_same.bin
deleted file mode 100644
index f53cc82..0000000
--- a/base/test/data/file_util/binary_file_same.bin
+++ /dev/null
Binary files differ
diff --git a/base/test/data/file_util/blank_line.txt b/base/test/data/file_util/blank_line.txt
deleted file mode 100644
index 8892069..0000000
--- a/base/test/data/file_util/blank_line.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-The next line is blank.
-
-But this one isn't.
diff --git a/base/test/data/file_util/blank_line_crlf.txt b/base/test/data/file_util/blank_line_crlf.txt
deleted file mode 100644
index 3aefe52..0000000
--- a/base/test/data/file_util/blank_line_crlf.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-The next line is blank.
-
-But this one isn't.
diff --git a/base/test/data/file_util/crlf.txt b/base/test/data/file_util/crlf.txt
deleted file mode 100644
index 0e62728..0000000
--- a/base/test/data/file_util/crlf.txt
+++ /dev/null
@@ -1 +0,0 @@
-This file is the same.
diff --git a/base/test/data/file_util/different.txt b/base/test/data/file_util/different.txt
deleted file mode 100644
index 5b9f9c4..0000000
--- a/base/test/data/file_util/different.txt
+++ /dev/null
@@ -1 +0,0 @@
-This file is different.
diff --git a/base/test/data/file_util/different_first.txt b/base/test/data/file_util/different_first.txt
deleted file mode 100644
index 8661d66..0000000
--- a/base/test/data/file_util/different_first.txt
+++ /dev/null
@@ -1 +0,0 @@
-this file is the same.
diff --git a/base/test/data/file_util/different_last.txt b/base/test/data/file_util/different_last.txt
deleted file mode 100644
index e8b3e5a..0000000
--- a/base/test/data/file_util/different_last.txt
+++ /dev/null
@@ -1 +0,0 @@
-This file is the same. 
\ No newline at end of file
diff --git a/base/test/data/file_util/empty1.txt b/base/test/data/file_util/empty1.txt
deleted file mode 100644
index e69de29..0000000
--- a/base/test/data/file_util/empty1.txt
+++ /dev/null
diff --git a/base/test/data/file_util/empty2.txt b/base/test/data/file_util/empty2.txt
deleted file mode 100644
index e69de29..0000000
--- a/base/test/data/file_util/empty2.txt
+++ /dev/null
diff --git a/base/test/data/file_util/first1.txt b/base/test/data/file_util/first1.txt
deleted file mode 100644
index 2c6e300..0000000
--- a/base/test/data/file_util/first1.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-The first line is the same.
-The second line is different.
diff --git a/base/test/data/file_util/first2.txt b/base/test/data/file_util/first2.txt
deleted file mode 100644
index e39b5ec..0000000
--- a/base/test/data/file_util/first2.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-The first line is the same.
-The second line is not.
diff --git a/base/test/data/file_util/original.txt b/base/test/data/file_util/original.txt
deleted file mode 100644
index 4422f57..0000000
--- a/base/test/data/file_util/original.txt
+++ /dev/null
@@ -1 +0,0 @@
-This file is the same.
diff --git a/base/test/data/file_util/red.png b/base/test/data/file_util/red.png
deleted file mode 100644
index 0806141..0000000
--- a/base/test/data/file_util/red.png
+++ /dev/null
Binary files differ
diff --git a/base/test/data/file_util/same.txt b/base/test/data/file_util/same.txt
deleted file mode 100644
index 4422f57..0000000
--- a/base/test/data/file_util/same.txt
+++ /dev/null
@@ -1 +0,0 @@
-This file is the same.
diff --git a/base/test/data/file_util/same_length.txt b/base/test/data/file_util/same_length.txt
deleted file mode 100644
index 157405c..0000000
--- a/base/test/data/file_util/same_length.txt
+++ /dev/null
@@ -1 +0,0 @@
-This file is not same.
diff --git a/base/test/data/file_util/shortened.txt b/base/test/data/file_util/shortened.txt
deleted file mode 100644
index 2bee82c..0000000
--- a/base/test/data/file_util/shortened.txt
+++ /dev/null
@@ -1 +0,0 @@
-This file is the
\ No newline at end of file
diff --git a/base/test/data/file_version_info_unittest/FileVersionInfoTest1.dll b/base/test/data/file_version_info_unittest/FileVersionInfoTest1.dll
deleted file mode 100755
index bdf8dc0..0000000
--- a/base/test/data/file_version_info_unittest/FileVersionInfoTest1.dll
+++ /dev/null
Binary files differ
diff --git a/base/test/data/file_version_info_unittest/FileVersionInfoTest2.dll b/base/test/data/file_version_info_unittest/FileVersionInfoTest2.dll
deleted file mode 100755
index 51e7966..0000000
--- a/base/test/data/file_version_info_unittest/FileVersionInfoTest2.dll
+++ /dev/null
Binary files differ
diff --git a/base/test/data/json/bom_feff.json b/base/test/data/json/bom_feff.json
deleted file mode 100644
index b05ae50..0000000
--- a/base/test/data/json/bom_feff.json
+++ /dev/null
@@ -1,10 +0,0 @@
-﻿{
-  "appName": {
-    "message": "Gmail",
-    "description": "App name."
-  },
-  "appDesc": {
-    "message": "بريد إلكتروني يوفر إمكانية البحث مع مقدار أقل من الرسائل غير المرغوب فيها.", 
-    "description":"App description."
-  }
-}
\ No newline at end of file
diff --git a/base/test/data/pe_image/pe_image_test_32.dll b/base/test/data/pe_image/pe_image_test_32.dll
deleted file mode 100755
index 539d631..0000000
--- a/base/test/data/pe_image/pe_image_test_32.dll
+++ /dev/null
Binary files differ
diff --git a/base/test/data/pe_image/pe_image_test_64.dll b/base/test/data/pe_image/pe_image_test_64.dll
deleted file mode 100755
index 8801e23..0000000
--- a/base/test/data/pe_image/pe_image_test_64.dll
+++ /dev/null
Binary files differ
diff --git a/base/test/data/serializer_nested_test.json b/base/test/data/serializer_nested_test.json
deleted file mode 100644
index cfea8e8..0000000
--- a/base/test/data/serializer_nested_test.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-   "bool": true,
-   "dict": {
-      "bool": true,
-      "dict": {
-         "bees": "knees",
-         "cats": "meow"
-      },
-      "foos": "bar",
-      "list": [ 3.4, "second", null ]
-   },
-   "int": 42,
-   "list": [ 1, 2 ],
-   "null": null,
-   "real": 3.14,
-   "string": "hello"
-}
diff --git a/base/test/data/serializer_test.json b/base/test/data/serializer_test.json
deleted file mode 100644
index 446925e..0000000
--- a/base/test/data/serializer_test.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-   "bool": true,
-   "int": 42,
-   "list": [ 1, 2 ],
-   "null": null,
-   "real": 3.14,
-   "string": "hello"
-}
diff --git a/base/test/data/serializer_test_nowhitespace.json b/base/test/data/serializer_test_nowhitespace.json
deleted file mode 100644
index a1afdc5..0000000
--- a/base/test/data/serializer_test_nowhitespace.json
+++ /dev/null
@@ -1 +0,0 @@
-{"bool":true,"int":42,"list":[1,2],"null":null,"real":3.14,"string":"hello"}
\ No newline at end of file
diff --git a/base/test/fontconfig_util_linux.cc b/base/test/fontconfig_util_linux.cc
deleted file mode 100644
index 8bd7c92..0000000
--- a/base/test/fontconfig_util_linux.cc
+++ /dev/null
@@ -1,496 +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/fontconfig_util_linux.h"
-
-#include <fontconfig/fontconfig.h>
-
-#include "base/base_paths.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/path_service.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-
-namespace base {
-
-namespace {
-
-const char kFontsConfTemplate[] = R"(<?xml version="1.0"?>
-<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
-<fontconfig>
-
-  <!-- Cache location. -->
-  <cachedir>$1</cachedir>
-
-  <!-- GCS-synced fonts. -->
-  <dir>$2</dir>
-
-  <!-- Default properties. -->
-  <match target="font">
-    <edit name="embeddedbitmap" mode="append_last">
-      <bool>false</bool>
-    </edit>
-  </match>
-
-  <!-- TODO(thomasanderson): Figure out why this is necessary. -->
-  <match target="pattern">
-    <test name="family" compare="eq">
-      <string>Tinos</string>
-    </test>
-    <test name="prgname" compare="eq">
-      <string>chromevox_tests</string>
-    </test>
-    <edit name="hintstyle" mode="assign">
-      <const>hintslight</const>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>Times</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Tinos</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>sans</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>DejaVu Sans</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>sans serif</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-  </match>
-
-  <!-- Some layout tests specify Helvetica as a family and we need to make sure
-       that we don't fallback to Tinos for them -->
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>Helvetica</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>sans-serif</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>serif</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Tinos</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>mono</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Cousine</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>monospace</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Cousine</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>Courier</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Cousine</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>cursive</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Comic Sans MS</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>fantasy</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Impact</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>Monaco</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Tinos</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>Arial</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>Courier New</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Cousine</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>Georgia</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Gelasio</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>Times New Roman</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Tinos</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test qual="any" name="family">
-      <string>Verdana</string>
-    </test>
-    <!-- NOT metrically compatible! -->
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-  </match>
-
-  <!-- TODO(thomasanderson): Move these configs to be test-specific. -->
-  <match target="pattern">
-    <test name="family" compare="eq">
-      <string>NonAntiAliasedSans</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-    <edit name="antialias" mode="assign">
-      <bool>false</bool>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test name="family" compare="eq">
-      <string>SlightHintedGeorgia</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Gelasio</string>
-    </edit>
-    <edit name="hintstyle" mode="assign">
-      <const>hintslight</const>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test name="family" compare="eq">
-      <string>NonHintedSans</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-    <!-- These deliberately contradict each other. The 'hinting' preference
-         should take priority -->
-    <edit name="hintstyle" mode="assign">
-      <const>hintfull</const>
-    </edit>
-   <edit name="hinting" mode="assign">
-      <bool>false</bool>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test name="family" compare="eq">
-      <string>AutohintedSerif</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-    <edit name="autohint" mode="assign">
-      <bool>true</bool>
-    </edit>
-    <edit name="hintstyle" mode="assign">
-      <const>hintmedium</const>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test name="family" compare="eq">
-      <string>HintedSerif</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-    <edit name="autohint" mode="assign">
-      <bool>false</bool>
-    </edit>
-    <edit name="hintstyle" mode="assign">
-      <const>hintmedium</const>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test name="family" compare="eq">
-      <string>FullAndAutoHintedSerif</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-    <edit name="autohint" mode="assign">
-      <bool>true</bool>
-    </edit>
-    <edit name="hintstyle" mode="assign">
-      <const>hintfull</const>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test name="family" compare="eq">
-      <string>SubpixelEnabledArial</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-    <edit name="rgba" mode="assign">
-      <const>rgb</const>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test name="family" compare="eq">
-      <string>SubpixelDisabledArial</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Arimo</string>
-    </edit>
-    <edit name="rgba" mode="assign">
-      <const>none</const>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <!-- FontConfig doesn't currently provide a well-defined way to turn on
-         subpixel positioning.  This is just an arbitrary pattern to use after
-         turning subpixel positioning on globally to ensure that we don't have
-         issues with our style getting cached for other tests. -->
-    <test name="family" compare="eq">
-      <string>SubpixelPositioning</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Tinos</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <!-- See comments above -->
-    <test name="family" compare="eq">
-      <string>SubpixelPositioningAhem</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>ahem</string>
-    </edit>
-  </match>
-
-  <match target="pattern">
-    <test name="family" compare="eq">
-      <string>SlightHintedTimesNewRoman</string>
-    </test>
-    <edit name="family" mode="assign">
-      <string>Tinos</string>
-    </edit>
-    <edit name="hintstyle" mode="assign">
-      <const>hintslight</const>
-    </edit>
-  </match>
-
-  <!-- When we encounter a character that the current font doesn't
-       support, gfx::GetFallbackFontForChar() returns the first font
-       that does have a glyph for the character. The list of fonts is
-       sorted by a pattern that includes the current locale, but doesn't
-       include a font family (which means that the fallback font depends
-       on the locale but not on the current font).
-
-       DejaVu Sans is commonly the only font that supports some
-       characters, such as "⇧", and even when other candidates are
-       available, DejaVu Sans is commonly first among them, because of
-       the way Fontconfig is ordinarily configured. For example, the
-       configuration in the Fonconfig source lists DejaVu Sans under the
-       sans-serif generic family, and appends sans-serif to patterns
-       that don't already include a generic family (such as the pattern
-       in gfx::GetFallbackFontForChar()).
-
-       To get the same fallback font in the layout tests, we could
-       duplicate this configuration here, or more directly, simply
-       append DejaVu Sans to all patterns. -->
-  <match target="pattern">
-    <edit name="family" mode="append_last">
-      <string>DejaVu Sans</string>
-    </edit>
-  </match>
-
-</fontconfig>
-)";
-
-}  // namespace
-
-void SetUpFontconfig() {
-  FilePath dir_module;
-  PathService::Get(DIR_MODULE, &dir_module);
-  FilePath font_cache = dir_module.Append("fontconfig_caches");
-  FilePath test_fonts = dir_module.Append("test_fonts");
-  std::string fonts_conf = ReplaceStringPlaceholders(
-      kFontsConfTemplate, {font_cache.value(), test_fonts.value()}, nullptr);
-
-  FcConfig* config = FcConfigCreate();
-  CHECK(config);
-#if FC_VERSION >= 21205
-  CHECK(FcConfigParseAndLoadFromMemory(
-      config, reinterpret_cast<const FcChar8*>(fonts_conf.c_str()), FcTrue));
-#else
-  FilePath temp;
-  CHECK(CreateTemporaryFile(&temp));
-  CHECK(WriteFile(temp, fonts_conf.c_str(), fonts_conf.size()));
-  CHECK(FcConfigParseAndLoad(
-      config, reinterpret_cast<const FcChar8*>(temp.value().c_str()), FcTrue));
-  CHECK(DeleteFile(temp, false));
-#endif
-  CHECK(FcConfigBuildFonts(config));
-  CHECK(FcConfigSetCurrent(config));
-
-  // Decrement the reference count for |config|.  It's now owned by fontconfig.
-  FcConfigDestroy(config);
-}
-
-void TearDownFontconfig() {
-  FcFini();
-}
-
-bool LoadFontIntoFontconfig(const FilePath& path) {
-  if (!PathExists(path)) {
-    LOG(ERROR) << "You are missing " << path.value() << ". Try re-running "
-               << "build/install-build-deps.sh. "
-               << "Please make sure that "
-               << "third_party/test_fonts/ has downloaded "
-               << "and extracted the test_fonts."
-               << "Also see "
-               << "https://chromium.googlesource.com/chromium/src/+/master/"
-               << "docs/layout_tests_linux.md";
-    return false;
-  }
-
-  if (!FcConfigAppFontAddFile(
-          NULL, reinterpret_cast<const FcChar8*>(path.value().c_str()))) {
-    LOG(ERROR) << "Failed to load font " << path.value();
-    return false;
-  }
-
-  return true;
-}
-
-bool LoadConfigFileIntoFontconfig(const FilePath& path) {
-  // Unlike other FcConfig functions, FcConfigParseAndLoad() doesn't default to
-  // the current config when passed NULL. So that's cool.
-  if (!FcConfigParseAndLoad(
-          FcConfigGetCurrent(),
-          reinterpret_cast<const FcChar8*>(path.value().c_str()), FcTrue)) {
-    LOG(ERROR) << "Fontconfig failed to load " << path.value();
-    return false;
-  }
-  return true;
-}
-
-bool LoadConfigDataIntoFontconfig(const FilePath& temp_dir,
-                                  const std::string& data) {
-  FilePath path;
-  if (!CreateTemporaryFileInDir(temp_dir, &path)) {
-    PLOG(ERROR) << "Unable to create temporary file in " << temp_dir.value();
-    return false;
-  }
-  if (WriteFile(path, data.data(), data.size()) !=
-      static_cast<int>(data.size())) {
-    PLOG(ERROR) << "Unable to write config data to " << path.value();
-    return false;
-  }
-  return LoadConfigFileIntoFontconfig(path);
-}
-
-std::string CreateFontconfigEditStanza(const std::string& name,
-                                       const std::string& type,
-                                       const std::string& value) {
-  return StringPrintf(
-      "    <edit name=\"%s\" mode=\"assign\">\n"
-      "      <%s>%s</%s>\n"
-      "    </edit>\n",
-      name.c_str(), type.c_str(), value.c_str(), type.c_str());
-}
-
-std::string CreateFontconfigTestStanza(const std::string& name,
-                                       const std::string& op,
-                                       const std::string& type,
-                                       const std::string& value) {
-  return StringPrintf(
-      "    <test name=\"%s\" compare=\"%s\" qual=\"any\">\n"
-      "      <%s>%s</%s>\n"
-      "    </test>\n",
-      name.c_str(), op.c_str(), type.c_str(), value.c_str(), type.c_str());
-}
-
-std::string CreateFontconfigAliasStanza(const std::string& original_family,
-                                        const std::string& preferred_family) {
-  return StringPrintf(
-      "  <alias>\n"
-      "    <family>%s</family>\n"
-      "    <prefer><family>%s</family></prefer>\n"
-      "  </alias>\n",
-      original_family.c_str(), preferred_family.c_str());
-}
-
-}  // namespace base
diff --git a/base/test/fontconfig_util_linux.h b/base/test/fontconfig_util_linux.h
deleted file mode 100644
index ac7037a..0000000
--- a/base/test/fontconfig_util_linux.h
+++ /dev/null
@@ -1,51 +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.
-
-#ifndef BASE_TEST_FONTCONFIG_UTIL_LINUX_H_
-#define BASE_TEST_FONTCONFIG_UTIL_LINUX_H_
-
-#include <stddef.h>
-
-#include <string>
-
-namespace base {
-class FilePath;
-
-// Initializes Fontconfig with a custom configuration suitable for tests.
-void SetUpFontconfig();
-
-// Deinitializes Fontconfig.
-void TearDownFontconfig();
-
-// Loads the font file at |path| into the current config, returning true on
-// success.
-bool LoadFontIntoFontconfig(const FilePath& path);
-
-// Instructs Fontconfig to load |path|, an XML configuration file, into the
-// current config, returning true on success.
-bool LoadConfigFileIntoFontconfig(const FilePath& path);
-
-// Writes |data| to a file in |temp_dir| and passes it to
-// LoadConfigFileIntoFontconfig().
-bool LoadConfigDataIntoFontconfig(const FilePath& temp_dir,
-                                  const std::string& data);
-
-// Returns a Fontconfig <edit> stanza.
-std::string CreateFontconfigEditStanza(const std::string& name,
-                                       const std::string& type,
-                                       const std::string& value);
-
-// Returns a Fontconfig <test> stanza.
-std::string CreateFontconfigTestStanza(const std::string& name,
-                                       const std::string& op,
-                                       const std::string& type,
-                                       const std::string& value);
-
-// Returns a Fontconfig <alias> stanza.
-std::string CreateFontconfigAliasStanza(const std::string& original_family,
-                                        const std::string& preferred_family);
-
-}  // namespace base
-
-#endif  // BASE_TEST_FONTCONFIG_UTIL_LINUX_H_
diff --git a/base/test/fuzzed_data_provider.cc b/base/test/fuzzed_data_provider.cc
deleted file mode 100644
index b2d443a..0000000
--- a/base/test/fuzzed_data_provider.cc
+++ /dev/null
@@ -1,98 +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/test/fuzzed_data_provider.h"
-
-#include <algorithm>
-#include <limits>
-
-#include "base/logging.h"
-
-namespace base {
-
-FuzzedDataProvider::FuzzedDataProvider(const uint8_t* data, size_t size)
-    : remaining_data_(reinterpret_cast<const char*>(data), size) {}
-
-FuzzedDataProvider::~FuzzedDataProvider() = default;
-
-std::string FuzzedDataProvider::ConsumeBytes(size_t num_bytes) {
-  num_bytes = std::min(num_bytes, remaining_data_.length());
-  StringPiece result(remaining_data_.data(), num_bytes);
-  remaining_data_ = remaining_data_.substr(num_bytes);
-  return result.as_string();
-}
-
-std::string FuzzedDataProvider::ConsumeRemainingBytes() {
-  return ConsumeBytes(remaining_data_.length());
-}
-
-uint32_t FuzzedDataProvider::ConsumeUint32InRange(uint32_t min, uint32_t max) {
-  CHECK_LE(min, max);
-
-  uint32_t range = max - min;
-  uint32_t offset = 0;
-  uint32_t result = 0;
-
-  while (offset < 32 && (range >> offset) > 0 && !remaining_data_.empty()) {
-    // Pull bytes off the end of the seed data. Experimentally, this seems to
-    // allow the fuzzer to more easily explore the input space. This makes
-    // sense, since it works by modifying inputs that caused new code to run,
-    // and this data is often used to encode length of data read by
-    // ConsumeBytes. Separating out read lengths makes it easier modify the
-    // contents of the data that is actually read.
-    uint8_t next_byte = remaining_data_.back();
-    remaining_data_.remove_suffix(1);
-    result = (result << 8) | next_byte;
-    offset += 8;
-  }
-
-  // Avoid division by 0, in the case |range + 1| results in overflow.
-  if (range == std::numeric_limits<uint32_t>::max())
-    return result;
-
-  return min + result % (range + 1);
-}
-
-std::string FuzzedDataProvider::ConsumeRandomLengthString(size_t max_length) {
-  // Reads bytes from start of |remaining_data_|. Maps "\\" to "\", and maps "\"
-  // followed by anything else to the end of the string. As a result of this
-  // logic, a fuzzer can insert characters into the string, and the string will
-  // be lengthened to include those new characters, resulting in a more stable
-  // fuzzer than picking the length of a string independently from picking its
-  // contents.
-  std::string out;
-  for (size_t i = 0; i < max_length && !remaining_data_.empty(); ++i) {
-    char next = remaining_data_[0];
-    remaining_data_.remove_prefix(1);
-    if (next == '\\' && !remaining_data_.empty()) {
-      next = remaining_data_[0];
-      remaining_data_.remove_prefix(1);
-      if (next != '\\')
-        return out;
-    }
-    out += next;
-  }
-  return out;
-}
-
-int FuzzedDataProvider::ConsumeInt32InRange(int min, int max) {
-  CHECK_LE(min, max);
-
-  uint32_t range = max - min;
-  return min + ConsumeUint32InRange(0, range);
-}
-
-bool FuzzedDataProvider::ConsumeBool() {
-  return (ConsumeUint8() & 0x01) == 0x01;
-}
-
-uint8_t FuzzedDataProvider::ConsumeUint8() {
-  return ConsumeUint32InRange(0, 0xFF);
-}
-
-uint16_t FuzzedDataProvider::ConsumeUint16() {
-  return ConsumeUint32InRange(0, 0xFFFF);
-}
-
-}  // namespace base
diff --git a/base/test/fuzzed_data_provider.h b/base/test/fuzzed_data_provider.h
deleted file mode 100644
index 425c820..0000000
--- a/base/test/fuzzed_data_provider.h
+++ /dev/null
@@ -1,80 +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.
-
-#ifndef BASE_TEST_FUZZED_DATA_PROVIDER_H_
-#define BASE_TEST_FUZZED_DATA_PROVIDER_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "base/base_export.h"
-#include "base/macros.h"
-#include "base/strings/string_piece.h"
-
-namespace base {
-
-// Utility class to break up fuzzer input for multiple consumers. Whenever run
-// on the same input, provides the same output, as long as its methods are
-// called in the same order, with the same arguments.
-class FuzzedDataProvider {
- public:
-  // |data| is an array of length |size| that the FuzzedDataProvider wraps to
-  // provide more granular access. |data| must outlive the FuzzedDataProvider.
-  FuzzedDataProvider(const uint8_t* data, size_t size);
-  ~FuzzedDataProvider();
-
-  // Returns a std::string containing |num_bytes| of input data. If fewer than
-  // |num_bytes| of data remain, returns a shorter std::string containing all
-  // of the data that's left.
-  std::string ConsumeBytes(size_t num_bytes);
-
-  // Returns a std::string containing all remaining bytes of the input data.
-  std::string ConsumeRemainingBytes();
-
-  // Returns a std::string of length from 0 to |max_length|. When it runs out of
-  // input data, returns what remains of the input. Designed to be more stable
-  // with respect to a fuzzer inserting characters than just picking a random
-  // length and then consuming that many bytes with ConsumeBytes().
-  std::string ConsumeRandomLengthString(size_t max_length);
-
-  // Returns a number in the range [min, max] by consuming bytes from the input
-  // data. The value might not be uniformly distributed in the given range. If
-  // there's no input data left, always returns |min|. |min| must be less than
-  // or equal to |max|.
-  uint32_t ConsumeUint32InRange(uint32_t min, uint32_t max);
-  int ConsumeInt32InRange(int min, int max);
-
-  // Returns a bool, or false when no data remains.
-  bool ConsumeBool();
-
-  // Returns a uint8_t from the input or 0 if nothing remains. This is
-  // equivalent to ConsumeUint32InRange(0, 0xFF).
-  uint8_t ConsumeUint8();
-
-  // Returns a uint16_t from the input. If fewer than 2 bytes of data remain
-  // will fill the most significant bytes with 0. This is equivalent to
-  // ConsumeUint32InRange(0, 0xFFFF).
-  uint16_t ConsumeUint16();
-
-  // Returns a value from |array|, consuming as many bytes as needed to do so.
-  // |array| must be a fixed-size array. Equivalent to
-  // array[ConsumeUint32InRange(sizeof(array)-1)];
-  template <typename Type, size_t size>
-  Type PickValueInArray(Type (&array)[size]) {
-    return array[ConsumeUint32InRange(0, size - 1)];
-  }
-
-  // Reports the remaining bytes available for fuzzed input.
-  size_t remaining_bytes() { return remaining_data_.length(); }
-
- private:
-  StringPiece remaining_data_;
-
-  DISALLOW_COPY_AND_ASSIGN(FuzzedDataProvider);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_FUZZED_DATA_PROVIDER_H_
diff --git a/base/test/generate_fontconfig_caches.cc b/base/test/generate_fontconfig_caches.cc
deleted file mode 100644
index f12eb48..0000000
--- a/base/test/generate_fontconfig_caches.cc
+++ /dev/null
@@ -1,24 +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 <string>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/path_service.h"
-#include "base/test/fontconfig_util_linux.h"
-
-int main(void) {
-  base::SetUpFontconfig();
-  base::TearDownFontconfig();
-
-  base::FilePath dir_module;
-  CHECK(base::PathService::Get(base::DIR_MODULE, &dir_module));
-  base::FilePath fontconfig_caches = dir_module.Append("fontconfig_caches");
-  CHECK(base::DirectoryExists(fontconfig_caches));
-  base::FilePath stamp = fontconfig_caches.Append("STAMP");
-  CHECK_EQ(0, base::WriteFile(stamp, "", 0));
-
-  return 0;
-}
diff --git a/base/test/gtest_util.cc b/base/test/gtest_util.cc
deleted file mode 100644
index e5d38f4..0000000
--- a/base/test/gtest_util.cc
+++ /dev/null
@@ -1,111 +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/gtest_util.h"
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "base/files/file_path.h"
-#include "base/json/json_file_value_serializer.h"
-#include "base/strings/string_util.h"
-#include "base/values.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-TestIdentifier::TestIdentifier() = default;
-
-TestIdentifier::TestIdentifier(const TestIdentifier& other) = default;
-
-std::string FormatFullTestName(const std::string& test_case_name,
-                               const std::string& test_name) {
-  return test_case_name + "." + test_name;
-}
-
-std::string TestNameWithoutDisabledPrefix(const std::string& full_test_name) {
-  std::string test_name_no_disabled(full_test_name);
-  ReplaceSubstringsAfterOffset(&test_name_no_disabled, 0, "DISABLED_", "");
-  return test_name_no_disabled;
-}
-
-std::vector<TestIdentifier> GetCompiledInTests() {
-  testing::UnitTest* const unit_test = testing::UnitTest::GetInstance();
-
-  std::vector<TestIdentifier> tests;
-  for (int i = 0; i < unit_test->total_test_case_count(); ++i) {
-    const testing::TestCase* test_case = unit_test->GetTestCase(i);
-    for (int j = 0; j < test_case->total_test_count(); ++j) {
-      const testing::TestInfo* test_info = test_case->GetTestInfo(j);
-      TestIdentifier test_data;
-      test_data.test_case_name = test_case->name();
-      test_data.test_name = test_info->name();
-      test_data.file = test_info->file();
-      test_data.line = test_info->line();
-      tests.push_back(test_data);
-    }
-  }
-  return tests;
-}
-
-bool WriteCompiledInTestsToFile(const FilePath& path) {
-  std::vector<TestIdentifier> tests(GetCompiledInTests());
-
-  ListValue root;
-  for (size_t i = 0; i < tests.size(); ++i) {
-    std::unique_ptr<DictionaryValue> test_info(new DictionaryValue);
-    test_info->SetString("test_case_name", tests[i].test_case_name);
-    test_info->SetString("test_name", tests[i].test_name);
-    test_info->SetString("file", tests[i].file);
-    test_info->SetInteger("line", tests[i].line);
-    root.Append(std::move(test_info));
-  }
-
-  JSONFileValueSerializer serializer(path);
-  return serializer.Serialize(root);
-}
-
-bool ReadTestNamesFromFile(const FilePath& path,
-                           std::vector<TestIdentifier>* output) {
-  JSONFileValueDeserializer deserializer(path);
-  int error_code = 0;
-  std::string error_message;
-  std::unique_ptr<base::Value> value =
-      deserializer.Deserialize(&error_code, &error_message);
-  if (!value.get())
-    return false;
-
-  base::ListValue* tests = nullptr;
-  if (!value->GetAsList(&tests))
-    return false;
-
-  std::vector<base::TestIdentifier> result;
-  for (base::ListValue::iterator i = tests->begin(); i != tests->end(); ++i) {
-    base::DictionaryValue* test = nullptr;
-    if (!i->GetAsDictionary(&test))
-      return false;
-
-    TestIdentifier test_data;
-
-    if (!test->GetStringASCII("test_case_name", &test_data.test_case_name))
-      return false;
-
-    if (!test->GetStringASCII("test_name", &test_data.test_name))
-      return false;
-
-    if (!test->GetStringASCII("file", &test_data.file))
-      return false;
-
-    if (!test->GetInteger("line", &test_data.line))
-      return false;
-
-    result.push_back(test_data);
-  }
-
-  output->swap(result);
-  return true;
-}
-
-}  // namespace base
diff --git a/base/test/gtest_util.h b/base/test/gtest_util.h
deleted file mode 100644
index e4ec0bf..0000000
--- a/base/test/gtest_util.h
+++ /dev/null
@@ -1,84 +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.
-
-#ifndef BASE_TEST_GTEST_UTIL_H_
-#define BASE_TEST_GTEST_UTIL_H_
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-// EXPECT/ASSERT_DCHECK_DEATH is intended to replace EXPECT/ASSERT_DEBUG_DEATH
-// when the death is expected to be caused by a DCHECK. Contrary to
-// EXPECT/ASSERT_DEBUG_DEATH however, it doesn't execute the statement in non-
-// dcheck builds as DCHECKs are intended to catch things that should never
-// happen and as such executing the statement results in undefined behavior
-// (|statement| is compiled in unsupported configurations nonetheless).
-// Death tests misbehave on Android.
-#if DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
-
-// EXPECT/ASSERT_DCHECK_DEATH tests verify that a DCHECK is hit ("Check failed"
-// is part of the error message), but intentionally do not expose the gtest
-// death test's full |regex| parameter to avoid users having to verify the exact
-// syntax of the error message produced by the DCHECK.
-#define EXPECT_DCHECK_DEATH(statement) EXPECT_DEATH(statement, "Check failed")
-#define ASSERT_DCHECK_DEATH(statement) ASSERT_DEATH(statement, "Check failed")
-
-#else
-// DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
-
-#define EXPECT_DCHECK_DEATH(statement) \
-    GTEST_UNSUPPORTED_DEATH_TEST(statement, "Check failed", )
-#define ASSERT_DCHECK_DEATH(statement) \
-    GTEST_UNSUPPORTED_DEATH_TEST(statement, "Check failed", return)
-
-#endif
-// DCHECK_IS_ON() && defined(GTEST_HAS_DEATH_TEST) && !defined(OS_ANDROID)
-
-namespace base {
-
-class FilePath;
-
-struct TestIdentifier {
-  TestIdentifier();
-  TestIdentifier(const TestIdentifier& other);
-
-  std::string test_case_name;
-  std::string test_name;
-  std::string file;
-  int line;
-};
-
-// Constructs a full test name given a test case name and a test name,
-// e.g. for test case "A" and test name "B" returns "A.B".
-std::string FormatFullTestName(const std::string& test_case_name,
-                               const std::string& test_name);
-
-// Returns the full test name with the "DISABLED_" prefix stripped out.
-// e.g. for the full test names "A.DISABLED_B", "DISABLED_A.B", and
-// "DISABLED_A.DISABLED_B", returns "A.B".
-std::string TestNameWithoutDisabledPrefix(const std::string& full_test_name);
-
-// Returns a vector of gtest-based tests compiled into
-// current executable.
-std::vector<TestIdentifier> GetCompiledInTests();
-
-// Writes the list of gtest-based tests compiled into
-// current executable as a JSON file. Returns true on success.
-bool WriteCompiledInTestsToFile(const FilePath& path) WARN_UNUSED_RESULT;
-
-// Reads the list of gtest-based tests from |path| into |output|.
-// Returns true on success.
-bool ReadTestNamesFromFile(
-    const FilePath& path,
-    std::vector<TestIdentifier>* output) WARN_UNUSED_RESULT;
-
-}  // namespace base
-
-#endif  // BASE_TEST_GTEST_UTIL_H_
diff --git a/base/test/gtest_xml_unittest_result_printer.cc b/base/test/gtest_xml_unittest_result_printer.cc
deleted file mode 100644
index 558a986..0000000
--- a/base/test/gtest_xml_unittest_result_printer.cc
+++ /dev/null
@@ -1,162 +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/gtest_xml_unittest_result_printer.h"
-
-#include "base/base64.h"
-#include "base/command_line.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/test/test_switches.h"
-#include "base/time/time.h"
-
-namespace base {
-
-namespace {
-const int kDefaultTestPartResultsLimit = 10;
-
-const char kTestPartLesultsLimitExceeded[] =
-    "Test part results limit exceeded. Use --test-launcher-test-part-limit to "
-    "increase or disable limit.";
-}  // namespace
-
-XmlUnitTestResultPrinter::XmlUnitTestResultPrinter()
-    : output_file_(nullptr), open_failed_(false) {}
-
-XmlUnitTestResultPrinter::~XmlUnitTestResultPrinter() {
-  if (output_file_ && !open_failed_) {
-    fprintf(output_file_, "</testsuites>\n");
-    fflush(output_file_);
-    CloseFile(output_file_);
-  }
-}
-
-bool XmlUnitTestResultPrinter::Initialize(const FilePath& output_file_path) {
-  DCHECK(!output_file_);
-  output_file_ = OpenFile(output_file_path, "w");
-  if (!output_file_) {
-    // If the file open fails, we set the output location to stderr. This is
-    // because in current usage our caller CHECKs the result of this function.
-    // But that in turn causes a LogMessage that comes back to this object,
-    // which in turn causes a (double) crash. By pointing at stderr, there might
-    // be some indication what's going wrong. See https://crbug.com/736783.
-    output_file_ = stderr;
-    open_failed_ = true;
-    return false;
-  }
-
-  fprintf(output_file_,
-          "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<testsuites>\n");
-  fflush(output_file_);
-
-  return true;
-}
-
-void XmlUnitTestResultPrinter::OnAssert(const char* file,
-                                        int line,
-                                        const std::string& summary,
-                                        const std::string& message) {
-  WriteTestPartResult(file, line, testing::TestPartResult::kFatalFailure,
-                      summary, message);
-}
-
-void XmlUnitTestResultPrinter::OnTestCaseStart(
-    const testing::TestCase& test_case) {
-  fprintf(output_file_, "  <testsuite>\n");
-  fflush(output_file_);
-}
-
-void XmlUnitTestResultPrinter::OnTestStart(
-    const testing::TestInfo& test_info) {
-  // This is our custom extension - it helps to recognize which test was
-  // running when the test binary crashed. Note that we cannot even open the
-  // <testcase> tag here - it requires e.g. run time of the test to be known.
-  fprintf(output_file_,
-          "    <x-teststart name=\"%s\" classname=\"%s\" />\n",
-          test_info.name(),
-          test_info.test_case_name());
-  fflush(output_file_);
-}
-
-void XmlUnitTestResultPrinter::OnTestEnd(const testing::TestInfo& test_info) {
-  fprintf(output_file_,
-          "    <testcase name=\"%s\" status=\"run\" time=\"%.3f\""
-          " classname=\"%s\">\n",
-          test_info.name(),
-          static_cast<double>(test_info.result()->elapsed_time()) /
-              Time::kMillisecondsPerSecond,
-          test_info.test_case_name());
-  if (test_info.result()->Failed()) {
-    fprintf(output_file_,
-            "      <failure message=\"\" type=\"\"></failure>\n");
-  }
-
-  int limit = test_info.result()->total_part_count();
-  if (CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kTestLauncherTestPartResultsLimit)) {
-    std::string limit_str =
-        CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-            switches::kTestLauncherTestPartResultsLimit);
-    int test_part_results_limit = std::strtol(limit_str.c_str(), nullptr, 10);
-    if (test_part_results_limit >= 0)
-      limit = std::min(limit, test_part_results_limit);
-  } else {
-    limit = std::min(limit, kDefaultTestPartResultsLimit);
-  }
-
-  for (int i = 0; i < limit; ++i) {
-    const auto& test_part_result = test_info.result()->GetTestPartResult(i);
-    WriteTestPartResult(test_part_result.file_name(),
-                        test_part_result.line_number(), test_part_result.type(),
-                        test_part_result.summary(), test_part_result.message());
-  }
-
-  if (test_info.result()->total_part_count() > limit) {
-    WriteTestPartResult(
-        "<unknown>", 0, testing::TestPartResult::kNonFatalFailure,
-        kTestPartLesultsLimitExceeded, kTestPartLesultsLimitExceeded);
-  }
-
-  fprintf(output_file_, "    </testcase>\n");
-  fflush(output_file_);
-}
-
-void XmlUnitTestResultPrinter::OnTestCaseEnd(
-    const testing::TestCase& test_case) {
-  fprintf(output_file_, "  </testsuite>\n");
-  fflush(output_file_);
-}
-
-void XmlUnitTestResultPrinter::WriteTestPartResult(
-    const char* file,
-    int line,
-    testing::TestPartResult::Type result_type,
-    const std::string& summary,
-    const std::string& message) {
-  const char* type = "unknown";
-  switch (result_type) {
-    case testing::TestPartResult::kSuccess:
-      type = "success";
-      break;
-    case testing::TestPartResult::kNonFatalFailure:
-      type = "failure";
-      break;
-    case testing::TestPartResult::kFatalFailure:
-      type = "fatal_failure";
-      break;
-  }
-  std::string summary_encoded;
-  Base64Encode(summary, &summary_encoded);
-  std::string message_encoded;
-  Base64Encode(message, &message_encoded);
-  fprintf(output_file_,
-          "      <x-test-result-part type=\"%s\" file=\"%s\" line=\"%d\">\n"
-          "        <summary>%s</summary>\n"
-          "        <message>%s</message>\n"
-          "      </x-test-result-part>\n",
-          type, file, line, summary_encoded.c_str(), message_encoded.c_str());
-  fflush(output_file_);
-}
-
-}  // namespace base
diff --git a/base/test/gtest_xml_unittest_result_printer.h b/base/test/gtest_xml_unittest_result_printer.h
deleted file mode 100644
index 9340382..0000000
--- a/base/test/gtest_xml_unittest_result_printer.h
+++ /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.
-
-#ifndef BASE_TEST_GTEST_XML_UNITTEST_RESULT_PRINTER_H_
-#define BASE_TEST_GTEST_XML_UNITTEST_RESULT_PRINTER_H_
-
-#include <stdio.h>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-class FilePath;
-
-// Generates an XML output file. Format is very close to GTest, but has
-// extensions needed by the test launcher.
-class XmlUnitTestResultPrinter : public testing::EmptyTestEventListener {
- public:
-  XmlUnitTestResultPrinter();
-  ~XmlUnitTestResultPrinter() override;
-
-  // Must be called before adding as a listener. Returns true on success.
-  bool Initialize(const FilePath& output_file_path) WARN_UNUSED_RESULT;
-
-  // CHECK/DCHECK failed. Print file/line and message to the xml.
-  void OnAssert(const char* file,
-                int line,
-                const std::string& summary,
-                const std::string& message);
-
- private:
-  // testing::EmptyTestEventListener:
-  void OnTestCaseStart(const testing::TestCase& test_case) override;
-  void OnTestStart(const testing::TestInfo& test_info) override;
-  void OnTestEnd(const testing::TestInfo& test_info) override;
-  void OnTestCaseEnd(const testing::TestCase& test_case) override;
-
-  void WriteTestPartResult(const char* file,
-                           int line,
-                           testing::TestPartResult::Type type,
-                           const std::string& summary,
-                           const std::string& message);
-
-  FILE* output_file_;
-  bool open_failed_;
-
-  DISALLOW_COPY_AND_ASSIGN(XmlUnitTestResultPrinter);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_GTEST_XML_UNITTEST_RESULT_PRINTER_H_
diff --git a/base/test/gtest_xml_util.cc b/base/test/gtest_xml_util.cc
deleted file mode 100644
index 37104e8..0000000
--- a/base/test/gtest_xml_util.cc
+++ /dev/null
@@ -1,234 +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/gtest_xml_util.h"
-
-#include <stdint.h>
-
-#include "base/base64.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/gtest_util.h"
-#include "base/test/launcher/test_launcher.h"
-#include "third_party/libxml/chromium/libxml_utils.h"
-
-namespace base {
-
-namespace {
-
-// This is used for the xml parser to report errors. This assumes the context
-// is a pointer to a std::string where the error message should be appended.
-static void XmlErrorFunc(void *context, const char *message, ...) {
-  va_list args;
-  va_start(args, message);
-  std::string* error = static_cast<std::string*>(context);
-  StringAppendV(error, message, args);
-  va_end(args);
-}
-
-}  // namespace
-
-bool ProcessGTestOutput(const base::FilePath& output_file,
-                        std::vector<TestResult>* results,
-                        bool* crashed) {
-  DCHECK(results);
-
-  std::string xml_contents;
-  if (!ReadFileToString(output_file, &xml_contents))
-    return false;
-
-  // Silence XML errors - otherwise they go to stderr.
-  std::string xml_errors;
-  ScopedXmlErrorFunc error_func(&xml_errors, &XmlErrorFunc);
-
-  XmlReader xml_reader;
-  if (!xml_reader.Load(xml_contents))
-    return false;
-
-  enum {
-    STATE_INIT,
-    STATE_TESTSUITE,
-    STATE_TESTCASE,
-    STATE_TEST_RESULT,
-    STATE_FAILURE,
-    STATE_END,
-  } state = STATE_INIT;
-
-  while (xml_reader.Read()) {
-    xml_reader.SkipToElement();
-    std::string node_name(xml_reader.NodeName());
-
-    switch (state) {
-      case STATE_INIT:
-        if (node_name == "testsuites" && !xml_reader.IsClosingElement())
-          state = STATE_TESTSUITE;
-        else
-          return false;
-        break;
-      case STATE_TESTSUITE:
-        if (node_name == "testsuites" && xml_reader.IsClosingElement())
-          state = STATE_END;
-        else if (node_name == "testsuite" && !xml_reader.IsClosingElement())
-          state = STATE_TESTCASE;
-        else
-          return false;
-        break;
-      case STATE_TESTCASE:
-        if (node_name == "testsuite" && xml_reader.IsClosingElement()) {
-          state = STATE_TESTSUITE;
-        } else if (node_name == "x-teststart" &&
-                   !xml_reader.IsClosingElement()) {
-          // This is our custom extension that helps recognize which test was
-          // running when the test binary crashed.
-          TestResult result;
-
-          std::string test_case_name;
-          if (!xml_reader.NodeAttribute("classname", &test_case_name))
-            return false;
-          std::string test_name;
-          if (!xml_reader.NodeAttribute("name", &test_name))
-            return false;
-          result.full_name = FormatFullTestName(test_case_name, test_name);
-
-          result.elapsed_time = TimeDelta();
-
-          // Assume the test crashed - we can correct that later.
-          result.status = TestResult::TEST_CRASH;
-
-          results->push_back(result);
-        } else if (node_name == "testcase" && !xml_reader.IsClosingElement()) {
-          std::string test_status;
-          if (!xml_reader.NodeAttribute("status", &test_status))
-            return false;
-
-          if (test_status != "run" && test_status != "notrun")
-            return false;
-          if (test_status != "run")
-            break;
-
-          TestResult result;
-
-          std::string test_case_name;
-          if (!xml_reader.NodeAttribute("classname", &test_case_name))
-            return false;
-          std::string test_name;
-          if (!xml_reader.NodeAttribute("name", &test_name))
-            return false;
-          result.full_name = test_case_name + "." + test_name;
-
-          std::string test_time_str;
-          if (!xml_reader.NodeAttribute("time", &test_time_str))
-            return false;
-          result.elapsed_time = TimeDelta::FromMicroseconds(
-              static_cast<int64_t>(strtod(test_time_str.c_str(), nullptr) *
-                                   Time::kMicrosecondsPerSecond));
-
-          result.status = TestResult::TEST_SUCCESS;
-
-          if (!results->empty() &&
-              results->back().full_name == result.full_name &&
-              results->back().status == TestResult::TEST_CRASH) {
-            // Erase the fail-safe "crashed" result - now we know the test did
-            // not crash.
-            results->pop_back();
-          }
-
-          results->push_back(result);
-        } else if (node_name == "failure" && !xml_reader.IsClosingElement()) {
-          std::string failure_message;
-          if (!xml_reader.NodeAttribute("message", &failure_message))
-            return false;
-
-          DCHECK(!results->empty());
-          results->back().status = TestResult::TEST_FAILURE;
-
-          state = STATE_FAILURE;
-        } else if (node_name == "testcase" && xml_reader.IsClosingElement()) {
-          // Deliberately empty.
-        } else if (node_name == "x-test-result-part" &&
-                   !xml_reader.IsClosingElement()) {
-          std::string result_type;
-          if (!xml_reader.NodeAttribute("type", &result_type))
-            return false;
-
-          std::string file_name;
-          if (!xml_reader.NodeAttribute("file", &file_name))
-            return false;
-
-          std::string line_number_str;
-          if (!xml_reader.NodeAttribute("line", &line_number_str))
-            return false;
-
-          int line_number;
-          if (!StringToInt(line_number_str, &line_number))
-            return false;
-
-          TestResultPart::Type type;
-          if (!TestResultPart::TypeFromString(result_type, &type))
-            return false;
-
-          TestResultPart test_result_part;
-          test_result_part.type = type;
-          test_result_part.file_name = file_name,
-          test_result_part.line_number = line_number;
-          DCHECK(!results->empty());
-          results->back().test_result_parts.push_back(test_result_part);
-
-          state = STATE_TEST_RESULT;
-        } else {
-          return false;
-        }
-        break;
-      case STATE_TEST_RESULT:
-        if (node_name == "summary" && !xml_reader.IsClosingElement()) {
-          std::string summary;
-          if (!xml_reader.ReadElementContent(&summary))
-            return false;
-
-          if (!Base64Decode(summary, &summary))
-            return false;
-
-          DCHECK(!results->empty());
-          DCHECK(!results->back().test_result_parts.empty());
-          results->back().test_result_parts.back().summary = summary;
-        } else if (node_name == "summary" && xml_reader.IsClosingElement()) {
-        } else if (node_name == "message" && !xml_reader.IsClosingElement()) {
-          std::string message;
-          if (!xml_reader.ReadElementContent(&message))
-            return false;
-
-          if (!Base64Decode(message, &message))
-            return false;
-
-          DCHECK(!results->empty());
-          DCHECK(!results->back().test_result_parts.empty());
-          results->back().test_result_parts.back().message = message;
-        } else if (node_name == "message" && xml_reader.IsClosingElement()) {
-        } else if (node_name == "x-test-result-part" &&
-                   xml_reader.IsClosingElement()) {
-          state = STATE_TESTCASE;
-        } else {
-          return false;
-        }
-        break;
-      case STATE_FAILURE:
-        if (node_name == "failure" && xml_reader.IsClosingElement())
-          state = STATE_TESTCASE;
-        else
-          return false;
-        break;
-      case STATE_END:
-        // If we are here and there are still XML elements, the file has wrong
-        // format.
-        return false;
-    }
-  }
-
-  *crashed = (state != STATE_END);
-  return true;
-}
-
-}  // namespace base
diff --git a/base/test/gtest_xml_util.h b/base/test/gtest_xml_util.h
deleted file mode 100644
index b023f80..0000000
--- a/base/test/gtest_xml_util.h
+++ /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.
-
-#ifndef BASE_TEST_GTEST_XML_UTIL_H_
-#define BASE_TEST_GTEST_XML_UTIL_H_
-
-#include <vector>
-
-#include "base/compiler_specific.h"
-
-namespace base {
-
-class FilePath;
-struct TestResult;
-
-// Produces a vector of test results based on GTest output file.
-// Returns true iff the output file exists and has been successfully parsed.
-// On successful return |crashed| is set to true if the test results
-// are valid but incomplete.
-bool ProcessGTestOutput(const base::FilePath& output_file,
-                        std::vector<TestResult>* results,
-                        bool* crashed) WARN_UNUSED_RESULT;
-
-}  // namespace base
-
-#endif  // BASE_TEST_GTEST_XML_UTIL_H_
diff --git a/base/test/icu_test_util.cc b/base/test/icu_test_util.cc
deleted file mode 100644
index a6f3e55..0000000
--- a/base/test/icu_test_util.cc
+++ /dev/null
@@ -1,39 +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/icu_test_util.h"
-
-#include "base/base_switches.h"
-#include "base/command_line.h"
-#include "base/i18n/icu_util.h"
-#include "base/i18n/rtl.h"
-#include "third_party/icu/source/common/unicode/uloc.h"
-
-namespace base {
-namespace test {
-
-ScopedRestoreICUDefaultLocale::ScopedRestoreICUDefaultLocale()
-    : ScopedRestoreICUDefaultLocale(std::string()) {}
-
-ScopedRestoreICUDefaultLocale::ScopedRestoreICUDefaultLocale(
-    const std::string& locale)
-    : default_locale_(uloc_getDefault()) {
-  if (!locale.empty())
-    i18n::SetICUDefaultLocale(locale.data());
-}
-
-ScopedRestoreICUDefaultLocale::~ScopedRestoreICUDefaultLocale() {
-  i18n::SetICUDefaultLocale(default_locale_.data());
-}
-
-void InitializeICUForTesting() {
-  if (!CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kTestDoNotInitializeIcu)) {
-    i18n::AllowMultipleInitializeCallsForTesting();
-    i18n::InitializeICU();
-  }
-}
-
-}  // namespace test
-}  // namespace base
diff --git a/base/test/icu_test_util.h b/base/test/icu_test_util.h
deleted file mode 100644
index 1a6e47d..0000000
--- a/base/test/icu_test_util.h
+++ /dev/null
@@ -1,35 +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.
-
-#ifndef BASE_TEST_ICU_TEST_UTIL_H_
-#define BASE_TEST_ICU_TEST_UTIL_H_
-
-#include <string>
-
-#include "base/macros.h"
-
-namespace base {
-namespace test {
-
-// In unit tests, prefer ScopedRestoreICUDefaultLocale over
-// calling base::i18n::SetICUDefaultLocale() directly. This scoper makes it
-// harder to accidentally forget to reset the locale.
-class ScopedRestoreICUDefaultLocale {
- public:
-  ScopedRestoreICUDefaultLocale();
-  explicit ScopedRestoreICUDefaultLocale(const std::string& locale);
-  ~ScopedRestoreICUDefaultLocale();
-
- private:
-  const std::string default_locale_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedRestoreICUDefaultLocale);
-};
-
-void InitializeICUForTesting();
-
-}  // namespace test
-}  // namespace base
-
-#endif  // BASE_TEST_ICU_TEST_UTIL_H_
diff --git a/base/test/launcher/test_launcher.cc b/base/test/launcher/test_launcher.cc
deleted file mode 100644
index b5197c5..0000000
--- a/base/test/launcher/test_launcher.cc
+++ /dev/null
@@ -1,1349 +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/launcher/test_launcher.h"
-
-#include <stdio.h>
-
-#include <algorithm>
-#include <map>
-#include <utility>
-
-#include "base/at_exit.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/environment.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_file.h"
-#include "base/format_macros.h"
-#include "base/hash.h"
-#include "base/lazy_instance.h"
-#include "base/location.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/numerics/safe_conversions.h"
-#include "base/process/kill.h"
-#include "base/process/launch.h"
-#include "base/run_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/strings/pattern.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringize_macros.h"
-#include "base/strings/stringprintf.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/sys_info.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/task_scheduler/task_scheduler.h"
-#include "base/test/gtest_util.h"
-#include "base/test/launcher/test_launcher_tracer.h"
-#include "base/test/launcher/test_results_tracker.h"
-#include "base/test/test_switches.h"
-#include "base/test/test_timeouts.h"
-#include "base/threading/thread_restrictions.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_POSIX)
-#include <fcntl.h>
-
-#include "base/files/file_descriptor_watcher_posix.h"
-#endif
-
-#if defined(OS_MACOSX)
-#include "base/mac/scoped_nsautorelease_pool.h"
-#endif
-
-#if defined(OS_WIN)
-#include "base/win/windows_version.h"
-#endif
-
-#if defined(OS_FUCHSIA)
-// TODO(scottmg): For temporary code in OnOutputTimeout().
-#include <zircon/syscalls.h>
-#include <zircon/syscalls/object.h>
-#include "base/fuchsia/default_job.h"
-#endif
-
-namespace base {
-
-// See https://groups.google.com/a/chromium.org/d/msg/chromium-dev/nkdTP7sstSc/uT3FaE_sgkAJ .
-using ::operator<<;
-
-// The environment variable name for the total number of test shards.
-const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
-// The environment variable name for the test shard index.
-const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
-
-namespace {
-
-// Global tag for test runs where the results are incomplete or unreliable
-// for any reason, e.g. early exit because of too many broken tests.
-const char kUnreliableResultsTag[] = "UNRELIABLE_RESULTS";
-
-// Maximum time of no output after which we print list of processes still
-// running. This deliberately doesn't use TestTimeouts (which is otherwise
-// a recommended solution), because they can be increased. This would defeat
-// the purpose of this timeout, which is 1) to avoid buildbot "no output for
-// X seconds" timeout killing the process 2) help communicate status of
-// the test launcher to people looking at the output (no output for a long
-// time is mysterious and gives no info about what is happening) 3) help
-// debugging in case the process hangs anyway.
-constexpr TimeDelta kOutputTimeout = TimeDelta::FromSeconds(15);
-
-// Limit of output snippet lines when printing to stdout.
-// Avoids flooding the logs with amount of output that gums up
-// the infrastructure.
-const size_t kOutputSnippetLinesLimit = 5000;
-
-// Limit of output snippet size. Exceeding this limit
-// results in truncating the output and failing the test.
-const size_t kOutputSnippetBytesLimit = 300 * 1024;
-
-// Set of live launch test processes with corresponding lock (it is allowed
-// for callers to launch processes on different threads).
-Lock* GetLiveProcessesLock() {
-  static auto* lock = new Lock;
-  return lock;
-}
-
-std::map<ProcessHandle, CommandLine>* GetLiveProcesses() {
-  static auto* map = new std::map<ProcessHandle, CommandLine>;
-  return map;
-}
-
-// Performance trace generator.
-TestLauncherTracer* GetTestLauncherTracer() {
-  static auto* tracer = new TestLauncherTracer;
-  return tracer;
-}
-
-// Creates and starts a TaskScheduler with |num_parallel_jobs| dedicated to
-// foreground blocking tasks (corresponds to the traits used to launch and wait
-// for child processes).
-void CreateAndStartTaskScheduler(int num_parallel_jobs) {
-  // These values are taken from TaskScheduler::StartWithDefaultParams(), which
-  // is not used directly to allow a custom number of threads in the foreground
-  // blocking pool.
-  constexpr int kMaxBackgroundThreads = 1;
-  constexpr int kMaxBackgroundBlockingThreads = 2;
-  const int max_foreground_threads =
-      std::max(1, base::SysInfo::NumberOfProcessors());
-  constexpr base::TimeDelta kSuggestedReclaimTime =
-      base::TimeDelta::FromSeconds(30);
-  base::TaskScheduler::Create("TestLauncher");
-  base::TaskScheduler::GetInstance()->Start(
-      {{kMaxBackgroundThreads, kSuggestedReclaimTime},
-       {kMaxBackgroundBlockingThreads, kSuggestedReclaimTime},
-       {max_foreground_threads, kSuggestedReclaimTime},
-       {num_parallel_jobs, kSuggestedReclaimTime}});
-}
-
-// TODO(fuchsia): Fuchsia does not have POSIX signals, but equivalent
-// functionality will probably be necessary eventually. See
-// https://crbug.com/706592.
-#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
-// Self-pipe that makes it possible to do complex shutdown handling
-// outside of the signal handler.
-int g_shutdown_pipe[2] = { -1, -1 };
-
-void ShutdownPipeSignalHandler(int signal) {
-  HANDLE_EINTR(write(g_shutdown_pipe[1], "q", 1));
-}
-
-void KillSpawnedTestProcesses() {
-  // Keep the lock until exiting the process to prevent further processes
-  // from being spawned.
-  AutoLock lock(*GetLiveProcessesLock());
-
-  fprintf(stdout, "Sending SIGTERM to %" PRIuS " child processes... ",
-          GetLiveProcesses()->size());
-  fflush(stdout);
-
-  for (const auto& pair : *GetLiveProcesses()) {
-    // Send the signal to entire process group.
-    kill((-1) * (pair.first), SIGTERM);
-  }
-
-  fprintf(stdout,
-          "done.\nGiving processes a chance to terminate cleanly... ");
-  fflush(stdout);
-
-  PlatformThread::Sleep(TimeDelta::FromMilliseconds(500));
-
-  fprintf(stdout, "done.\n");
-  fflush(stdout);
-
-  fprintf(stdout, "Sending SIGKILL to %" PRIuS " child processes... ",
-          GetLiveProcesses()->size());
-  fflush(stdout);
-
-  for (const auto& pair : *GetLiveProcesses()) {
-    // Send the signal to entire process group.
-    kill((-1) * (pair.first), SIGKILL);
-  }
-
-  fprintf(stdout, "done.\n");
-  fflush(stdout);
-}
-#endif  // defined(OS_POSIX) && !defined(OS_FUCHSIA)
-
-// Parses the environment variable var as an Int32.  If it is unset, returns
-// true.  If it is set, unsets it then converts it to Int32 before
-// returning it in |result|.  Returns true on success.
-bool TakeInt32FromEnvironment(const char* const var, int32_t* result) {
-  std::unique_ptr<Environment> env(Environment::Create());
-  std::string str_val;
-
-  if (!env->GetVar(var, &str_val))
-    return true;
-
-  if (!env->UnSetVar(var)) {
-    LOG(ERROR) << "Invalid environment: we could not unset " << var << ".\n";
-    return false;
-  }
-
-  if (!StringToInt(str_val, result)) {
-    LOG(ERROR) << "Invalid environment: " << var << " is not an integer.\n";
-    return false;
-  }
-
-  return true;
-}
-
-// Unsets the environment variable |name| and returns true on success.
-// Also returns true if the variable just doesn't exist.
-bool UnsetEnvironmentVariableIfExists(const std::string& name) {
-  std::unique_ptr<Environment> env(Environment::Create());
-  std::string str_val;
-  if (!env->GetVar(name, &str_val))
-    return true;
-  return env->UnSetVar(name);
-}
-
-// Returns true if bot mode has been requested, i.e. defaults optimized
-// for continuous integration bots. This way developers don't have to remember
-// special command-line flags.
-bool BotModeEnabled() {
-  std::unique_ptr<Environment> env(Environment::Create());
-  return CommandLine::ForCurrentProcess()->HasSwitch(
-      switches::kTestLauncherBotMode) ||
-      env->HasVar("CHROMIUM_TEST_LAUNCHER_BOT_MODE");
-}
-
-// Returns command line command line after gtest-specific processing
-// and applying |wrapper|.
-CommandLine PrepareCommandLineForGTest(const CommandLine& command_line,
-                                       const std::string& wrapper) {
-  CommandLine new_command_line(command_line.GetProgram());
-  CommandLine::SwitchMap switches = command_line.GetSwitches();
-
-  // Strip out gtest_repeat flag - this is handled by the launcher process.
-  switches.erase(kGTestRepeatFlag);
-
-  // Don't try to write the final XML report in child processes.
-  switches.erase(kGTestOutputFlag);
-
-  for (CommandLine::SwitchMap::const_iterator iter = switches.begin();
-       iter != switches.end(); ++iter) {
-    new_command_line.AppendSwitchNative((*iter).first, (*iter).second);
-  }
-
-  // Prepend wrapper after last CommandLine quasi-copy operation. CommandLine
-  // does not really support removing switches well, and trying to do that
-  // on a CommandLine with a wrapper is known to break.
-  // TODO(phajdan.jr): Give it a try to support CommandLine removing switches.
-#if defined(OS_WIN)
-  new_command_line.PrependWrapper(ASCIIToUTF16(wrapper));
-#elif defined(OS_POSIX)
-  new_command_line.PrependWrapper(wrapper);
-#endif
-
-  return new_command_line;
-}
-
-// Launches a child process using |command_line|. If the child process is still
-// running after |timeout|, it is terminated and |*was_timeout| is set to true.
-// Returns exit code of the process.
-int LaunchChildTestProcessWithOptions(const CommandLine& command_line,
-                                      const LaunchOptions& options,
-                                      int flags,
-                                      TimeDelta timeout,
-                                      ProcessLifetimeObserver* observer,
-                                      bool* was_timeout) {
-  TimeTicks start_time(TimeTicks::Now());
-#if defined(OS_FUCHSIA)  // TODO(scottmg): https://crbug.com/755282
-  const bool kOnBot = getenv("CHROME_HEADLESS") != nullptr;
-#endif  // OS_FUCHSIA
-
-#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
-  // Make sure an option we rely on is present - see LaunchChildGTestProcess.
-  DCHECK(options.new_process_group);
-#endif
-
-  LaunchOptions new_options(options);
-
-#if defined(OS_WIN)
-  DCHECK(!new_options.job_handle);
-
-  win::ScopedHandle job_handle;
-  if (flags & TestLauncher::USE_JOB_OBJECTS) {
-    job_handle.Set(CreateJobObject(NULL, NULL));
-    if (!job_handle.IsValid()) {
-      LOG(ERROR) << "Could not create JobObject.";
-      return -1;
-    }
-
-    DWORD job_flags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
-
-    // Allow break-away from job since sandbox and few other places rely on it
-    // on Windows versions prior to Windows 8 (which supports nested jobs).
-    if (win::GetVersion() < win::VERSION_WIN8 &&
-        flags & TestLauncher::ALLOW_BREAKAWAY_FROM_JOB) {
-      job_flags |= JOB_OBJECT_LIMIT_BREAKAWAY_OK;
-    }
-
-    if (!SetJobObjectLimitFlags(job_handle.Get(), job_flags)) {
-      LOG(ERROR) << "Could not SetJobObjectLimitFlags.";
-      return -1;
-    }
-
-    new_options.job_handle = job_handle.Get();
-  }
-#elif defined(OS_FUCHSIA)
-  DCHECK(!new_options.job_handle);
-
-  ScopedZxHandle job_handle;
-  zx_status_t result = zx_job_create(GetDefaultJob(), 0, job_handle.receive());
-  CHECK_EQ(ZX_OK, result) << "zx_job_create: " << zx_status_get_string(result);
-  new_options.job_handle = job_handle.get();
-#endif  // defined(OS_FUCHSIA)
-
-#if defined(OS_LINUX)
-  // To prevent accidental privilege sharing to an untrusted child, processes
-  // are started with PR_SET_NO_NEW_PRIVS. Do not set that here, since this
-  // new child will be privileged and trusted.
-  new_options.allow_new_privs = true;
-#endif
-
-  Process process;
-
-  {
-    // Note how we grab the lock before the process possibly gets created.
-    // This ensures that when the lock is held, ALL the processes are registered
-    // in the set.
-    AutoLock lock(*GetLiveProcessesLock());
-
-#if defined(OS_WIN)
-    // Allow the handle used to capture stdio and stdout to be inherited by the
-    // child. Note that this is done under GetLiveProcessesLock() to ensure that
-    // only the desired child receives the handle.
-    if (new_options.stdout_handle) {
-      ::SetHandleInformation(new_options.stdout_handle, HANDLE_FLAG_INHERIT,
-                             HANDLE_FLAG_INHERIT);
-    }
-#endif
-
-    process = LaunchProcess(command_line, new_options);
-
-#if defined(OS_WIN)
-    // Revoke inheritance so that the handle isn't leaked into other children.
-    // Note that this is done under GetLiveProcessesLock() to ensure that only
-    // the desired child receives the handle.
-    if (new_options.stdout_handle)
-      ::SetHandleInformation(new_options.stdout_handle, HANDLE_FLAG_INHERIT, 0);
-#endif
-
-    if (!process.IsValid())
-      return -1;
-
-#if defined(OS_FUCHSIA)  // TODO(scottmg): https://crbug.com/755282
-    if (kOnBot) {
-      LOG(ERROR) << base::StringPrintf("adding %x to live process list",
-                                       process.Handle());
-    }
-#endif  // OS_FUCHSIA
-
-    // TODO(rvargas) crbug.com/417532: Don't store process handles.
-    GetLiveProcesses()->insert(std::make_pair(process.Handle(), command_line));
-  }
-
-  if (observer)
-    observer->OnLaunched(process.Handle(), process.Pid());
-
-  int exit_code = 0;
-  bool did_exit = false;
-
-  {
-    base::ScopedAllowBaseSyncPrimitivesForTesting allow_base_sync_primitives;
-    did_exit = process.WaitForExitWithTimeout(timeout, &exit_code);
-  }
-
-  if (!did_exit) {
-    if (observer)
-      observer->OnTimedOut(command_line);
-
-    *was_timeout = true;
-    exit_code = -1;  // Set a non-zero exit code to signal a failure.
-
-#if defined(OS_FUCHSIA)  // TODO(scottmg): https://crbug.com/755282
-    if (kOnBot) {
-      LOG(ERROR) << base::StringPrintf("about to process.Terminate() %x",
-                                       process.Handle());
-    }
-
-    // TODO(crbug.com/799268): Remove once we have debugged timed-out/hung
-    // test job processes.
-    LOG(ERROR) << "Dumping threads in process " << process.Pid();
-
-    CommandLine threads_cmdline(base::FilePath("/boot/bin/threads"));
-    threads_cmdline.AppendArg(IntToString(process.Pid()));
-
-    LaunchOptions threads_options;
-    threads_options.wait = true;
-    LaunchProcess(threads_cmdline, threads_options);
-#endif  // OS_FUCHSIA
-    {
-      base::ScopedAllowBaseSyncPrimitivesForTesting allow_base_sync_primitives;
-      // Ensure that the process terminates.
-      process.Terminate(-1, true);
-    }
-  }
-
-  {
-    // Note how we grab the log before issuing a possibly broad process kill.
-    // Other code parts that grab the log kill processes, so avoid trying
-    // to do that twice and trigger all kinds of log messages.
-    AutoLock lock(*GetLiveProcessesLock());
-
-#if defined(OS_FUCHSIA)
-    // TODO(scottmg): https://crbug.com/755282
-    if (kOnBot) {
-      LOG(ERROR) << base::StringPrintf("going to zx_task_kill(job) for %x",
-                                       process.Handle());
-    }
-
-    CHECK_EQ(zx_task_kill(job_handle.get()), ZX_OK);
-#elif defined(OS_POSIX)
-    if (exit_code != 0) {
-      // On POSIX, in case the test does not exit cleanly, either due to a crash
-      // or due to it timing out, we need to clean up any child processes that
-      // it might have created. On Windows, child processes are automatically
-      // cleaned up using JobObjects.
-      KillProcessGroup(process.Handle());
-    }
-#endif
-
-#if defined(OS_FUCHSIA)  // TODO(scottmg): https://crbug.com/755282
-    if (kOnBot) {
-      LOG(ERROR) << base::StringPrintf("removing %x from live process list",
-                                       process.Handle());
-    }
-#endif  // OS_FUCHSIA
-    GetLiveProcesses()->erase(process.Handle());
-  }
-
-  GetTestLauncherTracer()->RecordProcessExecution(
-      start_time, TimeTicks::Now() - start_time);
-
-  return exit_code;
-}
-
-void DoLaunchChildTestProcess(
-    const CommandLine& command_line,
-    TimeDelta timeout,
-    const TestLauncher::LaunchOptions& test_launch_options,
-    bool redirect_stdio,
-    SingleThreadTaskRunner* task_runner,
-    std::unique_ptr<ProcessLifetimeObserver> observer) {
-  TimeTicks start_time = TimeTicks::Now();
-
-  ScopedFILE output_file;
-  FilePath output_filename;
-  if (redirect_stdio) {
-    FILE* raw_output_file = CreateAndOpenTemporaryFile(&output_filename);
-    output_file.reset(raw_output_file);
-    CHECK(output_file);
-  }
-
-  LaunchOptions options;
-#if defined(OS_WIN)
-  options.inherit_mode = test_launch_options.inherit_mode;
-  options.handles_to_inherit = test_launch_options.handles_to_inherit;
-  if (redirect_stdio) {
-    HANDLE handle =
-        reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(output_file.get())));
-    CHECK_NE(INVALID_HANDLE_VALUE, handle);
-    options.stdin_handle = INVALID_HANDLE_VALUE;
-    options.stdout_handle = handle;
-    options.stderr_handle = handle;
-    // See LaunchOptions.stdout_handle comments for why this compares against
-    // FILE_TYPE_CHAR.
-    if (options.inherit_mode == base::LaunchOptions::Inherit::kSpecific &&
-        GetFileType(handle) != FILE_TYPE_CHAR) {
-      options.handles_to_inherit.push_back(handle);
-    }
-  }
-#elif defined(OS_POSIX)
-  options.fds_to_remap = test_launch_options.fds_to_remap;
-  if (redirect_stdio) {
-    int output_file_fd = fileno(output_file.get());
-    CHECK_LE(0, output_file_fd);
-    options.fds_to_remap.push_back(
-        std::make_pair(output_file_fd, STDOUT_FILENO));
-    options.fds_to_remap.push_back(
-        std::make_pair(output_file_fd, STDERR_FILENO));
-  }
-
-#if !defined(OS_FUCHSIA)
-  options.new_process_group = true;
-#endif
-#if defined(OS_LINUX)
-  options.kill_on_parent_death = true;
-#endif
-
-#endif  // defined(OS_POSIX)
-
-  bool was_timeout = false;
-  int exit_code = LaunchChildTestProcessWithOptions(
-      command_line, options, test_launch_options.flags, timeout, observer.get(),
-      &was_timeout);
-
-  std::string output_file_contents;
-  if (redirect_stdio) {
-    fflush(output_file.get());
-    output_file.reset();
-    CHECK(ReadFileToString(output_filename, &output_file_contents))
-        << output_filename;
-
-    if (!DeleteFile(output_filename, false)) {
-      // This needs to be non-fatal at least for Windows.
-      LOG(WARNING) << "Failed to delete " << output_filename.AsUTF8Unsafe();
-    }
-  }
-
-  // Invoke OnCompleted on the thread it was originating from, not on a worker
-  // pool thread.
-  task_runner->PostTask(
-      FROM_HERE,
-      BindOnce(&ProcessLifetimeObserver::OnCompleted, std::move(observer),
-               exit_code, TimeTicks::Now() - start_time, was_timeout,
-               output_file_contents));
-}
-
-}  // namespace
-
-const char kGTestBreakOnFailure[] = "gtest_break_on_failure";
-const char kGTestFilterFlag[] = "gtest_filter";
-const char kGTestFlagfileFlag[] = "gtest_flagfile";
-const char kGTestHelpFlag[]   = "gtest_help";
-const char kGTestListTestsFlag[] = "gtest_list_tests";
-const char kGTestRepeatFlag[] = "gtest_repeat";
-const char kGTestRunDisabledTestsFlag[] = "gtest_also_run_disabled_tests";
-const char kGTestOutputFlag[] = "gtest_output";
-
-TestLauncherDelegate::~TestLauncherDelegate() = default;
-
-TestLauncher::LaunchOptions::LaunchOptions() = default;
-TestLauncher::LaunchOptions::LaunchOptions(const LaunchOptions& other) =
-    default;
-TestLauncher::LaunchOptions::~LaunchOptions() = default;
-
-TestLauncher::TestLauncher(TestLauncherDelegate* launcher_delegate,
-                           size_t parallel_jobs)
-    : launcher_delegate_(launcher_delegate),
-      total_shards_(1),
-      shard_index_(0),
-      cycles_(1),
-      test_found_count_(0),
-      test_started_count_(0),
-      test_finished_count_(0),
-      test_success_count_(0),
-      test_broken_count_(0),
-      retry_count_(0),
-      retry_limit_(0),
-      force_run_broken_tests_(false),
-      run_result_(true),
-      watchdog_timer_(FROM_HERE,
-                      kOutputTimeout,
-                      this,
-                      &TestLauncher::OnOutputTimeout),
-      parallel_jobs_(parallel_jobs) {}
-
-TestLauncher::~TestLauncher() {
-  base::TaskScheduler::GetInstance()->Shutdown();
-}
-
-bool TestLauncher::Run() {
-  if (!Init())
-    return false;
-
-  // Value of |cycles_| changes after each iteration. Keep track of the
-  // original value.
-  int requested_cycles = cycles_;
-
-// TODO(fuchsia): Fuchsia does not have POSIX signals. Something similiar to
-// this will likely need to be implemented. See https://crbug.com/706592.
-#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
-  CHECK_EQ(0, pipe(g_shutdown_pipe));
-
-  struct sigaction action;
-  memset(&action, 0, sizeof(action));
-  sigemptyset(&action.sa_mask);
-  action.sa_handler = &ShutdownPipeSignalHandler;
-
-  CHECK_EQ(0, sigaction(SIGINT, &action, nullptr));
-  CHECK_EQ(0, sigaction(SIGQUIT, &action, nullptr));
-  CHECK_EQ(0, sigaction(SIGTERM, &action, nullptr));
-
-  auto controller = base::FileDescriptorWatcher::WatchReadable(
-      g_shutdown_pipe[0],
-      base::Bind(&TestLauncher::OnShutdownPipeReadable, Unretained(this)));
-#endif  // defined(OS_POSIX) && !defined(OS_FUCHSIA)
-
-  // Start the watchdog timer.
-  watchdog_timer_.Reset();
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&TestLauncher::RunTestIteration, Unretained(this)));
-
-  RunLoop().Run();
-
-  if (requested_cycles != 1)
-    results_tracker_.PrintSummaryOfAllIterations();
-
-  MaybeSaveSummaryAsJSON(std::vector<std::string>());
-
-  return run_result_;
-}
-
-void TestLauncher::LaunchChildGTestProcess(
-    const CommandLine& command_line,
-    const std::string& wrapper,
-    TimeDelta timeout,
-    const LaunchOptions& options,
-    std::unique_ptr<ProcessLifetimeObserver> observer) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // Record the exact command line used to launch the child.
-  CommandLine new_command_line(
-      PrepareCommandLineForGTest(command_line, wrapper));
-
-  // When running in parallel mode we need to redirect stdio to avoid mixed-up
-  // output. We also always redirect on the bots to get the test output into
-  // JSON summary.
-  bool redirect_stdio = (parallel_jobs_ > 1) || BotModeEnabled();
-
-  PostTaskWithTraits(
-      FROM_HERE, {MayBlock(), TaskShutdownBehavior::BLOCK_SHUTDOWN},
-      BindOnce(&DoLaunchChildTestProcess, new_command_line, timeout, options,
-               redirect_stdio, RetainedRef(ThreadTaskRunnerHandle::Get()),
-               std::move(observer)));
-}
-
-void TestLauncher::OnTestFinished(const TestResult& original_result) {
-  ++test_finished_count_;
-
-  TestResult result(original_result);
-
-  if (result.output_snippet.length() > kOutputSnippetBytesLimit) {
-    if (result.status == TestResult::TEST_SUCCESS)
-      result.status = TestResult::TEST_EXCESSIVE_OUTPUT;
-
-    // Keep the top and bottom of the log and truncate the middle part.
-    result.output_snippet =
-        result.output_snippet.substr(0, kOutputSnippetBytesLimit / 2) + "\n" +
-        StringPrintf("<truncated (%" PRIuS " bytes)>\n",
-                     result.output_snippet.length()) +
-        result.output_snippet.substr(result.output_snippet.length() -
-                                     kOutputSnippetBytesLimit / 2) +
-        "\n";
-  }
-
-  bool print_snippet = false;
-  std::string print_test_stdio("auto");
-  if (CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kTestLauncherPrintTestStdio)) {
-    print_test_stdio = CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-        switches::kTestLauncherPrintTestStdio);
-  }
-  if (print_test_stdio == "auto") {
-    print_snippet = (result.status != TestResult::TEST_SUCCESS);
-  } else if (print_test_stdio == "always") {
-    print_snippet = true;
-  } else if (print_test_stdio == "never") {
-    print_snippet = false;
-  } else {
-    LOG(WARNING) << "Invalid value of " << switches::kTestLauncherPrintTestStdio
-                 << ": " << print_test_stdio;
-  }
-  if (print_snippet) {
-    std::vector<base::StringPiece> snippet_lines =
-        SplitStringPiece(result.output_snippet, "\n", base::KEEP_WHITESPACE,
-                         base::SPLIT_WANT_ALL);
-    if (snippet_lines.size() > kOutputSnippetLinesLimit) {
-      size_t truncated_size = snippet_lines.size() - kOutputSnippetLinesLimit;
-      snippet_lines.erase(
-          snippet_lines.begin(),
-          snippet_lines.begin() + truncated_size);
-      snippet_lines.insert(snippet_lines.begin(), "<truncated>");
-    }
-    fprintf(stdout, "%s", base::JoinString(snippet_lines, "\n").c_str());
-    fflush(stdout);
-  }
-
-  if (result.status == TestResult::TEST_SUCCESS) {
-    ++test_success_count_;
-  } else {
-    tests_to_retry_.insert(result.full_name);
-  }
-
-  results_tracker_.AddTestResult(result);
-
-  // TODO(phajdan.jr): Align counter (padding).
-  std::string status_line(
-      StringPrintf("[%" PRIuS "/%" PRIuS "] %s ",
-                   test_finished_count_,
-                   test_started_count_,
-                   result.full_name.c_str()));
-  if (result.completed()) {
-    status_line.append(StringPrintf("(%" PRId64 " ms)",
-                                    result.elapsed_time.InMilliseconds()));
-  } else if (result.status == TestResult::TEST_TIMEOUT) {
-    status_line.append("(TIMED OUT)");
-  } else if (result.status == TestResult::TEST_CRASH) {
-    status_line.append("(CRASHED)");
-  } else if (result.status == TestResult::TEST_SKIPPED) {
-    status_line.append("(SKIPPED)");
-  } else if (result.status == TestResult::TEST_UNKNOWN) {
-    status_line.append("(UNKNOWN)");
-  } else {
-    // Fail very loudly so it's not ignored.
-    CHECK(false) << "Unhandled test result status: " << result.status;
-  }
-  fprintf(stdout, "%s\n", status_line.c_str());
-  fflush(stdout);
-
-  // We just printed a status line, reset the watchdog timer.
-  watchdog_timer_.Reset();
-
-  // Do not waste time on timeouts. We include tests with unknown results here
-  // because sometimes (e.g. hang in between unit tests) that's how a timeout
-  // gets reported.
-  if (result.status == TestResult::TEST_TIMEOUT ||
-      result.status == TestResult::TEST_UNKNOWN) {
-    test_broken_count_++;
-  }
-  size_t broken_threshold =
-      std::max(static_cast<size_t>(20), test_found_count_ / 10);
-  if (!force_run_broken_tests_ && test_broken_count_ >= broken_threshold) {
-    fprintf(stdout, "Too many badly broken tests (%" PRIuS "), exiting now.\n",
-            test_broken_count_);
-    fflush(stdout);
-
-#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
-    KillSpawnedTestProcesses();
-#endif  // defined(OS_POSIX) && !defined(OS_FUCHSIA)
-
-    MaybeSaveSummaryAsJSON({"BROKEN_TEST_EARLY_EXIT", kUnreliableResultsTag});
-
-    exit(1);
-  }
-
-  if (test_finished_count_ != test_started_count_)
-    return;
-
-  if (tests_to_retry_.empty() || retry_count_ >= retry_limit_) {
-    OnTestIterationFinished();
-    return;
-  }
-
-  if (!force_run_broken_tests_ && tests_to_retry_.size() >= broken_threshold) {
-    fprintf(stdout,
-            "Too many failing tests (%" PRIuS "), skipping retries.\n",
-            tests_to_retry_.size());
-    fflush(stdout);
-
-    results_tracker_.AddGlobalTag("BROKEN_TEST_SKIPPED_RETRIES");
-    results_tracker_.AddGlobalTag(kUnreliableResultsTag);
-
-    OnTestIterationFinished();
-    return;
-  }
-
-  retry_count_++;
-
-  std::vector<std::string> test_names(tests_to_retry_.begin(),
-                                      tests_to_retry_.end());
-
-  tests_to_retry_.clear();
-
-  size_t retry_started_count = launcher_delegate_->RetryTests(this, test_names);
-  if (retry_started_count == 0) {
-    // Signal failure, but continue to run all requested test iterations.
-    // With the summary of all iterations at the end this is a good default.
-    run_result_ = false;
-
-    OnTestIterationFinished();
-    return;
-  }
-
-  fprintf(stdout, "Retrying %" PRIuS " test%s (retry #%" PRIuS ")\n",
-          retry_started_count,
-          retry_started_count > 1 ? "s" : "",
-          retry_count_);
-  fflush(stdout);
-
-  test_started_count_ += retry_started_count;
-}
-
-// Helper used to parse test filter files. Syntax is documented in
-// //testing/buildbot/filters/README.md .
-bool LoadFilterFile(const FilePath& file_path,
-                    std::vector<std::string>* positive_filter,
-                    std::vector<std::string>* negative_filter) {
-  std::string file_content;
-  if (!ReadFileToString(file_path, &file_content)) {
-    LOG(ERROR) << "Failed to read the filter file.";
-    return false;
-  }
-
-  std::vector<std::string> filter_lines = SplitString(
-      file_content, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  int line_num = 0;
-  for (const std::string& filter_line : filter_lines) {
-    line_num++;
-
-    size_t hash_pos = filter_line.find('#');
-
-    // In case when # symbol is not in the beginning of the line and is not
-    // proceeded with a space then it's likely that the comment was
-    // unintentional.
-    if (hash_pos != std::string::npos && hash_pos > 0 &&
-        filter_line[hash_pos - 1] != ' ') {
-      LOG(WARNING) << "Content of line " << line_num << " in " << file_path
-                   << " after # is treated as a comment, " << filter_line;
-    }
-
-    // Strip comments and whitespace from each line.
-    std::string trimmed_line =
-        TrimWhitespaceASCII(filter_line.substr(0, hash_pos), TRIM_ALL)
-            .as_string();
-
-    if (trimmed_line.substr(0, 2) == "//") {
-      LOG(ERROR) << "Line " << line_num << " in " << file_path
-                 << " starts with //, use # for comments.";
-      return false;
-    }
-
-    // Treat a line starting with '//' as a comment.
-    if (trimmed_line.empty())
-      continue;
-
-    if (trimmed_line[0] == '-')
-      negative_filter->push_back(trimmed_line.substr(1));
-    else
-      positive_filter->push_back(trimmed_line);
-  }
-
-  return true;
-}
-
-bool TestLauncher::Init() {
-  const CommandLine* command_line = CommandLine::ForCurrentProcess();
-
-  // Initialize sharding. Command line takes precedence over legacy environment
-  // variables.
-  if (command_line->HasSwitch(switches::kTestLauncherTotalShards) &&
-      command_line->HasSwitch(switches::kTestLauncherShardIndex)) {
-    if (!StringToInt(
-            command_line->GetSwitchValueASCII(
-                switches::kTestLauncherTotalShards),
-            &total_shards_)) {
-      LOG(ERROR) << "Invalid value for " << switches::kTestLauncherTotalShards;
-      return false;
-    }
-    if (!StringToInt(
-            command_line->GetSwitchValueASCII(
-                switches::kTestLauncherShardIndex),
-            &shard_index_)) {
-      LOG(ERROR) << "Invalid value for " << switches::kTestLauncherShardIndex;
-      return false;
-    }
-    fprintf(stdout,
-            "Using sharding settings from command line. This is shard %d/%d\n",
-            shard_index_, total_shards_);
-    fflush(stdout);
-  } else {
-    if (!TakeInt32FromEnvironment(kTestTotalShards, &total_shards_))
-      return false;
-    if (!TakeInt32FromEnvironment(kTestShardIndex, &shard_index_))
-      return false;
-    fprintf(stdout,
-            "Using sharding settings from environment. This is shard %d/%d\n",
-            shard_index_, total_shards_);
-    fflush(stdout);
-  }
-  if (shard_index_ < 0 ||
-      total_shards_ < 0 ||
-      shard_index_ >= total_shards_) {
-    LOG(ERROR) << "Invalid sharding settings: we require 0 <= "
-               << kTestShardIndex << " < " << kTestTotalShards
-               << ", but you have " << kTestShardIndex << "=" << shard_index_
-               << ", " << kTestTotalShards << "=" << total_shards_ << ".\n";
-    return false;
-  }
-
-  // Make sure we don't pass any sharding-related environment to the child
-  // processes. This test launcher implements the sharding completely.
-  CHECK(UnsetEnvironmentVariableIfExists("GTEST_TOTAL_SHARDS"));
-  CHECK(UnsetEnvironmentVariableIfExists("GTEST_SHARD_INDEX"));
-
-  if (command_line->HasSwitch(kGTestRepeatFlag) &&
-      !StringToInt(command_line->GetSwitchValueASCII(kGTestRepeatFlag),
-                   &cycles_)) {
-    LOG(ERROR) << "Invalid value for " << kGTestRepeatFlag;
-    return false;
-  }
-
-  if (command_line->HasSwitch(switches::kTestLauncherRetryLimit)) {
-    int retry_limit = -1;
-    if (!StringToInt(command_line->GetSwitchValueASCII(
-                         switches::kTestLauncherRetryLimit), &retry_limit) ||
-        retry_limit < 0) {
-      LOG(ERROR) << "Invalid value for " << switches::kTestLauncherRetryLimit;
-      return false;
-    }
-
-    retry_limit_ = retry_limit;
-  } else if (!command_line->HasSwitch(kGTestFilterFlag) || BotModeEnabled()) {
-    // Retry failures 3 times by default if we are running all of the tests or
-    // in bot mode.
-    retry_limit_ = 3;
-  }
-
-  if (command_line->HasSwitch(switches::kTestLauncherForceRunBrokenTests))
-    force_run_broken_tests_ = true;
-
-  fprintf(stdout, "Using %" PRIuS " parallel jobs.\n", parallel_jobs_);
-  fflush(stdout);
-
-  CreateAndStartTaskScheduler(static_cast<int>(parallel_jobs_));
-
-  std::vector<std::string> positive_file_filter;
-  std::vector<std::string> positive_gtest_filter;
-
-  if (command_line->HasSwitch(switches::kTestLauncherFilterFile)) {
-    base::FilePath filter_file_path = base::MakeAbsoluteFilePath(
-        command_line->GetSwitchValuePath(switches::kTestLauncherFilterFile));
-    if (!LoadFilterFile(filter_file_path, &positive_file_filter,
-                        &negative_test_filter_))
-      return false;
-  }
-
-  // Split --gtest_filter at '-', if there is one, to separate into
-  // positive filter and negative filter portions.
-  std::string filter = command_line->GetSwitchValueASCII(kGTestFilterFlag);
-  size_t dash_pos = filter.find('-');
-  if (dash_pos == std::string::npos) {
-    positive_gtest_filter =
-        SplitString(filter, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL);
-  } else {
-    // Everything up to the dash.
-    positive_gtest_filter =
-        SplitString(filter.substr(0, dash_pos), ":", base::TRIM_WHITESPACE,
-                    base::SPLIT_WANT_ALL);
-
-    // Everything after the dash.
-    for (std::string pattern :
-         SplitString(filter.substr(dash_pos + 1), ":", base::TRIM_WHITESPACE,
-                     base::SPLIT_WANT_ALL)) {
-      negative_test_filter_.push_back(pattern);
-    }
-  }
-
-  if (!launcher_delegate_->GetTests(&tests_)) {
-    LOG(ERROR) << "Failed to get list of tests.";
-    return false;
-  }
-
-  CombinePositiveTestFilters(std::move(positive_gtest_filter),
-                             std::move(positive_file_filter));
-
-  if (!results_tracker_.Init(*command_line)) {
-    LOG(ERROR) << "Failed to initialize test results tracker.";
-    return 1;
-  }
-
-#if defined(NDEBUG)
-  results_tracker_.AddGlobalTag("MODE_RELEASE");
-#else
-  results_tracker_.AddGlobalTag("MODE_DEBUG");
-#endif
-
-  // Operating systems (sorted alphabetically).
-  // Note that they can deliberately overlap, e.g. OS_LINUX is a subset
-  // of OS_POSIX.
-#if defined(OS_ANDROID)
-  results_tracker_.AddGlobalTag("OS_ANDROID");
-#endif
-
-#if defined(OS_BSD)
-  results_tracker_.AddGlobalTag("OS_BSD");
-#endif
-
-#if defined(OS_FREEBSD)
-  results_tracker_.AddGlobalTag("OS_FREEBSD");
-#endif
-
-#if defined(OS_FUCHSIA)
-  results_tracker_.AddGlobalTag("OS_FUCHSIA");
-#endif
-
-#if defined(OS_IOS)
-  results_tracker_.AddGlobalTag("OS_IOS");
-#endif
-
-#if defined(OS_LINUX)
-  results_tracker_.AddGlobalTag("OS_LINUX");
-#endif
-
-#if defined(OS_MACOSX)
-  results_tracker_.AddGlobalTag("OS_MACOSX");
-#endif
-
-#if defined(OS_NACL)
-  results_tracker_.AddGlobalTag("OS_NACL");
-#endif
-
-#if defined(OS_OPENBSD)
-  results_tracker_.AddGlobalTag("OS_OPENBSD");
-#endif
-
-#if defined(OS_POSIX)
-  results_tracker_.AddGlobalTag("OS_POSIX");
-#endif
-
-#if defined(OS_SOLARIS)
-  results_tracker_.AddGlobalTag("OS_SOLARIS");
-#endif
-
-#if defined(OS_WIN)
-  results_tracker_.AddGlobalTag("OS_WIN");
-#endif
-
-  // CPU-related tags.
-#if defined(ARCH_CPU_32_BITS)
-  results_tracker_.AddGlobalTag("CPU_32_BITS");
-#endif
-
-#if defined(ARCH_CPU_64_BITS)
-  results_tracker_.AddGlobalTag("CPU_64_BITS");
-#endif
-
-  return true;
-}
-
-void TestLauncher::CombinePositiveTestFilters(
-    std::vector<std::string> filter_a,
-    std::vector<std::string> filter_b) {
-  has_at_least_one_positive_filter_ = !filter_a.empty() || !filter_b.empty();
-  if (!has_at_least_one_positive_filter_) {
-    return;
-  }
-  // If two positive filters are present, only run tests that match a pattern
-  // in both filters.
-  if (!filter_a.empty() && !filter_b.empty()) {
-    for (size_t i = 0; i < tests_.size(); i++) {
-      std::string test_name =
-          FormatFullTestName(tests_[i].test_case_name, tests_[i].test_name);
-      bool found_a = false;
-      bool found_b = false;
-      for (size_t k = 0; k < filter_a.size(); ++k) {
-        found_a = found_a || MatchPattern(test_name, filter_a[k]);
-      }
-      for (size_t k = 0; k < filter_b.size(); ++k) {
-        found_b = found_b || MatchPattern(test_name, filter_b[k]);
-      }
-      if (found_a && found_b) {
-        positive_test_filter_.push_back(test_name);
-      }
-    }
-  } else if (!filter_a.empty()) {
-    positive_test_filter_ = std::move(filter_a);
-  } else {
-    positive_test_filter_ = std::move(filter_b);
-  }
-}
-
-void TestLauncher::RunTests() {
-  std::vector<std::string> test_names;
-  const CommandLine* command_line = CommandLine::ForCurrentProcess();
-  for (const TestIdentifier& test_id : tests_) {
-    std::string test_name =
-        FormatFullTestName(test_id.test_case_name, test_id.test_name);
-
-    results_tracker_.AddTest(test_name);
-
-    if (test_name.find("DISABLED") != std::string::npos) {
-      results_tracker_.AddDisabledTest(test_name);
-
-      // Skip disabled tests unless explicitly requested.
-      if (!command_line->HasSwitch(kGTestRunDisabledTestsFlag))
-        continue;
-    }
-
-    if (!launcher_delegate_->ShouldRunTest(test_id.test_case_name,
-                                           test_id.test_name)) {
-      continue;
-    }
-
-    // Count tests in the binary, before we apply filter and sharding.
-    test_found_count_++;
-
-    std::string test_name_no_disabled =
-        TestNameWithoutDisabledPrefix(test_name);
-
-    // Skip the test that doesn't match the filter (if given).
-    if (has_at_least_one_positive_filter_) {
-      bool found = false;
-      for (auto filter : positive_test_filter_) {
-        if (MatchPattern(test_name, filter) ||
-            MatchPattern(test_name_no_disabled, filter)) {
-          found = true;
-          break;
-        }
-      }
-
-      if (!found)
-        continue;
-    }
-    if (!negative_test_filter_.empty()) {
-      bool excluded = false;
-      for (auto filter : negative_test_filter_) {
-        if (MatchPattern(test_name, filter) ||
-            MatchPattern(test_name_no_disabled, filter)) {
-          excluded = true;
-          break;
-        }
-      }
-
-      if (excluded)
-        continue;
-    }
-
-    if (Hash(test_name) % total_shards_ != static_cast<uint32_t>(shard_index_))
-      continue;
-
-    // Report test locations after applying all filters, so that we report test
-    // locations only for those tests that were run as part of this shard.
-    results_tracker_.AddTestLocation(test_name, test_id.file, test_id.line);
-
-    test_names.push_back(test_name);
-  }
-
-  // Save an early test summary in case the launcher crashes or gets killed.
-  MaybeSaveSummaryAsJSON({"EARLY_SUMMARY", kUnreliableResultsTag});
-
-  test_started_count_ = launcher_delegate_->RunTests(this, test_names);
-
-  if (test_started_count_ == 0) {
-    fprintf(stdout, "0 tests run\n");
-    fflush(stdout);
-
-    // No tests have actually been started, so kick off the next iteration.
-    ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, BindOnce(&TestLauncher::RunTestIteration, Unretained(this)));
-  }
-}
-
-void TestLauncher::RunTestIteration() {
-  const bool stop_on_failure =
-      CommandLine::ForCurrentProcess()->HasSwitch(kGTestBreakOnFailure);
-  if (cycles_ == 0 ||
-      (stop_on_failure && test_success_count_ != test_finished_count_)) {
-    RunLoop::QuitCurrentWhenIdleDeprecated();
-    return;
-  }
-
-  // Special value "-1" means "repeat indefinitely".
-  cycles_ = (cycles_ == -1) ? cycles_ : cycles_ - 1;
-
-  test_found_count_ = 0;
-  test_started_count_ = 0;
-  test_finished_count_ = 0;
-  test_success_count_ = 0;
-  test_broken_count_ = 0;
-  retry_count_ = 0;
-  tests_to_retry_.clear();
-  results_tracker_.OnTestIterationStarting();
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&TestLauncher::RunTests, Unretained(this)));
-}
-
-#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
-// I/O watcher for the reading end of the self-pipe above.
-// Terminates any launched child processes and exits the process.
-void TestLauncher::OnShutdownPipeReadable() {
-  fprintf(stdout, "\nCaught signal. Killing spawned test processes...\n");
-  fflush(stdout);
-
-  KillSpawnedTestProcesses();
-
-  MaybeSaveSummaryAsJSON({"CAUGHT_TERMINATION_SIGNAL", kUnreliableResultsTag});
-
-  // The signal would normally kill the process, so exit now.
-  _exit(1);
-}
-#endif  // defined(OS_POSIX)
-
-void TestLauncher::MaybeSaveSummaryAsJSON(
-    const std::vector<std::string>& additional_tags) {
-  const CommandLine* command_line = CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch(switches::kTestLauncherSummaryOutput)) {
-    FilePath summary_path(command_line->GetSwitchValuePath(
-                              switches::kTestLauncherSummaryOutput));
-    if (!results_tracker_.SaveSummaryAsJSON(summary_path, additional_tags)) {
-      LOG(ERROR) << "Failed to save test launcher output summary.";
-    }
-  }
-  if (command_line->HasSwitch(switches::kTestLauncherTrace)) {
-    FilePath trace_path(
-        command_line->GetSwitchValuePath(switches::kTestLauncherTrace));
-    if (!GetTestLauncherTracer()->Dump(trace_path)) {
-      LOG(ERROR) << "Failed to save test launcher trace.";
-    }
-  }
-}
-
-void TestLauncher::OnTestIterationFinished() {
-  TestResultsTracker::TestStatusMap tests_by_status(
-      results_tracker_.GetTestStatusMapForCurrentIteration());
-  if (!tests_by_status[TestResult::TEST_UNKNOWN].empty())
-    results_tracker_.AddGlobalTag(kUnreliableResultsTag);
-
-  // When we retry tests, success is determined by having nothing more
-  // to retry (everything eventually passed), as opposed to having
-  // no failures at all.
-  if (tests_to_retry_.empty()) {
-    fprintf(stdout, "SUCCESS: all tests passed.\n");
-    fflush(stdout);
-  } else {
-    // Signal failure, but continue to run all requested test iterations.
-    // With the summary of all iterations at the end this is a good default.
-    run_result_ = false;
-  }
-
-  results_tracker_.PrintSummaryOfCurrentIteration();
-
-  // Kick off the next iteration.
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, BindOnce(&TestLauncher::RunTestIteration, Unretained(this)));
-}
-
-void TestLauncher::OnOutputTimeout() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  AutoLock lock(*GetLiveProcessesLock());
-
-  fprintf(stdout, "Still waiting for the following processes to finish:\n");
-
-  for (const auto& pair : *GetLiveProcesses()) {
-#if defined(OS_WIN)
-    fwprintf(stdout, L"\t%s\n", pair.second.GetCommandLineString().c_str());
-#else
-    fprintf(stdout, "\t%s\n", pair.second.GetCommandLineString().c_str());
-#endif
-
-#if defined(OS_FUCHSIA)
-    // TODO(scottmg): Temporary code to try to identify why child processes
-    // appear to not be terminated after a timeout correctly.
-    // https://crbug.com/750370 and https://crbug.com/738275.
-
-    zx_info_process_t proc_info = {};
-    zx_status_t status =
-        zx_object_get_info(pair.first, ZX_INFO_PROCESS, &proc_info,
-                           sizeof(proc_info), nullptr, nullptr);
-    if (status != ZX_OK) {
-      fprintf(stdout, "zx_object_get_info failed for '%s', status=%d\n",
-              pair.second.GetCommandLineString().c_str(), status);
-    } else {
-      fprintf(stdout, "  return_code=%d\n", proc_info.return_code);
-      fprintf(stdout, "  started=%d\n", proc_info.started);
-      fprintf(stdout, "  exited=%d\n", proc_info.exited);
-      fprintf(stdout, "  debugger_attached=%d\n", proc_info.debugger_attached);
-    }
-#endif  // OS_FUCHSIA
-  }
-
-  fflush(stdout);
-
-  // Arm the timer again - otherwise it would fire only once.
-  watchdog_timer_.Reset();
-}
-
-size_t NumParallelJobs() {
-  const CommandLine* command_line = CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch(switches::kTestLauncherJobs)) {
-    // If the number of test launcher jobs was specified, return that number.
-    size_t jobs = 0U;
-
-    if (!StringToSizeT(
-            command_line->GetSwitchValueASCII(switches::kTestLauncherJobs),
-            &jobs) ||
-        !jobs) {
-      LOG(ERROR) << "Invalid value for " << switches::kTestLauncherJobs;
-      return 0U;
-    }
-    return jobs;
-  }
-  if (command_line->HasSwitch(kGTestFilterFlag) && !BotModeEnabled()) {
-    // Do not run jobs in parallel by default if we are running a subset of
-    // the tests and if bot mode is off.
-    return 1U;
-  }
-
-  // Default to the number of processor cores.
-  return base::checked_cast<size_t>(SysInfo::NumberOfProcessors());
-}
-
-std::string GetTestOutputSnippet(const TestResult& result,
-                                 const std::string& full_output) {
-  size_t run_pos = full_output.find(std::string("[ RUN      ] ") +
-                                    result.full_name);
-  if (run_pos == std::string::npos)
-    return std::string();
-
-  size_t end_pos = full_output.find(std::string("[  FAILED  ] ") +
-                                    result.full_name,
-                                    run_pos);
-  // Only clip the snippet to the "OK" message if the test really
-  // succeeded. It still might have e.g. crashed after printing it.
-  if (end_pos == std::string::npos &&
-      result.status == TestResult::TEST_SUCCESS) {
-    end_pos = full_output.find(std::string("[       OK ] ") +
-                               result.full_name,
-                               run_pos);
-  }
-  if (end_pos != std::string::npos) {
-    size_t newline_pos = full_output.find("\n", end_pos);
-    if (newline_pos != std::string::npos)
-      end_pos = newline_pos + 1;
-  }
-
-  std::string snippet(full_output.substr(run_pos));
-  if (end_pos != std::string::npos)
-    snippet = full_output.substr(run_pos, end_pos - run_pos);
-
-  return snippet;
-}
-
-}  // namespace base
diff --git a/base/test/launcher/test_launcher.h b/base/test/launcher/test_launcher.h
deleted file mode 100644
index fe9f080..0000000
--- a/base/test/launcher/test_launcher.h
+++ /dev/null
@@ -1,262 +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.
-
-#ifndef BASE_TEST_LAUNCHER_TEST_LAUNCHER_H_
-#define BASE_TEST_LAUNCHER_TEST_LAUNCHER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/process/launch.h"
-#include "base/test/gtest_util.h"
-#include "base/test/launcher/test_result.h"
-#include "base/test/launcher/test_results_tracker.h"
-#include "base/threading/thread_checker.h"
-#include "base/time/time.h"
-#include "base/timer/timer.h"
-#include "build_config.h"
-
-namespace base {
-
-class CommandLine;
-struct LaunchOptions;
-class TestLauncher;
-
-// Constants for GTest command-line flags.
-extern const char kGTestFilterFlag[];
-extern const char kGTestFlagfileFlag[];
-extern const char kGTestHelpFlag[];
-extern const char kGTestListTestsFlag[];
-extern const char kGTestRepeatFlag[];
-extern const char kGTestRunDisabledTestsFlag[];
-extern const char kGTestOutputFlag[];
-
-// Interface for use with LaunchTests that abstracts away exact details
-// which tests and how are run.
-class TestLauncherDelegate {
- public:
-  // Called to get names of tests available for running. The delegate
-  // must put the result in |output| and return true on success.
-  virtual bool GetTests(std::vector<TestIdentifier>* output) = 0;
-
-  // Called before a test is considered for running. If it returns false,
-  // the test is not run. If it returns true, the test will be run provided
-  // it is part of the current shard.
-  virtual bool ShouldRunTest(const std::string& test_case_name,
-                             const std::string& test_name) = 0;
-
-  // Called to make the delegate run the specified tests. The delegate must
-  // return the number of actual tests it's going to run (can be smaller,
-  // equal to, or larger than size of |test_names|). It must also call
-  // |test_launcher|'s OnTestFinished method once per every run test,
-  // regardless of its success.
-  virtual size_t RunTests(TestLauncher* test_launcher,
-                          const std::vector<std::string>& test_names) = 0;
-
-  // Called to make the delegate retry the specified tests. The delegate must
-  // return the number of actual tests it's going to retry (can be smaller,
-  // equal to, or larger than size of |test_names|). It must also call
-  // |test_launcher|'s OnTestFinished method once per every retried test,
-  // regardless of its success.
-  virtual size_t RetryTests(TestLauncher* test_launcher,
-                            const std::vector<std::string>& test_names) = 0;
-
- protected:
-  virtual ~TestLauncherDelegate();
-};
-
-// An observer of child process lifetime events generated by
-// LaunchChildGTestProcess.
-class ProcessLifetimeObserver {
- public:
-  virtual ~ProcessLifetimeObserver() = default;
-
-  // Invoked once the child process is started. |handle| is a handle to the
-  // child process and |id| is its pid. NOTE: this method is invoked on the
-  // thread the process is launched on immediately after it is launched. The
-  // caller owns the ProcessHandle.
-  virtual void OnLaunched(ProcessHandle handle, ProcessId id) {}
-
-  // Invoked when a test process exceeds its runtime, immediately before it is
-  // terminated. |command_line| is the command line used to launch the process.
-  // NOTE: this method is invoked on the thread the process is launched on.
-  virtual void OnTimedOut(const CommandLine& command_line) {}
-
-  // Invoked after a child process finishes, reporting the process |exit_code|,
-  // child process |elapsed_time|, whether or not the process was terminated as
-  // a result of a timeout, and the output of the child (stdout and stderr
-  // together). NOTE: this method is invoked on the same thread as
-  // LaunchChildGTestProcess.
-  virtual void OnCompleted(int exit_code,
-                           TimeDelta elapsed_time,
-                           bool was_timeout,
-                           const std::string& output) {}
-
- protected:
-  ProcessLifetimeObserver() = default;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ProcessLifetimeObserver);
-};
-
-// Launches tests using a TestLauncherDelegate.
-class TestLauncher {
- public:
-  // Flags controlling behavior of LaunchChildGTestProcess.
-  enum LaunchChildGTestProcessFlags {
-    // Allows usage of job objects on Windows. Helps properly clean up child
-    // processes.
-    USE_JOB_OBJECTS = (1 << 0),
-
-    // Allows breakaway from job on Windows. May result in some child processes
-    // not being properly terminated after launcher dies if these processes
-    // fail to cooperate.
-    ALLOW_BREAKAWAY_FROM_JOB = (1 << 1),
-  };
-
-  struct LaunchOptions {
-    LaunchOptions();
-    LaunchOptions(const LaunchOptions& other);
-    ~LaunchOptions();
-
-    int flags = 0;
-    // These mirror values in base::LaunchOptions, see it for details.
-#if defined(OS_WIN)
-    base::LaunchOptions::Inherit inherit_mode =
-        base::LaunchOptions::Inherit::kSpecific;
-    base::HandlesToInheritVector handles_to_inherit;
-#elif defined(OS_POSIX)
-    FileHandleMappingVector fds_to_remap;
-#endif
-  };
-
-  // Constructor. |parallel_jobs| is the limit of simultaneous parallel test
-  // jobs.
-  TestLauncher(TestLauncherDelegate* launcher_delegate, size_t parallel_jobs);
-  ~TestLauncher();
-
-  // Runs the launcher. Must be called at most once.
-  bool Run() WARN_UNUSED_RESULT;
-
-  // Launches a child process (assumed to be gtest-based binary) using
-  // |command_line|. If |wrapper| is not empty, it is prepended to the final
-  // command line. |observer|, if not null, is used to convey process lifetime
-  // events to the caller. |observer| is destroyed after its OnCompleted
-  // method is invoked.
-  void LaunchChildGTestProcess(
-      const CommandLine& command_line,
-      const std::string& wrapper,
-      TimeDelta timeout,
-      const LaunchOptions& options,
-      std::unique_ptr<ProcessLifetimeObserver> observer);
-
-  // Called when a test has finished running.
-  void OnTestFinished(const TestResult& result);
-
- private:
-  bool Init() WARN_UNUSED_RESULT;
-
-  // Runs all tests in current iteration.
-  void RunTests();
-
-  void CombinePositiveTestFilters(std::vector<std::string> filter_a,
-                                  std::vector<std::string> filter_b);
-
-  void RunTestIteration();
-
-#if defined(OS_POSIX)
-  void OnShutdownPipeReadable();
-#endif
-
-  // Saves test results summary as JSON if requested from command line.
-  void MaybeSaveSummaryAsJSON(const std::vector<std::string>& additional_tags);
-
-  // Called when a test iteration is finished.
-  void OnTestIterationFinished();
-
-  // Called by the delay timer when no output was made for a while.
-  void OnOutputTimeout();
-
-  // Make sure we don't accidentally call the wrong methods e.g. on the worker
-  // pool thread.  Should be the first member so that it's destroyed last: when
-  // destroying other members, especially the worker pool, we may check the code
-  // is running on the correct thread.
-  ThreadChecker thread_checker_;
-
-  TestLauncherDelegate* launcher_delegate_;
-
-  // Support for outer sharding, just like gtest does.
-  int32_t total_shards_;  // Total number of outer shards, at least one.
-  int32_t shard_index_;   // Index of shard the launcher is to run.
-
-  int cycles_;  // Number of remaining test itreations, or -1 for infinite.
-
-  // Test filters (empty means no filter).
-  bool has_at_least_one_positive_filter_;
-  std::vector<std::string> positive_test_filter_;
-  std::vector<std::string> negative_test_filter_;
-
-  // Tests to use (cached result of TestLauncherDelegate::GetTests).
-  std::vector<TestIdentifier> tests_;
-
-  // Number of tests found in this binary.
-  size_t test_found_count_;
-
-  // Number of tests started in this iteration.
-  size_t test_started_count_;
-
-  // Number of tests finished in this iteration.
-  size_t test_finished_count_;
-
-  // Number of tests successfully finished in this iteration.
-  size_t test_success_count_;
-
-  // Number of tests either timing out or having an unknown result,
-  // likely indicating a more systemic problem if widespread.
-  size_t test_broken_count_;
-
-  // Number of retries in this iteration.
-  size_t retry_count_;
-
-  // Maximum number of retries per iteration.
-  size_t retry_limit_;
-
-  // If true will not early exit nor skip retries even if too many tests are
-  // broken.
-  bool force_run_broken_tests_;
-
-  // Tests to retry in this iteration.
-  std::set<std::string> tests_to_retry_;
-
-  // Result to be returned from Run.
-  bool run_result_;
-
-  TestResultsTracker results_tracker_;
-
-  // Watchdog timer to make sure we do not go without output for too long.
-  DelayTimer watchdog_timer_;
-
-  // Number of jobs to run in parallel.
-  size_t parallel_jobs_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestLauncher);
-};
-
-// Return the number of parallel jobs to use, or 0U in case of error.
-size_t NumParallelJobs();
-
-// Extract part from |full_output| that applies to |result|.
-std::string GetTestOutputSnippet(const TestResult& result,
-                                 const std::string& full_output);
-
-}  // namespace base
-
-#endif  // BASE_TEST_LAUNCHER_TEST_LAUNCHER_H_
diff --git a/base/test/launcher/test_launcher_nacl_nonsfi.cc b/base/test/launcher/test_launcher_nacl_nonsfi.cc
deleted file mode 100644
index eeb0d92..0000000
--- a/base/test/launcher/test_launcher_nacl_nonsfi.cc
+++ /dev/null
@@ -1,170 +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 <inttypes.h>
-#include <stdio.h>
-
-#include <string>
-
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/message_loop/message_loop.h"
-#include "base/path_service.h"
-#include "base/process/launch.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/string_tokenizer.h"
-#include "base/strings/string_util.h"
-#include "base/sys_info.h"
-#include "base/test/launcher/test_launcher.h"
-#include "base/test/launcher/unit_test_launcher.h"
-#include "base/test/test_switches.h"
-#include "base/test/test_timeouts.h"
-#include "build_config.h"
-
-#if defined(OS_POSIX)
-#include "base/files/file_descriptor_watcher_posix.h"
-#endif
-
-namespace base {
-
-namespace {
-
-const char kHelpFlag[] = "help";
-
-void PrintUsage() {
-  fprintf(stdout,
-          "Runs tests using the gtest framework, each batch of tests being\n"
-          "run in their own process. Supported command-line flags:\n"
-          "\n"
-          " Common flags:\n"
-          "  --gtest_filter=...\n"
-          "    Runs a subset of tests (see --gtest_help for more info).\n"
-          "\n"
-          "  --help\n"
-          "    Shows this message.\n"
-          "\n"
-          " Other flags:\n"
-          "  --test-launcher-retry-limit=N\n"
-          "    Sets the limit of test retries on failures to N.\n"
-          "\n"
-          "  --test-launcher-summary-output=PATH\n"
-          "    Saves a JSON machine-readable summary of the run.\n"
-          "\n"
-          "  --test-launcher-print-test-stdio=auto|always|never\n"
-          "    Controls when full test output is printed.\n"
-          "    auto means to print it when the test failed.\n"
-          "\n"
-          "  --test-launcher-total-shards=N\n"
-          "    Sets the total number of shards to N.\n"
-          "\n"
-          "  --test-launcher-shard-index=N\n"
-          "    Sets the shard index to run to N (from 0 to TOTAL - 1).\n");
-  fflush(stdout);
-}
-
-class NonSfiUnitTestPlatformDelegate : public base::UnitTestPlatformDelegate {
- public:
-  NonSfiUnitTestPlatformDelegate() = default;
-
-  bool Init(const std::string& test_binary) {
-    base::FilePath dir_exe;
-    if (!PathService::Get(base::DIR_EXE, &dir_exe)) {
-      LOG(ERROR) << "Failed to get directory of the current executable.";
-      return false;
-    }
-
-    test_path_ = dir_exe.AppendASCII(test_binary);
-    return true;
-  }
-
- private:
-  bool CreateResultsFile(base::FilePath* path) override {
-    if (!base::CreateNewTempDirectory(base::FilePath::StringType(), path))
-      return false;
-    *path = path->AppendASCII("test_results.xml");
-    return true;
-  }
-
-  bool CreateTemporaryFile(base::FilePath* path) override { return false; }
-
-  bool GetTests(std::vector<base::TestIdentifier>* output) override {
-    base::FilePath output_file;
-    if (!base::CreateTemporaryFile(&output_file)) {
-      LOG(ERROR) << "Failed to create a temp file.";
-      return false;
-    }
-
-    base::CommandLine cmd_line(test_path_);
-    cmd_line.AppendSwitchPath(switches::kTestLauncherListTests, output_file);
-
-    base::LaunchOptions launch_options;
-    launch_options.wait = true;
-
-    if (!base::LaunchProcess(cmd_line, launch_options).IsValid())
-      return false;
-
-    return base::ReadTestNamesFromFile(output_file, output);
-  }
-
-  std::string GetWrapperForChildGTestProcess() override {
-    return std::string();
-  }
-
-  base::CommandLine GetCommandLineForChildGTestProcess(
-      const std::vector<std::string>& test_names,
-      const base::FilePath& output_file,
-      const base::FilePath& flag_file) override {
-    base::CommandLine cmd_line(test_path_);
-    cmd_line.AppendSwitchPath(
-        switches::kTestLauncherOutput, output_file);
-    cmd_line.AppendSwitchASCII(
-        base::kGTestFilterFlag, base::JoinString(test_names, ":"));
-    return cmd_line;
-  }
-
-  void RelaunchTests(base::TestLauncher* test_launcher,
-                     const std::vector<std::string>& test_names,
-                     int launch_flags) override {
-    RunUnitTestsBatch(test_launcher, this, test_names, launch_flags);
-  }
-
-  base::FilePath test_path_;
-};
-
-}  // namespace
-
-int TestLauncherNonSfiMain(const std::string& test_binary) {
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(kHelpFlag)) {
-    PrintUsage();
-    return 0;
-  }
-
-  base::TimeTicks start_time(base::TimeTicks::Now());
-
-  TestTimeouts::Initialize();
-
-  base::MessageLoopForIO message_loop;
-#if defined(OS_POSIX)
-  FileDescriptorWatcher file_descriptor_watcher(&message_loop);
-#endif
-
-  NonSfiUnitTestPlatformDelegate platform_delegate;
-  if (!platform_delegate.Init(test_binary)) {
-    fprintf(stderr, "Failed to initialize test launcher.\n");
-    fflush(stderr);
-    return 1;
-  }
-
-  base::UnitTestLauncherDelegate delegate(&platform_delegate, 10, true);
-  base::TestLauncher launcher(&delegate, base::SysInfo::NumberOfProcessors());
-  bool success = launcher.Run();
-
-  fprintf(stdout, "Tests took %" PRId64 " seconds.\n",
-          (base::TimeTicks::Now() - start_time).InSeconds());
-  fflush(stdout);
-  return success ? 0 : 1;
-}
-
-}  // namespace base
diff --git a/base/test/launcher/test_launcher_nacl_nonsfi.h b/base/test/launcher/test_launcher_nacl_nonsfi.h
deleted file mode 100644
index 6cb3785..0000000
--- a/base/test/launcher/test_launcher_nacl_nonsfi.h
+++ /dev/null
@@ -1,17 +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.
-
-#ifndef BASE_TEST_LAUNCHER_TEST_LAUNCHER_NACL_NONSFI_H_
-#define BASE_TEST_LAUNCHER_TEST_LAUNCHER_NACL_NONSFI_H_
-
-#include <string>
-
-namespace base {
-
-// Launches the NaCl Non-SFI test binary |test_binary|.
-int TestLauncherNonSfiMain(const std::string& test_binary);
-
-}  // namespace base
-
-#endif  // BASE_TEST_LAUNCHER_TEST_LAUNCHER_NACL_NONSFI_H_
diff --git a/base/test/launcher/test_launcher_tracer.cc b/base/test/launcher/test_launcher_tracer.cc
deleted file mode 100644
index d525df7..0000000
--- a/base/test/launcher/test_launcher_tracer.cc
+++ /dev/null
@@ -1,53 +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/test/launcher/test_launcher_tracer.h"
-
-#include "base/json/json_file_value_serializer.h"
-#include "base/strings/stringprintf.h"
-#include "base/values.h"
-
-namespace base {
-
-TestLauncherTracer::TestLauncherTracer()
-    : trace_start_time_(TimeTicks::Now()) {}
-
-TestLauncherTracer::~TestLauncherTracer() = default;
-
-void TestLauncherTracer::RecordProcessExecution(TimeTicks start_time,
-                                                TimeDelta duration) {
-  AutoLock lock(lock_);
-
-  Event event;
-  event.name = StringPrintf("process #%zu", events_.size());
-  event.timestamp = start_time;
-  event.duration = duration;
-  event.thread_id = PlatformThread::CurrentId();
-  events_.push_back(event);
-}
-
-bool TestLauncherTracer::Dump(const FilePath& path) {
-  AutoLock lock(lock_);
-
-  std::unique_ptr<ListValue> json_events(new ListValue);
-  for (const Event& event : events_) {
-    std::unique_ptr<DictionaryValue> json_event(new DictionaryValue);
-    json_event->SetString("name", event.name);
-    json_event->SetString("ph", "X");
-    json_event->SetInteger(
-        "ts", (event.timestamp - trace_start_time_).InMicroseconds());
-    json_event->SetInteger("dur", event.duration.InMicroseconds());
-    json_event->SetInteger("tid", event.thread_id);
-
-    // Add fake values required by the trace viewer.
-    json_event->SetInteger("pid", 0);
-
-    json_events->Append(std::move(json_event));
-  }
-
-  JSONFileValueSerializer serializer(path);
-  return serializer.Serialize(*json_events);
-}
-
-}  // namespace base
diff --git a/base/test/launcher/test_launcher_tracer.h b/base/test/launcher/test_launcher_tracer.h
deleted file mode 100644
index 58bc1b0..0000000
--- a/base/test/launcher/test_launcher_tracer.h
+++ /dev/null
@@ -1,55 +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.
-
-#ifndef BASE_TEST_LAUNCHER_TEST_LAUNCHER_TRACER_H_
-#define BASE_TEST_LAUNCHER_TEST_LAUNCHER_TRACER_H_
-
-#include <string>
-#include <vector>
-
-#include "base/synchronization/lock.h"
-#include "base/threading/platform_thread.h"
-#include "base/time/time.h"
-
-namespace base {
-
-class FilePath;
-
-// Records traces of test execution, e.g. to analyze performance.
-// Thread safe.
-class TestLauncherTracer {
- public:
-  TestLauncherTracer();
-  ~TestLauncherTracer();
-
-  // Records an event corresponding to test process execution.
-  void RecordProcessExecution(TimeTicks start_time, TimeDelta duration);
-
-  // Dumps trace data as JSON. Returns true on success.
-  bool Dump(const FilePath& path) WARN_UNUSED_RESULT;
-
- private:
-  // Simplified version of base::TraceEvent.
-  struct Event {
-    std::string name;            // Displayed name.
-    TimeTicks timestamp;         // Timestamp when this event began.
-    TimeDelta duration;          // How long was this event.
-    PlatformThreadId thread_id;  // Thread ID where event was reported.
-  };
-
-  // Timestamp when tracing started.
-  TimeTicks trace_start_time_;
-
-  // Log of trace events.
-  std::vector<Event> events_;
-
-  // Lock to protect all member variables.
-  Lock lock_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestLauncherTracer);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_LAUNCHER_TEST_LAUNCHER_TRACER_H_
diff --git a/base/test/launcher/test_result.cc b/base/test/launcher/test_result.cc
deleted file mode 100644
index 9f37a2b..0000000
--- a/base/test/launcher/test_result.cc
+++ /dev/null
@@ -1,96 +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/launcher/test_result.h"
-
-#include <stddef.h>
-
-#include "base/logging.h"
-
-namespace base {
-
-TestResultPart::TestResultPart() = default;
-TestResultPart::~TestResultPart() = default;
-
-TestResultPart::TestResultPart(const TestResultPart& other) = default;
-TestResultPart::TestResultPart(TestResultPart&& other) = default;
-TestResultPart& TestResultPart::operator=(const TestResultPart& other) =
-    default;
-TestResultPart& TestResultPart::operator=(TestResultPart&& other) = default;
-
-// static
-bool TestResultPart::TypeFromString(const std::string& str, Type* type) {
-  if (str == "success")
-    *type = kSuccess;
-  else if (str == "failure")
-    *type = kNonFatalFailure;
-  else if (str == "fatal_failure")
-    *type = kFatalFailure;
-  else
-    return false;
-  return true;
-}
-
-std::string TestResultPart::TypeAsString() const {
-  switch (type) {
-    case kSuccess:
-      return "success";
-    case kNonFatalFailure:
-      return "failure";
-    case kFatalFailure:
-      return "fatal_failure";
-    default:
-      NOTREACHED();
-  }
-  return "unknown";
-}
-
-TestResult::TestResult() : status(TEST_UNKNOWN) {
-}
-
-TestResult::~TestResult() = default;
-
-TestResult::TestResult(const TestResult& other) = default;
-TestResult::TestResult(TestResult&& other) = default;
-TestResult& TestResult::operator=(const TestResult& other) = default;
-TestResult& TestResult::operator=(TestResult&& other) = default;
-
-std::string TestResult::StatusAsString() const {
-  switch (status) {
-    case TEST_UNKNOWN:
-      return "UNKNOWN";
-    case TEST_SUCCESS:
-      return "SUCCESS";
-    case TEST_FAILURE:
-      return "FAILURE";
-    case TEST_FAILURE_ON_EXIT:
-      return "FAILURE_ON_EXIT";
-    case TEST_CRASH:
-      return "CRASH";
-    case TEST_TIMEOUT:
-      return "TIMEOUT";
-    case TEST_SKIPPED:
-      return "SKIPPED";
-    case TEST_EXCESSIVE_OUTPUT:
-      return "EXCESSIVE_OUTPUT";
-     // Rely on compiler warnings to ensure all possible values are handled.
-  }
-
-  NOTREACHED();
-  return std::string();
-}
-
-std::string TestResult::GetTestName() const {
-  size_t dot_pos = full_name.find('.');
-  CHECK_NE(dot_pos, std::string::npos);
-  return full_name.substr(dot_pos + 1);
-}
-
-std::string TestResult::GetTestCaseName() const {
-  size_t dot_pos = full_name.find('.');
-  CHECK_NE(dot_pos, std::string::npos);
-  return full_name.substr(0, dot_pos);
-}
-
-}  // namespace base
diff --git a/base/test/launcher/test_result.h b/base/test/launcher/test_result.h
deleted file mode 100644
index 07338b3..0000000
--- a/base/test/launcher/test_result.h
+++ /dev/null
@@ -1,104 +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.
-
-#ifndef BASE_TEST_LAUNCHER_TEST_RESULT_H_
-#define BASE_TEST_LAUNCHER_TEST_RESULT_H_
-
-#include <string>
-#include <vector>
-
-#include "base/time/time.h"
-
-namespace base {
-
-// Structure contains result of a single EXPECT/ASSERT/SUCCESS.
-struct TestResultPart {
-  enum Type {
-    kSuccess,          // SUCCESS
-    kNonFatalFailure,  // EXPECT
-    kFatalFailure,     // ASSERT
-  };
-  Type type;
-
-  TestResultPart();
-  ~TestResultPart();
-
-  TestResultPart(const TestResultPart& other);
-  TestResultPart(TestResultPart&& other);
-  TestResultPart& operator=(const TestResultPart& other);
-  TestResultPart& operator=(TestResultPart&& other);
-
-  // Convert type to string and back.
-  static bool TypeFromString(const std::string& str, Type* type);
-  std::string TypeAsString() const;
-
-  // Filename and line of EXPECT/ASSERT.
-  std::string file_name;
-  int line_number;
-
-  // Message without stacktrace, etc.
-  std::string summary;
-
-  // Complete message.
-  std::string message;
-};
-
-// Structure containing result of a single test.
-struct TestResult {
-  enum Status {
-    TEST_UNKNOWN,           // Status not set.
-    TEST_SUCCESS,           // Test passed.
-    TEST_FAILURE,           // Assertion failure (e.g. EXPECT_TRUE, not DCHECK).
-    TEST_FAILURE_ON_EXIT,   // Passed but executable exit code was non-zero.
-    TEST_TIMEOUT,           // Test timed out and was killed.
-    TEST_CRASH,             // Test crashed (includes CHECK/DCHECK failures).
-    TEST_SKIPPED,           // Test skipped (not run at all).
-    TEST_EXCESSIVE_OUTPUT,  // Test exceeded output limit.
-  };
-
-  TestResult();
-  ~TestResult();
-
-  TestResult(const TestResult& other);
-  TestResult(TestResult&& other);
-  TestResult& operator=(const TestResult& other);
-  TestResult& operator=(TestResult&& other);
-
-  // Returns the test status as string (e.g. for display).
-  std::string StatusAsString() const;
-
-  // Returns the test name (e.g. "B" for "A.B").
-  std::string GetTestName() const;
-
-  // Returns the test case name (e.g. "A" for "A.B").
-  std::string GetTestCaseName() const;
-
-  // Returns true if the test has completed (i.e. the test binary exited
-  // normally, possibly with an exit code indicating failure, but didn't crash
-  // or time out in the middle of the test).
-  bool completed() const {
-    return status == TEST_SUCCESS ||
-        status == TEST_FAILURE ||
-        status == TEST_FAILURE_ON_EXIT ||
-        status == TEST_EXCESSIVE_OUTPUT;
-  }
-
-  // Full name of the test (e.g. "A.B").
-  std::string full_name;
-
-  Status status;
-
-  // Time it took to run the test.
-  base::TimeDelta elapsed_time;
-
-  // Output of just this test (optional).
-  std::string output_snippet;
-
-  // Information about failed expectations.
-  std::vector<TestResultPart> test_result_parts;
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_LAUNCHER_TEST_RESULT_H_
diff --git a/base/test/launcher/test_results_tracker.cc b/base/test/launcher/test_results_tracker.cc
deleted file mode 100644
index a7e590c..0000000
--- a/base/test/launcher/test_results_tracker.cc
+++ /dev/null
@@ -1,541 +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/launcher/test_results_tracker.h"
-
-#include <stddef.h>
-
-#include <memory>
-#include <utility>
-
-#include "base/base64.h"
-#include "base/command_line.h"
-#include "base/files/file.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/format_macros.h"
-#include "base/json/json_writer.h"
-#include "base/json/string_escape.h"
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "base/test/gtest_util.h"
-#include "base/test/launcher/test_launcher.h"
-#include "base/time/time.h"
-#include "base/values.h"
-
-namespace base {
-
-namespace {
-
-// The default output file for XML output.
-const FilePath::CharType kDefaultOutputFile[] = FILE_PATH_LITERAL(
-    "test_detail.xml");
-
-// Converts the given epoch time in milliseconds to a date string in the ISO
-// 8601 format, without the timezone information.
-// TODO(xyzzyz): Find a good place in Chromium to put it and refactor all uses
-// to point to it.
-std::string FormatTimeAsIso8601(Time time) {
-  Time::Exploded exploded;
-  time.UTCExplode(&exploded);
-  return StringPrintf("%04d-%02d-%02dT%02d:%02d:%02d",
-                      exploded.year,
-                      exploded.month,
-                      exploded.day_of_month,
-                      exploded.hour,
-                      exploded.minute,
-                      exploded.second);
-}
-
-struct TestSuiteResultsAggregator {
-  TestSuiteResultsAggregator()
-      : tests(0), failures(0), disabled(0), errors(0) {}
-
-  void Add(const TestResult& result) {
-    tests++;
-    elapsed_time += result.elapsed_time;
-
-    switch (result.status) {
-      case TestResult::TEST_SUCCESS:
-        break;
-      case TestResult::TEST_FAILURE:
-        failures++;
-        break;
-      case TestResult::TEST_EXCESSIVE_OUTPUT:
-      case TestResult::TEST_FAILURE_ON_EXIT:
-      case TestResult::TEST_TIMEOUT:
-      case TestResult::TEST_CRASH:
-      case TestResult::TEST_UNKNOWN:
-        errors++;
-        break;
-      case TestResult::TEST_SKIPPED:
-        disabled++;
-        break;
-    }
-  }
-
-  int tests;
-  int failures;
-  int disabled;
-  int errors;
-
-  TimeDelta elapsed_time;
-};
-
-}  // namespace
-
-TestResultsTracker::TestResultsTracker() : iteration_(-1), out_(nullptr) {}
-
-TestResultsTracker::~TestResultsTracker() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (!out_)
-    return;
-
-  // Maps test case names to test results.
-  typedef std::map<std::string, std::vector<TestResult> > TestCaseMap;
-  TestCaseMap test_case_map;
-
-  TestSuiteResultsAggregator all_tests_aggregator;
-  for (const PerIterationData::ResultsMap::value_type& i
-           : per_iteration_data_[iteration_].results) {
-    // Use the last test result as the final one.
-    TestResult result = i.second.test_results.back();
-    test_case_map[result.GetTestCaseName()].push_back(result);
-    all_tests_aggregator.Add(result);
-  }
-
-  fprintf(out_, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
-  fprintf(out_,
-          "<testsuites name=\"AllTests\" tests=\"%d\" failures=\"%d\""
-          " disabled=\"%d\" errors=\"%d\" time=\"%.3f\" timestamp=\"%s\">\n",
-          all_tests_aggregator.tests, all_tests_aggregator.failures,
-          all_tests_aggregator.disabled, all_tests_aggregator.errors,
-          all_tests_aggregator.elapsed_time.InSecondsF(),
-          FormatTimeAsIso8601(Time::Now()).c_str());
-
-  for (const TestCaseMap::value_type& i : test_case_map) {
-    const std::string testsuite_name = i.first;
-    const std::vector<TestResult>& results = i.second;
-
-    TestSuiteResultsAggregator aggregator;
-    for (const TestResult& result : results) {
-      aggregator.Add(result);
-    }
-    fprintf(out_,
-            "  <testsuite name=\"%s\" tests=\"%d\" "
-            "failures=\"%d\" disabled=\"%d\" errors=\"%d\" time=\"%.3f\" "
-            "timestamp=\"%s\">\n",
-            testsuite_name.c_str(), aggregator.tests, aggregator.failures,
-            aggregator.disabled, aggregator.errors,
-            aggregator.elapsed_time.InSecondsF(),
-            FormatTimeAsIso8601(Time::Now()).c_str());
-
-    for (const TestResult& result : results) {
-      fprintf(out_, "    <testcase name=\"%s\" status=\"run\" time=\"%.3f\""
-              " classname=\"%s\">\n",
-              result.GetTestName().c_str(),
-              result.elapsed_time.InSecondsF(),
-              result.GetTestCaseName().c_str());
-      if (result.status != TestResult::TEST_SUCCESS) {
-        // The actual failure message is not propagated up to here, as it's too
-        // much work to escape it properly, and in case of failure, almost
-        // always one needs to look into full log anyway.
-        fprintf(out_, "      <failure message=\"\" type=\"\"></failure>\n");
-      }
-      fprintf(out_, "    </testcase>\n");
-    }
-    fprintf(out_, "  </testsuite>\n");
-  }
-
-  fprintf(out_, "</testsuites>\n");
-  fclose(out_);
-}
-
-bool TestResultsTracker::Init(const CommandLine& command_line) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // Prevent initializing twice.
-  if (out_) {
-    NOTREACHED();
-    return false;
-  }
-
-  if (!command_line.HasSwitch(kGTestOutputFlag))
-    return true;
-
-  std::string flag = command_line.GetSwitchValueASCII(kGTestOutputFlag);
-  size_t colon_pos = flag.find(':');
-  FilePath path;
-  if (colon_pos != std::string::npos) {
-    FilePath flag_path =
-        command_line.GetSwitchValuePath(kGTestOutputFlag);
-    FilePath::StringType path_string = flag_path.value();
-    path = FilePath(path_string.substr(colon_pos + 1));
-    // If the given path ends with '/', consider it is a directory.
-    // Note: This does NOT check that a directory (or file) actually exists
-    // (the behavior is same as what gtest does).
-    if (path.EndsWithSeparator()) {
-      FilePath executable = command_line.GetProgram().BaseName();
-      path = path.Append(executable.ReplaceExtension(
-                             FilePath::StringType(FILE_PATH_LITERAL("xml"))));
-    }
-  }
-  if (path.value().empty())
-    path = FilePath(kDefaultOutputFile);
-  FilePath dir_name = path.DirName();
-  if (!DirectoryExists(dir_name)) {
-    LOG(WARNING) << "The output directory does not exist. "
-                 << "Creating the directory: " << dir_name.value();
-    // Create the directory if necessary (because the gtest does the same).
-    if (!CreateDirectory(dir_name)) {
-      LOG(ERROR) << "Failed to created directory " << dir_name.value();
-      return false;
-    }
-  }
-  out_ = OpenFile(path, "w");
-  if (!out_) {
-    LOG(ERROR) << "Cannot open output file: "
-               << path.value() << ".";
-    return false;
-  }
-
-  return true;
-}
-
-void TestResultsTracker::OnTestIterationStarting() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // Start with a fresh state for new iteration.
-  iteration_++;
-  per_iteration_data_.push_back(PerIterationData());
-}
-
-void TestResultsTracker::AddTest(const std::string& test_name) {
-  // Record disabled test names without DISABLED_ prefix so that they are easy
-  // to compare with regular test names, e.g. before or after disabling.
-  all_tests_.insert(TestNameWithoutDisabledPrefix(test_name));
-}
-
-void TestResultsTracker::AddDisabledTest(const std::string& test_name) {
-  // Record disabled test names without DISABLED_ prefix so that they are easy
-  // to compare with regular test names, e.g. before or after disabling.
-  disabled_tests_.insert(TestNameWithoutDisabledPrefix(test_name));
-}
-
-void TestResultsTracker::AddTestLocation(const std::string& test_name,
-                                         const std::string& file,
-                                         int line) {
-  test_locations_.insert(std::make_pair(test_name, CodeLocation(file, line)));
-}
-
-void TestResultsTracker::AddTestResult(const TestResult& result) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // Record disabled test names without DISABLED_ prefix so that they are easy
-  // to compare with regular test names, e.g. before or after disabling.
-  per_iteration_data_[iteration_].results[
-      TestNameWithoutDisabledPrefix(result.full_name)].test_results.push_back(
-          result);
-}
-
-void TestResultsTracker::PrintSummaryOfCurrentIteration() const {
-  TestStatusMap tests_by_status(GetTestStatusMapForCurrentIteration());
-
-  PrintTests(tests_by_status[TestResult::TEST_FAILURE].begin(),
-             tests_by_status[TestResult::TEST_FAILURE].end(),
-             "failed");
-  PrintTests(tests_by_status[TestResult::TEST_FAILURE_ON_EXIT].begin(),
-             tests_by_status[TestResult::TEST_FAILURE_ON_EXIT].end(),
-             "failed on exit");
-  PrintTests(tests_by_status[TestResult::TEST_EXCESSIVE_OUTPUT].begin(),
-             tests_by_status[TestResult::TEST_EXCESSIVE_OUTPUT].end(),
-             "produced excessive output");
-  PrintTests(tests_by_status[TestResult::TEST_TIMEOUT].begin(),
-             tests_by_status[TestResult::TEST_TIMEOUT].end(),
-             "timed out");
-  PrintTests(tests_by_status[TestResult::TEST_CRASH].begin(),
-             tests_by_status[TestResult::TEST_CRASH].end(),
-             "crashed");
-  PrintTests(tests_by_status[TestResult::TEST_SKIPPED].begin(),
-             tests_by_status[TestResult::TEST_SKIPPED].end(),
-             "skipped");
-  PrintTests(tests_by_status[TestResult::TEST_UNKNOWN].begin(),
-             tests_by_status[TestResult::TEST_UNKNOWN].end(),
-             "had unknown result");
-}
-
-void TestResultsTracker::PrintSummaryOfAllIterations() const {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  TestStatusMap tests_by_status(GetTestStatusMapForAllIterations());
-
-  fprintf(stdout, "Summary of all test iterations:\n");
-  fflush(stdout);
-
-  PrintTests(tests_by_status[TestResult::TEST_FAILURE].begin(),
-             tests_by_status[TestResult::TEST_FAILURE].end(),
-             "failed");
-  PrintTests(tests_by_status[TestResult::TEST_FAILURE_ON_EXIT].begin(),
-             tests_by_status[TestResult::TEST_FAILURE_ON_EXIT].end(),
-             "failed on exit");
-  PrintTests(tests_by_status[TestResult::TEST_EXCESSIVE_OUTPUT].begin(),
-             tests_by_status[TestResult::TEST_EXCESSIVE_OUTPUT].end(),
-             "produced excessive output");
-  PrintTests(tests_by_status[TestResult::TEST_TIMEOUT].begin(),
-             tests_by_status[TestResult::TEST_TIMEOUT].end(),
-             "timed out");
-  PrintTests(tests_by_status[TestResult::TEST_CRASH].begin(),
-             tests_by_status[TestResult::TEST_CRASH].end(),
-             "crashed");
-  PrintTests(tests_by_status[TestResult::TEST_SKIPPED].begin(),
-             tests_by_status[TestResult::TEST_SKIPPED].end(),
-             "skipped");
-  PrintTests(tests_by_status[TestResult::TEST_UNKNOWN].begin(),
-             tests_by_status[TestResult::TEST_UNKNOWN].end(),
-             "had unknown result");
-
-  fprintf(stdout, "End of the summary.\n");
-  fflush(stdout);
-}
-
-void TestResultsTracker::AddGlobalTag(const std::string& tag) {
-  global_tags_.insert(tag);
-}
-
-bool TestResultsTracker::SaveSummaryAsJSON(
-    const FilePath& path,
-    const std::vector<std::string>& additional_tags) const {
-  std::unique_ptr<DictionaryValue> summary_root(new DictionaryValue);
-
-  std::unique_ptr<ListValue> global_tags(new ListValue);
-  for (const auto& global_tag : global_tags_) {
-    global_tags->AppendString(global_tag);
-  }
-  for (const auto& tag : additional_tags) {
-    global_tags->AppendString(tag);
-  }
-  summary_root->Set("global_tags", std::move(global_tags));
-
-  std::unique_ptr<ListValue> all_tests(new ListValue);
-  for (const auto& test : all_tests_) {
-    all_tests->AppendString(test);
-  }
-  summary_root->Set("all_tests", std::move(all_tests));
-
-  std::unique_ptr<ListValue> disabled_tests(new ListValue);
-  for (const auto& disabled_test : disabled_tests_) {
-    disabled_tests->AppendString(disabled_test);
-  }
-  summary_root->Set("disabled_tests", std::move(disabled_tests));
-
-  std::unique_ptr<ListValue> per_iteration_data(new ListValue);
-
-  for (int i = 0; i <= iteration_; i++) {
-    std::unique_ptr<DictionaryValue> current_iteration_data(
-        new DictionaryValue);
-
-    for (PerIterationData::ResultsMap::const_iterator j =
-             per_iteration_data_[i].results.begin();
-         j != per_iteration_data_[i].results.end();
-         ++j) {
-      std::unique_ptr<ListValue> test_results(new ListValue);
-
-      for (size_t k = 0; k < j->second.test_results.size(); k++) {
-        const TestResult& test_result = j->second.test_results[k];
-
-        std::unique_ptr<DictionaryValue> test_result_value(new DictionaryValue);
-
-        test_result_value->SetString("status", test_result.StatusAsString());
-        test_result_value->SetInteger(
-            "elapsed_time_ms",
-            static_cast<int>(test_result.elapsed_time.InMilliseconds()));
-
-        bool lossless_snippet = false;
-        if (IsStringUTF8(test_result.output_snippet)) {
-          test_result_value->SetString(
-              "output_snippet", test_result.output_snippet);
-          lossless_snippet = true;
-        } else {
-          test_result_value->SetString(
-              "output_snippet",
-              "<non-UTF-8 snippet, see output_snippet_base64>");
-        }
-
-        // TODO(phajdan.jr): Fix typo in JSON key (losless -> lossless)
-        // making sure not to break any consumers of this data.
-        test_result_value->SetBoolean("losless_snippet", lossless_snippet);
-
-        // Also include the raw version (base64-encoded so that it can be safely
-        // JSON-serialized - there are no guarantees about character encoding
-        // of the snippet). This can be very useful piece of information when
-        // debugging a test failure related to character encoding.
-        std::string base64_output_snippet;
-        Base64Encode(test_result.output_snippet, &base64_output_snippet);
-        test_result_value->SetString("output_snippet_base64",
-                                     base64_output_snippet);
-
-        std::unique_ptr<ListValue> test_result_parts(new ListValue);
-        for (const TestResultPart& result_part :
-             test_result.test_result_parts) {
-          std::unique_ptr<DictionaryValue> result_part_value(
-              new DictionaryValue);
-          result_part_value->SetString("type", result_part.TypeAsString());
-          result_part_value->SetString("file", result_part.file_name);
-          result_part_value->SetInteger("line", result_part.line_number);
-
-          bool lossless_summary = IsStringUTF8(result_part.summary);
-          if (lossless_summary) {
-            result_part_value->SetString("summary", result_part.summary);
-          } else {
-            result_part_value->SetString(
-                "summary", "<non-UTF-8 snippet, see summary_base64>");
-          }
-          result_part_value->SetBoolean("lossless_summary", lossless_summary);
-
-          std::string encoded_summary;
-          Base64Encode(result_part.summary, &encoded_summary);
-          result_part_value->SetString("summary_base64", encoded_summary);
-
-          bool lossless_message = IsStringUTF8(result_part.message);
-          if (lossless_message) {
-            result_part_value->SetString("message", result_part.message);
-          } else {
-            result_part_value->SetString(
-                "message", "<non-UTF-8 snippet, see message_base64>");
-          }
-          result_part_value->SetBoolean("lossless_message", lossless_message);
-
-          std::string encoded_message;
-          Base64Encode(result_part.message, &encoded_message);
-          result_part_value->SetString("message_base64", encoded_message);
-
-          test_result_parts->Append(std::move(result_part_value));
-        }
-        test_result_value->Set("result_parts", std::move(test_result_parts));
-
-        test_results->Append(std::move(test_result_value));
-      }
-
-      current_iteration_data->SetWithoutPathExpansion(j->first,
-                                                      std::move(test_results));
-    }
-    per_iteration_data->Append(std::move(current_iteration_data));
-  }
-  summary_root->Set("per_iteration_data", std::move(per_iteration_data));
-
-  std::unique_ptr<DictionaryValue> test_locations(new DictionaryValue);
-  for (const auto& item : test_locations_) {
-    std::string test_name = item.first;
-    CodeLocation location = item.second;
-    std::unique_ptr<DictionaryValue> location_value(new DictionaryValue);
-    location_value->SetString("file", location.file);
-    location_value->SetInteger("line", location.line);
-    test_locations->SetWithoutPathExpansion(test_name,
-                                            std::move(location_value));
-  }
-  summary_root->Set("test_locations", std::move(test_locations));
-
-  std::string json;
-  if (!JSONWriter::Write(*summary_root, &json))
-    return false;
-
-  File output(path, File::FLAG_CREATE_ALWAYS | File::FLAG_WRITE);
-  if (!output.IsValid())
-    return false;
-
-  int json_size = static_cast<int>(json.size());
-  if (output.WriteAtCurrentPos(json.data(), json_size) != json_size) {
-    return false;
-  }
-
-  // File::Flush() will call fsync(). This is important on Fuchsia to ensure
-  // that the file is written to the disk - the system running under qemu will
-  // shutdown shortly after the test completes. On Fuchsia fsync() times out
-  // after 15 seconds. Apparently this may not be enough in some cases,
-  // particularly when running net_unittests on buildbots, see
-  // https://crbug.com/796318. Try calling fsync() more than once to workaround
-  // this issue.
-  //
-  // TODO(sergeyu): Figure out a better solution.
-  int flush_attempts_left = 4;
-  while (flush_attempts_left-- > 0) {
-    if (output.Flush())
-      return true;
-    LOG(ERROR) << "fsync() failed when saving test output summary. "
-               << ((flush_attempts_left > 0) ? "Retrying." : " Giving up.");
-  }
-
-  return false;
-}
-
-TestResultsTracker::TestStatusMap
-    TestResultsTracker::GetTestStatusMapForCurrentIteration() const {
-  TestStatusMap tests_by_status;
-  GetTestStatusForIteration(iteration_, &tests_by_status);
-  return tests_by_status;
-}
-
-TestResultsTracker::TestStatusMap
-    TestResultsTracker::GetTestStatusMapForAllIterations() const {
-  TestStatusMap tests_by_status;
-  for (int i = 0; i <= iteration_; i++)
-    GetTestStatusForIteration(i, &tests_by_status);
-  return tests_by_status;
-}
-
-void TestResultsTracker::GetTestStatusForIteration(
-    int iteration, TestStatusMap* map) const {
-  for (PerIterationData::ResultsMap::const_iterator j =
-           per_iteration_data_[iteration].results.begin();
-       j != per_iteration_data_[iteration].results.end();
-       ++j) {
-    // Use the last test result as the final one.
-    const TestResult& result = j->second.test_results.back();
-    (*map)[result.status].insert(result.full_name);
-  }
-}
-
-// Utility function to print a list of test names. Uses iterator to be
-// compatible with different containers, like vector and set.
-template<typename InputIterator>
-void TestResultsTracker::PrintTests(InputIterator first,
-                                    InputIterator last,
-                                    const std::string& description) const {
-  size_t count = std::distance(first, last);
-  if (count == 0)
-    return;
-
-  fprintf(stdout,
-          "%" PRIuS " test%s %s:\n",
-          count,
-          count != 1 ? "s" : "",
-          description.c_str());
-  for (InputIterator it = first; it != last; ++it) {
-    const std::string& test_name = *it;
-    const auto location_it = test_locations_.find(test_name);
-    DCHECK(location_it != test_locations_.end()) << test_name;
-    const CodeLocation& location = location_it->second;
-    fprintf(stdout, "    %s (%s:%d)\n", test_name.c_str(),
-            location.file.c_str(), location.line);
-  }
-  fflush(stdout);
-}
-
-TestResultsTracker::AggregateTestResult::AggregateTestResult() = default;
-
-TestResultsTracker::AggregateTestResult::AggregateTestResult(
-    const AggregateTestResult& other) = default;
-
-TestResultsTracker::AggregateTestResult::~AggregateTestResult() = default;
-
-TestResultsTracker::PerIterationData::PerIterationData() = default;
-
-TestResultsTracker::PerIterationData::PerIterationData(
-    const PerIterationData& other) = default;
-
-TestResultsTracker::PerIterationData::~PerIterationData() = default;
-
-}  // namespace base
diff --git a/base/test/launcher/test_results_tracker.h b/base/test/launcher/test_results_tracker.h
deleted file mode 100644
index d89821d..0000000
--- a/base/test/launcher/test_results_tracker.h
+++ /dev/null
@@ -1,149 +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.
-
-#ifndef BASE_TEST_LAUNCHER_TEST_RESULTS_TRACKER_H_
-#define BASE_TEST_LAUNCHER_TEST_RESULTS_TRACKER_H_
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/test/launcher/test_result.h"
-#include "base/threading/thread_checker.h"
-
-namespace base {
-
-class CommandLine;
-class FilePath;
-
-// A helper class to output results.
-// Note: as currently XML is the only supported format by gtest, we don't
-// check output format (e.g. "xml:" prefix) here and output an XML file
-// unconditionally.
-// Note: we don't output per-test-case or total summary info like
-// total failed_test_count, disabled_test_count, elapsed_time and so on.
-// Only each test (testcase element in the XML) will have the correct
-// failed/disabled/elapsed_time information. Each test won't include
-// detailed failure messages either.
-class TestResultsTracker {
- public:
-  TestResultsTracker();
-  ~TestResultsTracker();
-
-  // Initialize the result tracker. Must be called exactly once before
-  // calling any other methods. Returns true on success.
-  bool Init(const CommandLine& command_line) WARN_UNUSED_RESULT;
-
-  // Called when a test iteration is starting.
-  void OnTestIterationStarting();
-
-  // Adds |test_name| to the set of discovered tests (this includes all tests
-  // present in the executable, not necessarily run).
-  void AddTest(const std::string& test_name);
-
-  // Adds |test_name| to the set of disabled tests.
-  void AddDisabledTest(const std::string& test_name);
-
-  // Adds location for the |test_name|.
-  void AddTestLocation(const std::string& test_name,
-                       const std::string& file,
-                       int line);
-
-  // Adds |result| to the stored test results.
-  void AddTestResult(const TestResult& result);
-
-  // Prints a summary of current test iteration to stdout.
-  void PrintSummaryOfCurrentIteration() const;
-
-  // Prints a summary of all test iterations (not just the last one) to stdout.
-  void PrintSummaryOfAllIterations() const;
-
-  // Adds a string tag to the JSON summary. This is intended to indicate
-  // conditions that affect the entire test run, as opposed to individual tests.
-  void AddGlobalTag(const std::string& tag);
-
-  // Saves a JSON summary of all test iterations results to |path|. Adds
-  // |additional_tags| to the summary (just for this invocation). Returns
-  // true on success.
-  bool SaveSummaryAsJSON(
-      const FilePath& path,
-      const std::vector<std::string>& additional_tags) const WARN_UNUSED_RESULT;
-
-  // Map where keys are test result statuses, and values are sets of tests
-  // which finished with that status.
-  typedef std::map<TestResult::Status, std::set<std::string> > TestStatusMap;
-
-  // Returns a test status map (see above) for current test iteration.
-  TestStatusMap GetTestStatusMapForCurrentIteration() const;
-
-  // Returns a test status map (see above) for all test iterations.
-  TestStatusMap GetTestStatusMapForAllIterations() const;
-
- private:
-  void GetTestStatusForIteration(int iteration, TestStatusMap* map) const;
-
-  template<typename InputIterator>
-  void PrintTests(InputIterator first,
-                  InputIterator last,
-                  const std::string& description) const;
-
-  struct AggregateTestResult {
-    AggregateTestResult();
-    AggregateTestResult(const AggregateTestResult& other);
-    ~AggregateTestResult();
-
-    std::vector<TestResult> test_results;
-  };
-
-  struct PerIterationData {
-    PerIterationData();
-    PerIterationData(const PerIterationData& other);
-    ~PerIterationData();
-
-    // Aggregate test results grouped by full test name.
-    typedef std::map<std::string, AggregateTestResult> ResultsMap;
-    ResultsMap results;
-  };
-
-  struct CodeLocation {
-    CodeLocation(const std::string& f, int l) : file(f), line(l) {
-    }
-
-    std::string file;
-    int line;
-  };
-
-  ThreadChecker thread_checker_;
-
-  // Set of global tags, i.e. strings indicating conditions that apply to
-  // the entire test run.
-  std::set<std::string> global_tags_;
-
-  // Set of all test names discovered in the current executable.
-  std::set<std::string> all_tests_;
-
-  std::map<std::string, CodeLocation> test_locations_;
-
-  // Set of all disabled tests in the current executable.
-  std::set<std::string> disabled_tests_;
-
-  // Store test results for each iteration.
-  std::vector<PerIterationData> per_iteration_data_;
-
-  // Index of current iteration (starting from 0). -1 before the first
-  // iteration.
-  int iteration_;
-
-  // File handle of output file (can be NULL if no file).
-  FILE* out_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestResultsTracker);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_LAUNCHER_TEST_RESULTS_TRACKER_H_
diff --git a/base/test/launcher/unit_test_launcher.cc b/base/test/launcher/unit_test_launcher.cc
deleted file mode 100644
index 230ecc3..0000000
--- a/base/test/launcher/unit_test_launcher.cc
+++ /dev/null
@@ -1,750 +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/launcher/unit_test_launcher.h"
-
-#include <map>
-#include <memory>
-#include <utility>
-
-#include "base/base_switches.h"
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/command_line.h"
-#include "base/compiler_specific.h"
-#include "base/debug/debugger.h"
-#include "base/files/file_util.h"
-#include "base/files/scoped_temp_dir.h"
-#include "base/format_macros.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/message_loop/message_loop.h"
-#include "base/sequence_checker.h"
-#include "base/single_thread_task_runner.h"
-#include "base/stl_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
-#include "base/sys_info.h"
-#include "base/test/gtest_xml_util.h"
-#include "base/test/launcher/test_launcher.h"
-#include "base/test/test_switches.h"
-#include "base/test/test_timeouts.h"
-#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
-#include "base/threading/thread_checker.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#if defined(OS_POSIX)
-#include "base/files/file_descriptor_watcher_posix.h"
-#endif
-
-namespace base {
-
-namespace {
-
-// This constant controls how many tests are run in a single batch by default.
-const size_t kDefaultTestBatchLimit = 10;
-
-const char kHelpFlag[] = "help";
-
-// Flag to run all tests in a single process.
-const char kSingleProcessTestsFlag[] = "single-process-tests";
-
-void PrintUsage() {
-  fprintf(stdout,
-          "Runs tests using the gtest framework, each batch of tests being\n"
-          "run in their own process. Supported command-line flags:\n"
-          "\n"
-          " Common flags:\n"
-          "  --gtest_filter=...\n"
-          "    Runs a subset of tests (see --gtest_help for more info).\n"
-          "\n"
-          "  --help\n"
-          "    Shows this message.\n"
-          "\n"
-          "  --gtest_help\n"
-          "    Shows the gtest help message.\n"
-          "\n"
-          "  --test-launcher-jobs=N\n"
-          "    Sets the number of parallel test jobs to N.\n"
-          "\n"
-          "  --single-process-tests\n"
-          "    Runs the tests and the launcher in the same process. Useful\n"
-          "    for debugging a specific test in a debugger.\n"
-          "\n"
-          " Other flags:\n"
-          "  --test-launcher-filter-file=PATH\n"
-          "    Like --gtest_filter, but read the test filter from PATH.\n"
-          "    One pattern per line; lines starting with '-' are exclusions.\n"
-          "    See also //testing/buildbot/filters/README.md file.\n"
-          "\n"
-          "  --test-launcher-batch-limit=N\n"
-          "    Sets the limit of test batch to run in a single process to N.\n"
-          "\n"
-          "  --test-launcher-debug-launcher\n"
-          "    Disables autodetection of debuggers and similar tools,\n"
-          "    making it possible to use them to debug launcher itself.\n"
-          "\n"
-          "  --test-launcher-retry-limit=N\n"
-          "    Sets the limit of test retries on failures to N.\n"
-          "\n"
-          "  --test-launcher-summary-output=PATH\n"
-          "    Saves a JSON machine-readable summary of the run.\n"
-          "\n"
-          "  --test-launcher-print-test-stdio=auto|always|never\n"
-          "    Controls when full test output is printed.\n"
-          "    auto means to print it when the test failed.\n"
-          "\n"
-          "  --test-launcher-test-part-results-limit=N\n"
-          "    Sets the limit of failed EXPECT/ASSERT entries in the xml and\n"
-          "    JSON outputs per test to N (default N=10). Negative value \n"
-          "    will disable this limit.\n"
-          "\n"
-          "  --test-launcher-total-shards=N\n"
-          "    Sets the total number of shards to N.\n"
-          "\n"
-          "  --test-launcher-shard-index=N\n"
-          "    Sets the shard index to run to N (from 0 to TOTAL - 1).\n");
-  fflush(stdout);
-}
-
-class DefaultUnitTestPlatformDelegate : public UnitTestPlatformDelegate {
- public:
-  DefaultUnitTestPlatformDelegate() = default;
-
- private:
-  // UnitTestPlatformDelegate:
-  bool GetTests(std::vector<TestIdentifier>* output) override {
-    *output = GetCompiledInTests();
-    return true;
-  }
-
-  bool CreateResultsFile(base::FilePath* path) override {
-    if (!CreateNewTempDirectory(FilePath::StringType(), path))
-      return false;
-    *path = path->AppendASCII("test_results.xml");
-    return true;
-  }
-
-  bool CreateTemporaryFile(base::FilePath* path) override {
-    if (!temp_dir_.IsValid() && !temp_dir_.CreateUniqueTempDir())
-      return false;
-    return CreateTemporaryFileInDir(temp_dir_.GetPath(), path);
-  }
-
-  CommandLine GetCommandLineForChildGTestProcess(
-      const std::vector<std::string>& test_names,
-      const base::FilePath& output_file,
-      const base::FilePath& flag_file) override {
-    CommandLine new_cmd_line(*CommandLine::ForCurrentProcess());
-
-    CHECK(base::PathExists(flag_file));
-
-    std::string long_flags(
-        std::string("--") + kGTestFilterFlag + "=" +
-        JoinString(test_names, ":"));
-    CHECK_EQ(static_cast<int>(long_flags.size()),
-             WriteFile(flag_file, long_flags.data(),
-                       static_cast<int>(long_flags.size())));
-
-    new_cmd_line.AppendSwitchPath(switches::kTestLauncherOutput, output_file);
-    new_cmd_line.AppendSwitchPath(kGTestFlagfileFlag, flag_file);
-    new_cmd_line.AppendSwitch(kSingleProcessTestsFlag);
-
-    return new_cmd_line;
-  }
-
-  std::string GetWrapperForChildGTestProcess() override {
-    return std::string();
-  }
-
-  void RelaunchTests(TestLauncher* test_launcher,
-                     const std::vector<std::string>& test_names,
-                     int launch_flags) override {
-    // Relaunch requested tests in parallel, but only use single
-    // test per batch for more precise results (crashes, etc).
-    for (const std::string& test_name : test_names) {
-      std::vector<std::string> batch;
-      batch.push_back(test_name);
-      RunUnitTestsBatch(test_launcher, this, batch, launch_flags);
-    }
-  }
-
-  ScopedTempDir temp_dir_;
-
-  DISALLOW_COPY_AND_ASSIGN(DefaultUnitTestPlatformDelegate);
-};
-
-bool GetSwitchValueAsInt(const std::string& switch_name, int* result) {
-  if (!CommandLine::ForCurrentProcess()->HasSwitch(switch_name))
-    return true;
-
-  std::string switch_value =
-      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(switch_name);
-  if (!StringToInt(switch_value, result) || *result < 0) {
-    LOG(ERROR) << "Invalid value for " << switch_name << ": " << switch_value;
-    return false;
-  }
-
-  return true;
-}
-
-int LaunchUnitTestsInternal(RunTestSuiteCallback run_test_suite,
-                            size_t parallel_jobs,
-                            int default_batch_limit,
-                            bool use_job_objects,
-                            OnceClosure gtest_init) {
-#if defined(OS_ANDROID)
-  // We can't easily fork on Android, just run the test suite directly.
-  return std::move(run_test_suite).Run();
-#else
-  bool force_single_process = false;
-  if (CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kTestLauncherDebugLauncher)) {
-    fprintf(stdout, "Forcing test launcher debugging mode.\n");
-    fflush(stdout);
-  } else {
-    if (base::debug::BeingDebugged()) {
-      fprintf(stdout,
-              "Debugger detected, switching to single process mode.\n"
-              "Pass --test-launcher-debug-launcher to debug the launcher "
-              "itself.\n");
-      fflush(stdout);
-      force_single_process = true;
-    }
-  }
-
-  if (CommandLine::ForCurrentProcess()->HasSwitch(kGTestHelpFlag) ||
-      CommandLine::ForCurrentProcess()->HasSwitch(kGTestListTestsFlag) ||
-      CommandLine::ForCurrentProcess()->HasSwitch(kSingleProcessTestsFlag) ||
-      CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kTestChildProcess) ||
-      force_single_process) {
-    return std::move(run_test_suite).Run();
-  }
-#endif
-
-  if (CommandLine::ForCurrentProcess()->HasSwitch(kHelpFlag)) {
-    PrintUsage();
-    return 0;
-  }
-
-  TimeTicks start_time(TimeTicks::Now());
-
-  std::move(gtest_init).Run();
-  TestTimeouts::Initialize();
-
-  int batch_limit = default_batch_limit;
-  if (!GetSwitchValueAsInt(switches::kTestLauncherBatchLimit, &batch_limit))
-    return 1;
-
-  fprintf(stdout,
-          "IMPORTANT DEBUGGING NOTE: batches of tests are run inside their\n"
-          "own process. For debugging a test inside a debugger, use the\n"
-          "--gtest_filter=<your_test_name> flag along with\n"
-          "--single-process-tests.\n");
-  fflush(stdout);
-
-  MessageLoopForIO message_loop;
-#if defined(OS_POSIX)
-  FileDescriptorWatcher file_descriptor_watcher(&message_loop);
-#endif
-
-  DefaultUnitTestPlatformDelegate platform_delegate;
-  UnitTestLauncherDelegate delegate(
-      &platform_delegate, batch_limit, use_job_objects);
-  TestLauncher launcher(&delegate, parallel_jobs);
-  bool success = launcher.Run();
-
-  fprintf(stdout, "Tests took %" PRId64 " seconds.\n",
-          (TimeTicks::Now() - start_time).InSeconds());
-  fflush(stdout);
-
-  return (success ? 0 : 1);
-}
-
-void InitGoogleTestChar(int* argc, char** argv) {
-  testing::InitGoogleTest(argc, argv);
-}
-
-#if defined(OS_WIN)
-void InitGoogleTestWChar(int* argc, wchar_t** argv) {
-  testing::InitGoogleTest(argc, argv);
-}
-#endif  // defined(OS_WIN)
-
-// Interprets test results and reports to the test launcher. Returns true
-// on success.
-bool ProcessTestResults(
-    TestLauncher* test_launcher,
-    const std::vector<std::string>& test_names,
-    const base::FilePath& output_file,
-    const std::string& output,
-    int exit_code,
-    bool was_timeout,
-    std::vector<std::string>* tests_to_relaunch) {
-  std::vector<TestResult> test_results;
-  bool crashed = false;
-  bool have_test_results =
-      ProcessGTestOutput(output_file, &test_results, &crashed);
-
-  bool called_any_callback = false;
-
-  if (have_test_results) {
-    // TODO(phajdan.jr): Check for duplicates and mismatches between
-    // the results we got from XML file and tests we intended to run.
-    std::map<std::string, TestResult> results_map;
-    for (size_t i = 0; i < test_results.size(); i++)
-      results_map[test_results[i].full_name] = test_results[i];
-
-    bool had_interrupted_test = false;
-
-    // Results to be reported back to the test launcher.
-    std::vector<TestResult> final_results;
-
-    for (size_t i = 0; i < test_names.size(); i++) {
-      if (ContainsKey(results_map, test_names[i])) {
-        TestResult test_result = results_map[test_names[i]];
-        if (test_result.status == TestResult::TEST_CRASH) {
-          had_interrupted_test = true;
-
-          if (was_timeout) {
-            // Fix up the test status: we forcibly kill the child process
-            // after the timeout, so from XML results it looks just like
-            // a crash.
-            test_result.status = TestResult::TEST_TIMEOUT;
-          }
-        } else if (test_result.status == TestResult::TEST_SUCCESS ||
-                   test_result.status == TestResult::TEST_FAILURE) {
-          // We run multiple tests in a batch with a timeout applied
-          // to the entire batch. It is possible that with other tests
-          // running quickly some tests take longer than the per-test timeout.
-          // For consistent handling of tests independent of order and other
-          // factors, mark them as timing out.
-          if (test_result.elapsed_time >
-              TestTimeouts::test_launcher_timeout()) {
-            test_result.status = TestResult::TEST_TIMEOUT;
-          }
-        }
-        test_result.output_snippet = GetTestOutputSnippet(test_result, output);
-        final_results.push_back(test_result);
-      } else if (had_interrupted_test) {
-        tests_to_relaunch->push_back(test_names[i]);
-      } else {
-        // TODO(phajdan.jr): Explicitly pass the info that the test didn't
-        // run for a mysterious reason.
-        LOG(ERROR) << "no test result for " << test_names[i];
-        TestResult test_result;
-        test_result.full_name = test_names[i];
-        test_result.status = TestResult::TEST_UNKNOWN;
-        test_result.output_snippet = GetTestOutputSnippet(test_result, output);
-        final_results.push_back(test_result);
-      }
-    }
-
-    // TODO(phajdan.jr): Handle the case where processing XML output
-    // indicates a crash but none of the test results is marked as crashing.
-
-    if (final_results.empty())
-      return false;
-
-    bool has_non_success_test = false;
-    for (size_t i = 0; i < final_results.size(); i++) {
-      if (final_results[i].status != TestResult::TEST_SUCCESS) {
-        has_non_success_test = true;
-        break;
-      }
-    }
-
-    if (!has_non_success_test && exit_code != 0) {
-      // This is a bit surprising case: all tests are marked as successful,
-      // but the exit code was not zero. This can happen e.g. under memory
-      // tools that report leaks this way. Mark all tests as a failure on exit,
-      // and for more precise info they'd need to be retried serially.
-      for (size_t i = 0; i < final_results.size(); i++)
-        final_results[i].status = TestResult::TEST_FAILURE_ON_EXIT;
-    }
-
-    for (size_t i = 0; i < final_results.size(); i++) {
-      // Fix the output snippet after possible changes to the test result.
-      final_results[i].output_snippet =
-          GetTestOutputSnippet(final_results[i], output);
-      test_launcher->OnTestFinished(final_results[i]);
-      called_any_callback = true;
-    }
-  } else {
-    fprintf(stdout,
-            "Failed to get out-of-band test success data, "
-            "dumping full stdio below:\n%s\n",
-            output.c_str());
-    fflush(stdout);
-
-    // We do not have reliable details about test results (parsing test
-    // stdout is known to be unreliable).
-    if (test_names.size() == 1) {
-      // There is only one test. Try to determine status by exit code.
-      const std::string& test_name = test_names.front();
-      TestResult test_result;
-      test_result.full_name = test_name;
-
-      if (was_timeout) {
-        test_result.status = TestResult::TEST_TIMEOUT;
-      } else if (exit_code != 0) {
-        test_result.status = TestResult::TEST_FAILURE;
-      } else {
-        // It's strange case when test executed successfully,
-        // but we failed to read machine-readable report for it.
-        test_result.status = TestResult::TEST_UNKNOWN;
-      }
-
-      test_launcher->OnTestFinished(test_result);
-      called_any_callback = true;
-    } else {
-      // There is more than one test. Retry them individually.
-      for (const std::string& test_name : test_names)
-        tests_to_relaunch->push_back(test_name);
-    }
-  }
-
-  return called_any_callback;
-}
-
-class UnitTestProcessLifetimeObserver : public ProcessLifetimeObserver {
- public:
-  ~UnitTestProcessLifetimeObserver() override {
-    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  }
-
-  TestLauncher* test_launcher() { return test_launcher_; }
-  UnitTestPlatformDelegate* platform_delegate() { return platform_delegate_; }
-  const std::vector<std::string>& test_names() { return test_names_; }
-  int launch_flags() { return launch_flags_; }
-  const FilePath& output_file() { return output_file_; }
-  const FilePath& flag_file() { return flag_file_; }
-
- protected:
-  UnitTestProcessLifetimeObserver(TestLauncher* test_launcher,
-                                  UnitTestPlatformDelegate* platform_delegate,
-                                  const std::vector<std::string>& test_names,
-                                  int launch_flags,
-                                  const FilePath& output_file,
-                                  const FilePath& flag_file)
-      : ProcessLifetimeObserver(),
-        test_launcher_(test_launcher),
-        platform_delegate_(platform_delegate),
-        test_names_(test_names),
-        launch_flags_(launch_flags),
-        output_file_(output_file),
-        flag_file_(flag_file) {}
-
-  SEQUENCE_CHECKER(sequence_checker_);
-
- private:
-  TestLauncher* const test_launcher_;
-  UnitTestPlatformDelegate* const platform_delegate_;
-  const std::vector<std::string> test_names_;
-  const int launch_flags_;
-  const FilePath output_file_;
-  const FilePath flag_file_;
-
-  DISALLOW_COPY_AND_ASSIGN(UnitTestProcessLifetimeObserver);
-};
-
-class ParallelUnitTestProcessLifetimeObserver
-    : public UnitTestProcessLifetimeObserver {
- public:
-  ParallelUnitTestProcessLifetimeObserver(
-      TestLauncher* test_launcher,
-      UnitTestPlatformDelegate* platform_delegate,
-      const std::vector<std::string>& test_names,
-      int launch_flags,
-      const FilePath& output_file,
-      const FilePath& flag_file)
-      : UnitTestProcessLifetimeObserver(test_launcher,
-                                        platform_delegate,
-                                        test_names,
-                                        launch_flags,
-                                        output_file,
-                                        flag_file) {}
-  ~ParallelUnitTestProcessLifetimeObserver() override = default;
-
- private:
-  // ProcessLifetimeObserver:
-  void OnCompleted(int exit_code,
-                   TimeDelta elapsed_time,
-                   bool was_timeout,
-                   const std::string& output) override;
-
-  DISALLOW_COPY_AND_ASSIGN(ParallelUnitTestProcessLifetimeObserver);
-};
-
-void ParallelUnitTestProcessLifetimeObserver::OnCompleted(
-    int exit_code,
-    TimeDelta elapsed_time,
-    bool was_timeout,
-    const std::string& output) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  std::vector<std::string> tests_to_relaunch;
-  ProcessTestResults(test_launcher(), test_names(), output_file(), output,
-                     exit_code, was_timeout, &tests_to_relaunch);
-
-  if (!tests_to_relaunch.empty()) {
-    platform_delegate()->RelaunchTests(test_launcher(), tests_to_relaunch,
-                                       launch_flags());
-  }
-
-  // The temporary file's directory is also temporary.
-  DeleteFile(output_file().DirName(), true);
-  if (!flag_file().empty())
-    DeleteFile(flag_file(), false);
-}
-
-class SerialUnitTestProcessLifetimeObserver
-    : public UnitTestProcessLifetimeObserver {
- public:
-  SerialUnitTestProcessLifetimeObserver(
-      TestLauncher* test_launcher,
-      UnitTestPlatformDelegate* platform_delegate,
-      const std::vector<std::string>& test_names,
-      int launch_flags,
-      const FilePath& output_file,
-      const FilePath& flag_file,
-      std::vector<std::string>&& next_test_names)
-      : UnitTestProcessLifetimeObserver(test_launcher,
-                                        platform_delegate,
-                                        test_names,
-                                        launch_flags,
-                                        output_file,
-                                        flag_file),
-        next_test_names_(std::move(next_test_names)) {}
-  ~SerialUnitTestProcessLifetimeObserver() override = default;
-
- private:
-  // ProcessLifetimeObserver:
-  void OnCompleted(int exit_code,
-                   TimeDelta elapsed_time,
-                   bool was_timeout,
-                   const std::string& output) override;
-
-  std::vector<std::string> next_test_names_;
-
-  DISALLOW_COPY_AND_ASSIGN(SerialUnitTestProcessLifetimeObserver);
-};
-
-void SerialUnitTestProcessLifetimeObserver::OnCompleted(
-    int exit_code,
-    TimeDelta elapsed_time,
-    bool was_timeout,
-    const std::string& output) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  std::vector<std::string> tests_to_relaunch;
-  bool called_any_callbacks =
-      ProcessTestResults(test_launcher(), test_names(), output_file(), output,
-                         exit_code, was_timeout, &tests_to_relaunch);
-
-  // There is only one test, there cannot be other tests to relaunch
-  // due to a crash.
-  DCHECK(tests_to_relaunch.empty());
-
-  // There is only one test, we should have called back with its result.
-  DCHECK(called_any_callbacks);
-
-  // The temporary file's directory is also temporary.
-  DeleteFile(output_file().DirName(), true);
-
-  if (!flag_file().empty())
-    DeleteFile(flag_file(), false);
-
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      BindOnce(&RunUnitTestsSerially, test_launcher(), platform_delegate(),
-               std::move(next_test_names_), launch_flags()));
-}
-
-}  // namespace
-
-int LaunchUnitTests(int argc,
-                    char** argv,
-                    RunTestSuiteCallback run_test_suite) {
-  CommandLine::Init(argc, argv);
-  size_t parallel_jobs = NumParallelJobs();
-  if (parallel_jobs == 0U) {
-    return 1;
-  }
-  return LaunchUnitTestsInternal(std::move(run_test_suite), parallel_jobs,
-                                 kDefaultTestBatchLimit, true,
-                                 BindOnce(&InitGoogleTestChar, &argc, argv));
-}
-
-int LaunchUnitTestsSerially(int argc,
-                            char** argv,
-                            RunTestSuiteCallback run_test_suite) {
-  CommandLine::Init(argc, argv);
-  return LaunchUnitTestsInternal(std::move(run_test_suite), 1U,
-                                 kDefaultTestBatchLimit, true,
-                                 BindOnce(&InitGoogleTestChar, &argc, argv));
-}
-
-int LaunchUnitTestsWithOptions(int argc,
-                               char** argv,
-                               size_t parallel_jobs,
-                               int default_batch_limit,
-                               bool use_job_objects,
-                               RunTestSuiteCallback run_test_suite) {
-  CommandLine::Init(argc, argv);
-  return LaunchUnitTestsInternal(std::move(run_test_suite), parallel_jobs,
-                                 default_batch_limit, use_job_objects,
-                                 BindOnce(&InitGoogleTestChar, &argc, argv));
-}
-
-#if defined(OS_WIN)
-int LaunchUnitTests(int argc,
-                    wchar_t** argv,
-                    bool use_job_objects,
-                    RunTestSuiteCallback run_test_suite) {
-  // Windows CommandLine::Init ignores argv anyway.
-  CommandLine::Init(argc, NULL);
-  size_t parallel_jobs = NumParallelJobs();
-  if (parallel_jobs == 0U) {
-    return 1;
-  }
-  return LaunchUnitTestsInternal(std::move(run_test_suite), parallel_jobs,
-                                 kDefaultTestBatchLimit, use_job_objects,
-                                 BindOnce(&InitGoogleTestWChar, &argc, argv));
-}
-#endif  // defined(OS_WIN)
-
-void RunUnitTestsSerially(
-    TestLauncher* test_launcher,
-    UnitTestPlatformDelegate* platform_delegate,
-    const std::vector<std::string>& test_names,
-    int launch_flags) {
-  if (test_names.empty())
-    return;
-
-  // Create a dedicated temporary directory to store the xml result data
-  // per run to ensure clean state and make it possible to launch multiple
-  // processes in parallel.
-  FilePath output_file;
-  CHECK(platform_delegate->CreateResultsFile(&output_file));
-  FilePath flag_file;
-  platform_delegate->CreateTemporaryFile(&flag_file);
-
-  auto observer = std::make_unique<SerialUnitTestProcessLifetimeObserver>(
-      test_launcher, platform_delegate,
-      std::vector<std::string>(1, test_names.back()), launch_flags, output_file,
-      flag_file,
-      std::vector<std::string>(test_names.begin(), test_names.end() - 1));
-
-  CommandLine cmd_line(platform_delegate->GetCommandLineForChildGTestProcess(
-      observer->test_names(), output_file, flag_file));
-
-  TestLauncher::LaunchOptions launch_options;
-  launch_options.flags = launch_flags;
-  test_launcher->LaunchChildGTestProcess(
-      cmd_line, platform_delegate->GetWrapperForChildGTestProcess(),
-      TestTimeouts::test_launcher_timeout(), launch_options,
-      std::move(observer));
-}
-
-void RunUnitTestsBatch(
-    TestLauncher* test_launcher,
-    UnitTestPlatformDelegate* platform_delegate,
-    const std::vector<std::string>& test_names,
-    int launch_flags) {
-  if (test_names.empty())
-    return;
-
-  // Create a dedicated temporary directory to store the xml result data
-  // per run to ensure clean state and make it possible to launch multiple
-  // processes in parallel.
-  FilePath output_file;
-  CHECK(platform_delegate->CreateResultsFile(&output_file));
-  FilePath flag_file;
-  platform_delegate->CreateTemporaryFile(&flag_file);
-
-  auto observer = std::make_unique<ParallelUnitTestProcessLifetimeObserver>(
-      test_launcher, platform_delegate, test_names, launch_flags, output_file,
-      flag_file);
-
-  CommandLine cmd_line(platform_delegate->GetCommandLineForChildGTestProcess(
-      test_names, output_file, flag_file));
-
-  // Adjust the timeout depending on how many tests we're running
-  // (note that e.g. the last batch of tests will be smaller).
-  // TODO(phajdan.jr): Consider an adaptive timeout, which can change
-  // depending on how many tests ran and how many remain.
-  // Note: do NOT parse child's stdout to do that, it's known to be
-  // unreliable (e.g. buffering issues can mix up the output).
-  TimeDelta timeout = test_names.size() * TestTimeouts::test_launcher_timeout();
-
-  TestLauncher::LaunchOptions options;
-  options.flags = launch_flags;
-  test_launcher->LaunchChildGTestProcess(
-      cmd_line, platform_delegate->GetWrapperForChildGTestProcess(), timeout,
-      options, std::move(observer));
-}
-
-UnitTestLauncherDelegate::UnitTestLauncherDelegate(
-    UnitTestPlatformDelegate* platform_delegate,
-    size_t batch_limit,
-    bool use_job_objects)
-    : platform_delegate_(platform_delegate),
-      batch_limit_(batch_limit),
-      use_job_objects_(use_job_objects) {
-}
-
-UnitTestLauncherDelegate::~UnitTestLauncherDelegate() {
-  DCHECK(thread_checker_.CalledOnValidThread());
-}
-
-bool UnitTestLauncherDelegate::GetTests(std::vector<TestIdentifier>* output) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-  return platform_delegate_->GetTests(output);
-}
-
-bool UnitTestLauncherDelegate::ShouldRunTest(const std::string& test_case_name,
-                                             const std::string& test_name) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  // There is no additional logic to disable specific tests.
-  return true;
-}
-
-size_t UnitTestLauncherDelegate::RunTests(
-    TestLauncher* test_launcher,
-    const std::vector<std::string>& test_names) {
-  DCHECK(thread_checker_.CalledOnValidThread());
-
-  int launch_flags = use_job_objects_ ? TestLauncher::USE_JOB_OBJECTS : 0;
-
-  std::vector<std::string> batch;
-  for (size_t i = 0; i < test_names.size(); i++) {
-    batch.push_back(test_names[i]);
-
-    // Use 0 to indicate unlimited batch size.
-    if (batch.size() >= batch_limit_ && batch_limit_ != 0) {
-      RunUnitTestsBatch(test_launcher, platform_delegate_, batch, launch_flags);
-      batch.clear();
-    }
-  }
-
-  RunUnitTestsBatch(test_launcher, platform_delegate_, batch, launch_flags);
-
-  return test_names.size();
-}
-
-size_t UnitTestLauncherDelegate::RetryTests(
-    TestLauncher* test_launcher,
-    const std::vector<std::string>& test_names) {
-  ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE,
-      BindOnce(&RunUnitTestsSerially, test_launcher, platform_delegate_,
-               test_names,
-               use_job_objects_ ? TestLauncher::USE_JOB_OBJECTS : 0));
-  return test_names.size();
-}
-
-}  // namespace base
diff --git a/base/test/launcher/unit_test_launcher.h b/base/test/launcher/unit_test_launcher.h
deleted file mode 100644
index 4e3d314..0000000
--- a/base/test/launcher/unit_test_launcher.h
+++ /dev/null
@@ -1,134 +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.
-
-#ifndef BASE_TEST_LAUNCHER_UNIT_TEST_LAUNCHER_H_
-#define BASE_TEST_LAUNCHER_UNIT_TEST_LAUNCHER_H_
-
-#include <stddef.h>
-
-#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/test/launcher/test_launcher.h"
-#include "build_config.h"
-
-namespace base {
-
-// Callback that runs a test suite and returns exit code.
-using RunTestSuiteCallback = OnceCallback<int(void)>;
-
-// Launches unit tests in given test suite. Returns exit code.
-int LaunchUnitTests(int argc, char** argv, RunTestSuiteCallback run_test_suite);
-
-// Same as above, but always runs tests serially.
-int LaunchUnitTestsSerially(int argc,
-                            char** argv,
-                            RunTestSuiteCallback run_test_suite);
-
-// Launches unit tests in given test suite. Returns exit code.
-// |parallel_jobs| is the number of parallel test jobs.
-// |default_batch_limit| is the default size of test batch
-// (use 0 to disable batching).
-// |use_job_objects| determines whether to use job objects.
-int LaunchUnitTestsWithOptions(int argc,
-                               char** argv,
-                               size_t parallel_jobs,
-                               int default_batch_limit,
-                               bool use_job_objects,
-                               RunTestSuiteCallback run_test_suite);
-
-#if defined(OS_WIN)
-// Launches unit tests in given test suite. Returns exit code.
-// |use_job_objects| determines whether to use job objects.
-int LaunchUnitTests(int argc,
-                    wchar_t** argv,
-                    bool use_job_objects,
-                    RunTestSuiteCallback run_test_suite);
-#endif  // defined(OS_WIN)
-
-// Delegate to abstract away platform differences for unit tests.
-class UnitTestPlatformDelegate {
- public:
-  // Called to get names of tests available for running. The delegate
-  // must put the result in |output| and return true on success.
-  virtual bool GetTests(std::vector<TestIdentifier>* output) = 0;
-
-  // Called to create a temporary for storing test results. The delegate
-  // must put the resulting path in |path| and return true on success.
-  virtual bool CreateResultsFile(base::FilePath* path) = 0;
-
-  // Called to create a new temporary file. The delegate must put the resulting
-  // path in |path| and return true on success.
-  virtual bool CreateTemporaryFile(base::FilePath* path) = 0;
-
-  // Returns command line for child GTest process based on the command line
-  // of current process. |test_names| is a vector of test full names
-  // (e.g. "A.B"), |output_file| is path to the GTest XML output file.
-  virtual CommandLine GetCommandLineForChildGTestProcess(
-      const std::vector<std::string>& test_names,
-      const base::FilePath& output_file,
-      const base::FilePath& flag_file) = 0;
-
-  // Returns wrapper to use for child GTest process. Empty string means
-  // no wrapper.
-  virtual std::string GetWrapperForChildGTestProcess() = 0;
-
-  // Relaunch tests, e.g. after a crash.
-  virtual void RelaunchTests(TestLauncher* test_launcher,
-                             const std::vector<std::string>& test_names,
-                             int launch_flags) = 0;
-
- protected:
-  ~UnitTestPlatformDelegate() = default;
-};
-
-// Runs tests serially, each in its own process.
-void RunUnitTestsSerially(TestLauncher* test_launcher,
-                          UnitTestPlatformDelegate* platform_delegate,
-                          const std::vector<std::string>& test_names,
-                          int launch_flags);
-
-// Runs tests in batches (each batch in its own process).
-void RunUnitTestsBatch(TestLauncher* test_launcher,
-                       UnitTestPlatformDelegate* platform_delegate,
-                       const std::vector<std::string>& test_names,
-                       int launch_flags);
-
-// Test launcher delegate for unit tests (mostly to support batching).
-class UnitTestLauncherDelegate : public TestLauncherDelegate {
- public:
-  UnitTestLauncherDelegate(UnitTestPlatformDelegate* delegate,
-                           size_t batch_limit,
-                           bool use_job_objects);
-  ~UnitTestLauncherDelegate() override;
-
- private:
-  // TestLauncherDelegate:
-  bool GetTests(std::vector<TestIdentifier>* output) override;
-  bool ShouldRunTest(const std::string& test_case_name,
-                     const std::string& test_name) override;
-  size_t RunTests(TestLauncher* test_launcher,
-                  const std::vector<std::string>& test_names) override;
-  size_t RetryTests(TestLauncher* test_launcher,
-                    const std::vector<std::string>& test_names) override;
-
-  ThreadChecker thread_checker_;
-
-  UnitTestPlatformDelegate* platform_delegate_;
-
-  // Maximum number of tests to run in a single batch.
-  size_t batch_limit_;
-
-  // Determines whether we use job objects on Windows.
-  bool use_job_objects_;
-
-  DISALLOW_COPY_AND_ASSIGN(UnitTestLauncherDelegate);
-};
-
-}   // namespace base
-
-#endif  // BASE_TEST_LAUNCHER_UNIT_TEST_LAUNCHER_H_
diff --git a/base/test/launcher/unit_test_launcher_nacl_nonsfi.cc b/base/test/launcher/unit_test_launcher_nacl_nonsfi.cc
deleted file mode 100644
index 237a3da..0000000
--- a/base/test/launcher/unit_test_launcher_nacl_nonsfi.cc
+++ /dev/null
@@ -1,51 +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/launcher/unit_test_launcher.h"
-
-#include "base/command_line.h"
-#include "base/files/file_util.h"
-#include "base/test/gtest_util.h"
-#include "base/test/gtest_xml_unittest_result_printer.h"
-#include "base/test/test_switches.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-int LaunchUnitTests(int argc,
-                    char** argv,
-                    RunTestSuiteCallback run_test_suite) {
-  CHECK(CommandLine::InitializedForCurrentProcess() ||
-        CommandLine::Init(argc, argv));
-  const CommandLine* command_line = CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch(switches::kTestLauncherListTests)) {
-    // Dump all test list into a file.
-    FilePath list_path(
-        command_line->GetSwitchValuePath(switches::kTestLauncherListTests));
-    if (!WriteCompiledInTestsToFile(list_path)) {
-      LOG(ERROR) << "Failed to write list of tests.";
-      return 1;
-    }
-
-    // Successfully done.
-    return 0;
-  }
-
-  // Register XML output printer, if --test-launcher-output flag is set.
-  if (command_line->HasSwitch(switches::kTestLauncherOutput)) {
-    FilePath output_path = command_line->GetSwitchValuePath(
-        switches::kTestLauncherOutput);
-    if (PathExists(output_path)) {
-      LOG(WARNING) << "Test launcher output path exists. Do not override";
-    } else {
-      XmlUnitTestResultPrinter* printer = new XmlUnitTestResultPrinter;
-      CHECK(printer->Initialize(output_path));
-      testing::UnitTest::GetInstance()->listeners().Append(printer);
-    }
-  }
-
-  return std::move(run_test_suite).Run();
-}
-
-}  // namespace base
diff --git a/base/test/malloc_wrapper.cc b/base/test/malloc_wrapper.cc
deleted file mode 100644
index eb280a3..0000000
--- a/base/test/malloc_wrapper.cc
+++ /dev/null
@@ -1,11 +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 "malloc_wrapper.h"
-
-#include <stdlib.h>
-
-void* MallocWrapper(size_t size) {
-  return malloc(size);
-}
diff --git a/base/test/malloc_wrapper.h b/base/test/malloc_wrapper.h
deleted file mode 100644
index d06228d..0000000
--- a/base/test/malloc_wrapper.h
+++ /dev/null
@@ -1,21 +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.
-
-#ifndef BASE_TEST_MALLOC_WRAPPER_H_
-#define BASE_TEST_MALLOC_WRAPPER_H_
-
-#include <stddef.h>
-
-// BASE_EXPORT depends on COMPONENT_BUILD.
-// This will always be a separate shared library, so don't use BASE_EXPORT here.
-#if defined(WIN32)
-#define MALLOC_WRAPPER_EXPORT __declspec(dllexport)
-#else
-#define MALLOC_WRAPPER_EXPORT __attribute__((visibility("default")))
-#endif  // defined(WIN32)
-
-// Calls malloc directly.
-MALLOC_WRAPPER_EXPORT void* MallocWrapper(size_t size);
-
-#endif  // BASE_TEST_MALLOC_WRAPPER_H_
diff --git a/base/test/mock_callback.h b/base/test/mock_callback.h
deleted file mode 100644
index 7ac4d34..0000000
--- a/base/test/mock_callback.h
+++ /dev/null
@@ -1,366 +0,0 @@
-// This file was GENERATED by command:
-//     pump.py mock_callback.h.pump
-// DO NOT EDIT BY HAND!!!
-
-// 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.
-
-// Analogous to GMock's built-in MockFunction, but for base::Callback instead of
-// std::function. It takes the full callback type as a parameter, so that it can
-// support both OnceCallback and RepeatingCallback.
-//
-// Use:
-//   using FooCallback = base::Callback<int(std::string)>;
-//
-//   TEST(FooTest, RunsCallbackWithBarArgument) {
-//     base::MockCallback<FooCallback> callback;
-//     EXPECT_CALL(callback, Run("bar")).WillOnce(Return(1));
-//     Foo(callback.Get());
-//   }
-//
-// Can be used with StrictMock and NiceMock. Caller must ensure that it outlives
-// any base::Callback obtained from it.
-
-#ifndef BASE_TEST_MOCK_CALLBACK_H_
-#define BASE_TEST_MOCK_CALLBACK_H_
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace base {
-
-// clang-format off
-
-template <typename F>
-class MockCallback;
-
-template <typename R>
-class MockCallback<Callback<R()>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD0_T(Run, R());
-
-  Callback<R()> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R>
-class MockCallback<OnceCallback<R()>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD0_T(Run, R());
-
-  OnceCallback<R()> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1>
-class MockCallback<Callback<R(A1)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD1_T(Run, R(A1));
-
-  Callback<R(A1)> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1>
-class MockCallback<OnceCallback<R(A1)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD1_T(Run, R(A1));
-
-  OnceCallback<R(A1)> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2>
-class MockCallback<Callback<R(A1, A2)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD2_T(Run, R(A1, A2));
-
-  Callback<R(A1, A2)> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2>
-class MockCallback<OnceCallback<R(A1, A2)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD2_T(Run, R(A1, A2));
-
-  OnceCallback<R(A1, A2)> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3>
-class MockCallback<Callback<R(A1, A2, A3)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD3_T(Run, R(A1, A2, A3));
-
-  Callback<R(A1, A2, A3)> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3>
-class MockCallback<OnceCallback<R(A1, A2, A3)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD3_T(Run, R(A1, A2, A3));
-
-  OnceCallback<R(A1, A2, A3)> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4>
-class MockCallback<Callback<R(A1, A2, A3, A4)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD4_T(Run, R(A1, A2, A3, A4));
-
-  Callback<R(A1, A2, A3, A4)> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4>
-class MockCallback<OnceCallback<R(A1, A2, A3, A4)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD4_T(Run, R(A1, A2, A3, A4));
-
-  OnceCallback<R(A1, A2, A3, A4)> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5>
-class MockCallback<Callback<R(A1, A2, A3, A4, A5)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD5_T(Run, R(A1, A2, A3, A4, A5));
-
-  Callback<R(A1, A2, A3, A4, A5)> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5>
-class MockCallback<OnceCallback<R(A1, A2, A3, A4, A5)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD5_T(Run, R(A1, A2, A3, A4, A5));
-
-  OnceCallback<R(A1, A2, A3, A4, A5)> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6>
-class MockCallback<Callback<R(A1, A2, A3, A4, A5, A6)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD6_T(Run, R(A1, A2, A3, A4, A5, A6));
-
-  Callback<R(A1, A2, A3, A4, A5, A6)> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6>
-class MockCallback<OnceCallback<R(A1, A2, A3, A4, A5, A6)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD6_T(Run, R(A1, A2, A3, A4, A5, A6));
-
-  OnceCallback<R(A1, A2, A3, A4, A5, A6)> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6, typename A7>
-class MockCallback<Callback<R(A1, A2, A3, A4, A5, A6, A7)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD7_T(Run, R(A1, A2, A3, A4, A5, A6, A7));
-
-  Callback<R(A1, A2, A3, A4, A5, A6, A7)> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6, typename A7>
-class MockCallback<OnceCallback<R(A1, A2, A3, A4, A5, A6, A7)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD7_T(Run, R(A1, A2, A3, A4, A5, A6, A7));
-
-  OnceCallback<R(A1, A2, A3, A4, A5, A6, A7)> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6, typename A7, typename A8>
-class MockCallback<Callback<R(A1, A2, A3, A4, A5, A6, A7, A8)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD8_T(Run, R(A1, A2, A3, A4, A5, A6, A7, A8));
-
-  Callback<R(A1, A2, A3, A4, A5, A6, A7, A8)> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6, typename A7, typename A8>
-class MockCallback<OnceCallback<R(A1, A2, A3, A4, A5, A6, A7, A8)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD8_T(Run, R(A1, A2, A3, A4, A5, A6, A7, A8));
-
-  OnceCallback<R(A1, A2, A3, A4, A5, A6, A7, A8)> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6, typename A7, typename A8, typename A9>
-class MockCallback<Callback<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD9_T(Run, R(A1, A2, A3, A4, A5, A6, A7, A8, A9));
-
-  Callback<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6, typename A7, typename A8, typename A9>
-class MockCallback<OnceCallback<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD9_T(Run, R(A1, A2, A3, A4, A5, A6, A7, A8, A9));
-
-  OnceCallback<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6, typename A7, typename A8, typename A9,
-    typename A10>
-class MockCallback<Callback<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD10_T(Run, R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10));
-
-  Callback<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R, typename A1, typename A2, typename A3, typename A4,
-    typename A5, typename A6, typename A7, typename A8, typename A9,
-    typename A10>
-class MockCallback<OnceCallback<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD10_T(Run, R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10));
-
-  OnceCallback<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-// clang-format on
-
-}  // namespace base
-
-#endif  // BASE_TEST_MOCK_CALLBACK_H_
diff --git a/base/test/mock_callback.h.pump b/base/test/mock_callback.h.pump
deleted file mode 100644
index 3372789..0000000
--- a/base/test/mock_callback.h.pump
+++ /dev/null
@@ -1,85 +0,0 @@
-$$ This is a pump file for generating file templates.  Pump is a python
-$$ script that is part of the Google Test suite of utilities.  Description
-$$ can be found here:
-$$
-$$ https://github.com/google/googletest/blob/master/googletest/docs/PumpManual.md
-$$
-$$ MAX_ARITY controls the number of arguments that MockCallback supports.
-$$ It is choosen to match the number GMock supports.
-$var MAX_ARITY = 10
-$$
-// 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.
-
-// Analogous to GMock's built-in MockFunction, but for base::Callback instead of
-// std::function. It takes the full callback type as a parameter, so that it can
-// support both OnceCallback and RepeatingCallback.
-//
-// Use:
-//   using FooCallback = base::Callback<int(std::string)>;
-//
-//   TEST(FooTest, RunsCallbackWithBarArgument) {
-//     base::MockCallback<FooCallback> callback;
-//     EXPECT_CALL(callback, Run("bar")).WillOnce(Return(1));
-//     Foo(callback.Get());
-//   }
-//
-// Can be used with StrictMock and NiceMock. Caller must ensure that it outlives
-// any base::Callback obtained from it.
-
-#ifndef BASE_TEST_MOCK_CALLBACK_H_
-#define BASE_TEST_MOCK_CALLBACK_H_
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace base {
-
-// clang-format off
-
-template <typename F>
-class MockCallback;
-
-$range i 0..MAX_ARITY
-$for i [[
-$range j 1..i
-$var run_type = [[R($for j, [[A$j]])]]
-
-template <typename R$for j [[, typename A$j]]>
-class MockCallback<Callback<$run_type>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD$(i)_T(Run, $run_type);
-
-  Callback<$run_type> Get() {
-    return Bind(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-template <typename R$for j [[, typename A$j]]>
-class MockCallback<OnceCallback<$run_type>> {
- public:
-  MockCallback() = default;
-  MOCK_METHOD$(i)_T(Run, $run_type);
-
-  OnceCallback<$run_type> Get() {
-    return BindOnce(&MockCallback::Run, Unretained(this));
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockCallback);
-};
-
-]]
-
-// clang-format on
-
-}  // namespace base
-
-#endif  // BASE_TEST_MOCK_CALLBACK_H_
diff --git a/base/test/mock_chrome_application_mac.h b/base/test/mock_chrome_application_mac.h
deleted file mode 100644
index ffa3080..0000000
--- a/base/test/mock_chrome_application_mac.h
+++ /dev/null
@@ -1,33 +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.
-
-#ifndef BASE_TEST_MOCK_CHROME_APPLICATION_MAC_H_
-#define BASE_TEST_MOCK_CHROME_APPLICATION_MAC_H_
-
-#if defined(__OBJC__)
-
-#import <AppKit/AppKit.h>
-
-#include "base/mac/scoped_sending_event.h"
-#include "base/message_loop/message_pump_mac.h"
-
-// A basic implementation of CrAppProtocol and
-// CrAppControlProtocol. This can be used in tests that need an
-// NSApplication and use a runloop, or which need a ScopedSendingEvent
-// when handling a nested event loop.
-@interface MockCrApp : NSApplication<CrAppProtocol,
-                                     CrAppControlProtocol> {
- @private
-  BOOL handlingSendEvent_;
-}
-@end
-
-#endif
-
-// To be used to instantiate MockCrApp from C++ code.
-namespace mock_cr_app {
-void RegisterMockCrApp();
-}  // namespace mock_cr_app
-
-#endif  // BASE_TEST_MOCK_CHROME_APPLICATION_MAC_H_
diff --git a/base/test/mock_chrome_application_mac.mm b/base/test/mock_chrome_application_mac.mm
deleted file mode 100644
index 0890553..0000000
--- a/base/test/mock_chrome_application_mac.mm
+++ /dev/null
@@ -1,44 +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/test/mock_chrome_application_mac.h"
-
-#include "base/auto_reset.h"
-#include "base/logging.h"
-
-@implementation MockCrApp
-
-+ (NSApplication*)sharedApplication {
-  NSApplication* app = [super sharedApplication];
-  DCHECK([app conformsToProtocol:@protocol(CrAppControlProtocol)])
-      << "Existing NSApp (class " << [[app className] UTF8String]
-      << ") does not conform to required protocol.";
-  DCHECK(base::MessagePumpMac::UsingCrApp())
-      << "MessagePumpMac::Create() was called before "
-      << "+[MockCrApp sharedApplication]";
-  return app;
-}
-
-- (void)sendEvent:(NSEvent*)event {
-  base::AutoReset<BOOL> scoper(&handlingSendEvent_, YES);
-  [super sendEvent:event];
-}
-
-- (void)setHandlingSendEvent:(BOOL)handlingSendEvent {
-  handlingSendEvent_ = handlingSendEvent;
-}
-
-- (BOOL)isHandlingSendEvent {
-  return handlingSendEvent_;
-}
-
-@end
-
-namespace mock_cr_app {
-
-void RegisterMockCrApp() {
-  [MockCrApp sharedApplication];
-}
-
-}  // namespace mock_cr_app
diff --git a/base/test/mock_devices_changed_observer.cc b/base/test/mock_devices_changed_observer.cc
deleted file mode 100644
index 9fc57cd..0000000
--- a/base/test/mock_devices_changed_observer.cc
+++ /dev/null
@@ -1,13 +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/mock_devices_changed_observer.h"
-
-namespace base {
-
-MockDevicesChangedObserver::MockDevicesChangedObserver() = default;
-
-MockDevicesChangedObserver::~MockDevicesChangedObserver() = default;
-
-}  // namespace base
diff --git a/base/test/mock_devices_changed_observer.h b/base/test/mock_devices_changed_observer.h
deleted file mode 100644
index 0734fb4..0000000
--- a/base/test/mock_devices_changed_observer.h
+++ /dev/null
@@ -1,31 +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.
-
-#ifndef BASE_TEST_MOCK_DEVICES_CHANGED_OBSERVER_H_
-#define BASE_TEST_MOCK_DEVICES_CHANGED_OBSERVER_H_
-
-#include <string>
-
-#include "base/macros.h"
-#include "base/system_monitor/system_monitor.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace base {
-
-class MockDevicesChangedObserver
-    : public base::SystemMonitor::DevicesChangedObserver {
- public:
-  MockDevicesChangedObserver();
-  ~MockDevicesChangedObserver() override;
-
-  MOCK_METHOD1(OnDevicesChanged,
-               void(base::SystemMonitor::DeviceType device_type));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockDevicesChangedObserver);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_MOCK_DEVICES_CHANGED_OBSERVER_H_
diff --git a/base/test/mock_entropy_provider.cc b/base/test/mock_entropy_provider.cc
deleted file mode 100644
index f3fd2a4..0000000
--- a/base/test/mock_entropy_provider.cc
+++ /dev/null
@@ -1,20 +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/mock_entropy_provider.h"
-
-namespace base {
-
-MockEntropyProvider::MockEntropyProvider() : entropy_value_(0.5) {}
-MockEntropyProvider::MockEntropyProvider(double entropy_value)
-    : entropy_value_(entropy_value) {}
-MockEntropyProvider::~MockEntropyProvider() = default;
-
-double MockEntropyProvider::GetEntropyForTrial(
-    const std::string& trial_name,
-    uint32_t randomization_seed) const {
-  return entropy_value_;
-}
-
-}  // namespace base
diff --git a/base/test/mock_entropy_provider.h b/base/test/mock_entropy_provider.h
deleted file mode 100644
index ca2b4bc..0000000
--- a/base/test/mock_entropy_provider.h
+++ /dev/null
@@ -1,32 +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.
-
-#ifndef BASE_TEST_MOCK_ENTROPY_PROVIDER_H_
-#define BASE_TEST_MOCK_ENTROPY_PROVIDER_H_
-
-#include <stdint.h>
-
-#include "base/metrics/field_trial.h"
-
-namespace base {
-
-class MockEntropyProvider : public base::FieldTrial::EntropyProvider {
- public:
-  MockEntropyProvider();
-  explicit MockEntropyProvider(double entropy_value);
-  ~MockEntropyProvider() override;
-
-  // base::FieldTrial::EntropyProvider:
-  double GetEntropyForTrial(const std::string& trial_name,
-                            uint32_t randomization_seed) const override;
-
- private:
-  double entropy_value_;
-
-  DISALLOW_COPY_AND_ASSIGN(MockEntropyProvider);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_MOCK_ENTROPY_PROVIDER_H_
diff --git a/base/test/mock_log.cc b/base/test/mock_log.cc
deleted file mode 100644
index a09000d..0000000
--- a/base/test/mock_log.cc
+++ /dev/null
@@ -1,68 +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/mock_log.h"
-
-namespace base {
-namespace test {
-
-// static
-MockLog* MockLog::g_instance_ = nullptr;
-Lock MockLog::g_lock;
-
-MockLog::MockLog() : is_capturing_logs_(false) {
-}
-
-MockLog::~MockLog() {
-  if (is_capturing_logs_) {
-    StopCapturingLogs();
-  }
-}
-
-void MockLog::StartCapturingLogs() {
-  AutoLock scoped_lock(g_lock);
-
-  // We don't use CHECK(), which can generate a new LOG message, and
-  // thus can confuse MockLog objects or other registered
-  // LogSinks.
-  RAW_CHECK(!is_capturing_logs_);
-  RAW_CHECK(!g_instance_);
-
-  is_capturing_logs_ = true;
-  g_instance_ = this;
-  previous_handler_ = logging::GetLogMessageHandler();
-  logging::SetLogMessageHandler(LogMessageHandler);
-}
-
-void MockLog::StopCapturingLogs() {
-  AutoLock scoped_lock(g_lock);
-
-  // We don't use CHECK(), which can generate a new LOG message, and
-  // thus can confuse MockLog objects or other registered
-  // LogSinks.
-  RAW_CHECK(is_capturing_logs_);
-  RAW_CHECK(g_instance_ == this);
-
-  is_capturing_logs_ = false;
-  logging::SetLogMessageHandler(previous_handler_);
-  g_instance_ = nullptr;
-}
-
-// static
-bool MockLog::LogMessageHandler(int severity,
-                                const char* file,
-                                int line,
-                                size_t message_start,
-                                const std::string& str) {
-  // gMock guarantees thread-safety for calling a mocked method
-  // (https://github.com/google/googlemock/blob/master/googlemock/docs/CookBook.md#using-google-mock-and-threads)
-  // but we also need to make sure that Start/StopCapturingLogs are synchronized
-  // with LogMessageHandler.
-  AutoLock scoped_lock(g_lock);
-
-  return g_instance_->Log(severity, file, line, message_start, str);
-}
-
-}  // namespace test
-}  // namespace base
diff --git a/base/test/mock_log.h b/base/test/mock_log.h
deleted file mode 100644
index cda2fcd..0000000
--- a/base/test/mock_log.h
+++ /dev/null
@@ -1,100 +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.
-
-#ifndef BASE_TEST_MOCK_LOG_H_
-#define BASE_TEST_MOCK_LOG_H_
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/synchronization/lock.h"
-#include "testing/gmock/include/gmock/gmock.h"
-
-namespace base {
-namespace test {
-
-// A MockLog object intercepts LOG() messages issued during its lifespan.  Using
-// this together with gMock, it's very easy to test how a piece of code calls
-// LOG().  The typical usage:
-//
-//   TEST(FooTest, LogsCorrectly) {
-//     MockLog log;
-//
-//     // We expect the WARNING "Something bad!" exactly twice.
-//     EXPECT_CALL(log, Log(WARNING, _, "Something bad!"))
-//         .Times(2);
-//
-//     // We allow foo.cc to call LOG(INFO) any number of times.
-//     EXPECT_CALL(log, Log(INFO, HasSubstr("/foo.cc"), _))
-//         .Times(AnyNumber());
-//
-//     log.StartCapturingLogs();  // Call this after done setting expectations.
-//     Foo();  // Exercises the code under test.
-//   }
-//
-// CAVEAT: base/logging does not allow a thread to call LOG() again when it's
-// already inside a LOG() call.  Doing so will cause a deadlock.  Therefore,
-// it's the user's responsibility to not call LOG() in an action triggered by
-// MockLog::Log().  You may call RAW_LOG() instead.
-class MockLog {
- public:
-  // Creates a MockLog object that is not capturing logs.  If it were to start
-  // to capture logs, it could be a problem if some other threads already exist
-  // and are logging, as the user hasn't had a chance to set up expectation on
-  // this object yet (calling a mock method before setting the expectation is
-  // UNDEFINED behavior).
-  MockLog();
-
-  // When the object is destructed, it stops intercepting logs.
-  ~MockLog();
-
-  // Starts log capturing if the object isn't already doing so.
-  // Otherwise crashes.
-  void StartCapturingLogs();
-
-  // Stops log capturing if the object is capturing logs.  Otherwise crashes.
-  void StopCapturingLogs();
-
-  // Log method is invoked for every log message before it's sent to other log
-  // destinations (if any).  The method should return true to signal that it
-  // handled the message and the message should not be sent to other log
-  // destinations.
-  MOCK_METHOD5(Log,
-               bool(int severity,
-                    const char* file,
-                    int line,
-                    size_t message_start,
-                    const std::string& str));
-
- private:
-  // The currently active mock log.
-  static MockLog* g_instance_;
-
-  // Lock protecting access to g_instance_.
-  static Lock g_lock;
-
-  // Static function which is set as the logging message handler.
-  // Called once for each message.
-  static bool LogMessageHandler(int severity,
-                                const char* file,
-                                int line,
-                                size_t message_start,
-                                const std::string& str);
-
-  // True if this object is currently capturing logs.
-  bool is_capturing_logs_;
-
-  // The previous handler to restore when the MockLog is destroyed.
-  logging::LogMessageHandlerFunction previous_handler_;
-
-  DISALLOW_COPY_AND_ASSIGN(MockLog);
-};
-
-}  // namespace test
-}  // namespace base
-
-#endif  // BASE_TEST_MOCK_LOG_H_
diff --git a/base/test/move_only_int.h b/base/test/move_only_int.h
deleted file mode 100644
index 6e90983..0000000
--- a/base/test/move_only_int.h
+++ /dev/null
@@ -1,68 +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.
-
-#ifndef BASE_TEST_MOVE_ONLY_INT_H_
-#define BASE_TEST_MOVE_ONLY_INT_H_
-
-#include "base/macros.h"
-
-namespace base {
-
-// A move-only class that holds an integer. This is designed for testing
-// containers. See also CopyOnlyInt.
-class MoveOnlyInt {
- public:
-  explicit MoveOnlyInt(int data = 1) : data_(data) {}
-  MoveOnlyInt(MoveOnlyInt&& other) : data_(other.data_) { other.data_ = 0; }
-  ~MoveOnlyInt() { data_ = 0; }
-
-  MoveOnlyInt& operator=(MoveOnlyInt&& other) {
-    data_ = other.data_;
-    other.data_ = 0;
-    return *this;
-  }
-
-  friend bool operator==(const MoveOnlyInt& lhs, const MoveOnlyInt& rhs) {
-    return lhs.data_ == rhs.data_;
-  }
-
-  friend bool operator!=(const MoveOnlyInt& lhs, const MoveOnlyInt& rhs) {
-    return !operator==(lhs, rhs);
-  }
-
-  friend bool operator<(const MoveOnlyInt& lhs, int rhs) {
-    return lhs.data_ < rhs;
-  }
-
-  friend bool operator<(int lhs, const MoveOnlyInt& rhs) {
-    return lhs < rhs.data_;
-  }
-
-  friend bool operator<(const MoveOnlyInt& lhs, const MoveOnlyInt& rhs) {
-    return lhs.data_ < rhs.data_;
-  }
-
-  friend bool operator>(const MoveOnlyInt& lhs, const MoveOnlyInt& rhs) {
-    return rhs < lhs;
-  }
-
-  friend bool operator<=(const MoveOnlyInt& lhs, const MoveOnlyInt& rhs) {
-    return !(rhs < lhs);
-  }
-
-  friend bool operator>=(const MoveOnlyInt& lhs, const MoveOnlyInt& rhs) {
-    return !(lhs < rhs);
-  }
-
-  int data() const { return data_; }
-
- private:
-  volatile int data_;
-
-  DISALLOW_COPY_AND_ASSIGN(MoveOnlyInt);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_MOVE_ONLY_INT_H_
diff --git a/base/test/multiprocess_test.cc b/base/test/multiprocess_test.cc
deleted file mode 100644
index 7bc26e3..0000000
--- a/base/test/multiprocess_test.cc
+++ /dev/null
@@ -1,74 +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/multiprocess_test.h"
-
-#include "base/base_switches.h"
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/threading/thread_restrictions.h"
-#include "build_config.h"
-
-namespace base {
-
-#if !defined(OS_ANDROID)
-Process SpawnMultiProcessTestChild(const std::string& procname,
-                                   const CommandLine& base_command_line,
-                                   const LaunchOptions& options) {
-  CommandLine command_line(base_command_line);
-  // TODO(viettrungluu): See comment above |MakeCmdLine()| in the header file.
-  // This is a temporary hack, since |MakeCmdLine()| has to provide a full
-  // command line.
-  if (!command_line.HasSwitch(switches::kTestChildProcess))
-    command_line.AppendSwitchASCII(switches::kTestChildProcess, procname);
-
-  return LaunchProcess(command_line, options);
-}
-
-bool WaitForMultiprocessTestChildExit(const Process& process,
-                                      TimeDelta timeout,
-                                      int* exit_code) {
-  return process.WaitForExitWithTimeout(timeout, exit_code);
-}
-
-bool TerminateMultiProcessTestChild(const Process& process,
-                                    int exit_code,
-                                    bool wait) {
-  return process.Terminate(exit_code, wait);
-}
-
-#endif  // !defined(OS_ANDROID)
-
-CommandLine GetMultiProcessTestChildBaseCommandLine() {
-  base::ScopedAllowBlockingForTesting allow_blocking;
-  CommandLine cmd_line = *CommandLine::ForCurrentProcess();
-  cmd_line.SetProgram(MakeAbsoluteFilePath(cmd_line.GetProgram()));
-  return cmd_line;
-}
-
-// MultiProcessTest ------------------------------------------------------------
-
-MultiProcessTest::MultiProcessTest() = default;
-
-Process MultiProcessTest::SpawnChild(const std::string& procname) {
-  LaunchOptions options;
-#if defined(OS_WIN)
-  options.start_hidden = true;
-#endif
-  return SpawnChildWithOptions(procname, options);
-}
-
-Process MultiProcessTest::SpawnChildWithOptions(const std::string& procname,
-                                                const LaunchOptions& options) {
-  return SpawnMultiProcessTestChild(procname, MakeCmdLine(procname), options);
-}
-
-CommandLine MultiProcessTest::MakeCmdLine(const std::string& procname) {
-  CommandLine command_line = GetMultiProcessTestChildBaseCommandLine();
-  command_line.AppendSwitchASCII(switches::kTestChildProcess, procname);
-  return command_line;
-}
-
-}  // namespace base
diff --git a/base/test/multiprocess_test.h b/base/test/multiprocess_test.h
deleted file mode 100644
index 3fc0b61..0000000
--- a/base/test/multiprocess_test.h
+++ /dev/null
@@ -1,146 +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.
-
-#ifndef BASE_TEST_MULTIPROCESS_TEST_H_
-#define BASE_TEST_MULTIPROCESS_TEST_H_
-
-#include <string>
-
-#include "base/macros.h"
-#include "base/process/launch.h"
-#include "base/process/process.h"
-#include "build_config.h"
-#include "testing/platform_test.h"
-
-namespace base {
-
-class CommandLine;
-
-// Helpers to spawn a child for a multiprocess test and execute a designated
-// function. Use these when you already have another base class for your test
-// fixture, but you want (some) of your tests to be multiprocess (otherwise you
-// may just want to derive your fixture from |MultiProcessTest|, below).
-//
-// Use these helpers as follows:
-//
-//   TEST_F(MyTest, ATest) {
-//     CommandLine command_line(
-//         base::GetMultiProcessTestChildBaseCommandLine());
-//     // Maybe add our own switches to |command_line|....
-//
-//     LaunchOptions options;
-//     // Maybe set some options (e.g., |start_hidden| on Windows)....
-//
-//     // Start a child process and run |a_test_func|.
-//     base::Process test_child_process =
-//         base::SpawnMultiProcessTestChild("a_test_func", command_line,
-//                                          options);
-//
-//     // Do stuff involving |test_child_process| and the child process....
-//
-//     int rv = -1;
-//     ASSERT_TRUE(base::WaitForMultiprocessTestChildExit(test_child_process,
-//         TestTimeouts::action_timeout(), &rv));
-//     EXPECT_EQ(0, rv);
-//   }
-//
-//   // Note: |MULTIPROCESS_TEST_MAIN()| is defined in
-//   // testing/multi_process_function_list.h.
-//   MULTIPROCESS_TEST_MAIN(a_test_func) {
-//     // Code here runs in a child process....
-//     return 0;
-//   }
-//
-// If you need to terminate the child process, use the
-// TerminateMultiProcessTestChild method to ensure that test will work on
-// Android.
-
-// Spawns a child process and executes the function |procname| declared using
-// |MULTIPROCESS_TEST_MAIN()| or |MULTIPROCESS_TEST_MAIN_WITH_SETUP()|.
-// |command_line| should be as provided by
-// |GetMultiProcessTestChildBaseCommandLine()| (below), possibly with arguments
-// added. Note: On Windows, you probably want to set |options.start_hidden|.
-Process SpawnMultiProcessTestChild(const std::string& procname,
-                                   const CommandLine& command_line,
-                                   const LaunchOptions& options);
-
-// Gets the base command line for |SpawnMultiProcessTestChild()|. To this, you
-// may add any flags needed for your child process.
-CommandLine GetMultiProcessTestChildBaseCommandLine();
-
-// Waits for the child process to exit. Returns true if the process exited
-// within |timeout| and sets |exit_code| if non null.
-bool WaitForMultiprocessTestChildExit(const Process& process,
-                                      TimeDelta timeout,
-                                      int* exit_code);
-
-// Terminates |process| with |exit_code|. If |wait| is true, this call blocks
-// until the process actually terminates.
-bool TerminateMultiProcessTestChild(const Process& process,
-                                    int exit_code,
-                                    bool wait);
-
-// MultiProcessTest ------------------------------------------------------------
-
-// A MultiProcessTest is a test class which makes it easier to
-// write a test which requires code running out of process.
-//
-// To create a multiprocess test simply follow these steps:
-//
-// 1) Derive your test from MultiProcessTest. Example:
-//
-//    class MyTest : public MultiProcessTest {
-//    };
-//
-//    TEST_F(MyTest, TestCaseName) {
-//      ...
-//    }
-//
-// 2) Create a mainline function for the child processes and include
-//    testing/multiprocess_func_list.h.
-//    See the declaration of the MULTIPROCESS_TEST_MAIN macro
-//    in that file for an example.
-// 3) Call SpawnChild("foo"), where "foo" is the name of
-//    the function you wish to run in the child processes.
-// That's it!
-class MultiProcessTest : public PlatformTest {
- public:
-  MultiProcessTest();
-
- protected:
-  // Run a child process.
-  // 'procname' is the name of a function which the child will
-  // execute.  It must be exported from this library in order to
-  // run.
-  //
-  // Example signature:
-  //    extern "C" int __declspec(dllexport) FooBar() {
-  //         // do client work here
-  //    }
-  //
-  // Returns the child process.
-  Process SpawnChild(const std::string& procname);
-
-  // Run a child process using the given launch options.
-  //
-  // Note: On Windows, you probably want to set |options.start_hidden|.
-  Process SpawnChildWithOptions(const std::string& procname,
-                                const LaunchOptions& options);
-
-  // Set up the command line used to spawn the child process.
-  // Override this to add things to the command line (calling this first in the
-  // override).
-  // Note that currently some tests rely on this providing a full command line,
-  // which they then use directly with |LaunchProcess()|.
-  // TODO(viettrungluu): Remove this and add a virtual
-  // |ModifyChildCommandLine()|; make the two divergent uses more sane.
-  virtual CommandLine MakeCmdLine(const std::string& procname);
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MultiProcessTest);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_MULTIPROCESS_TEST_H_
diff --git a/base/test/native_library_test_utils.cc b/base/test/native_library_test_utils.cc
deleted file mode 100644
index adcb1b0..0000000
--- a/base/test/native_library_test_utils.cc
+++ /dev/null
@@ -1,19 +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/test/native_library_test_utils.h"
-
-namespace {
-
-int g_static_value = 0;
-
-}  // namespace
-
-extern "C" {
-
-int g_native_library_exported_value = 0;
-
-int NativeLibraryTestIncrement() { return ++g_static_value; }
-
-}  // extern "C"
diff --git a/base/test/native_library_test_utils.h b/base/test/native_library_test_utils.h
deleted file mode 100644
index c6c46ff..0000000
--- a/base/test/native_library_test_utils.h
+++ /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.
-
-#ifndef BASE_TEST_NATIVE_LIBRARY_TEST_UTILS_H_
-#define BASE_TEST_NATIVE_LIBRARY_TEST_UTILS_H_
-
-#include "build_config.h"
-
-#if defined(OS_WIN)
-#define NATIVE_LIBRARY_TEST_ALWAYS_EXPORT __declspec(dllexport)
-#else
-#define NATIVE_LIBRARY_TEST_ALWAYS_EXPORT __attribute__((visibility("default")))
-#endif
-
-extern "C" {
-
-extern NATIVE_LIBRARY_TEST_ALWAYS_EXPORT int g_native_library_exported_value;
-
-// A function which increments an internal counter value and returns its value.
-// The first call returns 1, then 2, etc.
-NATIVE_LIBRARY_TEST_ALWAYS_EXPORT int NativeLibraryTestIncrement();
-
-}  // extern "C"
-
-#endif  // BASE_TEST_NATIVE_LIBRARY_TEST_UTILS_H_
diff --git a/base/test/null_task_runner.cc b/base/test/null_task_runner.cc
deleted file mode 100644
index dfa26fa..0000000
--- a/base/test/null_task_runner.cc
+++ /dev/null
@@ -1,29 +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/null_task_runner.h"
-
-namespace base {
-
-NullTaskRunner::NullTaskRunner() = default;
-
-NullTaskRunner::~NullTaskRunner() = default;
-
-bool NullTaskRunner::PostDelayedTask(const Location& from_here,
-                                     OnceClosure task,
-                                     base::TimeDelta delay) {
-  return false;
-}
-
-bool NullTaskRunner::PostNonNestableDelayedTask(const Location& from_here,
-                                                OnceClosure task,
-                                                base::TimeDelta delay) {
-  return false;
-}
-
-bool NullTaskRunner::RunsTasksInCurrentSequence() const {
-  return true;
-}
-
-}  // namespace base
diff --git a/base/test/null_task_runner.h b/base/test/null_task_runner.h
deleted file mode 100644
index c11ab6b..0000000
--- a/base/test/null_task_runner.h
+++ /dev/null
@@ -1,39 +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.
-
-#ifndef BASE_TEST_NULL_TASK_RUNNER_H_
-#define BASE_TEST_NULL_TASK_RUNNER_H_
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/single_thread_task_runner.h"
-
-namespace base {
-
-// Helper class for tests that need to provide an implementation of a
-// *TaskRunner class but don't actually care about tasks being run.
-
-class NullTaskRunner : public base::SingleThreadTaskRunner {
- public:
-  NullTaskRunner();
-
-  bool PostDelayedTask(const Location& from_here,
-                       base::OnceClosure task,
-                       base::TimeDelta delay) override;
-  bool PostNonNestableDelayedTask(const Location& from_here,
-                                  base::OnceClosure task,
-                                  base::TimeDelta delay) override;
-  // Always returns true to avoid triggering DCHECKs.
-  bool RunsTasksInCurrentSequence() const override;
-
- protected:
-  ~NullTaskRunner() override;
-
-  DISALLOW_COPY_AND_ASSIGN(NullTaskRunner);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_NULL_TASK_RUNNER_H_
diff --git a/base/test/perf_log.cc b/base/test/perf_log.cc
deleted file mode 100644
index 9212f4b..0000000
--- a/base/test/perf_log.cc
+++ /dev/null
@@ -1,45 +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/perf_log.h"
-
-#include "base/files/file_util.h"
-#include "base/logging.h"
-
-namespace base {
-
-static FILE* perf_log_file = nullptr;
-
-bool InitPerfLog(const FilePath& log_file) {
-  if (perf_log_file) {
-    // trying to initialize twice
-    NOTREACHED();
-    return false;
-  }
-
-  perf_log_file = OpenFile(log_file, "w");
-  return perf_log_file != nullptr;
-}
-
-void FinalizePerfLog() {
-  if (!perf_log_file) {
-    // trying to cleanup without initializing
-    NOTREACHED();
-    return;
-  }
-  base::CloseFile(perf_log_file);
-}
-
-void LogPerfResult(const char* test_name, double value, const char* units) {
-  if (!perf_log_file) {
-    NOTREACHED();
-    return;
-  }
-
-  fprintf(perf_log_file, "%s\t%g\t%s\n", test_name, value, units);
-  printf("%s\t%g\t%s\n", test_name, value, units);
-  fflush(stdout);
-}
-
-}  // namespace base
diff --git a/base/test/perf_log.h b/base/test/perf_log.h
deleted file mode 100644
index 5d6ed9f..0000000
--- a/base/test/perf_log.h
+++ /dev/null
@@ -1,24 +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.
-
-#ifndef BASE_TEST_PERF_LOG_H_
-#define BASE_TEST_PERF_LOG_H_
-
-namespace base {
-
-class FilePath;
-
-// Initializes and finalizes the perf log. These functions should be
-// called at the beginning and end (respectively) of running all the
-// performance tests. The init function returns true on success.
-bool InitPerfLog(const FilePath& log_path);
-void FinalizePerfLog();
-
-// Writes to the perf result log the given 'value' resulting from the
-// named 'test'. The units are to aid in reading the log by people.
-void LogPerfResult(const char* test_name, double value, const char* units);
-
-}  // namespace base
-
-#endif  // BASE_TEST_PERF_LOG_H_
diff --git a/base/test/perf_test_suite.cc b/base/test/perf_test_suite.cc
deleted file mode 100644
index e789883..0000000
--- a/base/test/perf_test_suite.cc
+++ /dev/null
@@ -1,50 +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/test/perf_test_suite.h"
-
-#include "base/command_line.h"
-#include "base/debug/debugger.h"
-#include "base/files/file_path.h"
-#include "base/path_service.h"
-#include "base/process/launch.h"
-#include "base/strings/string_util.h"
-#include "base/test/perf_log.h"
-#include "build_config.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-PerfTestSuite::PerfTestSuite(int argc, char** argv) : TestSuite(argc, argv) {}
-
-void PerfTestSuite::Initialize() {
-  TestSuite::Initialize();
-
-  // Initialize the perf timer log
-  FilePath log_path =
-      CommandLine::ForCurrentProcess()->GetSwitchValuePath("log-file");
-  if (log_path.empty()) {
-    PathService::Get(FILE_EXE, &log_path);
-#if defined(OS_ANDROID) || defined(OS_FUCHSIA)
-    base::FilePath tmp_dir;
-    PathService::Get(base::DIR_CACHE, &tmp_dir);
-    log_path = tmp_dir.Append(log_path.BaseName());
-#endif
-    log_path = log_path.ReplaceExtension(FILE_PATH_LITERAL("log"));
-    log_path = log_path.InsertBeforeExtension(FILE_PATH_LITERAL("_perf"));
-  }
-  ASSERT_TRUE(InitPerfLog(log_path));
-
-  // Raise to high priority to have more precise measurements. Since we don't
-  // aim at 1% precision, it is not necessary to run at realtime level.
-  if (!debug::BeingDebugged())
-    RaiseProcessToHighPriority();
-}
-
-void PerfTestSuite::Shutdown() {
-  TestSuite::Shutdown();
-  FinalizePerfLog();
-}
-
-}  // namespace base
diff --git a/base/test/perf_test_suite.h b/base/test/perf_test_suite.h
deleted file mode 100644
index 52528f0..0000000
--- a/base/test/perf_test_suite.h
+++ /dev/null
@@ -1,22 +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.
-
-#ifndef BASE_TEST_PERF_TEST_SUITE_H_
-#define BASE_TEST_PERF_TEST_SUITE_H_
-
-#include "base/test/test_suite.h"
-
-namespace base {
-
-class PerfTestSuite : public TestSuite {
- public:
-  PerfTestSuite(int argc, char** argv);
-
-  void Initialize() override;
-  void Shutdown() override;
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_PERF_TEST_SUITE_H_
diff --git a/base/test/perf_time_logger.cc b/base/test/perf_time_logger.cc
deleted file mode 100644
index c05ba51..0000000
--- a/base/test/perf_time_logger.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/test/perf_time_logger.h"
-
-#include "base/test/perf_log.h"
-
-namespace base {
-
-PerfTimeLogger::PerfTimeLogger(const char* test_name)
-    : logged_(false), test_name_(test_name) {}
-
-PerfTimeLogger::~PerfTimeLogger() {
-  if (!logged_)
-    Done();
-}
-
-void PerfTimeLogger::Done() {
-  // we use a floating-point millisecond value because it is more
-  // intuitive than microseconds and we want more precision than
-  // integer milliseconds
-  LogPerfResult(test_name_.c_str(), timer_.Elapsed().InMillisecondsF(), "ms");
-  logged_ = true;
-}
-
-}  // namespace base
diff --git a/base/test/perf_time_logger.h b/base/test/perf_time_logger.h
deleted file mode 100644
index a5f3e8a..0000000
--- a/base/test/perf_time_logger.h
+++ /dev/null
@@ -1,37 +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.
-
-#ifndef BASE_TEST_PERF_TIME_LOGGER_H_
-#define BASE_TEST_PERF_TIME_LOGGER_H_
-
-#include <string>
-
-#include "base/macros.h"
-#include "base/timer/elapsed_timer.h"
-
-namespace base {
-
-// Automates calling LogPerfResult for the common case where you want
-// to measure the time that something took. Call Done() when the test
-// is complete if you do extra work after the test or there are stack
-// objects with potentially expensive constructors. Otherwise, this
-// class with automatically log on destruction.
-class PerfTimeLogger {
- public:
-  explicit PerfTimeLogger(const char* test_name);
-  ~PerfTimeLogger();
-
-  void Done();
-
- private:
-  bool logged_;
-  std::string test_name_;
-  ElapsedTimer timer_;
-
-  DISALLOW_COPY_AND_ASSIGN(PerfTimeLogger);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_PERF_TIME_LOGGER_H_
diff --git a/base/test/power_monitor_test_base.cc b/base/test/power_monitor_test_base.cc
deleted file mode 100644
index 8c5ba86..0000000
--- a/base/test/power_monitor_test_base.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 "base/test/power_monitor_test_base.h"
-
-#include "base/message_loop/message_loop.h"
-#include "base/message_loop/message_loop_current.h"
-#include "base/power_monitor/power_monitor.h"
-#include "base/power_monitor/power_monitor_source.h"
-#include "base/run_loop.h"
-
-namespace base {
-
-PowerMonitorTestSource::PowerMonitorTestSource()
-    : test_on_battery_power_(false) {
-  DCHECK(MessageLoopCurrent::Get())
-      << "PowerMonitorTestSource requires a MessageLoop.";
-}
-
-PowerMonitorTestSource::~PowerMonitorTestSource() = default;
-
-void PowerMonitorTestSource::GeneratePowerStateEvent(bool on_battery_power) {
-  test_on_battery_power_ = on_battery_power;
-  ProcessPowerEvent(POWER_STATE_EVENT);
-  RunLoop().RunUntilIdle();
-}
-
-void PowerMonitorTestSource::GenerateSuspendEvent() {
-  ProcessPowerEvent(SUSPEND_EVENT);
-  RunLoop().RunUntilIdle();
-}
-
-void PowerMonitorTestSource::GenerateResumeEvent() {
-  ProcessPowerEvent(RESUME_EVENT);
-  RunLoop().RunUntilIdle();
-}
-
-bool PowerMonitorTestSource::IsOnBatteryPowerImpl() {
-  return test_on_battery_power_;
-};
-
-PowerMonitorTestObserver::PowerMonitorTestObserver()
-    : last_power_state_(false),
-      power_state_changes_(0),
-      suspends_(0),
-      resumes_(0) {
-}
-
-PowerMonitorTestObserver::~PowerMonitorTestObserver() = default;
-
-// PowerObserver callbacks.
-void PowerMonitorTestObserver::OnPowerStateChange(bool on_battery_power) {
-  last_power_state_ = on_battery_power;
-  power_state_changes_++;
-}
-
-void PowerMonitorTestObserver::OnSuspend() {
-  suspends_++;
-}
-
-void PowerMonitorTestObserver::OnResume() {
-  resumes_++;
-}
-
-}  // namespace base
diff --git a/base/test/power_monitor_test_base.h b/base/test/power_monitor_test_base.h
deleted file mode 100644
index 037670a..0000000
--- a/base/test/power_monitor_test_base.h
+++ /dev/null
@@ -1,53 +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.
-
-#ifndef BASE_TEST_POWER_MONITOR_TEST_BASE_H_
-#define BASE_TEST_POWER_MONITOR_TEST_BASE_H_
-
-#include "base/power_monitor/power_monitor.h"
-#include "base/power_monitor/power_monitor_source.h"
-
-namespace base {
-
-class PowerMonitorTestSource : public PowerMonitorSource {
- public:
-  PowerMonitorTestSource();
-  ~PowerMonitorTestSource() override;
-
-  void GeneratePowerStateEvent(bool on_battery_power);
-  void GenerateSuspendEvent();
-  void GenerateResumeEvent();
-
- protected:
-  bool IsOnBatteryPowerImpl() override;
-
-  bool test_on_battery_power_;
-};
-
-class PowerMonitorTestObserver : public PowerObserver {
- public:
-  PowerMonitorTestObserver();
-  ~PowerMonitorTestObserver() override;
-
-  // PowerObserver callbacks.
-  void OnPowerStateChange(bool on_battery_power) override;
-  void OnSuspend() override;
-  void OnResume() override;
-
-  // Test status counts.
-  bool last_power_state() { return last_power_state_; }
-  int power_state_changes() { return power_state_changes_; }
-  int suspends() { return suspends_; }
-  int resumes() { return resumes_; }
-
- private:
-  bool last_power_state_; // Last power state we were notified of.
-  int power_state_changes_;  // Count of OnPowerStateChange notifications.
-  int suspends_;  // Count of OnSuspend notifications.
-  int resumes_;  // Count of OnResume notifications.
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_POWER_MONITOR_TEST_BASE_H_
diff --git a/base/test/run_all_base_unittests.cc b/base/test/run_all_base_unittests.cc
deleted file mode 100644
index 5d44604..0000000
--- a/base/test/run_all_base_unittests.cc
+++ /dev/null
@@ -1,15 +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/bind.h"
-#include "base/test/launcher/unit_test_launcher.h"
-#include "base/test/test_suite.h"
-#include "build_config.h"
-
-int main(int argc, char** argv) {
-  base::TestSuite test_suite(argc, argv);
-  return base::LaunchUnitTests(
-      argc, argv,
-      base::Bind(&base::TestSuite::Run, base::Unretained(&test_suite)));
-}
diff --git a/base/test/run_all_perftests.cc b/base/test/run_all_perftests.cc
deleted file mode 100644
index 6e38109..0000000
--- a/base/test/run_all_perftests.cc
+++ /dev/null
@@ -1,9 +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/perf_test_suite.h"
-
-int main(int argc, char** argv) {
-  return base::PerfTestSuite(argc, argv).Run();
-}
diff --git a/base/test/run_all_unittests.cc b/base/test/run_all_unittests.cc
deleted file mode 100644
index dd5a0ad..0000000
--- a/base/test/run_all_unittests.cc
+++ /dev/null
@@ -1,15 +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 "base/test/launcher/unit_test_launcher.h"
-#include "base/test/test_suite.h"
-#include "build_config.h"
-
-int main(int argc, char** argv) {
-  base::TestSuite test_suite(argc, argv);
-  return base::LaunchUnitTests(
-      argc, argv,
-      base::BindOnce(&base::TestSuite::Run, base::Unretained(&test_suite)));
-}
diff --git a/base/test/scoped_command_line.cc b/base/test/scoped_command_line.cc
deleted file mode 100644
index c74d243..0000000
--- a/base/test/scoped_command_line.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/test/scoped_command_line.h"
-
-namespace base {
-namespace test {
-
-ScopedCommandLine::ScopedCommandLine()
-    : original_command_line_(*base::CommandLine::ForCurrentProcess()) {}
-
-ScopedCommandLine::~ScopedCommandLine() {
-  *base::CommandLine::ForCurrentProcess() = original_command_line_;
-}
-
-CommandLine* ScopedCommandLine::GetProcessCommandLine() {
-  return base::CommandLine::ForCurrentProcess();
-}
-
-}  // namespace test
-}  // namespace base
diff --git a/base/test/scoped_command_line.h b/base/test/scoped_command_line.h
deleted file mode 100644
index dea0c6a..0000000
--- a/base/test/scoped_command_line.h
+++ /dev/null
@@ -1,34 +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.
-
-#ifndef BASE_TEST_SCOPED_COMMAND_LINE_H_
-#define BASE_TEST_SCOPED_COMMAND_LINE_H_
-
-#include "base/command_line.h"
-
-namespace base {
-namespace test {
-
-// Helper class to restore the original command line at the end of the scope.
-// NOTE: In most unit tests, the command line is automatically restored per
-//       test, so this class is not necessary if the command line applies to
-//       the entire single test.
-class ScopedCommandLine final {
- public:
-  ScopedCommandLine();
-  ~ScopedCommandLine();
-
-  // Gets the command line for the current process.
-  // NOTE: Do not name this GetCommandLine as this will conflict with Windows's
-  //       GetCommandLine and get renamed to GetCommandLineW.
-  CommandLine* GetProcessCommandLine();
-
- private:
-  const CommandLine original_command_line_;
-};
-
-}  // namespace test
-}  // namespace base
-
-#endif  // BASE_TEST_SCOPED_COMMAND_LINE_H_
diff --git a/base/test/scoped_environment_variable_override.cc b/base/test/scoped_environment_variable_override.cc
deleted file mode 100644
index 4b7b387..0000000
--- a/base/test/scoped_environment_variable_override.cc
+++ /dev/null
@@ -1,33 +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_environment_variable_override.h"
-
-#include "base/environment.h"
-
-namespace base {
-namespace test {
-
-ScopedEnvironmentVariableOverride::ScopedEnvironmentVariableOverride(
-    const std::string& variable_name,
-    const std::string& value)
-    : environment_(Environment::Create()),
-      variable_name_(variable_name),
-      overridden_(false),
-      was_set_(false) {
-  was_set_ = environment_->GetVar(variable_name, &old_value_);
-  overridden_ = environment_->SetVar(variable_name, value);
-}
-
-ScopedEnvironmentVariableOverride::~ScopedEnvironmentVariableOverride() {
-  if (overridden_) {
-    if (was_set_)
-      environment_->SetVar(variable_name_, old_value_);
-    else
-      environment_->UnSetVar(variable_name_);
-  }
-}
-
-}  // namespace test
-}  // namespace base
diff --git a/base/test/scoped_environment_variable_override.h b/base/test/scoped_environment_variable_override.h
deleted file mode 100644
index b05b5f9..0000000
--- a/base/test/scoped_environment_variable_override.h
+++ /dev/null
@@ -1,40 +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.
-
-#ifndef BASE_TEST_SCOPED_ENVIRONMENT_VARIABLE_OVERRIDE_H_
-#define BASE_TEST_SCOPED_ENVIRONMENT_VARIABLE_OVERRIDE_H_
-
-#include <memory>
-#include <string>
-
-namespace base {
-
-class Environment;
-
-namespace test {
-
-// Helper class to override |variable_name| environment variable to |value| for
-// the lifetime of this class. Upon destruction, the previous value is restored.
-class ScopedEnvironmentVariableOverride final {
- public:
-  ScopedEnvironmentVariableOverride(const std::string& variable_name,
-                                    const std::string& value);
-  ~ScopedEnvironmentVariableOverride();
-
-  base::Environment* GetEnv() { return environment_.get(); }
-  bool IsOverridden() { return overridden_; }
-  bool WasSet() { return was_set_; }
-
- private:
-  std::unique_ptr<Environment> environment_;
-  std::string variable_name_;
-  bool overridden_;
-  bool was_set_;
-  std::string old_value_;
-};
-
-}  // namespace test
-}  // namespace base
-
-#endif  // BASE_TEST_SCOPED_ENVIRONMENT_VARIABLE_OVERRIDE_H_
diff --git a/base/test/scoped_feature_list.cc b/base/test/scoped_feature_list.cc
deleted file mode 100644
index 7106c44..0000000
--- a/base/test/scoped_feature_list.cc
+++ /dev/null
@@ -1,226 +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/test/scoped_feature_list.h"
-
-#include <algorithm>
-#include <utility>
-#include <vector>
-
-#include "base/memory/ptr_util.h"
-#include "base/metrics/field_trial_param_associator.h"
-#include "base/stl_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-
-namespace base {
-namespace test {
-
-namespace {
-
-std::vector<StringPiece> GetFeatureVector(
-    const std::vector<Feature>& features) {
-  std::vector<StringPiece> output;
-  for (const Feature& feature : features) {
-    output.push_back(feature.name);
-  }
-
-  return output;
-}
-
-// Extracts a feature name from a feature state string. For example, given
-// the input "*MyLovelyFeature<SomeFieldTrial", returns "MyLovelyFeature".
-StringPiece GetFeatureName(StringPiece feature) {
-  StringPiece feature_name = feature;
-
-  // Remove default info.
-  if (feature_name.starts_with("*"))
-    feature_name = feature_name.substr(1);
-
-  // Remove field_trial info.
-  std::size_t index = feature_name.find("<");
-  if (index != std::string::npos)
-    feature_name = feature_name.substr(0, index);
-
-  return feature_name;
-}
-
-struct Features {
-  std::vector<StringPiece> enabled_feature_list;
-  std::vector<StringPiece> disabled_feature_list;
-};
-
-// Merges previously-specified feature overrides with those passed into one of
-// the Init() methods. |features| should be a list of features previously
-// overridden to be in the |override_state|. |merged_features| should contain
-// the enabled and disabled features passed into the Init() method, plus any
-// overrides merged as a result of previous calls to this function.
-void OverrideFeatures(const std::string& features,
-                      FeatureList::OverrideState override_state,
-                      Features* merged_features) {
-  std::vector<StringPiece> features_list =
-      SplitStringPiece(features, ",", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
-
-  for (StringPiece feature : features_list) {
-    StringPiece feature_name = GetFeatureName(feature);
-
-    if (ContainsValue(merged_features->enabled_feature_list, feature_name) ||
-        ContainsValue(merged_features->disabled_feature_list, feature_name))
-      continue;
-
-    if (override_state == FeatureList::OverrideState::OVERRIDE_ENABLE_FEATURE) {
-      merged_features->enabled_feature_list.push_back(feature);
-    } else {
-      DCHECK_EQ(override_state,
-                FeatureList::OverrideState::OVERRIDE_DISABLE_FEATURE);
-      merged_features->disabled_feature_list.push_back(feature);
-    }
-  }
-}
-
-}  // namespace
-
-ScopedFeatureList::ScopedFeatureList() = default;
-
-ScopedFeatureList::~ScopedFeatureList() {
-  if (field_trial_override_)
-    base::FieldTrialParamAssociator::GetInstance()->ClearParamsForTesting(
-        field_trial_override_->trial_name(),
-        field_trial_override_->group_name());
-
-  FeatureList::ClearInstanceForTesting();
-  if (original_feature_list_)
-    FeatureList::RestoreInstanceForTesting(std::move(original_feature_list_));
-}
-
-void ScopedFeatureList::Init() {
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-  feature_list->InitializeFromCommandLine(std::string(), std::string());
-  InitWithFeatureList(std::move(feature_list));
-}
-
-void ScopedFeatureList::InitWithFeatureList(
-    std::unique_ptr<FeatureList> feature_list) {
-  DCHECK(!original_feature_list_);
-  original_feature_list_ = FeatureList::ClearInstanceForTesting();
-  FeatureList::SetInstance(std::move(feature_list));
-}
-
-void ScopedFeatureList::InitFromCommandLine(
-    const std::string& enable_features,
-    const std::string& disable_features) {
-  std::unique_ptr<FeatureList> feature_list(new FeatureList);
-  feature_list->InitializeFromCommandLine(enable_features, disable_features);
-  InitWithFeatureList(std::move(feature_list));
-}
-
-void ScopedFeatureList::InitWithFeatures(
-    const std::vector<Feature>& enabled_features,
-    const std::vector<Feature>& disabled_features) {
-  InitWithFeaturesAndFieldTrials(enabled_features, {}, disabled_features);
-}
-
-void ScopedFeatureList::InitAndEnableFeature(const Feature& feature) {
-  InitWithFeaturesAndFieldTrials({feature}, {}, {});
-}
-
-void ScopedFeatureList::InitAndEnableFeatureWithFieldTrialOverride(
-    const Feature& feature,
-    FieldTrial* trial) {
-  InitWithFeaturesAndFieldTrials({feature}, {trial}, {});
-}
-
-void ScopedFeatureList::InitAndDisableFeature(const Feature& feature) {
-  InitWithFeaturesAndFieldTrials({}, {}, {feature});
-}
-
-void ScopedFeatureList::InitWithFeatureState(const Feature& feature,
-                                             bool enabled) {
-  if (enabled) {
-    InitAndEnableFeature(feature);
-  } else {
-    InitAndDisableFeature(feature);
-  }
-}
-
-void ScopedFeatureList::InitWithFeaturesAndFieldTrials(
-    const std::vector<Feature>& enabled_features,
-    const std::vector<FieldTrial*>& trials_for_enabled_features,
-    const std::vector<Feature>& disabled_features) {
-  DCHECK_LE(trials_for_enabled_features.size(), enabled_features.size());
-
-  Features merged_features;
-  merged_features.enabled_feature_list = GetFeatureVector(enabled_features);
-  merged_features.disabled_feature_list = GetFeatureVector(disabled_features);
-
-  FeatureList* feature_list = FeatureList::GetInstance();
-
-  // |current_enabled_features| and |current_disabled_features| must declare out
-  // of if scope to avoid them out of scope before JoinString calls because
-  // |merged_features| may contains StringPiece which holding pointer points to
-  // |current_enabled_features| and |current_disabled_features|.
-  std::string current_enabled_features;
-  std::string current_disabled_features;
-  if (feature_list) {
-    FeatureList::GetInstance()->GetFeatureOverrides(&current_enabled_features,
-                                                    &current_disabled_features);
-    OverrideFeatures(current_enabled_features,
-                     FeatureList::OverrideState::OVERRIDE_ENABLE_FEATURE,
-                     &merged_features);
-    OverrideFeatures(current_disabled_features,
-                     FeatureList::OverrideState::OVERRIDE_DISABLE_FEATURE,
-                     &merged_features);
-  }
-
-  // Add the field trial overrides. This assumes that |enabled_features| are at
-  // the begining of |merged_features.enabled_feature_list|, in the same order.
-  std::vector<FieldTrial*>::const_iterator trial_it =
-      trials_for_enabled_features.begin();
-  auto feature_it = merged_features.enabled_feature_list.begin();
-  std::vector<std::unique_ptr<std::string>> features_with_trial;
-  features_with_trial.reserve(trials_for_enabled_features.size());
-  while (trial_it != trials_for_enabled_features.end()) {
-    features_with_trial.push_back(std::make_unique<std::string>(
-        feature_it->as_string() + "<" + (*trial_it)->trial_name()));
-    // |features_with_trial| owns the string, and feature_it points to it.
-    *feature_it = *(features_with_trial.back());
-    ++trial_it;
-    ++feature_it;
-  }
-
-  std::string enabled = JoinString(merged_features.enabled_feature_list, ",");
-  std::string disabled = JoinString(merged_features.disabled_feature_list, ",");
-  InitFromCommandLine(enabled, disabled);
-}
-
-void ScopedFeatureList::InitAndEnableFeatureWithParameters(
-    const Feature& feature,
-    const std::map<std::string, std::string>& feature_parameters) {
-  if (!FieldTrialList::IsGlobalSetForTesting()) {
-    field_trial_list_ = std::make_unique<base::FieldTrialList>(nullptr);
-  }
-
-  // TODO(crbug.com/794021) Remove this unique field trial name hack when there
-  // is a cleaner solution.
-  // Ensure that each call to this method uses a distinct field trial name.
-  // Otherwise, nested calls might fail due to the shared FieldTrialList
-  // already having the field trial registered.
-  static int num_calls = 0;
-  ++num_calls;
-  std::string kTrialName =
-      "scoped_feature_list_trial_name" + base::NumberToString(num_calls);
-  std::string kTrialGroup = "scoped_feature_list_trial_group";
-
-  field_trial_override_ =
-      base::FieldTrialList::CreateFieldTrial(kTrialName, kTrialGroup);
-  DCHECK(field_trial_override_);
-  FieldTrialParamAssociator::GetInstance()->AssociateFieldTrialParams(
-      kTrialName, kTrialGroup, feature_parameters);
-  InitAndEnableFeatureWithFieldTrialOverride(feature,
-                                             field_trial_override_.get());
-}
-
-}  // namespace test
-}  // namespace base
diff --git a/base/test/scoped_feature_list.h b/base/test/scoped_feature_list.h
deleted file mode 100644
index d87b2d8..0000000
--- a/base/test/scoped_feature_list.h
+++ /dev/null
@@ -1,123 +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.
-
-#ifndef BASE_TEST_SCOPED_FEATURE_LIST_H_
-#define BASE_TEST_SCOPED_FEATURE_LIST_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/feature_list.h"
-#include "base/memory/ref_counted.h"
-#include "base/metrics/field_trial.h"
-
-namespace base {
-namespace test {
-
-// ScopedFeatureList resets the global FeatureList instance to a new empty
-// instance and restores the original instance upon destruction.
-// Note: Re-using the same object is not allowed. To reset the feature
-// list and initialize it anew, destroy an existing scoped list and init
-// a new one.
-//
-// ScopedFeatureList needs to be initialized (via one of Init... methods)
-// before running code that inspects the state of features.  In practice this
-// means:
-// - In browser tests, one of Init... methods should be called from the
-//   overriden ::testing::Test::SetUp method. For example:
-//     void SetUp() override {
-//       scoped_feature_list_.InitAndEnableFeature(features::kMyFeatureHere);
-//       InProcessBrowserTest::SetUp();
-//     }
-class ScopedFeatureList final {
- public:
-  ScopedFeatureList();
-  ~ScopedFeatureList();
-
-  // WARNING: This method will reset any globally configured features to their
-  // default values, which can hide feature interaction bugs. Please use
-  // sparingly.  https://crbug.com/713390
-  // Initializes and registers a FeatureList instance with no overrides.
-  void Init();
-
-  // WARNING: This method will reset any globally configured features to their
-  // default values, which can hide feature interaction bugs. Please use
-  // sparingly.  https://crbug.com/713390
-  // Initializes and registers the given FeatureList instance.
-  void InitWithFeatureList(std::unique_ptr<FeatureList> feature_list);
-
-  // WARNING: This method will reset any globally configured features to their
-  // default values, which can hide feature interaction bugs. Please use
-  // sparingly.  https://crbug.com/713390
-  // Initializes and registers a FeatureList instance with only the given
-  // enabled and disabled features (comma-separated names).
-  void InitFromCommandLine(const std::string& enable_features,
-                           const std::string& disable_features);
-
-  // Initializes and registers a FeatureList instance based on present
-  // FeatureList and overridden with the given enabled and disabled features.
-  // Any feature overrides already present in the global FeatureList will
-  // continue to apply, unless they conflict with the overrides passed into this
-  // method. This is important for testing potentially unexpected feature
-  // interactions.
-  void InitWithFeatures(const std::vector<Feature>& enabled_features,
-                        const std::vector<Feature>& disabled_features);
-
-  // Initializes and registers a FeatureList instance based on present
-  // FeatureList and overridden with single enabled feature.
-  void InitAndEnableFeature(const Feature& feature);
-
-  // Initializes and registers a FeatureList instance based on present
-  // FeatureList and overridden with single enabled feature and associated field
-  // trial parameters.
-  // Note: this creates a scoped global field trial list if there is not
-  // currently one.
-  void InitAndEnableFeatureWithParameters(
-      const Feature& feature,
-      const std::map<std::string, std::string>& feature_parameters);
-
-  // Initializes and registers a FeatureList instance based on present
-  // FeatureList and overridden with single disabled feature.
-  void InitAndDisableFeature(const Feature& feature);
-
-  // Initializes and registers a FeatureList instance based on present
-  // FeatureList and overriden with a single feature either enabled or
-  // disabled depending on |enabled|.
-  void InitWithFeatureState(const Feature& feature, bool enabled);
-
- private:
-  // Initializes and registers a FeatureList instance based on present
-  // FeatureList and overridden with the given enabled and disabled features.
-  // Any feature overrides already present in the global FeatureList will
-  // continue to apply, unless they conflict with the overrides passed into this
-  // method.
-  // Field trials will apply to the enabled features, in the same order. The
-  // number of trials must be less (or equal) than the number of enabled
-  // features.
-  // Trials are expected to outlive the ScopedFeatureList.
-  void InitWithFeaturesAndFieldTrials(
-      const std::vector<Feature>& enabled_features,
-      const std::vector<FieldTrial*>& trials_for_enabled_features,
-      const std::vector<Feature>& disabled_features);
-
-  // Initializes and registers a FeatureList instance based on present
-  // FeatureList and overridden with single enabled feature and associated field
-  // trial override.
-  // |trial| is expected to outlive the ScopedFeatureList.
-  void InitAndEnableFeatureWithFieldTrialOverride(const Feature& feature,
-                                                  FieldTrial* trial);
-
-  std::unique_ptr<FeatureList> original_feature_list_;
-  scoped_refptr<FieldTrial> field_trial_override_;
-  std::unique_ptr<base::FieldTrialList> field_trial_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedFeatureList);
-};
-
-}  // namespace test
-}  // namespace base
-
-#endif  // BASE_TEST_SCOPED_FEATURE_LIST_H_
diff --git a/base/test/scoped_locale.cc b/base/test/scoped_locale.cc
deleted file mode 100644
index c018284..0000000
--- a/base/test/scoped_locale.cc
+++ /dev/null
@@ -1,23 +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/test/scoped_locale.h"
-
-#include <locale.h>
-
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-ScopedLocale::ScopedLocale(const std::string& locale) {
-  prev_locale_ = setlocale(LC_ALL, nullptr);
-  EXPECT_TRUE(setlocale(LC_ALL, locale.c_str()) != nullptr)
-      << "Failed to set locale: " << locale;
-}
-
-ScopedLocale::~ScopedLocale() {
-  EXPECT_STREQ(prev_locale_.c_str(), setlocale(LC_ALL, prev_locale_.c_str()));
-}
-
-}  // namespace base
diff --git a/base/test/scoped_locale.h b/base/test/scoped_locale.h
deleted file mode 100644
index ef64e98..0000000
--- a/base/test/scoped_locale.h
+++ /dev/null
@@ -1,29 +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.
-
-#ifndef BASE_TEST_SCOPED_LOCALE_H_
-#define BASE_TEST_SCOPED_LOCALE_H_
-
-#include <string>
-
-#include "base/macros.h"
-
-namespace base {
-
-// Sets the given |locale| on construction, and restores the previous locale
-// on destruction.
-class ScopedLocale {
- public:
-  explicit ScopedLocale(const std::string& locale);
-  ~ScopedLocale();
-
- private:
-  std::string prev_locale_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedLocale);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_SCOPED_LOCALE_H_
diff --git a/base/test/scoped_mock_time_message_loop_task_runner.cc b/base/test/scoped_mock_time_message_loop_task_runner.cc
deleted file mode 100644
index 8e855e5..0000000
--- a/base/test/scoped_mock_time_message_loop_task_runner.cc
+++ /dev/null
@@ -1,38 +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 "base/bind.h"
-#include "base/logging.h"
-#include "base/message_loop/message_loop_current.h"
-#include "base/run_loop.h"
-#include "base/test/test_pending_task.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-
-namespace base {
-
-ScopedMockTimeMessageLoopTaskRunner::ScopedMockTimeMessageLoopTaskRunner()
-    : task_runner_(new TestMockTimeTaskRunner),
-      previous_task_runner_(ThreadTaskRunnerHandle::Get()) {
-  DCHECK(MessageLoopCurrent::Get());
-  // To ensure that we process any initialization tasks posted to the
-  // MessageLoop by a test fixture before replacing its TaskRunner.
-  RunLoop().RunUntilIdle();
-  MessageLoopCurrent::Get()->SetTaskRunner(task_runner_);
-}
-
-ScopedMockTimeMessageLoopTaskRunner::~ScopedMockTimeMessageLoopTaskRunner() {
-  DCHECK(previous_task_runner_->RunsTasksInCurrentSequence());
-  DCHECK_EQ(task_runner_, ThreadTaskRunnerHandle::Get());
-  for (auto& pending_task : task_runner_->TakePendingTasks()) {
-    previous_task_runner_->PostDelayedTask(
-        pending_task.location, std::move(pending_task.task),
-        pending_task.GetTimeToRun() - task_runner_->NowTicks());
-  }
-  MessageLoopCurrent::Get()->SetTaskRunner(std::move(previous_task_runner_));
-}
-
-}  // namespace base
diff --git a/base/test/scoped_mock_time_message_loop_task_runner.h b/base/test/scoped_mock_time_message_loop_task_runner.h
deleted file mode 100644
index 2a034ee..0000000
--- a/base/test/scoped_mock_time_message_loop_task_runner.h
+++ /dev/null
@@ -1,45 +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.
-
-#ifndef BASE_TEST_SCOPED_MOCK_TIME_MESSAGE_LOOP_TASK_RUNNER_H_
-#define BASE_TEST_SCOPED_MOCK_TIME_MESSAGE_LOOP_TASK_RUNNER_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/test/test_mock_time_task_runner.h"
-
-namespace base {
-
-class SingleThreadTaskRunner;
-
-// A scoped wrapper around TestMockTimeTaskRunner that replaces
-// MessageLoopCurrent::Get()'s task runner (and consequently
-// ThreadTaskRunnerHandle) with a TestMockTimeTaskRunner and resets it back at
-// the end of its scope.
-//
-// Note: RunLoop() will not work in the scope of a
-// ScopedMockTimeMessageLoopTaskRunner, the underlying TestMockTimeTaskRunner's
-// methods must be used instead to pump tasks.
-//
-// DEPRECATED: Use a TestMockTimeTaskRunner::Type::kBoundToThread instead of a
-// MessageLoop + ScopedMockTimeMessageLoopTaskRunner.
-// TODO(gab): Remove usage of this API and delete it.
-class ScopedMockTimeMessageLoopTaskRunner {
- public:
-  ScopedMockTimeMessageLoopTaskRunner();
-  ~ScopedMockTimeMessageLoopTaskRunner();
-
-  TestMockTimeTaskRunner* task_runner() { return task_runner_.get(); }
-  TestMockTimeTaskRunner* operator->() { return task_runner_.get(); }
-
- private:
-  const scoped_refptr<TestMockTimeTaskRunner> task_runner_;
-  scoped_refptr<SingleThreadTaskRunner> previous_task_runner_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedMockTimeMessageLoopTaskRunner);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_SCOPED_MOCK_TIME_MESSAGE_LOOP_TASK_RUNNER_H_
diff --git a/base/test/scoped_path_override.cc b/base/test/scoped_path_override.cc
deleted file mode 100644
index b8cfd4a..0000000
--- a/base/test/scoped_path_override.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/test/scoped_path_override.h"
-
-#include "base/logging.h"
-#include "base/path_service.h"
-
-namespace base {
-
-ScopedPathOverride::ScopedPathOverride(int key) : key_(key) {
-  bool result = temp_dir_.CreateUniqueTempDir();
-  CHECK(result);
-  result = PathService::Override(key, temp_dir_.GetPath());
-  CHECK(result);
-}
-
-ScopedPathOverride::ScopedPathOverride(int key, const base::FilePath& dir)
-    : key_(key) {
-  bool result = PathService::Override(key, dir);
-  CHECK(result);
-}
-
-ScopedPathOverride::ScopedPathOverride(int key,
-                                       const FilePath& path,
-                                       bool is_absolute,
-                                       bool create)
-    : key_(key) {
-  bool result =
-      PathService::OverrideAndCreateIfNeeded(key, path, is_absolute, create);
-  CHECK(result);
-}
-
-ScopedPathOverride::~ScopedPathOverride() {
-   bool result = PathService::RemoveOverride(key_);
-   CHECK(result) << "The override seems to have been removed already!";
-}
-
-}  // namespace base
diff --git a/base/test/scoped_path_override.h b/base/test/scoped_path_override.h
deleted file mode 100644
index f589149..0000000
--- a/base/test/scoped_path_override.h
+++ /dev/null
@@ -1,43 +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.
-
-#ifndef BASE_TEST_SCOPED_PATH_OVERRIDE_H_
-#define BASE_TEST_SCOPED_PATH_OVERRIDE_H_
-
-#include "base/files/scoped_temp_dir.h"
-#include "base/macros.h"
-
-namespace base {
-
-class FilePath;
-
-// Sets a path override on construction, and removes it when the object goes out
-// of scope. This class is intended to be used by tests that need to override
-// paths to ensure their overrides are properly handled and reverted when the
-// scope of the test is left.
-class ScopedPathOverride {
- public:
-  // Contructor that initializes the override to a scoped temp directory.
-  explicit ScopedPathOverride(int key);
-
-  // Constructor that would use a path provided by the user.
-  ScopedPathOverride(int key, const FilePath& dir);
-
-  // See PathService::OverrideAndCreateIfNeeded.
-  ScopedPathOverride(int key,
-                     const FilePath& path,
-                     bool is_absolute,
-                     bool create);
-  ~ScopedPathOverride();
-
- private:
-  int key_;
-  ScopedTempDir temp_dir_;
-
-  DISALLOW_COPY_AND_ASSIGN(ScopedPathOverride);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_SCOPED_PATH_OVERRIDE_H_
diff --git a/base/test/sequenced_task_runner_test_template.cc b/base/test/sequenced_task_runner_test_template.cc
deleted file mode 100644
index de68492..0000000
--- a/base/test/sequenced_task_runner_test_template.cc
+++ /dev/null
@@ -1,269 +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/sequenced_task_runner_test_template.h"
-
-#include <ostream>
-
-#include "base/location.h"
-
-namespace base {
-
-namespace internal {
-
-TaskEvent::TaskEvent(int i, Type type)
-  : i(i), type(type) {
-}
-
-SequencedTaskTracker::SequencedTaskTracker()
-    : next_post_i_(0),
-      task_end_count_(0),
-      task_end_cv_(&lock_) {
-}
-
-void SequencedTaskTracker::PostWrappedNonNestableTask(
-    SequencedTaskRunner* task_runner,
-    const Closure& task) {
-  AutoLock event_lock(lock_);
-  const int post_i = next_post_i_++;
-  Closure wrapped_task = Bind(&SequencedTaskTracker::RunTask, this,
-                              task, post_i);
-  task_runner->PostNonNestableTask(FROM_HERE, wrapped_task);
-  TaskPosted(post_i);
-}
-
-void SequencedTaskTracker::PostWrappedNestableTask(
-    SequencedTaskRunner* task_runner,
-    const Closure& task) {
-  AutoLock event_lock(lock_);
-  const int post_i = next_post_i_++;
-  Closure wrapped_task = Bind(&SequencedTaskTracker::RunTask, this,
-                              task, post_i);
-  task_runner->PostTask(FROM_HERE, wrapped_task);
-  TaskPosted(post_i);
-}
-
-void SequencedTaskTracker::PostWrappedDelayedNonNestableTask(
-    SequencedTaskRunner* task_runner,
-    const Closure& task,
-    TimeDelta delay) {
-  AutoLock event_lock(lock_);
-  const int post_i = next_post_i_++;
-  Closure wrapped_task = Bind(&SequencedTaskTracker::RunTask, this,
-                              task, post_i);
-  task_runner->PostNonNestableDelayedTask(FROM_HERE, wrapped_task, delay);
-  TaskPosted(post_i);
-}
-
-void SequencedTaskTracker::PostNonNestableTasks(
-    SequencedTaskRunner* task_runner,
-    int task_count) {
-  for (int i = 0; i < task_count; ++i) {
-    PostWrappedNonNestableTask(task_runner, Closure());
-  }
-}
-
-void SequencedTaskTracker::RunTask(const Closure& task, int task_i) {
-  TaskStarted(task_i);
-  if (!task.is_null())
-    task.Run();
-  TaskEnded(task_i);
-}
-
-void SequencedTaskTracker::TaskPosted(int i) {
-  // Caller must own |lock_|.
-  events_.push_back(TaskEvent(i, TaskEvent::POST));
-}
-
-void SequencedTaskTracker::TaskStarted(int i) {
-  AutoLock lock(lock_);
-  events_.push_back(TaskEvent(i, TaskEvent::START));
-}
-
-void SequencedTaskTracker::TaskEnded(int i) {
-  AutoLock lock(lock_);
-  events_.push_back(TaskEvent(i, TaskEvent::END));
-  ++task_end_count_;
-  task_end_cv_.Signal();
-}
-
-const std::vector<TaskEvent>&
-SequencedTaskTracker::GetTaskEvents() const {
-  return events_;
-}
-
-void SequencedTaskTracker::WaitForCompletedTasks(int count) {
-  AutoLock lock(lock_);
-  while (task_end_count_ < count)
-    task_end_cv_.Wait();
-}
-
-SequencedTaskTracker::~SequencedTaskTracker() = default;
-
-void PrintTo(const TaskEvent& event, std::ostream* os) {
-  *os << "(i=" << event.i << ", type=";
-  switch (event.type) {
-    case TaskEvent::POST: *os << "POST"; break;
-    case TaskEvent::START: *os << "START"; break;
-    case TaskEvent::END: *os << "END"; break;
-  }
-  *os << ")";
-}
-
-namespace {
-
-// Returns the task ordinals for the task event type |type| in the order that
-// they were recorded.
-std::vector<int> GetEventTypeOrder(const std::vector<TaskEvent>& events,
-                                   TaskEvent::Type type) {
-  std::vector<int> tasks;
-  std::vector<TaskEvent>::const_iterator event;
-  for (event = events.begin(); event != events.end(); ++event) {
-    if (event->type == type)
-      tasks.push_back(event->i);
-  }
-  return tasks;
-}
-
-// Returns all task events for task |task_i|.
-std::vector<TaskEvent::Type> GetEventsForTask(
-    const std::vector<TaskEvent>& events,
-    int task_i) {
-  std::vector<TaskEvent::Type> task_event_orders;
-  std::vector<TaskEvent>::const_iterator event;
-  for (event = events.begin(); event != events.end(); ++event) {
-    if (event->i == task_i)
-      task_event_orders.push_back(event->type);
-  }
-  return task_event_orders;
-}
-
-// Checks that the task events for each task in |events| occur in the order
-// {POST, START, END}, and that there is only one instance of each event type
-// per task.
-::testing::AssertionResult CheckEventOrdersForEachTask(
-    const std::vector<TaskEvent>& events,
-    int task_count) {
-  std::vector<TaskEvent::Type> expected_order;
-  expected_order.push_back(TaskEvent::POST);
-  expected_order.push_back(TaskEvent::START);
-  expected_order.push_back(TaskEvent::END);
-
-  // This is O(n^2), but it runs fast enough currently so is not worth
-  // optimizing.
-  for (int i = 0; i < task_count; ++i) {
-    const std::vector<TaskEvent::Type> task_events =
-        GetEventsForTask(events, i);
-    if (task_events != expected_order) {
-      return ::testing::AssertionFailure()
-          << "Events for task " << i << " are out of order; expected: "
-          << ::testing::PrintToString(expected_order) << "; actual: "
-          << ::testing::PrintToString(task_events);
-    }
-  }
-  return ::testing::AssertionSuccess();
-}
-
-// Checks that no two tasks were running at the same time. I.e. the only
-// events allowed between the START and END of a task are the POSTs of other
-// tasks.
-::testing::AssertionResult CheckNoTaskRunsOverlap(
-    const std::vector<TaskEvent>& events) {
-  // If > -1, we're currently inside a START, END pair.
-  int current_task_i = -1;
-
-  std::vector<TaskEvent>::const_iterator event;
-  for (event = events.begin(); event != events.end(); ++event) {
-    bool spurious_event_found = false;
-
-    if (current_task_i == -1) {  // Not inside a START, END pair.
-      switch (event->type) {
-        case TaskEvent::POST:
-          break;
-        case TaskEvent::START:
-          current_task_i = event->i;
-          break;
-        case TaskEvent::END:
-          spurious_event_found = true;
-          break;
-      }
-
-    } else {  // Inside a START, END pair.
-      bool interleaved_task_detected = false;
-
-      switch (event->type) {
-        case TaskEvent::POST:
-          if (event->i == current_task_i)
-            spurious_event_found = true;
-          break;
-        case TaskEvent::START:
-          interleaved_task_detected = true;
-          break;
-        case TaskEvent::END:
-          if (event->i != current_task_i)
-            interleaved_task_detected = true;
-          else
-            current_task_i = -1;
-          break;
-      }
-
-      if (interleaved_task_detected) {
-        return ::testing::AssertionFailure()
-            << "Found event " << ::testing::PrintToString(*event)
-            << " between START and END events for task " << current_task_i
-            << "; event dump: " << ::testing::PrintToString(events);
-      }
-    }
-
-    if (spurious_event_found) {
-      const int event_i = event - events.begin();
-      return ::testing::AssertionFailure()
-          << "Spurious event " << ::testing::PrintToString(*event)
-          << " at position " << event_i << "; event dump: "
-          << ::testing::PrintToString(events);
-    }
-  }
-
-  return ::testing::AssertionSuccess();
-}
-
-}  // namespace
-
-::testing::AssertionResult CheckNonNestableInvariants(
-    const std::vector<TaskEvent>& events,
-    int task_count) {
-  const std::vector<int> post_order =
-      GetEventTypeOrder(events, TaskEvent::POST);
-  const std::vector<int> start_order =
-      GetEventTypeOrder(events, TaskEvent::START);
-  const std::vector<int> end_order =
-      GetEventTypeOrder(events, TaskEvent::END);
-
-  if (start_order != post_order) {
-    return ::testing::AssertionFailure()
-        << "Expected START order (which equals actual POST order): \n"
-        << ::testing::PrintToString(post_order)
-        << "\n Actual START order:\n"
-        << ::testing::PrintToString(start_order);
-  }
-
-  if (end_order != post_order) {
-    return ::testing::AssertionFailure()
-        << "Expected END order (which equals actual POST order): \n"
-        << ::testing::PrintToString(post_order)
-        << "\n Actual END order:\n"
-        << ::testing::PrintToString(end_order);
-  }
-
-  const ::testing::AssertionResult result =
-      CheckEventOrdersForEachTask(events, task_count);
-  if (!result)
-    return result;
-
-  return CheckNoTaskRunsOverlap(events);
-}
-
-}  // namespace internal
-
-}  // namespace base
diff --git a/base/test/sequenced_task_runner_test_template.h b/base/test/sequenced_task_runner_test_template.h
deleted file mode 100644
index a510030..0000000
--- a/base/test/sequenced_task_runner_test_template.h
+++ /dev/null
@@ -1,350 +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.
-
-// SequencedTaskRunnerTest defines tests that implementations of
-// SequencedTaskRunner should pass in order to be conformant.
-// See task_runner_test_template.h for a description of how to use the
-// constructs in this file; these work the same.
-
-#ifndef BASE_TEST_SEQUENCED_TASK_RUNNER_TEST_TEMPLATE_H_
-#define BASE_TEST_SEQUENCED_TASK_RUNNER_TEST_TEMPLATE_H_
-
-#include <cstddef>
-#include <iosfwd>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/sequenced_task_runner.h"
-#include "base/synchronization/condition_variable.h"
-#include "base/synchronization/lock.h"
-#include "base/time/time.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace internal {
-
-struct TaskEvent {
-  enum Type { POST, START, END };
-  TaskEvent(int i, Type type);
-  int i;
-  Type type;
-};
-
-// Utility class used in the tests below.
-class SequencedTaskTracker : public RefCountedThreadSafe<SequencedTaskTracker> {
- public:
-  SequencedTaskTracker();
-
-  // Posts the non-nestable task |task|, and records its post event.
-  void PostWrappedNonNestableTask(SequencedTaskRunner* task_runner,
-                                  const Closure& task);
-
-  // Posts the nestable task |task|, and records its post event.
-  void PostWrappedNestableTask(SequencedTaskRunner* task_runner,
-                               const Closure& task);
-
-  // Posts the delayed non-nestable task |task|, and records its post event.
-  void PostWrappedDelayedNonNestableTask(SequencedTaskRunner* task_runner,
-                                         const Closure& task,
-                                         TimeDelta delay);
-
-  // Posts |task_count| non-nestable tasks.
-  void PostNonNestableTasks(SequencedTaskRunner* task_runner, int task_count);
-
-  const std::vector<TaskEvent>& GetTaskEvents() const;
-
-  // Returns after the tracker observes a total of |count| task completions.
-  void WaitForCompletedTasks(int count);
-
- private:
-  friend class RefCountedThreadSafe<SequencedTaskTracker>;
-
-  ~SequencedTaskTracker();
-
-  // A task which runs |task|, recording the start and end events.
-  void RunTask(const Closure& task, int task_i);
-
-  // Records a post event for task |i|. The owner is expected to be holding
-  // |lock_| (unlike |TaskStarted| and |TaskEnded|).
-  void TaskPosted(int i);
-
-  // Records a start event for task |i|.
-  void TaskStarted(int i);
-
-  // Records a end event for task |i|.
-  void TaskEnded(int i);
-
-  // Protects events_, next_post_i_, task_end_count_ and task_end_cv_.
-  Lock lock_;
-
-  // The events as they occurred for each task (protected by lock_).
-  std::vector<TaskEvent> events_;
-
-  // The ordinal to be used for the next task-posting task (protected by
-  // lock_).
-  int next_post_i_;
-
-  // The number of task end events we've received.
-  int task_end_count_;
-  ConditionVariable task_end_cv_;
-
-  DISALLOW_COPY_AND_ASSIGN(SequencedTaskTracker);
-};
-
-void PrintTo(const TaskEvent& event, std::ostream* os);
-
-// Checks the non-nestable task invariants for all tasks in |events|.
-//
-// The invariants are:
-// 1) Events started and ended in the same order that they were posted.
-// 2) Events for an individual tasks occur in the order {POST, START, END},
-//    and there is only one instance of each event type for a task.
-// 3) The only events between a task's START and END events are the POSTs of
-//    other tasks. I.e. tasks were run sequentially, not interleaved.
-::testing::AssertionResult CheckNonNestableInvariants(
-    const std::vector<TaskEvent>& events,
-    int task_count);
-
-}  // namespace internal
-
-template <typename TaskRunnerTestDelegate>
-class SequencedTaskRunnerTest : public testing::Test {
- protected:
-  SequencedTaskRunnerTest()
-      : task_tracker_(new internal::SequencedTaskTracker()) {}
-
-  const scoped_refptr<internal::SequencedTaskTracker> task_tracker_;
-  TaskRunnerTestDelegate delegate_;
-};
-
-TYPED_TEST_CASE_P(SequencedTaskRunnerTest);
-
-// This test posts N non-nestable tasks in sequence, and expects them to run
-// in FIFO order, with no part of any two tasks' execution
-// overlapping. I.e. that each task starts only after the previously-posted
-// one has finished.
-TYPED_TEST_P(SequencedTaskRunnerTest, SequentialNonNestable) {
-  const int kTaskCount = 1000;
-
-  this->delegate_.StartTaskRunner();
-  const scoped_refptr<SequencedTaskRunner> task_runner =
-      this->delegate_.GetTaskRunner();
-
-  this->task_tracker_->PostWrappedNonNestableTask(
-      task_runner.get(),
-      Bind(&PlatformThread::Sleep, TimeDelta::FromSeconds(1)));
-  for (int i = 1; i < kTaskCount; ++i) {
-    this->task_tracker_->PostWrappedNonNestableTask(task_runner.get(),
-                                                    Closure());
-  }
-
-  this->delegate_.StopTaskRunner();
-
-  EXPECT_TRUE(CheckNonNestableInvariants(this->task_tracker_->GetTaskEvents(),
-                                         kTaskCount));
-}
-
-// This test posts N nestable tasks in sequence. It has the same expectations
-// as SequentialNonNestable because even though the tasks are nestable, they
-// will not be run nestedly in this case.
-TYPED_TEST_P(SequencedTaskRunnerTest, SequentialNestable) {
-  const int kTaskCount = 1000;
-
-  this->delegate_.StartTaskRunner();
-  const scoped_refptr<SequencedTaskRunner> task_runner =
-      this->delegate_.GetTaskRunner();
-
-  this->task_tracker_->PostWrappedNestableTask(
-      task_runner.get(),
-      Bind(&PlatformThread::Sleep, TimeDelta::FromSeconds(1)));
-  for (int i = 1; i < kTaskCount; ++i) {
-    this->task_tracker_->PostWrappedNestableTask(task_runner.get(), Closure());
-  }
-
-  this->delegate_.StopTaskRunner();
-
-  EXPECT_TRUE(CheckNonNestableInvariants(this->task_tracker_->GetTaskEvents(),
-                                         kTaskCount));
-}
-
-// This test posts non-nestable tasks in order of increasing delay, and checks
-// that that the tasks are run in FIFO order and that there is no execution
-// overlap whatsoever between any two tasks.
-TYPED_TEST_P(SequencedTaskRunnerTest, SequentialDelayedNonNestable) {
-  const int kTaskCount = 20;
-  const int kDelayIncrementMs = 50;
-
-  this->delegate_.StartTaskRunner();
-  const scoped_refptr<SequencedTaskRunner> task_runner =
-      this->delegate_.GetTaskRunner();
-
-  for (int i = 0; i < kTaskCount; ++i) {
-    this->task_tracker_->PostWrappedDelayedNonNestableTask(
-        task_runner.get(), Closure(),
-        TimeDelta::FromMilliseconds(kDelayIncrementMs * i));
-  }
-
-  this->task_tracker_->WaitForCompletedTasks(kTaskCount);
-  this->delegate_.StopTaskRunner();
-
-  EXPECT_TRUE(CheckNonNestableInvariants(this->task_tracker_->GetTaskEvents(),
-                                         kTaskCount));
-}
-
-// This test posts a fast, non-nestable task from within each of a number of
-// slow, non-nestable tasks and checks that they all run in the sequence they
-// were posted in and that there is no execution overlap whatsoever.
-TYPED_TEST_P(SequencedTaskRunnerTest, NonNestablePostFromNonNestableTask) {
-  const int kParentCount = 10;
-  const int kChildrenPerParent = 10;
-
-  this->delegate_.StartTaskRunner();
-  const scoped_refptr<SequencedTaskRunner> task_runner =
-      this->delegate_.GetTaskRunner();
-
-  for (int i = 0; i < kParentCount; ++i) {
-    Closure task = Bind(
-        &internal::SequencedTaskTracker::PostNonNestableTasks,
-        this->task_tracker_,
-        RetainedRef(task_runner),
-        kChildrenPerParent);
-    this->task_tracker_->PostWrappedNonNestableTask(task_runner.get(), task);
-  }
-
-  this->delegate_.StopTaskRunner();
-
-  EXPECT_TRUE(CheckNonNestableInvariants(
-      this->task_tracker_->GetTaskEvents(),
-      kParentCount * (kChildrenPerParent + 1)));
-}
-
-// This test posts two tasks with the same delay, and checks that the tasks are
-// 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.
-TYPED_TEST_P(SequencedTaskRunnerTest, DelayedTasksSameDelay) {
-  const int kTaskCount = 2;
-  const TimeDelta kDelay = TimeDelta::FromMilliseconds(100);
-
-  this->delegate_.StartTaskRunner();
-  const scoped_refptr<SequencedTaskRunner> task_runner =
-      this->delegate_.GetTaskRunner();
-
-  this->task_tracker_->PostWrappedDelayedNonNestableTask(task_runner.get(),
-                                                         Closure(), kDelay);
-  this->task_tracker_->PostWrappedDelayedNonNestableTask(task_runner.get(),
-                                                         Closure(), kDelay);
-  this->task_tracker_->WaitForCompletedTasks(kTaskCount);
-  this->delegate_.StopTaskRunner();
-
-  EXPECT_TRUE(CheckNonNestableInvariants(this->task_tracker_->GetTaskEvents(),
-                                         kTaskCount));
-}
-
-// This test posts a normal task and a delayed task, and checks that the
-// delayed task runs after the normal task even if the normal task takes
-// a long time to run.
-TYPED_TEST_P(SequencedTaskRunnerTest, DelayedTaskAfterLongTask) {
-  const int kTaskCount = 2;
-
-  this->delegate_.StartTaskRunner();
-  const scoped_refptr<SequencedTaskRunner> task_runner =
-      this->delegate_.GetTaskRunner();
-
-  this->task_tracker_->PostWrappedNonNestableTask(
-      task_runner.get(),
-      base::Bind(&PlatformThread::Sleep, TimeDelta::FromMilliseconds(50)));
-  this->task_tracker_->PostWrappedDelayedNonNestableTask(
-      task_runner.get(), Closure(), TimeDelta::FromMilliseconds(10));
-  this->task_tracker_->WaitForCompletedTasks(kTaskCount);
-  this->delegate_.StopTaskRunner();
-
-  EXPECT_TRUE(CheckNonNestableInvariants(this->task_tracker_->GetTaskEvents(),
-                                         kTaskCount));
-}
-
-// Test that a pile of normal tasks and a delayed task run in the
-// time-to-run order.
-TYPED_TEST_P(SequencedTaskRunnerTest, DelayedTaskAfterManyLongTasks) {
-  const int kTaskCount = 11;
-
-  this->delegate_.StartTaskRunner();
-  const scoped_refptr<SequencedTaskRunner> task_runner =
-      this->delegate_.GetTaskRunner();
-
-  for (int i = 0; i < kTaskCount - 1; i++) {
-    this->task_tracker_->PostWrappedNonNestableTask(
-        task_runner.get(),
-        base::Bind(&PlatformThread::Sleep, TimeDelta::FromMilliseconds(50)));
-  }
-  this->task_tracker_->PostWrappedDelayedNonNestableTask(
-      task_runner.get(), Closure(), TimeDelta::FromMilliseconds(10));
-  this->task_tracker_->WaitForCompletedTasks(kTaskCount);
-  this->delegate_.StopTaskRunner();
-
-  EXPECT_TRUE(CheckNonNestableInvariants(this->task_tracker_->GetTaskEvents(),
-                                         kTaskCount));
-}
-
-
-// TODO(francoisk777@gmail.com) Add a test, similiar to the above, which runs
-// some tasked nestedly (which should be implemented in the test
-// delegate). Also add, to the the test delegate, a predicate which checks
-// whether the implementation supports nested tasks.
-//
-
-// The SequencedTaskRunnerTest test case verifies behaviour that is expected
-// from a sequenced task runner in order to be conformant.
-REGISTER_TYPED_TEST_CASE_P(SequencedTaskRunnerTest,
-                           SequentialNonNestable,
-                           SequentialNestable,
-                           SequentialDelayedNonNestable,
-                           NonNestablePostFromNonNestableTask,
-                           DelayedTasksSameDelay,
-                           DelayedTaskAfterLongTask,
-                           DelayedTaskAfterManyLongTasks);
-
-template <typename TaskRunnerTestDelegate>
-class SequencedTaskRunnerDelayedTest
-    : public SequencedTaskRunnerTest<TaskRunnerTestDelegate> {};
-
-TYPED_TEST_CASE_P(SequencedTaskRunnerDelayedTest);
-
-// This test posts a delayed task, and checks that the task is run later than
-// the specified time.
-TYPED_TEST_P(SequencedTaskRunnerDelayedTest, DelayedTaskBasic) {
-  const int kTaskCount = 1;
-  const TimeDelta kDelay = TimeDelta::FromMilliseconds(100);
-
-  this->delegate_.StartTaskRunner();
-  const scoped_refptr<SequencedTaskRunner> task_runner =
-      this->delegate_.GetTaskRunner();
-
-  Time time_before_run = Time::Now();
-  this->task_tracker_->PostWrappedDelayedNonNestableTask(task_runner.get(),
-                                                         Closure(), kDelay);
-  this->task_tracker_->WaitForCompletedTasks(kTaskCount);
-  this->delegate_.StopTaskRunner();
-  Time time_after_run = Time::Now();
-
-  EXPECT_TRUE(CheckNonNestableInvariants(this->task_tracker_->GetTaskEvents(),
-                                         kTaskCount));
-  EXPECT_LE(kDelay, time_after_run - time_before_run);
-}
-
-// SequencedTaskRunnerDelayedTest tests that the |delay| parameter of
-// is used to actually wait for |delay| ms before executing the task.
-// This is not mandatory for a SequencedTaskRunner to be compliant.
-REGISTER_TYPED_TEST_CASE_P(SequencedTaskRunnerDelayedTest, DelayedTaskBasic);
-
-}  // namespace base
-
-#endif  // BASE_TEST_SEQUENCED_TASK_RUNNER_TEST_TEMPLATE_H_
diff --git a/base/test/simple_test_clock.cc b/base/test/simple_test_clock.cc
deleted file mode 100644
index 7486d79..0000000
--- a/base/test/simple_test_clock.cc
+++ /dev/null
@@ -1,28 +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/simple_test_clock.h"
-
-namespace base {
-
-SimpleTestClock::SimpleTestClock() = default;
-
-SimpleTestClock::~SimpleTestClock() = default;
-
-Time SimpleTestClock::Now() const {
-  AutoLock lock(lock_);
-  return now_;
-}
-
-void SimpleTestClock::Advance(TimeDelta delta) {
-  AutoLock lock(lock_);
-  now_ += delta;
-}
-
-void SimpleTestClock::SetNow(Time now) {
-  AutoLock lock(lock_);
-  now_ = now;
-}
-
-}  // namespace base
diff --git a/base/test/simple_test_clock.h b/base/test/simple_test_clock.h
deleted file mode 100644
index 0cbcf08..0000000
--- a/base/test/simple_test_clock.h
+++ /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.
-
-#ifndef BASE_TEST_SIMPLE_TEST_CLOCK_H_
-#define BASE_TEST_SIMPLE_TEST_CLOCK_H_
-
-#include "base/compiler_specific.h"
-#include "base/synchronization/lock.h"
-#include "base/time/clock.h"
-#include "base/time/time.h"
-
-namespace base {
-
-// SimpleTestClock is a Clock implementation that gives control over
-// the returned Time objects.  All methods may be called from any
-// thread.
-class SimpleTestClock : public Clock {
- public:
-  // Starts off with a clock set to Time().
-  SimpleTestClock();
-  ~SimpleTestClock() override;
-
-  Time Now() const override;
-
-  // Advances the clock by |delta|.
-  void Advance(TimeDelta delta);
-
-  // Sets the clock to the given time.
-  void SetNow(Time now);
-
- private:
-  // Protects |now_|.
-  mutable Lock lock_;
-
-  Time now_;
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_SIMPLE_TEST_CLOCK_H_
diff --git a/base/test/simple_test_tick_clock.cc b/base/test/simple_test_tick_clock.cc
deleted file mode 100644
index 7ee3401..0000000
--- a/base/test/simple_test_tick_clock.cc
+++ /dev/null
@@ -1,31 +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/simple_test_tick_clock.h"
-
-#include "base/logging.h"
-
-namespace base {
-
-SimpleTestTickClock::SimpleTestTickClock() = default;
-
-SimpleTestTickClock::~SimpleTestTickClock() = default;
-
-TimeTicks SimpleTestTickClock::NowTicks() const {
-  AutoLock lock(lock_);
-  return now_ticks_;
-}
-
-void SimpleTestTickClock::Advance(TimeDelta delta) {
-  AutoLock lock(lock_);
-  DCHECK(delta >= TimeDelta());
-  now_ticks_ += delta;
-}
-
-void SimpleTestTickClock::SetNowTicks(TimeTicks ticks) {
-  AutoLock lock(lock_);
-  now_ticks_ = ticks;
-}
-
-}  // namespace base
diff --git a/base/test/simple_test_tick_clock.h b/base/test/simple_test_tick_clock.h
deleted file mode 100644
index 923eba4..0000000
--- a/base/test/simple_test_tick_clock.h
+++ /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.
-
-#ifndef BASE_TEST_SIMPLE_TEST_TICK_CLOCK_H_
-#define BASE_TEST_SIMPLE_TEST_TICK_CLOCK_H_
-
-#include "base/compiler_specific.h"
-#include "base/synchronization/lock.h"
-#include "base/time/tick_clock.h"
-#include "base/time/time.h"
-
-namespace base {
-
-// SimpleTestTickClock is a TickClock implementation that gives
-// control over the returned TimeTicks objects.  All methods may be
-// called from any thread.
-class SimpleTestTickClock : public TickClock {
- public:
-  // Starts off with a clock set to TimeTicks().
-  SimpleTestTickClock();
-  ~SimpleTestTickClock() override;
-
-  TimeTicks NowTicks() const override;
-
-  // Advances the clock by |delta|, which must not be negative.
-  void Advance(TimeDelta delta);
-
-  // Sets the clock to the given time.
-  void SetNowTicks(TimeTicks ticks);
-
- private:
-  // Protects |now_ticks_|.
-  mutable Lock lock_;
-
-  TimeTicks now_ticks_;
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_SIMPLE_TEST_TICK_CLOCK_H_
diff --git a/base/test/task_runner_test_template.cc b/base/test/task_runner_test_template.cc
deleted file mode 100644
index fe70247..0000000
--- a/base/test/task_runner_test_template.cc
+++ /dev/null
@@ -1,47 +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/task_runner_test_template.h"
-
-namespace base {
-
-namespace test {
-
-TaskTracker::TaskTracker() : task_runs_(0), task_runs_cv_(&lock_) {}
-
-TaskTracker::~TaskTracker() = default;
-
-Closure TaskTracker::WrapTask(const Closure& task, int i) {
-  return Bind(&TaskTracker::RunTask, this, task, i);
-}
-
-void TaskTracker::RunTask(const Closure& task, int i) {
-  AutoLock lock(lock_);
-  if (!task.is_null()) {
-    task.Run();
-  }
-  ++task_run_counts_[i];
-  ++task_runs_;
-  task_runs_cv_.Signal();
-}
-
-std::map<int, int> TaskTracker::GetTaskRunCounts() const {
-  AutoLock lock(lock_);
-  return task_run_counts_;
-}
-
-void TaskTracker::WaitForCompletedTasks(int count) {
-  AutoLock lock(lock_);
-  while (task_runs_ < count)
-    task_runs_cv_.Wait();
-}
-
-void ExpectRunsTasksInCurrentSequence(bool expected_value,
-                                      TaskRunner* task_runner) {
-  EXPECT_EQ(expected_value, task_runner->RunsTasksInCurrentSequence());
-}
-
-}  // namespace test
-
-}  // namespace base
diff --git a/base/test/task_runner_test_template.h b/base/test/task_runner_test_template.h
deleted file mode 100644
index 4670522..0000000
--- a/base/test/task_runner_test_template.h
+++ /dev/null
@@ -1,230 +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 defines tests that implementations of TaskRunner should
-// pass in order to be conformant, as well as test cases for optional behavior.
-// Here's how you use it to test your implementation.
-//
-// Say your class is called MyTaskRunner.  Then you need to define a
-// class called MyTaskRunnerTestDelegate in my_task_runner_unittest.cc
-// like this:
-//
-//   class MyTaskRunnerTestDelegate {
-//    public:
-//     // Tasks posted to the task runner after this and before
-//     // StopTaskRunner() is called is called should run successfully.
-//     void StartTaskRunner() {
-//       ...
-//     }
-//
-//     // Should return the task runner implementation.  Only called
-//     // after StartTaskRunner and before StopTaskRunner.
-//     scoped_refptr<MyTaskRunner> GetTaskRunner() {
-//       ...
-//     }
-//
-//     // Stop the task runner and make sure all tasks posted before
-//     // this is called are run. Caveat: delayed tasks are not run,
-       // they're simply deleted.
-//     void StopTaskRunner() {
-//       ...
-//     }
-//   };
-//
-// The TaskRunnerTest test harness will have a member variable of
-// this delegate type and will call its functions in the various
-// tests.
-//
-// Then you simply #include this file as well as gtest.h and add the
-// following statement to my_task_runner_unittest.cc:
-//
-//   INSTANTIATE_TYPED_TEST_CASE_P(
-//       MyTaskRunner, TaskRunnerTest, MyTaskRunnerTestDelegate);
-//
-// Easy!
-//
-// The optional test harnesses TaskRunnerAffinityTest can be
-// instanciated in the same way, using the same delegate:
-//
-//   INSTANTIATE_TYPED_TEST_CASE_P(
-//       MyTaskRunner, TaskRunnerAffinityTest, MyTaskRunnerTestDelegate);
-
-
-#ifndef BASE_TEST_TASK_RUNNER_TEST_TEMPLATE_H_
-#define BASE_TEST_TASK_RUNNER_TEST_TEMPLATE_H_
-
-#include <cstddef>
-#include <map>
-
-#include "base/bind.h"
-#include "base/callback.h"
-#include "base/location.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/condition_variable.h"
-#include "base/synchronization/lock.h"
-#include "base/task_runner.h"
-#include "base/threading/thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-namespace test {
-
-// Utility class that keeps track of how many times particular tasks
-// are run.
-class TaskTracker : public RefCountedThreadSafe<TaskTracker> {
- public:
-  TaskTracker();
-
-  // Returns a closure that runs the given task and increments the run
-  // count of |i| by one.  |task| may be null.  It is guaranteed that
-  // only one task wrapped by a given tracker will be run at a time.
-  Closure WrapTask(const Closure& task, int i);
-
-  std::map<int, int> GetTaskRunCounts() const;
-
-  // Returns after the tracker observes a total of |count| task completions.
-  void WaitForCompletedTasks(int count);
-
- private:
-  friend class RefCountedThreadSafe<TaskTracker>;
-
-  ~TaskTracker();
-
-  void RunTask(const Closure& task, int i);
-
-  mutable Lock lock_;
-  std::map<int, int> task_run_counts_;
-  int task_runs_;
-  ConditionVariable task_runs_cv_;
-
-  DISALLOW_COPY_AND_ASSIGN(TaskTracker);
-};
-
-}  // namespace test
-
-template <typename TaskRunnerTestDelegate>
-class TaskRunnerTest : public testing::Test {
- protected:
-  TaskRunnerTest() : task_tracker_(new test::TaskTracker()) {}
-
-  const scoped_refptr<test::TaskTracker> task_tracker_;
-  TaskRunnerTestDelegate delegate_;
-};
-
-TYPED_TEST_CASE_P(TaskRunnerTest);
-
-// We can't really test much, since TaskRunner provides very few
-// guarantees.
-
-// Post a bunch of tasks to the task runner.  They should all
-// complete.
-TYPED_TEST_P(TaskRunnerTest, Basic) {
-  std::map<int, int> expected_task_run_counts;
-
-  this->delegate_.StartTaskRunner();
-  scoped_refptr<TaskRunner> task_runner = this->delegate_.GetTaskRunner();
-  // Post each ith task i+1 times.
-  for (int i = 0; i < 20; ++i) {
-    const Closure& ith_task = this->task_tracker_->WrapTask(Closure(), i);
-    for (int j = 0; j < i + 1; ++j) {
-      task_runner->PostTask(FROM_HERE, ith_task);
-      ++expected_task_run_counts[i];
-    }
-  }
-  this->delegate_.StopTaskRunner();
-
-  EXPECT_EQ(expected_task_run_counts,
-            this->task_tracker_->GetTaskRunCounts());
-}
-
-// Post a bunch of delayed tasks to the task runner.  They should all
-// complete.
-TYPED_TEST_P(TaskRunnerTest, Delayed) {
-  std::map<int, int> expected_task_run_counts;
-  int expected_total_tasks = 0;
-
-  this->delegate_.StartTaskRunner();
-  scoped_refptr<TaskRunner> task_runner = this->delegate_.GetTaskRunner();
-  // Post each ith task i+1 times with delays from 0-i.
-  for (int i = 0; i < 20; ++i) {
-    const Closure& ith_task = this->task_tracker_->WrapTask(Closure(), i);
-    for (int j = 0; j < i + 1; ++j) {
-      task_runner->PostDelayedTask(
-          FROM_HERE, ith_task, base::TimeDelta::FromMilliseconds(j));
-      ++expected_task_run_counts[i];
-      ++expected_total_tasks;
-    }
-  }
-  this->task_tracker_->WaitForCompletedTasks(expected_total_tasks);
-  this->delegate_.StopTaskRunner();
-
-  EXPECT_EQ(expected_task_run_counts,
-            this->task_tracker_->GetTaskRunCounts());
-}
-
-// The TaskRunnerTest test case verifies behaviour that is expected from a
-// task runner in order to be conformant.
-REGISTER_TYPED_TEST_CASE_P(TaskRunnerTest, Basic, Delayed);
-
-namespace test {
-
-// Calls RunsTasksInCurrentSequence() on |task_runner| and expects it to
-// equal |expected_value|.
-void ExpectRunsTasksInCurrentSequence(bool expected_value,
-                                      TaskRunner* task_runner);
-
-}  // namespace test
-
-template <typename TaskRunnerTestDelegate>
-class TaskRunnerAffinityTest : public TaskRunnerTest<TaskRunnerTestDelegate> {};
-
-TYPED_TEST_CASE_P(TaskRunnerAffinityTest);
-
-// Post a bunch of tasks to the task runner as well as to a separate
-// thread, each checking the value of RunsTasksInCurrentSequence(),
-// which should return true for the tasks posted on the task runner
-// and false for the tasks posted on the separate thread.
-TYPED_TEST_P(TaskRunnerAffinityTest, RunsTasksInCurrentSequence) {
-  std::map<int, int> expected_task_run_counts;
-
-  Thread thread("Non-task-runner thread");
-  ASSERT_TRUE(thread.Start());
-  this->delegate_.StartTaskRunner();
-
-  scoped_refptr<TaskRunner> task_runner = this->delegate_.GetTaskRunner();
-  // Post each ith task i+1 times on the task runner and i+1 times on
-  // the non-task-runner thread.
-  for (int i = 0; i < 20; ++i) {
-    const Closure& ith_task_runner_task = this->task_tracker_->WrapTask(
-        Bind(&test::ExpectRunsTasksInCurrentSequence, true,
-             base::RetainedRef(task_runner)),
-        i);
-    const Closure& ith_non_task_runner_task = this->task_tracker_->WrapTask(
-        Bind(&test::ExpectRunsTasksInCurrentSequence, false,
-             base::RetainedRef(task_runner)),
-        i);
-    for (int j = 0; j < i + 1; ++j) {
-      task_runner->PostTask(FROM_HERE, ith_task_runner_task);
-      thread.task_runner()->PostTask(FROM_HERE, ith_non_task_runner_task);
-      expected_task_run_counts[i] += 2;
-    }
-  }
-
-  this->delegate_.StopTaskRunner();
-  thread.Stop();
-
-  EXPECT_EQ(expected_task_run_counts,
-            this->task_tracker_->GetTaskRunCounts());
-}
-
-// TaskRunnerAffinityTest tests that the TaskRunner implementation
-// can determine if tasks will never be run on a specific thread.
-REGISTER_TYPED_TEST_CASE_P(TaskRunnerAffinityTest, RunsTasksInCurrentSequence);
-
-}  // namespace base
-
-#endif  // BASE_TEST_TASK_RUNNER_TEST_TEMPLATE_H_
diff --git a/base/test/test_child_process.cc b/base/test/test_child_process.cc
deleted file mode 100644
index ce15856..0000000
--- a/base/test/test_child_process.cc
+++ /dev/null
@@ -1,43 +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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-// Simple testing command, used to exercise child process launcher calls.
-//
-// Usage:
-//        echo_test_helper [-x exit_code] arg0 arg1 arg2...
-//        Prints arg0..n to stdout with space delimiters between args,
-//        returning "exit_code" if -x is specified.
-//
-//        echo_test_helper -e env_var
-//        Prints the environmental variable |env_var| to stdout.
-int main(int argc, char** argv) {
-  if (strcmp(argv[1], "-e") == 0) {
-    if (argc != 3) {
-      return 1;
-    }
-
-    const char* env = getenv(argv[2]);
-    if (env != NULL) {
-      printf("%s", env);
-    }
-  } else {
-    int return_code = 0;
-    int start_idx = 1;
-
-    if (strcmp(argv[1], "-x") == 0) {
-      return_code = atoi(argv[2]);
-      start_idx = 3;
-    }
-
-    for (int i = start_idx; i < argc; ++i) {
-      printf((i < argc - 1 ? "%s " : "%s"), argv[i]);
-    }
-
-    return return_code;
-  }
-}
diff --git a/base/test/test_discardable_memory_allocator.cc b/base/test/test_discardable_memory_allocator.cc
deleted file mode 100644
index a9bd097..0000000
--- a/base/test/test_discardable_memory_allocator.cc
+++ /dev/null
@@ -1,61 +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/test_discardable_memory_allocator.h"
-
-#include <cstdint>
-#include <cstring>
-
-#include "base/logging.h"
-#include "base/memory/discardable_memory.h"
-#include "base/memory/ptr_util.h"
-
-namespace base {
-namespace {
-
-class DiscardableMemoryImpl : public DiscardableMemory {
- public:
-  explicit DiscardableMemoryImpl(size_t size)
-      : data_(new uint8_t[size]), size_(size) {}
-
-  // Overridden from DiscardableMemory:
-  bool Lock() override {
-    DCHECK(!is_locked_);
-    is_locked_ = true;
-    return false;
-  }
-
-  void Unlock() override {
-    DCHECK(is_locked_);
-    is_locked_ = false;
-    // Force eviction to catch clients not correctly checking the return value
-    // of Lock().
-    memset(data_.get(), 0, size_);
-  }
-
-  void* data() const override {
-    DCHECK(is_locked_);
-    return data_.get();
-  }
-
-  trace_event::MemoryAllocatorDump* CreateMemoryAllocatorDump(
-      const char* name,
-      trace_event::ProcessMemoryDump* pmd) const override {
-    return nullptr;
-  }
-
- private:
-  bool is_locked_ = true;
-  std::unique_ptr<uint8_t[]> data_;
-  size_t size_;
-};
-
-}  // namespace
-
-std::unique_ptr<DiscardableMemory>
-TestDiscardableMemoryAllocator::AllocateLockedDiscardableMemory(size_t size) {
-  return std::make_unique<DiscardableMemoryImpl>(size);
-}
-
-}  // namespace base
diff --git a/base/test/test_discardable_memory_allocator.h b/base/test/test_discardable_memory_allocator.h
deleted file mode 100644
index 87436e3..0000000
--- a/base/test/test_discardable_memory_allocator.h
+++ /dev/null
@@ -1,32 +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.
-
-#ifndef BASE_TEST_TEST_DISCARDABLE_MEMORY_ALLOCATOR_H_
-#define BASE_TEST_TEST_DISCARDABLE_MEMORY_ALLOCATOR_H_
-
-#include <stddef.h>
-
-#include "base/macros.h"
-#include "base/memory/discardable_memory_allocator.h"
-
-namespace base {
-
-// TestDiscardableMemoryAllocator is a simple DiscardableMemoryAllocator
-// implementation that can be used for testing. It allocates one-shot
-// DiscardableMemory instances backed by heap memory.
-class TestDiscardableMemoryAllocator : public DiscardableMemoryAllocator {
- public:
-  constexpr TestDiscardableMemoryAllocator() = default;
-
-  // Overridden from DiscardableMemoryAllocator:
-  std::unique_ptr<DiscardableMemory> AllocateLockedDiscardableMemory(
-      size_t size) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(TestDiscardableMemoryAllocator);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_TEST_DISCARDABLE_MEMORY_ALLOCATOR_H_
diff --git a/base/test/test_file_util.cc b/base/test/test_file_util.cc
deleted file mode 100644
index 8dafc58..0000000
--- a/base/test/test_file_util.cc
+++ /dev/null
@@ -1,23 +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/test/test_file_util.h"
-
-#include "base/test/test_timeouts.h"
-#include "base/threading/platform_thread.h"
-
-namespace base {
-
-bool EvictFileFromSystemCacheWithRetry(const FilePath& path) {
-  const int kCycles = 10;
-  const TimeDelta kDelay = TestTimeouts::action_timeout() / kCycles;
-  for (int i = 0; i < kCycles; i++) {
-    if (EvictFileFromSystemCache(path))
-      return true;
-    PlatformThread::Sleep(kDelay);
-  }
-  return false;
-}
-
-}  // namespace base
diff --git a/base/test/test_file_util.h b/base/test/test_file_util.h
deleted file mode 100644
index f167ca7..0000000
--- a/base/test/test_file_util.h
+++ /dev/null
@@ -1,82 +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.
-
-#ifndef BASE_TEST_TEST_FILE_UTIL_H_
-#define BASE_TEST_TEST_FILE_UTIL_H_
-
-// File utility functions used only by tests.
-
-#include <stddef.h>
-
-#include <string>
-
-#include "base/compiler_specific.h"
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "build_config.h"
-
-#if defined(OS_ANDROID)
-#include <jni.h>
-#endif
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif
-
-namespace base {
-
-class FilePath;
-
-// Clear a specific file from the system cache like EvictFileFromSystemCache,
-// but on failure it will sleep and retry. On the Windows buildbots, eviction
-// can fail if the file is marked in use, and this will throw off timings that
-// rely on uncached files.
-bool EvictFileFromSystemCacheWithRetry(const FilePath& file);
-
-// Wrapper over base::Delete. On Windows repeatedly invokes Delete in case
-// of failure to workaround Windows file locking semantics. Returns true on
-// success.
-bool DieFileDie(const FilePath& file, bool recurse);
-
-// Clear a specific file from the system cache. After this call, trying
-// to access this file will result in a cold load from the hard drive.
-bool EvictFileFromSystemCache(const FilePath& file);
-
-#if defined(OS_WIN)
-// Deny |permission| on the file |path| for the current user. |permission| is an
-// ACCESS_MASK structure which is defined in
-// https://msdn.microsoft.com/en-us/library/windows/desktop/aa374892.aspx
-// Refer to https://msdn.microsoft.com/en-us/library/aa822867.aspx for a list of
-// possible values.
-bool DenyFilePermission(const FilePath& path, DWORD permission);
-#endif  // defined(OS_WIN)
-
-// For testing, make the file unreadable or unwritable.
-// In POSIX, this does not apply to the root user.
-bool MakeFileUnreadable(const FilePath& path) WARN_UNUSED_RESULT;
-bool MakeFileUnwritable(const FilePath& path) WARN_UNUSED_RESULT;
-
-// Saves the current permissions for a path, and restores it on destruction.
-class FilePermissionRestorer {
- public:
-  explicit FilePermissionRestorer(const FilePath& path);
-  ~FilePermissionRestorer();
-
- private:
-  const FilePath path_;
-  void* info_;  // The opaque stored permission information.
-  size_t length_;  // The length of the stored permission information.
-
-  DISALLOW_COPY_AND_ASSIGN(FilePermissionRestorer);
-};
-
-#if defined(OS_ANDROID)
-// Insert an image file into the MediaStore, and retrieve the content URI for
-// testing purpose.
-FilePath InsertImageIntoMediaStore(const FilePath& path);
-#endif  // defined(OS_ANDROID)
-
-}  // namespace base
-
-#endif  // BASE_TEST_TEST_FILE_UTIL_H_
diff --git a/base/test/test_file_util_linux.cc b/base/test/test_file_util_linux.cc
deleted file mode 100644
index cf8b056..0000000
--- a/base/test/test_file_util_linux.cc
+++ /dev/null
@@ -1,59 +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/test/test_file_util.h"
-
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#if defined(OS_ANDROID)
-#include <asm/unistd.h>
-#include <errno.h>
-#include <linux/fadvise.h>
-#include <sys/syscall.h>
-#endif
-
-#include "base/files/file_path.h"
-#include "base/files/scoped_file.h"
-
-namespace base {
-
-// Inconveniently, the NDK doesn't provide for posix_fadvise
-// until native API level = 21, which we don't use yet, so provide a wrapper, at
-// least on ARM32
-#if defined(OS_ANDROID) && __ANDROID_API__ < 21
-
-namespace {
-int posix_fadvise(int fd, off_t offset, off_t len, int advice) {
-#if defined(ARCH_CPU_ARMEL)
-  // Note that the syscall argument order on ARM is different from the C
-  // function; this is helpfully documented in the Linux posix_fadvise manpage.
-  return syscall(__NR_arm_fadvise64_64, fd, advice,
-                 0,  // Upper 32-bits for offset
-                 offset,
-                 0,  // Upper 32-bits for length
-                 len);
-#endif
-  NOTIMPLEMENTED();
-  return ENOSYS;
-}
-
-}  // namespace
-
-#endif  // OS_ANDROID
-
-bool EvictFileFromSystemCache(const FilePath& file) {
-  ScopedFD fd(open(file.value().c_str(), O_RDONLY));
-  if (!fd.is_valid())
-    return false;
-  if (fdatasync(fd.get()) != 0)
-    return false;
-  if (posix_fadvise(fd.get(), 0, 0, POSIX_FADV_DONTNEED) != 0)
-    return false;
-  return true;
-}
-
-}  // namespace base
diff --git a/base/test/test_file_util_mac.cc b/base/test/test_file_util_mac.cc
deleted file mode 100644
index 174a31d..0000000
--- a/base/test/test_file_util_mac.cc
+++ /dev/null
@@ -1,52 +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/test/test_file_util.h"
-
-#include <sys/mman.h>
-#include <errno.h>
-#include <stdint.h>
-
-#include "base/files/file_util.h"
-#include "base/files/memory_mapped_file.h"
-#include "base/logging.h"
-
-namespace base {
-
-bool EvictFileFromSystemCache(const FilePath& file) {
-  // There aren't any really direct ways to purge a file from the UBC.  From
-  // talking with Amit Singh, the safest is to mmap the file with MAP_FILE (the
-  // default) + MAP_SHARED, then do an msync to invalidate the memory.  The next
-  // open should then have to load the file from disk.
-
-  int64_t length;
-  if (!GetFileSize(file, &length)) {
-    DLOG(ERROR) << "failed to get size of " << file.value();
-    return false;
-  }
-
-  // When a file is empty, we do not need to evict it from cache.
-  // In fact, an attempt to map it to memory will result in error.
-  if (length == 0) {
-    DLOG(WARNING) << "file size is zero, will not attempt to map to memory";
-    return true;
-  }
-
-  MemoryMappedFile mapped_file;
-  if (!mapped_file.Initialize(file)) {
-    DLOG(WARNING) << "failed to memory map " << file.value();
-    return false;
-  }
-
-  if (msync(const_cast<uint8_t*>(mapped_file.data()), mapped_file.length(),
-            MS_INVALIDATE) != 0) {
-    DLOG(WARNING) << "failed to invalidate memory map of " << file.value()
-                  << ", errno: " << errno;
-    return false;
-  }
-
-  return true;
-}
-
-}  // namespace base
diff --git a/base/test/test_file_util_posix.cc b/base/test/test_file_util_posix.cc
deleted file mode 100644
index 2082709..0000000
--- a/base/test/test_file_util_posix.cc
+++ /dev/null
@@ -1,110 +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_file_util.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stddef.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <string>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "build_config.h"
-
-namespace base {
-
-namespace {
-
-// Deny |permission| on the file |path|.
-bool DenyFilePermission(const FilePath& path, mode_t permission) {
-  struct stat stat_buf;
-  if (stat(path.value().c_str(), &stat_buf) != 0)
-    return false;
-  stat_buf.st_mode &= ~permission;
-
-  int rv = HANDLE_EINTR(chmod(path.value().c_str(), stat_buf.st_mode));
-  return rv == 0;
-}
-
-// Gets a blob indicating the permission information for |path|.
-// |length| is the length of the blob.  Zero on failure.
-// Returns the blob pointer, or NULL on failure.
-void* GetPermissionInfo(const FilePath& path, size_t* length) {
-  DCHECK(length);
-  *length = 0;
-
-  struct stat stat_buf;
-  if (stat(path.value().c_str(), &stat_buf) != 0)
-    return nullptr;
-
-  *length = sizeof(mode_t);
-  mode_t* mode = new mode_t;
-  *mode = stat_buf.st_mode & ~S_IFMT;  // Filter out file/path kind.
-
-  return mode;
-}
-
-// Restores the permission information for |path|, given the blob retrieved
-// using |GetPermissionInfo()|.
-// |info| is the pointer to the blob.
-// |length| is the length of the blob.
-// Either |info| or |length| may be NULL/0, in which case nothing happens.
-bool RestorePermissionInfo(const FilePath& path, void* info, size_t length) {
-  if (!info || (length == 0))
-    return false;
-
-  DCHECK_EQ(sizeof(mode_t), length);
-  mode_t* mode = reinterpret_cast<mode_t*>(info);
-
-  int rv = HANDLE_EINTR(chmod(path.value().c_str(), *mode));
-
-  delete mode;
-
-  return rv == 0;
-}
-
-}  // namespace
-
-bool DieFileDie(const FilePath& file, bool recurse) {
-  // There is no need to workaround Windows problems on POSIX.
-  // Just pass-through.
-  return DeleteFile(file, recurse);
-}
-
-#if !defined(OS_LINUX) && !defined(OS_MACOSX) && !defined(OS_ANDROID)
-bool EvictFileFromSystemCache(const FilePath& file) {
-  // There doesn't seem to be a POSIX way to cool the disk cache.
-  NOTIMPLEMENTED();
-  return false;
-}
-#endif
-
-bool MakeFileUnreadable(const FilePath& path) {
-  return DenyFilePermission(path, S_IRUSR | S_IRGRP | S_IROTH);
-}
-
-bool MakeFileUnwritable(const FilePath& path) {
-  return DenyFilePermission(path, S_IWUSR | S_IWGRP | S_IWOTH);
-}
-
-FilePermissionRestorer::FilePermissionRestorer(const FilePath& path)
-    : path_(path), info_(nullptr), length_(0) {
-  info_ = GetPermissionInfo(path_, &length_);
-  DCHECK(info_ != nullptr);
-  DCHECK_NE(0u, length_);
-}
-
-FilePermissionRestorer::~FilePermissionRestorer() {
-  if (!RestorePermissionInfo(path_, info_, length_))
-    NOTREACHED();
-}
-
-}  // namespace base
diff --git a/base/test/test_file_util_win.cc b/base/test/test_file_util_win.cc
deleted file mode 100644
index da596bb..0000000
--- a/base/test/test_file_util_win.cc
+++ /dev/null
@@ -1,182 +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_file_util.h"
-
-#include <aclapi.h>
-#include <shlwapi.h>
-#include <stddef.h>
-#include <wchar.h>
-#include <windows.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string_split.h"
-#include "base/threading/platform_thread.h"
-#include "base/win/scoped_handle.h"
-
-namespace base {
-
-namespace {
-
-struct PermissionInfo {
-  PSECURITY_DESCRIPTOR security_descriptor;
-  ACL dacl;
-};
-
-// Gets a blob indicating the permission information for |path|.
-// |length| is the length of the blob.  Zero on failure.
-// Returns the blob pointer, or NULL on failure.
-void* GetPermissionInfo(const FilePath& path, size_t* length) {
-  DCHECK(length != NULL);
-  *length = 0;
-  PACL dacl = NULL;
-  PSECURITY_DESCRIPTOR security_descriptor;
-  if (GetNamedSecurityInfo(const_cast<wchar_t*>(path.value().c_str()),
-                           SE_FILE_OBJECT,
-                           DACL_SECURITY_INFORMATION, NULL, NULL, &dacl,
-                           NULL, &security_descriptor) != ERROR_SUCCESS) {
-    return NULL;
-  }
-  DCHECK(dacl != NULL);
-
-  *length = sizeof(PSECURITY_DESCRIPTOR) + dacl->AclSize;
-  PermissionInfo* info = reinterpret_cast<PermissionInfo*>(new char[*length]);
-  info->security_descriptor = security_descriptor;
-  memcpy(&info->dacl, dacl, dacl->AclSize);
-
-  return info;
-}
-
-// Restores the permission information for |path|, given the blob retrieved
-// using |GetPermissionInfo()|.
-// |info| is the pointer to the blob.
-// |length| is the length of the blob.
-// Either |info| or |length| may be NULL/0, in which case nothing happens.
-bool RestorePermissionInfo(const FilePath& path, void* info, size_t length) {
-  if (!info || !length)
-    return false;
-
-  PermissionInfo* perm = reinterpret_cast<PermissionInfo*>(info);
-
-  DWORD rc = SetNamedSecurityInfo(const_cast<wchar_t*>(path.value().c_str()),
-                                  SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
-                                  NULL, NULL, &perm->dacl, NULL);
-  LocalFree(perm->security_descriptor);
-
-  char* char_array = reinterpret_cast<char*>(info);
-  delete [] char_array;
-
-  return rc == ERROR_SUCCESS;
-}
-
-std::unique_ptr<wchar_t[]> ToCStr(const std::basic_string<wchar_t>& str) {
-  size_t size = str.size() + 1;
-  std::unique_ptr<wchar_t[]> ptr = std::make_unique<wchar_t[]>(size);
-  wcsncpy(ptr.get(), str.c_str(), size);
-  return ptr;
-}
-
-}  // namespace
-
-bool DieFileDie(const FilePath& file, bool recurse) {
-  // It turns out that to not induce flakiness a long timeout is needed.
-  const int kIterations = 25;
-  const TimeDelta kTimeout = TimeDelta::FromSeconds(10) / kIterations;
-
-  if (!PathExists(file))
-    return true;
-
-  // Sometimes Delete fails, so try a few more times. Divide the timeout
-  // into short chunks, so that if a try succeeds, we won't delay the test
-  // for too long.
-  for (int i = 0; i < kIterations; ++i) {
-    if (DeleteFile(file, recurse))
-      return true;
-    PlatformThread::Sleep(kTimeout);
-  }
-  return false;
-}
-
-bool EvictFileFromSystemCache(const FilePath& file) {
-  base::win::ScopedHandle file_handle(
-      CreateFile(file.value().c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL,
-                 OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL));
-  if (!file_handle.IsValid())
-    return false;
-
-  // Re-write the file time information to trigger cache eviction for the file.
-  // This function previously overwrote the entire file without buffering, but
-  // local experimentation validates this simplified and *much* faster approach:
-  // [1] Sysinternals RamMap no longer lists these files as cached afterwards.
-  // [2] Telemetry performance test startup.cold.blank_page reports sane values.
-  BY_HANDLE_FILE_INFORMATION bhi = {0};
-  CHECK(::GetFileInformationByHandle(file_handle.Get(), &bhi));
-  CHECK(::SetFileTime(file_handle.Get(), &bhi.ftCreationTime,
-                      &bhi.ftLastAccessTime, &bhi.ftLastWriteTime));
-  return true;
-}
-
-// Deny |permission| on the file |path|, for the current user.
-bool DenyFilePermission(const FilePath& path, DWORD permission) {
-  PACL old_dacl;
-  PSECURITY_DESCRIPTOR security_descriptor;
-
-  std::unique_ptr<TCHAR[]> path_ptr = ToCStr(path.value());
-  if (GetNamedSecurityInfo(path_ptr.get(), SE_FILE_OBJECT,
-                           DACL_SECURITY_INFORMATION, nullptr, nullptr,
-                           &old_dacl, nullptr,
-                           &security_descriptor) != ERROR_SUCCESS) {
-    return false;
-  }
-
-  std::unique_ptr<TCHAR[]> current_user = ToCStr(std::wstring(L"CURRENT_USER"));
-  EXPLICIT_ACCESS new_access = {
-      permission,
-      DENY_ACCESS,
-      0,
-      {nullptr, NO_MULTIPLE_TRUSTEE, TRUSTEE_IS_NAME, TRUSTEE_IS_USER,
-       current_user.get()}};
-
-  PACL new_dacl;
-  if (SetEntriesInAcl(1, &new_access, old_dacl, &new_dacl) != ERROR_SUCCESS) {
-    LocalFree(security_descriptor);
-    return false;
-  }
-
-  DWORD rc = SetNamedSecurityInfo(path_ptr.get(), SE_FILE_OBJECT,
-                                  DACL_SECURITY_INFORMATION, nullptr, nullptr,
-                                  new_dacl, nullptr);
-  LocalFree(security_descriptor);
-  LocalFree(new_dacl);
-
-  return rc == ERROR_SUCCESS;
-}
-
-bool MakeFileUnreadable(const FilePath& path) {
-  return DenyFilePermission(path, GENERIC_READ);
-}
-
-bool MakeFileUnwritable(const FilePath& path) {
-  return DenyFilePermission(path, GENERIC_WRITE);
-}
-
-FilePermissionRestorer::FilePermissionRestorer(const FilePath& path)
-    : path_(path), info_(NULL), length_(0) {
-  info_ = GetPermissionInfo(path_, &length_);
-  DCHECK(info_ != NULL);
-  DCHECK_NE(0u, length_);
-}
-
-FilePermissionRestorer::~FilePermissionRestorer() {
-  if (!RestorePermissionInfo(path_, info_, length_))
-    NOTREACHED();
-}
-
-}  // namespace base
diff --git a/base/test/test_io_thread.cc b/base/test/test_io_thread.cc
deleted file mode 100644
index 1b20658..0000000
--- a/base/test/test_io_thread.cc
+++ /dev/null
@@ -1,45 +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_io_thread.h"
-
-#include "base/logging.h"
-#include "base/message_loop/message_loop.h"
-
-namespace base {
-
-TestIOThread::TestIOThread(Mode mode)
-    : io_thread_("test_io_thread"), io_thread_started_(false) {
-  switch (mode) {
-    case kAutoStart:
-      Start();
-      return;
-    case kManualStart:
-      return;
-  }
-  CHECK(false) << "Invalid mode";
-}
-
-TestIOThread::~TestIOThread() {
-  Stop();
-}
-
-void TestIOThread::Start() {
-  CHECK(!io_thread_started_);
-  io_thread_started_ = true;
-  CHECK(io_thread_.StartWithOptions(
-      base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
-}
-
-void TestIOThread::Stop() {
-  // Note: It's okay to call |Stop()| even if the thread isn't running.
-  io_thread_.Stop();
-  io_thread_started_ = false;
-}
-
-void TestIOThread::PostTask(const Location& from_here, base::OnceClosure task) {
-  task_runner()->PostTask(from_here, std::move(task));
-}
-
-}  // namespace base
diff --git a/base/test/test_io_thread.h b/base/test/test_io_thread.h
deleted file mode 100644
index a55a063..0000000
--- a/base/test/test_io_thread.h
+++ /dev/null
@@ -1,60 +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.
-
-#ifndef BASE_TEST_TEST_IO_THREAD_H_
-#define BASE_TEST_TEST_IO_THREAD_H_
-
-#include "base/callback_forward.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/task_runner.h"
-#include "base/threading/thread.h"
-#include "base/time/time.h"
-
-namespace base {
-
-// Create and run an IO thread with a MessageLoop, and
-// making the MessageLoop accessible from its client.
-// It also provides some ideomatic API like PostTaskAndWait().
-//
-// This API is not thread-safe:
-//   - Start()/Stop() should only be called from the main (creation) thread.
-//   - PostTask()/message_loop()/task_runner() are also safe to call from the
-//     underlying thread itself (to post tasks from other threads: get the
-//     task_runner() from the main thread first, it is then safe to pass _it_
-//     around).
-class TestIOThread {
- public:
-  enum Mode { kAutoStart, kManualStart };
-  explicit TestIOThread(Mode mode);
-  // Stops the I/O thread if necessary.
-  ~TestIOThread();
-
-  // After Stop(), Start() may be called again to start a new I/O thread.
-  // Stop() may be called even when the I/O thread is not started.
-  void Start();
-  void Stop();
-
-  // Post |task| to the IO thread.
-  void PostTask(const Location& from_here, base::OnceClosure task);
-
-  base::MessageLoopForIO* message_loop() {
-    return static_cast<base::MessageLoopForIO*>(io_thread_.message_loop());
-  }
-
-  scoped_refptr<SingleThreadTaskRunner> task_runner() {
-    return message_loop()->task_runner();
-  }
-
- private:
-  base::Thread io_thread_;
-  bool io_thread_started_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestIOThread);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_TEST_IO_THREAD_H_
diff --git a/base/test/test_message_loop.cc b/base/test/test_message_loop.cc
deleted file mode 100644
index bd3610f..0000000
--- a/base/test/test_message_loop.cc
+++ /dev/null
@@ -1,18 +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 "base/test/test_message_loop.h"
-
-namespace base {
-
-TestMessageLoop::TestMessageLoop() = default;
-
-TestMessageLoop::TestMessageLoop(MessageLoop::Type type) : loop_(type) {}
-
-TestMessageLoop::~TestMessageLoop() {
-  RunLoop().RunUntilIdle();
-}
-
-}  // namespace base
diff --git a/base/test/test_message_loop.h b/base/test/test_message_loop.h
deleted file mode 100644
index 9c0aed8..0000000
--- a/base/test/test_message_loop.h
+++ /dev/null
@@ -1,34 +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.
-
-#ifndef BASE_TEST_TEST_MESSAGE_LOOP_H_
-#define BASE_TEST_TEST_MESSAGE_LOOP_H_
-
-#include "base/message_loop/message_loop.h"
-
-namespace base {
-
-// TestMessageLoop is a convenience class for unittests that need to create a
-// message loop without a real thread backing it. For most tests,
-// it is sufficient to just instantiate TestMessageLoop as a member variable.
-//
-// TestMessageLoop will attempt to drain the underlying MessageLoop on
-// destruction for clean teardown of tests.
-class TestMessageLoop {
- public:
-  TestMessageLoop();
-  explicit TestMessageLoop(MessageLoop::Type type);
-  ~TestMessageLoop();
-
-  const scoped_refptr<SingleThreadTaskRunner>& task_runner() {
-    return loop_.task_runner();
-  }
-
- private:
-  MessageLoop loop_;
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_TEST_MESSAGE_LOOP_H_
diff --git a/base/test/test_reg_util_win.cc b/base/test/test_reg_util_win.cc
deleted file mode 100644
index 9ce4ad1..0000000
--- a/base/test/test_reg_util_win.cc
+++ /dev/null
@@ -1,122 +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/test/test_reg_util_win.h"
-
-#include <stdint.h>
-
-#include "base/guid.h"
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-#include <windows.h>
-
-namespace registry_util {
-
-namespace {
-
-const wchar_t kTimestampDelimiter[] = L"$";
-const wchar_t kTempTestKeyPath[] = L"Software\\Chromium\\TempTestKeys";
-
-void DeleteStaleTestKeys(const base::Time& now,
-                         const base::string16& test_key_root) {
-  base::win::RegKey test_root_key;
-  if (test_root_key.Open(HKEY_CURRENT_USER,
-                         test_key_root.c_str(),
-                         KEY_ALL_ACCESS) != ERROR_SUCCESS) {
-    // This will occur on first-run, but is harmless.
-    return;
-  }
-
-  base::win::RegistryKeyIterator iterator_test_root_key(HKEY_CURRENT_USER,
-                                                        test_key_root.c_str());
-  for (; iterator_test_root_key.Valid(); ++iterator_test_root_key) {
-    base::string16 key_name = iterator_test_root_key.Name();
-    std::vector<base::string16> tokens = base::SplitString(
-        key_name, kTimestampDelimiter, base::KEEP_WHITESPACE,
-        base::SPLIT_WANT_NONEMPTY);
-    if (tokens.empty())
-      continue;
-    int64_t key_name_as_number = 0;
-
-    if (!base::StringToInt64(tokens[0], &key_name_as_number)) {
-      test_root_key.DeleteKey(key_name.c_str());
-      continue;
-    }
-
-    base::Time key_time = base::Time::FromInternalValue(key_name_as_number);
-    base::TimeDelta age = now - key_time;
-
-    if (age > base::TimeDelta::FromHours(24))
-      test_root_key.DeleteKey(key_name.c_str());
-  }
-}
-
-base::string16 GenerateTempKeyPath(const base::string16& test_key_root,
-                                   const base::Time& timestamp) {
-  base::string16 key_path = test_key_root;
-  key_path += L"\\" + base::Int64ToString16(timestamp.ToInternalValue());
-  key_path += kTimestampDelimiter + base::ASCIIToUTF16(base::GenerateGUID());
-
-  return key_path;
-}
-
-}  // namespace
-
-RegistryOverrideManager::ScopedRegistryKeyOverride::ScopedRegistryKeyOverride(
-    HKEY override,
-    const base::string16& key_path)
-    : override_(override), key_path_(key_path) {}
-
-RegistryOverrideManager::
-    ScopedRegistryKeyOverride::~ScopedRegistryKeyOverride() {
-  ::RegOverridePredefKey(override_, NULL);
-  base::win::RegKey(HKEY_CURRENT_USER, L"", KEY_QUERY_VALUE)
-      .DeleteKey(key_path_.c_str());
-}
-
-RegistryOverrideManager::RegistryOverrideManager()
-    : timestamp_(base::Time::Now()), test_key_root_(kTempTestKeyPath) {
-  DeleteStaleTestKeys(timestamp_, test_key_root_);
-}
-
-RegistryOverrideManager::RegistryOverrideManager(
-    const base::Time& timestamp,
-    const base::string16& test_key_root)
-    : timestamp_(timestamp), test_key_root_(test_key_root) {
-  DeleteStaleTestKeys(timestamp_, test_key_root_);
-}
-
-RegistryOverrideManager::~RegistryOverrideManager() {}
-
-void RegistryOverrideManager::OverrideRegistry(HKEY override) {
-  OverrideRegistry(override, nullptr);
-}
-
-void RegistryOverrideManager::OverrideRegistry(HKEY override,
-                                               base::string16* override_path) {
-  base::string16 key_path = GenerateTempKeyPath(test_key_root_, timestamp_);
-
-  base::win::RegKey temp_key;
-  ASSERT_EQ(ERROR_SUCCESS, temp_key.Create(HKEY_CURRENT_USER, key_path.c_str(),
-                                           KEY_ALL_ACCESS));
-  ASSERT_EQ(ERROR_SUCCESS, ::RegOverridePredefKey(override, temp_key.Handle()));
-
-  overrides_.push_back(
-      std::make_unique<ScopedRegistryKeyOverride>(override, key_path));
-  if (override_path)
-    override_path->assign(key_path);
-}
-
-base::string16 GenerateTempKeyPath() {
-  return GenerateTempKeyPath(base::string16(kTempTestKeyPath),
-                             base::Time::Now());
-}
-
-}  // namespace registry_util
diff --git a/base/test/test_reg_util_win.h b/base/test/test_reg_util_win.h
deleted file mode 100644
index d74028a..0000000
--- a/base/test/test_reg_util_win.h
+++ /dev/null
@@ -1,82 +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.
-
-#ifndef BASE_TEST_TEST_REG_UTIL_WIN_H_
-#define BASE_TEST_TEST_REG_UTIL_WIN_H_
-
-// Registry utility functions used only by tests.
-#include <memory>
-#include <vector>
-
-#include "base/macros.h"
-#include "base/strings/string16.h"
-#include "base/time/time.h"
-#include "base/win/registry.h"
-
-namespace registry_util {
-
-// Allows a test to easily override registry hives so that it can start from a
-// known good state, or make sure to not leave any side effects once the test
-// completes. This supports parallel tests. All the overrides are scoped to the
-// lifetime of the override manager. Destroy the manager to undo the overrides.
-//
-// Overridden hives use keys stored at, for instance:
-//   HKCU\Software\Chromium\TempTestKeys\
-//       13028145911617809$02AB211C-CF73-478D-8D91-618E11998AED
-// The key path are comprises of:
-//   - The test key root, HKCU\Software\Chromium\TempTestKeys\
-//   - The base::Time::ToInternalValue of the creation time. This is used to
-//     delete stale keys left over from crashed tests.
-//   - A GUID used for preventing name collisions (although unlikely) between
-//     two RegistryOverrideManagers created with the same timestamp.
-class RegistryOverrideManager {
- public:
-  RegistryOverrideManager();
-  ~RegistryOverrideManager();
-
-  // Override the given registry hive using a randomly generated temporary key.
-  // Multiple overrides to the same hive are not supported and lead to undefined
-  // behavior.
-  // Optional return of the registry override path.
-  // Calls to these functions must be wrapped in ASSERT_NO_FATAL_FAILURE to
-  // ensure that tests do not proceeed in case of failure to override.
-  void OverrideRegistry(HKEY override);
-  void OverrideRegistry(HKEY override, base::string16* override_path);
-
- private:
-  friend class RegistryOverrideManagerTest;
-
-  // Keeps track of one override.
-  class ScopedRegistryKeyOverride {
-   public:
-    ScopedRegistryKeyOverride(HKEY override, const base::string16& key_path);
-    ~ScopedRegistryKeyOverride();
-
-   private:
-    HKEY override_;
-    base::string16 key_path_;
-
-    DISALLOW_COPY_AND_ASSIGN(ScopedRegistryKeyOverride);
-  };
-
-  // Used for testing only.
-  RegistryOverrideManager(const base::Time& timestamp,
-                          const base::string16& test_key_root);
-
-  base::Time timestamp_;
-  base::string16 guid_;
-
-  base::string16 test_key_root_;
-  std::vector<std::unique_ptr<ScopedRegistryKeyOverride>> overrides_;
-
-  DISALLOW_COPY_AND_ASSIGN(RegistryOverrideManager);
-};
-
-// Generates a temporary key path that will be eventually deleted
-// automatically if the process crashes.
-base::string16 GenerateTempKeyPath();
-
-}  // namespace registry_util
-
-#endif  // BASE_TEST_TEST_REG_UTIL_WIN_H_
diff --git a/base/test/test_shared_library.cc b/base/test/test_shared_library.cc
deleted file mode 100644
index 99c0467..0000000
--- a/base/test/test_shared_library.cc
+++ /dev/null
@@ -1,30 +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/test/native_library_test_utils.h"
-
-extern "C" {
-
-int NATIVE_LIBRARY_TEST_ALWAYS_EXPORT GetExportedValue() {
-  return g_native_library_exported_value;
-}
-
-void NATIVE_LIBRARY_TEST_ALWAYS_EXPORT SetExportedValue(int value) {
-  g_native_library_exported_value = value;
-}
-
-// A test function used only to verify basic dynamic symbol resolution.
-int NATIVE_LIBRARY_TEST_ALWAYS_EXPORT GetSimpleTestValue() {
-  return 5;
-}
-
-// When called by |NativeLibraryTest.LoadLibraryPreferOwnSymbols|, this should
-// forward to the local definition of NativeLibraryTestIncrement(), even though
-// the test module also links in the native_library_test_utils source library
-// which exports it.
-int NATIVE_LIBRARY_TEST_ALWAYS_EXPORT GetIncrementValue() {
-  return NativeLibraryTestIncrement();
-}
-
-}  // extern "C"
diff --git a/base/test/test_shared_memory_util.cc b/base/test/test_shared_memory_util.cc
deleted file mode 100644
index 5cde5b1..0000000
--- a/base/test/test_shared_memory_util.cc
+++ /dev/null
@@ -1,187 +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_shared_memory_util.h"
-
-#include <gtest/gtest.h>
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "base/logging.h"
-#include "build_config.h"
-
-#if defined(OS_POSIX) && !defined(OS_NACL)
-#include <errno.h>
-#include <string.h>
-#include <sys/mman.h>
-#include <unistd.h>
-#endif
-
-#if defined(OS_FUCHSIA)
-#include <zircon/process.h>
-#include <zircon/rights.h>
-#include <zircon/syscalls.h>
-#endif
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-#include <mach/mach_vm.h>
-#endif
-
-#if defined(OS_WIN)
-#include <aclapi.h>
-#endif
-
-namespace base {
-
-#if !defined(OS_NACL)
-
-static const size_t kDataSize = 1024;
-
-// Common routine used with Posix file descriptors. Check that shared memory
-// file descriptor |fd| does not allow writable mappings. Return true on
-// success, false otherwise.
-#if defined(OS_POSIX) && !defined(OS_FUCHSIA)
-static bool CheckReadOnlySharedMemoryFdPosix(int fd) {
-// Note that the error on Android is EPERM, unlike other platforms where
-// it will be EACCES.
-#if defined(OS_ANDROID)
-  const int kExpectedErrno = EPERM;
-#else
-  const int kExpectedErrno = EACCES;
-#endif
-  errno = 0;
-  void* address =
-      mmap(nullptr, kDataSize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-  const bool success = (address != nullptr) && (address != MAP_FAILED);
-  if (success) {
-    LOG(ERROR) << "mmap() should have failed!";
-    munmap(address, kDataSize);  // Cleanup.
-    return false;
-  }
-  if (errno != kExpectedErrno) {
-    LOG(ERROR) << "Expected mmap() to return " << kExpectedErrno
-               << " but returned " << errno << ": " << strerror(errno) << "\n";
-    return false;
-  }
-  return true;
-}
-#endif  // OS_POSIX && !OS_FUCHSIA
-
-#if defined(OS_FUCHSIA)
-// Fuchsia specific implementation.
-bool CheckReadOnlySharedMemoryFuchsiaHandle(zx_handle_t handle) {
-  const uint32_t flags = ZX_VM_FLAG_PERM_READ | ZX_VM_FLAG_PERM_WRITE;
-  uintptr_t addr;
-  const zx_handle_t root = zx_vmar_root_self();
-  const zx_status_t status =
-      zx_vmar_map(root, 0, handle, 0U, kDataSize, flags, &addr);
-  if (status == ZX_OK) {
-    LOG(ERROR) << "zx_vmar_map() should have failed!";
-    zx_vmar_unmap(root, addr, kDataSize);
-    return false;
-  }
-  if (status != ZX_ERR_ACCESS_DENIED) {
-    LOG(ERROR) << "Expected zx_vmar_map() to return " << ZX_ERR_ACCESS_DENIED
-               << " (ZX_ERR_ACCESS_DENIED) but returned " << status << "\n";
-    return false;
-  }
-  return true;
-}
-
-#elif defined(OS_MACOSX) && !defined(OS_IOS)
-bool CheckReadOnlySharedMemoryMachPort(mach_port_t memory_object) {
-  mach_vm_address_t memory;
-  const kern_return_t kr = mach_vm_map(
-      mach_task_self(), &memory, kDataSize, 0, VM_FLAGS_ANYWHERE, memory_object,
-      0, FALSE, VM_PROT_READ | VM_PROT_WRITE,
-      VM_PROT_READ | VM_PROT_WRITE | VM_PROT_IS_MASK, VM_INHERIT_NONE);
-  if (kr == KERN_SUCCESS) {
-    LOG(ERROR) << "mach_vm_map() should have failed!";
-    mach_vm_deallocate(mach_task_self(), memory, kDataSize);  // Cleanup.
-    return false;
-  }
-  return true;
-}
-
-#elif defined(OS_WIN)
-bool CheckReadOnlySharedMemoryWindowsHandle(HANDLE handle) {
-  void* memory =
-      MapViewOfFile(handle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, kDataSize);
-  if (memory != nullptr) {
-    LOG(ERROR) << "MapViewOfFile() should have failed!";
-    UnmapViewOfFile(memory);
-    return false;
-  }
-  return true;
-}
-#endif
-
-bool CheckReadOnlySharedMemoryHandleForTesting(SharedMemoryHandle handle) {
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  // For OSX, the code has to deal with both POSIX and MACH handles.
-  if (handle.type_ == SharedMemoryHandle::POSIX)
-    return CheckReadOnlySharedMemoryFdPosix(handle.file_descriptor_.fd);
-  else
-    return CheckReadOnlySharedMemoryMachPort(handle.memory_object_);
-#elif defined(OS_FUCHSIA)
-  return CheckReadOnlySharedMemoryFuchsiaHandle(handle.GetHandle());
-#elif defined(OS_WIN)
-  return CheckReadOnlySharedMemoryWindowsHandle(handle.GetHandle());
-#else
-  return CheckReadOnlySharedMemoryFdPosix(handle.GetHandle());
-#endif
-}
-
-bool CheckReadOnlyPlatformSharedMemoryRegionForTesting(
-    subtle::PlatformSharedMemoryRegion region) {
-  if (region.GetMode() != subtle::PlatformSharedMemoryRegion::Mode::kReadOnly) {
-    LOG(ERROR) << "Expected region mode is "
-               << static_cast<int>(
-                      subtle::PlatformSharedMemoryRegion::Mode::kReadOnly)
-               << " but actual is " << static_cast<int>(region.GetMode());
-    return false;
-  }
-
-#if defined(OS_MACOSX) && !defined(OS_IOS)
-  return CheckReadOnlySharedMemoryMachPort(region.GetPlatformHandle());
-#elif defined(OS_FUCHSIA)
-  return CheckReadOnlySharedMemoryFuchsiaHandle(region.GetPlatformHandle());
-#elif defined(OS_WIN)
-  return CheckReadOnlySharedMemoryWindowsHandle(region.GetPlatformHandle());
-#elif defined(OS_ANDROID)
-  return CheckReadOnlySharedMemoryFdPosix(region.GetPlatformHandle());
-#else
-  return CheckReadOnlySharedMemoryFdPosix(region.GetPlatformHandle().fd);
-#endif
-}
-
-#endif  // !OS_NACL
-
-WritableSharedMemoryMapping MapForTesting(
-    subtle::PlatformSharedMemoryRegion* region) {
-  return MapAtForTesting(region, 0, region->GetSize());
-}
-
-WritableSharedMemoryMapping MapAtForTesting(
-    subtle::PlatformSharedMemoryRegion* region,
-    off_t offset,
-    size_t size) {
-  void* memory = nullptr;
-  size_t mapped_size = 0;
-  if (!region->MapAt(offset, size, &memory, &mapped_size))
-    return {};
-
-  return WritableSharedMemoryMapping(memory, size, mapped_size,
-                                     region->GetGUID());
-}
-
-template <>
-std::pair<ReadOnlySharedMemoryRegion, WritableSharedMemoryMapping>
-CreateMappedRegion(size_t size) {
-  MappedReadOnlyRegion mapped_region = ReadOnlySharedMemoryRegion::Create(size);
-  return {std::move(mapped_region.region), std::move(mapped_region.mapping)};
-}
-
-}  // namespace base
diff --git a/base/test/test_shared_memory_util.h b/base/test/test_shared_memory_util.h
deleted file mode 100644
index d89f11d..0000000
--- a/base/test/test_shared_memory_util.h
+++ /dev/null
@@ -1,56 +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.
-
-#ifndef BASE_TEST_TEST_SHARED_MEMORY_UTIL_H_
-#define BASE_TEST_TEST_SHARED_MEMORY_UTIL_H_
-
-#include "base/memory/platform_shared_memory_region.h"
-#include "base/memory/read_only_shared_memory_region.h"
-#include "base/memory/shared_memory_handle.h"
-#include "base/memory/shared_memory_mapping.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-// Check that the shared memory |handle| cannot be used to perform
-// a writable mapping with low-level system APIs like mmap(). Return true
-// in case of success (i.e. writable mappings are _not_ allowed), or false
-// otherwise.
-bool CheckReadOnlySharedMemoryHandleForTesting(SharedMemoryHandle handle);
-
-bool CheckReadOnlyPlatformSharedMemoryRegionForTesting(
-    subtle::PlatformSharedMemoryRegion region);
-
-// Creates a scoped mapping from a PlatformSharedMemoryRegion. It's useful for
-// PlatformSharedMemoryRegion testing to not leak mapped memory.
-// WritableSharedMemoryMapping is used for wrapping because it has max
-// capabilities but the actual permission depends on the |region|'s mode.
-// This must not be used in production where PlatformSharedMemoryRegion should
-// be wrapped with {Writable,Unsafe,ReadOnly}SharedMemoryRegion.
-WritableSharedMemoryMapping MapAtForTesting(
-    subtle::PlatformSharedMemoryRegion* region,
-    off_t offset,
-    size_t size);
-
-WritableSharedMemoryMapping MapForTesting(
-    subtle::PlatformSharedMemoryRegion* region);
-
-template <typename SharedMemoryRegionType>
-std::pair<SharedMemoryRegionType, WritableSharedMemoryMapping>
-CreateMappedRegion(size_t size) {
-  SharedMemoryRegionType region = SharedMemoryRegionType::Create(size);
-  WritableSharedMemoryMapping mapping = region.Map();
-  return {std::move(region), std::move(mapping)};
-}
-
-// Template specialization of CreateMappedRegion<>() for
-// the ReadOnlySharedMemoryRegion. We need this because
-// ReadOnlySharedMemoryRegion::Create() has a different return type.
-template <>
-std::pair<ReadOnlySharedMemoryRegion, WritableSharedMemoryMapping>
-CreateMappedRegion(size_t size);
-
-}  // namespace base
-
-#endif  // BASE_TEST_TEST_SHARED_MEMORY_UTIL_H_
diff --git a/base/test/test_shortcut_win.cc b/base/test/test_shortcut_win.cc
deleted file mode 100644
index 70cb35b..0000000
--- a/base/test/test_shortcut_win.cc
+++ /dev/null
@@ -1,156 +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_shortcut_win.h"
-
-#include <windows.h>
-#include <objbase.h>
-#include <shlobj.h>
-#include <propkey.h>
-#include <wrl/client.h>
-
-#include "base/files/file_path.h"
-#include "base/strings/string16.h"
-#include "base/strings/utf_string_conversions.h"
-#include "base/win/scoped_propvariant.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-namespace win {
-
-void ValidatePathsAreEqual(const base::FilePath& expected_path,
-                           const base::FilePath& actual_path) {
-  wchar_t long_expected_path_chars[MAX_PATH] = {0};
-  wchar_t long_actual_path_chars[MAX_PATH] = {0};
-
-  // If |expected_path| is empty confirm immediately that |actual_path| is also
-  // empty.
-  if (expected_path.empty()) {
-    EXPECT_TRUE(actual_path.empty());
-    return;
-  }
-
-  // Proceed with LongPathName matching which will also confirm the paths exist.
-  EXPECT_NE(0U, ::GetLongPathName(
-      expected_path.value().c_str(), long_expected_path_chars, MAX_PATH))
-          << "Failed to get LongPathName of " << expected_path.value();
-  EXPECT_NE(0U, ::GetLongPathName(
-      actual_path.value().c_str(), long_actual_path_chars, MAX_PATH))
-          << "Failed to get LongPathName of " << actual_path.value();
-
-  base::FilePath long_expected_path(long_expected_path_chars);
-  base::FilePath long_actual_path(long_actual_path_chars);
-  EXPECT_FALSE(long_expected_path.empty());
-  EXPECT_FALSE(long_actual_path.empty());
-
-  EXPECT_EQ(long_expected_path, long_actual_path);
-}
-
-void ValidateShortcut(const base::FilePath& shortcut_path,
-                      const ShortcutProperties& properties) {
-  Microsoft::WRL::ComPtr<IShellLink> i_shell_link;
-  Microsoft::WRL::ComPtr<IPersistFile> i_persist_file;
-
-  wchar_t read_target[MAX_PATH] = {0};
-  wchar_t read_working_dir[MAX_PATH] = {0};
-  wchar_t read_arguments[MAX_PATH] = {0};
-  wchar_t read_description[MAX_PATH] = {0};
-  wchar_t read_icon[MAX_PATH] = {0};
-  int read_icon_index = 0;
-
-  HRESULT hr;
-
-  // Initialize the shell interfaces.
-  EXPECT_TRUE(SUCCEEDED(hr = ::CoCreateInstance(CLSID_ShellLink, NULL,
-                                                CLSCTX_INPROC_SERVER,
-                                                IID_PPV_ARGS(&i_shell_link))));
-  if (FAILED(hr))
-    return;
-
-  EXPECT_TRUE(
-      SUCCEEDED(hr = i_shell_link.CopyTo(i_persist_file.GetAddressOf())));
-  if (FAILED(hr))
-    return;
-
-  // Load the shortcut.
-  EXPECT_TRUE(SUCCEEDED(hr = i_persist_file->Load(
-      shortcut_path.value().c_str(), 0))) << "Failed to load shortcut at "
-                                          << shortcut_path.value();
-  if (FAILED(hr))
-    return;
-
-  if (properties.options & ShortcutProperties::PROPERTIES_TARGET) {
-    EXPECT_TRUE(SUCCEEDED(
-        i_shell_link->GetPath(read_target, MAX_PATH, NULL, SLGP_SHORTPATH)));
-    ValidatePathsAreEqual(properties.target, base::FilePath(read_target));
-  }
-
-  if (properties.options & ShortcutProperties::PROPERTIES_WORKING_DIR) {
-    EXPECT_TRUE(SUCCEEDED(
-        i_shell_link->GetWorkingDirectory(read_working_dir, MAX_PATH)));
-    ValidatePathsAreEqual(properties.working_dir,
-                          base::FilePath(read_working_dir));
-  }
-
-  if (properties.options & ShortcutProperties::PROPERTIES_ARGUMENTS) {
-    EXPECT_TRUE(SUCCEEDED(
-        i_shell_link->GetArguments(read_arguments, MAX_PATH)));
-    EXPECT_EQ(properties.arguments, read_arguments);
-  }
-
-  if (properties.options & ShortcutProperties::PROPERTIES_DESCRIPTION) {
-    EXPECT_TRUE(SUCCEEDED(
-        i_shell_link->GetDescription(read_description, MAX_PATH)));
-    EXPECT_EQ(properties.description, read_description);
-  }
-
-  if (properties.options & ShortcutProperties::PROPERTIES_ICON) {
-    EXPECT_TRUE(SUCCEEDED(
-        i_shell_link->GetIconLocation(read_icon, MAX_PATH, &read_icon_index)));
-    ValidatePathsAreEqual(properties.icon, base::FilePath(read_icon));
-    EXPECT_EQ(properties.icon_index, read_icon_index);
-  }
-
-  Microsoft::WRL::ComPtr<IPropertyStore> property_store;
-  EXPECT_TRUE(
-      SUCCEEDED(hr = i_shell_link.CopyTo(property_store.GetAddressOf())));
-  if (FAILED(hr))
-    return;
-
-  if (properties.options & ShortcutProperties::PROPERTIES_APP_ID) {
-    ScopedPropVariant pv_app_id;
-    EXPECT_EQ(S_OK, property_store->GetValue(PKEY_AppUserModel_ID,
-                                             pv_app_id.Receive()));
-    switch (pv_app_id.get().vt) {
-      case VT_EMPTY:
-        EXPECT_TRUE(properties.app_id.empty());
-        break;
-      case VT_LPWSTR:
-        EXPECT_EQ(properties.app_id, pv_app_id.get().pwszVal);
-        break;
-      default:
-        ADD_FAILURE() << "Unexpected variant type: " << pv_app_id.get().vt;
-    }
-  }
-
-  if (properties.options & ShortcutProperties::PROPERTIES_DUAL_MODE) {
-    ScopedPropVariant pv_dual_mode;
-    EXPECT_EQ(S_OK, property_store->GetValue(PKEY_AppUserModel_IsDualMode,
-                                             pv_dual_mode.Receive()));
-    switch (pv_dual_mode.get().vt) {
-      case VT_EMPTY:
-        EXPECT_FALSE(properties.dual_mode);
-        break;
-      case VT_BOOL:
-        EXPECT_EQ(properties.dual_mode,
-                  static_cast<bool>(pv_dual_mode.get().boolVal));
-        break;
-      default:
-        ADD_FAILURE() << "Unexpected variant type: " << pv_dual_mode.get().vt;
-    }
-  }
-}
-
-}  // namespace win
-}  // namespace base
diff --git a/base/test/test_shortcut_win.h b/base/test/test_shortcut_win.h
deleted file mode 100644
index b828e8b..0000000
--- a/base/test/test_shortcut_win.h
+++ /dev/null
@@ -1,30 +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.
-
-#ifndef BASE_TEST_TEST_SHORTCUT_WIN_H_
-#define BASE_TEST_TEST_SHORTCUT_WIN_H_
-
-#include "base/files/file_path.h"
-#include "base/win/shortcut.h"
-
-// Windows shortcut functions used only by tests.
-
-namespace base {
-namespace win {
-
-// Validates |actual_path|'s LongPathName case-insensitively matches
-// |expected_path|'s LongPathName.
-void ValidatePathsAreEqual(const base::FilePath& expected_path,
-                           const base::FilePath& actual_path);
-
-// Validates that a shortcut exists at |shortcut_path| with the expected
-// |properties|.
-// Logs gtest failures on failed verifications.
-void ValidateShortcut(const FilePath& shortcut_path,
-                      const ShortcutProperties& properties);
-
-}  // namespace win
-}  // namespace base
-
-#endif  // BASE_TEST_TEST_SHORTCUT_WIN_H_
diff --git a/base/test/test_simple_task_runner.cc b/base/test/test_simple_task_runner.cc
deleted file mode 100644
index 91c6861..0000000
--- a/base/test/test_simple_task_runner.cc
+++ /dev/null
@@ -1,103 +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_simple_task_runner.h"
-
-#include <utility>
-
-#include "base/logging.h"
-#include "base/memory/ptr_util.h"
-#include "base/threading/thread_task_runner_handle.h"
-
-namespace base {
-
-TestSimpleTaskRunner::TestSimpleTaskRunner() = default;
-
-TestSimpleTaskRunner::~TestSimpleTaskRunner() = default;
-
-bool TestSimpleTaskRunner::PostDelayedTask(const Location& from_here,
-                                           OnceClosure task,
-                                           TimeDelta delay) {
-  AutoLock auto_lock(lock_);
-  pending_tasks_.push_back(TestPendingTask(from_here, std::move(task),
-                                           TimeTicks(), delay,
-                                           TestPendingTask::NESTABLE));
-  return true;
-}
-
-bool TestSimpleTaskRunner::PostNonNestableDelayedTask(const Location& from_here,
-                                                      OnceClosure task,
-                                                      TimeDelta delay) {
-  AutoLock auto_lock(lock_);
-  pending_tasks_.push_back(TestPendingTask(from_here, std::move(task),
-                                           TimeTicks(), delay,
-                                           TestPendingTask::NON_NESTABLE));
-  return true;
-}
-
-// TODO(gab): Use SequenceToken here to differentiate between tasks running in
-// the scope of this TestSimpleTaskRunner and other task runners sharing this
-// thread. http://crbug.com/631186
-bool TestSimpleTaskRunner::RunsTasksInCurrentSequence() const {
-  return thread_ref_ == PlatformThread::CurrentRef();
-}
-
-base::circular_deque<TestPendingTask> TestSimpleTaskRunner::TakePendingTasks() {
-  AutoLock auto_lock(lock_);
-  return std::move(pending_tasks_);
-}
-
-size_t TestSimpleTaskRunner::NumPendingTasks() const {
-  AutoLock auto_lock(lock_);
-  return pending_tasks_.size();
-}
-
-bool TestSimpleTaskRunner::HasPendingTask() const {
-  AutoLock auto_lock(lock_);
-  return !pending_tasks_.empty();
-}
-
-base::TimeDelta TestSimpleTaskRunner::NextPendingTaskDelay() const {
-  AutoLock auto_lock(lock_);
-  return pending_tasks_.front().GetTimeToRun() - base::TimeTicks();
-}
-
-base::TimeDelta TestSimpleTaskRunner::FinalPendingTaskDelay() const {
-  AutoLock auto_lock(lock_);
-  return pending_tasks_.back().GetTimeToRun() - base::TimeTicks();
-}
-
-void TestSimpleTaskRunner::ClearPendingTasks() {
-  AutoLock auto_lock(lock_);
-  pending_tasks_.clear();
-}
-
-void TestSimpleTaskRunner::RunPendingTasks() {
-  DCHECK(RunsTasksInCurrentSequence());
-
-  // Swap with a local variable to avoid re-entrancy problems.
-  base::circular_deque<TestPendingTask> tasks_to_run;
-  {
-    AutoLock auto_lock(lock_);
-    tasks_to_run.swap(pending_tasks_);
-  }
-
-  // Multiple test task runners can share the same thread for determinism in
-  // unit tests. Make sure this TestSimpleTaskRunner's tasks run in its scope.
-  ScopedClosureRunner undo_override;
-  if (!ThreadTaskRunnerHandle::IsSet() ||
-      ThreadTaskRunnerHandle::Get() != this) {
-    undo_override = ThreadTaskRunnerHandle::OverrideForTesting(this);
-  }
-
-  for (auto& task : tasks_to_run)
-    std::move(task.task).Run();
-}
-
-void TestSimpleTaskRunner::RunUntilIdle() {
-  while (HasPendingTask())
-    RunPendingTasks();
-}
-
-}  // namespace base
diff --git a/base/test/test_simple_task_runner.h b/base/test/test_simple_task_runner.h
deleted file mode 100644
index bff8ee5..0000000
--- a/base/test/test_simple_task_runner.h
+++ /dev/null
@@ -1,89 +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.
-
-#ifndef BASE_TEST_TEST_SIMPLE_TASK_RUNNER_H_
-#define BASE_TEST_TEST_SIMPLE_TASK_RUNNER_H_
-
-#include "base/callback.h"
-#include "base/compiler_specific.h"
-#include "base/containers/circular_deque.h"
-#include "base/macros.h"
-#include "base/single_thread_task_runner.h"
-#include "base/synchronization/lock.h"
-#include "base/test/test_pending_task.h"
-#include "base/threading/platform_thread.h"
-
-namespace base {
-
-class TimeDelta;
-
-// TestSimpleTaskRunner is a simple TaskRunner implementation that can
-// be used for testing.  It implements SingleThreadTaskRunner as that
-// interface implements SequencedTaskRunner, which in turn implements
-// TaskRunner, so TestSimpleTaskRunner can be passed in to a function
-// that accepts any *TaskRunner object.
-//
-// TestSimpleTaskRunner has the following properties which make it simple:
-//
-//   - Tasks are simply stored in a queue in FIFO order, ignoring delay
-//     and nestability.
-//   - Tasks aren't guaranteed to be destroyed immediately after
-//     they're run.
-//
-// However, TestSimpleTaskRunner allows for reentrancy, in that it
-// handles the running of tasks that in turn call back into itself
-// (e.g., to post more tasks).
-//
-// Note that, like any TaskRunner, TestSimpleTaskRunner is
-// ref-counted.
-class TestSimpleTaskRunner : public SingleThreadTaskRunner {
- public:
-  TestSimpleTaskRunner();
-
-  // SingleThreadTaskRunner implementation.
-  bool PostDelayedTask(const Location& from_here,
-                       OnceClosure task,
-                       TimeDelta delay) override;
-  bool PostNonNestableDelayedTask(const Location& from_here,
-                                  OnceClosure task,
-                                  TimeDelta delay) override;
-
-  bool RunsTasksInCurrentSequence() const override;
-
-  base::circular_deque<TestPendingTask> TakePendingTasks();
-  size_t NumPendingTasks() const;
-  bool HasPendingTask() const;
-  base::TimeDelta NextPendingTaskDelay() const;
-  base::TimeDelta FinalPendingTaskDelay() const;
-
-  // Clears the queue of pending tasks without running them.
-  void ClearPendingTasks();
-
-  // Runs each current pending task in order and clears the queue. Tasks posted
-  // by the tasks that run within this call do not run within this call. Can
-  // only be called on the thread that created this TestSimpleTaskRunner.
-  void RunPendingTasks();
-
-  // Runs pending tasks until the queue is empty. Can only be called on the
-  // thread that created this TestSimpleTaskRunner.
-  void RunUntilIdle();
-
- protected:
-  ~TestSimpleTaskRunner() override;
-
- private:
-  // Thread on which this was instantiated.
-  const PlatformThreadRef thread_ref_ = PlatformThread::CurrentRef();
-
-  // Synchronizes access to |pending_tasks_|.
-  mutable Lock lock_;
-
-  base::circular_deque<TestPendingTask> pending_tasks_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSimpleTaskRunner);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_TEST_SIMPLE_TASK_RUNNER_H_
diff --git a/base/test/test_suite.cc b/base/test/test_suite.cc
deleted file mode 100644
index 3bbb983..0000000
--- a/base/test/test_suite.cc
+++ /dev/null
@@ -1,484 +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_suite.h"
-
-#include <signal.h>
-
-#include <memory>
-
-#include "base/at_exit.h"
-#include "base/base_paths.h"
-#include "base/base_switches.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/debug/debugger.h"
-#include "base/debug/profiler.h"
-#include "base/debug/stack_trace.h"
-#include "base/feature_list.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/i18n/icu_util.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/path_service.h"
-#include "base/process/launch.h"
-#include "base/process/memory.h"
-#include "base/test/gtest_xml_unittest_result_printer.h"
-#include "base/test/gtest_xml_util.h"
-#include "base/test/icu_test_util.h"
-#include "base/test/launcher/unit_test_launcher.h"
-#include "base/test/multiprocess_test.h"
-#include "base/test/test_switches.h"
-#include "base/test/test_timeouts.h"
-#include "base/time/time.h"
-#include "build_config.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "testing/multiprocess_func_list.h"
-
-#if defined(OS_MACOSX)
-#include "base/mac/scoped_nsautorelease_pool.h"
-#if defined(OS_IOS)
-#include "base/test/test_listener_ios.h"
-#endif  // OS_IOS
-#endif  // OS_MACOSX
-
-#if !defined(OS_WIN)
-#include "base/i18n/rtl.h"
-#if !defined(OS_IOS)
-#include "base/strings/string_util.h"
-#include "third_party/icu/source/common/unicode/uloc.h"
-#endif
-#endif
-
-#if defined(OS_ANDROID)
-#include "base/test/test_support_android.h"
-#endif
-
-#if defined(OS_IOS)
-#include "base/test/test_support_ios.h"
-#endif
-
-#if defined(OS_LINUX)
-#include "base/test/fontconfig_util_linux.h"
-#endif
-
-namespace base {
-
-namespace {
-
-class MaybeTestDisabler : public testing::EmptyTestEventListener {
- public:
-  void OnTestStart(const testing::TestInfo& test_info) override {
-    ASSERT_FALSE(TestSuite::IsMarkedMaybe(test_info))
-        << "Probably the OS #ifdefs don't include all of the necessary "
-           "platforms.\nPlease ensure that no tests have the MAYBE_ prefix "
-           "after the code is preprocessed.";
-  }
-};
-
-class TestClientInitializer : public testing::EmptyTestEventListener {
- public:
-  TestClientInitializer()
-      : old_command_line_(CommandLine::NO_PROGRAM) {
-  }
-
-  void OnTestStart(const testing::TestInfo& test_info) override {
-    old_command_line_ = *CommandLine::ForCurrentProcess();
-  }
-
-  void OnTestEnd(const testing::TestInfo& test_info) override {
-    *CommandLine::ForCurrentProcess() = old_command_line_;
-  }
-
- private:
-  CommandLine old_command_line_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestClientInitializer);
-};
-
-std::string GetProfileName() {
-  static const char kDefaultProfileName[] = "test-profile-{pid}";
-  CR_DEFINE_STATIC_LOCAL(std::string, profile_name, ());
-  if (profile_name.empty()) {
-    const base::CommandLine& command_line =
-        *base::CommandLine::ForCurrentProcess();
-    if (command_line.HasSwitch(switches::kProfilingFile))
-      profile_name = command_line.GetSwitchValueASCII(switches::kProfilingFile);
-    else
-      profile_name = std::string(kDefaultProfileName);
-  }
-  return profile_name;
-}
-
-void InitializeLogging() {
-#if defined(OS_ANDROID)
-  InitAndroidTestLogging();
-#else
-  FilePath exe;
-  PathService::Get(FILE_EXE, &exe);
-  FilePath log_filename = exe.ReplaceExtension(FILE_PATH_LITERAL("log"));
-  logging::LoggingSettings settings;
-  settings.logging_dest = logging::LOG_TO_ALL;
-  settings.log_file = log_filename.value().c_str();
-  settings.delete_old = logging::DELETE_OLD_LOG_FILE;
-  logging::InitLogging(settings);
-  // We want process and thread IDs because we may have multiple processes.
-  // Note: temporarily enabled timestamps in an effort to catch bug 6361.
-  logging::SetLogItems(true, true, true, true);
-#endif  // !defined(OS_ANDROID)
-}
-
-}  // namespace
-
-int RunUnitTestsUsingBaseTestSuite(int argc, char **argv) {
-  TestSuite test_suite(argc, argv);
-  return LaunchUnitTests(argc, argv,
-                         Bind(&TestSuite::Run, Unretained(&test_suite)));
-}
-
-TestSuite::TestSuite(int argc, char** argv) : initialized_command_line_(false) {
-  PreInitialize();
-  InitializeFromCommandLine(argc, argv);
-  // Logging must be initialized before any thread has a chance to call logging
-  // functions.
-  InitializeLogging();
-}
-
-#if defined(OS_WIN)
-TestSuite::TestSuite(int argc, wchar_t** argv)
-    : initialized_command_line_(false) {
-  PreInitialize();
-  InitializeFromCommandLine(argc, argv);
-  // Logging must be initialized before any thread has a chance to call logging
-  // functions.
-  InitializeLogging();
-}
-#endif  // defined(OS_WIN)
-
-TestSuite::~TestSuite() {
-  if (initialized_command_line_)
-    CommandLine::Reset();
-}
-
-void TestSuite::InitializeFromCommandLine(int argc, char** argv) {
-  initialized_command_line_ = CommandLine::Init(argc, argv);
-  testing::InitGoogleTest(&argc, argv);
-  testing::InitGoogleMock(&argc, argv);
-
-#if defined(OS_IOS)
-  InitIOSRunHook(this, argc, argv);
-#endif
-}
-
-#if defined(OS_WIN)
-void TestSuite::InitializeFromCommandLine(int argc, wchar_t** argv) {
-  // Windows CommandLine::Init ignores argv anyway.
-  initialized_command_line_ = CommandLine::Init(argc, NULL);
-  testing::InitGoogleTest(&argc, argv);
-  testing::InitGoogleMock(&argc, argv);
-}
-#endif  // defined(OS_WIN)
-
-void TestSuite::PreInitialize() {
-#if defined(OS_WIN)
-  testing::GTEST_FLAG(catch_exceptions) = false;
-#endif
-  EnableTerminationOnHeapCorruption();
-#if defined(OS_LINUX) && defined(USE_AURA)
-  // When calling native char conversion functions (e.g wrctomb) we need to
-  // have the locale set. In the absence of such a call the "C" locale is the
-  // default. In the gtk code (below) gtk_init() implicitly sets a locale.
-  setlocale(LC_ALL, "");
-#endif  // defined(OS_LINUX) && defined(USE_AURA)
-
-  // On Android, AtExitManager is created in
-  // testing/android/native_test_wrapper.cc before main() is called.
-#if !defined(OS_ANDROID)
-  at_exit_manager_.reset(new AtExitManager);
-#endif
-
-  // Don't add additional code to this function.  Instead add it to
-  // Initialize().  See bug 6436.
-}
-
-
-// static
-bool TestSuite::IsMarkedMaybe(const testing::TestInfo& test) {
-  return strncmp(test.name(), "MAYBE_", 6) == 0;
-}
-
-void TestSuite::CatchMaybeTests() {
-  testing::TestEventListeners& listeners =
-      testing::UnitTest::GetInstance()->listeners();
-  listeners.Append(new MaybeTestDisabler);
-}
-
-void TestSuite::ResetCommandLine() {
-  testing::TestEventListeners& listeners =
-      testing::UnitTest::GetInstance()->listeners();
-  listeners.Append(new TestClientInitializer);
-}
-
-void TestSuite::AddTestLauncherResultPrinter() {
-  // Only add the custom printer if requested.
-  if (!CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kTestLauncherOutput)) {
-    return;
-  }
-
-  FilePath output_path(CommandLine::ForCurrentProcess()->GetSwitchValuePath(
-      switches::kTestLauncherOutput));
-
-  // Do not add the result printer if output path already exists. It's an
-  // indicator there is a process printing to that file, and we're likely
-  // its child. Do not clobber the results in that case.
-  if (PathExists(output_path)) {
-    LOG(WARNING) << "Test launcher output path " << output_path.AsUTF8Unsafe()
-                 << " exists. Not adding test launcher result printer.";
-    return;
-  }
-
-  printer_ = new XmlUnitTestResultPrinter;
-  CHECK(printer_->Initialize(output_path));
-  testing::TestEventListeners& listeners =
-      testing::UnitTest::GetInstance()->listeners();
-  listeners.Append(printer_);
-}
-
-// Don't add additional code to this method.  Instead add it to
-// Initialize().  See bug 6436.
-int TestSuite::Run() {
-#if defined(OS_IOS)
-  RunTestsFromIOSApp();
-#endif
-
-#if defined(OS_MACOSX)
-  mac::ScopedNSAutoreleasePool scoped_pool;
-#endif
-
-  Initialize();
-  std::string client_func =
-      CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-          switches::kTestChildProcess);
-
-  // Check to see if we are being run as a client process.
-  if (!client_func.empty())
-    return multi_process_function_list::InvokeChildProcessTest(client_func);
-#if defined(OS_IOS)
-  test_listener_ios::RegisterTestEndListener();
-#endif
-
-  int result = RUN_ALL_TESTS();
-
-#if defined(OS_MACOSX)
-  // This MUST happen before Shutdown() since Shutdown() tears down
-  // objects (such as NotificationService::current()) that Cocoa
-  // objects use to remove themselves as observers.
-  scoped_pool.Recycle();
-#endif
-
-  Shutdown();
-
-  return result;
-}
-
-void TestSuite::UnitTestAssertHandler(const char* file,
-                                      int line,
-                                      const base::StringPiece summary,
-                                      const base::StringPiece stack_trace) {
-#if defined(OS_ANDROID)
-  // Correlating test stdio with logcat can be difficult, so we emit this
-  // helpful little hint about what was running.  Only do this for Android
-  // because other platforms don't separate out the relevant logs in the same
-  // way.
-  const ::testing::TestInfo* const test_info =
-      ::testing::UnitTest::GetInstance()->current_test_info();
-  if (test_info) {
-    LOG(ERROR) << "Currently running: " << test_info->test_case_name() << "."
-               << test_info->name();
-    fflush(stderr);
-  }
-#endif  // defined(OS_ANDROID)
-
-  // XmlUnitTestResultPrinter inherits gtest format, where assert has summary
-  // and message. In GTest, summary is just a logged text, and message is a
-  // logged text, concatenated with stack trace of assert.
-  // Concatenate summary and stack_trace here, to pass it as a message.
-  if (printer_) {
-    const std::string summary_str = summary.as_string();
-    const std::string stack_trace_str = summary_str + stack_trace.as_string();
-    printer_->OnAssert(file, line, summary_str, stack_trace_str);
-  }
-
-  // The logging system actually prints the message before calling the assert
-  // handler. Just exit now to avoid printing too many stack traces.
-  _exit(1);
-}
-
-#if defined(OS_WIN)
-namespace {
-
-// Disable optimizations to prevent function folding or other transformations
-// that will make the call stacks on failures more confusing.
-#pragma optimize("", off)
-// Handlers for invalid parameter, pure call, and abort. They generate a
-// breakpoint to ensure that we get a call stack on these failures.
-void InvalidParameter(const wchar_t* expression,
-                      const wchar_t* function,
-                      const wchar_t* file,
-                      unsigned int line,
-                      uintptr_t reserved) {
-  // CRT printed message is sufficient.
-  __debugbreak();
-  _exit(1);
-}
-
-void PureCall() {
-  fprintf(stderr, "Pure-virtual function call. Terminating.\n");
-  __debugbreak();
-  _exit(1);
-}
-
-void AbortHandler(int signal) {
-  // Print EOL after the CRT abort message.
-  fprintf(stderr, "\n");
-  __debugbreak();
-}
-#pragma optimize("", on)
-
-}  // namespace
-#endif
-
-void TestSuite::SuppressErrorDialogs() {
-#if defined(OS_WIN)
-  UINT new_flags = SEM_FAILCRITICALERRORS |
-                   SEM_NOGPFAULTERRORBOX |
-                   SEM_NOOPENFILEERRORBOX;
-
-  // Preserve existing error mode, as discussed at
-  // http://blogs.msdn.com/oldnewthing/archive/2004/07/27/198410.aspx
-  UINT existing_flags = SetErrorMode(new_flags);
-  SetErrorMode(existing_flags | new_flags);
-
-#if defined(_DEBUG)
-  // Suppress the "Debug Assertion Failed" dialog.
-  // TODO(hbono): remove this code when gtest has it.
-  // http://groups.google.com/d/topic/googletestframework/OjuwNlXy5ac/discussion
-  _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
-  _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
-  _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
-  _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);
-#endif  // defined(_DEBUG)
-
-  // See crbug.com/783040 for test code to trigger all of these failures.
-  _set_invalid_parameter_handler(InvalidParameter);
-  _set_purecall_handler(PureCall);
-  signal(SIGABRT, AbortHandler);
-#endif  // defined(OS_WIN)
-}
-
-void TestSuite::Initialize() {
-  const CommandLine* command_line = CommandLine::ForCurrentProcess();
-#if !defined(OS_IOS)
-  if (command_line->HasSwitch(switches::kWaitForDebugger)) {
-    debug::WaitForDebugger(60, true);
-  }
-#endif
-  // Set up a FeatureList instance, so that code using that API will not hit a
-  // an error that it's not set. It will be cleared automatically.
-  // TestFeatureForBrowserTest1 and TestFeatureForBrowserTest2 used in
-  // ContentBrowserTestScopedFeatureListTest to ensure ScopedFeatureList keeps
-  // features from command line.
-  std::string enabled =
-      command_line->GetSwitchValueASCII(switches::kEnableFeatures);
-  std::string disabled =
-      command_line->GetSwitchValueASCII(switches::kDisableFeatures);
-  enabled += ",TestFeatureForBrowserTest1";
-  disabled += ",TestFeatureForBrowserTest2";
-  scoped_feature_list_.InitFromCommandLine(enabled, disabled);
-
-  // The enable-features and disable-features flags were just slurped into a
-  // FeatureList, so remove them from the command line. Tests should enable and
-  // disable features via the ScopedFeatureList API rather than command-line
-  // flags.
-  CommandLine new_command_line(command_line->GetProgram());
-  CommandLine::SwitchMap switches = command_line->GetSwitches();
-
-  switches.erase(switches::kEnableFeatures);
-  switches.erase(switches::kDisableFeatures);
-
-  for (const auto& iter : switches)
-    new_command_line.AppendSwitchNative(iter.first, iter.second);
-
-  *CommandLine::ForCurrentProcess() = new_command_line;
-
-#if defined(OS_IOS)
-  InitIOSTestMessageLoop();
-#endif  // OS_IOS
-
-#if defined(OS_ANDROID)
-  InitAndroidTestMessageLoop();
-#endif  // else defined(OS_ANDROID)
-
-  CHECK(debug::EnableInProcessStackDumping());
-#if defined(OS_WIN)
-  RouteStdioToConsole(true);
-  // Make sure we run with high resolution timer to minimize differences
-  // between production code and test code.
-  Time::EnableHighResolutionTimer(true);
-#endif  // defined(OS_WIN)
-
-  // In some cases, we do not want to see standard error dialogs.
-  if (!debug::BeingDebugged() &&
-      !command_line->HasSwitch("show-error-dialogs")) {
-    SuppressErrorDialogs();
-    debug::SetSuppressDebugUI(true);
-    assert_handler_ = std::make_unique<logging::ScopedLogAssertHandler>(
-        base::Bind(&TestSuite::UnitTestAssertHandler, base::Unretained(this)));
-  }
-
-  base::test::InitializeICUForTesting();
-
-  // On the Mac OS X command line, the default locale is *_POSIX. In Chromium,
-  // the locale is set via an OS X locale API and is never *_POSIX.
-  // Some tests (such as those involving word break iterator) will behave
-  // differently and fail if we use *POSIX locale. Setting it to en_US here
-  // does not affect tests that explicitly overrides the locale for testing.
-  // This can be an issue on all platforms other than Windows.
-  // TODO(jshin): Should we set the locale via an OS X locale API here?
-#if !defined(OS_WIN)
-#if defined(OS_IOS)
-  i18n::SetICUDefaultLocale("en_US");
-#else
-  std::string default_locale(uloc_getDefault());
-  if (EndsWith(default_locale, "POSIX", CompareCase::INSENSITIVE_ASCII))
-    i18n::SetICUDefaultLocale("en_US");
-#endif
-#endif
-
-#if defined(OS_LINUX)
-  // TODO(thomasanderson): Call TearDownFontconfig() in Shutdown().  It would
-  // currently crash because of leaked FcFontSet's in font_fallback_linux.cc.
-  SetUpFontconfig();
-#endif
-
-  CatchMaybeTests();
-  ResetCommandLine();
-  AddTestLauncherResultPrinter();
-
-  TestTimeouts::Initialize();
-
-  trace_to_file_.BeginTracingFromCommandLineOptions();
-
-  base::debug::StartProfiling(GetProfileName());
-}
-
-void TestSuite::Shutdown() {
-  base::debug::StopProfiling();
-}
-
-}  // namespace base
diff --git a/base/test/test_suite.h b/base/test/test_suite.h
deleted file mode 100644
index 3547acf..0000000
--- a/base/test/test_suite.h
+++ /dev/null
@@ -1,103 +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.
-
-#ifndef BASE_TEST_TEST_SUITE_H_
-#define BASE_TEST_TEST_SUITE_H_
-
-// Defines a basic test suite framework for running gtest based tests.  You can
-// instantiate this class in your main function and call its Run method to run
-// any gtest based tests that are linked into your executable.
-
-#include <memory>
-#include <string>
-
-#include "base/at_exit.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/test/scoped_feature_list.h"
-#include "base/test/trace_to_file.h"
-#include "build_config.h"
-
-namespace testing {
-class TestInfo;
-}
-
-namespace base {
-
-class XmlUnitTestResultPrinter;
-
-// Instantiates TestSuite, runs it and returns exit code.
-int RunUnitTestsUsingBaseTestSuite(int argc, char **argv);
-
-class TestSuite {
- public:
-  // Match function used by the GetTestCount method.
-  typedef bool (*TestMatch)(const testing::TestInfo&);
-
-  TestSuite(int argc, char** argv);
-#if defined(OS_WIN)
-  TestSuite(int argc, wchar_t** argv);
-#endif  // defined(OS_WIN)
-  virtual ~TestSuite();
-
-  // Returns true if the test is marked as "MAYBE_".
-  // When using different prefixes depending on platform, we use MAYBE_ and
-  // preprocessor directives to replace MAYBE_ with the target prefix.
-  static bool IsMarkedMaybe(const testing::TestInfo& test);
-
-  void CatchMaybeTests();
-
-  void ResetCommandLine();
-
-  void AddTestLauncherResultPrinter();
-
-  int Run();
-
- protected:
-  // By default fatal log messages (e.g. from DCHECKs) result in error dialogs
-  // which gum up buildbots. Use a minimalistic assert handler which just
-  // terminates the process.
-  void UnitTestAssertHandler(const char* file,
-                             int line,
-                             const base::StringPiece summary,
-                             const base::StringPiece stack_trace);
-
-  // Disable crash dialogs so that it doesn't gum up the buildbot
-  virtual void SuppressErrorDialogs();
-
-  // Override these for custom initialization and shutdown handling.  Use these
-  // instead of putting complex code in your constructor/destructor.
-
-  virtual void Initialize();
-  virtual void Shutdown();
-
-  // Make sure that we setup an AtExitManager so Singleton objects will be
-  // destroyed.
-  std::unique_ptr<base::AtExitManager> at_exit_manager_;
-
- private:
-  void InitializeFromCommandLine(int argc, char** argv);
-#if defined(OS_WIN)
-  void InitializeFromCommandLine(int argc, wchar_t** argv);
-#endif  // defined(OS_WIN)
-
-  // Basic initialization for the test suite happens here.
-  void PreInitialize();
-
-  test::TraceToFile trace_to_file_;
-
-  bool initialized_command_line_;
-
-  test::ScopedFeatureList scoped_feature_list_;
-
-  XmlUnitTestResultPrinter* printer_ = nullptr;
-
-  std::unique_ptr<logging::ScopedLogAssertHandler> assert_handler_;
-
-  DISALLOW_COPY_AND_ASSIGN(TestSuite);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_TEST_SUITE_H_
diff --git a/base/test/test_switches.cc b/base/test/test_switches.cc
deleted file mode 100644
index a35bdd8..0000000
--- a/base/test/test_switches.cc
+++ /dev/null
@@ -1,81 +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_switches.h"
-
-// Maximum number of tests to run in a single batch.
-const char switches::kTestLauncherBatchLimit[] = "test-launcher-batch-limit";
-
-// Sets defaults desirable for the continuous integration bots, e.g. parallel
-// test execution and test retries.
-const char switches::kTestLauncherBotMode[] =
-    "test-launcher-bot-mode";
-
-// Makes it possible to debug the launcher itself. By default the launcher
-// automatically switches to single process mode when it detects presence
-// of debugger.
-const char switches::kTestLauncherDebugLauncher[] =
-    "test-launcher-debug-launcher";
-
-// Force running all requested tests and retries even if too many test errors
-// occur.
-const char switches::kTestLauncherForceRunBrokenTests[] =
-    "test-launcher-force-run-broken-tests";
-
-// Path to file containing test filter (one pattern per line).
-const char switches::kTestLauncherFilterFile[] = "test-launcher-filter-file";
-
-// Whether the test launcher should launch in "interactive mode", which disables
-// timeouts (and may have other effects for specific test types).
-const char switches::kTestLauncherInteractive[] = "test-launcher-interactive";
-
-// Number of parallel test launcher jobs.
-const char switches::kTestLauncherJobs[] = "test-launcher-jobs";
-
-// Path to list of compiled in tests.
-const char switches::kTestLauncherListTests[] = "test-launcher-list-tests";
-
-// Path to test results file in our custom test launcher format.
-const char switches::kTestLauncherOutput[] = "test-launcher-output";
-
-// Maximum number of times to retry a test after failure.
-const char switches::kTestLauncherRetryLimit[] = "test-launcher-retry-limit";
-
-// Path to test results file with all the info from the test launcher.
-const char switches::kTestLauncherSummaryOutput[] =
-    "test-launcher-summary-output";
-
-// Flag controlling when test stdio is displayed as part of the launcher's
-// standard output.
-const char switches::kTestLauncherPrintTestStdio[] =
-    "test-launcher-print-test-stdio";
-
-// Print a writable path and exit (for internal use).
-const char switches::kTestLauncherPrintWritablePath[] =
-    "test-launcher-print-writable-path";
-
-// Index of the test shard to run, starting from 0 (first shard) to total shards
-// minus one (last shard).
-const char switches::kTestLauncherShardIndex[] =
-    "test-launcher-shard-index";
-
-// Limit of test part results in the output. Default limit is 10.
-// Negative value will completely disable limit.
-const char switches::kTestLauncherTestPartResultsLimit[] =
-    "test-launcher-test-part-results-limit";
-
-// Total number of shards. Must be the same for all shards.
-const char switches::kTestLauncherTotalShards[] =
-    "test-launcher-total-shards";
-
-// Time (in milliseconds) that the tests should wait before timing out.
-const char switches::kTestLauncherTimeout[] = "test-launcher-timeout";
-
-// Path where to save a trace of test launcher's execution.
-const char switches::kTestLauncherTrace[] = "test-launcher-trace";
-
-// TODO(phajdan.jr): Clean up the switch names.
-const char switches::kTestTinyTimeout[] = "test-tiny-timeout";
-const char switches::kUiTestActionTimeout[] = "ui-test-action-timeout";
-const char switches::kUiTestActionMaxTimeout[] = "ui-test-action-max-timeout";
diff --git a/base/test/test_switches.h b/base/test/test_switches.h
deleted file mode 100644
index 6baba30..0000000
--- a/base/test/test_switches.h
+++ /dev/null
@@ -1,36 +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.
-
-#ifndef BASE_TEST_TEST_SWITCHES_H_
-#define BASE_TEST_TEST_SWITCHES_H_
-
-namespace switches {
-
-// All switches in alphabetical order. The switches should be documented
-// alongside the definition of their values in the .cc file.
-extern const char kTestLauncherBatchLimit[];
-extern const char kTestLauncherBotMode[];
-extern const char kTestLauncherDebugLauncher[];
-extern const char kTestLauncherForceRunBrokenTests[];
-extern const char kTestLauncherFilterFile[];
-extern const char kTestLauncherInteractive[];
-extern const char kTestLauncherJobs[];
-extern const char kTestLauncherListTests[];
-extern const char kTestLauncherOutput[];
-extern const char kTestLauncherRetryLimit[];
-extern const char kTestLauncherSummaryOutput[];
-extern const char kTestLauncherPrintTestStdio[];
-extern const char kTestLauncherPrintWritablePath[];
-extern const char kTestLauncherShardIndex[];
-extern const char kTestLauncherTestPartResultsLimit[];
-extern const char kTestLauncherTotalShards[];
-extern const char kTestLauncherTimeout[];
-extern const char kTestLauncherTrace[];
-extern const char kTestTinyTimeout[];
-extern const char kUiTestActionTimeout[];
-extern const char kUiTestActionMaxTimeout[];
-
-}  // namespace switches
-
-#endif  // BASE_TEST_TEST_SWITCHES_H_
diff --git a/base/test/test_timeouts.cc b/base/test/test_timeouts.cc
deleted file mode 100644
index 4c8b4ab..0000000
--- a/base/test/test_timeouts.cc
+++ /dev/null
@@ -1,117 +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/test/test_timeouts.h"
-
-#include <algorithm>
-
-#include "base/command_line.h"
-#include "base/debug/debugger.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/test/test_switches.h"
-#include "build_config.h"
-
-namespace {
-
-// Sets value to the greatest of:
-// 1) value's current value multiplied by kTimeoutMultiplier (assuming
-// InitializeTimeout is called only once per value).
-// 2) min_value.
-// 3) the numerical value given by switch_name on the command line multiplied
-// by kTimeoutMultiplier.
-void InitializeTimeout(const char* switch_name, int min_value, int* value) {
-  DCHECK(value);
-  int command_line_timeout = 0;
-  if (base::CommandLine::ForCurrentProcess()->HasSwitch(switch_name)) {
-    std::string string_value(base::CommandLine::ForCurrentProcess()->
-         GetSwitchValueASCII(switch_name));
-    if (!base::StringToInt(string_value, &command_line_timeout)) {
-      LOG(FATAL) << "Timeout value \"" << string_value << "\" was parsed as "
-                 << command_line_timeout;
-    }
-  }
-
-#if defined(MEMORY_SANITIZER)
-  // ASan/TSan/MSan instrument each memory access. This may slow the execution
-  // down significantly.
-  // For MSan the slowdown depends heavily on the value of msan_track_origins
-  // build flag. The multiplier below corresponds to msan_track_origins = 1.
-  constexpr int kTimeoutMultiplier = 6;
-#elif defined(ADDRESS_SANITIZER) && defined(OS_WIN)
-  // ASan/Win has not been optimized yet, give it a higher
-  // timeout multiplier. See http://crbug.com/412471
-  constexpr int kTimeoutMultiplier = 3;
-#elif defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER)
-  constexpr int kTimeoutMultiplier = 2;
-#else
-  constexpr int kTimeoutMultiplier = 1;
-#endif
-
-  *value = std::max(std::max(*value, command_line_timeout) * kTimeoutMultiplier,
-                    min_value);
-}
-
-}  // namespace
-
-// static
-bool TestTimeouts::initialized_ = false;
-
-// The timeout values should increase in the order they appear in this block.
-// static
-int TestTimeouts::tiny_timeout_ms_ = 100;
-int TestTimeouts::action_timeout_ms_ = 10000;
-#ifndef NDEBUG
-int TestTimeouts::action_max_timeout_ms_ = 45000;
-#else
-int TestTimeouts::action_max_timeout_ms_ = 30000;
-#endif  // NDEBUG
-
-int TestTimeouts::test_launcher_timeout_ms_ = 45000;
-
-// static
-void TestTimeouts::Initialize() {
-  DCHECK(!initialized_);
-  initialized_ = true;
-
-  if (base::debug::BeingDebugged()) {
-    fprintf(stdout,
-        "Detected presence of a debugger, running without test timeouts.\n");
-  }
-
-  // Note that these timeouts MUST be initialized in the correct order as
-  // per the CHECKS below.
-
-  InitializeTimeout(switches::kTestTinyTimeout, 0, &tiny_timeout_ms_);
-
-  // All timeouts other than the "tiny" one should be set to very large values
-  // when in a debugger or when run interactively, so that tests will not get
-  // auto-terminated.  By setting the UI test action timeout to at least this
-  // value, we guarantee the subsequent timeouts will be this large also.
-  // Setting the "tiny" timeout to a large value as well would make some tests
-  // hang (because it's used as a task-posting delay).  In particular this
-  // causes problems for some iOS device tests, which are always run inside a
-  // debugger (thus BeingDebugged() is true even on the bots).
-  int min_ui_test_action_timeout = tiny_timeout_ms_;
-  if (base::debug::BeingDebugged() ||
-      base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kTestLauncherInteractive)) {
-    constexpr int kVeryLargeTimeoutMs = 100'000'000;
-    min_ui_test_action_timeout = kVeryLargeTimeoutMs;
-  }
-
-  InitializeTimeout(switches::kUiTestActionTimeout, min_ui_test_action_timeout,
-                    &action_timeout_ms_);
-  InitializeTimeout(switches::kUiTestActionMaxTimeout, action_timeout_ms_,
-                    &action_max_timeout_ms_);
-
-  // Test launcher timeout is independent from anything above action timeout.
-  InitializeTimeout(switches::kTestLauncherTimeout, action_timeout_ms_,
-                    &test_launcher_timeout_ms_);
-
-  // The timeout values should be increasing in the right order.
-  CHECK_LE(tiny_timeout_ms_, action_timeout_ms_);
-  CHECK_LE(action_timeout_ms_, action_max_timeout_ms_);
-  CHECK_LE(action_timeout_ms_, test_launcher_timeout_ms_);
-}
diff --git a/base/test/test_timeouts.h b/base/test/test_timeouts.h
deleted file mode 100644
index 71983ed..0000000
--- a/base/test/test_timeouts.h
+++ /dev/null
@@ -1,61 +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.
-
-#ifndef BASE_TEST_TEST_TIMEOUTS_H_
-#define BASE_TEST_TEST_TIMEOUTS_H_
-
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/time/time.h"
-
-// Returns common timeouts to use in tests. Makes it possible to adjust
-// the timeouts for different environments (like TSan).
-class TestTimeouts {
- public:
-  // Initializes the timeouts. Non thread-safe. Should be called exactly once
-  // by the test suite.
-  static void Initialize();
-
-  // Timeout for actions that are expected to finish "almost instantly".  This
-  // is used in various tests to post delayed tasks and usually functions more
-  // like a delay value than a timeout.
-  static base::TimeDelta tiny_timeout() {
-    DCHECK(initialized_);
-    return base::TimeDelta::FromMilliseconds(tiny_timeout_ms_);
-  }
-
-  // Timeout to wait for something to happen. If you are not sure
-  // which timeout to use, this is the one you want.
-  static base::TimeDelta action_timeout() {
-    DCHECK(initialized_);
-    return base::TimeDelta::FromMilliseconds(action_timeout_ms_);
-  }
-
-  // Timeout longer than the above, but still suitable to use
-  // multiple times in a single test. Use if the timeout above
-  // is not sufficient.
-  static base::TimeDelta action_max_timeout() {
-    DCHECK(initialized_);
-    return base::TimeDelta::FromMilliseconds(action_max_timeout_ms_);
-  }
-
-  // Timeout for a single test launched used built-in test launcher.
-  // Do not use outside of the test launcher.
-  static base::TimeDelta test_launcher_timeout() {
-    DCHECK(initialized_);
-    return base::TimeDelta::FromMilliseconds(test_launcher_timeout_ms_);
-  }
-
- private:
-  static bool initialized_;
-
-  static int tiny_timeout_ms_;
-  static int action_timeout_ms_;
-  static int action_max_timeout_ms_;
-  static int test_launcher_timeout_ms_;
-
-  DISALLOW_IMPLICIT_CONSTRUCTORS(TestTimeouts);
-};
-
-#endif  // BASE_TEST_TEST_TIMEOUTS_H_
diff --git a/base/test/thread_test_helper.cc b/base/test/thread_test_helper.cc
deleted file mode 100644
index f3ca780..0000000
--- a/base/test/thread_test_helper.cc
+++ /dev/null
@@ -1,41 +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/test/thread_test_helper.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/threading/thread_restrictions.h"
-
-namespace base {
-
-ThreadTestHelper::ThreadTestHelper(
-    scoped_refptr<SequencedTaskRunner> target_sequence)
-    : test_result_(false),
-      target_sequence_(std::move(target_sequence)),
-      done_event_(WaitableEvent::ResetPolicy::AUTOMATIC,
-                  WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-bool ThreadTestHelper::Run() {
-  if (!target_sequence_->PostTask(
-          FROM_HERE, base::BindOnce(&ThreadTestHelper::RunOnSequence, this))) {
-    return false;
-  }
-  base::ThreadRestrictions::ScopedAllowWait allow_wait;
-  done_event_.Wait();
-  return test_result_;
-}
-
-void ThreadTestHelper::RunTest() { set_test_result(true); }
-
-ThreadTestHelper::~ThreadTestHelper() = default;
-
-void ThreadTestHelper::RunOnSequence() {
-  RunTest();
-  done_event_.Signal();
-}
-
-}  // namespace base
diff --git a/base/test/thread_test_helper.h b/base/test/thread_test_helper.h
deleted file mode 100644
index 935e7ef..0000000
--- a/base/test/thread_test_helper.h
+++ /dev/null
@@ -1,50 +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.
-
-#ifndef BASE_TEST_THREAD_TEST_HELPER_H_
-#define BASE_TEST_THREAD_TEST_HELPER_H_
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/sequenced_task_runner.h"
-#include "base/synchronization/waitable_event.h"
-
-namespace base {
-
-// Helper class that executes code on a given target sequence/thread while
-// blocking on the invoking sequence/thread. To use, derive from this class and
-// overwrite RunTest. An alternative use of this class is to use it directly. It
-// will then block until all pending tasks on a given sequence/thread have been
-// executed.
-class ThreadTestHelper : public RefCountedThreadSafe<ThreadTestHelper> {
- public:
-  explicit ThreadTestHelper(scoped_refptr<SequencedTaskRunner> target_sequence);
-
-  // True if RunTest() was successfully executed on the target sequence.
-  bool Run() WARN_UNUSED_RESULT;
-
-  virtual void RunTest();
-
- protected:
-  friend class RefCountedThreadSafe<ThreadTestHelper>;
-
-  virtual ~ThreadTestHelper();
-
-  // Use this method to store the result of RunTest().
-  void set_test_result(bool test_result) { test_result_ = test_result; }
-
- private:
-  void RunOnSequence();
-
-  bool test_result_;
-  scoped_refptr<SequencedTaskRunner> target_sequence_;
-  WaitableEvent done_event_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadTestHelper);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_THREAD_TEST_HELPER_H_
diff --git a/base/test/trace_to_file.cc b/base/test/trace_to_file.cc
deleted file mode 100644
index 17aa80b..0000000
--- a/base/test/trace_to_file.cc
+++ /dev/null
@@ -1,106 +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/test/trace_to_file.h"
-
-#include "base/base_switches.h"
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/files/file_util.h"
-#include "base/memory/ref_counted_memory.h"
-#include "base/run_loop.h"
-#include "base/trace_event/trace_buffer.h"
-#include "base/trace_event/trace_log.h"
-
-namespace base {
-namespace test {
-
-TraceToFile::TraceToFile() : started_(false) {
-}
-
-TraceToFile::~TraceToFile() {
-  EndTracingIfNeeded();
-}
-
-void TraceToFile::BeginTracingFromCommandLineOptions() {
-  DCHECK(CommandLine::InitializedForCurrentProcess());
-  DCHECK(!started_);
-
-  if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kTraceToFile))
-    return;
-
-  // Empty filter (i.e. just --trace-to-file) turns into default categories in
-  // TraceEventImpl
-  std::string filter = CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
-      switches::kTraceToFile);
-
-  FilePath path;
-  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kTraceToFileName)) {
-    path = FilePath(CommandLine::ForCurrentProcess()
-                        ->GetSwitchValuePath(switches::kTraceToFileName));
-  } else {
-    path = FilePath(FILE_PATH_LITERAL("trace.json"));
-  }
-
-  BeginTracing(path, filter);
-}
-
-void TraceToFile::BeginTracing(const FilePath& path,
-                               const std::string& categories) {
-  DCHECK(!started_);
-  started_ = true;
-  path_ = path;
-  WriteFileHeader();
-
-  trace_event::TraceLog::GetInstance()->SetEnabled(
-      trace_event::TraceConfig(categories, trace_event::RECORD_UNTIL_FULL),
-      trace_event::TraceLog::RECORDING_MODE);
-}
-
-void TraceToFile::WriteFileHeader() {
-  const char str[] = "{\"traceEvents\": [";
-  WriteFile(path_, str, static_cast<int>(strlen(str)));
-}
-
-void TraceToFile::AppendFileFooter() {
-  const char str[] = "]}";
-  AppendToFile(path_, str, static_cast<int>(strlen(str)));
-}
-
-void TraceToFile::TraceOutputCallback(const std::string& data) {
-  bool ret = AppendToFile(path_, data.c_str(), static_cast<int>(data.size()));
-  DCHECK(ret);
-}
-
-static void OnTraceDataCollected(
-    Closure quit_closure,
-    trace_event::TraceResultBuffer* buffer,
-    const scoped_refptr<RefCountedString>& json_events_str,
-    bool has_more_events) {
-  buffer->AddFragment(json_events_str->data());
-  if (!has_more_events)
-    quit_closure.Run();
-}
-
-void TraceToFile::EndTracingIfNeeded() {
-  if (!started_)
-    return;
-  started_ = false;
-
-  trace_event::TraceLog::GetInstance()->SetDisabled();
-
-  trace_event::TraceResultBuffer buffer;
-  buffer.SetOutputCallback(
-      Bind(&TraceToFile::TraceOutputCallback, Unretained(this)));
-
-  RunLoop run_loop;
-  trace_event::TraceLog::GetInstance()->Flush(
-      Bind(&OnTraceDataCollected, run_loop.QuitClosure(), Unretained(&buffer)));
-  run_loop.Run();
-
-  AppendFileFooter();
-}
-
-}  // namespace test
-}  // namespace base
diff --git a/base/test/trace_to_file.h b/base/test/trace_to_file.h
deleted file mode 100644
index 4308736..0000000
--- a/base/test/trace_to_file.h
+++ /dev/null
@@ -1,35 +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.
-
-#ifndef BASE_TEST_TRACE_TO_FILE_H_
-#define BASE_TEST_TRACE_TO_FILE_H_
-
-#include "base/files/file_path.h"
-
-namespace base {
-namespace test {
-
-class TraceToFile {
- public:
-  TraceToFile();
-  ~TraceToFile();
-
-  void BeginTracingFromCommandLineOptions();
-  void BeginTracing(const base::FilePath& path, const std::string& categories);
-  void EndTracingIfNeeded();
-
- private:
-  void WriteFileHeader();
-  void AppendFileFooter();
-
-  void TraceOutputCallback(const std::string& data);
-
-  base::FilePath path_;
-  bool started_;
-};
-
-}  // namespace test
-}  // namespace base
-
-#endif  // BASE_TEST_TRACE_TO_FILE_H_
diff --git a/base/test/user_action_tester.cc b/base/test/user_action_tester.cc
deleted file mode 100644
index 6c3de39..0000000
--- a/base/test/user_action_tester.cc
+++ /dev/null
@@ -1,38 +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/bind.h"
-#include "base/bind_helpers.h"
-#include "base/test/test_simple_task_runner.h"
-
-namespace base {
-
-UserActionTester::UserActionTester()
-    : task_runner_(new base::TestSimpleTaskRunner),
-      action_callback_(
-          base::Bind(&UserActionTester::OnUserAction, base::Unretained(this))) {
-  base::SetRecordActionTaskRunner(task_runner_);
-  base::AddActionCallback(action_callback_);
-}
-
-UserActionTester::~UserActionTester() {
-  base::RemoveActionCallback(action_callback_);
-}
-
-int UserActionTester::GetActionCount(const std::string& user_action) const {
-  UserActionCountMap::const_iterator iter = count_map_.find(user_action);
-  return iter == count_map_.end() ? 0 : iter->second;
-}
-
-void UserActionTester::ResetCounts() {
-  count_map_.clear();
-}
-
-void UserActionTester::OnUserAction(const std::string& user_action) {
-  ++(count_map_[user_action]);
-}
-
-}  // namespace base
diff --git a/base/test/user_action_tester.h b/base/test/user_action_tester.h
deleted file mode 100644
index 88bc632..0000000
--- a/base/test/user_action_tester.h
+++ /dev/null
@@ -1,50 +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.
-
-#ifndef BASE_TEST_USER_ACTION_TESTER_H_
-#define BASE_TEST_USER_ACTION_TESTER_H_
-
-#include <map>
-#include <string>
-
-#include "base/macros.h"
-#include "base/metrics/user_metrics.h"
-
-namespace base {
-
-// This class observes and collects user action notifications that are sent
-// by the tests, so that they can be examined afterwards for correctness.
-// Note: This class is NOT thread-safe.
-class UserActionTester {
- public:
-  UserActionTester();
-  ~UserActionTester();
-
-  // Returns the number of times the given |user_action| occurred.
-  int GetActionCount(const std::string& user_action) const;
-
-  // Resets all user action counts to 0.
-  void ResetCounts();
-
- private:
-  typedef std::map<std::string, int> UserActionCountMap;
-
-  // The callback that is notified when a user actions occurs.
-  void OnUserAction(const std::string& user_action);
-
-  // A map that tracks the number of times a user action has occurred.
-  UserActionCountMap count_map_;
-
-  // A test task runner used by user metrics.
-  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
-
-  // The callback that is added to the global action callback list.
-  base::ActionCallback action_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(UserActionTester);
-};
-
-}  // namespace base
-
-#endif  // BASE_TEST_USER_ACTION_TESTER_H_
diff --git a/base/test/values_test_util.cc b/base/test/values_test_util.cc
deleted file mode 100644
index a65c2c0..0000000
--- a/base/test/values_test_util.cc
+++ /dev/null
@@ -1,76 +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/values_test_util.h"
-
-#include <memory>
-
-#include "base/json/json_reader.h"
-#include "base/memory/ptr_util.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/values.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace base {
-
-void ExpectDictBooleanValue(bool expected_value,
-                            const DictionaryValue& value,
-                            const std::string& key) {
-  bool boolean_value = false;
-  EXPECT_TRUE(value.GetBoolean(key, &boolean_value)) << key;
-  EXPECT_EQ(expected_value, boolean_value) << key;
-}
-
-void ExpectDictDictionaryValue(const DictionaryValue& expected_value,
-                               const DictionaryValue& value,
-                               const std::string& key) {
-  const DictionaryValue* dict_value = nullptr;
-  EXPECT_TRUE(value.GetDictionary(key, &dict_value)) << key;
-  EXPECT_EQ(expected_value, *dict_value) << key;
-}
-
-void ExpectDictIntegerValue(int expected_value,
-                            const DictionaryValue& value,
-                            const std::string& key) {
-  int integer_value = 0;
-  EXPECT_TRUE(value.GetInteger(key, &integer_value)) << key;
-  EXPECT_EQ(expected_value, integer_value) << key;
-}
-
-void ExpectDictListValue(const ListValue& expected_value,
-                         const DictionaryValue& value,
-                         const std::string& key) {
-  const ListValue* list_value = nullptr;
-  EXPECT_TRUE(value.GetList(key, &list_value)) << key;
-  EXPECT_EQ(expected_value, *list_value) << key;
-}
-
-void ExpectDictStringValue(const std::string& expected_value,
-                           const DictionaryValue& value,
-                           const std::string& key) {
-  std::string string_value;
-  EXPECT_TRUE(value.GetString(key, &string_value)) << key;
-  EXPECT_EQ(expected_value, string_value) << key;
-}
-
-void ExpectStringValue(const std::string& expected_str, const Value& actual) {
-  EXPECT_EQ(Value::Type::STRING, actual.type());
-  EXPECT_EQ(expected_str, actual.GetString());
-}
-
-namespace test {
-
-std::unique_ptr<Value> ParseJson(base::StringPiece json) {
-  std::string error_msg;
-  std::unique_ptr<Value> result = base::JSONReader::ReadAndReturnError(
-      json, base::JSON_ALLOW_TRAILING_COMMAS, nullptr, &error_msg);
-  if (!result) {
-    ADD_FAILURE() << "Failed to parse \"" << json << "\": " << error_msg;
-    result = std::make_unique<Value>();
-  }
-  return result;
-}
-
-}  // namespace test
-}  // namespace base
diff --git a/base/test/values_test_util.h b/base/test/values_test_util.h
deleted file mode 100644
index 02ebca1..0000000
--- a/base/test/values_test_util.h
+++ /dev/null
@@ -1,53 +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.
-
-#ifndef BASE_TEST_VALUES_TEST_UTIL_H_
-#define BASE_TEST_VALUES_TEST_UTIL_H_
-
-#include <memory>
-#include <string>
-
-#include "base/strings/string_piece.h"
-
-namespace base {
-class DictionaryValue;
-class ListValue;
-class Value;
-
-// All the functions below expect that the value for the given key in
-// the given dictionary equals the given expected value.
-
-void ExpectDictBooleanValue(bool expected_value,
-                            const DictionaryValue& value,
-                            const std::string& key);
-
-void ExpectDictDictionaryValue(const DictionaryValue& expected_value,
-                               const DictionaryValue& value,
-                               const std::string& key);
-
-void ExpectDictIntegerValue(int expected_value,
-                            const DictionaryValue& value,
-                            const std::string& key);
-
-void ExpectDictListValue(const ListValue& expected_value,
-                         const DictionaryValue& value,
-                         const std::string& key);
-
-void ExpectDictStringValue(const std::string& expected_value,
-                           const DictionaryValue& value,
-                           const std::string& key);
-
-void ExpectStringValue(const std::string& expected_str, const Value& actual);
-
-namespace test {
-
-// Parses |json| as JSON, allowing trailing commas, and returns the
-// resulting value.  If the json fails to parse, causes an EXPECT
-// failure and returns the Null Value (but never a NULL pointer).
-std::unique_ptr<Value> ParseJson(base::StringPiece json);
-
-}  // namespace test
-}  // namespace base
-
-#endif  // BASE_TEST_VALUES_TEST_UTIL_H_
