diff --git a/base/base_paths_android.cc b/base/base_paths_android.cc
deleted file mode 100644
index 078f565..0000000
--- a/base/base_paths_android.cc
+++ /dev/null
@@ -1,66 +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.
-
-// Defines base::PathProviderAndroid which replaces base::PathProviderPosix for
-// Android in base/path_service.cc.
-
-#include <limits.h>
-#include <unistd.h>
-
-#include "base/android/jni_android.h"
-#include "base/android/path_utils.h"
-#include "base/base_paths.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/process/process_metrics.h"
-
-namespace base {
-
-bool PathProviderAndroid(int key, FilePath* result) {
-  switch (key) {
-    case base::FILE_EXE: {
-      FilePath bin_dir;
-      if (!ReadSymbolicLink(FilePath(kProcSelfExe), &bin_dir)) {
-        NOTREACHED() << "Unable to resolve " << kProcSelfExe << ".";
-        return false;
-      }
-      *result = bin_dir;
-      return true;
-    }
-    case base::FILE_MODULE:
-      // dladdr didn't work in Android as only the file name was returned.
-      NOTIMPLEMENTED();
-      return false;
-    case base::DIR_MODULE:
-      return base::android::GetNativeLibraryDirectory(result);
-    case base::DIR_SOURCE_ROOT:
-      // Used only by tests.
-      // In that context, hooked up via base/test/test_support_android.cc.
-      NOTIMPLEMENTED();
-      return false;
-    case base::DIR_USER_DESKTOP:
-      // Android doesn't support GetUserDesktop.
-      NOTIMPLEMENTED();
-      return false;
-    case base::DIR_CACHE:
-      return base::android::GetCacheDirectory(result);
-    case base::DIR_ASSETS:
-      // On Android assets are normally loaded from the APK using
-      // base::android::OpenApkAsset(). In tests, since the assets are no
-      // packaged, DIR_ASSETS is overridden to point to the build directory.
-      return false;
-    case base::DIR_ANDROID_APP_DATA:
-      return base::android::GetDataDirectory(result);
-    case base::DIR_ANDROID_EXTERNAL_STORAGE:
-      return base::android::GetExternalStorageDirectory(result);
-    default:
-      // Note: the path system expects this function to override the default
-      // behavior. So no need to log an error if we don't support a given
-      // path. The system will just use the default.
-      return false;
-  }
-}
-
-}  // namespace base
diff --git a/base/base_paths_android.h b/base/base_paths_android.h
deleted file mode 100644
index 7a9ac4a..0000000
--- a/base/base_paths_android.h
+++ /dev/null
@@ -1,25 +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_BASE_PATHS_ANDROID_H_
-#define BASE_BASE_PATHS_ANDROID_H_
-
-// This file declares Android-specific path keys for the base module.
-// These can be used with the PathService to access various special
-// directories and files.
-
-namespace base {
-
-enum {
-  PATH_ANDROID_START = 300,
-
-  DIR_ANDROID_APP_DATA,  // Directory where to put Android app's data.
-  DIR_ANDROID_EXTERNAL_STORAGE,  // Android external storage directory.
-
-  PATH_ANDROID_END
-};
-
-}  // namespace base
-
-#endif  // BASE_BASE_PATHS_ANDROID_H_
diff --git a/base/debug/stack_trace_android.cc b/base/debug/stack_trace_android.cc
deleted file mode 100644
index 329204c..0000000
--- a/base/debug/stack_trace_android.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/debug/stack_trace.h"
-
-#include <android/log.h>
-#include <stddef.h>
-#include <unwind.h>
-
-#include <algorithm>
-#include <ostream>
-
-#include "base/debug/proc_maps_linux.h"
-#include "base/strings/stringprintf.h"
-#include "base/threading/thread_restrictions.h"
-
-#ifdef __LP64__
-#define FMT_ADDR  "0x%016lx"
-#else
-#define FMT_ADDR  "0x%08x"
-#endif
-
-namespace {
-
-struct StackCrawlState {
-  StackCrawlState(uintptr_t* frames, size_t max_depth)
-      : frames(frames),
-        frame_count(0),
-        max_depth(max_depth),
-        have_skipped_self(false) {}
-
-  uintptr_t* frames;
-  size_t frame_count;
-  size_t max_depth;
-  bool have_skipped_self;
-};
-
-_Unwind_Reason_Code TraceStackFrame(_Unwind_Context* context, void* arg) {
-  StackCrawlState* state = static_cast<StackCrawlState*>(arg);
-  uintptr_t ip = _Unwind_GetIP(context);
-
-  // The first stack frame is this function itself.  Skip it.
-  if (ip != 0 && !state->have_skipped_self) {
-    state->have_skipped_self = true;
-    return _URC_NO_REASON;
-  }
-
-  state->frames[state->frame_count++] = ip;
-  if (state->frame_count >= state->max_depth)
-    return _URC_END_OF_STACK;
-  return _URC_NO_REASON;
-}
-
-}  // namespace
-
-namespace base {
-namespace debug {
-
-bool EnableInProcessStackDumping() {
-  // When running in an application, our code typically expects SIGPIPE
-  // to be ignored.  Therefore, when testing that same code, it should run
-  // with SIGPIPE ignored as well.
-  // TODO(phajdan.jr): De-duplicate this SIGPIPE code.
-  struct sigaction action;
-  memset(&action, 0, sizeof(action));
-  action.sa_handler = SIG_IGN;
-  sigemptyset(&action.sa_mask);
-  return (sigaction(SIGPIPE, &action, NULL) == 0);
-}
-
-StackTrace::StackTrace(size_t count) {
-  count = std::min(arraysize(trace_), count);
-
-  StackCrawlState state(reinterpret_cast<uintptr_t*>(trace_), count);
-  _Unwind_Backtrace(&TraceStackFrame, &state);
-  count_ = state.frame_count;
-}
-
-void StackTrace::Print() const {
-  std::string backtrace = ToString();
-  __android_log_write(ANDROID_LOG_ERROR, "chromium", backtrace.c_str());
-}
-
-// NOTE: Native libraries in APKs are stripped before installing. Print out the
-// relocatable address and library names so host computers can use tools to
-// symbolize and demangle (e.g., addr2line, c++filt).
-void StackTrace::OutputToStream(std::ostream* os) const {
-  std::string proc_maps;
-  std::vector<MappedMemoryRegion> regions;
-  // Allow IO to read /proc/self/maps. Reading this file doesn't hit the disk
-  // since it lives in procfs, and this is currently used to print a stack trace
-  // on fatal log messages in debug builds only. If the restriction is enabled
-  // then it will recursively trigger fatal failures when this enters on the
-  // UI thread.
-  base::ThreadRestrictions::ScopedAllowIO allow_io;
-  if (!ReadProcMaps(&proc_maps)) {
-    __android_log_write(
-        ANDROID_LOG_ERROR, "chromium", "Failed to read /proc/self/maps");
-  } else if (!ParseProcMaps(proc_maps, &regions)) {
-    __android_log_write(
-        ANDROID_LOG_ERROR, "chromium", "Failed to parse /proc/self/maps");
-  }
-
-  for (size_t i = 0; i < count_; ++i) {
-    // Subtract one as return address of function may be in the next
-    // function when a function is annotated as noreturn.
-    uintptr_t address = reinterpret_cast<uintptr_t>(trace_[i]) - 1;
-
-    std::vector<MappedMemoryRegion>::iterator iter = regions.begin();
-    while (iter != regions.end()) {
-      if (address >= iter->start && address < iter->end &&
-          !iter->path.empty()) {
-        break;
-      }
-      ++iter;
-    }
-
-    *os << base::StringPrintf("#%02zd " FMT_ADDR " ", i, address);
-
-    if (iter != regions.end()) {
-      uintptr_t rel_pc = address - iter->start + iter->offset;
-      const char* path = iter->path.c_str();
-      *os << base::StringPrintf("%s+" FMT_ADDR, path, rel_pc);
-    } else {
-      *os << "<unknown>";
-    }
-
-    *os << "\n";
-  }
-}
-
-}  // namespace debug
-}  // namespace base
diff --git a/base/files/file_util_android.cc b/base/files/file_util_android.cc
deleted file mode 100644
index b8b3b37..0000000
--- a/base/files/file_util_android.cc
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/files/file_util.h"
-
-#include "base/files/file_path.h"
-#include "base/path_service.h"
-
-namespace base {
-
-bool GetShmemTempDir(bool executable, base::FilePath* path) {
-  return PathService::Get(base::DIR_CACHE, path);
-}
-
-}  // namespace base
diff --git a/base/memory/platform_shared_memory_region_android.cc b/base/memory/platform_shared_memory_region_android.cc
deleted file mode 100644
index 664d3d4..0000000
--- a/base/memory/platform_shared_memory_region_android.cc
+++ /dev/null
@@ -1,190 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/platform_shared_memory_region.h"
-
-#include <sys/mman.h>
-
-#include "base/memory/shared_memory_tracker.h"
-#include "base/posix/eintr_wrapper.h"
-#include "third_party/ashmem/ashmem.h"
-
-namespace base {
-namespace subtle {
-
-// For Android, we use ashmem to implement SharedMemory. ashmem_create_region
-// will automatically pin the region. We never explicitly call pin/unpin. When
-// all the file descriptors from different processes associated with the region
-// are closed, the memory buffer will go away.
-
-namespace {
-
-static int GetAshmemRegionProtectionMask(int fd) {
-  int prot = ashmem_get_prot_region(fd);
-  if (prot < 0) {
-    DPLOG(ERROR) << "ashmem_get_prot_region failed";
-    return -1;
-  }
-  return prot;
-}
-
-}  // namespace
-
-// static
-PlatformSharedMemoryRegion PlatformSharedMemoryRegion::Take(
-    ScopedFD fd,
-    Mode mode,
-    size_t size,
-    const UnguessableToken& guid) {
-  if (!fd.is_valid())
-    return {};
-
-  if (size == 0)
-    return {};
-
-  if (size > static_cast<size_t>(std::numeric_limits<int>::max()))
-    return {};
-
-  CHECK(CheckPlatformHandlePermissionsCorrespondToMode(fd.get(), mode, size));
-
-  return PlatformSharedMemoryRegion(std::move(fd), mode, size, guid);
-}
-
-int PlatformSharedMemoryRegion::GetPlatformHandle() const {
-  return handle_.get();
-}
-
-bool PlatformSharedMemoryRegion::IsValid() const {
-  return handle_.is_valid();
-}
-
-PlatformSharedMemoryRegion PlatformSharedMemoryRegion::Duplicate() const {
-  if (!IsValid())
-    return {};
-
-  CHECK_NE(mode_, Mode::kWritable)
-      << "Duplicating a writable shared memory region is prohibited";
-
-  ScopedFD duped_fd(HANDLE_EINTR(dup(handle_.get())));
-  if (!duped_fd.is_valid()) {
-    DPLOG(ERROR) << "dup(" << handle_.get() << ") failed";
-    return {};
-  }
-
-  return PlatformSharedMemoryRegion(std::move(duped_fd), mode_, size_, guid_);
-}
-
-bool PlatformSharedMemoryRegion::ConvertToReadOnly() {
-  if (!IsValid())
-    return false;
-
-  CHECK_EQ(mode_, Mode::kWritable)
-      << "Only writable shared memory region can be converted to read-only";
-
-  ScopedFD handle_copy(handle_.release());
-
-  int prot = GetAshmemRegionProtectionMask(handle_copy.get());
-  if (prot < 0)
-    return false;
-
-  prot &= ~PROT_WRITE;
-  int ret = ashmem_set_prot_region(handle_copy.get(), prot);
-  if (ret != 0) {
-    DPLOG(ERROR) << "ashmem_set_prot_region failed";
-    return false;
-  }
-
-  handle_ = std::move(handle_copy);
-  mode_ = Mode::kReadOnly;
-  return true;
-}
-
-bool PlatformSharedMemoryRegion::MapAt(off_t offset,
-                                       size_t size,
-                                       void** memory,
-                                       size_t* mapped_size) const {
-  if (!IsValid())
-    return false;
-
-  size_t end_byte;
-  if (!CheckAdd(offset, size).AssignIfValid(&end_byte) || end_byte > size_) {
-    return false;
-  }
-
-  bool write_allowed = mode_ != Mode::kReadOnly;
-  *memory = mmap(nullptr, size, PROT_READ | (write_allowed ? PROT_WRITE : 0),
-                 MAP_SHARED, handle_.get(), offset);
-
-  bool mmap_succeeded = *memory && *memory != reinterpret_cast<void*>(-1);
-  if (!mmap_succeeded) {
-    DPLOG(ERROR) << "mmap " << handle_.get() << " failed";
-    return false;
-  }
-
-  *mapped_size = size;
-  DCHECK_EQ(0U,
-            reinterpret_cast<uintptr_t>(*memory) & (kMapMinimumAlignment - 1));
-  return true;
-}
-
-// static
-PlatformSharedMemoryRegion PlatformSharedMemoryRegion::Create(Mode mode,
-                                                              size_t size) {
-  if (size == 0)
-    return {};
-
-  if (size > static_cast<size_t>(std::numeric_limits<int>::max()))
-    return {};
-
-  CHECK_NE(mode, Mode::kReadOnly) << "Creating a region in read-only mode will "
-                                     "lead to this region being non-modifiable";
-
-  UnguessableToken guid = UnguessableToken::Create();
-
-  ScopedFD fd(ashmem_create_region(
-      SharedMemoryTracker::GetDumpNameForTracing(guid).c_str(), size));
-  if (!fd.is_valid()) {
-    DPLOG(ERROR) << "ashmem_create_region failed";
-    return {};
-  }
-
-  int err = ashmem_set_prot_region(fd.get(), PROT_READ | PROT_WRITE);
-  if (err < 0) {
-    DPLOG(ERROR) << "ashmem_set_prot_region failed";
-    return {};
-  }
-
-  return PlatformSharedMemoryRegion(std::move(fd), mode, size, guid);
-}
-
-bool PlatformSharedMemoryRegion::CheckPlatformHandlePermissionsCorrespondToMode(
-    PlatformHandle handle,
-    Mode mode,
-    size_t size) {
-  int prot = GetAshmemRegionProtectionMask(handle);
-  if (prot < 0)
-    return false;
-
-  bool is_read_only = (prot & PROT_WRITE) == 0;
-  bool expected_read_only = mode == Mode::kReadOnly;
-
-  if (is_read_only != expected_read_only) {
-    DLOG(ERROR) << "Ashmem region has a wrong protection mask: it is"
-                << (is_read_only ? " " : " not ") << "read-only but it should"
-                << (expected_read_only ? " " : " not ") << "be";
-    return false;
-  }
-
-  return true;
-}
-
-PlatformSharedMemoryRegion::PlatformSharedMemoryRegion(
-    ScopedFD fd,
-    Mode mode,
-    size_t size,
-    const UnguessableToken& guid)
-    : handle_(std::move(fd)), mode_(mode), size_(size), guid_(guid) {}
-
-}  // namespace subtle
-}  // namespace base
diff --git a/base/memory/shared_memory_android.cc b/base/memory/shared_memory_android.cc
deleted file mode 100644
index c126767..0000000
--- a/base/memory/shared_memory_android.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/shared_memory.h"
-
-#include <stddef.h>
-#include <sys/mman.h>
-
-#include "base/logging.h"
-#include "third_party/ashmem/ashmem.h"
-
-namespace base {
-
-// For Android, we use ashmem to implement SharedMemory. ashmem_create_region
-// will automatically pin the region. We never explicitly call pin/unpin. When
-// all the file descriptors from different processes associated with the region
-// are closed, the memory buffer will go away.
-
-bool SharedMemory::Create(const SharedMemoryCreateOptions& options) {
-  DCHECK(!shm_.IsValid());
-
-  if (options.size > static_cast<size_t>(std::numeric_limits<int>::max()))
-    return false;
-
-  // "name" is just a label in ashmem. It is visible in /proc/pid/maps.
-  int fd = ashmem_create_region(
-      options.name_deprecated ? options.name_deprecated->c_str() : "",
-      options.size);
-  shm_ = SharedMemoryHandle::ImportHandle(fd, options.size);
-  if (!shm_.IsValid()) {
-    DLOG(ERROR) << "Shared memory creation failed";
-    return false;
-  }
-
-  int flags = PROT_READ | PROT_WRITE | (options.executable ? PROT_EXEC : 0);
-  int err = ashmem_set_prot_region(shm_.GetHandle(), flags);
-  if (err < 0) {
-    DLOG(ERROR) << "Error " << err << " when setting protection of ashmem";
-    return false;
-  }
-
-  requested_size_ = options.size;
-
-  return true;
-}
-
-bool SharedMemory::Delete(const std::string& name) {
-  // Like on Windows, this is intentionally returning true as ashmem will
-  // automatically releases the resource when all FDs on it are closed.
-  return true;
-}
-
-bool SharedMemory::Open(const std::string& name, bool read_only) {
-  // ashmem doesn't support name mapping
-  NOTIMPLEMENTED();
-  return false;
-}
-
-void SharedMemory::Close() {
-  if (shm_.IsValid()) {
-    shm_.Close();
-    shm_ = SharedMemoryHandle();
-  }
-}
-
-SharedMemoryHandle SharedMemory::GetReadOnlyHandle() const {
-  // There are no read-only Ashmem descriptors on Android.
-  // Instead, the protection mask is a property of the region itself.
-  SharedMemoryHandle handle = shm_.Duplicate();
-  handle.SetReadOnly();
-  return handle;
-}
-
-}  // namespace base
diff --git a/base/memory/shared_memory_handle_android.cc b/base/memory/shared_memory_handle_android.cc
deleted file mode 100644
index 1b61535..0000000
--- a/base/memory/shared_memory_handle_android.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/shared_memory_handle.h"
-
-#include <sys/mman.h>
-#include <unistd.h>
-
-#include "base/logging.h"
-#include "base/posix/eintr_wrapper.h"
-#include "base/posix/unix_domain_socket.h"
-#include "base/unguessable_token.h"
-#include "third_party/ashmem/ashmem.h"
-
-namespace base {
-
-static int GetAshmemRegionProtectionMask(int fd) {
-  int prot = ashmem_get_prot_region(fd);
-  if (prot < 0) {
-    DPLOG(ERROR) << "ashmem_get_prot_region";
-    return -1;
-  }
-  return prot;
-}
-
-SharedMemoryHandle::SharedMemoryHandle() = default;
-
-SharedMemoryHandle::SharedMemoryHandle(
-    const base::FileDescriptor& file_descriptor,
-    size_t size,
-    const base::UnguessableToken& guid)
-    : guid_(guid), size_(size) {
-  DCHECK_GE(file_descriptor.fd, 0);
-  file_descriptor_ = file_descriptor;
-}
-
-// static
-SharedMemoryHandle SharedMemoryHandle::ImportHandle(int fd, size_t size) {
-  SharedMemoryHandle handle;
-  handle.file_descriptor_.fd = fd;
-  handle.file_descriptor_.auto_close = false;
-  handle.guid_ = UnguessableToken::Create();
-  handle.size_ = size;
-  return handle;
-}
-
-int SharedMemoryHandle::GetHandle() const {
-  DCHECK(IsValid());
-  return file_descriptor_.fd;
-}
-
-bool SharedMemoryHandle::IsValid() const {
-  return file_descriptor_.fd >= 0;
-}
-
-void SharedMemoryHandle::Close() const {
-  DCHECK(IsValid());
-  if (IGNORE_EINTR(close(file_descriptor_.fd)) < 0)
-    PLOG(ERROR) << "close";
-}
-
-int SharedMemoryHandle::Release() {
-  int old_fd = file_descriptor_.fd;
-  file_descriptor_.fd = -1;
-  return old_fd;
-}
-
-SharedMemoryHandle SharedMemoryHandle::Duplicate() const {
-  DCHECK(IsValid());
-  SharedMemoryHandle result;
-  int duped_handle = HANDLE_EINTR(dup(file_descriptor_.fd));
-  if (duped_handle >= 0) {
-    result = SharedMemoryHandle(FileDescriptor(duped_handle, true), GetSize(),
-                                GetGUID());
-    if (IsReadOnly())
-      result.SetReadOnly();
-  }
-  return result;
-}
-
-void SharedMemoryHandle::SetOwnershipPassesToIPC(bool ownership_passes) {
-  file_descriptor_.auto_close = ownership_passes;
-}
-
-bool SharedMemoryHandle::OwnershipPassesToIPC() const {
-  return file_descriptor_.auto_close;
-}
-
-bool SharedMemoryHandle::IsRegionReadOnly() const {
-  int prot = GetAshmemRegionProtectionMask(file_descriptor_.fd);
-  return (prot >= 0 && (prot & PROT_WRITE) == 0);
-}
-
-bool SharedMemoryHandle::SetRegionReadOnly() const {
-  int fd = file_descriptor_.fd;
-  int prot = GetAshmemRegionProtectionMask(fd);
-  if (prot < 0)
-    return false;
-
-  if ((prot & PROT_WRITE) == 0) {
-    // Region is already read-only.
-    return true;
-  }
-
-  prot &= ~PROT_WRITE;
-  int ret = ashmem_set_prot_region(fd, prot);
-  if (ret != 0) {
-    DPLOG(ERROR) << "ashmem_set_prot_region";
-    return false;
-  }
-  return true;
-}
-
-}  // namespace base
diff --git a/base/message_loop/message_pump_android.cc b/base/message_loop/message_pump_android.cc
deleted file mode 100644
index 8c5bb57..0000000
--- a/base/message_loop/message_pump_android.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/message_loop/message_pump_android.h"
-
-#include <jni.h>
-
-#include "base/android/jni_android.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/run_loop.h"
-#include "jni/SystemMessageHandler_jni.h"
-
-using base::android::JavaParamRef;
-using base::android::ScopedJavaLocalRef;
-
-namespace base {
-
-MessagePumpForUI::MessagePumpForUI() = default;
-MessagePumpForUI::~MessagePumpForUI() = default;
-
-// This is called by the java SystemMessageHandler whenever the message queue
-// detects an idle state (as in, control returns to the looper and there are no
-// tasks available to be run immediately).
-// See the comments in DoRunLoopOnce for how this differs from the
-// implementation on other platforms.
-void MessagePumpForUI::DoIdleWork(JNIEnv* env,
-                                  const JavaParamRef<jobject>& obj) {
-  delegate_->DoIdleWork();
-}
-
-void MessagePumpForUI::DoRunLoopOnce(JNIEnv* env,
-                                     const JavaParamRef<jobject>& obj,
-                                     jboolean delayed) {
-  if (delayed)
-    delayed_scheduled_time_ = base::TimeTicks();
-
-  // If the pump has been aborted, tasks may continue to be queued up, but
-  // shouldn't run.
-  if (ShouldAbort())
-    return;
-
-  // This is based on MessagePumpForUI::DoRunLoop() from desktop.
-  // Note however that our system queue is handled in the java side.
-  // In desktop we inspect and process a single system message and then
-  // we call DoWork() / DoDelayedWork(). This is then wrapped in a for loop and
-  // repeated until no work is left to do, at which point DoIdleWork is called.
-  // On Android, the java message queue may contain messages for other handlers
-  // that will be processed before calling here again.
-  // This means that unlike Desktop, we can't wrap a for loop around this
-  // function and keep processing tasks until we have no work left to do - we
-  // have to return control back to the Android Looper after each message. This
-  // also means we have to perform idle detection differently, which is why we
-  // add an IdleHandler to the message queue in SystemMessageHandler.java, which
-  // calls DoIdleWork whenever control returns back to the looper and there are
-  // no tasks queued up to run immediately.
-  delegate_->DoWork();
-  if (ShouldAbort()) {
-    // There is a pending JNI exception, return to Java so that the exception is
-    // thrown correctly.
-    return;
-  }
-
-  base::TimeTicks next_delayed_work_time;
-  delegate_->DoDelayedWork(&next_delayed_work_time);
-  if (ShouldAbort()) {
-    // There is a pending JNI exception, return to Java so that the exception is
-    // thrown correctly
-    return;
-  }
-
-  if (!next_delayed_work_time.is_null())
-    ScheduleDelayedWork(next_delayed_work_time);
-}
-
-void MessagePumpForUI::Run(Delegate* delegate) {
-  NOTREACHED() << "UnitTests should rely on MessagePumpForUIStub in"
-                  " test_stub_android.h";
-}
-
-void MessagePumpForUI::Start(Delegate* delegate) {
-  DCHECK(!quit_);
-  delegate_ = delegate;
-  run_loop_ = std::make_unique<RunLoop>();
-  // Since the RunLoop was just created above, BeforeRun should be guaranteed to
-  // return true (it only returns false if the RunLoop has been Quit already).
-  if (!run_loop_->BeforeRun())
-    NOTREACHED();
-
-  DCHECK(system_message_handler_obj_.is_null());
-
-  JNIEnv* env = base::android::AttachCurrentThread();
-  DCHECK(env);
-  system_message_handler_obj_.Reset(
-      Java_SystemMessageHandler_create(env, reinterpret_cast<jlong>(this)));
-}
-
-void MessagePumpForUI::Quit() {
-  quit_ = true;
-
-  if (!system_message_handler_obj_.is_null()) {
-    JNIEnv* env = base::android::AttachCurrentThread();
-    DCHECK(env);
-
-    Java_SystemMessageHandler_shutdown(env, system_message_handler_obj_);
-    system_message_handler_obj_.Reset();
-  }
-
-  if (run_loop_) {
-    run_loop_->AfterRun();
-    run_loop_ = nullptr;
-  }
-}
-
-void MessagePumpForUI::ScheduleWork() {
-  if (quit_)
-    return;
-  DCHECK(!system_message_handler_obj_.is_null());
-
-  JNIEnv* env = base::android::AttachCurrentThread();
-  DCHECK(env);
-
-  Java_SystemMessageHandler_scheduleWork(env, system_message_handler_obj_);
-}
-
-void MessagePumpForUI::ScheduleDelayedWork(const TimeTicks& delayed_work_time) {
-  if (quit_)
-    return;
-  // In the java side, |SystemMessageHandler| keeps a single "delayed" message.
-  // It's an expensive operation to |removeMessage| there, so this is optimized
-  // to avoid those calls.
-  //
-  // At this stage, |delayed_work_time| can be:
-  // 1) The same as previously scheduled: nothing to be done, move along. This
-  // is the typical case, since this method is called for every single message.
-  //
-  // 2) Not previously scheduled: just post a new message in java.
-  //
-  // 3) Shorter than previously scheduled: far less common. In this case,
-  // |removeMessage| and post a new one.
-  //
-  // 4) Longer than previously scheduled (or null): nothing to be done, move
-  // along.
-  if (!delayed_scheduled_time_.is_null() &&
-      delayed_work_time >= delayed_scheduled_time_) {
-    return;
-  }
-  DCHECK(!delayed_work_time.is_null());
-  DCHECK(!system_message_handler_obj_.is_null());
-
-  JNIEnv* env = base::android::AttachCurrentThread();
-  DCHECK(env);
-
-  jlong millis =
-      (delayed_work_time - TimeTicks::Now()).InMillisecondsRoundedUp();
-  delayed_scheduled_time_ = delayed_work_time;
-  // Note that we're truncating to milliseconds as required by the java side,
-  // even though delayed_work_time is microseconds resolution.
-  Java_SystemMessageHandler_scheduleDelayedWork(
-      env, system_message_handler_obj_, millis);
-}
-
-}  // namespace base
diff --git a/base/message_loop/message_pump_android.h b/base/message_loop/message_pump_android.h
deleted file mode 100644
index d09fdde..0000000
--- a/base/message_loop/message_pump_android.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_MESSAGE_LOOP_MESSAGE_PUMP_ANDROID_H_
-#define BASE_MESSAGE_LOOP_MESSAGE_PUMP_ANDROID_H_
-
-#include <jni.h>
-#include <memory>
-
-#include "base/android/scoped_java_ref.h"
-#include "base/base_export.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/message_loop/message_pump.h"
-#include "base/time/time.h"
-
-namespace base {
-
-class RunLoop;
-
-// This class implements a MessagePump needed for TYPE_UI MessageLoops on
-// OS_ANDROID platform.
-class BASE_EXPORT MessagePumpForUI : public MessagePump {
- public:
-  MessagePumpForUI();
-  ~MessagePumpForUI() override;
-
-  void DoIdleWork(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
-  void DoRunLoopOnce(JNIEnv* env,
-                     const base::android::JavaParamRef<jobject>& obj,
-                     jboolean delayed);
-
-  void Run(Delegate* delegate) override;
-  void Quit() override;
-  void ScheduleWork() override;
-  void ScheduleDelayedWork(const TimeTicks& delayed_work_time) override;
-
-  virtual void Start(Delegate* delegate);
-
-  // We call Abort when there is a pending JNI exception, meaning that the
-  // current thread will crash when we return to Java.
-  // We can't call any JNI-methods before returning to Java as we would then
-  // cause a native crash (instead of the original Java crash).
-  void Abort() { should_abort_ = true; }
-  bool ShouldAbort() const { return should_abort_; }
-
- private:
-  std::unique_ptr<RunLoop> run_loop_;
-  base::android::ScopedJavaGlobalRef<jobject> system_message_handler_obj_;
-  bool should_abort_ = false;
-  bool quit_ = false;
-  Delegate* delegate_ = nullptr;
-  base::TimeTicks delayed_scheduled_time_;
-
-  DISALLOW_COPY_AND_ASSIGN(MessagePumpForUI);
-};
-
-}  // namespace base
-
-#endif  // BASE_MESSAGE_LOOP_MESSAGE_PUMP_ANDROID_H_
diff --git a/base/os_compat_android.cc b/base/os_compat_android.cc
deleted file mode 100644
index c1a2ac8..0000000
--- a/base/os_compat_android.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/os_compat_android.h"
-
-#include <asm/unistd.h>
-#include <errno.h>
-#include <limits.h>
-#include <math.h>
-#include <sys/stat.h>
-#include <sys/syscall.h>
-#include <unistd.h>
-
-#if !defined(__LP64__)
-#include <time64.h>
-#endif
-
-#include "base/rand_util.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/stringprintf.h"
-
-extern "C" {
-// There is no futimes() avaiable in Bionic, so we provide our own
-// implementation until it is there.
-int futimes(int fd, const struct timeval tv[2]) {
-  if (tv == NULL)
-    return syscall(__NR_utimensat, fd, NULL, NULL, 0);
-
-  if (tv[0].tv_usec < 0 || tv[0].tv_usec >= 1000000 ||
-      tv[1].tv_usec < 0 || tv[1].tv_usec >= 1000000) {
-    errno = EINVAL;
-    return -1;
-  }
-
-  // Convert timeval to timespec.
-  struct timespec ts[2];
-  ts[0].tv_sec = tv[0].tv_sec;
-  ts[0].tv_nsec = tv[0].tv_usec * 1000;
-  ts[1].tv_sec = tv[1].tv_sec;
-  ts[1].tv_nsec = tv[1].tv_usec * 1000;
-  return syscall(__NR_utimensat, fd, NULL, ts, 0);
-}
-
-#if !defined(__LP64__)
-// 32-bit Android has only timegm64() and not timegm().
-// We replicate the behaviour of timegm() when the result overflows time_t.
-time_t timegm(struct tm* const t) {
-  // time_t is signed on Android.
-  static const time_t kTimeMax = ~(1L << (sizeof(time_t) * CHAR_BIT - 1));
-  static const time_t kTimeMin = (1L << (sizeof(time_t) * CHAR_BIT - 1));
-  time64_t result = timegm64(t);
-  if (result < kTimeMin || result > kTimeMax)
-    return -1;
-  return result;
-}
-#endif
-
-// The following is only needed when building with GCC 4.6 or higher
-// (i.e. not with Android GCC 4.4.3, nor with Clang).
-//
-// GCC is now capable of optimizing successive calls to sin() and cos() into
-// a single call to sincos(). This means that source code that looks like:
-//
-//     double c, s;
-//     c = cos(angle);
-//     s = sin(angle);
-//
-// Will generate machine code that looks like:
-//
-//     double c, s;
-//     sincos(angle, &s, &c);
-//
-// Unfortunately, sincos() and friends are not part of the Android libm.so
-// library provided by the NDK for API level 9. When the optimization kicks
-// in, it makes the final build fail with a puzzling message (puzzling
-// because 'sincos' doesn't appear anywhere in the sources!).
-//
-// To solve this, we provide our own implementation of the sincos() function
-// and related friends. Note that we must also explicitely tell GCC to disable
-// optimizations when generating these. Otherwise, the generated machine code
-// for each function would simply end up calling itself, resulting in a
-// runtime crash due to stack overflow.
-//
-#if defined(__GNUC__) && !defined(__clang__) && \
-    !defined(ANDROID_SINCOS_PROVIDED)
-
-// For the record, Clang does not support the 'optimize' attribute.
-// In the unlikely event that it begins performing this optimization too,
-// we'll have to find a different way to achieve this. NOTE: Tested with O1
-// which still performs the optimization.
-//
-#define GCC_NO_OPTIMIZE  __attribute__((optimize("O0")))
-
-GCC_NO_OPTIMIZE
-void sincos(double angle, double* s, double *c) {
-  *c = cos(angle);
-  *s = sin(angle);
-}
-
-GCC_NO_OPTIMIZE
-void sincosf(float angle, float* s, float* c) {
-  *c = cosf(angle);
-  *s = sinf(angle);
-}
-
-#endif // __GNUC__ && !__clang__
-
-// An implementation of mkdtemp, since it is not exposed by the NDK
-// for native API level 9 that we target.
-//
-// For any changes in the mkdtemp function, you should manually run the unittest
-// OsCompatAndroidTest.DISABLED_TestMkdTemp in your local machine to check if it
-// passes. Please don't enable it, since it creates a directory and may be
-// source of flakyness.
-char* mkdtemp(char* path) {
-  if (path == NULL) {
-    errno = EINVAL;
-    return NULL;
-  }
-
-  const int path_len = strlen(path);
-
-  // The last six characters of 'path' must be XXXXXX.
-  const base::StringPiece kSuffix("XXXXXX");
-  const int kSuffixLen = kSuffix.length();
-  if (!base::StringPiece(path, path_len).ends_with(kSuffix)) {
-    errno = EINVAL;
-    return NULL;
-  }
-
-  // If the path contains a directory, as in /tmp/foo/XXXXXXXX, make sure
-  // that /tmp/foo exists, otherwise we're going to loop a really long
-  // time for nothing below
-  char* dirsep = strrchr(path, '/');
-  if (dirsep != NULL) {
-    struct stat st;
-    int ret;
-
-    *dirsep = '\0';  // Terminating directory path temporarily
-
-    ret = stat(path, &st);
-
-    *dirsep = '/';  // Restoring directory separator
-    if (ret < 0)  // Directory probably does not exist
-      return NULL;
-    if (!S_ISDIR(st.st_mode)) {  // Not a directory
-      errno = ENOTDIR;
-      return NULL;
-    }
-  }
-
-  // Max number of tries using different random suffixes.
-  const int kMaxTries = 100;
-
-  // Now loop until we CAN create a directory by that name or we reach the max
-  // number of tries.
-  for (int i = 0; i < kMaxTries; ++i) {
-    // Fill the suffix XXXXXX with a random string composed of a-z chars.
-    for (int pos = 0; pos < kSuffixLen; ++pos) {
-      char rand_char = static_cast<char>(base::RandInt('a', 'z'));
-      path[path_len - kSuffixLen + pos] = rand_char;
-    }
-    if (mkdir(path, 0700) == 0) {
-      // We just created the directory succesfully.
-      return path;
-    }
-    if (errno != EEXIST) {
-      // The directory doesn't exist, but an error occured
-      return NULL;
-    }
-  }
-
-  // We reached the max number of tries.
-  return NULL;
-}
-
-}  // extern "C"
diff --git a/base/os_compat_android.h b/base/os_compat_android.h
deleted file mode 100644
index e33b1f7..0000000
--- a/base/os_compat_android.h
+++ /dev/null
@@ -1,21 +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_OS_COMPAT_ANDROID_H_
-#define BASE_OS_COMPAT_ANDROID_H_
-
-#include <fcntl.h>
-#include <sys/types.h>
-#include <utime.h>
-
-// Not implemented in Bionic.
-extern "C" int futimes(int fd, const struct timeval tv[2]);
-
-// Not exposed or implemented in Bionic.
-extern "C" char* mkdtemp(char* path);
-
-// Android has no timegm().
-extern "C" time_t timegm(struct tm* const t);
-
-#endif  // BASE_OS_COMPAT_ANDROID_H_
diff --git a/base/power_monitor/power_monitor_device_source_android.cc b/base/power_monitor/power_monitor_device_source_android.cc
deleted file mode 100644
index 7688513..0000000
--- a/base/power_monitor/power_monitor_device_source_android.cc
+++ /dev/null
@@ -1,39 +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/power_monitor/power_monitor.h"
-#include "base/power_monitor/power_monitor_device_source.h"
-#include "base/power_monitor/power_monitor_source.h"
-#include "jni/PowerMonitor_jni.h"
-
-namespace base {
-
-// A helper function which is a friend of PowerMonitorSource.
-void ProcessPowerEventHelper(PowerMonitorSource::PowerEvent event) {
-  PowerMonitorSource::ProcessPowerEvent(event);
-}
-
-namespace android {
-
-// Native implementation of PowerMonitor.java. Note: This will be invoked by
-// PowerMonitor.java shortly after startup to set the correct initial value for
-// "is on battery power."
-void JNI_PowerMonitor_OnBatteryChargingChanged(
-    JNIEnv* env,
-    const JavaParamRef<jclass>& clazz) {
-  ProcessPowerEventHelper(PowerMonitorSource::POWER_STATE_EVENT);
-}
-
-// Note: Android does not have the concept of suspend / resume as it's known by
-// other platforms. Thus we do not send Suspend/Resume notifications. See
-// http://crbug.com/644515
-
-}  // namespace android
-
-bool PowerMonitorDeviceSource::IsOnBatteryPowerImpl() {
-  JNIEnv* env = base::android::AttachCurrentThread();
-  return base::android::Java_PowerMonitor_isBatteryPower(env);
-}
-
-}  // namespace base
diff --git a/base/sys_info_android.cc b/base/sys_info_android.cc
deleted file mode 100644
index 7704796..0000000
--- a/base/sys_info_android.cc
+++ /dev/null
@@ -1,241 +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/sys_info.h"
-
-#include <dlfcn.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <sys/system_properties.h>
-
-#include "base/android/jni_android.h"
-#include "base/android/sys_utils.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/stringprintf.h"
-#include "base/sys_info_internal.h"
-
-#if (__ANDROID_API__ >= 21 /* 5.0 - Lollipop */)
-
-namespace {
-
-typedef int (SystemPropertyGetFunction)(const char*, char*);
-
-SystemPropertyGetFunction* DynamicallyLoadRealSystemPropertyGet() {
-  // libc.so should already be open, get a handle to it.
-  void* handle = dlopen("libc.so", RTLD_NOLOAD);
-  if (!handle) {
-    LOG(FATAL) << "Cannot dlopen libc.so: " << dlerror();
-  }
-  SystemPropertyGetFunction* real_system_property_get =
-      reinterpret_cast<SystemPropertyGetFunction*>(
-          dlsym(handle, "__system_property_get"));
-  if (!real_system_property_get) {
-    LOG(FATAL) << "Cannot resolve __system_property_get(): " << dlerror();
-  }
-  return real_system_property_get;
-}
-
-static base::LazyInstance<base::internal::LazySysInfoValue<
-    SystemPropertyGetFunction*, DynamicallyLoadRealSystemPropertyGet> >::Leaky
-    g_lazy_real_system_property_get = LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-// Android 'L' removes __system_property_get from the NDK, however it is still
-// a hidden symbol in libc. Until we remove all calls of __system_property_get
-// from Chrome we work around this by defining a weak stub here, which uses
-// dlsym to but ensures that Chrome uses the real system
-// implementatation when loaded.  http://crbug.com/392191.
-BASE_EXPORT int __system_property_get(const char* name, char* value) {
-  return g_lazy_real_system_property_get.Get().value()(name, value);
-}
-
-#endif
-
-namespace {
-
-// Default version of Android to fall back to when actual version numbers
-// cannot be acquired. Use the latest Android release with a higher bug fix
-// version to avoid unnecessarily comparison errors with the latest release.
-// This should be manually kept up to date on each Android release.
-const int kDefaultAndroidMajorVersion = 8;
-const int kDefaultAndroidMinorVersion = 1;
-const int kDefaultAndroidBugfixVersion = 99;
-
-// Get and parse out the OS version numbers from the system properties.
-// Note if parse fails, the "default" version is returned as fallback.
-void GetOsVersionStringAndNumbers(std::string* version_string,
-                                  int32_t* major_version,
-                                  int32_t* minor_version,
-                                  int32_t* bugfix_version) {
-  // Read the version number string out from the properties.
-  char os_version_str[PROP_VALUE_MAX];
-  __system_property_get("ro.build.version.release", os_version_str);
-
-  if (os_version_str[0]) {
-    // Try to parse out the version numbers from the string.
-    int num_read = sscanf(os_version_str, "%d.%d.%d", major_version,
-                          minor_version, bugfix_version);
-
-    if (num_read > 0) {
-      // If we don't have a full set of version numbers, make the extras 0.
-      if (num_read < 2)
-        *minor_version = 0;
-      if (num_read < 3)
-        *bugfix_version = 0;
-      *version_string = std::string(os_version_str);
-      return;
-    }
-  }
-
-  // For some reason, we couldn't parse the version number string.
-  *major_version = kDefaultAndroidMajorVersion;
-  *minor_version = kDefaultAndroidMinorVersion;
-  *bugfix_version = kDefaultAndroidBugfixVersion;
-  *version_string = ::base::StringPrintf("%d.%d.%d", *major_version,
-                                         *minor_version, *bugfix_version);
-}
-
-// Parses a system property (specified with unit 'k','m' or 'g').
-// Returns a value in bytes.
-// Returns -1 if the string could not be parsed.
-int64_t ParseSystemPropertyBytes(const base::StringPiece& str) {
-  const int64_t KB = 1024;
-  const int64_t MB = 1024 * KB;
-  const int64_t GB = 1024 * MB;
-  if (str.size() == 0u)
-    return -1;
-  int64_t unit_multiplier = 1;
-  size_t length = str.size();
-  if (str[length - 1] == 'k') {
-    unit_multiplier = KB;
-    length--;
-  } else if (str[length - 1] == 'm') {
-    unit_multiplier = MB;
-    length--;
-  } else if (str[length - 1] == 'g') {
-    unit_multiplier = GB;
-    length--;
-  }
-  int64_t result = 0;
-  bool parsed = base::StringToInt64(str.substr(0, length), &result);
-  bool negative = result <= 0;
-  bool overflow =
-      result >= std::numeric_limits<int64_t>::max() / unit_multiplier;
-  if (!parsed || negative || overflow)
-    return -1;
-  return result * unit_multiplier;
-}
-
-int GetDalvikHeapSizeMB() {
-  char heap_size_str[PROP_VALUE_MAX];
-  __system_property_get("dalvik.vm.heapsize", heap_size_str);
-  // dalvik.vm.heapsize property is writable by a root user.
-  // Clamp it to reasonable range as a sanity check,
-  // a typical android device will never have less than 48MB.
-  const int64_t MB = 1024 * 1024;
-  int64_t result = ParseSystemPropertyBytes(heap_size_str);
-  if (result == -1) {
-     // We should consider not exposing these values if they are not reliable.
-     LOG(ERROR) << "Can't parse dalvik.vm.heapsize: " << heap_size_str;
-     result = base::SysInfo::AmountOfPhysicalMemoryMB() / 3;
-  }
-  result =
-      std::min<int64_t>(std::max<int64_t>(32 * MB, result), 1024 * MB) / MB;
-  return static_cast<int>(result);
-}
-
-int GetDalvikHeapGrowthLimitMB() {
-  char heap_size_str[PROP_VALUE_MAX];
-  __system_property_get("dalvik.vm.heapgrowthlimit", heap_size_str);
-  // dalvik.vm.heapgrowthlimit property is writable by a root user.
-  // Clamp it to reasonable range as a sanity check,
-  // a typical android device will never have less than 24MB.
-  const int64_t MB = 1024 * 1024;
-  int64_t result = ParseSystemPropertyBytes(heap_size_str);
-  if (result == -1) {
-     // We should consider not exposing these values if they are not reliable.
-     LOG(ERROR) << "Can't parse dalvik.vm.heapgrowthlimit: " << heap_size_str;
-     result = base::SysInfo::AmountOfPhysicalMemoryMB() / 6;
-  }
-  result = std::min<int64_t>(std::max<int64_t>(16 * MB, result), 512 * MB) / MB;
-  return static_cast<int>(result);
-}
-
-}  // anonymous namespace
-
-namespace base {
-
-std::string SysInfo::HardwareModelName() {
-  char device_model_str[PROP_VALUE_MAX];
-  __system_property_get("ro.product.model", device_model_str);
-  return std::string(device_model_str);
-}
-
-std::string SysInfo::OperatingSystemName() {
-  return "Android";
-}
-
-std::string SysInfo::OperatingSystemVersion() {
-  std::string version_string;
-  int32_t major, minor, bugfix;
-  GetOsVersionStringAndNumbers(&version_string, &major, &minor, &bugfix);
-  return version_string;
-}
-
-void SysInfo::OperatingSystemVersionNumbers(int32_t* major_version,
-                                            int32_t* minor_version,
-                                            int32_t* bugfix_version) {
-  std::string version_string;
-  GetOsVersionStringAndNumbers(&version_string, major_version, minor_version,
-                               bugfix_version);
-}
-
-std::string SysInfo::GetAndroidBuildCodename() {
-  char os_version_codename_str[PROP_VALUE_MAX];
-  __system_property_get("ro.build.version.codename", os_version_codename_str);
-  return std::string(os_version_codename_str);
-}
-
-std::string SysInfo::GetAndroidBuildID() {
-  char os_build_id_str[PROP_VALUE_MAX];
-  __system_property_get("ro.build.id", os_build_id_str);
-  return std::string(os_build_id_str);
-}
-
-int SysInfo::DalvikHeapSizeMB() {
-  static int heap_size = GetDalvikHeapSizeMB();
-  return heap_size;
-}
-
-int SysInfo::DalvikHeapGrowthLimitMB() {
-  static int heap_growth_limit = GetDalvikHeapGrowthLimitMB();
-  return heap_growth_limit;
-}
-
-static base::LazyInstance<
-    base::internal::LazySysInfoValue<bool,
-        android::SysUtils::IsLowEndDeviceFromJni> >::Leaky
-    g_lazy_low_end_device = LAZY_INSTANCE_INITIALIZER;
-
-bool SysInfo::IsLowEndDeviceImpl() {
-  // This code might be used in some environments
-  // which might not have a Java environment.
-  // Note that we need to call the Java version here.
-  // There exists a complete native implementation in
-  // sys_info.cc but calling that here would mean that
-  // the Java code and the native code would call different
-  // implementations which could give different results.
-  // Also the Java code cannot depend on the native code
-  // since it might not be loaded yet.
-  if (!base::android::IsVMInitialized())
-    return false;
-  return g_lazy_low_end_device.Get().value();
-}
-
-
-}  // namespace base
diff --git a/base/test/android/OWNERS b/base/test/android/OWNERS
deleted file mode 100644
index 2b0078b..0000000
--- a/base/test/android/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-jbudorick@chromium.org
-file://base/android/OWNERS
-
-# COMPONENT: Test>Android
diff --git a/base/test/android/java/src/org/chromium/base/ContentUriTestUtils.java b/base/test/android/java/src/org/chromium/base/ContentUriTestUtils.java
deleted file mode 100644
index fe9d540..0000000
--- a/base/test/android/java/src/org/chromium/base/ContentUriTestUtils.java
+++ /dev/null
@@ -1,46 +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.
-
-package org.chromium.base;
-
-import android.content.ContentValues;
-import android.database.Cursor;
-import android.net.Uri;
-import android.provider.MediaStore;
-
-import org.chromium.base.annotations.CalledByNative;
-
-/**
- * Utilities for testing operations on content URI.
- */
-public class ContentUriTestUtils {
-    /**
-     * Insert an image into the MediaStore, and return the content URI. If the
-     * image already exists in the MediaStore, just retrieve the URI.
-     *
-     * @param path Path to the image file.
-     * @return Content URI of the image.
-     */
-    @CalledByNative
-    private static String insertImageIntoMediaStore(String path) {
-        // Check whether the content URI exists.
-        Cursor c = ContextUtils.getApplicationContext().getContentResolver().query(
-                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
-                new String[] {MediaStore.Video.VideoColumns._ID},
-                MediaStore.Images.Media.DATA + " LIKE ?", new String[] {path}, null);
-        if (c != null && c.getCount() > 0) {
-            c.moveToFirst();
-            int id = c.getInt(0);
-            return Uri.withAppendedPath(
-                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + id).toString();
-        }
-
-        // Insert the content URI into MediaStore.
-        ContentValues values = new ContentValues();
-        values.put(MediaStore.MediaColumns.DATA, path);
-        Uri uri = ContextUtils.getApplicationContext().getContentResolver().insert(
-                MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
-        return uri.toString();
-    }
-}
diff --git a/base/test/android/java/src/org/chromium/base/ITestCallback.aidl b/base/test/android/java/src/org/chromium/base/ITestCallback.aidl
deleted file mode 100644
index dd208d5..0000000
--- a/base/test/android/java/src/org/chromium/base/ITestCallback.aidl
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base;
-
-import org.chromium.base.ITestController;
-import org.chromium.base.process_launcher.FileDescriptorInfo;
-
-/**
- * This interface is called by the child process to pass its controller to its parent.
- */
-interface ITestCallback {
-  oneway void childConnected(ITestController controller);
-
-  /**
-    * Invoked by the service to notify that the main method returned.
-    * IMPORTANT! Should not be marked oneway as the caller will terminate the running process after
-    * this call. Marking it oneway would make the call asynchronous and the process could terminate
-    * before the call was actually sent.
-    */
-  void mainReturned(int returnCode);
-}
diff --git a/base/test/android/java/src/org/chromium/base/ITestController.aidl b/base/test/android/java/src/org/chromium/base/ITestController.aidl
deleted file mode 100644
index d927ee5..0000000
--- a/base/test/android/java/src/org/chromium/base/ITestController.aidl
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base;
-
-import org.chromium.base.process_launcher.FileDescriptorInfo;
-
-/**
- * This interface is used to control child processes.
- */
-interface ITestController {
-  /**
-   * Forces the service process to terminate and block until the process stops.
-   * @param exitCode the exit code the process should terminate with.
-   * @return always true, a return value is only returned to force the call to be synchronous.
-   */
-  boolean forceStopSynchronous(int exitCode);
-
-  /**
-   * Forces the service process to terminate.
-   * @param exitCode the exit code the process should terminate with.
-   */
-  oneway void forceStop(int exitCode);
-}
diff --git a/base/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java b/base/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java
deleted file mode 100644
index 3da7ba8..0000000
--- a/base/test/android/java/src/org/chromium/base/JavaHandlerThreadHelpers.java
+++ /dev/null
@@ -1,63 +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.
-
-package org.chromium.base;
-
-import android.os.Handler;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.CalledByNativeUnchecked;
-import org.chromium.base.annotations.JNINamespace;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-@JNINamespace("base::android")
-class JavaHandlerThreadHelpers {
-    private static class TestException extends Exception {}
-
-    // This is executed as part of base_unittests. This tests that JavaHandlerThread can be used
-    // by itself without attaching to its native peer.
-    @CalledByNative
-    private static JavaHandlerThread testAndGetJavaHandlerThread() {
-        final AtomicBoolean taskExecuted = new AtomicBoolean();
-        final Object lock = new Object();
-        Runnable runnable = new Runnable() {
-            @Override
-            public void run() {
-                synchronized (lock) {
-                    taskExecuted.set(true);
-                    lock.notifyAll();
-                }
-            }
-        };
-
-        JavaHandlerThread thread = new JavaHandlerThread("base_unittests_java");
-        thread.maybeStart();
-
-        Handler handler = new Handler(thread.getLooper());
-        handler.post(runnable);
-        synchronized (lock) {
-            while (!taskExecuted.get()) {
-                try {
-                    lock.wait();
-                } catch (InterruptedException e) {
-                    // ignore interrupts
-                }
-            }
-        }
-
-        return thread;
-    }
-
-    @CalledByNativeUnchecked
-    private static void throwException() throws TestException {
-        throw new TestException();
-    }
-
-    @CalledByNative
-    private static boolean isExceptionTestException(Throwable exception) {
-        if (exception == null) return false;
-        return exception instanceof TestException;
-    }
-}
diff --git a/base/test/android/java/src/org/chromium/base/MainReturnCodeResult.java b/base/test/android/java/src/org/chromium/base/MainReturnCodeResult.java
deleted file mode 100644
index 9756c97..0000000
--- a/base/test/android/java/src/org/chromium/base/MainReturnCodeResult.java
+++ /dev/null
@@ -1,40 +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.
-
-package org.chromium.base;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-
-/**
- * Contains the result of a native main method that ran in a child process.
- */
-@JNINamespace("base::android")
-public final class MainReturnCodeResult {
-    private final int mMainReturnCode;
-    private final boolean mTimedOut;
-
-    public static MainReturnCodeResult createMainResult(int returnCode) {
-        return new MainReturnCodeResult(returnCode, false /* timedOut */);
-    }
-
-    public static MainReturnCodeResult createTimeoutMainResult() {
-        return new MainReturnCodeResult(0, true /* timedOut */);
-    }
-
-    private MainReturnCodeResult(int mainReturnCode, boolean timedOut) {
-        mMainReturnCode = mainReturnCode;
-        mTimedOut = timedOut;
-    }
-
-    @CalledByNative
-    public int getReturnCode() {
-        return mMainReturnCode;
-    }
-
-    @CalledByNative
-    public boolean hasTimedOut() {
-        return mTimedOut;
-    }
-}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java
deleted file mode 100644
index d0b1850..0000000
--- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientLauncher.java
+++ /dev/null
@@ -1,383 +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.
-
-package org.chromium.base;
-
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
-import android.util.SparseArray;
-
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.JNINamespace;
-import org.chromium.base.process_launcher.ChildConnectionAllocator;
-import org.chromium.base.process_launcher.ChildProcessConnection;
-import org.chromium.base.process_launcher.ChildProcessLauncher;
-import org.chromium.base.process_launcher.FileDescriptorInfo;
-import org.chromium.base.process_launcher.IChildProcessService;
-
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.ReentrantLock;
-
-import javax.annotation.concurrent.GuardedBy;
-
-/**
- * Helper class for launching test client processes for multiprocess unit tests.
- */
-@JNINamespace("base::android")
-public final class MultiprocessTestClientLauncher {
-    private static final String TAG = "cr_MProcTCLauncher";
-
-    private static final int CONNECTION_TIMEOUT_MS = 10 * 1000;
-
-    private static final SparseArray<MultiprocessTestClientLauncher> sPidToLauncher =
-            new SparseArray<>();
-
-    private static final SparseArray<Integer> sPidToMainResult = new SparseArray<>();
-
-    private static final Object sLauncherHandlerInitLock = new Object();
-    private static Handler sLauncherHandler;
-
-    private static ChildConnectionAllocator sConnectionAllocator;
-
-    private final ITestCallback.Stub mCallback = new ITestCallback.Stub() {
-        @Override
-        public void childConnected(ITestController controller) {
-            mTestController = controller;
-            // This method can be called before onServiceConnected below has set the PID.
-            // Wait for mPid to be set before notifying.
-            try {
-                mPidReceived.await();
-            } catch (InterruptedException ie) {
-                Log.e(TAG, "Interrupted while waiting for connection PID.");
-                return;
-            }
-            // Now we are fully initialized, notify clients.
-            mConnectedLock.lock();
-            try {
-                mConnected = true;
-                mConnectedCondition.signal();
-            } finally {
-                mConnectedLock.unlock();
-            }
-        }
-
-        @Override
-        public void mainReturned(int returnCode) {
-            mMainReturnCodeLock.lock();
-            try {
-                mMainReturnCode = returnCode;
-                mMainReturnCodeCondition.signal();
-            } finally {
-                mMainReturnCodeLock.unlock();
-            }
-
-            // Also store the return code in a map as the connection might get disconnected
-            // before waitForMainToReturn is called and then we would not have a way to retrieve
-            // the connection.
-            sPidToMainResult.put(mPid, returnCode);
-        }
-    };
-
-    private final ChildProcessLauncher.Delegate mLauncherDelegate =
-            new ChildProcessLauncher.Delegate() {
-                @Override
-                public void onConnectionEstablished(ChildProcessConnection connection) {
-                    assert isRunningOnLauncherThread();
-                    int pid = connection.getPid();
-                    sPidToLauncher.put(pid, MultiprocessTestClientLauncher.this);
-                    mPid = pid;
-                    mPidReceived.countDown();
-                }
-
-                @Override
-                public void onConnectionLost(ChildProcessConnection connection) {
-                    assert isRunningOnLauncherThread();
-                    assert sPidToLauncher.get(connection.getPid())
-                            == MultiprocessTestClientLauncher.this;
-                    sPidToLauncher.remove(connection.getPid());
-                }
-            };
-
-    private final CountDownLatch mPidReceived = new CountDownLatch(1);
-
-    private final ChildProcessLauncher mLauncher;
-
-    private final ReentrantLock mConnectedLock = new ReentrantLock();
-    private final Condition mConnectedCondition = mConnectedLock.newCondition();
-    @GuardedBy("mConnectedLock")
-    private boolean mConnected;
-
-    private IChildProcessService mService = null;
-    private int mPid;
-    private ITestController mTestController;
-
-    private final ReentrantLock mMainReturnCodeLock = new ReentrantLock();
-    private final Condition mMainReturnCodeCondition = mMainReturnCodeLock.newCondition();
-    // The return code returned by the service's main method.
-    // null if the service has not sent it yet.
-    @GuardedBy("mMainReturnCodeLock")
-    private Integer mMainReturnCode;
-
-    private MultiprocessTestClientLauncher(String[] commandLine, FileDescriptorInfo[] filesToMap) {
-        assert isRunningOnLauncherThread();
-
-        if (sConnectionAllocator == null) {
-            sConnectionAllocator = ChildConnectionAllocator.create(
-                    ContextUtils.getApplicationContext(), sLauncherHandler, null,
-                    "org.chromium.native_test", "org.chromium.base.MultiprocessTestClientService",
-                    "org.chromium.native_test.NUM_TEST_CLIENT_SERVICES", false /* bindToCaller */,
-                    false /* bindAsExternalService */, false /* useStrongBinding */);
-        }
-        mLauncher = new ChildProcessLauncher(sLauncherHandler, mLauncherDelegate, commandLine,
-                filesToMap, sConnectionAllocator, Arrays.asList(mCallback));
-    }
-
-    private boolean waitForConnection(long timeoutMs) {
-        assert !isRunningOnLauncherThread();
-
-        long timeoutNs = TimeUnit.MILLISECONDS.toNanos(timeoutMs);
-        mConnectedLock.lock();
-        try {
-            while (!mConnected) {
-                if (timeoutNs <= 0L) {
-                    return false;
-                }
-                try {
-                    mConnectedCondition.awaitNanos(timeoutNs);
-                } catch (InterruptedException ie) {
-                    Log.e(TAG, "Interrupted while waiting for connection.");
-                }
-            }
-        } finally {
-            mConnectedLock.unlock();
-        }
-        return true;
-    }
-
-    private Integer getMainReturnCode(long timeoutMs) {
-        assert isRunningOnLauncherThread();
-
-        long timeoutNs = TimeUnit.MILLISECONDS.toNanos(timeoutMs);
-        mMainReturnCodeLock.lock();
-        try {
-            while (mMainReturnCode == null) {
-                if (timeoutNs <= 0L) {
-                    return null;
-                }
-                try {
-                    timeoutNs = mMainReturnCodeCondition.awaitNanos(timeoutNs);
-                } catch (InterruptedException ie) {
-                    Log.e(TAG, "Interrupted while waiting for main return code.");
-                }
-            }
-            return mMainReturnCode;
-        } finally {
-            mMainReturnCodeLock.unlock();
-        }
-    }
-
-    /**
-     * Spawns and connects to a child process.
-     * May not be called from the main thread.
-     *
-     * @param commandLine the child process command line argv.
-     * @return the PID of the started process or 0 if the process could not be started.
-     */
-    @CalledByNative
-    private static int launchClient(
-            final String[] commandLine, final FileDescriptorInfo[] filesToMap) {
-        initLauncherThread();
-
-        final MultiprocessTestClientLauncher launcher =
-                runOnLauncherAndGetResult(new Callable<MultiprocessTestClientLauncher>() {
-                    @Override
-                    public MultiprocessTestClientLauncher call() {
-                        return createAndStartLauncherOnLauncherThread(commandLine, filesToMap);
-                    }
-                });
-        if (launcher == null) {
-            return 0;
-        }
-
-        if (!launcher.waitForConnection(CONNECTION_TIMEOUT_MS)) {
-            return 0; // Timed-out.
-        }
-
-        return runOnLauncherAndGetResult(new Callable<Integer>() {
-            @Override
-            public Integer call() {
-                int pid = launcher.mLauncher.getPid();
-                assert pid > 0;
-                sPidToLauncher.put(pid, launcher);
-                return pid;
-            }
-        });
-    }
-
-    private static MultiprocessTestClientLauncher createAndStartLauncherOnLauncherThread(
-            String[] commandLine, FileDescriptorInfo[] filesToMap) {
-        assert isRunningOnLauncherThread();
-
-        MultiprocessTestClientLauncher launcher =
-                new MultiprocessTestClientLauncher(commandLine, filesToMap);
-        if (!launcher.mLauncher.start(
-                    true /* setupConnection */, true /* queueIfNoFreeConnection */)) {
-            return null;
-        }
-
-        return launcher;
-    }
-
-    /**
-     * Blocks until the main method invoked by a previous call to launchClient terminates or until
-     * the specified time-out expires.
-     * Returns immediately if main has already returned.
-     * @param pid the process ID that was returned by the call to launchClient
-     * @param timeoutMs the timeout in milliseconds after which the method returns even if main has
-     *        not returned.
-     * @return the return code returned by the main method or whether it timed-out.
-     */
-    @CalledByNative
-    private static MainReturnCodeResult waitForMainToReturn(final int pid, final int timeoutMs) {
-        return runOnLauncherAndGetResult(new Callable<MainReturnCodeResult>() {
-            @Override
-            public MainReturnCodeResult call() {
-                return waitForMainToReturnOnLauncherThread(pid, timeoutMs);
-            }
-        });
-    }
-
-    private static MainReturnCodeResult waitForMainToReturnOnLauncherThread(
-            int pid, int timeoutMs) {
-        assert isRunningOnLauncherThread();
-
-        MultiprocessTestClientLauncher launcher = sPidToLauncher.get(pid);
-        // The launcher can be null if it got cleaned-up (because the connection was lost) before
-        // this gets called.
-        if (launcher != null) {
-            Integer mainResult = launcher.getMainReturnCode(timeoutMs);
-            return mainResult == null ? MainReturnCodeResult.createTimeoutMainResult()
-                                      : MainReturnCodeResult.createMainResult(mainResult);
-        }
-
-        Integer mainResult = sPidToMainResult.get(pid);
-        if (mainResult == null) {
-            Log.e(TAG, "waitForMainToReturn called on unknown connection for pid " + pid);
-            return null;
-        }
-        sPidToMainResult.remove(pid);
-        return MainReturnCodeResult.createMainResult(mainResult);
-    }
-
-    @CalledByNative
-    private static boolean terminate(final int pid, final int exitCode, final boolean wait) {
-        return runOnLauncherAndGetResult(new Callable<Boolean>() {
-            @Override
-            public Boolean call() {
-                return terminateOnLauncherThread(pid, exitCode, wait);
-            }
-        });
-    }
-
-    private static boolean terminateOnLauncherThread(int pid, int exitCode, boolean wait) {
-        assert isRunningOnLauncherThread();
-
-        MultiprocessTestClientLauncher launcher = sPidToLauncher.get(pid);
-        if (launcher == null) {
-            Log.e(TAG, "terminate called on unknown launcher for pid " + pid);
-            return false;
-        }
-        try {
-            if (wait) {
-                launcher.mTestController.forceStopSynchronous(exitCode);
-            } else {
-                launcher.mTestController.forceStop(exitCode);
-            }
-        } catch (RemoteException e) {
-            // We expect this failure, since the forceStop's service implementation calls
-            // System.exit().
-        }
-        return true;
-    }
-
-    private static void initLauncherThread() {
-        synchronized (sLauncherHandlerInitLock) {
-            if (sLauncherHandler != null) return;
-
-            HandlerThread launcherThread = new HandlerThread("LauncherThread");
-            launcherThread.start();
-            sLauncherHandler = new Handler(launcherThread.getLooper());
-        }
-    }
-
-    /** Does not take ownership of of fds. */
-    @CalledByNative
-    private static FileDescriptorInfo[] makeFdInfoArray(int[] keys, int[] fds) {
-        FileDescriptorInfo[] fdInfos = new FileDescriptorInfo[keys.length];
-        for (int i = 0; i < keys.length; i++) {
-            FileDescriptorInfo fdInfo = makeFdInfo(keys[i], fds[i]);
-            if (fdInfo == null) {
-                Log.e(TAG, "Failed to make file descriptor (" + keys[i] + ", " + fds[i] + ").");
-                return null;
-            }
-            fdInfos[i] = fdInfo;
-        }
-        return fdInfos;
-    }
-
-    private static FileDescriptorInfo makeFdInfo(int id, int fd) {
-        ParcelFileDescriptor parcelableFd = null;
-        try {
-            parcelableFd = ParcelFileDescriptor.fromFd(fd);
-        } catch (IOException e) {
-            Log.e(TAG, "Invalid FD provided for process connection, aborting connection.", e);
-            return null;
-        }
-        return new FileDescriptorInfo(id, parcelableFd, 0 /* offset */, 0 /* size */);
-    }
-
-    private static boolean isRunningOnLauncherThread() {
-        return sLauncherHandler.getLooper() == Looper.myLooper();
-    }
-
-    private static void runOnLauncherThreadBlocking(final Runnable runnable) {
-        assert !isRunningOnLauncherThread();
-        final Semaphore done = new Semaphore(0);
-        sLauncherHandler.post(new Runnable() {
-            @Override
-            public void run() {
-                runnable.run();
-                done.release();
-            }
-        });
-        done.acquireUninterruptibly();
-    }
-
-    private static <R> R runOnLauncherAndGetResult(Callable<R> callable) {
-        if (isRunningOnLauncherThread()) {
-            try {
-                return callable.call();
-            } catch (Exception e) {
-                throw new RuntimeException(e);
-            }
-        }
-        try {
-            FutureTask<R> task = new FutureTask<R>(callable);
-            sLauncherHandler.post(task);
-            return task.get();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService.java
deleted file mode 100644
index 9b50001..0000000
--- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService.java
+++ /dev/null
@@ -1,14 +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.
-
-package org.chromium.base;
-
-import org.chromium.base.process_launcher.ChildProcessService;
-
-/** The service implementation used to host all multiprocess test client code. */
-public class MultiprocessTestClientService extends ChildProcessService {
-    public MultiprocessTestClientService() {
-        super(new MultiprocessTestClientServiceDelegate());
-    }
-}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService0.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService0.java
deleted file mode 100644
index 6bdd867..0000000
--- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService0.java
+++ /dev/null
@@ -1,10 +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.
-
-package org.chromium.base;
-
-/**
- * A subclass used only to differentiate different test client service process instances.
- */
-public class MultiprocessTestClientService0 extends MultiprocessTestClientService {}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService1.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService1.java
deleted file mode 100644
index 69827f0..0000000
--- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService1.java
+++ /dev/null
@@ -1,10 +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.
-
-package org.chromium.base;
-
-/**
- * A subclass used only to differentiate different test client service process instances.
- */
-public class MultiprocessTestClientService1 extends MultiprocessTestClientService {}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService2.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService2.java
deleted file mode 100644
index aad11f1..0000000
--- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService2.java
+++ /dev/null
@@ -1,10 +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.
-
-package org.chromium.base;
-
-/**
- * A subclass used only to differentiate different test client service process instances.
- */
-public class MultiprocessTestClientService2 extends MultiprocessTestClientService {}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService3.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService3.java
deleted file mode 100644
index 20d2561..0000000
--- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService3.java
+++ /dev/null
@@ -1,10 +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.
-
-package org.chromium.base;
-
-/**
- * A subclass used only to differentiate different test client service process instances.
- */
-public class MultiprocessTestClientService3 extends MultiprocessTestClientService {}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService4.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService4.java
deleted file mode 100644
index 4b14551..0000000
--- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientService4.java
+++ /dev/null
@@ -1,10 +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.
-
-package org.chromium.base;
-
-/**
- * A subclass used only to differentiate different test client service process instances.
- */
-public class MultiprocessTestClientService4 extends MultiprocessTestClientService {}
diff --git a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientServiceDelegate.java b/base/test/android/java/src/org/chromium/base/MultiprocessTestClientServiceDelegate.java
deleted file mode 100644
index 83ccaca..0000000
--- a/base/test/android/java/src/org/chromium/base/MultiprocessTestClientServiceDelegate.java
+++ /dev/null
@@ -1,99 +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.
-package org.chromium.base;
-
-import android.content.Context;
-import android.content.Intent;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.util.SparseArray;
-
-import org.chromium.base.library_loader.LibraryLoader;
-import org.chromium.base.library_loader.LibraryProcessType;
-import org.chromium.base.library_loader.ProcessInitException;
-import org.chromium.base.process_launcher.ChildProcessServiceDelegate;
-import org.chromium.native_test.MainRunner;
-
-import java.util.List;
-
-/** Implementation of the ChildProcessServiceDelegate used for the Multiprocess tests. */
-public class MultiprocessTestClientServiceDelegate implements ChildProcessServiceDelegate {
-    private static final String TAG = "MPTestCSDelegate";
-
-    private ITestCallback mTestCallback;
-
-    private final ITestController.Stub mTestController = new ITestController.Stub() {
-        @Override
-        public boolean forceStopSynchronous(int exitCode) {
-            System.exit(exitCode);
-            return true;
-        }
-
-        @Override
-        public void forceStop(int exitCode) {
-            System.exit(exitCode);
-        }
-    };
-
-    @Override
-    public void onServiceCreated() {
-        PathUtils.setPrivateDataDirectorySuffix("chrome_multiprocess_test_client_service");
-    }
-
-    @Override
-    public void onServiceBound(Intent intent) {}
-
-    @Override
-    public void onConnectionSetup(Bundle connectionBundle, List<IBinder> callbacks) {
-        mTestCallback = ITestCallback.Stub.asInterface(callbacks.get(0));
-    }
-
-    @Override
-    public void onDestroy() {}
-
-    @Override
-    public void preloadNativeLibrary(Context hostContext) {
-        try {
-            LibraryLoader.get(LibraryProcessType.PROCESS_CHILD).preloadNow();
-        } catch (ProcessInitException pie) {
-            Log.w(TAG, "Unable to preload native libraries.", pie);
-        }
-    }
-
-    @Override
-    public boolean loadNativeLibrary(Context hostContext) {
-        try {
-            LibraryLoader.get(LibraryProcessType.PROCESS_CHILD).loadNow();
-            return true;
-        } catch (ProcessInitException pie) {
-            Log.e(TAG, "Unable to load native libraries.", pie);
-            return false;
-        }
-    }
-
-    @Override
-    public SparseArray<String> getFileDescriptorsIdsToKeys() {
-        return null;
-    }
-
-    @Override
-    public void onBeforeMain() {
-        try {
-            mTestCallback.childConnected(mTestController);
-        } catch (RemoteException re) {
-            Log.e(TAG, "Failed to notify parent process of connection.");
-        }
-    }
-
-    @Override
-    public void runMain() {
-        int result = MainRunner.runMain(CommandLine.getJavaSwitchesOrNull());
-        try {
-            mTestCallback.mainReturned(result);
-        } catch (RemoteException re) {
-            Log.e(TAG, "Failed to notify parent process of main returning.");
-        }
-    }
-}
diff --git a/base/test/android/java/src/org/chromium/base/OWNERS b/base/test/android/java/src/org/chromium/base/OWNERS
deleted file mode 100644
index 89442ab..0000000
--- a/base/test/android/java/src/org/chromium/base/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-per-file *.aidl=set noparent
-per-file *.aidl=file://ipc/SECURITY_OWNERS
\ No newline at end of file
diff --git a/base/test/android/java/src/org/chromium/base/TestUiThread.java b/base/test/android/java/src/org/chromium/base/TestUiThread.java
deleted file mode 100644
index 237c0ec..0000000
--- a/base/test/android/java/src/org/chromium/base/TestUiThread.java
+++ /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.
-
-package org.chromium.base;
-
-import android.os.Looper;
-
-import org.chromium.base.annotations.CalledByNative;
-
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.annotation.concurrent.ThreadSafe;
-
-/**
- * Set up a thread as the Chromium UI Thread, and run its looper. This is is intended for C++ unit
- * tests (e.g. the net unit tests) that don't run with the UI thread as their main looper, but test
- * code that, on Android, uses UI thread events, so need a running UI thread.
- */
-@ThreadSafe
-public class TestUiThread {
-    private static final AtomicBoolean sStarted = new AtomicBoolean(false);
-    private static final String TAG = "cr.TestUiThread";
-
-    @CalledByNative
-    private static void loop() {
-        // @{link ThreadUtils#setUiThread(Looper)} can only be called once in a test run, so do this
-        // once, and leave it running.
-        if (sStarted.getAndSet(true)) return;
-
-        final CountDownLatch startLatch = new CountDownLatch(1);
-        new Thread(new Runnable() {
-
-            @Override
-            public void run() {
-                Looper.prepare();
-                ThreadUtils.setUiThread(Looper.myLooper());
-                startLatch.countDown();
-                Looper.loop();
-            }
-
-        }).start();
-
-        try {
-            startLatch.await();
-        } catch (InterruptedException e) {
-            Log.e(TAG, "Failed to set UI Thread");
-        }
-    }
-}
diff --git a/base/test/android/java_handler_thread_helpers.cc b/base/test/android/java_handler_thread_helpers.cc
deleted file mode 100644
index 925dc9d..0000000
--- a/base/test/android/java_handler_thread_helpers.cc
+++ /dev/null
@@ -1,39 +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/android/java_handler_thread_helpers.h"
-
-#include "base/android/java_handler_thread.h"
-#include "base/message_loop/message_loop_current.h"
-#include "base/synchronization/waitable_event.h"
-#include "jni/JavaHandlerThreadHelpers_jni.h"
-
-namespace base {
-namespace android {
-
-// static
-std::unique_ptr<JavaHandlerThread> JavaHandlerThreadHelpers::CreateJavaFirst() {
-  return std::make_unique<JavaHandlerThread>(
-      Java_JavaHandlerThreadHelpers_testAndGetJavaHandlerThread(
-          base::android::AttachCurrentThread()));
-}
-
-// static
-void JavaHandlerThreadHelpers::ThrowExceptionAndAbort(WaitableEvent* event) {
-  JNIEnv* env = AttachCurrentThread();
-  Java_JavaHandlerThreadHelpers_throwException(env);
-  DCHECK(HasException(env));
-  base::MessageLoopCurrentForUI::Get()->Abort();
-  event->Signal();
-}
-
-// static
-bool JavaHandlerThreadHelpers::IsExceptionTestException(
-    ScopedJavaLocalRef<jthrowable> exception) {
-  JNIEnv* env = AttachCurrentThread();
-  return Java_JavaHandlerThreadHelpers_isExceptionTestException(env, exception);
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/test/android/java_handler_thread_helpers.h b/base/test/android/java_handler_thread_helpers.h
deleted file mode 100644
index 5f05cbc..0000000
--- a/base/test/android/java_handler_thread_helpers.h
+++ /dev/null
@@ -1,42 +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_ANDROID_JAVA_HANDLER_THREAD_FOR_TESTING_H_
-#define BASE_ANDROID_JAVA_HANDLER_THREAD_FOR_TESTING_H_
-
-#include <jni.h>
-
-#include <memory>
-
-#include "base/android/scoped_java_ref.h"
-
-namespace base {
-
-class WaitableEvent;
-
-namespace android {
-
-class JavaHandlerThread;
-
-// Test-only helpers for working with JavaHandlerThread.
-class JavaHandlerThreadHelpers {
- public:
-  // Create the Java peer first and test that it works before connecting to the
-  // native object.
-  static std::unique_ptr<JavaHandlerThread> CreateJavaFirst();
-
-  static void ThrowExceptionAndAbort(WaitableEvent* event);
-
-  static bool IsExceptionTestException(
-      ScopedJavaLocalRef<jthrowable> exception);
-
- private:
-  JavaHandlerThreadHelpers() = default;
-  ~JavaHandlerThreadHelpers() = default;
-};
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_ANDROID_JAVA_HANDLER_THREAD_FOR_TESTING_H_
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
deleted file mode 100644
index 59ab519..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
+++ /dev/null
@@ -1,282 +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.
-
-package org.chromium.base.test;
-
-import android.app.Activity;
-import android.app.Application;
-import android.app.Instrumentation;
-import android.content.Context;
-import android.content.pm.InstrumentationInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.os.Bundle;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.internal.runner.RunnerArgs;
-import android.support.test.internal.runner.TestExecutor;
-import android.support.test.internal.runner.TestLoader;
-import android.support.test.internal.runner.TestRequest;
-import android.support.test.internal.runner.TestRequestBuilder;
-import android.support.test.runner.AndroidJUnitRunner;
-
-import dalvik.system.DexFile;
-
-import org.chromium.base.BuildConfig;
-import org.chromium.base.Log;
-import org.chromium.base.annotations.MainDex;
-import org.chromium.base.multidex.ChromiumMultiDexInstaller;
-
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.Enumeration;
-
-/**
- * A custom AndroidJUnitRunner that supports multidex installer and list out test information.
- *
- * This class is the equivalent of BaseChromiumInstrumentationTestRunner in JUnit3. Please
- * beware that is this not a class runner. It is declared in test apk AndroidManifest.xml
- * <instrumentation>
- *
- * TODO(yolandyan): remove this class after all tests are converted to JUnit4. Use class runner
- * for test listing.
- */
-@MainDex
-public class BaseChromiumAndroidJUnitRunner extends AndroidJUnitRunner {
-    private static final String LIST_ALL_TESTS_FLAG =
-            "org.chromium.base.test.BaseChromiumAndroidJUnitRunner.TestList";
-    private static final String LIST_TESTS_PACKAGE_FLAG =
-            "org.chromium.base.test.BaseChromiumAndroidJUnitRunner.TestListPackage";
-    /**
-     * This flag is supported by AndroidJUnitRunner.
-     *
-     * See the following page for detail
-     * https://developer.android.com/reference/android/support/test/runner/AndroidJUnitRunner.html
-     */
-    private static final String ARGUMENT_TEST_PACKAGE = "package";
-
-    /**
-     * The following arguments are corresponding to AndroidJUnitRunner command line arguments.
-     * `annotation`: run with only the argument annotation
-     * `notAnnotation`: run all tests except the ones with argument annotation
-     * `log`: run in log only mode, do not execute tests
-     *
-     * For more detail, please check
-     * https://developer.android.com/reference/android/support/test/runner/AndroidJUnitRunner.html
-     */
-    private static final String ARGUMENT_ANNOTATION = "annotation";
-    private static final String ARGUMENT_NOT_ANNOTATION = "notAnnotation";
-    private static final String ARGUMENT_LOG_ONLY = "log";
-
-    private static final String TAG = "BaseJUnitRunner";
-
-    @Override
-    public Application newApplication(ClassLoader cl, String className, Context context)
-            throws ClassNotFoundException, IllegalAccessException, InstantiationException {
-        // The multidex support library doesn't currently support having the test apk be multidex
-        // as well as the under-test apk being multidex. If MultiDex.install() is called for both,
-        // then re-extraction is triggered every time due to the support library caching only a
-        // single timestamp & crc.
-        //
-        // Attempt to install test apk multidex only if the apk-under-test is not multidex.
-        // It will likely continue to be true that the two are mutually exclusive because:
-        // * ProGuard enabled =>
-        //      Under-test apk is single dex.
-        //      Test apk duplicates under-test classes, so may need multidex.
-        // * ProGuard disabled =>
-        //      Under-test apk might be multidex
-        //      Test apk does not duplicate classes, so does not need multidex.
-        // https://crbug.com/824523
-        if (!BuildConfig.IS_MULTIDEX_ENABLED) {
-            ChromiumMultiDexInstaller.install(new BaseChromiumRunnerCommon.MultiDexContextWrapper(
-                    getContext(), getTargetContext()));
-            BaseChromiumRunnerCommon.reorderDexPathElements(cl, getContext(), getTargetContext());
-        }
-        return super.newApplication(cl, className, context);
-    }
-
-    /**
-     * Add TestListInstrumentationRunListener when argument ask the runner to list tests info.
-     *
-     * The running mechanism when argument has "listAllTests" is equivalent to that of
-     * {@link android.support.test.runner.AndroidJUnitRunner#onStart()} except it adds
-     * only TestListInstrumentationRunListener to monitor the tests.
-     */
-    @Override
-    public void onStart() {
-        Bundle arguments = InstrumentationRegistry.getArguments();
-        if (arguments != null && arguments.getString(LIST_ALL_TESTS_FLAG) != null) {
-            Log.w(TAG,
-                    String.format("Runner will list out tests info in JSON without running tests. "
-                                    + "Arguments: %s",
-                            arguments.toString()));
-            listTests(); // Intentionally not calling super.onStart() to avoid additional work.
-        } else {
-            if (arguments != null && arguments.getString(ARGUMENT_LOG_ONLY) != null) {
-                Log.e(TAG,
-                        String.format("Runner will log the tests without running tests."
-                                        + " If this cause a test run to fail, please report to"
-                                        + " crbug.com/754015. Arguments: %s",
-                                arguments.toString()));
-            }
-            super.onStart();
-        }
-    }
-
-    // TODO(yolandyan): Move this to test harness side once this class gets removed
-    private void addTestListPackage(Bundle bundle) {
-        PackageManager pm = getContext().getPackageManager();
-        InstrumentationInfo info;
-        try {
-            info = pm.getInstrumentationInfo(getComponentName(), PackageManager.GET_META_DATA);
-        } catch (NameNotFoundException e) {
-            Log.e(TAG, String.format("Could not find component %s", getComponentName()));
-            throw new RuntimeException(e);
-        }
-        Bundle metaDataBundle = info.metaData;
-        if (metaDataBundle != null && metaDataBundle.getString(LIST_TESTS_PACKAGE_FLAG) != null) {
-            bundle.putString(
-                    ARGUMENT_TEST_PACKAGE, metaDataBundle.getString(LIST_TESTS_PACKAGE_FLAG));
-        }
-    }
-
-    private void listTests() {
-        Bundle results = new Bundle();
-        TestListInstrumentationRunListener listener = new TestListInstrumentationRunListener();
-        try {
-            TestExecutor.Builder executorBuilder = new TestExecutor.Builder(this);
-            executorBuilder.addRunListener(listener);
-            Bundle junit3Arguments = new Bundle(InstrumentationRegistry.getArguments());
-            junit3Arguments.putString(ARGUMENT_NOT_ANNOTATION, "org.junit.runner.RunWith");
-            addTestListPackage(junit3Arguments);
-            TestRequest listJUnit3TestRequest = createListTestRequest(junit3Arguments);
-            results = executorBuilder.build().execute(listJUnit3TestRequest);
-
-            Bundle junit4Arguments = new Bundle(InstrumentationRegistry.getArguments());
-            junit4Arguments.putString(ARGUMENT_ANNOTATION, "org.junit.runner.RunWith");
-            addTestListPackage(junit4Arguments);
-
-            // Do not use Log runner from android test support.
-            //
-            // Test logging and execution skipping is handled by BaseJUnit4ClassRunner,
-            // having ARGUMENT_LOG_ONLY in argument bundle here causes AndroidJUnitRunner
-            // to use its own log-only class runner instead of BaseJUnit4ClassRunner.
-            junit4Arguments.remove(ARGUMENT_LOG_ONLY);
-
-            TestRequest listJUnit4TestRequest = createListTestRequest(junit4Arguments);
-            results.putAll(executorBuilder.build().execute(listJUnit4TestRequest));
-            listener.saveTestsToJson(
-                    InstrumentationRegistry.getArguments().getString(LIST_ALL_TESTS_FLAG));
-        } catch (IOException | RuntimeException e) {
-            String msg = "Fatal exception when running tests";
-            Log.e(TAG, msg, e);
-            // report the exception to instrumentation out
-            results.putString(Instrumentation.REPORT_KEY_STREAMRESULT,
-                    msg + "\n" + Log.getStackTraceString(e));
-        }
-        finish(Activity.RESULT_OK, results);
-    }
-
-    private TestRequest createListTestRequest(Bundle arguments) {
-        RunnerArgs runnerArgs =
-                new RunnerArgs.Builder().fromManifest(this).fromBundle(arguments).build();
-        TestRequestBuilder builder = new IncrementalInstallTestRequestBuilder(this, arguments);
-        builder.addFromRunnerArgs(runnerArgs);
-        builder.addApkToScan(getContext().getPackageCodePath());
-        return builder.build();
-    }
-
-    static boolean shouldListTests(Bundle arguments) {
-        return arguments != null && arguments.getString(LIST_ALL_TESTS_FLAG) != null;
-    }
-
-    /**
-     * Wraps TestRequestBuilder to make it work with incremental install.
-     */
-    private static class IncrementalInstallTestRequestBuilder extends TestRequestBuilder {
-        boolean mHasClassList;
-
-        public IncrementalInstallTestRequestBuilder(Instrumentation instr, Bundle bundle) {
-            super(instr, bundle);
-        }
-
-        @Override
-        public TestRequestBuilder addTestClass(String className) {
-            mHasClassList = true;
-            return super.addTestClass(className);
-        }
-
-        @Override
-        public TestRequestBuilder addTestMethod(String testClassName, String testMethodName) {
-            mHasClassList = true;
-            return super.addTestMethod(testClassName, testMethodName);
-        }
-
-        @Override
-        public TestRequest build() {
-            // See crbug://841695. TestLoader.isTestClass is incorrectly deciding that
-            // InstrumentationTestSuite is a test class.
-            removeTestClass("android.test.InstrumentationTestSuite");
-            // If a test class was requested, then no need to iterate class loader.
-            if (mHasClassList) {
-                return super.build();
-            }
-            maybeScanIncrementalClasspath();
-            return super.build();
-        }
-
-        private void maybeScanIncrementalClasspath() {
-            DexFile[] incrementalJars = null;
-            try {
-                Class<?> bootstrapClass =
-                        Class.forName("org.chromium.incrementalinstall.BootstrapApplication");
-                incrementalJars =
-                        (DexFile[]) bootstrapClass.getDeclaredField("sIncrementalDexFiles")
-                                .get(null);
-            } catch (Exception e) {
-                // Not an incremental apk.
-            }
-            if (incrementalJars != null) {
-                // builder.addApkToScan uses new DexFile(path) under the hood, which on Dalvik OS's
-                // assumes that the optimized dex is in the default location (crashes).
-                // Perform our own dex file scanning instead as a workaround.
-                addTestClasses(incrementalJars, this);
-            }
-        }
-
-        private boolean startsWithAny(String str, String[] prefixes) {
-            for (String prefix : prefixes) {
-                if (str.startsWith(prefix)) {
-                    return true;
-                }
-            }
-            return false;
-        }
-
-        private void addTestClasses(DexFile[] dexFiles, TestRequestBuilder builder) {
-            Log.i(TAG, "Scanning incremental classpath.");
-            String[] excludedPrefixes;
-            try {
-                Field excludedPackagesField =
-                        TestRequestBuilder.class.getDeclaredField("DEFAULT_EXCLUDED_PACKAGES");
-                excludedPackagesField.setAccessible(true);
-                excludedPrefixes = (String[]) excludedPackagesField.get(null);
-            } catch (Exception e) {
-                throw new RuntimeException(e);
-            }
-
-            // Mirror TestRequestBuilder.getClassNamesFromClassPath().
-            TestLoader loader = new TestLoader();
-            for (DexFile dexFile : dexFiles) {
-                Enumeration<String> classNames = dexFile.entries();
-                while (classNames.hasMoreElements()) {
-                    String className = classNames.nextElement();
-                    if (!className.contains("$") && !startsWithAny(className, excludedPrefixes)
-                            && loader.loadIfTest(className) != null) {
-                        addTestClass(className);
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumRunnerCommon.java b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumRunnerCommon.java
deleted file mode 100644
index e5eb273..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumRunnerCommon.java
+++ /dev/null
@@ -1,162 +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.
-
-package org.chromium.base.test;
-
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.SharedPreferences;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.support.v4.content.ContextCompat;
-
-import org.chromium.android.support.PackageManagerWrapper;
-import org.chromium.base.Log;
-import org.chromium.base.annotations.MainDex;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.Serializable;
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.Comparator;
-
-/**
- *  Functionality common to the JUnit3 and JUnit4 runners.
- */
-@MainDex
-class BaseChromiumRunnerCommon {
-    private static final String TAG = "base_test";
-
-    /**
-     *  A ContextWrapper that allows multidex test APKs to extract secondary dexes into
-     *  the APK under test's data directory.
-     */
-    @MainDex
-    static class MultiDexContextWrapper extends ContextWrapper {
-        private Context mAppContext;
-
-        MultiDexContextWrapper(Context instrContext, Context appContext) {
-            super(instrContext);
-            mAppContext = appContext;
-        }
-
-        @Override
-        public File getFilesDir() {
-            return mAppContext.getFilesDir();
-        }
-
-        @Override
-        public SharedPreferences getSharedPreferences(String name, int mode) {
-            return mAppContext.getSharedPreferences(name, mode);
-        }
-
-        @Override
-        public PackageManager getPackageManager() {
-            return new PackageManagerWrapper(super.getPackageManager()) {
-                @Override
-                public ApplicationInfo getApplicationInfo(String packageName, int flags) {
-                    try {
-                        ApplicationInfo ai = super.getApplicationInfo(packageName, flags);
-                        if (packageName.equals(getPackageName())) {
-                            File dataDir = new File(
-                                    ContextCompat.getCodeCacheDir(mAppContext), "test-multidex");
-                            if (!dataDir.exists() && !dataDir.mkdirs()) {
-                                throw new IOException(String.format(
-                                        "Unable to create test multidex directory \"%s\"",
-                                        dataDir.getPath()));
-                            }
-                            ai.dataDir = dataDir.getPath();
-                        }
-                        return ai;
-                    } catch (Exception e) {
-                        Log.e(TAG, "Failed to get application info for %s", packageName, e);
-                    }
-                    return null;
-                }
-            };
-        }
-    }
-
-    /**
-     * Ensure all test dex entries precede app dex entries.
-     *
-     * @param cl ClassLoader to modify. Assumed to be a derivative of
-     *        {@link dalvik.system.BaseDexClassLoader}. If this isn't
-     *        the case, reordering will fail.
-     */
-    static void reorderDexPathElements(ClassLoader cl, Context context, Context targetContext) {
-        try {
-            Log.i(TAG,
-                    "Reordering dex files. If you're building a multidex test APK and see a "
-                            + "class resolving to an unexpected implementation, this may be why.");
-            Field pathListField = findField(cl, "pathList");
-            Object dexPathList = pathListField.get(cl);
-            Field dexElementsField = findField(dexPathList, "dexElements");
-            Object[] dexElementsList = (Object[]) dexElementsField.get(dexPathList);
-            Arrays.sort(dexElementsList,
-                    new DexListReorderingComparator(
-                            context.getPackageName(), targetContext.getPackageName()));
-            dexElementsField.set(dexPathList, dexElementsList);
-        } catch (Exception e) {
-            Log.e(TAG, "Failed to reorder dex elements for testing.", e);
-        }
-    }
-
-    /**
-     *  Comparator for sorting dex list entries.
-     *
-     *  Using this to sort a list of dex list entries will result in the following order:
-     *   - Strings that contain neither the test package nor the app package in lexicographical
-     *     order.
-     *   - Strings that contain the test package in lexicographical order.
-     *   - Strings that contain the app package but not the test package in lexicographical order.
-     */
-    private static class DexListReorderingComparator implements Comparator<Object>, Serializable {
-        private String mTestPackage;
-        private String mAppPackage;
-
-        public DexListReorderingComparator(String testPackage, String appPackage) {
-            mTestPackage = testPackage;
-            mAppPackage = appPackage;
-        }
-
-        @Override
-        public int compare(Object o1, Object o2) {
-            String s1 = o1.toString();
-            String s2 = o2.toString();
-            if (s1.contains(mTestPackage)) {
-                if (!s2.contains(mTestPackage)) {
-                    if (s2.contains(mAppPackage)) {
-                        return -1;
-                    } else {
-                        return 1;
-                    }
-                }
-            } else if (s1.contains(mAppPackage)) {
-                if (s2.contains(mTestPackage)) {
-                    return 1;
-                } else if (!s2.contains(mAppPackage)) {
-                    return 1;
-                }
-            } else if (s2.contains(mTestPackage) || s2.contains(mAppPackage)) {
-                return -1;
-            }
-            return s1.compareTo(s2);
-        }
-    }
-
-    private static Field findField(Object instance, String name) throws NoSuchFieldException {
-        for (Class<?> clazz = instance.getClass(); clazz != null; clazz = clazz.getSuperclass()) {
-            try {
-                Field f = clazz.getDeclaredField(name);
-                f.setAccessible(true);
-                return f;
-            } catch (NoSuchFieldException e) {
-            }
-        }
-        throw new NoSuchFieldException(
-                "Unable to find field " + name + " in " + instance.getClass());
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java
deleted file mode 100644
index 102e082..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java
+++ /dev/null
@@ -1,242 +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.
-
-package org.chromium.base.test;
-
-import static org.chromium.base.test.BaseChromiumAndroidJUnitRunner.shouldListTests;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.internal.runner.junit4.AndroidJUnit4ClassRunner;
-import android.support.test.internal.util.AndroidRunnerParams;
-
-import org.junit.runner.Description;
-import org.junit.runner.notification.RunNotifier;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.Statement;
-
-import org.chromium.base.CollectionUtil;
-import org.chromium.base.CommandLine;
-import org.chromium.base.ContextUtils;
-import org.chromium.base.Log;
-import org.chromium.base.test.BaseTestResult.PreTestHook;
-import org.chromium.base.test.util.DisableIfSkipCheck;
-import org.chromium.base.test.util.ManualSkipCheck;
-import org.chromium.base.test.util.MinAndroidSdkLevelSkipCheck;
-import org.chromium.base.test.util.RestrictionSkipCheck;
-import org.chromium.base.test.util.SkipCheck;
-
-import java.io.File;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- *  A custom runner for JUnit4 tests that checks requirements to conditionally ignore tests.
- *
- *  This ClassRunner imports from AndroidJUnit4ClassRunner which is a hidden but accessible
- *  class. The reason is that default JUnit4 runner for Android is a final class,
- *  AndroidJUnit4. We need to extends an inheritable class to change {@link #runChild}
- *  and {@link #isIgnored} to add SkipChecks and PreTesthook.
- */
-public class BaseJUnit4ClassRunner extends AndroidJUnit4ClassRunner {
-    private static final String TAG = "BaseJUnit4ClassRunnr";
-    private final List<SkipCheck> mSkipChecks;
-    private final List<PreTestHook> mPreTestHooks;
-
-    private static final String EXTRA_TRACE_FILE =
-            "org.chromium.base.test.BaseJUnit4ClassRunner.TraceFile";
-
-    /**
-     * Create a BaseJUnit4ClassRunner to run {@code klass} and initialize values
-     *
-     * @throws InitializationError if the test class malformed
-     */
-    public BaseJUnit4ClassRunner(final Class<?> klass) throws InitializationError {
-        this(klass, null, null);
-    }
-
-    /**
-     * Create a BaseJUnit4ClassRunner to run {@code klass} and initialize values.
-     *
-     * To add more SkipCheck or PreTestHook in subclass, create Lists of checks and hooks,
-     * pass them into the super constructors. If you want make a subclass extendable by other
-     * class runners, you also have to create a constructor similar to the following one that
-     * merges default checks or hooks with this checks and hooks passed in by constructor.
-     *
-     * <pre>
-     * <code>
-     * e.g.
-     * public ChildRunner extends BaseJUnit4ClassRunner {
-     *     public ChildRunner(final Class<?> klass) {
-     *             throws InitializationError {
-     *         this(klass, null, null);
-     *     }
-     *
-     *     public ChildRunner(
-     *             final Class<?> klass, List<SkipCheck> checks, List<PreTestHook> hook) {
-     *             throws InitializationError {
-     *         super(klass, mergeList(
-     *             checks, defaultSkipChecks()), mergeList(hooks, DEFAULT_HOOKS));
-     *     }
-     *
-     *     public List<SkipCheck> defaultSkipChecks() {...}
-     *
-     *     public List<PreTestHook> defaultPreTestHooks() {...}
-     * </code>
-     * </pre>
-     *
-     * @throws InitializationError if the test class malformed
-     */
-    public BaseJUnit4ClassRunner(
-            final Class<?> klass, List<SkipCheck> checks, List<PreTestHook> hooks)
-            throws InitializationError {
-        super(klass,
-                new AndroidRunnerParams(InstrumentationRegistry.getInstrumentation(),
-                        InstrumentationRegistry.getArguments(), false, 0L, false));
-
-        String traceOutput = InstrumentationRegistry.getArguments().getString(EXTRA_TRACE_FILE);
-
-        if (traceOutput != null) {
-            File traceOutputFile = new File(traceOutput);
-            File traceOutputDir = traceOutputFile.getParentFile();
-
-            if (traceOutputDir != null) {
-                if (traceOutputDir.exists() || traceOutputDir.mkdirs()) {
-                    TestTraceEvent.enable(traceOutputFile);
-                }
-            }
-        }
-
-        mSkipChecks = mergeList(checks, defaultSkipChecks());
-        mPreTestHooks = mergeList(hooks, defaultPreTestHooks());
-    }
-
-    /**
-     * Merge two List into a new ArrayList.
-     *
-     * Used to merge the default SkipChecks/PreTestHooks with the subclasses's
-     * SkipChecks/PreTestHooks.
-     */
-    protected static final <T> List<T> mergeList(List<T> listA, List<T> listB) {
-        List<T> l = new ArrayList<>();
-        if (listA != null) {
-            l.addAll(listA);
-        }
-        if (listB != null) {
-            l.addAll(listB);
-        }
-        return l;
-    }
-
-    @Override
-    protected void collectInitializationErrors(List<Throwable> errors) {
-        super.collectInitializationErrors(errors);
-        // Log any initialization errors to help debugging, as the host-side test runner can get
-        // confused by the thrown exception.
-        if (!errors.isEmpty()) {
-            Log.e(TAG, "Initialization errors in %s: %s", getTestClass().getName(), errors);
-        }
-    }
-
-    /**
-     * Change this static function to add or take out default {@code SkipCheck}s.
-     */
-    private static List<SkipCheck> defaultSkipChecks() {
-        return CollectionUtil.newArrayList(
-                new RestrictionSkipCheck(InstrumentationRegistry.getTargetContext()),
-                new MinAndroidSdkLevelSkipCheck(), new DisableIfSkipCheck(), new ManualSkipCheck());
-    }
-
-    /**
-     * Change this static function to add or take out default {@code PreTestHook}s.
-     */
-    private static List<PreTestHook> defaultPreTestHooks() {
-        return null;
-    }
-
-    /**
-     * Evaluate whether a FrameworkMethod is ignored based on {@code SkipCheck}s.
-     */
-    @Override
-    protected boolean isIgnored(FrameworkMethod method) {
-        return super.isIgnored(method) || shouldSkip(method);
-    }
-
-    /**
-     * Run test with or without execution based on bundle arguments.
-     */
-    @Override
-    public void run(RunNotifier notifier) {
-        ContextUtils.initApplicationContext(
-                InstrumentationRegistry.getTargetContext().getApplicationContext());
-        if (shouldListTests(InstrumentationRegistry.getArguments())) {
-            for (Description child : getDescription().getChildren()) {
-                notifier.fireTestStarted(child);
-                notifier.fireTestFinished(child);
-            }
-        } else {
-            if (!CommandLine.isInitialized()) {
-                initCommandLineForTest();
-            }
-            super.run(notifier);
-        }
-    }
-
-    /**
-     * Override this method to change how test class runner initiate commandline flags
-     */
-    protected void initCommandLineForTest() {
-        CommandLine.init(null);
-    }
-
-    @Override
-    protected void runChild(FrameworkMethod method, RunNotifier notifier) {
-        String testName = method.getName();
-        TestTraceEvent.begin(testName);
-
-        runPreTestHooks(method);
-
-        super.runChild(method, notifier);
-
-        TestTraceEvent.end(testName);
-
-        // A new instance of BaseJUnit4ClassRunner is created on the device
-        // for each new method, so runChild will only be called once. Thus, we
-        // can disable tracing, and dump the output, once we get here.
-        TestTraceEvent.disable();
-    }
-
-    /**
-     * Loop through all the {@code PreTestHook}s to run them
-     */
-    private void runPreTestHooks(FrameworkMethod frameworkMethod) {
-        Method testMethod = frameworkMethod.getMethod();
-        Context targetContext = InstrumentationRegistry.getTargetContext();
-        for (PreTestHook hook : mPreTestHooks) {
-            hook.run(targetContext, testMethod);
-        }
-    }
-
-    /**
-     * Loop through all the {@code SkipCheck}s to confirm whether a test should be ignored
-     */
-    private boolean shouldSkip(FrameworkMethod method) {
-        for (SkipCheck s : mSkipChecks) {
-            if (s.shouldSkip(method)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /*
-     * Overriding this method to take screenshot of failure before tear down functions are run.
-     */
-    @Override
-    protected Statement withAfters(FrameworkMethod method, Object test, Statement base) {
-        return super.withAfters(method, test, new ScreenshotOnFailureStatement(base));
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseTestResult.java b/base/test/android/javatests/src/org/chromium/base/test/BaseTestResult.java
deleted file mode 100644
index a80e0cc..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/BaseTestResult.java
+++ /dev/null
@@ -1,137 +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.
-
-package org.chromium.base.test;
-
-import android.app.Instrumentation;
-import android.content.Context;
-import android.os.Bundle;
-import android.os.SystemClock;
-
-import junit.framework.TestCase;
-import junit.framework.TestResult;
-
-import org.chromium.base.Log;
-import org.chromium.base.test.util.SkipCheck;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A test result that can skip tests.
- */
-public class BaseTestResult extends TestResult {
-    private static final String TAG = "base_test";
-
-    private static final int SLEEP_INTERVAL_MS = 50;
-    private static final int WAIT_DURATION_MS = 5000;
-
-    private final Instrumentation mInstrumentation;
-    private final List<SkipCheck> mSkipChecks;
-    private final List<PreTestHook> mPreTestHooks;
-
-    /**
-     * Creates an instance of BaseTestResult.
-     */
-    public BaseTestResult(Instrumentation instrumentation) {
-        mSkipChecks = new ArrayList<>();
-        mPreTestHooks = new ArrayList<>();
-        mInstrumentation = instrumentation;
-    }
-
-    /**
-     * An interface for classes that have some code to run before a test. They run after
-     * {@link SkipCheck}s. Provides access to the test method (and the annotations defined for it)
-     * and the instrumentation context.
-     */
-    public interface PreTestHook {
-        /**
-         * @param targetContext the instrumentation context that will be used during the test.
-         * @param testMethod the test method to be run.
-         */
-        public void run(Context targetContext, Method testMethod);
-    }
-
-    /**
-     * Adds a check for whether a test should run.
-     *
-     * @param skipCheck The check to add.
-     */
-    public void addSkipCheck(SkipCheck skipCheck) {
-        mSkipChecks.add(skipCheck);
-    }
-
-    /**
-     * Adds hooks that will be executed before each test that runs.
-     *
-     * @param preTestHook The hook to add.
-     */
-    public void addPreTestHook(PreTestHook preTestHook) {
-        mPreTestHooks.add(preTestHook);
-    }
-
-    protected boolean shouldSkip(TestCase test) {
-        for (SkipCheck s : mSkipChecks) {
-            if (s.shouldSkip(test)) return true;
-        }
-        return false;
-    }
-
-    private void runPreTestHooks(TestCase test) {
-        try {
-            Method testMethod = test.getClass().getMethod(test.getName());
-            Context targetContext = getTargetContext();
-
-            for (PreTestHook hook : mPreTestHooks) {
-                hook.run(targetContext, testMethod);
-            }
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Unable to run pre test hooks.", e);
-        }
-    }
-
-    @Override
-    protected void run(TestCase test) {
-        runPreTestHooks(test);
-
-        if (shouldSkip(test)) {
-            startTest(test);
-
-            Bundle skipResult = new Bundle();
-            skipResult.putString("class", test.getClass().getName());
-            skipResult.putString("test", test.getName());
-            skipResult.putBoolean("test_skipped", true);
-            mInstrumentation.sendStatus(0, skipResult);
-
-            endTest(test);
-        } else {
-            super.run(test);
-        }
-    }
-
-    /**
-     * Gets the target context.
-     *
-     * On older versions of Android, getTargetContext() may initially return null, so we have to
-     * wait for it to become available.
-     *
-     * @return The target {@link Context} if available; null otherwise.
-     */
-    public Context getTargetContext() {
-        Context targetContext = mInstrumentation.getTargetContext();
-        try {
-            long startTime = SystemClock.uptimeMillis();
-            // TODO(jbudorick): Convert this to CriteriaHelper once that moves to base/.
-            while (targetContext == null
-                    && SystemClock.uptimeMillis() - startTime < WAIT_DURATION_MS) {
-                Thread.sleep(SLEEP_INTERVAL_MS);
-                targetContext = mInstrumentation.getTargetContext();
-            }
-        } catch (InterruptedException e) {
-            Log.e(TAG, "Interrupted while attempting to initialize the command line.");
-        }
-        return targetContext;
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java b/base/test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java
deleted file mode 100644
index 397e8ab..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/ScreenshotOnFailureStatement.java
+++ /dev/null
@@ -1,83 +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.
-
-package org.chromium.base.test;
-
-import android.support.test.InstrumentationRegistry;
-import android.support.test.uiautomator.UiDevice;
-
-import org.junit.runners.model.Statement;
-
-import org.chromium.base.Log;
-
-import java.io.File;
-
-/**
- * Statement that captures screenshots if |base| statement fails.
- *
- * If --screenshot-path commandline flag is given, this |Statement|
- * will save a screenshot to the specified path in the case of a test failure.
- */
-public class ScreenshotOnFailureStatement extends Statement {
-    private static final String TAG = "ScreenshotOnFail";
-
-    private static final String EXTRA_SCREENSHOT_FILE =
-            "org.chromium.base.test.ScreenshotOnFailureStatement.ScreenshotFile";
-
-    private final Statement mBase;
-
-    public ScreenshotOnFailureStatement(final Statement base) {
-        mBase = base;
-    }
-
-    @Override
-    public void evaluate() throws Throwable {
-        try {
-            mBase.evaluate();
-        } catch (Throwable e) {
-            takeScreenshot();
-            throw e;
-        }
-    }
-
-    private void takeScreenshot() {
-        String screenshotFilePath =
-                InstrumentationRegistry.getArguments().getString(EXTRA_SCREENSHOT_FILE);
-        if (screenshotFilePath == null) {
-            Log.d(TAG,
-                    String.format("Did not save screenshot of failure. Must specify %s "
-                                    + "instrumentation argument to enable this feature.",
-                            EXTRA_SCREENSHOT_FILE));
-            return;
-        }
-
-        UiDevice uiDevice = null;
-        try {
-            uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
-        } catch (RuntimeException ex) {
-            Log.d(TAG, "Failed to initialize UiDevice", ex);
-            return;
-        }
-
-        File screenshotFile = new File(screenshotFilePath);
-        File screenshotDir = screenshotFile.getParentFile();
-        if (screenshotDir == null) {
-            Log.d(TAG,
-                    String.format(
-                            "Failed to create parent directory for %s. Can't save screenshot.",
-                            screenshotFile));
-            return;
-        }
-        if (!screenshotDir.exists()) {
-            if (!screenshotDir.mkdirs()) {
-                Log.d(TAG,
-                        String.format(
-                                "Failed to create %s. Can't save screenshot.", screenshotDir));
-                return;
-            }
-        }
-        Log.d(TAG, String.format("Saving screenshot of test failure, %s", screenshotFile));
-        uiDevice.takeScreenshot(screenshotFile);
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/SetUpStatement.java b/base/test/android/javatests/src/org/chromium/base/test/SetUpStatement.java
deleted file mode 100644
index 30ac2b6..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/SetUpStatement.java
+++ /dev/null
@@ -1,35 +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.
-
-package org.chromium.base.test;
-
-import org.junit.rules.TestRule;
-import org.junit.runners.model.Statement;
-
-/**
- * Custom Statement for SetUpTestRules.
- *
- * Calls {@link SetUpTestRule#setUp} before evaluating {@link SetUpTestRule#base} if
- * {@link SetUpTestRule#shouldSetUp} is true
- */
-public class SetUpStatement extends Statement {
-    private final Statement mBase;
-    private final SetUpTestRule<? extends TestRule> mSetUpTestRule;
-    private final boolean mShouldSetUp;
-
-    public SetUpStatement(
-            final Statement base, SetUpTestRule<? extends TestRule> callback, boolean shouldSetUp) {
-        mBase = base;
-        mSetUpTestRule = callback;
-        mShouldSetUp = shouldSetUp;
-    }
-
-    @Override
-    public void evaluate() throws Throwable {
-        if (mShouldSetUp) {
-            mSetUpTestRule.setUp();
-        }
-        mBase.evaluate();
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/SetUpTestRule.java b/base/test/android/javatests/src/org/chromium/base/test/SetUpTestRule.java
deleted file mode 100644
index 57dd8db..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/SetUpTestRule.java
+++ /dev/null
@@ -1,35 +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.
-
-package org.chromium.base.test;
-
-import org.junit.rules.TestRule;
-
-/**
- * An interface for TestRules that can be configured to automatically run set-up logic prior
- * to &#064;Before.
- *
- * TestRules that implement this interface should return a {@link SetUpStatement} from their {@link
- * TestRule#apply} method
- *
- * @param <T> TestRule type that implements this SetUpTestRule
- */
-public interface SetUpTestRule<T extends TestRule> {
-    /**
-     * Set whether the TestRule should run setUp automatically.
-     *
-     * So TestRule can be declared in test like this:
-     * <code>
-     * &#064;Rule TestRule mRule = new MySetUpTestRule().shouldSetUp(true);
-     * </code>
-     *
-     * @return itself to chain up the calls for convenience
-     */
-    T shouldSetUp(boolean runSetUp);
-
-    /**
-     * Specify setUp action in this method
-     */
-    void setUp();
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/TestChildProcessConnection.java b/base/test/android/javatests/src/org/chromium/base/test/TestChildProcessConnection.java
deleted file mode 100644
index ae91b44..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/TestChildProcessConnection.java
+++ /dev/null
@@ -1,87 +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.
-
-package org.chromium.base.test;
-
-import android.content.ComponentName;
-import android.content.Intent;
-import android.os.Bundle;
-
-import org.chromium.base.process_launcher.ChildProcessConnection;
-
-/** An implementation of ChildProcessConnection that does not connect to a real service. */
-public class TestChildProcessConnection extends ChildProcessConnection {
-    private static class MockChildServiceConnection
-            implements ChildProcessConnection.ChildServiceConnection {
-        private boolean mBound;
-
-        @Override
-        public boolean bind() {
-            mBound = true;
-            return true;
-        }
-
-        @Override
-        public void unbind() {
-            mBound = false;
-        }
-
-        @Override
-        public boolean isBound() {
-            return mBound;
-        }
-    }
-
-    private int mPid;
-    private boolean mConnected;
-    private ServiceCallback mServiceCallback;
-
-    /**
-     * Creates a mock binding corresponding to real ManagedChildProcessConnection after the
-     * connection is established: with initial binding bound and no strong binding.
-     */
-    public TestChildProcessConnection(ComponentName serviceName, boolean bindToCaller,
-            boolean bindAsExternalService, Bundle serviceBundle) {
-        super(null /* context */, serviceName, bindToCaller, bindAsExternalService, serviceBundle,
-                new ChildServiceConnectionFactory() {
-                    @Override
-                    public ChildServiceConnection createConnection(Intent bindIntent, int bindFlags,
-                            ChildServiceConnectionDelegate delegate) {
-                        return new MockChildServiceConnection();
-                    }
-                });
-    }
-
-    public void setPid(int pid) {
-        mPid = pid;
-    }
-
-    @Override
-    public int getPid() {
-        return mPid;
-    }
-
-    // We don't have a real service so we have to mock the connection status.
-    @Override
-    public void start(boolean useStrongBinding, ServiceCallback serviceCallback) {
-        super.start(useStrongBinding, serviceCallback);
-        mConnected = true;
-        mServiceCallback = serviceCallback;
-    }
-
-    @Override
-    public void stop() {
-        super.stop();
-        mConnected = false;
-    }
-
-    @Override
-    public boolean isConnected() {
-        return mConnected;
-    }
-
-    public ServiceCallback getServiceCallback() {
-        return mServiceCallback;
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/TestListInstrumentationRunListener.java b/base/test/android/javatests/src/org/chromium/base/test/TestListInstrumentationRunListener.java
deleted file mode 100644
index 8cde570..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/TestListInstrumentationRunListener.java
+++ /dev/null
@@ -1,142 +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.
-
-package org.chromium.base.test;
-
-import android.support.test.internal.runner.listener.InstrumentationRunListener;
-
-import org.json.JSONArray;
-import org.json.JSONObject;
-import org.junit.runner.Description;
-
-import org.chromium.base.Log;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A RunListener that list out all the test information into a json file.
- */
-public class TestListInstrumentationRunListener extends InstrumentationRunListener {
-    private static final String TAG = "TestListRunListener";
-    private static final Set<String> SKIP_METHODS = new HashSet<>(
-            Arrays.asList(new String[] {"toString", "hashCode", "annotationType", "equals"}));
-
-    private final Map<Class<?>, JSONObject> mTestClassJsonMap = new HashMap<>();
-
-    /**
-     * Store the test method description to a Map at the beginning of a test run.
-     */
-    @Override
-    public void testStarted(Description desc) throws Exception {
-        if (mTestClassJsonMap.containsKey(desc.getTestClass())) {
-            ((JSONArray) mTestClassJsonMap.get(desc.getTestClass()).get("methods"))
-                .put(getTestMethodJSON(desc));
-        } else {
-            Class<?> testClass = desc.getTestClass();
-            mTestClassJsonMap.put(desc.getTestClass(), new JSONObject()
-                    .put("class", testClass.getName())
-                    .put("superclass", testClass.getSuperclass().getName())
-                    .put("annotations",
-                            getAnnotationJSON(Arrays.asList(testClass.getAnnotations())))
-                    .put("methods", new JSONArray().put(getTestMethodJSON(desc))));
-        }
-    }
-
-    /**
-     * Create a JSONArray with all the test class JSONObjects and save it to listed output path.
-     */
-    public void saveTestsToJson(String outputPath) throws IOException {
-        Writer writer = null;
-        File file = new File(outputPath);
-        try {
-            writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
-            JSONArray allTestClassesJSON = new JSONArray(mTestClassJsonMap.values());
-            writer.write(allTestClassesJSON.toString());
-        } catch (IOException e) {
-            Log.e(TAG, "failed to write json to file", e);
-            throw e;
-        } finally {
-            if (writer != null) {
-                try {
-                    writer.close();
-                } catch (IOException e) {
-                    // Intentionally ignore IOException when closing writer
-                }
-            }
-        }
-    }
-
-    /**
-     * Return a JSONOject that represent a Description of a method".
-     */
-    static JSONObject getTestMethodJSON(Description desc) throws Exception {
-        return new JSONObject()
-                .put("method", desc.getMethodName())
-                .put("annotations", getAnnotationJSON(desc.getAnnotations()));
-    }
-
-    /**
-     * Create a JSONObject that represent a collection of anntations.
-     *
-     * For example, for the following group of annotations for ExampleClass
-     * <code>
-     * @A
-     * @B(message = "hello", level = 3)
-     * public class ExampleClass() {}
-     * </code>
-     *
-     * This method would return a JSONObject as such:
-     * <code>
-     * {
-     *   "A": {},
-     *   "B": {
-     *     "message": "hello",
-     *     "level": "3"
-     *   }
-     * }
-     * </code>
-     *
-     * The method accomplish this by though through each annotation and reflectively call the
-     * annotation's method to get the element value, with exceptions to methods like "equals()"
-     * or "hashCode".
-     */
-    static JSONObject getAnnotationJSON(Collection<Annotation> annotations)
-            throws Exception {
-        JSONObject annotationsJsons = new JSONObject();
-        for (Annotation a : annotations) {
-            JSONObject elementJsonObject = new JSONObject();
-            for (Method method : a.annotationType().getMethods()) {
-                if (SKIP_METHODS.contains(method.getName())) {
-                    continue;
-                }
-                try {
-                    Object value = method.invoke(a);
-                    if (value == null) {
-                        elementJsonObject.put(method.getName(), null);
-                    } else {
-                        elementJsonObject.put(method.getName(),
-                                value.getClass().isArray()
-                                        ? new JSONArray(Arrays.asList((Object[]) value))
-                                        : value.toString());
-                    }
-                } catch (IllegalArgumentException e) {
-                }
-            }
-            annotationsJsons.put(a.annotationType().getSimpleName(), elementJsonObject);
-        }
-        return annotationsJsons;
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/TestTraceEvent.java b/base/test/android/javatests/src/org/chromium/base/test/TestTraceEvent.java
deleted file mode 100644
index 5e0f6b3..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/TestTraceEvent.java
+++ /dev/null
@@ -1,168 +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.
-
-package org.chromium.base.test;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import org.chromium.base.Log;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.PrintStream;
-
-/**
- * TestTraceEvent is a modified version of TraceEvent, intended for tracing test runs.
- */
-public class TestTraceEvent {
-    private static final String TAG = "TestTraceEvent";
-
-    /** The event types understood by the trace scripts. */
-    private enum EventType {
-        BEGIN("B"),
-        END("E"),
-        INSTANT("I");
-
-        private final String mTypeStr;
-
-        EventType(String typeStr) {
-            mTypeStr = typeStr;
-        }
-
-        @Override
-        public String toString() {
-            return mTypeStr;
-        }
-    }
-
-    // Locks internal fields.
-    private static final Object sLock = new Object();
-
-    private static File sOutputFile;
-
-    private static boolean sEnabled;
-
-    // A list of trace event strings.
-    private static JSONArray sTraceStrings;
-
-    /**
-     * Enable tracing, and set a specific output file. If tracing was previously enabled and
-     * disabled, that data is cleared.
-     *
-     * @param file Which file to append the trace data to.
-     */
-    public static void enable(File outputFile) {
-        synchronized (sLock) {
-            if (sEnabled) return;
-
-            sEnabled = true;
-            sOutputFile = outputFile;
-            sTraceStrings = new JSONArray();
-        }
-    }
-
-    /**
-     * Disabling of tracing will dump trace data to the system log.
-     */
-    public static void disable() {
-        synchronized (sLock) {
-            if (!sEnabled) return;
-
-            sEnabled = false;
-            dumpTraceOutput();
-            sTraceStrings = null;
-        }
-    }
-
-    /**
-     * @return True if tracing is enabled, false otherwise.
-     */
-    public static boolean isEnabled() {
-        synchronized (sLock) {
-            return sEnabled;
-        }
-    }
-
-    /**
-     * Record an "instant" trace event. E.g. "screen update happened".
-     */
-    public static void instant(String name) {
-        synchronized (sLock) {
-            if (!sEnabled) return;
-
-            saveTraceString(name, name.hashCode(), EventType.INSTANT);
-        }
-    }
-
-    /**
-     * Record an "begin" trace event. Begin trace events should have a matching end event (recorded
-     * by calling {@link #end(String)}).
-     */
-    public static void begin(String name) {
-        synchronized (sLock) {
-            if (!sEnabled) return;
-
-            saveTraceString(name, name.hashCode(), EventType.BEGIN);
-        }
-    }
-
-    /**
-     * Record an "end" trace event, to match a begin event (recorded by calling {@link
-     * #begin(String)}). The time delta between begin and end is usually interesting to graph code.
-     */
-    public static void end(String name) {
-        synchronized (sLock) {
-            if (!sEnabled) return;
-
-            saveTraceString(name, name.hashCode(), EventType.END);
-        }
-    }
-
-    /**
-     * Save a trace event as a JSON dict.
-     *
-     * @param name The trace data.
-     * @param id An identifier for the event, to be saved as the thread ID.
-     * @param type the type of trace event (B, E, I).
-     */
-    private static void saveTraceString(String name, long id, EventType type) {
-        // We use System.currentTimeMillis() because it agrees with the value of
-        // the $EPOCHREALTIME environment variable. The Python test runner code
-        // uses that variable to synchronize timing.
-        long timeMicroseconds = System.currentTimeMillis() * 1000;
-
-        try {
-            JSONObject traceObj = new JSONObject();
-            traceObj.put("cat", "Java");
-            traceObj.put("ts", timeMicroseconds);
-            traceObj.put("ph", type);
-            traceObj.put("name", name);
-            traceObj.put("tid", id);
-
-            sTraceStrings.put(traceObj);
-        } catch (JSONException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    /**
-     * Dump all tracing data we have saved up to the log.
-     * Output as JSON for parsing convenience.
-     */
-    private static void dumpTraceOutput() {
-        try {
-            PrintStream stream = new PrintStream(new FileOutputStream(sOutputFile, true));
-            try {
-                stream.print(sTraceStrings);
-            } finally {
-                if (stream != null) stream.close();
-            }
-        } catch (FileNotFoundException ex) {
-            Log.e(TAG, "Unable to dump trace data to output file.");
-        }
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java b/base/test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java
deleted file mode 100644
index c0dcd46..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.params;
-
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.chromium.base.test.params.ParameterizedRunner.ParameterizedTestInstantiationException;
-
-import java.util.List;
-
-/**
- * Class runner delegate that extends BaseJUnit4ClassRunner
- */
-public final class BaseJUnit4RunnerDelegate
-        extends BaseJUnit4ClassRunner implements ParameterizedRunnerDelegate {
-    private ParameterizedRunnerDelegateCommon mDelegateCommon;
-
-    public BaseJUnit4RunnerDelegate(Class<?> klass,
-            ParameterizedRunnerDelegateCommon delegateCommon) throws InitializationError {
-        super(klass);
-        mDelegateCommon = delegateCommon;
-    }
-
-    @Override
-    public void collectInitializationErrors(List<Throwable> errors) {
-        ParameterizedRunnerDelegateCommon.collectInitializationErrors(errors);
-    }
-
-    @Override
-    public List<FrameworkMethod> computeTestMethods() {
-        return mDelegateCommon.computeTestMethods();
-    }
-
-    @Override
-    public Object createTest() throws ParameterizedTestInstantiationException {
-        return mDelegateCommon.createTest();
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java b/base/test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java
deleted file mode 100644
index 7c948bb..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.params;
-
-import org.junit.runners.BlockJUnit4ClassRunner;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-
-import org.chromium.base.test.params.ParameterizedRunner.ParameterizedTestInstantiationException;
-
-import java.util.List;
-
-/**
- * Parameterized class runner delegate that extends BlockJUnit4ClassRunner
- */
-public final class BlockJUnit4RunnerDelegate
-        extends BlockJUnit4ClassRunner implements ParameterizedRunnerDelegate {
-    private ParameterizedRunnerDelegateCommon mDelegateCommon;
-
-    public BlockJUnit4RunnerDelegate(Class<?> klass,
-            ParameterizedRunnerDelegateCommon delegateCommon) throws InitializationError {
-        super(klass);
-        mDelegateCommon = delegateCommon;
-    }
-
-    @Override
-    public void collectInitializationErrors(List<Throwable> errors) {
-        ParameterizedRunnerDelegateCommon.collectInitializationErrors(errors);
-    }
-
-    @Override
-    public List<FrameworkMethod> computeTestMethods() {
-        return mDelegateCommon.computeTestMethods();
-    }
-
-    @Override
-    public Object createTest() throws ParameterizedTestInstantiationException {
-        return mDelegateCommon.createTest();
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamAnnotationRule.java b/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamAnnotationRule.java
deleted file mode 100644
index 2986b96..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamAnnotationRule.java
+++ /dev/null
@@ -1,62 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.runners.model.Statement;
-
-import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameterAfter;
-import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameterBefore;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Processes {@link UseMethodParameterBefore} and {@link UseMethodParameterAfter} annotations to run
- * the corresponding methods. To use, add an instance to the test class and annotate it with
- * {@code @}{@link org.junit.Rule Rule}.
- */
-public class MethodParamAnnotationRule extends MethodParamRule {
-    @Override
-    protected Statement applyParameterAndValues(final Statement base, Object target,
-            Class<? extends ParameterProvider> parameterProvider, List<Object> values) {
-        final List<Method> beforeMethods = new ArrayList<>();
-        final List<Method> afterMethods = new ArrayList<>();
-        for (Method m : target.getClass().getDeclaredMethods()) {
-            if (!m.getReturnType().equals(Void.TYPE)) continue;
-            if (!Modifier.isPublic(m.getModifiers())) continue;
-
-            UseMethodParameterBefore beforeAnnotation =
-                    m.getAnnotation(UseMethodParameterBefore.class);
-            if (beforeAnnotation != null && beforeAnnotation.value().equals(parameterProvider)) {
-                beforeMethods.add(m);
-            }
-
-            UseMethodParameterAfter afterAnnotation =
-                    m.getAnnotation(UseMethodParameterAfter.class);
-            if (afterAnnotation != null && afterAnnotation.value().equals(parameterProvider)) {
-                afterMethods.add(m);
-            }
-        }
-
-        if (beforeMethods.isEmpty() && afterMethods.isEmpty()) return base;
-
-        return new Statement() {
-            @Override
-            public void evaluate() throws Throwable {
-                for (Method m : beforeMethods) {
-                    m.invoke(target, values.toArray());
-                }
-
-                base.evaluate();
-
-                for (Method m : afterMethods) {
-                    m.invoke(target, values.toArray());
-                }
-            }
-        };
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamRule.java b/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamRule.java
deleted file mode 100644
index 440831a..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/MethodParamRule.java
+++ /dev/null
@@ -1,35 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.rules.MethodRule;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.Statement;
-
-import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter;
-
-import java.util.List;
-
-/**
- * Abstract base class for rules that are applied to test methods using
- * {@link org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter method parameters}.
- */
-public abstract class MethodParamRule implements MethodRule {
-    @Override
-    public Statement apply(final Statement base, FrameworkMethod method, Object target) {
-        UseMethodParameter useParameterProvider = method.getAnnotation(UseMethodParameter.class);
-        if (useParameterProvider == null) return base;
-        Class<? extends ParameterProvider> parameterProvider = useParameterProvider.value();
-
-        if (!(method instanceof ParameterizedFrameworkMethod)) return base;
-        ParameterSet parameters = ((ParameterizedFrameworkMethod) method).getParameterSet();
-        List<Object> values = parameters.getValues();
-
-        return applyParameterAndValues(base, target, parameterProvider, values);
-    }
-
-    protected abstract Statement applyParameterAndValues(final Statement base, Object target,
-            Class<? extends ParameterProvider> parameterProvider, List<Object> values);
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterAnnotations.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterAnnotations.java
deleted file mode 100644
index 7918369..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterAnnotations.java
+++ /dev/null
@@ -1,78 +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.
-
-package org.chromium.base.test.params;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotations for Parameterized Tests
- */
-public class ParameterAnnotations {
-    /**
-     * Annotation for test methods to indicate associated {@link ParameterProvider}.
-     * Note: the class referred to must be public and have a public default constructor.
-     */
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target(ElementType.METHOD)
-    public @interface UseMethodParameter {
-        Class<? extends ParameterProvider> value();
-    }
-
-    /**
-     * Annotation for methods that should be called before running a test with method parameters.
-     *
-     * In order to use this, add a {@link MethodParamAnnotationRule} annotated with
-     * {@code @}{@link org.junit.Rule Rule} to your test class.
-     * @see ParameterProvider
-     * @see UseMethodParameterAfter
-     */
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target(ElementType.METHOD)
-    public @interface UseMethodParameterBefore {
-        Class<? extends ParameterProvider> value();
-    }
-
-    /**
-     * Annotation for methods that should be called after running a test with method parameters.
-     *
-     * In order to use this, add a {@link MethodParamAnnotationRule} annotated with
-     * {@code @}{@link org.junit.Rule Rule} to your test class.
-     * @see ParameterProvider
-     * @see UseMethodParameterBefore
-     */
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target(ElementType.METHOD)
-    public @interface UseMethodParameterAfter {
-        Class<? extends ParameterProvider> value();
-    }
-
-    /**
-     * Annotation for static field of a `List<ParameterSet>` for entire test class
-     */
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target(ElementType.FIELD)
-    public @interface ClassParameter {}
-
-    /**
-     * Annotation for static field of a `List<ParameterSet>` of TestRule
-     */
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target(ElementType.FIELD)
-    public @interface RuleParameter {}
-
-    /**
-     * Annotation for test class, it specifies which ParameterizeRunnerDelegate to use.
-     *
-     * The default ParameterizedRunnerDelegate is BaseJUnit4RunnerDelegate.class
-     */
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target(ElementType.TYPE)
-    public @interface UseRunnerDelegate {
-        Class<? extends ParameterizedRunnerDelegate> value();
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterProvider.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterProvider.java
deleted file mode 100644
index 9bf27bd..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterProvider.java
+++ /dev/null
@@ -1,11 +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.
-
-package org.chromium.base.test.params;
-
-/**
- * Generator to use generate arguments for parameterized test methods.
- * @see ParameterAnnotations.UseMethodParameter
- */
-public interface ParameterProvider { Iterable<ParameterSet> getParameters(); }
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterSet.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterSet.java
deleted file mode 100644
index 1cdb576..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterSet.java
+++ /dev/null
@@ -1,129 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.Assert;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Callable;
-
-/**
- * A set of parameters for one *SINGLE* test method or test class constructor.
- *
- * For example, <code>new ParameterSet().value("a", "b")</code> is intended for
- * a test method/constructor that takes in two string as arguments.
- * <code>public void testSimple(String a, String b) {...}</code>
- * or
- * <code>public MyTestClass(String a, String b) {...}</code>
- *
- * To parameterize testSimple or MyTestClass's tests, create multiple ParameterSets
- * <code>
- * static List<ParameterSet> sAllParameterSets = new ArrayList<>();
- * static {
- *   sAllParameterSets.add(new ParameterSet().value("a", "b");
- *   sAllParameterSets.add(new ParameterSet().value("c", "d");
- * }
- */
-public class ParameterSet {
-    private List<Object> mValues;
-    private String mName;
-
-    public ParameterSet() {}
-
-    public ParameterSet value(Object firstArg, Object... objects) {
-        List<Object> parameterList = new ArrayList<Object>();
-        parameterList.add(firstArg);
-        parameterList.addAll(Arrays.asList(objects));
-        Assert.assertTrue(
-                "Can not create ParameterSet with no parameters", parameterList.size() != 0);
-        mValues = validateAndCopy(parameterList);
-        return this;
-    }
-
-    public ParameterSet name(String name) {
-        mName = name;
-        return this;
-    }
-
-    @Override
-    public String toString() {
-        if (mValues == null) {
-            return "null";
-        }
-        return Arrays.toString(mValues.toArray());
-    }
-
-    private List<Object> validateAndCopy(List<Object> values) {
-        List<Object> tempValues = new ArrayList<>();
-        for (Object o : values) {
-            if (o == null) {
-                tempValues.add(null);
-            } else {
-                if (o.getClass().isPrimitive() || ACCEPTABLE_TYPES.contains(o.getClass())
-                        || o instanceof Callable) {
-                    tempValues.add(o);
-                } else {
-                    // TODO(yolandyan): maybe come up with way to support
-                    // complex object while handling immutability at the
-                    // same time
-                    throw new IllegalArgumentException("Type \"%s\" is not supported in"
-                            + " parameterized testing at this time. Accepted types include"
-                            + " all primitive types along with "
-                            + Arrays.toString(ACCEPTABLE_TYPES.toArray(
-                                      new String[ACCEPTABLE_TYPES.size()])));
-                }
-            }
-        }
-        return Collections.unmodifiableList(tempValues);
-    }
-
-    String getName() {
-        if (mName == null) {
-            return "";
-        }
-        return mName;
-    }
-
-    List<Object> getValues() {
-        return mValues;
-    }
-
-    int size() {
-        if (mValues == null) return 0;
-        return mValues.size();
-    }
-
-    private static final Set<Class<?>> ACCEPTABLE_TYPES = getAcceptableTypes();
-
-    /**
-     * Any immutable class is acceptable.
-     */
-    private static Set<Class<?>> getAcceptableTypes() {
-        Set<Class<?>> ret = new HashSet<Class<?>>();
-        ret.add(Boolean.class);
-        ret.add(Byte.class);
-        ret.add(Character.class);
-        ret.add(Class.class);
-        ret.add(Double.class);
-        ret.add(File.class);
-        ret.add(Float.class);
-        ret.add(Integer.class);
-        ret.add(Long.class);
-        ret.add(Short.class);
-        ret.add(String.class);
-        ret.add(URI.class);
-        ret.add(URL.class);
-        ret.add(Void.class);
-        return ret;
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedFrameworkMethod.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedFrameworkMethod.java
deleted file mode 100644
index f3333b5..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedFrameworkMethod.java
+++ /dev/null
@@ -1,94 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.runners.model.FrameworkMethod;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Custom FrameworkMethod that includes a {@code ParameterSet} that
- * represents the parameters for this test method
- */
-public class ParameterizedFrameworkMethod extends FrameworkMethod {
-    private ParameterSet mParameterSet;
-    private String mName;
-
-    public ParameterizedFrameworkMethod(
-            Method method, ParameterSet parameterSet, String classParameterSetName) {
-        super(method);
-        mParameterSet = parameterSet;
-        String postFix = "";
-        if (classParameterSetName != null && !classParameterSetName.isEmpty()) {
-            postFix += "_" + classParameterSetName;
-        }
-        if (parameterSet != null && !parameterSet.getName().isEmpty()) {
-            postFix += "_" + parameterSet.getName();
-        }
-        mName = postFix.isEmpty() ? method.getName() : method.getName() + "_" + postFix;
-    }
-
-    @Override
-    public String getName() {
-        return mName;
-    }
-
-    @Override
-    public Object invokeExplosively(Object target, Object... params) throws Throwable {
-        if (mParameterSet != null) {
-            return super.invokeExplosively(target, mParameterSet.getValues().toArray());
-        }
-        return super.invokeExplosively(target, params);
-    }
-
-    static List<FrameworkMethod> wrapAllFrameworkMethods(
-            Collection<FrameworkMethod> frameworkMethods, String classParameterSetName) {
-        List<FrameworkMethod> results = new ArrayList<>();
-        for (FrameworkMethod frameworkMethod : frameworkMethods) {
-            results.add(new ParameterizedFrameworkMethod(
-                    frameworkMethod.getMethod(), null, classParameterSetName));
-        }
-        return results;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof ParameterizedFrameworkMethod) {
-            ParameterizedFrameworkMethod method = (ParameterizedFrameworkMethod) obj;
-            return super.equals(obj) && method.getParameterSet().equals(getParameterSet())
-                    && method.getName().equals(getName());
-        }
-        return false;
-    }
-
-    /**
-     * Override hashCode method to distinguish two ParameterizedFrameworkmethod with same
-     * Method object.
-     */
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = 31 * result + super.hashCode();
-        result = 31 * result + getName().hashCode();
-        if (getParameterSet() != null) {
-            result = 31 * result + getParameterSet().hashCode();
-        }
-        return result;
-    }
-
-    Annotation[] getTestAnnotations() {
-        // TODO(yolandyan): add annotation from the ParameterSet, enable
-        // test writing to add SkipCheck for an individual parameter
-        return getMethod().getAnnotations();
-    }
-
-    public ParameterSet getParameterSet() {
-        return mParameterSet;
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunner.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunner.java
deleted file mode 100644
index 113f176..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunner.java
+++ /dev/null
@@ -1,220 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.Test;
-import org.junit.runner.Runner;
-import org.junit.runners.BlockJUnit4ClassRunner;
-import org.junit.runners.Suite;
-import org.junit.runners.model.FrameworkField;
-import org.junit.runners.model.TestClass;
-
-import org.chromium.base.test.params.ParameterAnnotations.ClassParameter;
-import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter;
-import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate;
-import org.chromium.base.test.params.ParameterizedRunnerDelegateFactory.ParameterizedRunnerDelegateInstantiationException;
-
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * ParameterizedRunner generates a list of runners for each of class parameter set in a test class.
- *
- * ParameterizedRunner looks for {@code @ClassParameter} annotation in test class and
- * generates a list of ParameterizedRunnerDelegate runners for each ParameterSet.
- */
-public final class ParameterizedRunner extends Suite {
-    private final List<Runner> mRunners;
-
-    /**
-     * Create a ParameterizedRunner to run test class
-     *
-     * @param klass the Class of the test class, test class should be atomic
-     *              (extends only Object)
-     */
-    public ParameterizedRunner(Class<?> klass) throws Throwable {
-        super(klass, Collections.emptyList()); // pass in empty list of runners
-        validate();
-        mRunners = createRunners(getTestClass());
-    }
-
-    @Override
-    protected List<Runner> getChildren() {
-        return mRunners;
-    }
-
-    /**
-     * ParentRunner calls collectInitializationErrors() to check for errors in Test class.
-     * Parameterized tests are written in unconventional ways, therefore, this method is
-     * overridden and validation is done seperately.
-     */
-    @Override
-    protected void collectInitializationErrors(List<Throwable> errors) {
-        // Do not call super collectInitializationErrors
-    }
-
-    private void validate() throws Throwable {
-        validateNoNonStaticInnerClass();
-        validateOnlyOneConstructor();
-        validateInstanceMethods();
-        validateOnlyOneClassParameterField();
-        validateAtLeastOneParameterSetField();
-    }
-
-    private void validateNoNonStaticInnerClass() throws Exception {
-        if (getTestClass().isANonStaticInnerClass()) {
-            throw new Exception("The inner class " + getTestClass().getName() + " is not static.");
-        }
-    }
-
-    private void validateOnlyOneConstructor() throws Exception {
-        if (!hasOneConstructor()) {
-            throw new Exception("Test class should have exactly one public constructor");
-        }
-    }
-
-    private boolean hasOneConstructor() {
-        return getTestClass().getJavaClass().getConstructors().length == 1;
-    }
-
-    private void validateOnlyOneClassParameterField() {
-        if (getTestClass().getAnnotatedFields(ClassParameter.class).size() > 1) {
-            throw new IllegalParameterArgumentException(
-                    "%s class has more than one @ClassParameter, only one is allowed");
-        }
-    }
-
-    private void validateAtLeastOneParameterSetField() {
-        if (getTestClass().getAnnotatedFields(ClassParameter.class).isEmpty()
-                && getTestClass().getAnnotatedMethods(UseMethodParameter.class).isEmpty()) {
-            throw new IllegalArgumentException(String.format(Locale.getDefault(),
-                    "%s has no field annotated with @ClassParameter or method annotated with"
-                            + "@UseMethodParameter; it should not use ParameterizedRunner",
-                    getTestClass().getName()));
-        }
-    }
-
-    private void validateInstanceMethods() throws Exception {
-        if (getTestClass().getAnnotatedMethods(Test.class).size() == 0) {
-            throw new Exception("No runnable methods");
-        }
-    }
-
-    /**
-     * Return a list of runner delegates through ParameterizedRunnerDelegateFactory.
-     *
-     * For class parameter set: each class can only have one list of class parameter sets.
-     * Each parameter set will be used to create one runner.
-     *
-     * For method parameter set: a single list method parameter sets is associated with
-     * a string tag, an immutable map of string to parameter set list will be created and
-     * passed into factory for each runner delegate to create multiple tests. Only one
-     * Runner will be created for a method that uses @UseMethodParameter, regardless of the
-     * number of ParameterSets in the associated list.
-     *
-     * @return a list of runners
-     * @throws ParameterizedRunnerDelegateInstantiationException if runner delegate can not
-     *         be instantiated with constructor reflectively
-     * @throws IllegalAccessError if the field in tests are not accessible
-     */
-    static List<Runner> createRunners(TestClass testClass)
-            throws IllegalAccessException, ParameterizedRunnerDelegateInstantiationException {
-        List<ParameterSet> classParameterSetList;
-        if (testClass.getAnnotatedFields(ClassParameter.class).isEmpty()) {
-            classParameterSetList = new ArrayList<>();
-            classParameterSetList.add(null);
-        } else {
-            classParameterSetList = getParameterSetList(
-                    testClass.getAnnotatedFields(ClassParameter.class).get(0), testClass);
-            validateWidth(classParameterSetList);
-        }
-
-        Class<? extends ParameterizedRunnerDelegate> runnerDelegateClass =
-                getRunnerDelegateClass(testClass);
-        ParameterizedRunnerDelegateFactory factory = new ParameterizedRunnerDelegateFactory();
-        List<Runner> runnersForTestClass = new ArrayList<>();
-        for (ParameterSet classParameterSet : classParameterSetList) {
-            BlockJUnit4ClassRunner runner = (BlockJUnit4ClassRunner) factory.createRunner(
-                    testClass, classParameterSet, runnerDelegateClass);
-            runnersForTestClass.add(runner);
-        }
-        return runnersForTestClass;
-    }
-
-    /**
-     * Return an unmodifiable list of ParameterSet through a FrameworkField
-     */
-    private static List<ParameterSet> getParameterSetList(FrameworkField field, TestClass testClass)
-            throws IllegalAccessException {
-        field.getField().setAccessible(true);
-        if (!Modifier.isStatic(field.getField().getModifiers())) {
-            throw new IllegalParameterArgumentException(String.format(Locale.getDefault(),
-                    "ParameterSetList fields must be static, this field %s in %s is not",
-                    field.getName(), testClass.getName()));
-        }
-        if (!(field.get(testClass.getJavaClass()) instanceof List)) {
-            throw new IllegalArgumentException(String.format(Locale.getDefault(),
-                    "Fields with @ClassParameter annotations must be an instance of List, "
-                            + "this field %s in %s is not list",
-                    field.getName(), testClass.getName()));
-        }
-        @SuppressWarnings("unchecked") // checked above
-        List<ParameterSet> result = (List<ParameterSet>) field.get(testClass.getJavaClass());
-        return Collections.unmodifiableList(result);
-    }
-
-    static void validateWidth(Iterable<ParameterSet> parameterSetList) {
-        int lastSize = -1;
-        for (ParameterSet set : parameterSetList) {
-            if (set.size() == 0) {
-                throw new IllegalParameterArgumentException(
-                        "No parameter is added to method ParameterSet");
-            }
-            if (lastSize == -1 || set.size() == lastSize) {
-                lastSize = set.size();
-            } else {
-                throw new IllegalParameterArgumentException(String.format(Locale.getDefault(),
-                        "All ParameterSets in a list of ParameterSet must have equal"
-                                + " length. The current ParameterSet (%s) contains %d parameters,"
-                                + " while previous ParameterSet contains %d parameters",
-                        Arrays.toString(set.getValues().toArray()), set.size(), lastSize));
-            }
-        }
-    }
-
-    /**
-     * Get the runner delegate class for the test class if {@code @UseRunnerDelegate} is used.
-     * The default runner delegate is BaseJUnit4RunnerDelegate.class
-     */
-    private static Class<? extends ParameterizedRunnerDelegate> getRunnerDelegateClass(
-            TestClass testClass) {
-        if (testClass.getAnnotation(UseRunnerDelegate.class) != null) {
-            return testClass.getAnnotation(UseRunnerDelegate.class).value();
-        }
-        return BaseJUnit4RunnerDelegate.class;
-    }
-
-    static class IllegalParameterArgumentException extends IllegalArgumentException {
-        IllegalParameterArgumentException(String msg) {
-            super(msg);
-        }
-    }
-
-    public static class ParameterizedTestInstantiationException extends Exception {
-        ParameterizedTestInstantiationException(
-                TestClass testClass, String parameterSetString, Exception e) {
-            super(String.format(
-                          "Test class %s can not be initiated, the provided parameters are %s,"
-                                  + " the required parameter types are %s",
-                          testClass.getJavaClass().toString(), parameterSetString,
-                          Arrays.toString(testClass.getOnlyConstructor().getParameterTypes())),
-                    e);
-        }
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegate.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegate.java
deleted file mode 100644
index d3698a9..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegate.java
+++ /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.
-
-package org.chromium.base.test.params;
-
-import org.junit.runners.model.FrameworkMethod;
-
-import org.chromium.base.test.params.ParameterizedRunner.ParameterizedTestInstantiationException;
-
-import java.util.List;
-
-/**
- * This interface defines the methods that needs to be overriden for a Runner to
- * be used by ParameterizedRunner to generate individual runners for parameters.
- *
- * To create a ParameterizedRunnerDelegate, extends from any BlockJUnit4Runner
- * children class. You can copy all the implementation from
- * org.chromium.base.test.params.BaseJUnit4RunnerDelegate.
- */
-public interface ParameterizedRunnerDelegate {
-    /**
-     * Override to use DelegateCommon's implementation
-     */
-    void collectInitializationErrors(List<Throwable> errors);
-
-    /**
-     * Override to use DelegateCommon's implementation
-     */
-    List<FrameworkMethod> computeTestMethods();
-
-    /**
-     * Override to use DelegateCommon's implementation
-     */
-    Object createTest() throws ParameterizedTestInstantiationException;
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommon.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommon.java
deleted file mode 100644
index f25e2b2..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommon.java
+++ /dev/null
@@ -1,69 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.TestClass;
-
-import org.chromium.base.test.params.ParameterizedRunner.ParameterizedTestInstantiationException;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-/**
- * Parameterized runner delegate common that implements method that needed to be
- * delegated for parameterization purposes
- */
-public final class ParameterizedRunnerDelegateCommon {
-    private final TestClass mTestClass;
-    private final ParameterSet mClassParameterSet;
-    private final List<FrameworkMethod> mParameterizedFrameworkMethodList;
-
-    public ParameterizedRunnerDelegateCommon(TestClass testClass, ParameterSet classParameterSet,
-            List<FrameworkMethod> parameterizedFrameworkMethods) {
-        mTestClass = testClass;
-        mClassParameterSet = classParameterSet;
-        mParameterizedFrameworkMethodList = parameterizedFrameworkMethods;
-    }
-
-    /**
-     * Do not do any validation here because running the default class runner's
-     * collectInitializationErrors fail due to the overridden computeTestMethod relying on a local
-     * member variable
-     *
-     * The validation needed for parameterized tests is already done by ParameterizedRunner.
-     */
-    public static void collectInitializationErrors(
-            @SuppressWarnings("unused") List<Throwable> errors) {}
-
-    public List<FrameworkMethod> computeTestMethods() {
-        return mParameterizedFrameworkMethodList;
-    }
-
-    private void throwInstantiationException(Exception e)
-            throws ParameterizedTestInstantiationException {
-        String parameterSetString =
-                mClassParameterSet == null ? "null" : mClassParameterSet.toString();
-        throw new ParameterizedTestInstantiationException(mTestClass, parameterSetString, e);
-    }
-
-    public Object createTest() throws ParameterizedTestInstantiationException {
-        try {
-            if (mClassParameterSet == null) {
-                return mTestClass.getOnlyConstructor().newInstance();
-            }
-            return mTestClass.getOnlyConstructor().newInstance(
-                    mClassParameterSet.getValues().toArray());
-        } catch (InstantiationException e) {
-            throwInstantiationException(e);
-        } catch (IllegalAccessException e) {
-            throwInstantiationException(e);
-        } catch (InvocationTargetException e) {
-            throwInstantiationException(e);
-        }
-        assert false;
-        return null;
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java
deleted file mode 100644
index f829981..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactory.java
+++ /dev/null
@@ -1,115 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.Test;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.TestClass;
-
-import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Factory to generate delegate class runners for ParameterizedRunner
- */
-public class ParameterizedRunnerDelegateFactory {
-    /**
-     * Create a runner that implements ParameterizedRunner and extends BlockJUnit4ClassRunner
-     *
-     * @param testClass the TestClass object for current test class
-     * @param classParameterSet A parameter set for test constructor arguments
-     * @param parameterizedRunnerDelegateClass the parameterized runner delegate class specified
-     *                                         through {@code @UseRunnerDelegate}
-     */
-    <T extends ParameterizedRunnerDelegate> T createRunner(TestClass testClass,
-            ParameterSet classParameterSet, Class<T> parameterizedRunnerDelegateClass)
-            throws ParameterizedRunnerDelegateInstantiationException {
-        String testMethodPostfix = classParameterSet == null ? null : classParameterSet.getName();
-        List<FrameworkMethod> unmodifiableFrameworkMethodList =
-                generateUnmodifiableFrameworkMethodList(testClass, testMethodPostfix);
-        ParameterizedRunnerDelegateCommon delegateCommon = new ParameterizedRunnerDelegateCommon(
-                testClass, classParameterSet, unmodifiableFrameworkMethodList);
-        try {
-            return parameterizedRunnerDelegateClass
-                    .getDeclaredConstructor(Class.class, ParameterizedRunnerDelegateCommon.class)
-                    .newInstance(testClass.getJavaClass(), delegateCommon);
-        } catch (Exception e) {
-            throw new ParameterizedRunnerDelegateInstantiationException(
-                    parameterizedRunnerDelegateClass.toString(), e);
-        }
-    }
-
-    /**
-     * Match test methods annotated by @UseMethodParameter(X) with
-     * ParameterSetList annotated by @MethodParameter(X)
-     *
-     * @param testClass a {@code TestClass} that wraps around the actual java
-     *            test class
-     * @param postFix a name postfix for each test
-     * @return a list of ParameterizedFrameworkMethod
-     */
-    static List<FrameworkMethod> generateUnmodifiableFrameworkMethodList(
-            TestClass testClass, String postFix) {
-        // Represent the list of all ParameterizedFrameworkMethod in this test class
-        List<FrameworkMethod> returnList = new ArrayList<>();
-
-        for (FrameworkMethod method : testClass.getAnnotatedMethods(Test.class)) {
-            if (method.getMethod().isAnnotationPresent(UseMethodParameter.class)) {
-                Iterable<ParameterSet> parameterSets =
-                        getParameters(method.getAnnotation(UseMethodParameter.class).value());
-                returnList.addAll(createParameterizedMethods(method, parameterSets, postFix));
-            } else {
-                // If test method is not parameterized (does not have UseMethodParameter annotation)
-                returnList.add(new ParameterizedFrameworkMethod(method.getMethod(), null, postFix));
-            }
-        }
-
-        return Collections.unmodifiableList(returnList);
-    }
-
-    /**
-     * Exception caused by instantiating the provided Runner delegate
-     * Potentially caused by not overriding collecInitializationErrors() method
-     * to be empty
-     */
-    public static class ParameterizedRunnerDelegateInstantiationException extends Exception {
-        private ParameterizedRunnerDelegateInstantiationException(
-                String runnerDelegateClass, Exception e) {
-            super(String.format("Current class runner delegate %s can not be instantiated.",
-                          runnerDelegateClass),
-                    e);
-        }
-    }
-
-    private static Iterable<ParameterSet> getParameters(Class<? extends ParameterProvider> clazz) {
-        ParameterProvider parameterProvider;
-        try {
-            parameterProvider = clazz.getDeclaredConstructor().newInstance();
-        } catch (IllegalAccessException e) {
-            throw new IllegalStateException("Failed instantiating " + clazz.getCanonicalName(), e);
-        } catch (InstantiationException e) {
-            throw new IllegalStateException("Failed instantiating " + clazz.getCanonicalName(), e);
-        } catch (NoSuchMethodException e) {
-            throw new IllegalStateException("Failed instantiating " + clazz.getCanonicalName(), e);
-        } catch (InvocationTargetException e) {
-            throw new IllegalStateException("Failed instantiating " + clazz.getCanonicalName(), e);
-        }
-        return parameterProvider.getParameters();
-    }
-
-    private static List<FrameworkMethod> createParameterizedMethods(
-            FrameworkMethod baseMethod, Iterable<ParameterSet> parameterSetList, String suffix) {
-        ParameterizedRunner.validateWidth(parameterSetList);
-        List<FrameworkMethod> returnList = new ArrayList<>();
-        for (ParameterSet set : parameterSetList) {
-            returnList.add(new ParameterizedFrameworkMethod(baseMethod.getMethod(), set, suffix));
-        }
-        return returnList;
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/AdvancedMockContext.java b/base/test/android/javatests/src/org/chromium/base/test/util/AdvancedMockContext.java
deleted file mode 100644
index c8117f7..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/AdvancedMockContext.java
+++ /dev/null
@@ -1,118 +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.
-
-package org.chromium.base.test.util;
-
-import android.content.ComponentCallbacks;
-import android.content.ContentResolver;
-import android.content.Context;
-import android.content.ContextWrapper;
-import android.content.SharedPreferences;
-import android.test.mock.MockContentResolver;
-import android.test.mock.MockContext;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * ContextWrapper that adds functionality for SharedPreferences and a way to set and retrieve flags.
- */
-public class AdvancedMockContext extends ContextWrapper {
-
-    private final MockContentResolver mMockContentResolver = new MockContentResolver();
-
-    private final Map<String, SharedPreferences> mSharedPreferences =
-            new HashMap<String, SharedPreferences>();
-
-    private final Map<String, Boolean> mFlags = new HashMap<String, Boolean>();
-
-    public AdvancedMockContext(Context base) {
-        super(base);
-    }
-
-    public AdvancedMockContext() {
-        super(new MockContext());
-    }
-
-    @Override
-    public String getPackageName() {
-        return getBaseContext().getPackageName();
-    }
-
-    @Override
-    public Context getApplicationContext() {
-        return this;
-    }
-
-    @Override
-    public ContentResolver getContentResolver() {
-        return mMockContentResolver;
-    }
-
-    public MockContentResolver getMockContentResolver() {
-        return mMockContentResolver;
-    }
-
-    @Override
-    public SharedPreferences getSharedPreferences(String name, int mode) {
-        synchronized (mSharedPreferences) {
-            if (!mSharedPreferences.containsKey(name)) {
-                // Auto-create shared preferences to mimic Android Context behavior
-                mSharedPreferences.put(name, new InMemorySharedPreferences());
-            }
-            return mSharedPreferences.get(name);
-        }
-    }
-
-    @Override
-    public void registerComponentCallbacks(ComponentCallbacks callback) {
-        getBaseContext().registerComponentCallbacks(callback);
-    }
-
-    @Override
-    public void unregisterComponentCallbacks(ComponentCallbacks callback) {
-        getBaseContext().unregisterComponentCallbacks(callback);
-    }
-
-    public void addSharedPreferences(String name, Map<String, Object> data) {
-        synchronized (mSharedPreferences) {
-            mSharedPreferences.put(name, new InMemorySharedPreferences(data));
-        }
-    }
-
-    public void setFlag(String key) {
-        mFlags.put(key, true);
-    }
-
-    public void clearFlag(String key) {
-        mFlags.remove(key);
-    }
-
-    public boolean isFlagSet(String key) {
-        return mFlags.containsKey(key) && mFlags.get(key);
-    }
-
-    /**
-     * Builder for maps of type Map<String, Object> to be used with
-     * {@link #addSharedPreferences(String, java.util.Map)}.
-     */
-    public static class MapBuilder {
-
-        private final Map<String, Object> mData = new HashMap<String, Object>();
-
-        public static MapBuilder create() {
-            return new MapBuilder();
-        }
-
-        public MapBuilder add(String key, Object value) {
-            mData.put(key, value);
-            return this;
-        }
-
-        public Map<String, Object> build() {
-            return mData;
-        }
-
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessingUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessingUtils.java
deleted file mode 100644
index d335412..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationProcessingUtils.java
+++ /dev/null
@@ -1,259 +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.
-
-package org.chromium.base.test.util;
-
-import android.support.annotation.Nullable;
-
-import org.junit.runner.Description;
-
-import org.chromium.base.VisibleForTesting;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Queue;
-import java.util.Set;
-
-/**
- * Utility class to help with processing annotations, going around the code to collect them, etc.
- */
-public abstract class AnnotationProcessingUtils {
-    /**
-     * Returns the closest instance of the requested annotation or null if there is none.
-     * See {@link AnnotationExtractor} for context of "closest".
-     */
-    @SuppressWarnings("unchecked")
-    public static <A extends Annotation> A getAnnotation(Description description, Class<A> clazz) {
-        AnnotationExtractor extractor = new AnnotationExtractor(clazz);
-        return (A) extractor.getClosest(extractor.getMatchingAnnotations(description));
-    }
-
-    /**
-     * Returns the closest instance of the requested annotation or null if there is none.
-     * See {@link AnnotationExtractor} for context of "closest".
-     */
-    @SuppressWarnings("unchecked")
-    public static <A extends Annotation> A getAnnotation(AnnotatedElement element, Class<A> clazz) {
-        AnnotationExtractor extractor = new AnnotationExtractor(clazz);
-        return (A) extractor.getClosest(extractor.getMatchingAnnotations(element));
-    }
-
-    /** See {@link AnnotationExtractor} for details about the output sorting order. */
-    @SuppressWarnings("unchecked")
-    public static <A extends Annotation> List<A> getAnnotations(
-            Description description, Class<A> annotationType) {
-        return (List<A>) new AnnotationExtractor(annotationType)
-                .getMatchingAnnotations(description);
-    }
-
-    /** See {@link AnnotationExtractor} for details about the output sorting order. */
-    @SuppressWarnings("unchecked")
-    public static <A extends Annotation> List<A> getAnnotations(
-            AnnotatedElement annotatedElement, Class<A> annotationType) {
-        return (List<A>) new AnnotationExtractor(annotationType)
-                .getMatchingAnnotations(annotatedElement);
-    }
-
-    private static boolean isChromiumAnnotation(Annotation annotation) {
-        Package pkg = annotation.annotationType().getPackage();
-        return pkg != null && pkg.getName().startsWith("org.chromium");
-    }
-
-    /**
-     * Processes various types of annotated elements ({@link Class}es, {@link Annotation}s,
-     * {@link Description}s, etc.) and extracts the targeted annotations from it. The output will be
-     * sorted in BFS-like order.
-     *
-     * For example, for a method we would get in reverse order:
-     * - the method annotations
-     * - the meta-annotations present on the method annotations,
-     * - the class annotations
-     * - the meta-annotations present on the class annotations,
-     * - the annotations present on the super class,
-     * - the meta-annotations present on the super class annotations,
-     * - etc.
-     *
-     * When multiple annotations are targeted, if more than one is picked up at a given level (for
-     * example directly on the method), they will be returned in the reverse order that they were
-     * provided to the constructor.
-     *
-     * Note: We return the annotations in reverse order because we assume that if some processing
-     * is going to be made on related annotations, the later annotations would likely override
-     * modifications made by the former.
-     *
-     * Note: While resolving meta annotations, we don't expand the explorations to annotations types
-     * that have already been visited. Please file a bug and assign to dgn@ if you think it caused
-     * an issue.
-     */
-    public static class AnnotationExtractor {
-        private final List<Class<? extends Annotation>> mAnnotationTypes;
-        private final Comparator<Class<? extends Annotation>> mAnnotationTypeComparator;
-        private final Comparator<Annotation> mAnnotationComparator;
-
-        @SafeVarargs
-        public AnnotationExtractor(Class<? extends Annotation>... additionalTypes) {
-            this(Arrays.asList(additionalTypes));
-        }
-
-        public AnnotationExtractor(List<Class<? extends Annotation>> additionalTypes) {
-            assert !additionalTypes.isEmpty();
-            mAnnotationTypes = Collections.unmodifiableList(additionalTypes);
-            mAnnotationTypeComparator =
-                    (t1, t2) -> mAnnotationTypes.indexOf(t1) - mAnnotationTypes.indexOf(t2);
-            mAnnotationComparator = (t1, t2)
-                    -> mAnnotationTypeComparator.compare(t1.annotationType(), t2.annotationType());
-        }
-
-        public List<Annotation> getMatchingAnnotations(Description description) {
-            return getMatchingAnnotations(new AnnotatedNode.DescriptionNode(description));
-        }
-
-        public List<Annotation> getMatchingAnnotations(AnnotatedElement annotatedElement) {
-            AnnotatedNode annotatedNode;
-            if (annotatedElement instanceof Method) {
-                annotatedNode = new AnnotatedNode.MethodNode((Method) annotatedElement);
-            } else if (annotatedElement instanceof Class) {
-                annotatedNode = new AnnotatedNode.ClassNode((Class) annotatedElement);
-            } else {
-                throw new IllegalArgumentException("Unsupported type for " + annotatedElement);
-            }
-
-            return getMatchingAnnotations(annotatedNode);
-        }
-
-        /**
-         * For a given list obtained from the extractor, returns the {@link Annotation} that would
-         * be closest from the extraction point, or {@code null} if the list is empty.
-         */
-        @Nullable
-        public Annotation getClosest(List<Annotation> annotationList) {
-            return annotationList.isEmpty() ? null : annotationList.get(annotationList.size() - 1);
-        }
-
-        @VisibleForTesting
-        Comparator<Class<? extends Annotation>> getTypeComparator() {
-            return mAnnotationTypeComparator;
-        }
-
-        private List<Annotation> getMatchingAnnotations(AnnotatedNode annotatedNode) {
-            List<Annotation> collectedAnnotations = new ArrayList<>();
-            Queue<Annotation> workingSet = new LinkedList<>();
-            Set<Class<? extends Annotation>> visited = new HashSet<>();
-
-            AnnotatedNode currentAnnotationLayer = annotatedNode;
-            while (currentAnnotationLayer != null) {
-                queueAnnotations(currentAnnotationLayer.getAnnotations(), workingSet);
-
-                while (!workingSet.isEmpty()) {
-                    sweepAnnotations(collectedAnnotations, workingSet, visited);
-                }
-
-                currentAnnotationLayer = currentAnnotationLayer.getParent();
-            }
-
-            return collectedAnnotations;
-        }
-
-        private void queueAnnotations(List<Annotation> annotations, Queue<Annotation> workingSet) {
-            Collections.sort(annotations, mAnnotationComparator);
-            workingSet.addAll(annotations);
-        }
-
-        private void sweepAnnotations(List<Annotation> collectedAnnotations,
-                Queue<Annotation> workingSet, Set<Class<? extends Annotation>> visited) {
-            // 1. Grab node at the front of the working set.
-            Annotation annotation = workingSet.remove();
-
-            // 2. If it's an annotation of interest, put it aside for the output.
-            if (mAnnotationTypes.contains(annotation.annotationType())) {
-                collectedAnnotations.add(0, annotation);
-            }
-
-            // 3. Check if we can get skip some redundant iterations and avoid cycles.
-            if (!visited.add(annotation.annotationType())) return;
-            if (!isChromiumAnnotation(annotation)) return;
-
-            // 4. Expand the working set
-            queueAnnotations(Arrays.asList(annotation.annotationType().getDeclaredAnnotations()),
-                    workingSet);
-        }
-    }
-
-    /**
-     * Abstraction to hide differences between Class, Method and Description with regards to their
-     * annotations and what should be analyzed next.
-     */
-    private static abstract class AnnotatedNode {
-        @Nullable
-        abstract AnnotatedNode getParent();
-
-        abstract List<Annotation> getAnnotations();
-
-        static class DescriptionNode extends AnnotatedNode {
-            final Description mDescription;
-
-            DescriptionNode(Description description) {
-                mDescription = description;
-            }
-
-            @Nullable
-            @Override
-            AnnotatedNode getParent() {
-                return new ClassNode(mDescription.getTestClass());
-            }
-
-            @Override
-            List<Annotation> getAnnotations() {
-                return new ArrayList<>(mDescription.getAnnotations());
-            }
-        }
-
-        static class ClassNode extends AnnotatedNode {
-            final Class<?> mClass;
-
-            ClassNode(Class<?> clazz) {
-                mClass = clazz;
-            }
-
-            @Nullable
-            @Override
-            AnnotatedNode getParent() {
-                Class<?> superClass = mClass.getSuperclass();
-                return superClass == null ? null : new ClassNode(superClass);
-            }
-
-            @Override
-            List<Annotation> getAnnotations() {
-                return Arrays.asList(mClass.getDeclaredAnnotations());
-            }
-        }
-
-        static class MethodNode extends AnnotatedNode {
-            final Method mMethod;
-
-            MethodNode(Method method) {
-                mMethod = method;
-            }
-
-            @Nullable
-            @Override
-            AnnotatedNode getParent() {
-                return new ClassNode(mMethod.getDeclaringClass());
-            }
-
-            @Override
-            List<Annotation> getAnnotations() {
-                return Arrays.asList(mMethod.getDeclaredAnnotations());
-            }
-        }
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java b/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java
deleted file mode 100644
index a361ac3..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/AnnotationRule.java
+++ /dev/null
@@ -1,139 +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.
-
-package org.chromium.base.test.util;
-
-import android.support.annotation.CallSuper;
-import android.support.annotation.Nullable;
-
-import org.junit.rules.ExternalResource;
-import org.junit.runner.Description;
-import org.junit.runners.model.Statement;
-
-import java.lang.annotation.Annotation;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * Test rule that collects specific annotations to help with test set up and tear down. It is set up
- * with a list of annotations to look for and exposes the ones picked up on the test through
- * {@link #getAnnotations()} and related methods.
- *
- * Note: The rule always apply, whether it picked up annotations or not.
- *
- * Usage:
- *
- * <pre>
- * public class Test {
- *    &#64;Rule
- *    public AnnotationRule rule = new AnnotationRule(Foo.class) {
- *          &#64;Override
- *          protected void before() { ... }
- *
- *          &#64;Override
- *          protected void after() { ... }
- *    };
- *
- *    &#64;Test
- *    &#64;Foo
- *    public void myTest() { ... }
- * }
- * </pre>
- *
- * It can also be used to trigger for multiple annotations:
- *
- * <pre>
- * &#64;DisableFoo
- * public class Test {
- *    &#64;Rule
- *    public AnnotationRule rule = new AnnotationRule(EnableFoo.class, DisableFoo.class) {
- *          &#64;Override
- *          protected void before() {
- *            // Loops through all the picked up annotations. For myTest(), it would process
- *            // DisableFoo first, then EnableFoo.
- *            for (Annotation annotation : getAnnotations()) {
- *                if (annotation instanceof EnableFoo) { ... }
- *                else if (annotation instanceof DisableFoo) { ... }
- *            }
- *          }
- *
- *          &#64;Override
- *          protected void after() {
- *            // For myTest(), would return EnableFoo as it's directly set on the method.
- *            Annotation a = getClosestAnnotation();
- *            ...
- *          }
- *    };
- *
- *    &#64;Test
- *    &#64;EnableFoo
- *    public void myTest() { ... }
- * }
- * </pre>
- *
- * @see AnnotationProcessingUtils.AnnotationExtractor
- */
-public abstract class AnnotationRule extends ExternalResource {
-    private final AnnotationProcessingUtils.AnnotationExtractor mAnnotationExtractor;
-    private List<Annotation> mCollectedAnnotations;
-    private Description mTestDescription;
-
-    @SafeVarargs
-    public AnnotationRule(Class<? extends Annotation> firstAnnotationType,
-            Class<? extends Annotation>... additionalTypes) {
-        List<Class<? extends Annotation>> mAnnotationTypes = new ArrayList<>();
-        mAnnotationTypes.add(firstAnnotationType);
-        mAnnotationTypes.addAll(Arrays.asList(additionalTypes));
-        mAnnotationExtractor = new AnnotationProcessingUtils.AnnotationExtractor(mAnnotationTypes);
-    }
-
-    @CallSuper
-    @Override
-    public Statement apply(Statement base, Description description) {
-        mTestDescription = description;
-
-        mCollectedAnnotations = mAnnotationExtractor.getMatchingAnnotations(description);
-
-        // Return the wrapped statement to execute before() and after().
-        return super.apply(base, description);
-    }
-
-    /** @return {@link Description} of the current test. */
-    protected Description getTestDescription() {
-        return mTestDescription;
-    }
-
-    /**
-     * @return The collected annotations that match the declared type(s).
-     * @throws NullPointerException if this is called before annotations have been collected,
-     * which happens when the rule is applied to the {@link Statement}.
-     */
-    protected List<Annotation> getAnnotations() {
-        return Collections.unmodifiableList(mCollectedAnnotations);
-    }
-
-    /**
-     * @return The closest annotation matching the provided type, or {@code null} if there is none.
-     */
-    @SuppressWarnings("unchecked")
-    protected @Nullable <A extends Annotation> A getAnnotation(Class<A> annnotationType) {
-        ListIterator<Annotation> iteratorFromEnd =
-                mCollectedAnnotations.listIterator(mCollectedAnnotations.size());
-        while (iteratorFromEnd.hasPrevious()) {
-            Annotation annotation = iteratorFromEnd.previous();
-            if (annnotationType.isAssignableFrom(annotation.annotationType())) {
-                return (A) annotation;
-            }
-        }
-        return null;
-    }
-
-    protected @Nullable Annotation getClosestAnnotation() {
-        if (mCollectedAnnotations.isEmpty()) return null;
-        return mCollectedAnnotations.get(mCollectedAnnotations.size() - 1);
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/CallbackHelper.java b/base/test/android/javatests/src/org/chromium/base/test/util/CallbackHelper.java
deleted file mode 100644
index bf064c4..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/CallbackHelper.java
+++ /dev/null
@@ -1,252 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-import static org.chromium.base.test.util.ScalableTimeout.scaleTimeout;
-
-import org.junit.Assert;
-
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * A helper class that encapsulates listening and blocking for callbacks.
- *
- * Sample usage:
- *
- * // Let us assume that this interface is defined by some piece of production code and is used
- * // to communicate events that occur in that piece of code. Let us further assume that the
- * // production code runs on the main thread test code runs on a separate test thread.
- * // An instance that implements this interface would be injected by test code to ensure that the
- * // methods are being called on another thread.
- * interface Delegate {
- *     void onOperationFailed(String errorMessage);
- *     void onDataPersisted();
- * }
- *
- * // This is the inner class you'd write in your test case to later inject into the production
- * // code.
- * class TestDelegate implements Delegate {
- *     // This is the preferred way to create a helper that stores the parameters it receives
- *     // when called by production code.
- *     public static class OnOperationFailedHelper extends CallbackHelper {
- *         private String mErrorMessage;
- *
- *         public void getErrorMessage() {
- *             assert getCallCount() > 0;
- *             return mErrorMessage;
- *         }
- *
- *         public void notifyCalled(String errorMessage) {
- *             mErrorMessage = errorMessage;
- *             // It's important to call this after all parameter assignments.
- *             notifyCalled();
- *         }
- *     }
- *
- *     // There should be one CallbackHelper instance per method.
- *     private OnOperationFailedHelper mOnOperationFailedHelper;
- *     private CallbackHelper mOnDataPersistedHelper;
- *
- *     public OnOperationFailedHelper getOnOperationFailedHelper() {
- *         return mOnOperationFailedHelper;
- *     }
- *
- *     public CallbackHelper getOnDataPersistedHelper() {
- *         return mOnDataPersistedHelper;
- *     }
- *
- *     @Override
- *     public void onOperationFailed(String errorMessage) {
- *         mOnOperationFailedHelper.notifyCalled(errorMessage);
- *     }
- *
- *     @Override
- *     public void onDataPersisted() {
- *         mOnDataPersistedHelper.notifyCalled();
- *     }
- * }
- *
- * // This is a sample test case.
- * public void testCase() throws Exception {
- *     // Create the TestDelegate to inject into production code.
- *     TestDelegate delegate = new TestDelegate();
- *     // Create the production class instance that is being tested and inject the test delegate.
- *     CodeUnderTest codeUnderTest = new CodeUnderTest();
- *     codeUnderTest.setDelegate(delegate);
- *
- *     // Typically you'd get the current call count before performing the operation you expect to
- *     // trigger the callback. There can't be any callbacks 'in flight' at this moment, otherwise
- *     // the call count is unpredictable and the test will be flaky.
- *     int onOperationFailedCallCount = delegate.getOnOperationFailedHelper().getCallCount();
- *     codeUnderTest.doSomethingThatEndsUpCallingOnOperationFailedFromAnotherThread();
- *     // It's safe to do other stuff here, if needed.
- *     ....
- *     // Wait for the callback if it hadn't been called yet, otherwise return immediately. This
- *     // can throw an exception if the callback doesn't arrive within the timeout.
- *     delegate.getOnOperationFailedHelper().waitForCallback(onOperationFailedCallCount);
- *     // Access to method parameters is now safe.
- *     assertEquals("server error", delegate.getOnOperationFailedHelper().getErrorMessage());
- *
- *     // Being able to pass the helper around lets us build methods which encapsulate commonly
- *     // performed tasks.
- *     doSomeOperationAndWait(codeUnerTest, delegate.getOnOperationFailedHelper());
- *
- *     // The helper can be reused for as many calls as needed, just be sure to get the count each
- *     // time.
- *     onOperationFailedCallCount = delegate.getOnOperationFailedHelper().getCallCount();
- *     codeUnderTest.doSomethingElseButStillFailOnAnotherThread();
- *     delegate.getOnOperationFailedHelper().waitForCallback(onOperationFailedCallCount);
- *
- *     // It is also possible to use more than one helper at a time.
- *     onOperationFailedCallCount = delegate.getOnOperationFailedHelper().getCallCount();
- *     int onDataPersistedCallCount = delegate.getOnDataPersistedHelper().getCallCount();
- *     codeUnderTest.doSomethingThatPersistsDataButFailsInSomeOtherWayOnAnotherThread();
- *     delegate.getOnDataPersistedHelper().waitForCallback(onDataPersistedCallCount);
- *     delegate.getOnOperationFailedHelper().waitForCallback(onOperationFailedCallCount);
- * }
- *
- * // Shows how to turn an async operation + completion callback into a synchronous operation.
- * private void doSomeOperationAndWait(final CodeUnderTest underTest,
- *         CallbackHelper operationHelper) throws InterruptedException, TimeoutException {
- *     final int callCount = operationHelper.getCallCount();
- *     getInstrumentation().runOnMainSync(new Runnable() {
- *         @Override
- *         public void run() {
- *             // This schedules a call to a method on the injected TestDelegate. The TestDelegate
- *             // implementation will then call operationHelper.notifyCalled().
- *             underTest.operation();
- *         }
- *      });
- *      operationHelper.waitForCallback(callCount);
- * }
- *
- */
-public class CallbackHelper {
-    /** The default timeout (in seconds) for a callback to wait. */
-    public static final long WAIT_TIMEOUT_SECONDS = scaleTimeout(5);
-
-    private final Object mLock = new Object();
-    private int mCallCount;
-    private String mFailureString;
-
-    /**
-     * Gets the number of times the callback has been called.
-     *
-     * The call count can be used with the waitForCallback() method, indicating a point
-     * in time after which the caller wishes to record calls to the callback.
-     *
-     * In order to wait for a callback caused by X, the call count should be obtained
-     * before X occurs.
-     *
-     * NOTE: any call to the callback that occurs after the call count is obtained
-     * will result in the corresponding wait call to resume execution. The call count
-     * is intended to 'catch' callbacks that occur after X but before waitForCallback()
-     * is called.
-     */
-    public int getCallCount() {
-        synchronized (mLock) {
-            return mCallCount;
-        }
-    }
-
-    /**
-     * Blocks until the callback is called the specified number of
-     * times or throws an exception if we exceeded the specified time frame.
-     *
-     * This will wait for a callback to be called a specified number of times after
-     * the point in time at which the call count was obtained.  The method will return
-     * immediately if a call occurred the specified number of times after the
-     * call count was obtained but before the method was called, otherwise the method will
-     * block until the specified call count is reached.
-     *
-     * @param msg The error message to use if the callback times out.
-     * @param currentCallCount the value obtained by calling getCallCount().
-     * @param numberOfCallsToWaitFor number of calls (counting since
-     *                               currentCallCount was obtained) that we will wait for.
-     * @param timeout timeout value. We will wait the specified amount of time for a single
-     *                callback to occur so the method call may block up to
-     *                <code>numberOfCallsToWaitFor * timeout</code> units.
-     * @param unit timeout unit.
-     * @throws InterruptedException
-     * @throws TimeoutException Thrown if the method times out before onPageFinished is called.
-     */
-    public void waitForCallback(String msg, int currentCallCount, int numberOfCallsToWaitFor,
-            long timeout, TimeUnit unit) throws InterruptedException, TimeoutException {
-        assert mCallCount >= currentCallCount;
-        assert numberOfCallsToWaitFor > 0;
-        synchronized (mLock) {
-            int callCountWhenDoneWaiting = currentCallCount + numberOfCallsToWaitFor;
-            while (callCountWhenDoneWaiting > mCallCount) {
-                int callCountBeforeWait = mCallCount;
-                mLock.wait(unit.toMillis(timeout));
-                if (mFailureString != null) {
-                    String s = mFailureString;
-                    mFailureString = null;
-                    Assert.fail(s);
-                }
-                if (callCountBeforeWait == mCallCount) {
-                    throw new TimeoutException(msg == null ? "waitForCallback timed out!" : msg);
-                }
-            }
-        }
-    }
-
-    /**
-     * @see #waitForCallback(String, int, int, long, TimeUnit)
-     */
-    public void waitForCallback(int currentCallCount, int numberOfCallsToWaitFor, long timeout,
-            TimeUnit unit) throws InterruptedException, TimeoutException {
-        waitForCallback(null, currentCallCount, numberOfCallsToWaitFor, timeout, unit);
-    }
-
-    /**
-     * @see #waitForCallback(String, int, int, long, TimeUnit)
-     */
-    public void waitForCallback(int currentCallCount, int numberOfCallsToWaitFor)
-            throws InterruptedException, TimeoutException {
-        waitForCallback(null, currentCallCount, numberOfCallsToWaitFor,
-                WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
-    }
-
-    /**
-     * @see #waitForCallback(String, int, int, long, TimeUnit)
-     */
-    public void waitForCallback(String msg, int currentCallCount)
-            throws InterruptedException, TimeoutException {
-        waitForCallback(msg, currentCallCount, 1, WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
-    }
-
-    /**
-     * @see #waitForCallback(String, int, int, long, TimeUnit)
-     */
-    public void waitForCallback(int currentCallCount)
-            throws InterruptedException, TimeoutException {
-        waitForCallback(null, currentCallCount, 1, WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS);
-    }
-
-    /**
-     * Should be called when the callback associated with this helper object is called.
-     */
-    public void notifyCalled() {
-        synchronized (mLock) {
-            mCallCount++;
-            mLock.notifyAll();
-        }
-    }
-
-    /**
-     * Should be called when the callback associated with this helper object wants to
-     * indicate a failure.
-     *
-     * @param s The failure message.
-     */
-    public void notifyFailed(String s) {
-        synchronized (mLock) {
-            mFailureString = s;
-            mLock.notifyAll();
-        }
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java b/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java
deleted file mode 100644
index 71ef8e9..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java
+++ /dev/null
@@ -1,188 +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.
-
-package org.chromium.base.test.util;
-
-import android.text.TextUtils;
-
-import org.junit.Assert;
-import org.junit.Rule;
-
-import org.chromium.base.CommandLine;
-import org.chromium.base.CommandLineInitUtil;
-import org.chromium.base.test.BaseTestResult.PreTestHook;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Provides annotations related to command-line flag handling.
- *
- * Uses of these annotations on a derived class will take precedence over uses on its base classes,
- * so a derived class can add a command-line flag that a base class has removed (or vice versa).
- * Similarly, uses of these annotations on a test method will take precedence over uses on the
- * containing class.
- * <p>
- * These annonations may also be used on Junit4 Rule classes and on their base classes. Note,
- * however that the annotation processor only looks at the declared type of the Rule, not its actual
- * type, so in, for example:
- *
- * <pre>
- *     &#64Rule
- *     TestRule mRule = new ChromeActivityTestRule();
- * </pre>
- *
- * will only look for CommandLineFlags annotations on TestRule, not for CommandLineFlags annotations
- * on ChromeActivityTestRule.
- * <p>
- * In addition a rule may not remove flags added by an independently invoked rule, although it may
- * remove flags added by its base classes.
- * <p>
- * Uses of these annotations on the test class or methods take precedence over uses on Rule classes.
- * <p>
- * Note that this class should never be instantiated.
- */
-public final class CommandLineFlags {
-    private static final String DISABLE_FEATURES = "disable-features";
-    private static final String ENABLE_FEATURES = "enable-features";
-
-    /**
-     * Adds command-line flags to the {@link org.chromium.base.CommandLine} for this test.
-     */
-    @Inherited
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.METHOD, ElementType.TYPE})
-    public @interface Add {
-        String[] value();
-    }
-
-    /**
-     * Removes command-line flags from the {@link org.chromium.base.CommandLine} from this test.
-     *
-     * Note that this can only remove flags added via {@link Add} above.
-     */
-    @Inherited
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.METHOD, ElementType.TYPE})
-    public @interface Remove {
-        String[] value();
-    }
-
-    /**
-     * Sets up the CommandLine with the appropriate flags.
-     *
-     * This will add the difference of the sets of flags specified by {@link CommandLineFlags.Add}
-     * and {@link CommandLineFlags.Remove} to the {@link org.chromium.base.CommandLine}. Note that
-     * trying to remove a flag set externally, i.e. by the command-line flags file, will not work.
-     */
-    public static void setUp(AnnotatedElement element) {
-        CommandLine.reset();
-        CommandLineInitUtil.initCommandLine(getTestCmdLineFile());
-        Set<String> enableFeatures = new HashSet<String>();
-        Set<String> disableFeatures = new HashSet<String>();
-        Set<String> flags = getFlags(element);
-        for (String flag : flags) {
-            String[] parsedFlags = flag.split("=", 2);
-            if (parsedFlags.length == 1) {
-                CommandLine.getInstance().appendSwitch(flag);
-            } else if (ENABLE_FEATURES.equals(parsedFlags[0])) {
-                // We collect enable/disable features flags separately and aggregate them because
-                // they may be specified multiple times, in which case the values will trample each
-                // other.
-                Collections.addAll(enableFeatures, parsedFlags[1].split(","));
-            } else if (DISABLE_FEATURES.equals(parsedFlags[0])) {
-                Collections.addAll(disableFeatures, parsedFlags[1].split(","));
-            } else {
-                CommandLine.getInstance().appendSwitchWithValue(parsedFlags[0], parsedFlags[1]);
-            }
-        }
-
-        if (enableFeatures.size() > 0) {
-            CommandLine.getInstance().appendSwitchWithValue(
-                    ENABLE_FEATURES, TextUtils.join(",", enableFeatures));
-        }
-        if (disableFeatures.size() > 0) {
-            CommandLine.getInstance().appendSwitchWithValue(
-                    DISABLE_FEATURES, TextUtils.join(",", disableFeatures));
-        }
-    }
-
-    private static Set<String> getFlags(AnnotatedElement type) {
-        Set<String> rule_flags = new HashSet<>();
-        updateFlagsForElement(type, rule_flags);
-        return rule_flags;
-    }
-
-    private static void updateFlagsForElement(AnnotatedElement element, Set<String> flags) {
-        if (element instanceof Class<?>) {
-            // Get flags from rules within the class.
-            for (Field field : ((Class<?>) element).getFields()) {
-                if (field.isAnnotationPresent(Rule.class)) {
-                    // The order in which fields are returned is undefined, so, for consistency,
-                    // a rule must not remove a flag added by a different rule. Ensure this by
-                    // initially getting the flags into a new set.
-                    Set<String> rule_flags = getFlags(field.getType());
-                    flags.addAll(rule_flags);
-                }
-            }
-            for (Method method : ((Class<?>) element).getMethods()) {
-                if (method.isAnnotationPresent(Rule.class)) {
-                    // The order in which methods are returned is undefined, so, for consistency,
-                    // a rule must not remove a flag added by a different rule. Ensure this by
-                    // initially getting the flags into a new set.
-                    Set<String> rule_flags = getFlags(method.getReturnType());
-                    flags.addAll(rule_flags);
-                }
-            }
-        }
-
-        // Add the flags from the parent. Override any flags defined by the rules.
-        AnnotatedElement parent = (element instanceof Method)
-                ? ((Method) element).getDeclaringClass()
-                : ((Class<?>) element).getSuperclass();
-        if (parent != null) updateFlagsForElement(parent, flags);
-
-        // Flags on the element itself override all other flag sources.
-        if (element.isAnnotationPresent(CommandLineFlags.Add.class)) {
-            flags.addAll(
-                    Arrays.asList(element.getAnnotation(CommandLineFlags.Add.class).value()));
-        }
-
-        if (element.isAnnotationPresent(CommandLineFlags.Remove.class)) {
-            List<String> flagsToRemove =
-                    Arrays.asList(element.getAnnotation(CommandLineFlags.Remove.class).value());
-            for (String flagToRemove : flagsToRemove) {
-                // If your test fails here, you have tried to remove a command-line flag via
-                // CommandLineFlags.Remove that was loaded into CommandLine via something other
-                // than CommandLineFlags.Add (probably the command-line flag file).
-                Assert.assertFalse("Unable to remove command-line flag \"" + flagToRemove + "\".",
-                        CommandLine.getInstance().hasSwitch(flagToRemove));
-            }
-            flags.removeAll(flagsToRemove);
-        }
-    }
-
-    private CommandLineFlags() {
-        throw new AssertionError("CommandLineFlags is a non-instantiable class");
-    }
-
-    public static PreTestHook getRegistrationHook() {
-        return (targetContext, testMethod) -> CommandLineFlags.setUp(testMethod);
-    }
-
-    public static String getTestCmdLineFile() {
-        return "test-cmdline-file";
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/DisableIf.java b/base/test/android/javatests/src/org/chromium/base/test/util/DisableIf.java
deleted file mode 100644
index c0303b6..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/DisableIf.java
+++ /dev/null
@@ -1,49 +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.
-
-package org.chromium.base.test.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotations to support conditional test disabling.
- *
- * These annotations should only be used to disable tests that are temporarily failing
- * in some configurations. If a test should never run at all in some configurations, use
- * {@link Restriction}.
- */
-public class DisableIf {
-
-    /** Conditional disabling based on {@link android.os.Build}.
-     */
-    @Target({ElementType.METHOD, ElementType.TYPE})
-    @Retention(RetentionPolicy.RUNTIME)
-    public static @interface Build {
-        String message() default "";
-
-        int sdk_is_greater_than() default 0;
-        int sdk_is_less_than() default Integer.MAX_VALUE;
-
-        String supported_abis_includes() default "";
-
-        String hardware_is() default "";
-
-        String product_name_includes() default "";
-    }
-
-    @Target({ElementType.METHOD, ElementType.TYPE})
-    @Retention(RetentionPolicy.RUNTIME)
-    public static @interface Device {
-        /**
-         * @return A list of disabled types.
-         */
-        public String[] type();
-    }
-
-    /* Objects of this type should not be created. */
-    private DisableIf() {}
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java
deleted file mode 100644
index e46b979..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/DisableIfSkipCheck.java
+++ /dev/null
@@ -1,84 +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.
-
-package org.chromium.base.test.util;
-
-import android.os.Build;
-
-import org.junit.runners.model.FrameworkMethod;
-
-import org.chromium.base.Log;
-
-import java.util.Arrays;
-
-/**
- * Checks for conditional disables.
- *
- * Currently, this only includes checks against a few {@link android.os.Build} values.
- */
-public class DisableIfSkipCheck extends SkipCheck {
-
-    private static final String TAG = "cr_base_test";
-
-    @Override
-    public boolean shouldSkip(FrameworkMethod method) {
-        if (method == null) return true;
-        for (DisableIf.Build v : AnnotationProcessingUtils.getAnnotations(
-                     method.getMethod(), DisableIf.Build.class)) {
-            if (abi(v) && hardware(v) && product(v) && sdk(v)) {
-                if (!v.message().isEmpty()) {
-                    Log.i(TAG, "%s is disabled: %s", method.getName(), v.message());
-                }
-                return true;
-            }
-        }
-
-        for (DisableIf.Device d : AnnotationProcessingUtils.getAnnotations(
-                     method.getMethod(), DisableIf.Device.class)) {
-            for (String deviceType : d.type()) {
-                if (deviceTypeApplies(deviceType)) {
-                    Log.i(TAG, "Test " + method.getDeclaringClass().getName() + "#"
-                            + method.getName() + " disabled because of "
-                            + d);
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    @SuppressWarnings("deprecation")
-    private boolean abi(DisableIf.Build v) {
-        if (v.supported_abis_includes().isEmpty()) return true;
-
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            return Arrays.asList(Build.SUPPORTED_ABIS).contains(
-                    v.supported_abis_includes());
-        } else {
-            return Build.CPU_ABI.equals(v.supported_abis_includes())
-                    || Build.CPU_ABI2.equals(v.supported_abis_includes());
-        }
-    }
-
-    private boolean hardware(DisableIf.Build v) {
-        return v.hardware_is().isEmpty() || Build.HARDWARE.equals(v.hardware_is());
-    }
-
-    private boolean product(DisableIf.Build v) {
-        return v.product_name_includes().isEmpty()
-                || Build.PRODUCT.contains(v.product_name_includes());
-    }
-
-    private boolean sdk(DisableIf.Build v) {
-        return Build.VERSION.SDK_INT > v.sdk_is_greater_than()
-                && Build.VERSION.SDK_INT < v.sdk_is_less_than();
-    }
-
-    protected boolean deviceTypeApplies(String type) {
-        return false;
-    }
-
-}
-
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/DisabledTest.java b/base/test/android/javatests/src/org/chromium/base/test/util/DisabledTest.java
deleted file mode 100644
index a3e4e8e..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/DisabledTest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation is for disabled tests.
- * <p>
- * Tests with this annotation will not be run on any of the normal bots.
- * Please note that they might eventually run on a special bot.
- */
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface DisabledTest {
-    String message() default "";
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/EnormousTest.java b/base/test/android/javatests/src/org/chromium/base/test/util/EnormousTest.java
deleted file mode 100644
index af483ec..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/EnormousTest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation is for enormous tests.
- * <p>
- * Examples of enormous tests are tests that depend on external web sites or
- * tests that are long running.
- * <p>
- * Such tests are likely NOT reliable enough to run on tree closing bots and
- * should only be run on FYI bots.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface EnormousTest {
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/Feature.java b/base/test/android/javatests/src/org/chromium/base/test/util/Feature.java
deleted file mode 100644
index 1bc9226..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/Feature.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * The java instrumentation tests are normally fairly large (in terms of
- * dependencies), and the test suite ends up containing a large amount of
- * tests that are not trivial to filter / group just by their names.
- * Instead, we use this annotation: each test should be annotated as:
- *     @Feature({"Foo", "Bar"})
- * in order for the test runner scripts to be able to filter and group
- * them accordingly (for instance, this enable us to run all tests that exercise
- * feature Foo).
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Feature {
-    /**
-     * @return A list of feature names.
-     */
-    public String[] value();
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/FlakyTest.java b/base/test/android/javatests/src/org/chromium/base/test/util/FlakyTest.java
deleted file mode 100644
index 83f8e9f..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/FlakyTest.java
+++ /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.
-
-package org.chromium.base.test.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation is for flaky tests.
- * <p>
- * Tests with this annotation will not be run on any of the normal bots.
- * Please note that they might eventually run on a special bot.
- */
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface FlakyTest {
-    String message() default "";
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/InMemorySharedPreferences.java b/base/test/android/javatests/src/org/chromium/base/test/util/InMemorySharedPreferences.java
deleted file mode 100644
index 2587d72..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/InMemorySharedPreferences.java
+++ /dev/null
@@ -1,238 +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.
-
-package org.chromium.base.test.util;
-
-import android.content.SharedPreferences;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * An implementation of SharedPreferences that can be used in tests.
- * <p/>
- * It keeps all state in memory, and there is no difference between apply() and commit().
- */
-public class InMemorySharedPreferences implements SharedPreferences {
-
-    // Guarded on its own monitor.
-    private final Map<String, Object> mData;
-
-    public InMemorySharedPreferences() {
-        mData = new HashMap<String, Object>();
-    }
-
-    public InMemorySharedPreferences(Map<String, Object> data) {
-        mData = data;
-    }
-
-    @Override
-    public Map<String, ?> getAll() {
-        synchronized (mData) {
-            return Collections.unmodifiableMap(mData);
-        }
-    }
-
-    @Override
-    public String getString(String key, String defValue) {
-        synchronized (mData) {
-            if (mData.containsKey(key)) {
-                return (String) mData.get(key);
-            }
-        }
-        return defValue;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public Set<String> getStringSet(String key, Set<String> defValues) {
-        synchronized (mData) {
-            if (mData.containsKey(key)) {
-                return Collections.unmodifiableSet((Set<String>) mData.get(key));
-            }
-        }
-        return defValues;
-    }
-
-    @Override
-    public int getInt(String key, int defValue) {
-        synchronized (mData) {
-            if (mData.containsKey(key)) {
-                return (Integer) mData.get(key);
-            }
-        }
-        return defValue;
-    }
-
-    @Override
-    public long getLong(String key, long defValue) {
-        synchronized (mData) {
-            if (mData.containsKey(key)) {
-                return (Long) mData.get(key);
-            }
-        }
-        return defValue;
-    }
-
-    @Override
-    public float getFloat(String key, float defValue) {
-        synchronized (mData) {
-            if (mData.containsKey(key)) {
-                return (Float) mData.get(key);
-            }
-        }
-        return defValue;
-    }
-
-    @Override
-    public boolean getBoolean(String key, boolean defValue) {
-        synchronized (mData) {
-            if (mData.containsKey(key)) {
-                return (Boolean) mData.get(key);
-            }
-        }
-        return defValue;
-    }
-
-    @Override
-    public boolean contains(String key) {
-        synchronized (mData) {
-            return mData.containsKey(key);
-        }
-    }
-
-    @Override
-    public SharedPreferences.Editor edit() {
-        return new InMemoryEditor();
-    }
-
-    @Override
-    public void registerOnSharedPreferenceChangeListener(
-            SharedPreferences.OnSharedPreferenceChangeListener
-                    listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public void unregisterOnSharedPreferenceChangeListener(
-            SharedPreferences.OnSharedPreferenceChangeListener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    private class InMemoryEditor implements SharedPreferences.Editor {
-
-        // All guarded by |mChanges|
-        private boolean mClearCalled;
-        private volatile boolean mApplyCalled;
-        private final Map<String, Object> mChanges = new HashMap<String, Object>();
-
-        @Override
-        public SharedPreferences.Editor putString(String key, String value) {
-            synchronized (mChanges) {
-                if (mApplyCalled) throw new IllegalStateException();
-                mChanges.put(key, value);
-                return this;
-            }
-        }
-
-        @Override
-        public SharedPreferences.Editor putStringSet(String key, Set<String> values) {
-            synchronized (mChanges) {
-                if (mApplyCalled) throw new IllegalStateException();
-                mChanges.put(key, values);
-                return this;
-            }
-        }
-
-        @Override
-        public SharedPreferences.Editor putInt(String key, int value) {
-            synchronized (mChanges) {
-                if (mApplyCalled) throw new IllegalStateException();
-                mChanges.put(key, value);
-                return this;
-            }
-        }
-
-        @Override
-        public SharedPreferences.Editor putLong(String key, long value) {
-            synchronized (mChanges) {
-                if (mApplyCalled) throw new IllegalStateException();
-                mChanges.put(key, value);
-                return this;
-            }
-        }
-
-        @Override
-        public SharedPreferences.Editor putFloat(String key, float value) {
-            synchronized (mChanges) {
-                if (mApplyCalled) throw new IllegalStateException();
-                mChanges.put(key, value);
-                return this;
-            }
-        }
-
-        @Override
-        public SharedPreferences.Editor putBoolean(String key, boolean value) {
-            synchronized (mChanges) {
-                if (mApplyCalled) throw new IllegalStateException();
-                mChanges.put(key, value);
-                return this;
-            }
-        }
-
-        @Override
-        public SharedPreferences.Editor remove(String key) {
-            synchronized (mChanges) {
-                if (mApplyCalled) throw new IllegalStateException();
-                // Magic value for removes
-                mChanges.put(key, this);
-                return this;
-            }
-        }
-
-        @Override
-        public SharedPreferences.Editor clear() {
-            synchronized (mChanges) {
-                if (mApplyCalled) throw new IllegalStateException();
-                mClearCalled = true;
-                return this;
-            }
-        }
-
-        @Override
-        public boolean commit() {
-            apply();
-            return true;
-        }
-
-        @Override
-        public void apply() {
-            synchronized (mData) {
-                synchronized (mChanges) {
-                    if (mApplyCalled) throw new IllegalStateException();
-                    if (mClearCalled) {
-                        mData.clear();
-                    }
-                    for (Map.Entry<String, Object> entry : mChanges.entrySet()) {
-                        String key = entry.getKey();
-                        Object value = entry.getValue();
-                        if (value == this) {
-                            // Special value for removal
-                            mData.remove(key);
-                        } else {
-                            mData.put(key, value);
-                        }
-                    }
-                    // The real shared prefs clears out the temporaries allowing the caller to
-                    // reuse the Editor instance, however this is undocumented behavior and subtle
-                    // to read, so instead we just ban any future use of this instance.
-                    mApplyCalled = true;
-                }
-            }
-        }
-    }
-
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/InstrumentationUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/InstrumentationUtils.java
deleted file mode 100644
index 20cfd9d..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/InstrumentationUtils.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-import android.app.Instrumentation;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.FutureTask;
-
-/**
- * Utility methods built around the android.app.Instrumentation class.
- */
-public final class InstrumentationUtils {
-
-    private InstrumentationUtils() {
-    }
-
-    public static <R> R runOnMainSyncAndGetResult(Instrumentation instrumentation,
-            Callable<R> callable) throws Throwable {
-        FutureTask<R> task = new FutureTask<R>(callable);
-        instrumentation.runOnMainSync(task);
-        try {
-            return task.get();
-        } catch (ExecutionException e) {
-            // Unwrap the cause of the exception and re-throw it.
-            throw e.getCause();
-        }
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/IntegrationTest.java b/base/test/android/javatests/src/org/chromium/base/test/util/IntegrationTest.java
deleted file mode 100644
index 8b6550d..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/IntegrationTest.java
+++ /dev/null
@@ -1,26 +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.
-
-package org.chromium.base.test.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation is for integration tests.
- * <p>
- * Examples of integration tests are tests that rely on real instances of the
- * application's services and components (e.g. Search) to test the system as
- * a whole. These tests may use additional command-line flags to configure the
- * existing backends to use.
- * <p>
- * Such tests are likely NOT reliable enough to run on tree closing bots and
- * should only be run on FYI bots.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface IntegrationTest {
-}
\ No newline at end of file
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/Manual.java b/base/test/android/javatests/src/org/chromium/base/test/util/Manual.java
deleted file mode 100644
index 31f3977..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/Manual.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation can be used to mark a test that should only be run manually.
- * <p>
- * Tests with this annotation will not be run on bots, because they take too long
- * or need manual monitoring.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Manual {
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/ManualSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/ManualSkipCheck.java
deleted file mode 100644
index a916bdf..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/ManualSkipCheck.java
+++ /dev/null
@@ -1,18 +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.
-
-package org.chromium.base.test.util;
-
-import org.junit.runners.model.FrameworkMethod;
-
-/**
- * Skips any test methods annotated with {@code @}{@link Manual}.
- */
-public class ManualSkipCheck extends SkipCheck {
-    @Override
-    public boolean shouldSkip(FrameworkMethod testMethod) {
-        return !AnnotationProcessingUtils.getAnnotations(testMethod.getMethod(), Manual.class)
-                        .isEmpty();
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/Matchers.java b/base/test/android/javatests/src/org/chromium/base/test/util/Matchers.java
deleted file mode 100644
index fc9d689..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/Matchers.java
+++ /dev/null
@@ -1,44 +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.
-
-package org.chromium.base.test.util;
-
-import org.hamcrest.CoreMatchers;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.TypeSafeMatcher;
-
-/**
- * Helper class containing Hamcrest matchers.
- */
-public class Matchers extends CoreMatchers {
-    private static class GreaterThanOrEqualTo<T extends Comparable<T>>
-            extends TypeSafeMatcher<T> {
-
-        private final T mComparisonValue;
-
-        public GreaterThanOrEqualTo(T comparisonValue) {
-            mComparisonValue = comparisonValue;
-        }
-
-        @Override
-        public void describeTo(Description description) {
-            description.appendText("greater than or equal to ").appendValue(mComparisonValue);
-        }
-
-        @Override
-        protected boolean matchesSafely(T item) {
-            return item.compareTo(mComparisonValue) >= 0;
-        }
-    }
-
-    /**
-     * @param <T> A Comparable type.
-     * @param comparisonValue The value to be compared against.
-     * @return A matcher that expects the value to be greater than the |comparisonValue|.
-     */
-    public static <T extends Comparable<T>> Matcher<T> greaterThanOrEqualTo(T comparisonValue) {
-        return new GreaterThanOrEqualTo<>(comparisonValue);
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/MetricsUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/MetricsUtils.java
deleted file mode 100644
index c4664d6..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/MetricsUtils.java
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-import org.chromium.base.metrics.RecordHistogram;
-
-/**
- * Helpers for testing UMA metrics.
- */
-public class MetricsUtils {
-    /**
-     * Helper class that snapshots the given bucket of the given UMA histogram on its creation,
-     * allowing to inspect the number of samples recorded during its lifetime.
-     */
-    public static class HistogramDelta {
-        private final String mHistogram;
-        private final int mSampleValue;
-
-        private final int mInitialCount;
-
-        private int get() {
-            return RecordHistogram.getHistogramValueCountForTesting(mHistogram, mSampleValue);
-        }
-
-        /**
-         * Snapshots the given bucket of the given histogram.
-         * @param histogram name of the histogram to snapshot
-         * @param sampleValue the bucket that contains this value will be snapshot
-         */
-        public HistogramDelta(String histogram, int sampleValue) {
-            mHistogram = histogram;
-            mSampleValue = sampleValue;
-            mInitialCount = get();
-        }
-
-        /** Returns the number of samples of the snapshot bucket recorded since creation */
-        public int getDelta() {
-            return get() - mInitialCount;
-        }
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevel.java b/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevel.java
deleted file mode 100644
index 13e2578..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevel.java
+++ /dev/null
@@ -1,19 +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.
-
-package org.chromium.base.test.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-@Inherited
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD, ElementType.TYPE})
-public @interface MinAndroidSdkLevel {
-    int value() default 0;
-}
-
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java
deleted file mode 100644
index 8b07c0f..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheck.java
+++ /dev/null
@@ -1,43 +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.
-
-package org.chromium.base.test.util;
-
-import android.os.Build;
-
-import org.junit.runners.model.FrameworkMethod;
-
-import org.chromium.base.Log;
-
-/**
- * Checks the device's SDK level against any specified minimum requirement.
- */
-public class MinAndroidSdkLevelSkipCheck extends SkipCheck {
-
-    private static final String TAG = "base_test";
-
-    /**
-     * If {@link MinAndroidSdkLevel} is present, checks its value
-     * against the device's SDK level.
-     *
-     * @param testCase The test to check.
-     * @return true if the device's SDK level is below the specified minimum.
-     */
-    @Override
-    public boolean shouldSkip(FrameworkMethod frameworkMethod) {
-        int minSdkLevel = 0;
-        for (MinAndroidSdkLevel m : AnnotationProcessingUtils.getAnnotations(
-                     frameworkMethod.getMethod(), MinAndroidSdkLevel.class)) {
-            minSdkLevel = Math.max(minSdkLevel, m.value());
-        }
-        if (Build.VERSION.SDK_INT < minSdkLevel) {
-            Log.i(TAG, "Test " + frameworkMethod.getDeclaringClass().getName() + "#"
-                    + frameworkMethod.getName() + " is not enabled at SDK level "
-                    + Build.VERSION.SDK_INT + ".");
-            return true;
-        }
-        return false;
-    }
-
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/Restriction.java b/base/test/android/javatests/src/org/chromium/base/test/util/Restriction.java
deleted file mode 100644
index f39bfbd..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/Restriction.java
+++ /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.
-
-package org.chromium.base.test.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * An annotation for listing restrictions for a test method. For example, if a test method is only
- * applicable on a phone with small memory:
- *     @Restriction({RESTRICTION_TYPE_PHONE, RESTRICTION_TYPE_SMALL_MEMORY})
- * Test classes are free to define restrictions and enforce them using reflection at runtime.
- */
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface Restriction {
-    /** Specifies the test is only valid on low end devices that have less memory. */
-    public static final String RESTRICTION_TYPE_LOW_END_DEVICE = "Low_End_Device";
-
-    /** Specifies the test is only valid on non-low end devices. */
-    public static final String RESTRICTION_TYPE_NON_LOW_END_DEVICE = "Non_Low_End_Device";
-
-    /** Specifies the test is only valid on a device that can reach the internet. */
-    public static final String RESTRICTION_TYPE_INTERNET = "Internet";
-
-    /** Specifies the test is only valid on a device that has a camera. */
-    public static final String RESTRICTION_TYPE_HAS_CAMERA = "Has_Camera";
-
-    /**
-     * @return A list of restrictions.
-     */
-    public String[] value();
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java
deleted file mode 100644
index a27dd1f..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/RestrictionSkipCheck.java
+++ /dev/null
@@ -1,78 +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.
-
-package org.chromium.base.test.util;
-
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.text.TextUtils;
-
-import org.junit.runners.model.FrameworkMethod;
-
-import org.chromium.base.Log;
-import org.chromium.base.SysUtils;
-
-/**
- * Checks if any restrictions exist and skip the test if it meets those restrictions.
- */
-public class RestrictionSkipCheck extends SkipCheck {
-
-    private static final String TAG = "base_test";
-
-    private final Context mTargetContext;
-
-    public RestrictionSkipCheck(Context targetContext) {
-        mTargetContext = targetContext;
-    }
-
-    protected Context getTargetContext() {
-        return mTargetContext;
-    }
-
-    @Override
-    public boolean shouldSkip(FrameworkMethod frameworkMethod) {
-        if (frameworkMethod == null) return true;
-
-        for (Restriction restriction : AnnotationProcessingUtils.getAnnotations(
-                     frameworkMethod.getMethod(), Restriction.class)) {
-            for (String restrictionVal : restriction.value()) {
-                if (restrictionApplies(restrictionVal)) {
-                    Log.i(TAG, "Test " + frameworkMethod.getDeclaringClass().getName() + "#"
-                            + frameworkMethod.getName() + " skipped because of restriction "
-                            + restriction);
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    protected boolean restrictionApplies(String restriction) {
-        if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_LOW_END_DEVICE)
-                && !SysUtils.isLowEndDevice()) {
-            return true;
-        }
-        if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE)
-                && SysUtils.isLowEndDevice()) {
-            return true;
-        }
-        if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_INTERNET)
-                && !isNetworkAvailable()) {
-            return true;
-        }
-        if (TextUtils.equals(restriction, Restriction.RESTRICTION_TYPE_HAS_CAMERA)
-                && !SysUtils.hasCamera(mTargetContext)) {
-            return true;
-        }
-        return false;
-    }
-
-    private boolean isNetworkAvailable() {
-        final ConnectivityManager connectivityManager = (ConnectivityManager)
-                mTargetContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-        final NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
-        return activeNetworkInfo != null && activeNetworkInfo.isConnected();
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/RetryOnFailure.java b/base/test/android/javatests/src/org/chromium/base/test/util/RetryOnFailure.java
deleted file mode 100644
index eb98008..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/RetryOnFailure.java
+++ /dev/null
@@ -1,25 +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.
-
-package org.chromium.base.test.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-// Note this annotation may be a NOOP. Check http://crbug.com/797002 for latest status (also see
-// http://crbug.com/619055). Current default behavior is to retry all tests on failure.
-/**
- * Mark a test as flaky and should be retried on failure. The test is
- * considered passed by the test script if any retry succeeds.
- *
- * Long term, this should be merged with @FlakyTest. But @FlakyTest means
- * has specific meaning that is currently different from RetryOnFailure.
- */
-@Target({ElementType.METHOD, ElementType.TYPE})
-@Retention(RetentionPolicy.RUNTIME)
-public @interface RetryOnFailure {
-    String message() default "";
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/ScalableTimeout.java b/base/test/android/javatests/src/org/chromium/base/test/util/ScalableTimeout.java
deleted file mode 100644
index 7a815c0..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/ScalableTimeout.java
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-/**
- * Utility class for scaling various timeouts by a common factor.
- * For example, to run tests under slow memory tools, you might do
- * something like this:
- *   adb shell "echo 20.0 > /data/local/tmp/chrome_timeout_scale"
- */
-public class ScalableTimeout {
-    private static Double sTimeoutScale;
-    public static final String PROPERTY_FILE = "/data/local/tmp/chrome_timeout_scale";
-
-    public static long scaleTimeout(long timeout) {
-        if (sTimeoutScale == null) {
-            try {
-                char[] data = TestFileUtil.readUtf8File(PROPERTY_FILE, 32);
-                sTimeoutScale = Double.parseDouble(new String(data));
-            } catch (Exception e) {
-                // NumberFormatException, FileNotFoundException, IOException
-                sTimeoutScale = 1.0;
-            }
-        }
-        return (long) (timeout * sTimeoutScale);
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java b/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java
deleted file mode 100644
index d1dd7be..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/SkipCheck.java
+++ /dev/null
@@ -1,49 +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.
-
-package org.chromium.base.test.util;
-
-import junit.framework.TestCase;
-
-import org.junit.runners.model.FrameworkMethod;
-
-import org.chromium.base.Log;
-
-import java.lang.reflect.Method;
-
-/**
- * Check whether a test case should be skipped.
- */
-public abstract class SkipCheck {
-
-    private static final String TAG = "base_test";
-
-    /**
-     *
-     * Checks whether the given test method should be skipped.
-     *
-     * @param testMethod The test method to check.
-     * @return Whether the test case should be skipped.
-     */
-    public abstract boolean shouldSkip(FrameworkMethod testMethod);
-
-    /**
-     *
-     * Checks whether the given test case should be skipped.
-     *
-     * @param testCase The test case to check.
-     * @return Whether the test case should be skipped.
-     */
-    public boolean shouldSkip(TestCase testCase) {
-        try {
-            Method m = testCase.getClass().getMethod(testCase.getName(), (Class[]) null);
-            return shouldSkip(new FrameworkMethod(m));
-        } catch (NoSuchMethodException e) {
-            Log.e(TAG, "Unable to find %s in %s", testCase.getName(),
-                    testCase.getClass().getName(), e);
-            return false;
-        }
-    }
-}
-
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/TestFileUtil.java b/base/test/android/javatests/src/org/chromium/base/test/util/TestFileUtil.java
deleted file mode 100644
index 6d89121..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/TestFileUtil.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.Arrays;
-
-/**
- * Utility class for dealing with files for test.
- */
-public class TestFileUtil {
-    public static void createNewHtmlFile(String name, String title, String body)
-            throws IOException {
-        createNewHtmlFile(new File(name), title, body);
-    }
-
-    public static void createNewHtmlFile(File file, String title, String body)
-            throws IOException {
-        if (!file.createNewFile()) {
-            throw new IOException("File \"" + file.getAbsolutePath() + "\" already exists");
-        }
-
-        Writer writer = null;
-        try {
-            writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
-            writer.write("<html><meta charset=\"UTF-8\" />"
-                    + "     <head><title>" + title + "</title></head>"
-                    + "     <body>"
-                    + (body != null ? body : "")
-                    + "     </body>"
-                    + "   </html>");
-        } finally {
-            if (writer != null) {
-                writer.close();
-            }
-        }
-    }
-
-    public static void deleteFile(String name) {
-        deleteFile(new File(name));
-    }
-
-    public static void deleteFile(File file) {
-        boolean deleted = file.delete();
-        assert (deleted || !file.exists());
-    }
-
-    /**
-     * @param fileName the file to read in.
-     * @param sizeLimit cap on the file size: will throw an exception if exceeded
-     * @return Array of chars read from the file
-     * @throws FileNotFoundException file does not exceed
-     * @throws IOException error encountered accessing the file
-     */
-    public static char[] readUtf8File(String fileName, int sizeLimit) throws
-            FileNotFoundException, IOException {
-        Reader reader = null;
-        try {
-            File f = new File(fileName);
-            if (f.length() > sizeLimit) {
-                throw new IOException("File " + fileName + " length " + f.length()
-                        + " exceeds limit " + sizeLimit);
-            }
-            char[] buffer = new char[(int) f.length()];
-            reader = new InputStreamReader(new FileInputStream(f), "UTF-8");
-            int charsRead = reader.read(buffer);
-            // Debug check that we've exhausted the input stream (will fail e.g. if the
-            // file grew after we inspected its length).
-            assert !reader.ready();
-            return charsRead < buffer.length ? Arrays.copyOfRange(buffer, 0, charsRead) : buffer;
-        } finally {
-            if (reader != null) reader.close();
-        }
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/TestThread.java b/base/test/android/javatests/src/org/chromium/base/test/util/TestThread.java
deleted file mode 100644
index 4f62969..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/TestThread.java
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-import android.os.Handler;
-import android.os.Looper;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-
-/**
- * This class is usefull when writing instrumentation tests that exercise code that posts tasks
- * (to the same thread).
- * Since the test code is run in a single thread, the posted tasks are never executed.
- * The TestThread class lets you run that code on a specific thread synchronously and flush the
- * message loop on that thread.
- *
- * Example of test using this:
- *
- * public void testMyAwesomeClass() {
- *   TestThread testThread = new TestThread();
- *   testThread.startAndWaitForReadyState();
- *
- *   testThread.runOnTestThreadSyncAndProcessPendingTasks(new Runnable() {
- *       @Override
- *       public void run() {
- *           MyAwesomeClass.doStuffAsync();
- *       }
- *   });
- *   // Once we get there we know doStuffAsync has been executed and all the tasks it posted.
- *   assertTrue(MyAwesomeClass.stuffWasDone());
- * }
- *
- * Notes:
- * - this is only for tasks posted to the same thread. Anyway if you were posting to a different
- *   thread, you'd probably need to set that other thread up.
- * - this only supports tasks posted using Handler.post(), it won't work with postDelayed and
- *   postAtTime.
- * - if your test instanciates an object and that object is the one doing the posting of tasks, you
- *   probably want to instanciate it on the test thread as it might create the Handler it posts
- *   tasks to in the constructor.
- */
-
-public class TestThread extends Thread {
-    private final Object mThreadReadyLock;
-    private AtomicBoolean mThreadReady;
-    private Handler mMainThreadHandler;
-    private Handler mTestThreadHandler;
-
-    public TestThread() {
-        mMainThreadHandler = new Handler();
-        // We can't use the AtomicBoolean as the lock or findbugs will freak out...
-        mThreadReadyLock = new Object();
-        mThreadReady = new AtomicBoolean();
-    }
-
-    @Override
-    public void run() {
-        Looper.prepare();
-        mTestThreadHandler = new Handler();
-        mTestThreadHandler.post(new Runnable() {
-            @Override
-            public void run() {
-                synchronized (mThreadReadyLock) {
-                    mThreadReady.set(true);
-                    mThreadReadyLock.notify();
-                }
-            }
-        });
-        Looper.loop();
-    }
-
-    /**
-     * Starts this TestThread and blocks until it's ready to accept calls.
-     */
-    public void startAndWaitForReadyState() {
-        checkOnMainThread();
-        start();
-        synchronized (mThreadReadyLock) {
-            try {
-                // Note the mThreadReady and while are not really needed.
-                // There are there so findbugs don't report warnings.
-                while (!mThreadReady.get()) {
-                    mThreadReadyLock.wait();
-                }
-            } catch (InterruptedException ie) {
-                System.err.println("Error starting TestThread.");
-                ie.printStackTrace();
-            }
-        }
-    }
-
-    /**
-     * Runs the passed Runnable synchronously on the TestThread and returns when all pending
-     * runnables have been excuted.
-     * Should be called from the main thread.
-     */
-    public void runOnTestThreadSyncAndProcessPendingTasks(Runnable r) {
-        checkOnMainThread();
-
-        runOnTestThreadSync(r);
-
-        // Run another task, when it's done it means all pendings tasks have executed.
-        runOnTestThreadSync(null);
-    }
-
-    /**
-     * Runs the passed Runnable on the test thread and blocks until it has finished executing.
-     * Should be called from the main thread.
-     * @param r The runnable to be executed.
-     */
-    public void runOnTestThreadSync(final Runnable r) {
-        checkOnMainThread();
-        final Object lock = new Object();
-        // Task executed is not really needed since we are only on one thread, it is here to appease
-        // findbugs.
-        final AtomicBoolean taskExecuted = new AtomicBoolean();
-        mTestThreadHandler.post(new Runnable() {
-            @Override
-            public void run() {
-                if (r != null) r.run();
-                synchronized (lock) {
-                    taskExecuted.set(true);
-                    lock.notify();
-                }
-            }
-        });
-        synchronized (lock) {
-            try {
-                while (!taskExecuted.get()) {
-                    lock.wait();
-                }
-            } catch (InterruptedException ie) {
-                ie.printStackTrace();
-            }
-        }
-    }
-
-    private void checkOnMainThread() {
-        assert Looper.myLooper() == mMainThreadHandler.getLooper();
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/TimeoutScale.java b/base/test/android/javatests/src/org/chromium/base/test/util/TimeoutScale.java
deleted file mode 100644
index 5aee05e..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/TimeoutScale.java
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation can be used to scale a specific test timeout.
- */
-@Target(ElementType.METHOD)
-@Retention(RetentionPolicy.RUNTIME)
-public @interface TimeoutScale {
-    /**
-     * @return A number to scale the test timeout.
-     */
-    public int value();
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/UrlUtils.java b/base/test/android/javatests/src/org/chromium/base/test/util/UrlUtils.java
deleted file mode 100644
index 9ca3fcc..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/UrlUtils.java
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.base.test.util;
-
-import org.junit.Assert;
-
-import org.chromium.base.PathUtils;
-import org.chromium.base.annotations.CalledByNative;
-import org.chromium.base.annotations.MainDex;
-
-/**
- * Collection of URL utilities.
- */
-@MainDex
-public class UrlUtils {
-    private static final String DATA_DIR = "/chrome/test/data/";
-
-    /**
-     * Construct the full path of a test data file.
-     * @param path Pathname relative to external/chrome/test/data
-     */
-    public static String getTestFilePath(String path) {
-        // TODO(jbudorick): Remove DATA_DIR once everything has been isolated. crbug/400499
-        return getIsolatedTestFilePath(DATA_DIR + path);
-    }
-
-    // TODO(jbudorick): Remove this function once everything has been isolated and switched back
-    // to getTestFilePath. crbug/400499
-    /**
-     * Construct the full path of a test data file.
-     * @param path Pathname relative to external/
-     */
-    public static String getIsolatedTestFilePath(String path) {
-        return getIsolatedTestRoot() + "/" + path;
-    }
-
-    /**
-     * Returns the root of the test data directory.
-     */
-    @CalledByNative
-    public static String getIsolatedTestRoot() {
-        return PathUtils.getExternalStorageDirectory() + "/chromium_tests_root";
-    }
-
-    /**
-     * Construct a suitable URL for loading a test data file.
-     * @param path Pathname relative to external/chrome/test/data
-     */
-    public static String getTestFileUrl(String path) {
-        return "file://" + getTestFilePath(path);
-    }
-
-    // TODO(jbudorick): Remove this function once everything has been isolated and switched back
-    // to getTestFileUrl. crbug/400499
-    /**
-     * Construct a suitable URL for loading a test data file.
-     * @param path Pathname relative to external/
-     */
-    public static String getIsolatedTestFileUrl(String path) {
-        return "file://" + getIsolatedTestFilePath(path);
-    }
-
-    /**
-     * Construct a data:text/html URI for loading from an inline HTML.
-     * @param html An unencoded HTML
-     * @return String An URI that contains the given HTML
-     */
-    public static String encodeHtmlDataUri(String html) {
-        try {
-            // URLEncoder encodes into application/x-www-form-encoded, so
-            // ' '->'+' needs to be undone and replaced with ' '->'%20'
-            // to match the Data URI requirements.
-            String encoded =
-                    "data:text/html;utf-8," + java.net.URLEncoder.encode(html, "UTF-8");
-            encoded = encoded.replace("+", "%20");
-            return encoded;
-        } catch (java.io.UnsupportedEncodingException e) {
-            Assert.fail("Unsupported encoding: " + e.getMessage());
-            return null;
-        }
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java b/base/test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java
deleted file mode 100644
index 88e3551..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/UserActionTester.java
+++ /dev/null
@@ -1,51 +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.
-
-package org.chromium.base.test.util;
-
-import org.chromium.base.ThreadUtils;
-import org.chromium.base.metrics.RecordUserAction;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A util class that records UserActions.
- */
-public class UserActionTester implements RecordUserAction.UserActionCallback {
-    private List<String> mActions;
-
-    public UserActionTester() {
-        mActions = new ArrayList<>();
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                RecordUserAction.setActionCallbackForTesting(UserActionTester.this);
-            }
-        });
-    }
-
-    public void tearDown() {
-        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
-            @Override
-            public void run() {
-                RecordUserAction.removeActionCallbackForTesting();
-            }
-        });
-    }
-
-    @Override
-    public void onActionRecorded(String action) {
-        mActions.add(action);
-    }
-
-    public List<String> getActions() {
-        return mActions;
-    }
-
-    @Override
-    public String toString() {
-        return "Actions: " + mActions.toString();
-    }
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/parameter/CommandLineParameter.java b/base/test/android/javatests/src/org/chromium/base/test/util/parameter/CommandLineParameter.java
deleted file mode 100644
index e6f5506..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/parameter/CommandLineParameter.java
+++ /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.
-
-package org.chromium.base.test.util.parameter;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * The annotation for parametering CommandLineFlags in JUnit3 instrumentation tests.
- *
- * E.g. if you add the following annotation to your test class:
- *
- * <code>
- * @CommandLineParameter({"", FLAG_A, FLAG_B})
- * public class MyTestClass
- * </code>
- *
- * The test harness would run the test 3 times with each of the flag added to commandline
- * file.
- */
-
-@Inherited
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD, ElementType.TYPE})
-public @interface CommandLineParameter {
-    String[] value() default {};
-}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/parameter/SkipCommandLineParameterization.java b/base/test/android/javatests/src/org/chromium/base/test/util/parameter/SkipCommandLineParameterization.java
deleted file mode 100644
index 2181031..0000000
--- a/base/test/android/javatests/src/org/chromium/base/test/util/parameter/SkipCommandLineParameterization.java
+++ /dev/null
@@ -1,23 +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.
-package org.chromium.base.test.util.parameter;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Inherited;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * BaseJUnit4ClassRunner and host side test harness skips commandline parameterization for test
- * classes or methods annotated with SkipCommandLineParameterization.
- *
- * This usually used by test that only runs in WebView javatests that only runs in sandboxed mode
- * or single process mode.
- */
-
-@Inherited
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD, ElementType.TYPE})
-public @interface SkipCommandLineParameterization {}
diff --git a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java b/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
deleted file mode 100644
index 3ca756a..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java
+++ /dev/null
@@ -1,49 +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.
-
-package org.chromium.base.test;
-
-import org.junit.runners.model.InitializationError;
-import org.robolectric.DefaultTestLifecycle;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.TestLifecycle;
-
-import org.chromium.base.ApplicationStatus;
-import org.chromium.base.CommandLine;
-import org.chromium.base.ContextUtils;
-import org.chromium.testing.local.LocalRobolectricTestRunner;
-
-import java.lang.reflect.Method;
-
-/**
- * A Robolectric Test Runner that initializes base globals.
- */
-public class BaseRobolectricTestRunner extends LocalRobolectricTestRunner {
-    /**
-     * Enables a per-test setUp / tearDown hook.
-     */
-    public static class BaseTestLifecycle extends DefaultTestLifecycle {
-        @Override
-        public void beforeTest(Method method) {
-            ContextUtils.initApplicationContextForTests(RuntimeEnvironment.application);
-            CommandLine.init(null);
-            super.beforeTest(method);
-        }
-
-        @Override
-        public void afterTest(Method method) {
-            ApplicationStatus.destroyForJUnitTests();
-            super.afterTest(method);
-        }
-    }
-
-    public BaseRobolectricTestRunner(Class<?> testClass) throws InitializationError {
-        super(testClass);
-    }
-
-    @Override
-    protected Class<? extends TestLifecycle> getTestLifecycleClass() {
-        return BaseTestLifecycle.class;
-    }
-}
diff --git a/base/test/android/junit/src/org/chromium/base/test/SetUpStatementTest.java b/base/test/android/junit/src/org/chromium/base/test/SetUpStatementTest.java
deleted file mode 100644
index 722bd1a..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/SetUpStatementTest.java
+++ /dev/null
@@ -1,64 +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.
-
-package org.chromium.base.test;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.junit.runners.BlockJUnit4ClassRunner;
-import org.junit.runners.model.Statement;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Test SetUpStatement is working as intended with SetUpTestRule.
- */
-@RunWith(BlockJUnit4ClassRunner.class)
-public class SetUpStatementTest {
-    private Statement mBase;
-    private SetUpTestRule<TestRule> mRule;
-    private List<Integer> mList;
-
-    @Before
-    public void setUp() {
-        mBase = new Statement() {
-            @Override
-            public void evaluate() {
-                mList.add(1);
-            }
-        };
-        mList = new ArrayList<>();
-        mRule = new SetUpTestRule<TestRule>() {
-            @Override
-            public void setUp() {
-                mList.add(0);
-            }
-
-            @Override
-            public TestRule shouldSetUp(boolean toSetUp) {
-                return null;
-            }
-        };
-    }
-
-    @Test
-    public void testSetUpStatementShouldSetUp() throws Throwable {
-        SetUpStatement statement = new SetUpStatement(mBase, mRule, true);
-        statement.evaluate();
-        Integer[] expected = {0, 1};
-        Assert.assertArrayEquals(expected, mList.toArray());
-    }
-
-    @Test
-    public void testSetUpStatementShouldNotSetUp() throws Throwable {
-        SetUpStatement statement = new SetUpStatement(mBase, mRule, false);
-        statement.evaluate();
-        Integer[] expected = {1};
-        Assert.assertArrayEquals(expected, mList.toArray());
-    }
-}
diff --git a/base/test/android/junit/src/org/chromium/base/test/TestListInstrumentationRunListenerTest.java b/base/test/android/junit/src/org/chromium/base/test/TestListInstrumentationRunListenerTest.java
deleted file mode 100644
index 63fa560..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/TestListInstrumentationRunListenerTest.java
+++ /dev/null
@@ -1,119 +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.
-
-package org.chromium.base.test;
-
-import static org.chromium.base.test.TestListInstrumentationRunListener.getAnnotationJSON;
-import static org.chromium.base.test.TestListInstrumentationRunListener.getTestMethodJSON;
-
-import org.json.JSONObject;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.Description;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-import org.chromium.base.test.util.CommandLineFlags;
-
-import java.util.Arrays;
-
-/**
- * Robolectric test to ensure static methods in TestListInstrumentationRunListener works properly.
- */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class TestListInstrumentationRunListenerTest {
-    @CommandLineFlags.Add("hello")
-    private static class ParentClass {
-        public void testA() {}
-
-        @CommandLineFlags.Add("world")
-        public void testB() {}
-    }
-
-    @CommandLineFlags.Remove("hello")
-    private static class ChildClass extends ParentClass {
-    }
-
-    @Test
-    public void testGetTestMethodJSON_testA() throws Throwable {
-        Description desc = Description.createTestDescription(
-                ParentClass.class, "testA",
-                ParentClass.class.getMethod("testA").getAnnotations());
-        JSONObject json = getTestMethodJSON(desc);
-        String expectedJsonString =
-                "{"
-                + "'method': 'testA',"
-                + "'annotations': {}"
-                + "}";
-        expectedJsonString = expectedJsonString
-            .replaceAll("\\s", "")
-            .replaceAll("'", "\"");
-        Assert.assertEquals(expectedJsonString, json.toString());
-    }
-
-    @Test
-    public void testGetTestMethodJSON_testB() throws Throwable {
-        Description desc = Description.createTestDescription(
-                ParentClass.class, "testB",
-                ParentClass.class.getMethod("testB").getAnnotations());
-        JSONObject json = getTestMethodJSON(desc);
-        String expectedJsonString =
-                "{"
-                + "'method': 'testB',"
-                + "'annotations': {"
-                + "  'Add': {"
-                + "    'value': ['world']"
-                + "    }"
-                + "  }"
-                + "}";
-        expectedJsonString = expectedJsonString
-            .replaceAll("\\s", "")
-            .replaceAll("'", "\"");
-        Assert.assertEquals(expectedJsonString, json.toString());
-    }
-
-
-    @Test
-    public void testGetTestMethodJSONForInheritedClass() throws Throwable {
-        Description desc = Description.createTestDescription(
-                ChildClass.class, "testB",
-                ChildClass.class.getMethod("testB").getAnnotations());
-        JSONObject json = getTestMethodJSON(desc);
-        String expectedJsonString =
-                "{"
-                + "'method': 'testB',"
-                + "'annotations': {"
-                + "  'Add': {"
-                + "    'value': ['world']"
-                + "    }"
-                + "  }"
-                + "}";
-        expectedJsonString = expectedJsonString
-            .replaceAll("\\s", "")
-            .replaceAll("'", "\"");
-        Assert.assertEquals(expectedJsonString, json.toString());
-    }
-
-    @Test
-    public void testGetAnnotationJSONForParentClass() throws Throwable {
-        JSONObject json = getAnnotationJSON(Arrays.asList(ParentClass.class.getAnnotations()));
-        String expectedJsonString = "{'Add':{'value':['hello']}}";
-        expectedJsonString = expectedJsonString
-            .replaceAll("\\s", "")
-            .replaceAll("'", "\"");
-        Assert.assertEquals(expectedJsonString, json.toString());
-    }
-
-    @Test
-    public void testGetAnnotationJSONForChildClass() throws Throwable {
-        JSONObject json = getAnnotationJSON(Arrays.asList(ChildClass.class.getAnnotations()));
-        String expectedJsonString = "{'Add':{'value':['hello']},'Remove':{'value':['hello']}}";
-        expectedJsonString = expectedJsonString
-            .replaceAll("\\s", "")
-            .replaceAll("'", "\"");
-        Assert.assertEquals(expectedJsonString, json.toString());
-    }
-}
-
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ExampleParameterizedTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ExampleParameterizedTest.java
deleted file mode 100644
index 6ffccad..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/params/ExampleParameterizedTest.java
+++ /dev/null
@@ -1,105 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.Assert;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.MethodRule;
-import org.junit.runner.RunWith;
-
-import org.chromium.base.test.params.ParameterAnnotations.ClassParameter;
-import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter;
-import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameterAfter;
-import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameterBefore;
-import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Example test that uses ParameterizedRunner
- */
-@RunWith(ParameterizedRunner.class)
-@UseRunnerDelegate(BlockJUnit4RunnerDelegate.class)
-public class ExampleParameterizedTest {
-    @ClassParameter
-    private static List<ParameterSet> sClassParams =
-            Arrays.asList(new ParameterSet().value("hello", "world").name("HelloWorld"),
-                    new ParameterSet().value("Xxxx", "Yyyy").name("XxxxYyyy"),
-                    new ParameterSet().value("aa", "yy").name("AaYy"));
-
-    public static class MethodParamsA implements ParameterProvider {
-        private static List<ParameterSet> sMethodParamA =
-                Arrays.asList(new ParameterSet().value(1, 2).name("OneTwo"),
-                        new ParameterSet().value(2, 3).name("TwoThree"),
-                        new ParameterSet().value(3, 4).name("ThreeFour"));
-
-        @Override
-        public List<ParameterSet> getParameters() {
-            return sMethodParamA;
-        }
-    }
-
-    public static class MethodParamsB implements ParameterProvider {
-        private static List<ParameterSet> sMethodParamB =
-                Arrays.asList(new ParameterSet().value("a", "b").name("Ab"),
-                        new ParameterSet().value("b", "c").name("Bc"),
-                        new ParameterSet().value("c", "d").name("Cd"),
-                        new ParameterSet().value("d", "e").name("De"));
-
-        @Override
-        public List<ParameterSet> getParameters() {
-            return sMethodParamB;
-        }
-    }
-
-    private String mStringA;
-    private String mStringB;
-
-    public ExampleParameterizedTest(String a, String b) {
-        mStringA = a;
-        mStringB = b;
-    }
-
-    @Test
-    public void testSimple() {
-        Assert.assertEquals(
-                "A and B string length aren't equal", mStringA.length(), mStringB.length());
-    }
-
-    @Rule
-    public MethodRule mMethodParamAnnotationProcessor = new MethodParamAnnotationRule();
-
-    private Integer mSum;
-
-    @UseMethodParameterBefore(MethodParamsA.class)
-    public void setupWithOnlyA(int intA, int intB) {
-        mSum = intA + intB;
-    }
-
-    @Test
-    @UseMethodParameter(MethodParamsA.class)
-    public void testWithOnlyA(int intA, int intB) {
-        Assert.assertEquals(intA + 1, intB);
-        Assert.assertEquals(mSum, Integer.valueOf(intA + intB));
-        mSum = null;
-    }
-
-    private String mConcatenation;
-
-    @Test
-    @UseMethodParameter(MethodParamsB.class)
-    public void testWithOnlyB(String a, String b) {
-        Assert.assertTrue(!a.equals(b));
-        mConcatenation = a + b;
-    }
-
-    @UseMethodParameterAfter(MethodParamsB.class)
-    public void teardownWithOnlyB(String a, String b) {
-        Assert.assertEquals(mConcatenation, a + b);
-        mConcatenation = null;
-    }
-}
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommonTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommonTest.java
deleted file mode 100644
index 6d854c5..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateCommonTest.java
+++ /dev/null
@@ -1,77 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.BlockJUnit4ClassRunner;
-import org.junit.runners.model.TestClass;
-
-import org.chromium.base.test.params.ParameterizedRunner.ParameterizedTestInstantiationException;
-
-import java.util.Collections;
-
-@RunWith(BlockJUnit4ClassRunner.class)
-public class ParameterizedRunnerDelegateCommonTest {
-    /**
-     * Create a test object using the list of class parameter set
-     *
-     * @param testClass the {@link TestClass} object for current test class
-     * @param classParameterSet the parameter set needed for the test class constructor
-     */
-    private static Object createTest(TestClass testClass, ParameterSet classParameterSet)
-            throws ParameterizedTestInstantiationException {
-        return new ParameterizedRunnerDelegateCommon(
-                testClass, classParameterSet, Collections.emptyList())
-                .createTest();
-    }
-
-    static class BadTestClassWithMoreThanOneConstructor {
-        public BadTestClassWithMoreThanOneConstructor() {}
-        @SuppressWarnings("unused")
-        public BadTestClassWithMoreThanOneConstructor(String argument) {}
-    }
-
-    static class BadTestClassWithTwoArgumentConstructor {
-        @SuppressWarnings("unused")
-        public BadTestClassWithTwoArgumentConstructor(int a, int b) {}
-    }
-
-    static abstract class BadTestClassAbstract {
-        public BadTestClassAbstract() {}
-    }
-
-    static class BadTestClassConstructorThrows {
-        public BadTestClassConstructorThrows() {
-            throw new RuntimeException();
-        }
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testCreateTestWithMoreThanOneConstructor() throws Throwable {
-        TestClass testClass = new TestClass(BadTestClassWithMoreThanOneConstructor.class);
-        createTest(testClass, null);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testCreateTestWithIncorrectArguments() throws Throwable {
-        TestClass testClass = new TestClass(BadTestClassWithTwoArgumentConstructor.class);
-        ParameterSet pSet = new ParameterSet().value(1, 2, 3);
-        createTest(testClass, pSet);
-    }
-
-    @Test(expected = ParameterizedTestInstantiationException.class)
-    public void testCreateTestWithAbstractClass() throws ParameterizedTestInstantiationException {
-        TestClass testClass = new TestClass(BadTestClassAbstract.class);
-        createTest(testClass, null);
-    }
-
-    @Test(expected = ParameterizedTestInstantiationException.class)
-    public void testCreateTestWithThrowingConstructor()
-            throws ParameterizedTestInstantiationException {
-        TestClass testClass = new TestClass(BadTestClassConstructorThrows.class);
-        createTest(testClass, null);
-    }
-}
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactoryTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactoryTest.java
deleted file mode 100644
index 723382d..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerDelegateFactoryTest.java
+++ /dev/null
@@ -1,133 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.BlockJUnit4ClassRunner;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.TestClass;
-
-import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter;
-import org.chromium.base.test.params.ParameterizedRunnerDelegateFactory.ParameterizedRunnerDelegateInstantiationException;
-
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Test for org.chromium.base.test.params.ParameterizedRunnerDelegateFactory
- */
-@RunWith(BlockJUnit4ClassRunner.class)
-public class ParameterizedRunnerDelegateFactoryTest {
-    /**
-     * This RunnerDelegate calls `super.collectInitializationErrors()` and would
-     * cause BlockJUnit4ClassRunner to validate test classes.
-     */
-    public static class BadExampleRunnerDelegate
-            extends BlockJUnit4ClassRunner implements ParameterizedRunnerDelegate {
-        public static class LalaTestClass {}
-
-        private final List<FrameworkMethod> mParameterizedFrameworkMethodList;
-
-        BadExampleRunnerDelegate(Class<?> klass,
-                List<FrameworkMethod> parameterizedFrameworkMethods) throws InitializationError {
-            super(klass);
-            mParameterizedFrameworkMethodList = parameterizedFrameworkMethods;
-        }
-
-        @Override
-        public void collectInitializationErrors(List<Throwable> errors) {
-            super.collectInitializationErrors(errors); // This is wrong!!
-        }
-
-        @Override
-        public List<FrameworkMethod> computeTestMethods() {
-            return mParameterizedFrameworkMethodList;
-        }
-
-        @Override
-        public Object createTest() {
-            return null;
-        }
-    }
-
-    static class ExampleTestClass {
-        static class MethodParamsA implements ParameterProvider {
-            @Override
-            public Iterable<ParameterSet> getParameters() {
-                return Arrays.asList(
-                        new ParameterSet().value("a").name("testWithValue_a"),
-                        new ParameterSet().value("b").name("testWithValue_b")
-                );
-            }
-        }
-
-        @SuppressWarnings("unused")
-        @UseMethodParameter(MethodParamsA.class)
-        @Test
-        public void testA(String a) {}
-
-        static class MethodParamsB implements ParameterProvider {
-            @Override
-            public Iterable<ParameterSet> getParameters() {
-                return Arrays.asList(
-                        new ParameterSet().value(1).name("testWithValue_1"),
-                        new ParameterSet().value(2).name("testWithValue_2"),
-                        new ParameterSet().value(3).name("testWithValue_3")
-                );
-            }
-        }
-
-        @SuppressWarnings("unused")
-        @UseMethodParameter(MethodParamsB.class)
-        @Test
-        public void testB(int b) {}
-
-        @Test
-        public void testByMyself() {}
-    }
-
-    /**
-     * This test validates ParameterizedRunnerDelegateFactory throws exception when
-     * a runner delegate does not override the collectInitializationErrors method.
-     */
-    @Test(expected = ParameterizedRunnerDelegateInstantiationException.class)
-    public void testBadRunnerDelegateWithIncorrectValidationCall() throws Throwable {
-        ParameterizedRunnerDelegateFactory factory = new ParameterizedRunnerDelegateFactory();
-        TestClass testClass = new TestClass(BadExampleRunnerDelegate.LalaTestClass.class);
-        factory.createRunner(testClass, null, BadExampleRunnerDelegate.class);
-    }
-
-    @Test
-    public void testGenerateParameterizedFrameworkMethod() throws Throwable {
-        List<FrameworkMethod> methods =
-                ParameterizedRunnerDelegateFactory.generateUnmodifiableFrameworkMethodList(
-                        new TestClass(ExampleTestClass.class), "");
-
-        Assert.assertEquals(methods.size(), 6);
-
-        Map<String, Method> expectedTests = new HashMap<>();
-        Method testMethodA = ExampleTestClass.class.getDeclaredMethod("testA", String.class);
-        Method testMethodB = ExampleTestClass.class.getDeclaredMethod("testB", int.class);
-        Method testMethodByMyself = ExampleTestClass.class.getDeclaredMethod("testByMyself");
-        expectedTests.put("testA__testWithValue_a", testMethodA);
-        expectedTests.put("testA__testWithValue_b", testMethodA);
-        expectedTests.put("testB__testWithValue_1", testMethodB);
-        expectedTests.put("testB__testWithValue_2", testMethodB);
-        expectedTests.put("testB__testWithValue_3", testMethodB);
-        expectedTests.put("testByMyself", testMethodByMyself);
-        for (FrameworkMethod method : methods) {
-            Assert.assertNotNull(expectedTests.get(method.getName()));
-            Assert.assertEquals(expectedTests.get(method.getName()), method.getMethod());
-            expectedTests.remove(method.getName());
-        }
-        Assert.assertTrue(expectedTests.isEmpty());
-    }
-}
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerTest.java
deleted file mode 100644
index 170ff69..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerTest.java
+++ /dev/null
@@ -1,108 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.BlockJUnit4ClassRunner;
-
-import org.chromium.base.test.params.ParameterAnnotations.ClassParameter;
-import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate;
-import org.chromium.base.test.params.ParameterizedRunner.IllegalParameterArgumentException;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Test for org.chromium.base.test.params.ParameterizedRunner
- */
-@RunWith(BlockJUnit4ClassRunner.class)
-public class ParameterizedRunnerTest {
-    @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class)
-    public static class BadTestClassWithMoreThanOneConstructor {
-        @ClassParameter
-        static List<ParameterSet> sClassParams = new ArrayList<>();
-
-        public BadTestClassWithMoreThanOneConstructor() {}
-
-        public BadTestClassWithMoreThanOneConstructor(String x) {}
-    }
-
-    @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class)
-    public static class BadTestClassWithNonListParameters {
-        @ClassParameter
-        static String[] sMethodParamA = {"1", "2"};
-
-        @Test
-        public void test() {}
-    }
-
-    @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class)
-    public static class BadTestClassWithoutNeedForParameterization {
-        @Test
-        public void test() {}
-    }
-
-    @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class)
-    public static class BadTestClassWithNonStaticParameterSetList {
-        @ClassParameter
-        public List<ParameterSet> mClassParams = new ArrayList<>();
-
-        @Test
-        public void test() {}
-    }
-
-    @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class)
-    public static class BadTestClassWithMultipleClassParameter {
-        @ClassParameter
-        private static List<ParameterSet> sParamA = new ArrayList<>();
-
-        @ClassParameter
-        private static List<ParameterSet> sParamB = new ArrayList<>();
-    }
-
-    @Test(expected = ParameterizedRunner.IllegalParameterArgumentException.class)
-    public void testEmptyParameterSet() {
-        List<ParameterSet> paramList = new ArrayList<>();
-        paramList.add(new ParameterSet());
-        ParameterizedRunner.validateWidth(paramList);
-    }
-
-    @Test(expected = ParameterizedRunner.IllegalParameterArgumentException.class)
-    public void testUnequalWidthParameterSetList() {
-        List<ParameterSet> paramList = new ArrayList<>();
-        paramList.add(new ParameterSet().value(1, 2));
-        paramList.add(new ParameterSet().value(3, 4, 5));
-        ParameterizedRunner.validateWidth(paramList);
-    }
-
-    @Test(expected = ParameterizedRunner.IllegalParameterArgumentException.class)
-    public void testUnequalWidthParameterSetListWithNull() {
-        List<ParameterSet> paramList = new ArrayList<>();
-        paramList.add(new ParameterSet().value(null));
-        paramList.add(new ParameterSet().value(1, 2));
-        ParameterizedRunner.validateWidth(paramList);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testBadClassWithNonListParameters() throws Throwable {
-        new ParameterizedRunner(BadTestClassWithNonListParameters.class);
-    }
-
-    @Test(expected = IllegalParameterArgumentException.class)
-    public void testBadClassWithNonStaticParameterSetList() throws Throwable {
-        new ParameterizedRunner(BadTestClassWithNonStaticParameterSetList.class);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testBadClassWithoutNeedForParameterization() throws Throwable {
-        new ParameterizedRunner(BadTestClassWithoutNeedForParameterization.class);
-    }
-
-    @Test(expected = Exception.class)
-    public void testBadClassWithMoreThanOneConstructor() throws Throwable {
-        new ParameterizedRunner(BadTestClassWithMoreThanOneConstructor.class);
-    }
-}
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedTestNameTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedTestNameTest.java
deleted file mode 100644
index e79f5c5..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedTestNameTest.java
+++ /dev/null
@@ -1,201 +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.
-
-package org.chromium.base.test.params;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runner.Runner;
-import org.junit.runners.BlockJUnit4ClassRunner;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.TestClass;
-
-import org.chromium.base.test.params.ParameterAnnotations.ClassParameter;
-import org.chromium.base.test.params.ParameterAnnotations.UseMethodParameter;
-import org.chromium.base.test.params.ParameterAnnotations.UseRunnerDelegate;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Test for verify the names and test method Description works properly
- */
-@RunWith(BlockJUnit4ClassRunner.class)
-public class ParameterizedTestNameTest {
-    @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class)
-    public static class TestClassWithClassParameterAppendName {
-        @ClassParameter
-        static List<ParameterSet> sAllName = Arrays.asList(
-                new ParameterSet().value("hello").name("Hello"),
-                new ParameterSet().value("world").name("World")
-        );
-
-        public TestClassWithClassParameterAppendName(String a) {}
-
-        @Test
-        public void test() {}
-    }
-
-    @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class)
-    public static class TestClassWithClassParameterDefaultName {
-        @ClassParameter
-        static List<ParameterSet> sAllName = Arrays.asList(
-                new ParameterSet().value("hello"),
-                new ParameterSet().value("world")
-        );
-
-        public TestClassWithClassParameterDefaultName(String a) {}
-
-        @Test
-        public void test() {}
-    }
-
-    @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class)
-    public static class TestClassWithMethodParameter {
-        static class AppendNameParams implements ParameterProvider {
-            @Override
-            public Iterable<ParameterSet> getParameters() {
-                return Arrays.asList(
-                        new ParameterSet().value("hello").name("Hello"),
-                        new ParameterSet().value("world").name("World")
-                );
-            }
-        }
-
-        static class DefaultNameParams implements ParameterProvider {
-            @Override
-            public Iterable<ParameterSet> getParameters() {
-                return Arrays.asList(
-                        new ParameterSet().value("hello"),
-                        new ParameterSet().value("world")
-                );
-            }
-        }
-
-        @UseMethodParameter(AppendNameParams.class)
-        @Test
-        public void test(String a) {}
-
-        @UseMethodParameter(DefaultNameParams.class)
-        @Test
-        public void testDefaultName(String b) {}
-    }
-
-    @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class)
-    public static class TestClassWithMixedParameter {
-        @ClassParameter
-        static List<ParameterSet> sAllName = Arrays.asList(
-                new ParameterSet().value("hello").name("Hello"),
-                new ParameterSet().value("world").name("World")
-        );
-
-        static class AppendNameParams implements ParameterProvider {
-            @Override
-            public Iterable<ParameterSet> getParameters() {
-                return Arrays.asList(
-                        new ParameterSet().value("1").name("A"),
-                        new ParameterSet().value("2").name("B")
-                );
-            }
-        }
-
-        public TestClassWithMixedParameter(String a) {}
-
-        @UseMethodParameter(AppendNameParams.class)
-        @Test
-        public void testA(String a) {}
-
-        @Test
-        public void test() {}
-    }
-
-    @Test
-    public void testClassParameterAppendName() throws Throwable {
-        List<Runner> runners = ParameterizedRunner.createRunners(
-                new TestClass(TestClassWithClassParameterAppendName.class));
-        List<String> expectedTestNames =
-                new LinkedList<String>(Arrays.asList("test__Hello", "test__World"));
-        List<String> computedMethodNames = new ArrayList<>();
-        for (Runner r : runners) {
-            BlockJUnit4RunnerDelegate castedRunner = (BlockJUnit4RunnerDelegate) r;
-            for (FrameworkMethod method : castedRunner.computeTestMethods()) {
-                computedMethodNames.add(method.getName());
-                Assert.assertTrue("This test name is not expected: " + method.getName(),
-                        expectedTestNames.contains(method.getName()));
-                expectedTestNames.remove(method.getName());
-                method.getName();
-            }
-        }
-        Assert.assertTrue(
-                String.format(
-                        "These names were provided: %s, these expected names are not found: %s",
-                        Arrays.toString(computedMethodNames.toArray()),
-                        Arrays.toString(expectedTestNames.toArray())),
-                expectedTestNames.isEmpty());
-    }
-
-    @Test
-    public void testClassParameterDefaultName() throws Throwable {
-        List<Runner> runners = ParameterizedRunner.createRunners(
-                new TestClass(TestClassWithClassParameterDefaultName.class));
-        List<String> expectedTestNames = new LinkedList<String>(Arrays.asList("test", "test"));
-        for (Runner r : runners) {
-            @SuppressWarnings("unchecked")
-            BlockJUnit4RunnerDelegate castedRunner = (BlockJUnit4RunnerDelegate) r;
-            for (FrameworkMethod method : castedRunner.computeTestMethods()) {
-                Assert.assertTrue("This test name is not expected: " + method.getName(),
-                        expectedTestNames.contains(method.getName()));
-                expectedTestNames.remove(method.getName());
-                method.getName();
-            }
-        }
-        Assert.assertTrue("These expected names are not found: "
-                        + Arrays.toString(expectedTestNames.toArray()),
-                expectedTestNames.isEmpty());
-    }
-
-    @Test
-    public void testMethodParameter() throws Throwable {
-        List<Runner> runners = ParameterizedRunner.createRunners(
-                new TestClass(TestClassWithMethodParameter.class));
-        List<String> expectedTestNames = new LinkedList<String>(
-                Arrays.asList("test__Hello", "test__World", "testDefaultName", "testDefaultName"));
-        for (Runner r : runners) {
-            BlockJUnit4RunnerDelegate castedRunner = (BlockJUnit4RunnerDelegate) r;
-            for (FrameworkMethod method : castedRunner.computeTestMethods()) {
-                Assert.assertTrue("This test name is not expected: " + method.getName(),
-                        expectedTestNames.contains(method.getName()));
-                expectedTestNames.remove(method.getName());
-                method.getName();
-            }
-        }
-        Assert.assertTrue("These expected names are not found: "
-                        + Arrays.toString(expectedTestNames.toArray()),
-                expectedTestNames.isEmpty());
-    }
-
-    @Test
-    public void testMixedParameterTestA() throws Throwable {
-        List<Runner> runners =
-                ParameterizedRunner.createRunners(new TestClass(TestClassWithMixedParameter.class));
-        List<String> expectedTestNames =
-                new LinkedList<String>(Arrays.asList("testA__Hello_A", "testA__World_A",
-                        "testA__Hello_B", "testA__World_B", "test__Hello", "test__World"));
-        for (Runner r : runners) {
-            BlockJUnit4RunnerDelegate castedRunner = (BlockJUnit4RunnerDelegate) r;
-            for (FrameworkMethod method : castedRunner.computeTestMethods()) {
-                Assert.assertTrue("This test name is not expected: " + method.getName(),
-                        expectedTestNames.contains(method.getName()));
-                expectedTestNames.remove(method.getName());
-                method.getName();
-            }
-        }
-        Assert.assertTrue("These expected names are not found: "
-                        + Arrays.toString(expectedTestNames.toArray()),
-                expectedTestNames.isEmpty());
-    }
-}
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java b/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java
deleted file mode 100644
index 9acd141..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java
+++ /dev/null
@@ -1,377 +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.
-
-package org.chromium.base.test.util;
-
-import static org.hamcrest.Matchers.contains;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-import static org.junit.runner.Description.createTestDescription;
-
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.Description;
-import org.junit.runner.RunWith;
-import org.junit.runners.BlockJUnit4ClassRunner;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.Statement;
-
-import org.chromium.base.test.util.AnnotationProcessingUtils.AnnotationExtractor;
-
-import java.lang.annotation.Annotation;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-
-/** Test for {@link AnnotationProcessingUtils}. */
-@RunWith(BlockJUnit4ClassRunner.class)
-public class AnnotationProcessingUtilsTest {
-    @Test
-    public void testGetTargetAnnotation_NotOnClassNorMethod() {
-        TargetAnnotation retrievedAnnotation;
-
-        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
-                createTestDescription(
-                        ClassWithoutTargetAnnotation.class, "methodWithoutAnnotation"),
-                TargetAnnotation.class);
-        assertNull(retrievedAnnotation);
-    }
-
-    @Test
-    public void testGetTargetAnnotation_NotOnClassButOnMethod() {
-        TargetAnnotation retrievedAnnotation;
-
-        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
-                getTest(ClassWithoutTargetAnnotation.class, "methodWithTargetAnnotation"),
-                TargetAnnotation.class);
-        assertNotNull(retrievedAnnotation);
-    }
-
-    @Test
-    public void testGetTargetAnnotation_NotOnClassDifferentOneOnMethod() {
-        TargetAnnotation retrievedAnnotation;
-
-        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
-                getTest(ClassWithoutTargetAnnotation.class, "methodWithAnnotatedAnnotation"),
-                TargetAnnotation.class);
-        assertNull(retrievedAnnotation);
-    }
-
-    @Test
-    public void testGetTargetAnnotation_OnClassButNotOnMethod() {
-        TargetAnnotation retrievedAnnotation;
-
-        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
-                getTest(ClassWithAnnotation.class, "methodWithoutAnnotation"),
-                TargetAnnotation.class);
-        assertNotNull(retrievedAnnotation);
-        assertEquals(Location.Class, retrievedAnnotation.value());
-    }
-
-    @Test
-    public void testGetTargetAnnotation_OnClassAndMethod() {
-        TargetAnnotation retrievedAnnotation;
-
-        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
-                getTest(ClassWithAnnotation.class, "methodWithTargetAnnotation"),
-                TargetAnnotation.class);
-        assertNotNull(retrievedAnnotation);
-        assertEquals(Location.Method, retrievedAnnotation.value());
-    }
-
-    @Test
-    @Ignore("Rules not supported yet.")
-    public void testGetTargetAnnotation_OnRuleButNotOnMethod() {
-        TargetAnnotation retrievedAnnotation;
-
-        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
-                getTest(ClassWithRule.class, "methodWithoutAnnotation"), TargetAnnotation.class);
-        assertNotNull(retrievedAnnotation);
-        assertEquals(Location.Rule, retrievedAnnotation.value());
-    }
-
-    @Test
-    @Ignore("Rules not supported yet.")
-    public void testGetTargetAnnotation_OnRuleAndMethod() {
-        TargetAnnotation retrievedAnnotation;
-
-        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
-                getTest(ClassWithRule.class, "methodWithTargetAnnotation"), TargetAnnotation.class);
-        assertNotNull(retrievedAnnotation);
-        assertEquals(Location.Method, retrievedAnnotation.value());
-    }
-
-    @Test
-    public void testGetMetaAnnotation_Indirectly() {
-        MetaAnnotation retrievedAnnotation;
-
-        retrievedAnnotation = AnnotationProcessingUtils.getAnnotation(
-                getTest(ClassWithoutTargetAnnotation.class, "methodWithAnnotatedAnnotation"),
-                MetaAnnotation.class);
-        assertNotNull(retrievedAnnotation);
-    }
-
-    @Test
-    public void testGetAllTargetAnnotations() {
-        List<TargetAnnotation> retrievedAnnotations;
-
-        retrievedAnnotations = AnnotationProcessingUtils.getAnnotations(
-                getTest(ClassWithAnnotation.class, "methodWithTargetAnnotation"),
-                TargetAnnotation.class);
-        assertEquals(2, retrievedAnnotations.size());
-        assertEquals(Location.Class, retrievedAnnotations.get(0).value());
-        assertEquals(Location.Method, retrievedAnnotations.get(1).value());
-    }
-
-    @Test
-    public void testGetAllTargetAnnotations_OnParentClass() {
-        List<TargetAnnotation> retrievedAnnotations;
-
-        retrievedAnnotations = AnnotationProcessingUtils.getAnnotations(
-                getTest(DerivedClassWithoutAnnotation.class, "newMethodWithoutAnnotation"),
-                TargetAnnotation.class);
-        assertEquals(1, retrievedAnnotations.size());
-        assertEquals(Location.Class, retrievedAnnotations.get(0).value());
-    }
-
-    @Test
-    public void testGetAllTargetAnnotations_OnDerivedMethodAndParentClass() {
-        List<TargetAnnotation> retrievedAnnotations;
-
-        retrievedAnnotations = AnnotationProcessingUtils.getAnnotations(
-                getTest(DerivedClassWithoutAnnotation.class, "newMethodWithTargetAnnotation"),
-                TargetAnnotation.class);
-        assertEquals(2, retrievedAnnotations.size());
-        assertEquals(Location.Class, retrievedAnnotations.get(0).value());
-        assertEquals(Location.DerivedMethod, retrievedAnnotations.get(1).value());
-    }
-
-    @Test
-    public void testGetAllTargetAnnotations_OnDerivedMethodAndParentClassAndMethod() {
-        List<TargetAnnotation> retrievedAnnotations;
-
-        retrievedAnnotations = AnnotationProcessingUtils.getAnnotations(
-                getTest(DerivedClassWithoutAnnotation.class, "methodWithTargetAnnotation"),
-                TargetAnnotation.class);
-        // We should not look at the base implementation of the method. Mostly it should not happen
-        // in the context of tests.
-        assertEquals(2, retrievedAnnotations.size());
-        assertEquals(Location.Class, retrievedAnnotations.get(0).value());
-        assertEquals(Location.DerivedMethod, retrievedAnnotations.get(1).value());
-    }
-
-    @Test
-    public void testGetAllTargetAnnotations_OnDerivedParentAndParentClass() {
-        List<TargetAnnotation> retrievedAnnotations;
-
-        retrievedAnnotations = AnnotationProcessingUtils.getAnnotations(
-                getTest(DerivedClassWithAnnotation.class, "methodWithoutAnnotation"),
-                TargetAnnotation.class);
-        assertEquals(2, retrievedAnnotations.size());
-        assertEquals(Location.Class, retrievedAnnotations.get(0).value());
-        assertEquals(Location.DerivedClass, retrievedAnnotations.get(1).value());
-    }
-
-    @Test
-    public void testGetAllAnnotations() {
-        List<Annotation> annotations;
-
-        AnnotationExtractor annotationExtractor = new AnnotationExtractor(
-                TargetAnnotation.class, MetaAnnotation.class, AnnotatedAnnotation.class);
-        annotations = annotationExtractor.getMatchingAnnotations(
-                getTest(DerivedClassWithAnnotation.class, "methodWithTwoAnnotations"));
-        assertEquals(5, annotations.size());
-
-        // Retrieved annotation order:
-        // On Parent Class
-        assertEquals(TargetAnnotation.class, annotations.get(0).annotationType());
-        assertEquals(Location.Class, ((TargetAnnotation) annotations.get(0)).value());
-
-        // On Class
-        assertEquals(TargetAnnotation.class, annotations.get(1).annotationType());
-        assertEquals(Location.DerivedClass, ((TargetAnnotation) annotations.get(1)).value());
-
-        // Meta-annotations from method
-        assertEquals(MetaAnnotation.class, annotations.get(2).annotationType());
-
-        // On Method
-        assertEquals(AnnotatedAnnotation.class, annotations.get(3).annotationType());
-        assertEquals(TargetAnnotation.class, annotations.get(4).annotationType());
-        assertEquals(Location.DerivedMethod, ((TargetAnnotation) annotations.get(4)).value());
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testAnnotationExtractorSortOrder_UnknownAnnotations() {
-        AnnotationExtractor annotationExtractor = new AnnotationExtractor(Target.class);
-        Comparator<Class<? extends Annotation>> comparator =
-                annotationExtractor.getTypeComparator();
-        List<Class<? extends Annotation>> testList =
-                Arrays.asList(Rule.class, Test.class, Override.class, Target.class, Rule.class);
-        testList.sort(comparator);
-        assertThat("Unknown annotations should not be reordered and come before the known ones.",
-                testList,
-                contains(Rule.class, Test.class, Override.class, Rule.class, Target.class));
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testAnnotationExtractorSortOrder_KnownAnnotations() {
-        AnnotationExtractor annotationExtractor =
-                new AnnotationExtractor(Test.class, Target.class, Rule.class);
-        Comparator<Class<? extends Annotation>> comparator =
-                annotationExtractor.getTypeComparator();
-        List<Class<? extends Annotation>> testList =
-                Arrays.asList(Rule.class, Test.class, Override.class, Target.class, Rule.class);
-        testList.sort(comparator);
-        assertThat(
-                "Known annotations should be sorted in the same order as provided to the extractor",
-                testList,
-                contains(Override.class, Test.class, Target.class, Rule.class, Rule.class));
-    }
-
-    private static Description getTest(Class<?> klass, String testName) {
-        Description description = null;
-        try {
-            description = new DummyTestRunner(klass).describe(testName);
-        } catch (InitializationError initializationError) {
-            initializationError.printStackTrace();
-            fail("DummyTestRunner initialization failed:" + initializationError.getMessage());
-        }
-        if (description == null) {
-            fail("Not test named '" + testName + "' in class" + klass.getSimpleName());
-        }
-        return description;
-    }
-
-    // region Test Data: Annotations and dummy test classes
-    private enum Location { Unspecified, Class, Method, Rule, DerivedClass, DerivedMethod }
-
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.TYPE, ElementType.METHOD})
-    private @interface TargetAnnotation {
-        Location value() default Location.Unspecified;
-    }
-
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.ANNOTATION_TYPE, ElementType.TYPE, ElementType.METHOD})
-    private @interface MetaAnnotation {}
-
-    @Retention(RetentionPolicy.RUNTIME)
-    @Target({ElementType.TYPE, ElementType.METHOD})
-    @MetaAnnotation
-    private @interface AnnotatedAnnotation {}
-
-    private @interface SimpleAnnotation {}
-
-    @SimpleAnnotation
-    private static class ClassWithoutTargetAnnotation {
-        @Test
-        public void methodWithoutAnnotation() {}
-
-        @Test
-        @TargetAnnotation
-        public void methodWithTargetAnnotation() {}
-
-        @Test
-        @AnnotatedAnnotation
-        public void methodWithAnnotatedAnnotation() {}
-    }
-
-    @TargetAnnotation(Location.Class)
-    private static class ClassWithAnnotation {
-        @Test
-        public void methodWithoutAnnotation() {}
-
-        @Test
-        @TargetAnnotation(Location.Method)
-        public void methodWithTargetAnnotation() {}
-
-        @Test
-        @MetaAnnotation
-        public void methodWithMetaAnnotation() {}
-
-        @Test
-        @AnnotatedAnnotation
-        public void methodWithAnnotatedAnnotation() {}
-    }
-
-    private static class DerivedClassWithoutAnnotation extends ClassWithAnnotation {
-        @Test
-        public void newMethodWithoutAnnotation() {}
-
-        @Test
-        @TargetAnnotation(Location.DerivedMethod)
-        public void newMethodWithTargetAnnotation() {}
-
-        @Test
-        @Override
-        @TargetAnnotation(Location.DerivedMethod)
-        public void methodWithTargetAnnotation() {}
-    }
-
-    @TargetAnnotation(Location.DerivedClass)
-    private static class DerivedClassWithAnnotation extends ClassWithAnnotation {
-        @Test
-        public void newMethodWithoutAnnotation() {}
-
-        @Test
-        @AnnotatedAnnotation
-        @TargetAnnotation(Location.DerivedMethod)
-        public void methodWithTwoAnnotations() {}
-    }
-
-    private static class ClassWithRule {
-        @Rule
-        Rule1 mRule = new Rule1();
-
-        @Test
-        public void methodWithoutAnnotation() {}
-
-        @Test
-        @TargetAnnotation
-        public void methodWithTargetAnnotation() {}
-    }
-
-    @TargetAnnotation(Location.Rule)
-    @MetaAnnotation
-    private static class Rule1 implements TestRule {
-        @Override
-        public Statement apply(Statement statement, Description description) {
-            return null;
-        }
-    }
-
-    private static class DummyTestRunner extends BlockJUnit4ClassRunner {
-        public DummyTestRunner(Class<?> klass) throws InitializationError {
-            super(klass);
-        }
-
-        @Override
-        protected void collectInitializationErrors(List<Throwable> errors) {
-            // Do nothing. BlockJUnit4ClassRunner requires the class to be public, but we don't
-            // want/need it.
-        }
-
-        public Description describe(String testName) {
-            List<FrameworkMethod> tests = getTestClass().getAnnotatedMethods(Test.class);
-            for (FrameworkMethod testMethod : tests) {
-                if (testMethod.getName().equals(testName)) return describeChild(testMethod);
-            }
-            return null;
-        }
-    }
-
-    // endregion
-    }
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/DisableIfTest.java b/base/test/android/junit/src/org/chromium/base/test/util/DisableIfTest.java
deleted file mode 100644
index a147435..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/util/DisableIfTest.java
+++ /dev/null
@@ -1,193 +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.
-
-package org.chromium.base.test.util;
-
-import android.os.Build;
-
-import junit.framework.TestCase;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-import org.robolectric.util.ReflectionHelpers;
-
-import org.chromium.base.test.BaseRobolectricTestRunner;
-
-/** Unit tests for the DisableIf annotation and its SkipCheck implementation. */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE, sdk = 21)
-public class DisableIfTest {
-    @Test
-    public void testSdkIsLessThanAndIsLessThan() {
-        TestCase sdkIsLessThan = new TestCase("sdkIsLessThan") {
-            @DisableIf.Build(sdk_is_less_than = 22)
-            public void sdkIsLessThan() {}
-        };
-        Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(sdkIsLessThan));
-    }
-
-    @Test
-    public void testSdkIsLessThanButIsEqual() {
-        TestCase sdkIsEqual = new TestCase("sdkIsEqual") {
-            @DisableIf.Build(sdk_is_less_than = 21)
-            public void sdkIsEqual() {}
-        };
-        Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(sdkIsEqual));
-    }
-
-    @Test
-    public void testSdkIsLessThanButIsGreaterThan() {
-        TestCase sdkIsGreaterThan = new TestCase("sdkIsGreaterThan") {
-            @DisableIf.Build(sdk_is_less_than = 20)
-            public void sdkIsGreaterThan() {}
-        };
-        Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(sdkIsGreaterThan));
-    }
-
-    @Test
-    public void testSdkIsGreaterThanButIsLessThan() {
-        TestCase sdkIsLessThan = new TestCase("sdkIsLessThan") {
-            @DisableIf.Build(sdk_is_greater_than = 22)
-            public void sdkIsLessThan() {}
-        };
-        Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(sdkIsLessThan));
-    }
-
-    @Test
-    public void testSdkIsGreaterThanButIsEqual() {
-        TestCase sdkIsEqual = new TestCase("sdkIsEqual") {
-            @DisableIf.Build(sdk_is_greater_than = 21)
-            public void sdkIsEqual() {}
-        };
-        Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(sdkIsEqual));
-    }
-
-    @Test
-    public void testSdkIsGreaterThanAndIsGreaterThan() {
-        TestCase sdkIsGreaterThan = new TestCase("sdkIsGreaterThan") {
-            @DisableIf.Build(sdk_is_greater_than = 20)
-            public void sdkIsGreaterThan() {}
-        };
-        Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(sdkIsGreaterThan));
-    }
-
-    @Test
-    public void testSupportedAbiIncludesAndCpuAbiMatches() {
-        TestCase supportedAbisCpuAbiMatch = new TestCase("supportedAbisCpuAbiMatch") {
-            @DisableIf.Build(supported_abis_includes = "foo")
-            public void supportedAbisCpuAbiMatch() {}
-        };
-        String[] originalAbis = Build.SUPPORTED_ABIS;
-        try {
-            ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS",
-                    new String[] {"foo", "bar"});
-            Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(supportedAbisCpuAbiMatch));
-        } finally {
-            ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", originalAbis);
-        }
-    }
-
-    @Test
-    public void testSupportedAbiIncludesAndCpuAbi2Matches() {
-        TestCase supportedAbisCpuAbi2Match = new TestCase("supportedAbisCpuAbi2Match") {
-            @DisableIf.Build(supported_abis_includes = "bar")
-            public void supportedAbisCpuAbi2Match() {}
-        };
-        String[] originalAbis = Build.SUPPORTED_ABIS;
-        try {
-            ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS",
-                    new String[] {"foo", "bar"});
-            Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(supportedAbisCpuAbi2Match));
-        } finally {
-            ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", originalAbis);
-        }
-    }
-
-    @Test
-    public void testSupportedAbiIncludesButNoMatch() {
-        TestCase supportedAbisNoMatch = new TestCase("supportedAbisNoMatch") {
-            @DisableIf.Build(supported_abis_includes = "baz")
-            public void supportedAbisNoMatch() {}
-        };
-        String[] originalAbis = Build.SUPPORTED_ABIS;
-        try {
-            ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS",
-                    new String[] {"foo", "bar"});
-            Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(supportedAbisNoMatch));
-        } finally {
-            ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", originalAbis);
-        }
-    }
-
-    @Test
-    public void testHardwareIsMatches() {
-        TestCase hardwareIsMatches = new TestCase("hardwareIsMatches") {
-            @DisableIf.Build(hardware_is = "hammerhead")
-            public void hardwareIsMatches() {}
-        };
-        String originalHardware = Build.HARDWARE;
-        try {
-            ReflectionHelpers.setStaticField(Build.class, "HARDWARE", "hammerhead");
-            Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(hardwareIsMatches));
-        } finally {
-            ReflectionHelpers.setStaticField(Build.class, "HARDWARE", originalHardware);
-        }
-    }
-
-    @Test
-    public void testHardwareIsDoesntMatch() {
-        TestCase hardwareIsDoesntMatch = new TestCase("hardwareIsDoesntMatch") {
-            @DisableIf.Build(hardware_is = "hammerhead")
-            public void hardwareIsDoesntMatch() {}
-        };
-        String originalHardware = Build.HARDWARE;
-        try {
-            ReflectionHelpers.setStaticField(Build.class, "HARDWARE", "mako");
-            Assert.assertFalse(new DisableIfSkipCheck().shouldSkip(hardwareIsDoesntMatch));
-        } finally {
-            ReflectionHelpers.setStaticField(Build.class, "HARDWARE", originalHardware);
-        }
-    }
-
-    @DisableIf.Build(supported_abis_includes = "foo")
-    private static class DisableIfSuperclassTestCase extends TestCase {
-        public DisableIfSuperclassTestCase(String name) {
-            super(name);
-        }
-    }
-
-    @DisableIf.Build(hardware_is = "hammerhead")
-    private static class DisableIfTestCase extends DisableIfSuperclassTestCase {
-        public DisableIfTestCase(String name) {
-            super(name);
-        }
-        public void sampleTestMethod() {}
-    }
-
-    @Test
-    public void testDisableClass() {
-        TestCase sampleTestMethod = new DisableIfTestCase("sampleTestMethod");
-        String originalHardware = Build.HARDWARE;
-        try {
-            ReflectionHelpers.setStaticField(Build.class, "HARDWARE", "hammerhead");
-            Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(sampleTestMethod));
-        } finally {
-            ReflectionHelpers.setStaticField(Build.class, "HARDWARE", originalHardware);
-        }
-    }
-
-    @Test
-    public void testDisableSuperClass() {
-        TestCase sampleTestMethod = new DisableIfTestCase("sampleTestMethod");
-        String[] originalAbis = Build.SUPPORTED_ABIS;
-        try {
-            ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", new String[] {"foo"});
-            Assert.assertTrue(new DisableIfSkipCheck().shouldSkip(sampleTestMethod));
-        } finally {
-            ReflectionHelpers.setStaticField(Build.class, "SUPPORTED_ABIS", originalAbis);
-        }
-    }
-}
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/ManualSkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/ManualSkipCheckTest.java
deleted file mode 100644
index 0c3e955..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/util/ManualSkipCheckTest.java
+++ /dev/null
@@ -1,145 +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.
-
-package org.chromium.base.test.util;
-
-import static org.hamcrest.Matchers.contains;
-import static org.hamcrest.Matchers.isIn;
-
-import android.app.Instrumentation;
-import android.content.Context;
-import android.os.Bundle;
-import android.support.test.InstrumentationRegistry;
-
-import org.junit.Assert;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ErrorCollector;
-import org.junit.rules.ExternalResource;
-import org.junit.rules.TestRule;
-import org.junit.runner.Description;
-import org.junit.runner.RunWith;
-import org.junit.runner.notification.Failure;
-import org.junit.runner.notification.RunListener;
-import org.junit.runner.notification.RunNotifier;
-import org.junit.runners.model.FrameworkMethod;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.annotation.Config;
-
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.chromium.base.test.BaseRobolectricTestRunner;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Unit tests for skipping tests annotated with {@code @}{@link Manual}.
- */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class ManualSkipCheckTest {
-    /**
-     * Example test class.
-     */
-    public static class ManualTest {
-        @Test
-        @Manual
-        public void manualTest() {}
-
-        @Test
-        public void nonManualTest() {}
-    }
-
-    @Test
-    public void testManual() throws NoSuchMethodException {
-        FrameworkMethod method = new FrameworkMethod(ManualTest.class.getMethod("manualTest"));
-        Assert.assertTrue(new ManualSkipCheck().shouldSkip(method));
-    }
-
-    @Test
-    public void testNonManual() throws NoSuchMethodException {
-        FrameworkMethod method = new FrameworkMethod(ManualTest.class.getMethod("nonManualTest"));
-        Assert.assertFalse(new ManualSkipCheck().shouldSkip(method));
-    }
-
-    private static class MockRunListener extends RunListener {
-        private List<Description> mRunTests = new ArrayList<>();
-        private List<Description> mSkippedTests = new ArrayList<>();
-
-        public List<Description> getRunTests() {
-            return mRunTests;
-        }
-
-        public List<Description> getSkippedTests() {
-            return mSkippedTests;
-        }
-
-        @Override
-        public void testStarted(Description description) throws Exception {
-            mRunTests.add(description);
-        }
-
-        @Override
-        public void testFinished(Description description) throws Exception {
-            Assert.assertThat(description, isIn(mRunTests));
-        }
-
-        @Override
-        public void testFailure(Failure failure) throws Exception {
-            Assert.fail(failure.toString());
-        }
-
-        @Override
-        public void testAssumptionFailure(Failure failure) {
-            Assert.fail(failure.toString());
-        }
-
-        @Override
-        public void testIgnored(Description description) throws Exception {
-            mSkippedTests.add(description);
-        }
-    }
-
-    /**
-     * Registers a fake {@link Instrumentation} so that class runners for instrumentation tests can
-     * be run even in Robolectric tests.
-     */
-    private static class MockInstrumentationRule extends ExternalResource {
-        @Override
-        protected void before() throws Throwable {
-            Instrumentation instrumentation = new Instrumentation() {
-                @Override
-                public Context getTargetContext() {
-                    return RuntimeEnvironment.application;
-                }
-            };
-            InstrumentationRegistry.registerInstance(instrumentation, new Bundle());
-        }
-
-        @Override
-        protected void after() {
-            InstrumentationRegistry.registerInstance(null, new Bundle());
-        }
-    }
-
-    @Rule
-    public TestRule mMockInstrumentationRule = new MockInstrumentationRule();
-
-    @Rule
-    public ErrorCollector mErrorCollector = new ErrorCollector();
-
-    @Test
-    public void testWithTestRunner() throws Exception {
-        // TODO(bauerb): Using Mockito mock() or spy() throws a ClassCastException.
-        MockRunListener runListener = new MockRunListener();
-        RunNotifier runNotifier = new RunNotifier();
-        runNotifier.addListener(runListener);
-        new BaseJUnit4ClassRunner(ManualTest.class).run(runNotifier);
-
-        mErrorCollector.checkThat(runListener.getRunTests(),
-                contains(Description.createTestDescription(ManualTest.class, "nonManualTest")));
-        mErrorCollector.checkThat(runListener.getSkippedTests(),
-                contains(Description.createTestDescription(ManualTest.class, "manualTest")));
-    }
-}
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java
deleted file mode 100644
index 050cb10..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/util/MinAndroidSdkLevelSkipCheckTest.java
+++ /dev/null
@@ -1,95 +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.
-
-package org.chromium.base.test.util;
-
-import junit.framework.TestCase;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-import org.chromium.base.test.BaseRobolectricTestRunner;
-
-/** Unit tests for MinAndroidSdkLevelSkipCheck. */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE, sdk = 18)
-public class MinAndroidSdkLevelSkipCheckTest {
-    private static class UnannotatedBaseClass extends TestCase {
-        public UnannotatedBaseClass(String name) {
-            super(name);
-        }
-        @MinAndroidSdkLevel(17) public void min17Method() {}
-        @MinAndroidSdkLevel(20) public void min20Method() {}
-    }
-
-    @MinAndroidSdkLevel(17)
-    private static class Min17Class extends UnannotatedBaseClass {
-        public Min17Class(String name) {
-            super(name);
-        }
-        public void unannotatedMethod() {}
-    }
-
-    @MinAndroidSdkLevel(20)
-    private static class Min20Class extends UnannotatedBaseClass {
-        public Min20Class(String name) {
-            super(name);
-        }
-        public void unannotatedMethod() {}
-    }
-
-    private static class ExtendsMin17Class extends Min17Class {
-        public ExtendsMin17Class(String name) {
-            super(name);
-        }
-        @Override
-        public void unannotatedMethod() {}
-    }
-
-    private static class ExtendsMin20Class extends Min20Class {
-        public ExtendsMin20Class(String name) {
-            super(name);
-        }
-        @Override
-        public void unannotatedMethod() {}
-    }
-
-    @Test
-    public void testAnnotatedMethodAboveMin() {
-        Assert.assertFalse(new MinAndroidSdkLevelSkipCheck().shouldSkip(
-                new UnannotatedBaseClass("min17Method")));
-    }
-
-    @Test
-    public void testAnnotatedMethodBelowMin() {
-        Assert.assertTrue(new MinAndroidSdkLevelSkipCheck().shouldSkip(
-                new UnannotatedBaseClass("min20Method")));
-    }
-
-    @Test
-    public void testAnnotatedClassAboveMin() {
-        Assert.assertFalse(new MinAndroidSdkLevelSkipCheck().shouldSkip(
-                new Min17Class("unannotatedMethod")));
-    }
-
-    @Test
-    public void testAnnotatedClassBelowMin() {
-        Assert.assertTrue(new MinAndroidSdkLevelSkipCheck().shouldSkip(
-                new Min20Class("unannotatedMethod")));
-    }
-
-    @Test
-    public void testAnnotatedSuperclassAboveMin() {
-        Assert.assertFalse(new MinAndroidSdkLevelSkipCheck().shouldSkip(
-                new ExtendsMin17Class("unannotatedMethod")));
-    }
-
-    @Test
-    public void testAnnotatedSuperclassBelowMin() {
-        Assert.assertTrue(new MinAndroidSdkLevelSkipCheck().shouldSkip(
-                new ExtendsMin20Class("unannotatedMethod")));
-    }
-}
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java
deleted file mode 100644
index 86285de..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/util/RestrictionSkipCheckTest.java
+++ /dev/null
@@ -1,129 +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.
-
-package org.chromium.base.test.util;
-
-import android.text.TextUtils;
-
-import junit.framework.TestCase;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-
-import org.chromium.base.test.BaseRobolectricTestRunner;
-
-/** Unit tests for RestrictionSkipCheck. */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class RestrictionSkipCheckTest {
-    private static final String TEST_RESTRICTION_APPLIES =
-            "org.chromium.base.test.util.RestrictionSkipCheckTest.TEST_RESTRICTION_APPLIES";
-    private static final String TEST_RESTRICTION_DOES_NOT_APPLY =
-            "org.chromium.base.test.util.RestrictionSkipCheckTest.TEST_RESTRICTION_DOES_NOT_APPLY";
-
-    private static class TestRestrictionSkipCheck extends RestrictionSkipCheck {
-        public TestRestrictionSkipCheck() {
-            super(null);
-        }
-        @Override
-        protected boolean restrictionApplies(String restriction) {
-            return TextUtils.equals(restriction, TEST_RESTRICTION_APPLIES);
-        }
-    }
-
-    private static class UnannotatedBaseClass extends TestCase {
-        public UnannotatedBaseClass(String name) {
-            super(name);
-        }
-        @Restriction({TEST_RESTRICTION_APPLIES}) public void restrictedMethod() {}
-        @Restriction({TEST_RESTRICTION_DOES_NOT_APPLY}) public void unrestrictedMethod() {}
-    }
-
-    @Restriction({TEST_RESTRICTION_APPLIES})
-    private static class RestrictedClass extends UnannotatedBaseClass {
-        public RestrictedClass(String name) {
-            super(name);
-        }
-        public void unannotatedMethod() {}
-    }
-
-    @Restriction({TEST_RESTRICTION_DOES_NOT_APPLY})
-    private static class UnrestrictedClass extends UnannotatedBaseClass {
-        public UnrestrictedClass(String name) {
-            super(name);
-        }
-        public void unannotatedMethod() {}
-    }
-
-    @Restriction({
-            TEST_RESTRICTION_APPLIES,
-            TEST_RESTRICTION_DOES_NOT_APPLY})
-    private static class MultipleRestrictionsRestrictedClass extends UnannotatedBaseClass {
-        public MultipleRestrictionsRestrictedClass(String name) {
-            super(name);
-        }
-        public void unannotatedMethod() {}
-    }
-
-    private static class ExtendsRestrictedClass extends RestrictedClass {
-        public ExtendsRestrictedClass(String name) {
-            super(name);
-        }
-        @Override
-        public void unannotatedMethod() {}
-    }
-
-    private static class ExtendsUnrestrictedClass extends UnrestrictedClass {
-        public ExtendsUnrestrictedClass(String name) {
-            super(name);
-        }
-        @Override
-        public void unannotatedMethod() {}
-    }
-
-    @Test
-    public void testMethodRestricted() {
-        Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip(
-                new UnannotatedBaseClass("restrictedMethod")));
-    }
-
-    @Test
-    public void testMethodUnrestricted() {
-        Assert.assertFalse(new TestRestrictionSkipCheck().shouldSkip(
-                new UnannotatedBaseClass("unrestrictedMethod")));
-    }
-
-    @Test
-    public void testClassRestricted() {
-        Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip(
-                new RestrictedClass("unannotatedMethod")));
-    }
-
-    @Test
-    public void testClassUnrestricted() {
-        Assert.assertFalse(new TestRestrictionSkipCheck().shouldSkip(
-                new UnrestrictedClass("unannotatedMethod")));
-    }
-
-    @Test
-    public void testMultipleRestrictionsClassRestricted() {
-        Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip(
-                new MultipleRestrictionsRestrictedClass("unannotatedMethod")));
-    }
-
-    @Test
-    public void testSuperclassRestricted() {
-        Assert.assertTrue(new TestRestrictionSkipCheck().shouldSkip(
-                new ExtendsRestrictedClass("unannotatedMethod")));
-    }
-
-    @Test
-    public void testSuperclassUnrestricted() {
-        Assert.assertFalse(new TestRestrictionSkipCheck().shouldSkip(
-                new ExtendsUnrestrictedClass("unannotatedMethod")));
-    }
-}
-
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java b/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java
deleted file mode 100644
index 51c7516..0000000
--- a/base/test/android/junit/src/org/chromium/base/test/util/SkipCheckTest.java
+++ /dev/null
@@ -1,130 +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.
-
-package org.chromium.base.test.util;
-
-import junit.framework.TestCase;
-
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.model.FrameworkMethod;
-import org.robolectric.annotation.Config;
-
-import org.chromium.base.test.BaseRobolectricTestRunner;
-
-import java.lang.annotation.Annotation;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Method;
-import java.util.List;
-
-/** Unit tests for SkipCheck. */
-@RunWith(BaseRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class SkipCheckTest {
-    private static class TestableSkipCheck extends SkipCheck {
-        public static <T extends Annotation> List<T> getAnnotationsForTesting(
-                AnnotatedElement element, Class<T> annotationClass) {
-            return AnnotationProcessingUtils.getAnnotations(element, annotationClass);
-        }
-
-        @Override
-        public boolean shouldSkip(FrameworkMethod m) {
-            return false;
-        }
-    }
-
-    @Retention(RetentionPolicy.RUNTIME)
-    private @interface TestAnnotation {}
-
-    @TestAnnotation
-    private class AnnotatedBaseClass {
-        public void unannotatedMethod() {}
-        @TestAnnotation public void annotatedMethod() {}
-    }
-
-    private class ExtendsAnnotatedBaseClass extends AnnotatedBaseClass {
-        public void anotherUnannotatedMethod() {}
-    }
-
-    private class ExtendsTestCaseClass extends TestCase {
-        public ExtendsTestCaseClass(String name) {
-            super(name);
-        }
-        public void testMethodA() {}
-    }
-
-    private class UnannotatedBaseClass {
-        public void unannotatedMethod() {}
-        @TestAnnotation public void annotatedMethod() {}
-    }
-
-    @Test
-    public void getAnnotationsForClassNone() {
-        List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting(
-                UnannotatedBaseClass.class, TestAnnotation.class);
-        Assert.assertEquals(0, annotations.size());
-    }
-
-    @Test
-    public void getAnnotationsForClassOnClass() {
-        List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting(
-                AnnotatedBaseClass.class, TestAnnotation.class);
-        Assert.assertEquals(1, annotations.size());
-    }
-
-    @Test
-    public void getAnnotationsForClassOnSuperclass() {
-        List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting(
-                ExtendsAnnotatedBaseClass.class, TestAnnotation.class);
-        Assert.assertEquals(1, annotations.size());
-    }
-
-    @Test
-    public void getAnnotationsForMethodNone() throws NoSuchMethodException {
-        Method testMethod = UnannotatedBaseClass.class.getMethod("unannotatedMethod",
-                (Class[]) null);
-        List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting(
-                testMethod, TestAnnotation.class);
-        Assert.assertEquals(0, annotations.size());
-    }
-
-    @Test
-    public void getAnnotationsForMethodOnMethod() throws NoSuchMethodException {
-        Method testMethod = UnannotatedBaseClass.class.getMethod("annotatedMethod",
-                (Class[]) null);
-        List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting(
-                testMethod, TestAnnotation.class);
-        Assert.assertEquals(1, annotations.size());
-    }
-
-    @Test
-    public void getAnnotationsForMethodOnClass() throws NoSuchMethodException {
-        Method testMethod = AnnotatedBaseClass.class.getMethod("unannotatedMethod",
-                (Class[]) null);
-        List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting(
-                testMethod, TestAnnotation.class);
-        Assert.assertEquals(1, annotations.size());
-    }
-
-    @Test
-    public void getAnnotationsForMethodOnSuperclass() throws NoSuchMethodException {
-        Method testMethod = ExtendsAnnotatedBaseClass.class.getMethod("unannotatedMethod",
-                (Class[]) null);
-        List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting(
-                testMethod, TestAnnotation.class);
-        Assert.assertEquals(1, annotations.size());
-    }
-
-    @Test
-    public void getAnnotationsOverlapping() throws NoSuchMethodException {
-        Method testMethod = AnnotatedBaseClass.class.getMethod("annotatedMethod",
-                (Class[]) null);
-        List<TestAnnotation> annotations = TestableSkipCheck.getAnnotationsForTesting(
-                testMethod, TestAnnotation.class);
-        Assert.assertEquals(2, annotations.size());
-    }
-}
diff --git a/base/test/android/url_utils.cc b/base/test/android/url_utils.cc
deleted file mode 100644
index 7d2a8ed..0000000
--- a/base/test/android/url_utils.cc
+++ /dev/null
@@ -1,24 +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/android/url_utils.h"
-
-#include "base/android/jni_string.h"
-#include "base/android/scoped_java_ref.h"
-#include "jni/UrlUtils_jni.h"
-
-namespace base {
-namespace android {
-
-FilePath GetIsolatedTestRoot() {
-  JNIEnv* env = base::android::AttachCurrentThread();
-  ScopedJavaLocalRef<jstring> jtest_data_dir =
-      Java_UrlUtils_getIsolatedTestRoot(env);
-  base::FilePath test_data_dir(
-      base::android::ConvertJavaStringToUTF8(env, jtest_data_dir));
-  return test_data_dir;
-}
-
-}  // namespace android
-}  // namespace base
diff --git a/base/test/android/url_utils.h b/base/test/android/url_utils.h
deleted file mode 100644
index 3769bd2..0000000
--- a/base/test/android/url_utils.h
+++ /dev/null
@@ -1,23 +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_ANDROID_URL_UTILS_H_
-#define BASE_TEST_ANDROID_URL_UTILS_H_
-
-#include <jni.h>
-
-#include "base/base_export.h"
-#include "base/files/file_path.h"
-
-namespace base {
-namespace android {
-
-// Returns the root of the test data directory. This function will call into
-// Java class UrlUtils through JNI bridge.
-BASE_EXPORT FilePath GetIsolatedTestRoot();
-
-}  // namespace android
-}  // namespace base
-
-#endif  // BASE_TEST_ANDROID_URL_UTILS_H_
diff --git a/base/test/multiprocess_test_android.cc b/base/test/multiprocess_test_android.cc
deleted file mode 100644
index 4108593..0000000
--- a/base/test/multiprocess_test_android.cc
+++ /dev/null
@@ -1,86 +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 <string.h>
-#include <vector>
-
-#include "base/android/jni_android.h"
-#include "base/android/jni_array.h"
-#include "base/android/scoped_java_ref.h"
-#include "base/base_switches.h"
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "jni/MainReturnCodeResult_jni.h"
-#include "jni/MultiprocessTestClientLauncher_jni.h"
-
-namespace base {
-
-// A very basic implementation for Android. On Android tests can run in an APK
-// and we don't have an executable to exec*. This implementation does the bare
-// minimum to execute the method specified by procname (in the child process).
-//  - All options except |fds_to_remap| are ignored.
-//
-// NOTE: This MUST NOT run on the main thread of the NativeTest application.
-Process SpawnMultiProcessTestChild(const std::string& procname,
-                                   const CommandLine& base_command_line,
-                                   const LaunchOptions& options) {
-  JNIEnv* env = android::AttachCurrentThread();
-  DCHECK(env);
-
-  std::vector<int> fd_keys;
-  std::vector<int> fd_fds;
-  for (auto& iter : options.fds_to_remap) {
-    fd_keys.push_back(iter.second);
-    fd_fds.push_back(iter.first);
-  }
-
-  android::ScopedJavaLocalRef<jobjectArray> fds =
-      android::Java_MultiprocessTestClientLauncher_makeFdInfoArray(
-          env, base::android::ToJavaIntArray(env, fd_keys),
-          base::android::ToJavaIntArray(env, fd_fds));
-
-  CommandLine command_line(base_command_line);
-  if (!command_line.HasSwitch(switches::kTestChildProcess)) {
-    command_line.AppendSwitchASCII(switches::kTestChildProcess, procname);
-  }
-
-  android::ScopedJavaLocalRef<jobjectArray> j_argv =
-      android::ToJavaArrayOfStrings(env, command_line.argv());
-  jint pid = android::Java_MultiprocessTestClientLauncher_launchClient(
-      env, j_argv, fds);
-  return Process(pid);
-}
-
-bool WaitForMultiprocessTestChildExit(const Process& process,
-                                      TimeDelta timeout,
-                                      int* exit_code) {
-  JNIEnv* env = android::AttachCurrentThread();
-  DCHECK(env);
-
-  base::android::ScopedJavaLocalRef<jobject> result_code =
-      android::Java_MultiprocessTestClientLauncher_waitForMainToReturn(
-          env, process.Pid(), static_cast<int32_t>(timeout.InMilliseconds()));
-  if (result_code.is_null() ||
-      Java_MainReturnCodeResult_hasTimedOut(env, result_code)) {
-    return false;
-  }
-  if (exit_code) {
-    *exit_code = Java_MainReturnCodeResult_getReturnCode(env, result_code);
-  }
-  return true;
-}
-
-bool TerminateMultiProcessTestChild(const Process& process,
-                                    int exit_code,
-                                    bool wait) {
-  JNIEnv* env = android::AttachCurrentThread();
-  DCHECK(env);
-
-  return android::Java_MultiprocessTestClientLauncher_terminate(
-      env, process.Pid(), exit_code, wait);
-}
-
-}  // namespace base
diff --git a/base/test/test_file_util_android.cc b/base/test/test_file_util_android.cc
deleted file mode 100644
index 6e93e24..0000000
--- a/base/test/test_file_util_android.cc
+++ /dev/null
@@ -1,26 +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_file_util.h"
-
-#include "base/android/jni_android.h"
-#include "base/android/jni_string.h"
-#include "base/files/file_path.h"
-#include "jni/ContentUriTestUtils_jni.h"
-
-using base::android::ScopedJavaLocalRef;
-
-namespace base {
-
-FilePath InsertImageIntoMediaStore(const FilePath& path) {
-  JNIEnv* env = base::android::AttachCurrentThread();
-  ScopedJavaLocalRef<jstring> j_path =
-      base::android::ConvertUTF8ToJavaString(env, path.value());
-  ScopedJavaLocalRef<jstring> j_uri =
-      Java_ContentUriTestUtils_insertImageIntoMediaStore(env, j_path);
-  std::string uri = base::android::ConvertJavaStringToUTF8(j_uri);
-  return FilePath(uri);
-}
-
-}  // namespace base
diff --git a/base/test/test_support_android.cc b/base/test/test_support_android.cc
deleted file mode 100644
index 33a6628..0000000
--- a/base/test/test_support_android.cc
+++ /dev/null
@@ -1,194 +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 <stdarg.h>
-#include <string.h>
-
-#include "base/android/path_utils.h"
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/memory/singleton.h"
-#include "base/message_loop/message_loop.h"
-#include "base/message_loop/message_pump_android.h"
-#include "base/path_service.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/test/multiprocess_test.h"
-
-namespace {
-
-base::FilePath* g_test_data_dir = nullptr;
-
-struct RunState {
-  RunState(base::MessagePump::Delegate* delegate, int run_depth)
-      : delegate(delegate),
-        run_depth(run_depth),
-        should_quit(false) {
-  }
-
-  base::MessagePump::Delegate* delegate;
-
-  // Used to count how many Run() invocations are on the stack.
-  int run_depth;
-
-  // Used to flag that the current Run() invocation should return ASAP.
-  bool should_quit;
-};
-
-RunState* g_state = NULL;
-
-// A singleton WaitableEvent wrapper so we avoid a busy loop in
-// MessagePumpForUIStub. Other platforms use the native event loop which blocks
-// when there are no pending messages.
-class Waitable {
- public:
-  static Waitable* GetInstance() {
-    return base::Singleton<Waitable,
-                           base::LeakySingletonTraits<Waitable>>::get();
-  }
-
-  // Signals that there are more work to do.
-  void Signal() { waitable_event_.Signal(); }
-
-  // Blocks until more work is scheduled.
-  void Block() { waitable_event_.Wait(); }
-
-  void Quit() {
-    g_state->should_quit = true;
-    Signal();
-  }
-
- private:
-  friend struct base::DefaultSingletonTraits<Waitable>;
-
-  Waitable()
-      : waitable_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-                        base::WaitableEvent::InitialState::NOT_SIGNALED) {}
-
-  base::WaitableEvent waitable_event_;
-
-  DISALLOW_COPY_AND_ASSIGN(Waitable);
-};
-
-// The MessagePumpForUI implementation for test purpose.
-class MessagePumpForUIStub : public base::MessagePumpForUI {
-  ~MessagePumpForUIStub() override {}
-
-  void Start(base::MessagePump::Delegate* delegate) override {
-    NOTREACHED() << "The Start() method shouldn't be called in test, using"
-        " Run() method should be used.";
-  }
-
-  void Run(base::MessagePump::Delegate* delegate) override {
-    // The following was based on message_pump_glib.cc, except we're using a
-    // WaitableEvent since there are no native message loop to use.
-    RunState state(delegate, g_state ? g_state->run_depth + 1 : 1);
-
-    RunState* previous_state = g_state;
-    g_state = &state;
-
-    bool more_work_is_plausible = true;
-
-    for (;;) {
-      if (!more_work_is_plausible) {
-        Waitable::GetInstance()->Block();
-        if (g_state->should_quit)
-          break;
-      }
-
-      more_work_is_plausible = g_state->delegate->DoWork();
-      if (g_state->should_quit)
-        break;
-
-      base::TimeTicks delayed_work_time;
-      more_work_is_plausible |=
-          g_state->delegate->DoDelayedWork(&delayed_work_time);
-      if (g_state->should_quit)
-        break;
-
-      if (more_work_is_plausible)
-        continue;
-
-      more_work_is_plausible = g_state->delegate->DoIdleWork();
-      if (g_state->should_quit)
-        break;
-
-      more_work_is_plausible |= !delayed_work_time.is_null();
-    }
-
-    g_state = previous_state;
-  }
-
-  void Quit() override { Waitable::GetInstance()->Quit(); }
-
-  void ScheduleWork() override { Waitable::GetInstance()->Signal(); }
-
-  void ScheduleDelayedWork(const base::TimeTicks& delayed_work_time) override {
-    Waitable::GetInstance()->Signal();
-  }
-};
-
-std::unique_ptr<base::MessagePump> CreateMessagePumpForUIStub() {
-  return std::unique_ptr<base::MessagePump>(new MessagePumpForUIStub());
-};
-
-// Provides the test path for DIR_SOURCE_ROOT and DIR_ANDROID_APP_DATA.
-bool GetTestProviderPath(int key, base::FilePath* result) {
-  switch (key) {
-    // TODO(agrieve): Stop overriding DIR_ANDROID_APP_DATA.
-    // https://crbug.com/617734
-    // Instead DIR_ASSETS should be used to discover assets file location in
-    // tests.
-    case base::DIR_ANDROID_APP_DATA:
-    case base::DIR_ASSETS:
-    case base::DIR_SOURCE_ROOT:
-      CHECK(g_test_data_dir != nullptr);
-      *result = *g_test_data_dir;
-      return true;
-    default:
-      return false;
-  }
-}
-
-void InitPathProvider(int key) {
-  base::FilePath path;
-  // If failed to override the key, that means the way has not been registered.
-  if (GetTestProviderPath(key, &path) &&
-      !base::PathService::Override(key, path)) {
-    base::PathService::RegisterProvider(&GetTestProviderPath, key, key + 1);
-  }
-}
-
-}  // namespace
-
-namespace base {
-
-void InitAndroidTestLogging() {
-  logging::LoggingSettings settings;
-  settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
-  logging::InitLogging(settings);
-  // To view log output with IDs and timestamps use "adb logcat -v threadtime".
-  logging::SetLogItems(false,    // Process ID
-                       false,    // Thread ID
-                       false,    // Timestamp
-                       false);   // Tick count
-}
-
-void InitAndroidTestPaths(const FilePath& test_data_dir) {
-  if (g_test_data_dir) {
-    CHECK(test_data_dir == *g_test_data_dir);
-    return;
-  }
-  g_test_data_dir = new FilePath(test_data_dir);
-  InitPathProvider(DIR_SOURCE_ROOT);
-  InitPathProvider(DIR_ANDROID_APP_DATA);
-  InitPathProvider(DIR_ASSETS);
-}
-
-void InitAndroidTestMessageLoop() {
-  if (!MessageLoop::InitMessagePumpForUIFactory(&CreateMessagePumpForUIStub))
-    LOG(INFO) << "MessagePumpForUIFactory already set, unable to override.";
-}
-
-}  // namespace base
diff --git a/base/test/test_support_android.h b/base/test/test_support_android.h
deleted file mode 100644
index 4942e54..0000000
--- a/base/test/test_support_android.h
+++ /dev/null
@@ -1,25 +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_SUPPORT_ANDROID_H_
-#define BASE_TEST_TEST_SUPPORT_ANDROID_H_
-
-#include "base/base_export.h"
-
-namespace base {
-
-class FilePath;
-
-// Init logging for tests on Android. Logs will be output into Android's logcat.
-BASE_EXPORT void InitAndroidTestLogging();
-
-// Init path providers for tests on Android.
-BASE_EXPORT void InitAndroidTestPaths(const FilePath& test_data_dir);
-
-// Init the message loop for tests on Android.
-BASE_EXPORT void InitAndroidTestMessageLoop();
-
-}  // namespace base
-
-#endif  // BASE_TEST_TEST_SUPPORT_ANDROID_H_
diff --git a/base/test/test_ui_thread_android.cc b/base/test/test_ui_thread_android.cc
deleted file mode 100644
index d19fefa..0000000
--- a/base/test/test_ui_thread_android.cc
+++ /dev/null
@@ -1,14 +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_ui_thread_android.h"
-
-#include "jni/TestUiThread_jni.h"
-
-namespace base {
-
-void StartTestUiThreadLooper() {
-  Java_TestUiThread_loop(base::android::AttachCurrentThread());
-}
-
-}  // namespace base
diff --git a/base/test/test_ui_thread_android.h b/base/test/test_ui_thread_android.h
deleted file mode 100644
index 233911a..0000000
--- a/base/test/test_ui_thread_android.h
+++ /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.
-
-#ifndef BASE_TEST_TEST_UI_THREAD_ANDROID_
-#define BASE_TEST_TEST_UI_THREAD_ANDROID_
-
-#include <jni.h>
-
-namespace base {
-
-// Set up a thread as the Chromium UI Thread, and run its looper. This is is
-// intended for C++ unit tests (e.g. the net unit tests) that don't run with the
-// UI thread as their main looper, but test code that, on Android, uses UI
-// thread events, so need a running UI thread.
-void StartTestUiThreadLooper();
-
-}  // namespace base
-
-#endif  //  BASE_TEST_TEST_UI_THREAD_ANDROID_
diff --git a/base/third_party/libevent/android/config.h b/base/third_party/libevent/android/config.h
deleted file mode 100644
index 91f4dda..0000000
--- a/base/third_party/libevent/android/config.h
+++ /dev/null
@@ -1,266 +0,0 @@
-/* Copied from Linux version and changed the features according Android, which
- * is close to Linux */
-
-/* Define if clock_gettime is available in libc */
-#define DNS_USE_CPU_CLOCK_FOR_ID 1
-
-/* Define is no secure id variant is available */
-/* #undef DNS_USE_GETTIMEOFDAY_FOR_ID */
-
-/* Define to 1 if you have the `clock_gettime' function. */
-#define HAVE_CLOCK_GETTIME 1
-
-/* Define if /dev/poll is available */
-/* #undef HAVE_DEVPOLL */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define if your system supports the epoll system calls */
-#define HAVE_EPOLL 1
-
-/* Define to 1 if you have the `epoll_ctl' function. */
-#define HAVE_EPOLL_CTL 1
-
-/* Define if your system supports event ports */
-/* #undef HAVE_EVENT_PORTS */
-
-/* Define to 1 if you have the `fcntl' function. */
-#define HAVE_FCNTL 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define to 1 if the system has the type `fd_mask'. */
-/* #undef HAVE_FD_MASK */
-
-/* Define to 1 if you have the `getaddrinfo' function. */
-#define HAVE_GETADDRINFO 1
-
-/* Define to 1 if you have the `getegid' function. */
-#define HAVE_GETEGID 1
-
-/* Define to 1 if you have the `geteuid' function. */
-#define HAVE_GETEUID 1
-
-/* Define to 1 if you have the `getnameinfo' function. */
-#define HAVE_GETNAMEINFO 1
-
-/* Define to 1 if you have the `gettimeofday' function. */
-#define HAVE_GETTIMEOFDAY 1
-
-/* Define to 1 if you have the `inet_ntop' function. */
-#define HAVE_INET_NTOP 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the `issetugid' function. */
-/* #undef HAVE_ISSETUGID */
-
-/* Define to 1 if you have the `kqueue' function. */
-/* #undef HAVE_KQUEUE */
-
-/* Define to 1 if you have the `nsl' library (-lnsl). */
-#define HAVE_LIBNSL 1
-
-/* Define to 1 if you have the `resolv' library (-lresolv). */
-#define HAVE_LIBRESOLV 1
-
-/* Define to 1 if you have the `rt' library (-lrt). */
-#define HAVE_LIBRT 1
-
-/* Define to 1 if you have the `socket' library (-lsocket). */
-/* #undef HAVE_LIBSOCKET */
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <netinet/in6.h> header file. */
-/* #undef HAVE_NETINET_IN6_H */
-
-/* Define to 1 if you have the `poll' function. */
-#define HAVE_POLL 1
-
-/* Define to 1 if you have the <poll.h> header file. */
-#define HAVE_POLL_H 1
-
-/* Define to 1 if you have the `port_create' function. */
-/* #undef HAVE_PORT_CREATE */
-
-/* Define to 1 if you have the <port.h> header file. */
-/* #undef HAVE_PORT_H */
-
-/* Define to 1 if you have the `select' function. */
-#define HAVE_SELECT 1
-
-/* Define if F_SETFD is defined in <fcntl.h> */
-#define HAVE_SETFD 1
-
-/* Define to 1 if you have the `sigaction' function. */
-#define HAVE_SIGACTION 1
-
-/* Define to 1 if you have the `signal' function. */
-#define HAVE_SIGNAL 1
-
-/* Define to 1 if you have the <signal.h> header file. */
-#define HAVE_SIGNAL_H 1
-
-/* Define to 1 if you have the <stdarg.h> header file. */
-#define HAVE_STDARG_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strlcpy' function. */
-#define HAVE_STRLCPY 1
-
-/* Define to 1 if you have the `strsep' function. */
-#define HAVE_STRSEP 1
-
-/* Define to 1 if you have the `strtok_r' function. */
-#define HAVE_STRTOK_R 1
-
-/* Define to 1 if you have the `strtoll' function. */
-#define HAVE_STRTOLL 1
-
-/* Define to 1 if the system has the type `struct in6_addr'. */
-#define HAVE_STRUCT_IN6_ADDR 1
-
-/* Define to 1 if you have the <sys/devpoll.h> header file. */
-/* #undef HAVE_SYS_DEVPOLL_H */
-
-/* Define to 1 if you have the <sys/epoll.h> header file. */
-#define HAVE_SYS_EPOLL_H 1
-
-/* Define to 1 if you have the <sys/event.h> header file. */
-/* #undef HAVE_SYS_EVENT_H */
-
-/* Define to 1 if you have the <sys/ioctl.h> header file. */
-#define HAVE_SYS_IOCTL_H 1
-
-/* Define to 1 if you have the <sys/param.h> header file. */
-#define HAVE_SYS_PARAM_H 1
-
-/* Define to 1 if you have the <sys/queue.h> header file. */
-#define HAVE_SYS_QUEUE_H 1
-
-/* Define to 1 if you have the <sys/select.h> header file. */
-#define HAVE_SYS_SELECT_H 1
-
-/* Define to 1 if you have the <sys/socket.h> header file. */
-#define HAVE_SYS_SOCKET_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#define HAVE_SYS_TIME_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define if TAILQ_FOREACH is defined in <sys/queue.h> */
-#define HAVE_TAILQFOREACH 1
-
-/* Define if timeradd is defined in <sys/time.h> */
-#define HAVE_TIMERADD 1
-
-/* Define if timerclear is defined in <sys/time.h> */
-#define HAVE_TIMERCLEAR 1
-
-/* Define if timercmp is defined in <sys/time.h> */
-#define HAVE_TIMERCMP 1
-
-/* Define if timerisset is defined in <sys/time.h> */
-#define HAVE_TIMERISSET 1
-
-/* Define to 1 if the system has the type `uint16_t'. */
-#define HAVE_UINT16_T 1
-
-/* Define to 1 if the system has the type `uint32_t'. */
-#define HAVE_UINT32_T 1
-
-/* Define to 1 if the system has the type `uint64_t'. */
-#define HAVE_UINT64_T 1
-
-/* Define to 1 if the system has the type `uint8_t'. */
-#define HAVE_UINT8_T 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if you have the `vasprintf' function. */
-#define HAVE_VASPRINTF 1
-
-/* Define if kqueue works correctly with pipes */
-/* #undef HAVE_WORKING_KQUEUE */
-
-/* Name of package */
-#define PACKAGE "libevent"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT ""
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME ""
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING ""
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME ""
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION ""
-
-/* The size of `int', as computed by sizeof. */
-#define SIZEOF_INT 4
-
-/* The size of `long', as computed by sizeof. */
-#define SIZEOF_LONG 8
-
-/* The size of `long long', as computed by sizeof. */
-#define SIZEOF_LONG_LONG 8
-
-/* The size of `short', as computed by sizeof. */
-#define SIZEOF_SHORT 2
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#define TIME_WITH_SYS_TIME 1
-
-/* Version number of package */
-#define VERSION "1.4.13-stable"
-
-/* Define to appropriate substitue if compiler doesnt have __func__ */
-/* #undef __func__ */
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef const */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
-   calls it, or to nothing if 'inline' is not supported under any name.  */
-#ifndef __cplusplus
-/* #undef inline */
-#endif
-
-/* Define to `int' if <sys/types.h> does not define. */
-/* #undef pid_t */
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef size_t */
-
-/* Define to unsigned int if you dont have it */
-/* #undef socklen_t */
diff --git a/base/third_party/libevent/android/event-config.h b/base/third_party/libevent/android/event-config.h
deleted file mode 100644
index 6563cb7..0000000
--- a/base/third_party/libevent/android/event-config.h
+++ /dev/null
@@ -1,281 +0,0 @@
-/* Copied from Linux version and changed the features according Android, which
- * is close to Linux */
-#ifndef _EVENT_CONFIG_H_
-#define _EVENT_CONFIG_H_
-/* config.h.  Generated from config.h.in by configure.  */
-/* config.h.in.  Generated from configure.in by autoheader.  */
-
-/* Define if clock_gettime is available in libc */
-#define _EVENT_DNS_USE_CPU_CLOCK_FOR_ID 1
-
-/* Define is no secure id variant is available */
-/* #undef _EVENT_DNS_USE_GETTIMEOFDAY_FOR_ID */
-
-/* Define to 1 if you have the `clock_gettime' function. */
-#define _EVENT_HAVE_CLOCK_GETTIME 1
-
-/* Define if /dev/poll is available */
-/* #undef _EVENT_HAVE_DEVPOLL */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define _EVENT_HAVE_DLFCN_H 1
-
-/* Define if your system supports the epoll system calls */
-#define _EVENT_HAVE_EPOLL 1
-
-/* Define to 1 if you have the `epoll_ctl' function. */
-#define _EVENT_HAVE_EPOLL_CTL 1
-
-/* Define if your system supports event ports */
-/* #undef _EVENT_HAVE_EVENT_PORTS */
-
-/* Define to 1 if you have the `fcntl' function. */
-#define _EVENT_HAVE_FCNTL 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define _EVENT_HAVE_FCNTL_H 1
-
-/* Define to 1 if the system has the type `fd_mask'. */
-/* #undef _EVENT_HAVE_FD_MASK 1 */
-
-/* Define to 1 if you have the `getaddrinfo' function. */
-#define _EVENT_HAVE_GETADDRINFO 1
-
-/* Define to 1 if you have the `getegid' function. */
-#define _EVENT_HAVE_GETEGID 1
-
-/* Define to 1 if you have the `geteuid' function. */
-#define _EVENT_HAVE_GETEUID 1
-
-/* Define to 1 if you have the `getnameinfo' function. */
-#define _EVENT_HAVE_GETNAMEINFO 1
-
-/* Define to 1 if you have the `gettimeofday' function. */
-#define _EVENT_HAVE_GETTIMEOFDAY 1
-
-/* Define to 1 if you have the `inet_ntop' function. */
-#define _EVENT_HAVE_INET_NTOP 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define _EVENT_HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the `issetugid' function. */
-/* #undef _EVENT_HAVE_ISSETUGID */
-
-/* Define to 1 if you have the `kqueue' function. */
-/* #undef _EVENT_HAVE_KQUEUE */
-
-/* Define to 1 if you have the `nsl' library (-lnsl). */
-#define _EVENT_HAVE_LIBNSL 1
-
-/* Define to 1 if you have the `resolv' library (-lresolv). */
-#define _EVENT_HAVE_LIBRESOLV 1
-
-/* Define to 1 if you have the `rt' library (-lrt). */
-#define _EVENT_HAVE_LIBRT 1
-
-/* Define to 1 if you have the `socket' library (-lsocket). */
-/* #undef _EVENT_HAVE_LIBSOCKET */
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define _EVENT_HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <netinet/in6.h> header file. */
-/* #undef _EVENT_HAVE_NETINET_IN6_H */
-
-/* Define to 1 if you have the `poll' function. */
-#define _EVENT_HAVE_POLL 1
-
-/* Define to 1 if you have the <poll.h> header file. */
-#define _EVENT_HAVE_POLL_H 1
-
-/* Define to 1 if you have the `port_create' function. */
-/* #undef _EVENT_HAVE_PORT_CREATE */
-
-/* Define to 1 if you have the <port.h> header file. */
-/* #undef _EVENT_HAVE_PORT_H */
-
-/* Define to 1 if you have the `select' function. */
-#define _EVENT_HAVE_SELECT 1
-
-/* Define if F_SETFD is defined in <fcntl.h> */
-#define _EVENT_HAVE_SETFD 1
-
-/* Define to 1 if you have the `sigaction' function. */
-#define _EVENT_HAVE_SIGACTION 1
-
-/* Define to 1 if you have the `signal' function. */
-#define _EVENT_HAVE_SIGNAL 1
-
-/* Define to 1 if you have the <signal.h> header file. */
-#define _EVENT_HAVE_SIGNAL_H 1
-
-/* Define to 1 if you have the <stdarg.h> header file. */
-#define _EVENT_HAVE_STDARG_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define _EVENT_HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define _EVENT_HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define _EVENT_HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define _EVENT_HAVE_STRING_H 1
-
-/* Define to 1 if you have the `strlcpy' function. */
-#define _EVENT_HAVE_STRLCPY 1
-
-/* Define to 1 if you have the `strsep' function. */
-#define _EVENT_HAVE_STRSEP 1
-
-/* Define to 1 if you have the `strtok_r' function. */
-#define _EVENT_HAVE_STRTOK_R 1
-
-/* Define to 1 if you have the `strtoll' function. */
-#define _EVENT_HAVE_STRTOLL 1
-
-/* Define to 1 if the system has the type `struct in6_addr'. */
-#define _EVENT_HAVE_STRUCT_IN6_ADDR 1
-
-/* Define to 1 if you have the <sys/devpoll.h> header file. */
-/* #undef _EVENT_HAVE_SYS_DEVPOLL_H */
-
-/* Define to 1 if you have the <sys/epoll.h> header file. */
-#define _EVENT_HAVE_SYS_EPOLL_H 1
-
-/* Define to 1 if you have the <sys/event.h> header file. */
-/* #undef _EVENT_HAVE_SYS_EVENT_H */
-
-/* Define to 1 if you have the <sys/ioctl.h> header file. */
-#define _EVENT_HAVE_SYS_IOCTL_H 1
-
-/* Define to 1 if you have the <sys/param.h> header file. */
-#define _EVENT_HAVE_SYS_PARAM_H 1
-
-/* Define to 1 if you have the <sys/queue.h> header file. */
-#define _EVENT_HAVE_SYS_QUEUE_H 1
-
-/* Define to 1 if you have the <sys/select.h> header file. */
-#define _EVENT_HAVE_SYS_SELECT_H 1
-
-/* Define to 1 if you have the <sys/socket.h> header file. */
-#define _EVENT_HAVE_SYS_SOCKET_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define _EVENT_HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/time.h> header file. */
-#define _EVENT_HAVE_SYS_TIME_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define _EVENT_HAVE_SYS_TYPES_H 1
-
-/* Define if TAILQ_FOREACH is defined in <sys/queue.h> */
-#define _EVENT_HAVE_TAILQFOREACH 1
-
-/* Define if timeradd is defined in <sys/time.h> */
-#define _EVENT_HAVE_TIMERADD 1
-
-/* Define if timerclear is defined in <sys/time.h> */
-#define _EVENT_HAVE_TIMERCLEAR 1
-
-/* Define if timercmp is defined in <sys/time.h> */
-#define _EVENT_HAVE_TIMERCMP 1
-
-/* Define if timerisset is defined in <sys/time.h> */
-#define _EVENT_HAVE_TIMERISSET 1
-
-/* Define to 1 if the system has the type `uint16_t'. */
-#define _EVENT_HAVE_UINT16_T 1
-
-/* Define to 1 if the system has the type `uint32_t'. */
-#define _EVENT_HAVE_UINT32_T 1
-
-/* Define to 1 if the system has the type `uint64_t'. */
-#define _EVENT_HAVE_UINT64_T 1
-
-/* Define to 1 if the system has the type `uint8_t'. */
-#define _EVENT_HAVE_UINT8_T 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define _EVENT_HAVE_UNISTD_H 1
-
-/* Define to 1 if you have the `vasprintf' function. */
-#define _EVENT_HAVE_VASPRINTF 1
-
-/* Define if kqueue works correctly with pipes */
-/* #undef _EVENT_HAVE_WORKING_KQUEUE */
-
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
-#define _EVENT_LT_OBJDIR ".libs/"
-
-/* Numeric representation of the version */
-#define _EVENT_NUMERIC_VERSION 0x01040f00
-
-/* Name of package */
-#define _EVENT_PACKAGE "libevent"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define _EVENT_PACKAGE_BUGREPORT ""
-
-/* Define to the full name of this package. */
-#define _EVENT_PACKAGE_NAME ""
-
-/* Define to the full name and version of this package. */
-#define _EVENT_PACKAGE_STRING ""
-
-/* Define to the one symbol short name of this package. */
-#define _EVENT_PACKAGE_TARNAME ""
-
-/* Define to the home page for this package. */
-#define _EVENT_PACKAGE_URL ""
-
-/* Define to the version of this package. */
-#define _EVENT_PACKAGE_VERSION ""
-
-/* The size of `int', as computed by sizeof. */
-#define _EVENT_SIZEOF_INT 4
-
-/* The size of `long', as computed by sizeof. */
-#define _EVENT_SIZEOF_LONG 8
-
-/* The size of `long long', as computed by sizeof. */
-#define _EVENT_SIZEOF_LONG_LONG 8
-
-/* The size of `short', as computed by sizeof. */
-#define _EVENT_SIZEOF_SHORT 2
-
-/* Define to 1 if you have the ANSI C header files. */
-#define _EVENT_STDC_HEADERS 1
-
-/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
-#define _EVENT_TIME_WITH_SYS_TIME 1
-
-/* Version number of package */
-#define _EVENT_VERSION "1.4.15"
-
-/* Define to appropriate substitue if compiler doesnt have __func__ */
-/* #undef _EVENT___func__ */
-
-/* Define to empty if `const' does not conform to ANSI C. */
-/* #undef _EVENT_const */
-
-/* Define to `__inline__' or `__inline' if that's what the C compiler
-   calls it, or to nothing if 'inline' is not supported under any name.  */
-#ifndef _EVENT___cplusplus
-/* #undef _EVENT_inline */
-#endif
-
-/* Define to `int' if <sys/types.h> does not define. */
-/* #undef _EVENT_pid_t */
-
-/* Define to `unsigned int' if <sys/types.h> does not define. */
-/* #undef _EVENT_size_t */
-
-/* Define to unsigned int if you dont have it */
-/* #undef _EVENT_socklen_t */
-#endif
diff --git a/base/threading/platform_thread_android.cc b/base/threading/platform_thread_android.cc
deleted file mode 100644
index fd90d35..0000000
--- a/base/threading/platform_thread_android.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/threading/platform_thread.h"
-
-#include <errno.h>
-#include <stddef.h>
-#include <sys/prctl.h>
-#include <sys/resource.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include "base/android/jni_android.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/threading/platform_thread_internal_posix.h"
-#include "base/threading/thread_id_name_manager.h"
-#include "jni/ThreadUtils_jni.h"
-
-namespace base {
-
-namespace internal {
-
-// - BACKGROUND corresponds to Android's PRIORITY_BACKGROUND = 10 value and can
-// result in heavy throttling and force the thread onto a little core on
-// big.LITTLE devices.
-// - DISPLAY corresponds to Android's PRIORITY_DISPLAY = -4 value.
-// - REALTIME_AUDIO corresponds to Android's PRIORITY_AUDIO = -16 value.
-const ThreadPriorityToNiceValuePair kThreadPriorityToNiceValueMap[4] = {
-    {ThreadPriority::BACKGROUND, 10},
-    {ThreadPriority::NORMAL, 0},
-    {ThreadPriority::DISPLAY, -4},
-    {ThreadPriority::REALTIME_AUDIO, -16},
-};
-
-bool SetCurrentThreadPriorityForPlatform(ThreadPriority priority) {
-  // On Android, we set the Audio priority through JNI as Audio priority
-  // will also allow the process to run while it is backgrounded.
-  if (priority == ThreadPriority::REALTIME_AUDIO) {
-    JNIEnv* env = base::android::AttachCurrentThread();
-    Java_ThreadUtils_setThreadPriorityAudio(env, PlatformThread::CurrentId());
-    return true;
-  }
-  return false;
-}
-
-bool GetCurrentThreadPriorityForPlatform(ThreadPriority* priority) {
-  DCHECK(priority);
-  *priority = ThreadPriority::NORMAL;
-  JNIEnv* env = base::android::AttachCurrentThread();
-  if (Java_ThreadUtils_isThreadPriorityAudio(
-      env, PlatformThread::CurrentId())) {
-    *priority = ThreadPriority::REALTIME_AUDIO;
-    return true;
-  }
-  return false;
-}
-
-}  // namespace internal
-
-void PlatformThread::SetName(const std::string& name) {
-  ThreadIdNameManager::GetInstance()->SetName(name);
-
-  // Like linux, on android we can get the thread names to show up in the
-  // debugger by setting the process name for the LWP.
-  // We don't want to do this for the main thread because that would rename
-  // the process, causing tools like killall to stop working.
-  if (PlatformThread::CurrentId() == getpid())
-    return;
-
-  // Set the name for the LWP (which gets truncated to 15 characters).
-  int err = prctl(PR_SET_NAME, name.c_str());
-  if (err < 0 && errno != EPERM)
-    DPLOG(ERROR) << "prctl(PR_SET_NAME)";
-}
-
-
-void InitThreading() {
-}
-
-void TerminateOnThread() {
-  base::android::DetachFromVM();
-}
-
-size_t GetDefaultThreadStackSize(const pthread_attr_t& attributes) {
-#if !defined(ADDRESS_SANITIZER)
-  return 0;
-#else
-  // AddressSanitizer bloats the stack approximately 2x. Default stack size of
-  // 1Mb is not enough for some tests (see http://crbug.com/263749 for example).
-  return 2 * (1 << 20);  // 2Mb
-#endif
-}
-
-}  // namespace base
diff --git a/base/time/time_android.cc b/base/time/time_android.cc
deleted file mode 100644
index e0c4914..0000000
--- a/base/time/time_android.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/time/time.h"
-
-namespace base {
-
-// static
-TimeTicks TimeTicks::FromUptimeMillis(jlong uptime_millis_value) {
-  // The implementation of the SystemClock.uptimeMillis() in AOSP uses the same
-  // clock as base::TimeTicks::Now(): clock_gettime(CLOCK_MONOTONIC), see in
-  // platform/system/code:
-  // 1. libutils/SystemClock.cpp
-  // 2. libutils/Timers.cpp
-  //
-  // We are not aware of any motivations for Android OEMs to modify the AOSP
-  // implementation of either uptimeMillis() or clock_gettime(CLOCK_MONOTONIC),
-  // so we assume that there are no such customizations.
-  //
-  // Under these assumptions the conversion is as safe as copying the value of
-  // base::TimeTicks::Now() with a loss of sub-millisecond precision.
-  return TimeTicks(uptime_millis_value * Time::kMicrosecondsPerMillisecond);
-}
-
-}  // namespace base
