1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2006-2010 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/disk_cache_test_base.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/io_buffer.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_errors.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/test_completion_callback.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/backend_impl.h"
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/disk_cache_test_util.h"
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/disk_cache/mem_backend_impl.h"
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheTest::TearDown() {
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  MessageLoop::current()->RunAllPending();
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDiskCacheTestWithCache::DiskCacheTestWithCache()
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    : cache_(NULL),
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      cache_impl_(NULL),
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      mem_cache_(NULL),
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      mask_(0),
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      size_(0),
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      type_(net::DISK_CACHE),
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      memory_only_(false),
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      implementation_(false),
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      force_creation_(false),
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new_eviction_(false),
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      first_cleanup_(true),
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      integrity_(true),
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      use_current_thread_(false),
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      cache_thread_("CacheThread") {
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDiskCacheTestWithCache::~DiskCacheTestWithCache() {}
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheTestWithCache::InitCache() {
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (mask_ || new_eviction_)
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    implementation_ = true;
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (memory_only_)
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    InitMemoryCache();
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  else
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    InitDiskCache();
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(NULL != cache_);
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (first_cleanup_)
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_EQ(0, cache_->GetEntryCount());
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We are expected to leak memory when simulating crashes.
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheTestWithCache::SimulateCrash() {
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(implementation_ && !memory_only_);
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = cache_impl_->FlushQueueForTest(&cb);
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(net::OK, cb.GetResult(rv));
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache_impl_->ClearRefCountForTest();
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  delete cache_impl_;
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath path = GetCacheFilePath();
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(CheckCacheIntegrity(path, new_eviction_));
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  InitDiskCacheImpl(path);
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid DiskCacheTestWithCache::SetTestMode() {
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(implementation_ && !memory_only_);
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  cache_impl_->SetUnitTestMode();
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DiskCacheTestWithCache::SetMaxSize(int size) {
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  size_ = size;
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (cache_impl_)
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_TRUE(cache_impl_->SetMaxSize(size));
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (mem_cache_)
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_TRUE(mem_cache_->SetMaxSize(size));
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint DiskCacheTestWithCache::OpenEntry(const std::string& key,
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      disk_cache::Entry** entry) {
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = cache_->OpenEntry(key, entry, &cb);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return cb.GetResult(rv);
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint DiskCacheTestWithCache::CreateEntry(const std::string& key,
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                        disk_cache::Entry** entry) {
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = cache_->CreateEntry(key, entry, &cb);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return cb.GetResult(rv);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint DiskCacheTestWithCache::DoomEntry(const std::string& key) {
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = cache_->DoomEntry(key, &cb);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return cb.GetResult(rv);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint DiskCacheTestWithCache::DoomAllEntries() {
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = cache_->DoomAllEntries(&cb);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return cb.GetResult(rv);
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint DiskCacheTestWithCache::DoomEntriesBetween(const base::Time initial_time,
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                               const base::Time end_time) {
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = cache_->DoomEntriesBetween(initial_time, end_time, &cb);
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return cb.GetResult(rv);
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint DiskCacheTestWithCache::DoomEntriesSince(const base::Time initial_time) {
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = cache_->DoomEntriesSince(initial_time, &cb);
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return cb.GetResult(rv);
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint DiskCacheTestWithCache::OpenNextEntry(void** iter,
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          disk_cache::Entry** next_entry) {
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = cache_->OpenNextEntry(iter, next_entry, &cb);
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return cb.GetResult(rv);
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid DiskCacheTestWithCache::FlushQueueForTest() {
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (memory_only_ || !cache_impl_)
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return;
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TestCompletionCallback cb;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int rv = cache_impl_->FlushQueueForTest(&cb);
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(net::OK, cb.GetResult(rv));
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickvoid DiskCacheTestWithCache::RunTaskForTest(Task* task) {
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (memory_only_ || !cache_impl_) {
1373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    task->Run();
1383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    delete task;
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return;
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TestCompletionCallback cb;
1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int rv = cache_impl_->RunTaskForTest(task, &cb);
1443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(net::OK, cb.GetResult(rv));
1453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickint DiskCacheTestWithCache::ReadData(disk_cache::Entry* entry, int index,
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                     int offset, net::IOBuffer* buf, int len) {
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TestCompletionCallback cb;
1503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int rv = entry->ReadData(index, offset, buf, len, &cb);
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return cb.GetResult(rv);
1523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickint DiskCacheTestWithCache::WriteData(disk_cache::Entry* entry, int index,
1563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                      int offset, net::IOBuffer* buf, int len,
1573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                      bool truncate) {
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TestCompletionCallback cb;
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int rv = entry->WriteData(index, offset, buf, len, &cb, truncate);
1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return cb.GetResult(rv);
1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickint DiskCacheTestWithCache::ReadSparseData(disk_cache::Entry* entry,
1643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           int64 offset, net::IOBuffer* buf,
1653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                           int len) {
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TestCompletionCallback cb;
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int rv = entry->ReadSparseData(offset, buf, len, &cb);
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return cb.GetResult(rv);
1693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
1703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickint DiskCacheTestWithCache::WriteSparseData(disk_cache::Entry* entry,
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                            int64 offset,
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                            net::IOBuffer* buf, int len) {
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TestCompletionCallback cb;
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int rv = entry->WriteSparseData(offset, buf, len, &cb);
1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return cb.GetResult(rv);
1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Simple task to run part of a test from the cache thread.
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass TrimTask : public Task {
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TrimTask(disk_cache::BackendImpl* backend, bool deleted, bool empty)
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      : backend_(backend),
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        deleted_(deleted),
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        empty_(empty) {}
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void Run() {
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (deleted_)
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      backend_->TrimDeletedListForTest(empty_);
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    else
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      backend_->TrimForTest(empty_);
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen protected:
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  disk_cache::BackendImpl* backend_;
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool deleted_;
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool empty_;
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DiskCacheTestWithCache::TrimForTest(bool empty) {
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  RunTaskForTest(new TrimTask(cache_impl_, false, empty));
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DiskCacheTestWithCache::TrimDeletedListForTest(bool empty) {
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  RunTaskForTest(new TrimTask(cache_impl_, true, empty));
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DiskCacheTestWithCache::TearDown() {
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  MessageLoop::current()->RunAllPending();
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  delete cache_;
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (cache_thread_.IsRunning())
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    cache_thread_.Stop();
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!memory_only_ && integrity_) {
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    FilePath path = GetCacheFilePath();
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_TRUE(CheckCacheIntegrity(path, new_eviction_));
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  PlatformTest::TearDown();
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DiskCacheTestWithCache::InitMemoryCache() {
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!implementation_) {
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cache_ = disk_cache::MemBackendImpl::CreateBackend(size_, NULL);
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return;
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  mem_cache_ = new disk_cache::MemBackendImpl(NULL);
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  cache_ = mem_cache_;
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(NULL != cache_);
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (size_)
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_TRUE(mem_cache_->SetMaxSize(size_));
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(mem_cache_->Init());
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DiskCacheTestWithCache::InitDiskCache() {
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  FilePath path = GetCacheFilePath();
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (first_cleanup_)
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ASSERT_TRUE(DeleteCache(path));
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!cache_thread_.IsRunning()) {
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_TRUE(cache_thread_.StartWithOptions(
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    base::Thread::Options(MessageLoop::TYPE_IO, 0)));
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(cache_thread_.message_loop() != NULL);
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (implementation_)
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return InitDiskCacheImpl(path);
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<base::MessageLoopProxy> thread =
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      use_current_thread_ ? base::MessageLoopProxy::CreateForCurrentThread() :
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            cache_thread_.message_loop_proxy();
25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestCompletionCallback cb;
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int rv = disk_cache::BackendImpl::CreateBackend(
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen               path, force_creation_, size_, type_,
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen               disk_cache::kNoRandom, thread, NULL, &cache_, &cb);
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(net::OK, cb.GetResult(rv));
26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid DiskCacheTestWithCache::InitDiskCacheImpl(const FilePath& path) {
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  scoped_refptr<base::MessageLoopProxy> thread =
26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      use_current_thread_ ? base::MessageLoopProxy::CreateForCurrentThread() :
26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            cache_thread_.message_loop_proxy();
26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (mask_)
26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    cache_impl_ = new disk_cache::BackendImpl(path, mask_, thread, NULL);
26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  else
27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    cache_impl_ = new disk_cache::BackendImpl(path, thread, NULL);
27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  cache_ = cache_impl_;
27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(NULL != cache_);
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (size_)
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_TRUE(cache_impl_->SetMaxSize(size_));
27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (new_eviction_)
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    cache_impl_->SetNewEviction();
28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  cache_impl_->SetType(type_);
28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  cache_impl_->SetFlags(disk_cache::kNoRandom);
28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestCompletionCallback cb;
28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int rv = cache_impl_->Init(&cb);
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(net::OK, cb.GetResult(rv));
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
287