WIP
diff --git a/quic/tools/quic_memory_cache_backend.cc b/quic/tools/quic_memory_cache_backend.cc
index 38d25e5..206d2c5 100644
--- a/quic/tools/quic_memory_cache_backend.cc
+++ b/quic/tools/quic_memory_cache_backend.cc
@@ -236,23 +236,31 @@
 
 bool QuicMemoryCacheBackend::InitializeBackend(
     const std::string& cache_directory) {
+  LOG(INFO) << __FUNCTION__;
   if (cache_directory.empty()) {
     QUIC_BUG << "cache_directory must not be empty.";
     return false;
   }
-  QUIC_LOG(INFO)
+  LOG(INFO)
       << "Attempting to initialize QuicMemoryCacheBackend from directory: "
       << cache_directory;
   std::vector<std::string> files = ReadFileContents(cache_directory);
+  LOG(INFO) << "files.size():" << files.size();
   std::list<std::unique_ptr<ResourceFile>> resource_files;
   for (const auto& filename : files) {
     std::unique_ptr<ResourceFile> resource_file(new ResourceFile(filename));
 
     // Tease apart filename into host and path.
-    QuicStringPiece base(resource_file->file_name());
-    base.remove_prefix(cache_directory.length());
+    std::string base(resource_file->file_name());
+    for (size_t i = 0; i < base.length(); ++i) {
+      if (base[i] == '\\') {
+        base[i] = '/';
+      }
+    }
+    LOG(INFO) << base;
+    base.erase(0, cache_directory.length());
     if (base[0] == '/') {
-      base.remove_prefix(1);
+      base.erase(0, 1);
     }
 
     resource_file->SetHostPathFromBase(base);
diff --git a/quic/tools/quic_memory_cache_backend_test.cc b/quic/tools/quic_memory_cache_backend_test.cc
index 01ac334..90a76d8 100644
--- a/quic/tools/quic_memory_cache_backend_test.cc
+++ b/quic/tools/quic_memory_cache_backend_test.cc
@@ -10,6 +10,10 @@
 #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 {
 
@@ -18,6 +22,38 @@
 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,
@@ -34,6 +70,49 @@
   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");