diff --git a/quic/tools/quic_memory_cache_backend_test.cc b/quic/tools/quic_memory_cache_backend_test.cc
index 90a76d8..01ac334 100644
--- a/quic/tools/quic_memory_cache_backend_test.cc
+++ b/quic/tools/quic_memory_cache_backend_test.cc
@@ -10,10 +10,6 @@
 #include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
 #include "net/third_party/quiche/src/quic/tools/quic_backend_response.h"
 
-#include "base/files/scoped_temp_dir.h"
-#include "base/files/file_enumerator.h"
-#include "base/files/file_util.h"
-
 namespace quic {
 namespace test {
 
@@ -22,38 +18,6 @@
 typedef QuicBackendResponse::ServerPushInfo ServerPushInfo;
 }  // namespace
 
-using testing::ElementsAre;
-using testing::IsEmpty;
-using base::FilePath;
-using base::ScopedTempDir;
-using base::FileEnumerator;
-using base::circular_deque;
-
-const FilePath::StringType kEmptyPattern;
-
-const std::vector<FileEnumerator::FolderSearchPolicy> kFolderSearchPolicies{
-    FileEnumerator::FolderSearchPolicy::MATCH_ONLY,
-    FileEnumerator::FolderSearchPolicy::ALL};
-
-circular_deque<FilePath> RunEnumerator(
-    const FilePath& root_path,
-    bool recursive,
-    int file_type,
-    const FilePath::StringType& pattern,
-    FileEnumerator::FolderSearchPolicy folder_search_policy) {
-  circular_deque<FilePath> rv;
-  FileEnumerator enumerator(root_path, recursive, file_type, pattern,
-                            folder_search_policy);
-  for (auto file = enumerator.Next(); !file.empty(); file = enumerator.Next())
-    rv.emplace_back(std::move(file));
-  return rv;
-}
-
-bool CreateDummyFile(const FilePath& path) {
-  return WriteFile(path, "42", sizeof("42")) == sizeof("42");
-}
-
-
 class QuicMemoryCacheBackendTest : public QuicTest {
  protected:
   void CreateRequest(std::string host,
@@ -70,49 +34,6 @@
   QuicMemoryCacheBackend cache_;
 };
 
-TEST(FileEnumerator, FileInSubfolder) {
-  FilePath directory(FilePath::FromUTF8Unsafe(QuicGetTestMemoryCachePath()));
-
-  for (auto policy : kFolderSearchPolicies) {
-    auto files = RunEnumerator(directory, true, FileEnumerator::FILES,
-                               kEmptyPattern, policy);
-    EXPECT_FALSE(files.empty());
-
-    files = RunEnumerator(directory, false, FileEnumerator::FILES,
-                          kEmptyPattern, policy);
-    EXPECT_THAT(files, IsEmpty());
-  }
-
-  FilePath directory2(FilePath::FromUTF8Unsafe(QuicGetTestMemoryCachePath() + "/test.example.com"));
-
-  for (auto policy : kFolderSearchPolicies) {
-    auto files = RunEnumerator(directory2, true, FileEnumerator::FILES,
-                               kEmptyPattern, policy);
-    EXPECT_FALSE(files.empty());
-  }
-}
-
-TEST(FileEnumerator, FileInSubfolderReal) {
-  ScopedTempDir temp_dir;
-  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
-
-  const FilePath subdir = temp_dir.GetPath().AppendASCII("subdir");
-  ASSERT_TRUE(CreateDirectory(subdir));
-
-  const FilePath file = subdir.AppendASCII("test.txt");
-  ASSERT_TRUE(CreateDummyFile(file));
-
-  for (auto policy : kFolderSearchPolicies) {
-    auto files = RunEnumerator(temp_dir.GetPath(), true, FileEnumerator::FILES,
-                               kEmptyPattern, policy);
-    EXPECT_THAT(files, ElementsAre(file));
-
-    files = RunEnumerator(temp_dir.GetPath(), false, FileEnumerator::FILES,
-                          kEmptyPattern, policy);
-    EXPECT_THAT(files, IsEmpty());
-  }
-}
-
 TEST_F(QuicMemoryCacheBackendTest, GetResponseNoMatch) {
   const Response* response =
       cache_.GetResponse("mail.google.com", "/index.html");
