15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_util.h"
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/metrics/field_trial.h"
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/port.h"
95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/platform_thread.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/thread_restrictions.h"
14a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "net/base/cache_type.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h"
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/backend_impl.h"
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/entry_impl.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/experiments.h"
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/histogram_macros.h"
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/mapped_file.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/cache_util.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache_test_base.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache_test_util.h"
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/memory/mem_backend_impl.h"
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/disk_cache/simple/simple_backend_impl.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/disk_cache/simple/simple_entry_format.h"
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/disk_cache/simple/simple_test_util.h"
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/disk_cache/simple/simple_util.h"
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/tracing/tracing_cache_backend.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_handle.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Provide a BackendImpl object to macros from histogram_macros.h.
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define CACHE_UMA_BACKEND_IMPL_OBJ backend_
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace {
44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst char kExistingEntryKey[] = "existing entry key";
46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<disk_cache::BackendImpl> CreateExistingEntryCache(
48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    const base::Thread& cache_thread,
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    base::FilePath& cache_path) {
50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  net::TestCompletionCallback cb;
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl(
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      cache_path, cache_thread.message_loop_proxy(), NULL));
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int rv = cache->Init(cb.callback());
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (cb.GetResult(rv) != net::OK)
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return scoped_ptr<disk_cache::BackendImpl>();
57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  disk_cache::Entry* entry = NULL;
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  rv = cache->CreateEntry(kExistingEntryKey, &entry, cb.callback());
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (cb.GetResult(rv) != net::OK)
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return scoped_ptr<disk_cache::BackendImpl>();
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  entry->Close();
63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return cache.Pass();
65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}  // namespace
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that can run with different types of caches.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DiskCacheBackendTest : public DiskCacheTestWithCache {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Some utility methods:
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Perform IO operations on the cache until there is pending IO.
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int GeneratePendingIO(net::TestCompletionCallback* cb);
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Adds 5 sparse entries. |doomed_start| and |doomed_end| if not NULL,
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // will be filled with times, used by DoomEntriesSince and DoomEntriesBetween.
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // There are 4 entries after doomed_start and 2 after doomed_end.
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void InitSparseCache(base::Time* doomed_start, base::Time* doomed_end);
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool CreateSetOfRandomEntries(std::set<std::string>* key_pool);
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool EnumerateAndMatchKeys(int max_to_open,
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                             void** iter,
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                             std::set<std::string>* keys_to_match,
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                             size_t* count);
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Actual tests:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendBasics();
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendKeying();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendShutdownWithPendingFileIO(bool fast);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendShutdownWithPendingIO(bool fast);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendShutdownWithPendingCreate(bool fast);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendSetSize();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendLoad();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendChain();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendValidEntry();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidEntry();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidEntryRead();
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidEntryWithLoad();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendTrimInvalidEntry();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendTrimInvalidEntry2();
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendEnumerations();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendEnumerations2();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidEntryEnumeration();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendFixEnumerators();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendDoomRecent();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendDoomBetween();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendTransaction(const std::string& name, int num_entries, bool load);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendRecoverInsert();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendRecoverRemove();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendRecoverWithEviction();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidEntry2();
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidEntry3();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidEntry7();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidEntry8();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidEntry9(bool eviction);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidEntry10(bool eviction);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidEntry11(bool eviction);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendTrimInvalidEntry12();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendDoomAll();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendDoomAll2();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidRankings();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendInvalidRankings2();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendDisable();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendDisable2();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendDisable3();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BackendDisable4();
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void TracingBackendBasics();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)int DiskCacheBackendTest::GeneratePendingIO(net::TestCompletionCallback* cb) {
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!use_current_thread_) {
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ADD_FAILURE();
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return net::ERR_FAILED;
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  disk_cache::Entry* entry;
139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int rv = cache_->CreateEntry("some key", &entry, cb->callback());
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (cb->GetResult(rv) != net::OK)
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return net::ERR_CACHE_CREATE_FAILURE;
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const int kSize = 25000;
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CacheTestFillBuffer(buffer->data(), kSize, false);
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (int i = 0; i < 10 * 1024 * 1024; i += 64 * 1024) {
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // We are using the current thread as the cache thread because we want to
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // be able to call directly this method to make sure that the OS (instead
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // of us switching thread) is returning IO pending.
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (!simple_cache_mode_) {
152d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      rv = static_cast<disk_cache::EntryImpl*>(entry)->WriteDataImpl(
153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          0, i, buffer.get(), kSize, cb->callback(), false);
154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    } else {
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      rv = entry->WriteData(0, i, buffer.get(), kSize, cb->callback(), false);
156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (rv == net::ERR_IO_PENDING)
15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (rv != kSize)
16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      rv = net::ERR_FAILED;
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Don't call Close() to avoid going through the queue or we'll deadlock
16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // waiting for the operation to finish.
166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (!simple_cache_mode_)
167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    static_cast<disk_cache::EntryImpl*>(entry)->Release();
168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  else
169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    entry->Close();
170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return rv;
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void DiskCacheBackendTest::InitSparseCache(base::Time* doomed_start,
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                           base::Time* doomed_end) {
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  InitCache();
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const int kSize = 50;
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // This must be greater then MemEntryImpl::kMaxSparseEntrySize.
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const int kOffset = 10 + 1024 * 1024;
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  disk_cache::Entry* entry0 = NULL;
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  disk_cache::Entry* entry1 = NULL;
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  disk_cache::Entry* entry2 = NULL;
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CacheTestFillBuffer(buffer->data(), kSize, false);
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("zeroth", &entry0));
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(kSize, WriteSparseData(entry0, 0, buffer.get(), kSize));
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(kSize,
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            WriteSparseData(entry0, kOffset + kSize, buffer.get(), kSize));
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  entry0->Close();
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FlushQueueForTest();
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddDelay();
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (doomed_start)
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    *doomed_start = base::Time::Now();
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Order in rankings list:
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // first_part1, first_part2, second_part1, second_part2
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("first", &entry1));
20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(kSize, WriteSparseData(entry1, 0, buffer.get(), kSize));
20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(kSize,
20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            WriteSparseData(entry1, kOffset + kSize, buffer.get(), kSize));
20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  entry1->Close();
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("second", &entry2));
20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(kSize, WriteSparseData(entry2, 0, buffer.get(), kSize));
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(kSize,
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            WriteSparseData(entry2, kOffset + kSize, buffer.get(), kSize));
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  entry2->Close();
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FlushQueueForTest();
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddDelay();
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (doomed_end)
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    *doomed_end = base::Time::Now();
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Order in rankings list:
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // third_part1, fourth_part1, third_part2, fourth_part2
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  disk_cache::Entry* entry3 = NULL;
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  disk_cache::Entry* entry4 = NULL;
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("third", &entry3));
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(kSize, WriteSparseData(entry3, 0, buffer.get(), kSize));
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry4));
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(kSize, WriteSparseData(entry4, 0, buffer.get(), kSize));
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(kSize,
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            WriteSparseData(entry3, kOffset + kSize, buffer.get(), kSize));
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(kSize,
23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            WriteSparseData(entry4, kOffset + kSize, buffer.get(), kSize));
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  entry3->Close();
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  entry4->Close();
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  FlushQueueForTest();
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AddDelay();
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Creates entries based on random keys. Stores these keys in |key_pool|.
23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool DiskCacheBackendTest::CreateSetOfRandomEntries(
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::set<std::string>* key_pool) {
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const int kNumEntries = 10;
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (int i = 0; i < kNumEntries; ++i) {
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string key = GenerateKey(true);
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    disk_cache::Entry* entry;
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (CreateEntry(key, &entry) != net::OK)
24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return false;
24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    key_pool->insert(key);
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    entry->Close();
25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return key_pool->size() == implicit_cast<size_t>(cache_->GetEntryCount());
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Performs iteration over the backend and checks that the keys of entries
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// opened are in |keys_to_match|, then erases them. Up to |max_to_open| entries
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// will be opened, if it is positive. Otherwise, iteration will continue until
25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// OpenNextEntry stops returning net::OK.
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool DiskCacheBackendTest::EnumerateAndMatchKeys(
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    int max_to_open,
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    void** iter,
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::set<std::string>* keys_to_match,
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    size_t* count) {
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  disk_cache::Entry* entry;
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  while (OpenNextEntry(iter, &entry) == net::OK) {
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!entry)
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      return false;
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1U, keys_to_match->erase(entry->GetKey()));
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    entry->Close();
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ++(*count);
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (max_to_open >= 0 && implicit_cast<int>(*count) >= max_to_open)
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      break;
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendBasics() {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry1 = NULL, *entry2 = NULL;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry("the first key", &entry1));
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != entry1);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1 = NULL;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != entry1);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1 = NULL;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, CreateEntry("the first key", &entry1));
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry("some other key", &entry2));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != entry1);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != entry2);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, cache_->GetEntryCount());
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry3 = NULL;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("some other key", &entry3));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != entry3);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entry2 == entry3);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, cache_->GetEntryCount());
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomEntry("some other key"));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry3->Close();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomEntry("the first key"));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("the first key", &entry1));
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("some other key", &entry2));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Doom();
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomEntry("some other key"));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Basics) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendBasics();
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionBasics) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendBasics();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyBasics) {
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMemoryOnlyMode();
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendBasics();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheBasics) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCacheType(net::APP_CACHE);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendBasics();
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheBasics) {
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BackendBasics();
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendKeying() {
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kName1 = "the first key";
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* kName2 = "the first Key";
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry1, *entry2;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(kName1, &entry1));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(kName2, &entry2));
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entry1 != entry2) << "Case sensitive";
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[30];
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::strlcpy(buffer, kName1, arraysize(buffer));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(buffer, &entry2));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entry1 == entry2);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::strlcpy(buffer + 1, kName1, arraysize(buffer) - 1);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(buffer + 1, &entry2));
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entry1 == entry2);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::strlcpy(buffer + 3,  kName1, arraysize(buffer) - 3);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(buffer + 3, &entry2));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(entry1 == entry2);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now verify long keys.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer2[20000];
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buffer2, 's', sizeof(buffer2));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer2[1023] = '\0';
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on block file";
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer2[1023] = 'g';
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  buffer2[19999] = '\0';
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(buffer2, &entry2)) << "key on external file";
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Keying) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendKeying();
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionKeying) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendKeying();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyKeying) {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMemoryOnlyMode();
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendKeying();
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheKeying) {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCacheType(net::APP_CACHE);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendKeying();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheKeying) {
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BackendKeying();
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, CreateBackend) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(CleanupCacheDir());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Thread cache_thread("CacheThread");
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(cache_thread.StartWithOptions(
42090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Test the private factory method(s).
423a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_ptr<disk_cache::Backend> cache;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache = disk_cache::MemBackendImpl::CreateBackend(0, NULL);
425a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(cache.get());
426a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    cache.reset();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now test the public API.
4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    int rv =
4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        disk_cache::CreateCacheBackend(net::DISK_CACHE,
4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       net::CACHE_BACKEND_DEFAULT,
4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       cache_path_,
4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       0,
4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       false,
4357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       cache_thread.message_loop_proxy().get(),
4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       NULL,
4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       &cache,
4387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       cb.callback());
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, cb.GetResult(rv));
440a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(cache.get());
441a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    cache.reset();
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
443a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    rv = disk_cache::CreateCacheBackend(net::MEMORY_CACHE,
444a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                        net::CACHE_BACKEND_DEFAULT,
445a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                        base::FilePath(), 0,
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        false, NULL, NULL, &cache,
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        cb.callback());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, cb.GetResult(rv));
449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(cache.get());
450a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    cache.reset();
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that |BackendImpl| fails to initialize with a missing file.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, CreateBackend_MissingFile) {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_entry"));
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath filename = cache_path_.AppendASCII("data_1");
4607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  base::DeleteFile(filename, false);
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Thread cache_thread("CacheThread");
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(cache_thread.StartWithOptions(
46390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::TestCompletionCallback cb;
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool prev = base::ThreadRestrictions::SetIOAllowed(false);
467a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl(
468a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      cache_path_, cache_thread.message_loop_proxy().get(), NULL));
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int rv = cache->Init(cb.callback());
4703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_EQ(net::ERR_FAILED, cb.GetResult(rv));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ThreadRestrictions::SetIOAllowed(prev);
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
473a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache.reset();
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DisableIntegrityCheck();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ExternalFiles) {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First, let's create a file on the folder.
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath filename = cache_path_.AppendASCII("f_000001");
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 50;
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize));
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CacheTestFillBuffer(buffer1->data(), kSize, false);
485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(kSize, base::WriteFile(filename, buffer1->data(), kSize));
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now let's create a file with the cache.
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("key", &entry));
490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_EQ(0, WriteData(entry, 0, 20000, buffer1.get(), 0, false));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And verify that the first file is still there.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize));
495a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_EQ(kSize, base::ReadFile(filename, buffer2->data(), kSize));
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(buffer1->data(), buffer2->data(), kSize));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we deal with file-level pending operations at destruction time.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendShutdownWithPendingFileIO(bool fast) {
50158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(CleanupCacheDir());
50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  uint32 flags = disk_cache::kNoBuffering;
50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!fast)
50458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    flags |= disk_cache::kNoRandom;
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  UseCurrentThread();
50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CreateBackend(flags, NULL);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  net::TestCompletionCallback cb;
51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int rv = GeneratePendingIO(&cb);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The cache destructor will see one pending operation here.
51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  cache_.reset();
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (rv == net::ERR_IO_PENDING) {
516d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (fast || simple_cache_mode_)
51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_FALSE(cb.have_result());
51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    else
51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      EXPECT_TRUE(cb.have_result());
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_IOS)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the actual operation to complete, or we'll keep a file handle that
5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // may cause issues later. Note that on iOS systems even though this test
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // uses a single thread, the actual IO is posted to a worker thread and the
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // cache destructor breaks the link to reach cb when the operation completes.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = cb.GetResult(rv);
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO) {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendShutdownWithPendingFileIO(false);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
537a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Here and below, tests that simulate crashes are not compiled in LeakSanitizer
538a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// builds because they contain a lot of intentional memory leaks.
5395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// The wrapper scripts used to run tests under Valgrind Memcheck will also
5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// disable these tests. See:
541a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// tools/valgrind/gtest_exclude/net_unittests.gtest-memcheck.txt
542a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if !defined(LEAK_SANITIZER)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking from this test.
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingFileIO_Fast) {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The integrity test sets kNoRandom so there's a version mismatch if we don't
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // force new eviction.
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendShutdownWithPendingFileIO(true);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// See crbug.com/330074
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(OS_IOS)
55458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Tests that one cache instance is not affected by another one going away.
55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(DiskCacheBackendTest, MultipleInstancesWithPendingFileIO) {
55658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::ScopedTempDir store;
55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(store.CreateUniqueTempDir());
55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  net::TestCompletionCallback cb;
56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<disk_cache::Backend> extra_cache;
56158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int rv = disk_cache::CreateCacheBackend(
56258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)               net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, store.path(), 0,
56358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)               false, base::MessageLoopProxy::current().get(), NULL,
56458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)               &extra_cache, cb.callback());
56558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_EQ(net::OK, cb.GetResult(rv));
56658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(extra_cache.get() != NULL);
56758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(CleanupCacheDir());
56958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SetNewEviction();  // Match the expected behavior for integrity verification.
57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  UseCurrentThread();
57158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CreateBackend(disk_cache::kNoBuffering, NULL);
57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  rv = GeneratePendingIO(&cb);
57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // cache_ has a pending operation, and extra_cache will go away.
57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  extra_cache.reset();
57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (rv == net::ERR_IO_PENDING)
57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_FALSE(cb.have_result());
58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Wait for the actual operation to complete, or we'll keep a file handle that
58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // may cause issues later.
58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  rv = cb.GetResult(rv);
58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we deal with background-thread pending operations.
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendShutdownWithPendingIO(bool fast) {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(CleanupCacheDir());
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Thread cache_thread("CacheThread");
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(cache_thread.StartWithOptions(
59790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 flags = disk_cache::kNoBuffering;
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!fast)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags |= disk_cache::kNoRandom;
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CreateBackend(flags, &cache_thread);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache::Entry* entry;
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int rv = cache_->CreateEntry("some key", &entry, cb.callback());
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, cb.GetResult(rv));
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The cache destructor will see one pending operation here.
612a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    cache_.reset();
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingIO) {
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendShutdownWithPendingIO(false);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if !defined(LEAK_SANITIZER)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking from this test.
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingIO_Fast) {
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The integrity test sets kNoRandom so there's a version mismatch if we don't
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // force new eviction.
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendShutdownWithPendingIO(true);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
630a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we deal with create-type pending operations.
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendShutdownWithPendingCreate(bool fast) {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(CleanupCacheDir());
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Thread cache_thread("CacheThread");
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(cache_thread.StartWithOptions(
64090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache::BackendFlags flags =
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fast ? disk_cache::kNone : disk_cache::kNoRandom;
644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CreateBackend(flags, &cache_thread);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache::Entry* entry;
647c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int rv = cache_->CreateEntry("some key", &entry, cb.callback());
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::ERR_IO_PENDING, rv);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
650a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    cache_.reset();
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(cb.have_result());
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingCreate) {
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendShutdownWithPendingCreate(false);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
661a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if !defined(LEAK_SANITIZER)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking an entry from this test.
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ShutdownWithPendingCreate_Fast) {
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The integrity test sets kNoRandom so there's a version mismatch if we don't
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // force new eviction.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendShutdownWithPendingCreate(true);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
669a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
671effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Disabled on android since this test requires cache creator to create
672effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// blockfile caches.
673effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(OS_ANDROID)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, TruncatedIndex) {
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CleanupCacheDir());
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath index = cache_path_.AppendASCII("index");
677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(5, base::WriteFile(index, "hello", 5));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Thread cache_thread("CacheThread");
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(cache_thread.StartWithOptions(
68190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
684a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<disk_cache::Backend> backend;
6857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int rv =
6867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      disk_cache::CreateCacheBackend(net::DISK_CACHE,
6877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     net::CACHE_BACKEND_BLOCKFILE,
6887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     cache_path_,
6897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     0,
6907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     false,
6917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     cache_thread.message_loop_proxy().get(),
6927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     NULL,
6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     &backend,
6947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     cb.callback());
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(net::OK, cb.GetResult(rv));
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
697a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_FALSE(backend);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
699effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendSetSize() {
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int cache_size = 0x10000;  // 64 kB
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(cache_size);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first("some key");
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string second("something else");
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(first, &entry));
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(cache_size));
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buffer->data(), 0, cache_size);
713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(cache_size / 10,
714868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            WriteData(entry, 0, 0, buffer.get(), cache_size / 10, false))
715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << "normal file";
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(net::ERR_FAILED,
718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            WriteData(entry, 1, 0, buffer.get(), cache_size / 5, false))
719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      << "file size above the limit";
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // By doubling the total size, we make this file cacheable.
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(cache_size * 2);
723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(cache_size / 5,
724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            WriteData(entry, 1, 0, buffer.get(), cache_size / 5, false));
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let's fill up the cache!.
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(cache_size * 10);
728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(cache_size * 3 / 4,
729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            WriteData(entry, 0, 0, buffer.get(), cache_size * 3 / 4, false));
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(cache_size);
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The cache is 95% full.
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(second, &entry));
738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(cache_size / 10,
739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            WriteData(entry, 0, 0, buffer.get(), cache_size / 10, false));
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry2;
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("an extra key", &entry2));
743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(cache_size / 10,
744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            WriteData(entry2, 0, 0, buffer.get(), cache_size / 10, false));
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();  // This will trigger the cache trim.
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry(first, &entry2));
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();  // Make sure that we are done trimming the cache.
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();  // We may have posted two tasks to evict stuff.
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(second, &entry));
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(cache_size / 10, entry->GetDataSize(0));
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, SetSize) {
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendSetSize();
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionSetSize) {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendSetSize();
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlySetSize) {
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMemoryOnlyMode();
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendSetSize();
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendLoad() {
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int seed = static_cast<int>(Time::Now().ToInternalValue());
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  srand(seed);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entries[100];
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 100; i++) {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string key = GenerateKey(true);
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, CreateEntry(key, &entries[i]));
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(100, cache_->GetEntryCount());
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 100; i++) {
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int source1 = rand() % 100;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int source2 = rand() % 100;
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache::Entry* temp = entries[source1];
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entries[source1] = entries[source2];
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entries[source2] = temp;
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 100; i++) {
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache::Entry* entry;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenEntry(entries[i]->GetKey(), &entry));
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(entry == entries[i]);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entries[i]->Doom();
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entries[i]->Close();
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Load) {
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Work with a tiny index table (16 entries)
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0xf);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x100000);
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendLoad();
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionLoad) {
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Work with a tiny index table (16 entries)
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0xf);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x100000);
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendLoad();
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyLoad) {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x100000);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMemoryOnlyMode();
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendLoad();
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheLoad) {
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCacheType(net::APP_CACHE);
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Work with a tiny index table (16 entries)
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0xf);
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x100000);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendLoad();
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheLoad) {
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Work with a tiny index table (16 entries)
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetMask(0xf);
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetMaxSize(0x100000);
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BackendLoad();
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests the chaining of an entry to the current head.
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendChain() {
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0x1);  // 2-entry table.
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x3000);  // 12 kB.
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("The first key", &entry));
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("The Second key", &entry));
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Chain) {
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendChain();
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionChain) {
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendChain();
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheChain) {
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCacheType(net::APP_CACHE);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendChain();
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheChain) {
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BackendChain();
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrim) {
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 100; i++) {
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string name(base::StringPrintf("Key %d", i));
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, CreateEntry(name, &entry));
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i < 90) {
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Entries 0 to 89 are in list 1; 90 to 99 are in list 0.
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(net::OK, OpenEntry(name, &entry));
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry->Close();
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The first eviction must come from list 1 (10% limit), the second must come
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from list 0.
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrimForTest(false);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry("Key 0", &entry));
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrimForTest(false);
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry("Key 90", &entry));
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Double check that we still have the list tails.
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("Key 1", &entry));
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("Key 91", &entry));
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Before looking for invalid entries, let's check a valid entry.
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendValidEntry() {
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key("Some key");
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(key, &entry));
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 50;
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize));
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buffer1->data(), 0, kSize);
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::strlcpy(buffer1->data(), "And the data to save", kSize);
915868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer1.get(), kSize, false));
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateCrash();
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(key, &entry));
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer2(new net::IOBuffer(kSize));
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buffer2->data(), 0, kSize);
923868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer2.get(), kSize));
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ(buffer1->data(), buffer2->data());
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, ValidEntry) {
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendValidEntry();
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionValidEntry) {
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendValidEntry();
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The same logic of the previous test (ValidEntry), but this time force the
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// entry to be invalid, simulating a crash in the middle.
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry() {
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key("Some key");
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(key, &entry));
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 50;
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buffer->data(), 0, kSize);
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::strlcpy(buffer->data(), "And the data to save", kSize);
951868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateCrash();
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry(key, &entry));
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
958a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if !defined(LEAK_SANITIZER)
959a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// We'll be leaking memory from this test.
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry) {
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry();
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry) {
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry();
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheInvalidEntry) {
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCacheType(net::APP_CACHE);
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry();
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We'll be leaking memory from this test.
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheInvalidEntry) {
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BackendInvalidEntry();
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Almost the same test, but this time crash the cache after reading an entry.
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntryRead() {
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key("Some key");
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(key, &entry));
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 50;
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buffer->data(), 0, kSize);
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::strlcpy(buffer->data(), "And the data to save", kSize);
995868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(key, &entry));
998868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, ReadData(entry, 0, 0, buffer.get(), kSize));
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateCrash();
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == net::APP_CACHE) {
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Reading an entry and crashing should not make it dirty.
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenEntry(key, &entry));
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, cache_->GetEntryCount());
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(net::OK, OpenEntry(key, &entry));
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, cache_->GetEntryCount());
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntryRead) {
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntryRead();
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryRead) {
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntryRead();
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheInvalidEntryRead) {
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCacheType(net::APP_CACHE);
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntryRead();
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheInvalidEntryRead) {
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BackendInvalidEntryRead();
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We'll be leaking memory from this test.
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntryWithLoad() {
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Work with a tiny index table (16 entries)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0xf);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x100000);
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int seed = static_cast<int>(Time::Now().ToInternalValue());
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  srand(seed);
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kNumEntries = 100;
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entries[kNumEntries];
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < kNumEntries; i++) {
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string key = GenerateKey(true);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, CreateEntry(key, &entries[i]));
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumEntries, cache_->GetEntryCount());
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < kNumEntries; i++) {
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int source1 = rand() % kNumEntries;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int source2 = rand() % kNumEntries;
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache::Entry* temp = entries[source1];
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entries[source1] = entries[source2];
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entries[source2] = temp;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string keys[kNumEntries];
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < kNumEntries; i++) {
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    keys[i] = entries[i]->GetKey();
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (i < kNumEntries / 2)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entries[i]->Close();
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateCrash();
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = kNumEntries / 2; i < kNumEntries; i++) {
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache::Entry* entry;
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(net::OK, OpenEntry(keys[i], &entry));
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < kNumEntries / 2; i++) {
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache::Entry* entry;
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenEntry(keys[i], &entry));
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumEntries / 2, cache_->GetEntryCount());
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntryWithLoad) {
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntryWithLoad();
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryWithLoad) {
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntryWithLoad();
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheInvalidEntryWithLoad) {
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCacheType(net::APP_CACHE);
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntryWithLoad();
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheInvalidEntryWithLoad) {
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BackendInvalidEntryWithLoad();
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We'll be leaking memory from this test.
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTrimInvalidEntry() {
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 0x3000;  // 12 kB
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(kSize * 10);
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first("some key");
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string second("something else");
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(first, &entry));
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buffer->data(), 0, kSize);
1121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a crash.
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateCrash();
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(second, &entry));
1127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, cache_->GetEntryCount());
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(kSize);
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();  // Trim the cache.
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we evicted the entry in less than 20mS, we have one entry in the cache;
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if it took more than that, we posted a task and we'll delete the second
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // entry too.
113790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This may be not thread-safe in general, but for now it's OK so add some
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ThreadSanitizer annotations to ignore data races on cache_.
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See http://crbug.com/55970
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ANNOTATE_IGNORE_READS_BEGIN();
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(1, cache_->GetEntryCount());
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ANNOTATE_IGNORE_READS_END();
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry(first, &entry));
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry) {
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTrimInvalidEntry();
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry) {
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTrimInvalidEntry();
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTrimInvalidEntry2() {
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0xf);  // 16-entry table.
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 0x3000;  // 12 kB
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(kSize * 40);
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buffer->data(), 0, kSize);
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Writing 32 entries to this cache chains most of them.
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 32; i++) {
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string key(base::StringPrintf("some key %d", i));
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, CreateEntry(key, &entry));
1176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenEntry(key, &entry));
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Note that we are not closing the entries.
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate a crash.
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateCrash();
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("Something else", &entry));
1186868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, false));
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(33, cache_->GetEntryCount());
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(kSize);
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For the new eviction code, all corrupt entries are on the second list so
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // they are not going away that easy.
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (new_eviction_) {
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(net::OK, DoomAllEntries());
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();  // Trim the cache.
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We may abort the eviction before cleaning up everything.
120290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If it's not clear enough: we may still have eviction tasks running at this
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time, so the number of entries is changing while we read it.
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN();
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_GE(30, cache_->GetEntryCount());
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ANNOTATE_IGNORE_READS_AND_WRITES_END();
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry2) {
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTrimInvalidEntry2();
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry2) {
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTrimInvalidEntry2();
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif  // !defined(LEAK_SANITIZER)
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendEnumerations() {
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time initial = Time::Now();
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kNumEntries = 100;
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < kNumEntries; i++) {
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string key = GenerateKey(true);
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache::Entry* entry;
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, CreateEntry(key, &entry));
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumEntries, cache_->GetEntryCount());
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time final = Time::Now();
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int count = 0;
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time last_modified[kNumEntries];
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time last_used[kNumEntries];
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (OpenNextEntry(&iter, &entry) == net::OK) {
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(NULL != entry);
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (count < kNumEntries) {
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_modified[count] = entry->GetLastModified();
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_used[count] = entry->GetLastUsed();
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(initial <= last_modified[count]);
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(final >= last_modified[count]);
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    count++;
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumEntries, count);
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  iter = NULL;
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  count = 0;
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The previous enumeration should not have changed the timestamps.
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (OpenNextEntry(&iter, &entry) == net::OK) {
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(NULL != entry);
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (count < kNumEntries) {
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(last_modified[count] == entry->GetLastModified());
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(last_used[count] == entry->GetLastUsed());
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    count++;
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumEntries, count);
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Enumerations) {
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendEnumerations();
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionEnumerations) {
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendEnumerations();
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations) {
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMemoryOnlyMode();
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendEnumerations();
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations) {
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BackendEnumerations();
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheEnumerations) {
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCacheType(net::APP_CACHE);
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendEnumerations();
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies enumerations while entries are open.
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendEnumerations2() {
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string first("first");
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string second("second");
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry1, *entry2;
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(first, &entry1));
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(second, &entry2));
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure that the timestamp is not the same.
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddDelay();
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(second, &entry1));
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2));
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(entry2->GetKey(), second);
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Two entries and the iterator pointing at "first".
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The iterator should still be valid, so we should not crash.
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2));
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(entry2->GetKey(), first);
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_->EndEnumeration(&iter);
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Modify the oldest entry and get the newest element.
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(first, &entry1));
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, WriteData(entry1, 0, 200, NULL, 0, false));
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2));
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type_ == net::APP_CACHE) {
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The list is not updated.
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(entry2->GetKey(), second);
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(entry2->GetKey(), first);
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_->EndEnumeration(&iter);
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Enumerations2) {
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendEnumerations2();
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionEnumerations2) {
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendEnumerations2();
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyEnumerations2) {
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMemoryOnlyMode();
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendEnumerations2();
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheEnumerations2) {
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCacheType(net::APP_CACHE);
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendEnumerations2();
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheEnumerations2) {
13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BackendEnumerations2();
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Verify that ReadData calls do not update the LRU cache
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// when using the SHADER_CACHE type.
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheEnumerationReadData) {
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitCache();
13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string first("first");
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string second("second");
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  disk_cache::Entry *entry1, *entry2;
13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int kSize = 50;
13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize));
13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(first, &entry1));
13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  memset(buffer1->data(), 0, kSize);
13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::strlcpy(buffer1->data(), "And the data to save", kSize);
1378868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1.get(), kSize, false));
13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(second, &entry2));
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  entry2->Close();
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FlushQueueForTest();
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure that the timestamp is not the same.
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AddDelay();
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Read from the last item in the LRU.
1389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1.get(), kSize));
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  entry1->Close();
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void* iter = NULL;
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry2));
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(entry2->GetKey(), second);
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  entry2->Close();
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cache_->EndEnumeration(&iter);
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1399a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if !defined(LEAK_SANITIZER)
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify handling of invalid entries while doing enumerations.
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntryEnumeration() {
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key("Some key");
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry, *entry1, *entry2;
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(key, &entry1));
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 50;
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer1(new net::IOBuffer(kSize));
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buffer1->data(), 0, kSize);
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::strlcpy(buffer1->data(), "And the data to save", kSize);
1413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, WriteData(entry1, 0, 0, buffer1.get(), kSize, false));
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(key, &entry1));
1416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kSize, ReadData(entry1, 0, 0, buffer1.get(), kSize));
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key2("Another key");
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(key2, &entry2));
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, cache_->GetEntryCount());
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateCrash();
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int count = 0;
14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (OpenNextEntry(&iter, &entry) == net::OK) {
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(NULL != entry);
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(key2, entry->GetKey());
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    count++;
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, count);
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntryEnumeration) {
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntryEnumeration();
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We'll be leaking memory from this test.
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntryEnumeration) {
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntryEnumeration();
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1447a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif  // !defined(LEAK_SANITIZER)
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that if for some reason entries are modified close to existing cache
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iterators, we don't generate fatal errors or reset the cache.
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendFixEnumerators() {
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int seed = static_cast<int>(Time::Now().ToInternalValue());
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  srand(seed);
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kNumEntries = 10;
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < kNumEntries; i++) {
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string key = GenerateKey(true);
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    disk_cache::Entry* entry;
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, CreateEntry(key, &entry));
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kNumEntries, cache_->GetEntryCount());
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry1, *entry2;
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter1 = NULL;
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter2 = NULL;
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter1, &entry1));
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != entry1);
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1 = NULL;
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Let's go to the middle of the list.
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < kNumEntries / 2; i++) {
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (entry1)
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      entry1->Close();
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenNextEntry(&iter1, &entry1));
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(NULL != entry1);
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2));
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(NULL != entry2);
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry2->Close();
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Messing up with entry1 will modify entry2->next.
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Doom();
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2));
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != entry2);
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The link entry2->entry1 should be broken.
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(entry2->GetKey(), entry1->GetKey());
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the second iterator should keep working.
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter2, &entry2));
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != entry2);
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_->EndEnumeration(&iter1);
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_->EndEnumeration(&iter2);
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, FixEnumerators) {
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendFixEnumerators();
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionFixEnumerators) {
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendFixEnumerators();
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomRecent() {
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry;
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("first", &entry));
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("second", &entry));
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddDelay();
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time middle = Time::Now();
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("third", &entry));
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry));
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddDelay();
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time final = Time::Now();
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4, cache_->GetEntryCount());
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomEntriesSince(final));
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4, cache_->GetEntryCount());
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomEntriesSince(middle));
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, cache_->GetEntryCount());
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("second", &entry));
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomRecent) {
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomRecent();
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomRecent) {
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomRecent();
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomRecent) {
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMemoryOnlyMode();
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomRecent();
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesSinceSparse) {
1562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetMemoryOnlyMode();
1563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Time start;
1564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitSparseCache(&start, NULL);
1565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DoomEntriesSince(start);
1566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
1567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomEntriesSinceSparse) {
1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Time start;
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitSparseCache(&start, NULL);
1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DoomEntriesSince(start);
1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // NOTE: BackendImpl counts child entries in its GetEntryCount(), while
1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // MemBackendImpl does not. Thats why expected value differs here from
1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // MemoryOnlyDoomEntriesSinceSparse.
1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(3, cache_->GetEntryCount());
1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAllSparse) {
1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetMemoryOnlyMode();
1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitSparseCache(NULL, NULL);
1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(net::OK, DoomAllEntries());
1583c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1586c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomAllSparse) {
1587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitSparseCache(NULL, NULL);
1588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(net::OK, DoomAllEntries());
1589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
1590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomBetween() {
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry;
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("first", &entry));
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddDelay();
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time middle_start = Time::Now();
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("second", &entry));
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("third", &entry));
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddDelay();
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time middle_end = Time::Now();
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry));
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("fourth", &entry));
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddDelay();
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Time final = Time::Now();
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4, cache_->GetEntryCount());
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, middle_end));
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, cache_->GetEntryCount());
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("fourth", &entry));
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomEntriesBetween(middle_start, final));
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1, cache_->GetEntryCount());
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("first", &entry));
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomBetween) {
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomBetween();
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomBetween) {
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomBetween();
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomBetween) {
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMemoryOnlyMode();
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomBetween();
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomEntriesBetweenSparse) {
1650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetMemoryOnlyMode();
1651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Time start, end;
1652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitSparseCache(&start, &end);
1653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DoomEntriesBetween(start, end);
1654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(3, cache_->GetEntryCount());
1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  start = end;
1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  end = base::Time::Now();
1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DoomEntriesBetween(start, end);
1659c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
1660c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1661c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1662c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomEntriesBetweenSparse) {
1663c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Time start, end;
1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitSparseCache(&start, &end);
1665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DoomEntriesBetween(start, end);
1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(9, cache_->GetEntryCount());
1667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  start = end;
1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  end = base::Time::Now();
1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DoomEntriesBetween(start, end);
1671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(3, cache_->GetEntryCount());
1672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTransaction(const std::string& name,
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              int num_entries, bool load) {
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  success_ = false;
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache(name));
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 mask;
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (load) {
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mask = 0xf;
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetMaxSize(0x100000);
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clear the settings from the previous run.
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    mask = 0;
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetMaxSize(0);
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(mask);
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(num_entries + 1, cache_->GetEntryCount());
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key("the first key");
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry1;
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(net::OK, OpenEntry(key, &entry1));
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int actual = cache_->GetEntryCount();
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (num_entries != actual) {
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(load);
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If there is a heavy load, inserting an entry will make another entry
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // dirty (on the hash bucket) so two entries are removed.
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(num_entries - 1, actual);
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1706a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache_.reset();
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_impl_ = NULL;
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, mask));
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  success_ = true;
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendRecoverInsert() {
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests with an empty cache.
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("insert_empty1", 0, false);
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "insert_empty1";
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("insert_empty2", 0, false);
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "insert_empty2";
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("insert_empty3", 0, false);
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "insert_empty3";
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests with one entry on the cache.
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("insert_one1", 1, false);
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "insert_one1";
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("insert_one2", 1, false);
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "insert_one2";
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("insert_one3", 1, false);
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "insert_one3";
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests with one hundred entries on the cache, tiny index.
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("insert_load1", 100, true);
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "insert_load1";
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("insert_load2", 100, true);
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "insert_load2";
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, RecoverInsert) {
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendRecoverInsert();
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionRecoverInsert) {
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendRecoverInsert();
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendRecoverRemove() {
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removing the only element.
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_one1", 0, false);
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_one1";
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_one2", 0, false);
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_one2";
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_one3", 0, false);
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_one3";
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removing the head.
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_head1", 1, false);
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_head1";
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_head2", 1, false);
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_head2";
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_head3", 1, false);
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_head3";
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removing the tail.
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_tail1", 1, false);
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_tail1";
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_tail2", 1, false);
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_tail2";
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_tail3", 1, false);
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_tail3";
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removing with one hundred entries on the cache, tiny index.
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_load1", 100, true);
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_load1";
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_load2", 100, true);
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_load2";
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_load3", 100, true);
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_load3";
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This case cannot be reverted.
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_one4", 0, false);
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_one4";
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTransaction("remove_head4", 1, false);
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(success_) << "remove_head4";
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, RecoverRemove) {
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendRecoverRemove();
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionRecoverRemove) {
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendRecoverRemove();
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendRecoverWithEviction() {
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  success_ = false;
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("insert_load1"));
17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0xf);
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x1000);
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should not crash here.
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableIntegrityCheck();
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, RecoverWithEviction) {
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendRecoverWithEviction();
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionRecoverWithEviction) {
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendRecoverWithEviction();
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the |BackendImpl| fails to start with the wrong cache version.
1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheTest, WrongVersion) {
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("wrong_version"));
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Thread cache_thread("CacheThread");
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(cache_thread.StartWithOptions(
182290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl(
1826a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      cache_path_, cache_thread.message_loop_proxy().get(), NULL));
1827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int rv = cache->Init(cb.callback());
1828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::ERR_FAILED, cb.GetResult(rv));
1829c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1831ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass BadEntropyProvider : public base::FieldTrial::EntropyProvider {
1832ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public:
1833ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual ~BadEntropyProvider() {}
1834ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1835ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual double GetEntropyForTrial(const std::string& trial_name,
1836ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                    uint32 randomization_seed) const OVERRIDE {
1837ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return 0.5;
1838ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1839ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch};
1840ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1841ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Tests that the disk cache successfully joins the control group, dropping the
1842ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// existing cache in favour of a new empty cache.
1843effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Disabled on android since this test requires cache creator to create
1844effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// blockfile caches.
1845effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(OS_ANDROID)
1846ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(DiskCacheTest, SimpleCacheControlJoin) {
1847ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::Thread cache_thread("CacheThread");
1848ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_TRUE(cache_thread.StartWithOptions(
1849ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                  base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
1850ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1851a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<disk_cache::BackendImpl> cache =
1852a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      CreateExistingEntryCache(cache_thread, cache_path_);
1853a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(cache.get());
1854a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache.reset();
1855ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1856ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Instantiate the SimpleCacheTrial, forcing this run into the
1857ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // ExperimentControl group.
1858ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::FieldTrialList field_trial_list(new BadEntropyProvider());
1859ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial",
1860ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                         "ExperimentControl");
1861ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  net::TestCompletionCallback cb;
1862a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<disk_cache::Backend> base_cache;
1863ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int rv =
1864ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      disk_cache::CreateCacheBackend(net::DISK_CACHE,
1865ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     net::CACHE_BACKEND_BLOCKFILE,
1866ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     cache_path_,
1867ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     0,
1868ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     true,
1869ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     cache_thread.message_loop_proxy().get(),
1870ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     NULL,
1871ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     &base_cache,
1872ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                     cb.callback());
1873ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_EQ(net::OK, cb.GetResult(rv));
1874ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  EXPECT_EQ(0, base_cache->GetEntryCount());
1875ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1876effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
1877ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1878ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Tests that the disk cache can restart in the control group preserving
1879ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// existing entries.
1880ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(DiskCacheTest, SimpleCacheControlRestart) {
1881ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Instantiate the SimpleCacheTrial, forcing this run into the
1882ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // ExperimentControl group.
1883ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::FieldTrialList field_trial_list(new BadEntropyProvider());
1884ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial",
1885ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                         "ExperimentControl");
1886ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1887ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::Thread cache_thread("CacheThread");
1888ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_TRUE(cache_thread.StartWithOptions(
1889ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                  base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
1890ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1891a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<disk_cache::BackendImpl> cache =
1892a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      CreateExistingEntryCache(cache_thread, cache_path_);
1893a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(cache.get());
1894ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1895ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  net::TestCompletionCallback cb;
1896ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1897ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const int kRestartCount = 5;
189858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (int i = 0; i < kRestartCount; ++i) {
1899a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    cache.reset(new disk_cache::BackendImpl(
1900a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        cache_path_, cache_thread.message_loop_proxy(), NULL));
1901ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int rv = cache->Init(cb.callback());
1902ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ASSERT_EQ(net::OK, cb.GetResult(rv));
1903ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(1, cache->GetEntryCount());
1904ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1905ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    disk_cache::Entry* entry = NULL;
1906ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    rv = cache->OpenEntry(kExistingEntryKey, &entry, cb.callback());
1907ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(net::OK, cb.GetResult(rv));
1908ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_TRUE(entry);
1909ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    entry->Close();
1910ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1911ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1912ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1913ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Tests that the disk cache can leave the control group preserving existing
1914ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// entries.
1915ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochTEST_F(DiskCacheTest, SimpleCacheControlLeave) {
1916ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::Thread cache_thread("CacheThread");
1917ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ASSERT_TRUE(cache_thread.StartWithOptions(
1918ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
1919ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1920ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  {
1921ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // Instantiate the SimpleCacheTrial, forcing this run into the
1922ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    // ExperimentControl group.
1923ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    base::FieldTrialList field_trial_list(new BadEntropyProvider());
1924ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial",
1925ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                           "ExperimentControl");
1926ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1927a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_ptr<disk_cache::BackendImpl> cache =
1928a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        CreateExistingEntryCache(cache_thread, cache_path_);
1929a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(cache.get());
1930ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1931ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1932ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Instantiate the SimpleCacheTrial, forcing this run into the
1933ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // ExperimentNo group.
1934ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::FieldTrialList field_trial_list(new BadEntropyProvider());
1935ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::FieldTrialList::CreateFieldTrial("SimpleCacheTrial", "ExperimentNo");
1936ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  net::TestCompletionCallback cb;
1937ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1938ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const int kRestartCount = 5;
1939ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (int i = 0; i < kRestartCount; ++i) {
1940a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_ptr<disk_cache::BackendImpl> cache(new disk_cache::BackendImpl(
1941a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        cache_path_, cache_thread.message_loop_proxy(), NULL));
1942ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    int rv = cache->Init(cb.callback());
1943ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    ASSERT_EQ(net::OK, cb.GetResult(rv));
1944ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(1, cache->GetEntryCount());
1945ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1946ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    disk_cache::Entry* entry = NULL;
1947ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    rv = cache->OpenEntry(kExistingEntryKey, &entry, cb.callback());
1948ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_EQ(net::OK, cb.GetResult(rv));
1949ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_TRUE(entry);
1950ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    entry->Close();
1951ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
1952ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
1953ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the cache is properly restarted on recovery error.
1955effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Disabled on android since this test requires cache creator to create
1956effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// blockfile caches.
1957effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if !defined(OS_ANDROID)
1958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, DeleteOld) {
1959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(CopyTestCache("wrong_version"));
1960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetNewEviction();
1961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Thread cache_thread("CacheThread");
1962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(cache_thread.StartWithOptions(
196390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::TestCompletionCallback cb;
1966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool prev = base::ThreadRestrictions::SetIOAllowed(false);
1967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath path(cache_path_);
19687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int rv =
19697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      disk_cache::CreateCacheBackend(net::DISK_CACHE,
19707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     net::CACHE_BACKEND_BLOCKFILE,
19717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     path,
19727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     0,
19737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     true,
19747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     cache_thread.message_loop_proxy().get(),
19757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     NULL,
19767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     &cache_,
19777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     cb.callback());
1978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  path.clear();  // Make sure path was captured by the previous call.
1979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::OK, cb.GetResult(rv));
1980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ThreadRestrictions::SetIOAllowed(prev);
1981a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache_.reset();
1982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, mask_));
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1984effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We want to be able to deal with messed up entries on disk.
19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry2() {
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_entry"));
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry1, *entry2;
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("the first key", &entry1));
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry("some other key", &entry2));
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CheckCacheIntegrity will fail at this point.
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableIntegrityCheck();
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry2) {
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry2();
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry2) {
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry2();
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we don't crash or hang when enumerating this cache.
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry3() {
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0x1);  // 2-entry table.
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x3000);  // 12 kB.
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (OpenNextEntry(&iter, &entry) == net::OK) {
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry3) {
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("dirty_entry3"));
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry3();
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry3) {
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("dirty_entry4"));
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry3();
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableIntegrityCheck();
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we handle a dirty entry on the LRU list, already replaced with
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the same key, and with hash collisions.
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry4) {
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("dirty_entry3"));
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0x1);  // 2-entry table.
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x3000);  // 12 kB.
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrimForTest(false);
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we handle a dirty entry on the deleted list, already replaced with
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the same key, and with hash collisions.
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry5) {
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("dirty_entry4"));
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0x1);  // 2-entry table.
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x3000);  // 12 kB.
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrimDeletedListForTest(false);
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry6) {
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("dirty_entry5"));
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0x1);  // 2-entry table.
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x3000);  // 12 kB.
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is a dirty entry (but marked as clean) at the end, pointing to a
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deleted entry through the hash collision list. We should not re-insert the
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deleted entry into the index table.
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrimForTest(false);
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The cache should be clean (as detected by CheckCacheIntegrity).
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we don't hang when there is a loop on the hash collision list.
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test cache could be a result of bug 69135.
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, BadNextEntry1) {
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("list_loop2"));
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0x1);  // 2-entry table.
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x3000);  // 12 kB.
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The second entry points at itselft, and the first entry is not accessible
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // though the index, but it is at the head of the LRU.
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("The first key", &entry));
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrimForTest(false);
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrimForTest(false);
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("The first key", &entry));
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we don't hang when there is a loop on the hash collision list.
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test cache could be a result of bug 69135.
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, BadNextEntry2) {
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("list_loop3"));
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMask(0x1);  // 2-entry table.
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(0x3000);  // 12 kB.
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is a wide loop of 5 entries.
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(net::OK, OpenEntry("Not present key", &entry));
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry6) {
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings3"));
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The second entry is dirty, but removing it should not corrupt the list.
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(net::OK, OpenEntry("the second key", &entry));
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("the first key", &entry));
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should not delete the cache.
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Doom();
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("some other key", &entry));
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries by keeping the rankings node around, with
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a fatal failure.
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry7() {
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 0x3000;  // 12 kB.
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(kSize * 10);
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first("some key");
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string second("something else");
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(first, &entry));
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(second, &entry));
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Corrupt this entry.
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::EntryImpl* entry_impl =
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<disk_cache::EntryImpl*>(entry);
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->rankings()->Data()->next = 0;
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->rankings()->Store();
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, cache_->GetEntryCount());
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should detect the bad entry.
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry(second, &entry));
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should delete the cache. The list still has a corrupt node.
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry));
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry7) {
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry7();
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry7) {
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry7();
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries by keeping the rankings node around, with
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a non fatal failure.
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry8() {
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 0x3000;  // 12 kB
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(kSize * 10);
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first("some key");
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string second("something else");
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(first, &entry));
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(second, &entry));
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Corrupt this entry.
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::EntryImpl* entry_impl =
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<disk_cache::EntryImpl*>(entry);
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->rankings()->Data()->contents = 0;
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->rankings()->Store();
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, cache_->GetEntryCount());
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This should detect the bad entry.
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry(second, &entry));
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should not delete the cache.
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry));
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry));
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry8) {
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry8();
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry8) {
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry8();
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries detected by enumerations. Note that these
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tests (xx9 to xx11) are basically just going though slightly different
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// codepaths so they are tighlty coupled with the code, but that is better than
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not testing error handling code.
22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry9(bool eviction) {
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 0x3000;  // 12 kB.
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(kSize * 10);
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first("some key");
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string second("something else");
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(first, &entry));
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(second, &entry));
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Corrupt this entry.
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::EntryImpl* entry_impl =
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<disk_cache::EntryImpl*>(entry);
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->entry()->Data()->state = 0xbad;
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->entry()->Store();
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, cache_->GetEntryCount());
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (eviction) {
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TrimForTest(false);
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, cache_->GetEntryCount());
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TrimForTest(false);
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, cache_->GetEntryCount());
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should detect the problem through the list, but we should not delete
22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the entry, just fail the iteration.
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void* iter = NULL;
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry));
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now a full iteration will work, and return one entry.
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry));
22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry));
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This should detect what's left of the bad entry.
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(net::OK, OpenEntry(second, &entry));
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, cache_->GetEntryCount());
22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableIntegrityCheck();
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry9) {
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry9(false);
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidEntry9) {
22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry9(false);
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry9) {
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry9(true);
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry9) {
22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry9(true);
22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries detected by enumerations.
22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry10(bool eviction) {
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 0x3000;  // 12 kB.
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(kSize * 10);
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first("some key");
22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string second("something else");
22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(first, &entry));
23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(first, &entry));
23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false));
23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(second, &entry));
23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Corrupt this entry.
23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::EntryImpl* entry_impl =
23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<disk_cache::EntryImpl*>(entry);
23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->entry()->Data()->state = 0xbad;
23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->entry()->Store();
23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("third", &entry));
23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, cache_->GetEntryCount());
23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We have:
23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List 0: third -> second (bad).
23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List 1: first.
23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (eviction) {
23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Detection order: second -> first -> third.
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TrimForTest(false);
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3, cache_->GetEntryCount());
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TrimForTest(false);
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, cache_->GetEntryCount());
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TrimForTest(false);
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, cache_->GetEntryCount());
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Detection order: third -> second -> first.
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should detect the problem through the list, but we should not delete
23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the entry.
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void* iter = NULL;
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry));
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry));
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(first, entry->GetKey());
23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry));
23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableIntegrityCheck();
23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry10) {
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry10(false);
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry10) {
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry10(true);
23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries detected by enumerations.
23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidEntry11(bool eviction) {
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 0x3000;  // 12 kB.
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(kSize * 10);
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first("some key");
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string second("something else");
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(first, &entry));
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(first, &entry));
23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false));
23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(second, &entry));
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(second, &entry));
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, WriteData(entry, 0, 200, NULL, 0, false));
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Corrupt this entry.
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::EntryImpl* entry_impl =
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<disk_cache::EntryImpl*>(entry);
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->entry()->Data()->state = 0xbad;
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->entry()->Store();
23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("third", &entry));
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, cache_->GetEntryCount());
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We have:
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List 0: third.
23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List 1: second (bad) -> first.
23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (eviction) {
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Detection order: third -> first -> second.
23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TrimForTest(false);
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2, cache_->GetEntryCount());
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TrimForTest(false);
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, cache_->GetEntryCount());
23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TrimForTest(false);
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1, cache_->GetEntryCount());
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Detection order: third -> second.
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We should detect the problem through the list, but we should not delete
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the entry, just fail the iteration.
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void* iter = NULL;
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry));
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry));
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now a full iteration will work, and return two entries.
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry));
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry));
24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry));
24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableIntegrityCheck();
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidEntry11) {
24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry11(false);
24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry11) {
24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidEntry11(true);
24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests handling of corrupt entries in the middle of a long eviction run.
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendTrimInvalidEntry12() {
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 0x3000;  // 12 kB
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(kSize * 10);
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string first("some key");
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string second("something else");
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(first, &entry));
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(second, &entry));
24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Corrupt this entry.
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::EntryImpl* entry_impl =
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<disk_cache::EntryImpl*>(entry);
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->entry()->Data()->state = 0xbad;
24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry_impl->entry()->Store();
24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("third", &entry));
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry));
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrimForTest(true);
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableIntegrityCheck();
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TrimInvalidEntry12) {
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTrimInvalidEntry12();
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionTrimInvalidEntry12) {
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendTrimInvalidEntry12();
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We want to be able to deal with messed up entries on disk.
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidRankings2() {
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings"));
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry1, *entry2;
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry("the first key", &entry1));
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("some other key", &entry2));
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // CheckCacheIntegrity will fail at this point.
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableIntegrityCheck();
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidRankings2) {
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidRankings2();
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankings2) {
24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidRankings2();
24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the LRU is corrupt, we delete the cache.
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendInvalidRankings() {
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry));
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, cache_->GetEntryCount());
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry));
24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();  // Allow the restart to finish.
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidRankingsSuccess) {
25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings"));
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidRankings();
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsSuccess) {
25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings"));
25085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
25095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidRankings();
25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, InvalidRankingsFailure) {
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings"));
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTestMode();  // Fail cache reinitialization.
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidRankings();
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionInvalidRankingsFailure) {
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings"));
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTestMode();  // Fail cache reinitialization.
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendInvalidRankings();
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the LRU is corrupt and we have open entries, we disable the cache.
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable() {
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry1, *entry2;
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1));
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry2));
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, CreateEntry("Something new", &entry2));
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();  // Flushing the Close posts a task to restart the cache.
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();  // This one actually allows that task to complete.
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess) {
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings"));
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable();
25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess) {
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings"));
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable();
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableFailure) {
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings"));
25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTestMode();  // Fail cache reinitialization.
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable();
25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableFailure) {
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings"));
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTestMode();  // Fail cache reinitialization.
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable();
25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is another type of corruption on the LRU; disable the cache.
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable2() {
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(8, cache_->GetEntryCount());
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int count = 0;
25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (OpenNextEntry(&iter, &entry) == net::OK) {
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(NULL != entry);
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    count++;
25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_LT(count, 9);
25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess2) {
25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("list_loop"));
26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable2();
26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess2) {
26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("list_loop"));
26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable2();
26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableFailure2) {
26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("list_loop"));
26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTestMode();  // Fail cache reinitialization.
26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable2();
26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableFailure2) {
26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("list_loop"));
26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetTestMode();  // Fail cache reinitialization.
26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable2();
26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the index size changes when we disable the cache, we should not crash.
26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable3() {
26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry1, *entry2;
26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, cache_->GetEntryCount());
26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1));
26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry2));
26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();
26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("Something new", &entry2));
26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess3) {
26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings2"));
26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(20 * 1024 * 1024);
26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable3();
26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess3) {
26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings2"));
26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(20 * 1024 * 1024);
26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable3();
26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If we disable the cache, already open entries should work as far as possible.
26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDisable4() {
26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry1, *entry2, *entry3, *entry4;
26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void* iter = NULL;
26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenNextEntry(&iter, &entry1));
26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char key2[2000];
26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char key3[20000];
26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CacheTestFillBuffer(key2, sizeof(key2), true);
26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CacheTestFillBuffer(key3, sizeof(key3), true);
26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key2[sizeof(key2) - 1] = '\0';
26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key3[sizeof(key3) - 1] = '\0';
26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(key2, &entry2));
26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(key3, &entry3));
26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kBufSize = 20000;
26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kBufSize));
26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buf->data(), 0, kBufSize);
2682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(100, WriteData(entry2, 0, 0, buf.get(), 100, false));
2683868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf.get(), kBufSize, false));
26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This line should disable the cache but not delete it.
26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, OpenNextEntry(&iter, &entry4));
26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(net::OK, CreateEntry("cache is disabled", &entry4));
26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2691868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(100, ReadData(entry2, 0, 0, buf.get(), 100));
2692868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(100, WriteData(entry2, 0, 0, buf.get(), 100, false));
2693868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(100, WriteData(entry2, 1, 0, buf.get(), 100, false));
26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kBufSize, ReadData(entry3, 0, 0, buf.get(), kBufSize));
2696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kBufSize, WriteData(entry3, 0, 0, buf.get(), kBufSize, false));
2697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kBufSize, WriteData(entry3, 1, 0, buf.get(), kBufSize, false));
26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key = entry2->GetKey();
27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(sizeof(key2) - 1, key.size());
27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  key = entry3->GetKey();
27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(sizeof(key3) - 1, key.size());
27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry3->Close();
27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();  // Flushing the Close posts a task to restart the cache.
27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FlushQueueForTest();  // This one actually allows that task to complete.
27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_->GetEntryCount());
27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DisableSuccess4) {
27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings"));
27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable4();
27185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDisableSuccess4) {
27215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings"));
27225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
27245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
27255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDisable4();
27265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2728558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(DiskCacheTest, Backend_UsageStatsTimer) {
27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MessageLoopHelper helper;
27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CleanupCacheDir());
27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<disk_cache::BackendImpl> cache;
27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache.reset(new disk_cache::BackendImpl(
27347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      cache_path_, base::MessageLoopProxy::current().get(), NULL));
27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != cache.get());
27365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache->SetUnitTestMode();
27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, cache->SyncInit());
27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for a callback that never comes... about 2 secs :). The message loop
27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has to run to allow invocation of the usage timer.
27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helper.WaitUntilCacheIoFinished(1);
27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TimerNotCreated) {
27455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("wrong_version"));
27465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
27475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<disk_cache::BackendImpl> cache;
27485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cache.reset(new disk_cache::BackendImpl(
27495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      cache_path_, base::MessageLoopProxy::current().get(), NULL));
27505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(NULL != cache.get());
27515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  cache->SetUnitTestMode();
27525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_NE(net::OK, cache->SyncInit());
27535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
27545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(NULL == cache->GetTimerForTest());
27555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
27565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DisableIntegrityCheck();
27575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
27585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2759558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochTEST_F(DiskCacheBackendTest, Backend_UsageStats) {
2760558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  InitCache();
2761558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  disk_cache::Entry* entry;
2762558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  ASSERT_EQ(net::OK, CreateEntry("key", &entry));
2763558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  entry->Close();
2764558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  FlushQueueForTest();
2765558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2766558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  disk_cache::StatsItems stats;
2767558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  cache_->GetStats(&stats);
2768558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(stats.empty());
2769558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2770558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  disk_cache::StatsItems::value_type hits("Create hit", "0x1");
2771558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(1, std::count(stats.begin(), stats.end(), hits));
2772558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2773a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache_.reset();
2774558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2775558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Now open the cache and verify that the stats are still there.
2776558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  DisableFirstCleanup();
2777558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  InitCache();
2778558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(1, cache_->GetEntryCount());
2779558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2780558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  stats.clear();
2781558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  cache_->GetStats(&stats);
2782558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_FALSE(stats.empty());
2783558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2784558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  EXPECT_EQ(1, std::count(stats.begin(), stats.end(), hits));
2785558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
2786558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomAll() {
27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry1, *entry2;
27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("first", &entry1));
27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("second", &entry2));
27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("third", &entry1));
27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry2));
27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(4, cache_->GetEntryCount());
28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomAllEntries());
28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, cache_->GetEntryCount());
28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should stop posting tasks at some point (if we post any).
280490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop::current()->RunUntilIdle();
28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry *entry3, *entry4;
2807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry("third", &entry3));
28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("third", &entry3));
28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry4));
28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomAllEntries());
28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, cache_->GetEntryCount());
28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry3->Doom();  // The entry should be already doomed, but this must work.
28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry3->Close();
28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry4->Close();
28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try with all references released.
28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("third", &entry1));
28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("fourth", &entry2));
28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry1->Close();
28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry2->Close();
28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2, cache_->GetEntryCount());
28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomAllEntries());
28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0, cache_->GetEntryCount());
28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomAllEntries());
28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomAll) {
28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomAll();
28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomAll) {
28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomAll();
28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, MemoryOnlyDoomAll) {
28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMemoryOnlyMode();
28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomAll();
28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, AppCacheOnlyDoomAll) {
28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetCacheType(net::APP_CACHE);
28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomAll();
28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheOnlyDoomAll) {
28532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
28542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BackendDoomAll();
28552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
28562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the index size changes when we doom the cache, we should not crash.
28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheBackendTest::BackendDoomAll2() {
28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, cache_->GetEntryCount());
28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, DoomAllEntries());
28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("Something new", &entry));
28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DoomAll2) {
28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings2"));
28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(20 * 1024 * 1024);
28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomAll2();
28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, NewEvictionDoomAll2) {
28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(CopyTestCache("bad_rankings2"));
28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisableFirstCleanup();
28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMaxSize(20 * 1024 * 1024);
28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetNewEviction();
28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BackendDoomAll2();
28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should be able to create the same entry on multiple simultaneous instances
28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the cache.
28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, MultipleInstances) {
28892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir store1, store2;
28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(store1.CreateUniqueTempDir());
28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(store2.CreateUniqueTempDir());
28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Thread cache_thread("CacheThread");
28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(cache_thread.StartWithOptions(
289590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kNumberOfCaches = 2;
2899a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<disk_cache::Backend> cache[kNumberOfCaches];
29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int rv =
29027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      disk_cache::CreateCacheBackend(net::DISK_CACHE,
29037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     net::CACHE_BACKEND_DEFAULT,
29047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     store1.path(),
29057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     0,
29067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     false,
29077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     cache_thread.message_loop_proxy().get(),
29087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     NULL,
29097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     &cache[0],
29107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     cb.callback());
29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, cb.GetResult(rv));
29127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  rv = disk_cache::CreateCacheBackend(net::MEDIA_CACHE,
29137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      net::CACHE_BACKEND_DEFAULT,
29147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      store2.path(),
29157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      0,
29167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      false,
29177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      cache_thread.message_loop_proxy().get(),
29187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      NULL,
29197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      &cache[1],
29207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                      cb.callback());
29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, cb.GetResult(rv));
29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2923a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(cache[0].get() != NULL && cache[1].get() != NULL);
29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key("the first key");
29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < kNumberOfCaches; i++) {
29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rv = cache[i]->CreateEntry(key, &entry, cb.callback());
29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, cb.GetResult(rv));
29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test the six regions of the curve that determines the max cache size.
29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheTest, AutomaticMaxSize) {
2936f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  using disk_cache::kDefaultCacheSize;
2937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int64 large_size = kDefaultCacheSize;
29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Region 1: expected = available * 0.8
2940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ((kDefaultCacheSize - 1) * 8 / 10,
2941f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size - 1));
2942f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kDefaultCacheSize * 8 / 10,
2943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size));
2944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kDefaultCacheSize - 1,
2945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size * 10 / 8 - 1));
29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Region 2: expected = default_size
2948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kDefaultCacheSize,
2949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size * 10 / 8));
2950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kDefaultCacheSize,
2951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size * 10 - 1));
29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Region 3: expected = available * 0.1
2954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kDefaultCacheSize,
2955f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size * 10));
2956f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ((kDefaultCacheSize * 25 - 1) / 10,
2957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size * 25 - 1));
29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Region 4: expected = default_size * 2.5
2960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kDefaultCacheSize * 25 / 10,
2961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size * 25));
2962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kDefaultCacheSize * 25 / 10,
2963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size * 100 - 1));
2964f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kDefaultCacheSize * 25 / 10,
2965f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size * 100));
2966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kDefaultCacheSize * 25 / 10,
2967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size * 250 - 1));
29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Region 5: expected = available * 0.1
2970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int64 largest_size = kDefaultCacheSize * 4;
2971f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(kDefaultCacheSize * 25 / 10,
2972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(large_size * 250));
2973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(largest_size - 1,
2974f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(largest_size * 100 - 1));
2975f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Region 6: expected = largest possible size
2977f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(largest_size,
2978f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(largest_size * 100));
2979f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(largest_size,
2980f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            disk_cache::PreferredCacheSize(largest_size * 10000));
29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we can "migrate" a running instance from one experiment group to
29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// another.
29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, Histograms) {
29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::BackendImpl* backend_ = cache_impl_;  // Needed be the macro.
29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 1; i < 3; i++) {
29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CACHE_UMA(HOURS, "FillupTime", i, 28);
29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Make sure that we keep the total memory used by the internal buffers under
29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// control.
29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TotalBuffersSize1) {
29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string key("the first key");
29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(key, &entry));
30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 200;
30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CacheTestFillBuffer(buffer->data(), kSize, true);
30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 10; i++) {
30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(i);
30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allocate 2MB for this entry.
3009868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(kSize, WriteData(entry, 0, 0, buffer.get(), kSize, true));
3010868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(kSize, WriteData(entry, 1, 0, buffer.get(), kSize, true));
3011868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(kSize,
3012868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              WriteData(entry, 0, 1024 * 1024, buffer.get(), kSize, false));
3013868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(kSize,
3014868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)              WriteData(entry, 1, 1024 * 1024, buffer.get(), kSize, false));
30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delete one of the buffers and truncate the other.
3017868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, true));
3018868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(0, WriteData(entry, 1, 10, buffer.get(), 0, true));
30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Delete the second buffer, writing 10 bytes to disk.
30215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, OpenEntry(key, &entry));
30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, cache_impl_->GetTotalBuffersSize());
30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test assumes at least 150MB of system memory.
30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, TotalBuffersSize2) {
30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kOneMB = 1024 * 1024;
30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kOneMB, cache_impl_->GetTotalBuffersSize());
30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize());
30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(cache_impl_->IsAllocAllowed(0, kOneMB));
30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kOneMB * 3, cache_impl_->GetTotalBuffersSize());
30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_impl_->BufferDeleted(kOneMB);
30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kOneMB * 2, cache_impl_->GetTotalBuffersSize());
30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check the upper limit.
30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, 30 * kOneMB));
30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 30; i++)
30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_impl_->IsAllocAllowed(0, kOneMB);  // Ignore the result.
30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(cache_impl_->IsAllocAllowed(0, kOneMB));
30535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that sharing of external files works and we are able to delete the
30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// files when we need to.
30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, FileSharing) {
30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Addr address(0x80000001);
30617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(cache_impl_->CreateExternalFile(&address));
30622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath name = cache_impl_->GetFileName(address);
30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<disk_cache::File> file(new disk_cache::File(false));
30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file->Init(name);
30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD sharing = FILE_SHARE_READ | FILE_SHARE_WRITE;
30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DWORD access = GENERIC_READ | GENERIC_WRITE;
30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::win::ScopedHandle file2(CreateFile(
30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name.value().c_str(), access, sharing, NULL, OPEN_EXISTING, 0, NULL));
30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(file2.IsValid());
30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sharing |= FILE_SHARE_DELETE;
30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  file2.Set(CreateFile(name.value().c_str(), access, sharing, NULL,
30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       OPEN_EXISTING, 0, NULL));
30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file2.IsValid());
30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::DeleteFile(name, false));
30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be able to use the file.
30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kSize = 200;
30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer1[kSize];
30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer2[kSize];
30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buffer1, 't', kSize);
30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(buffer2, 0, kSize);
30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file->Write(buffer1, kSize, 0));
30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(file->Read(buffer2, kSize, 0));
30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, memcmp(buffer1, buffer2, kSize));
30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(disk_cache::DeleteCacheFile(name));
30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DiskCacheBackendTest, UpdateRankForExternalCacheHit) {
30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitCache();
30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disk_cache::Entry* entry;
30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 2; ++i) {
31012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string key = base::StringPrintf("key%d", i);
31022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(net::OK, CreateEntry(key, &entry));
31032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    entry->Close();
31042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
31052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Ping the oldest entry.
31072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cache_->OnExternalCacheHit("key0");
31082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TrimForTest(false);
31102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the older key remains.
31122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
31132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("key0", &entry));
31142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  entry->Close();
31152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
31162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DiskCacheBackendTest, ShaderCacheUpdateRankForExternalCacheHit) {
31182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetCacheType(net::SHADER_CACHE);
31192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InitCache();
31202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  disk_cache::Entry* entry;
31222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
31232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 2; ++i) {
31242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string key = base::StringPrintf("key%d", i);
31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(net::OK, CreateEntry(key, &entry));
31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    entry->Close();
31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ping the oldest entry.
31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_->OnExternalCacheHit("key0");
31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TrimForTest(false);
31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the older key remains.
31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, cache_->GetEntryCount());
31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("key0", &entry));
31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  entry->Close();
31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DiskCacheBackendTest::TracingBackendBasics() {
3141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitCache();
3142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache_.reset(new disk_cache::TracingCacheBackend(cache_.Pass()));
3143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  cache_impl_ = NULL;
3144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(net::DISK_CACHE, cache_->GetCacheType());
3145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!simple_cache_mode_) {
3146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(0, cache_->GetEntryCount());
3147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::TestCompletionCallback cb;
3150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  disk_cache::Entry* entry = NULL;
3151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(net::OK, OpenEntry("key", &entry));
3152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(NULL == entry);
3153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("key", &entry));
3155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(NULL != entry);
3156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  disk_cache::Entry* same_entry = NULL;
3158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry("key", &same_entry));
3159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(NULL != same_entry);
3160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!simple_cache_mode_) {
3162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(1, cache_->GetEntryCount());
3163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->Close();
3165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry = NULL;
3166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  same_entry->Close();
3167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  same_entry = NULL;
3168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, TracingBackendBasics) {
3171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TracingBackendBasics();
3172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// The Simple Cache backend requires a few guarantees from the filesystem like
3175d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// atomic renaming of recently open files. Those guarantees are not provided in
3176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// general on Windows.
3177d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_POSIX)
3178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
3179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheShutdownWithPendingCreate) {
3180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SetCacheType(net::APP_CACHE);
3181d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SetSimpleCacheMode();
3182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  BackendShutdownWithPendingCreate(false);
3183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
3184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
3185d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheShutdownWithPendingFileIO) {
3186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SetCacheType(net::APP_CACHE);
3187d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SetSimpleCacheMode();
3188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  BackendShutdownWithPendingFileIO(false);
3189d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
3190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheBasics) {
3192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetSimpleCacheMode();
3193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BackendBasics();
3194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3196bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(DiskCacheBackendTest, SimpleCacheAppCacheBasics) {
3197bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  SetCacheType(net::APP_CACHE);
3198bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  SetSimpleCacheMode();
3199bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  BackendBasics();
3200bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
3201bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
3202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheKeying) {
3203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetSimpleCacheMode();
3204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BackendKeying();
3205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3207bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(DiskCacheBackendTest, SimpleCacheAppCacheKeying) {
3208bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  SetSimpleCacheMode();
3209bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  SetCacheType(net::APP_CACHE);
3210bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  BackendKeying();
3211bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
3212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, DISABLED_SimpleCacheSetSize) {
3214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetSimpleCacheMode();
3215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BackendSetSize();
3216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// MacOS has a default open file limit of 256 files, which is incompatible with
3219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// this simple cache test.
3220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX)
3221bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#define SIMPLE_MAYBE_MACOS(TestName) DISABLED_ ## TestName
3222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
3223bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#define SIMPLE_MAYBE_MACOS(TestName) TestName
3224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
3225bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
3226bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(DiskCacheBackendTest, SIMPLE_MAYBE_MACOS(SimpleCacheLoad)) {
3227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetMaxSize(0x100000);
3228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetSimpleCacheMode();
3229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BackendLoad();
3230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3232bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben MurdochTEST_F(DiskCacheBackendTest, SIMPLE_MAYBE_MACOS(SimpleCacheAppCacheLoad)) {
3233bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  SetCacheType(net::APP_CACHE);
3234bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  SetSimpleCacheMode();
3235bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  SetMaxSize(0x100000);
3236bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  BackendLoad();
3237bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
3238bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
3239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleDoomRecent) {
3240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetSimpleCacheMode();
3241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BackendDoomRecent();
3242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// crbug.com/330926, crbug.com/370677
3245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(DiskCacheBackendTest, DISABLED_SimpleDoomBetween) {
3246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetSimpleCacheMode();
3247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BackendDoomBetween();
3248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheDoomAll) {
3251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetSimpleCacheMode();
3252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BackendDoomAll();
3253bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
3254bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
325568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheAppCacheOnlyDoomAll) {
3256bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  SetCacheType(net::APP_CACHE);
3257bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  SetSimpleCacheMode();
3258bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  BackendDoomAll();
3259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheTracingBackendBasics) {
3262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetSimpleCacheMode();
3263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  TracingBackendBasics();
3264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // TODO(pasko): implement integrity checking on the Simple Backend.
3265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DisableIntegrityCheck();
3266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheOpenMissingFile) {
3269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetSimpleCacheMode();
3270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitCache();
3271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* key = "the first key";
3273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  disk_cache::Entry* entry = NULL;
3274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(key, &entry));
3276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(entry != NULL);
3277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->Close();
3278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry = NULL;
3279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // To make sure the file creation completed we need to call open again so that
3281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // we block until it actually created the files.
3282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(entry != NULL);
3284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->Close();
3285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry = NULL;
3286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Delete one of the files in the entry.
3288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath to_delete_file = cache_path_.AppendASCII(
3289d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, 0));
32907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(base::PathExists(to_delete_file));
3291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(disk_cache::DeleteCacheFile(to_delete_file));
3292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Failing to open the entry should delete the rest of these files.
3294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::ERR_FAILED, OpenEntry(key, &entry));
3295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Confirm the rest of the files are gone.
3297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (int i = 1; i < disk_cache::kSimpleEntryFileCount; ++i) {
3298d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    base::FilePath should_be_gone_file(cache_path_.AppendASCII(
3299d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, i)));
33007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    EXPECT_FALSE(base::PathExists(should_be_gone_file));
3301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheOpenBadFile) {
3305c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetSimpleCacheMode();
3306c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitCache();
3307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const char* key = "the first key";
3309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  disk_cache::Entry* entry = NULL;
3310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry(key, &entry));
3312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  disk_cache::Entry* null = NULL;
3313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_NE(null, entry);
3314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->Close();
3315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry = NULL;
3316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // To make sure the file creation completed we need to call open again so that
3318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // we block until it actually created the files.
3319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::OK, OpenEntry(key, &entry));
3320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_NE(null, entry);
3321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->Close();
3322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry = NULL;
3323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3324d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Write an invalid header for stream 0 and stream 1.
3325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::FilePath entry_file1_path = cache_path_.AppendASCII(
3326d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      disk_cache::simple_util::GetFilenameFromKeyAndFileIndex(key, 0));
3327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  disk_cache::SimpleFileHeader header;
3329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  header.initial_magic_number = GG_UINT64_C(0xbadf00d);
3330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(
3331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      implicit_cast<int>(sizeof(header)),
3332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      base::WriteFile(entry_file1_path, reinterpret_cast<char*>(&header),
3333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           sizeof(header)));
3334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::ERR_FAILED, OpenEntry(key, &entry));
3335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the Simple Cache Backend fails to initialize with non-matching
3338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// file structure on disk.
3339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, SimpleCacheOverBlockfileCache) {
3340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Create a cache structure with the |BackendImpl|.
3341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitCache();
3342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  disk_cache::Entry* entry;
3343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const int kSize = 50;
3344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
3345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CacheTestFillBuffer(buffer->data(), kSize, false);
3346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("key", &entry));
3347868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, false));
3348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->Close();
3349a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache_.reset();
3350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Check that the |SimpleBackendImpl| does not favor this structure.
3352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Thread cache_thread("CacheThread");
3353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(cache_thread.StartWithOptions(
335490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
3355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  disk_cache::SimpleBackendImpl* simple_cache =
33567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      new disk_cache::SimpleBackendImpl(cache_path_,
33577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                        0,
33587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                        net::DISK_CACHE,
33597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                        cache_thread.message_loop_proxy().get(),
3360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        NULL);
3361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::TestCompletionCallback cb;
3362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int rv = simple_cache->Init(cb.callback());
3363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(net::OK, cb.GetResult(rv));
3364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  delete simple_cache;
3365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DisableIntegrityCheck();
3366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that the |BackendImpl| refuses to initialize on top of the files
3369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// generated by the Simple Cache Backend.
3370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(DiskCacheBackendTest, BlockfileCacheOverSimpleCache) {
3371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Create a cache structure with the |SimpleBackendImpl|.
3372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetSimpleCacheMode();
3373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  InitCache();
3374c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  disk_cache::Entry* entry;
3375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const int kSize = 50;
3376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
3377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CacheTestFillBuffer(buffer->data(), kSize, false);
3378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(net::OK, CreateEntry("key", &entry));
3379868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_EQ(0, WriteData(entry, 0, 0, buffer.get(), 0, false));
3380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  entry->Close();
3381a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache_.reset();
3382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Check that the |BackendImpl| does not favor this structure.
3384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Thread cache_thread("CacheThread");
3385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(cache_thread.StartWithOptions(
338690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
338790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  disk_cache::BackendImpl* cache = new disk_cache::BackendImpl(
33887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      cache_path_, base::MessageLoopProxy::current().get(), NULL);
3389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  cache->SetUnitTestMode();
3390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::TestCompletionCallback cb;
3391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int rv = cache->Init(cb.callback());
3392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(net::OK, cb.GetResult(rv));
3393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  delete cache;
3394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DisableIntegrityCheck();
3395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
3396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
3397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(DiskCacheBackendTest, SimpleCacheFixEnumerators) {
3398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SetSimpleCacheMode();
3399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BackendFixEnumerators();
3400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
3401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
34027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Tests basic functionality of the SimpleBackend implementation of the
34037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// enumeration API.
34047dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DiskCacheBackendTest, SimpleCacheEnumerationBasics) {
34057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SetSimpleCacheMode();
34067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  InitCache();
34077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::set<std::string> key_pool;
34087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool));
34097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Check that enumeration returns all entries.
34117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::set<std::string> keys_to_match(key_pool);
34127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void* iter = NULL;
34137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t count = 0;
34147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(EnumerateAndMatchKeys(-1, &iter, &keys_to_match, &count));
34157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  cache_->EndEnumeration(&iter);
34167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(key_pool.size(), count);
34177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(keys_to_match.empty());
34187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Check that opening entries does not affect enumeration.
34207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  keys_to_match = key_pool;
34217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  iter = NULL;
34227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  count = 0;
34237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  disk_cache::Entry* entry_opened_before;
34247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(net::OK, OpenEntry(*(key_pool.begin()), &entry_opened_before));
34257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(EnumerateAndMatchKeys(key_pool.size()/2,
34267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                    &iter,
34277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                    &keys_to_match,
34287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                    &count));
34297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  disk_cache::Entry* entry_opened_middle;
34317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(net::OK,
34327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            OpenEntry(*(keys_to_match.begin()), &entry_opened_middle));
34337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(EnumerateAndMatchKeys(-1, &iter, &keys_to_match, &count));
34347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  cache_->EndEnumeration(&iter);
34357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  entry_opened_before->Close();
34367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  entry_opened_middle->Close();
34377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(key_pool.size(), count);
34397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(keys_to_match.empty());
34407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
34417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Tests that the enumerations are not affected by dooming an entry in the
34437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// middle.
34447dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DiskCacheBackendTest, SimpleCacheEnumerationWhileDoomed) {
34457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SetSimpleCacheMode();
34467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  InitCache();
34477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::set<std::string> key_pool;
34487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool));
34497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Check that enumeration returns all entries but the doomed one.
34517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::set<std::string> keys_to_match(key_pool);
34527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void* iter = NULL;
34537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t count = 0;
34547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(EnumerateAndMatchKeys(key_pool.size()/2,
34557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                    &iter,
34567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                    &keys_to_match,
34577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                    &count));
34587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::string key_to_delete = *(keys_to_match.begin());
34607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DoomEntry(key_to_delete);
34617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  keys_to_match.erase(key_to_delete);
34627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  key_pool.erase(key_to_delete);
34637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(EnumerateAndMatchKeys(-1, &iter, &keys_to_match, &count));
34647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  cache_->EndEnumeration(&iter);
34657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(key_pool.size(), count);
34677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(keys_to_match.empty());
34687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
34697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Tests that enumerations are not affected by corrupt files.
34717dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(DiskCacheBackendTest, SimpleCacheEnumerationCorruption) {
34727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  SetSimpleCacheMode();
34737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  InitCache();
34747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::set<std::string> key_pool;
34757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(CreateSetOfRandomEntries(&key_pool));
34767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Create a corrupt entry. The write/read sequence ensures that the entry will
34787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // have been created before corrupting the platform files, in the case of
34797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // optimistic operations.
34807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const std::string key = "the key";
34817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  disk_cache::Entry* corrupted_entry;
34827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(net::OK, CreateEntry(key, &corrupted_entry));
34847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(corrupted_entry);
34857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const int kSize = 50;
34867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kSize));
34877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  CacheTestFillBuffer(buffer->data(), kSize, false);
34887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(kSize,
34897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            WriteData(corrupted_entry, 0, 0, buffer.get(), kSize, false));
34907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_EQ(kSize, ReadData(corrupted_entry, 0, 0, buffer.get(), kSize));
34917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  corrupted_entry->Close();
34927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(disk_cache::simple_util::CreateCorruptFileForTests(
34947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      key, cache_path_));
34957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(key_pool.size() + 1,
34967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            implicit_cast<size_t>(cache_->GetEntryCount()));
34977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
34987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Check that enumeration returns all entries but the corrupt one.
34997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  std::set<std::string> keys_to_match(key_pool);
35007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void* iter = NULL;
35017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  size_t count = 0;
35027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ASSERT_TRUE(EnumerateAndMatchKeys(-1, &iter, &keys_to_match, &count));
35037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  cache_->EndEnumeration(&iter);
35047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
35057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_EQ(key_pool.size(), count);
35067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  EXPECT_TRUE(keys_to_match.empty());
35077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
35087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3509d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif  // defined(OS_POSIX)
3510