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 "net/disk_cache/disk_cache_test_base.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/run_loop.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/single_thread_task_runner.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/thread_task_runner_handle.h"
12424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/threading/platform_thread.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h"
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/blockfile/backend_impl.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/disk_cache/cache_util.h"
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/disk_cache/disk_cache.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/disk_cache/disk_cache_test_util.h"
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/disk_cache/memory/mem_backend_impl.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/disk_cache/simple/simple_backend_impl.h"
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "net/disk_cache/simple/simple_index.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DiskCacheTest::DiskCacheTest() {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(temp_dir_.CreateUniqueTempDir());
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_path_ = temp_dir_.path();
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (!base::MessageLoop::current())
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    message_loop_.reset(new base::MessageLoopForIO());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DiskCacheTest::~DiskCacheTest() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DiskCacheTest::CopyTestCache(const std::string& name) {
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PathService::Get(base::DIR_SOURCE_ROOT, &path);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("net");
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("data");
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII("cache_tests");
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = path.AppendASCII(name);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!CleanupCacheDir())
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return base::CopyDirectory(path, cache_path_, false);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DiskCacheTest::CleanupCacheDir() {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return DeleteCache(cache_path_);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTest::TearDown() {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDiskCacheTestWithCache::TestIterator::TestIterator(
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<disk_cache::Backend::Iterator> iterator)
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : iterator_(iterator.Pass()) {
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciDiskCacheTestWithCache::TestIterator::~TestIterator() {}
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint DiskCacheTestWithCache::TestIterator::OpenNextEntry(
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    disk_cache::Entry** next_entry) {
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  net::TestCompletionCallback cb;
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int rv = iterator_->OpenNextEntry(next_entry, cb.callback());
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return cb.GetResult(rv);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DiskCacheTestWithCache::DiskCacheTestWithCache()
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : cache_impl_(NULL),
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      simple_cache_impl_(NULL),
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mem_cache_(NULL),
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mask_(0),
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_(0),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type_(net::DISK_CACHE),
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      memory_only_(false),
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      simple_cache_mode_(false),
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      simple_cache_wait_for_index_(true),
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      force_creation_(false),
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_eviction_(false),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_cleanup_(true),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      integrity_(true),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      use_current_thread_(false),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cache_thread_("CacheThread") {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DiskCacheTestWithCache::~DiskCacheTestWithCache() {}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::InitCache() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (memory_only_)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitMemoryCache();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InitDiskCache();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != cache_);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (first_cleanup_)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(0, cache_->GetEntryCount());
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We are expected to leak memory when simulating crashes.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::SimulateCrash() {
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(!memory_only_);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = cache_impl_->FlushQueueForTest(cb.callback());
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, cb.GetResult(rv));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_impl_->ClearRefCountForTest();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache_.reset();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, mask_));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateBackend(disk_cache::kNoRandom, &cache_thread_);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::SetTestMode() {
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(!memory_only_);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_impl_->SetUnitTestMode();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::SetMaxSize(int size) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_ = size;
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (simple_cache_impl_)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(simple_cache_impl_->SetMaxSize(size));
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cache_impl_)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(cache_impl_->SetMaxSize(size));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mem_cache_)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(mem_cache_->SetMaxSize(size));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DiskCacheTestWithCache::OpenEntry(const std::string& key,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      disk_cache::Entry** entry) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = cache_->OpenEntry(key, entry, cb.callback());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cb.GetResult(rv);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DiskCacheTestWithCache::CreateEntry(const std::string& key,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        disk_cache::Entry** entry) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = cache_->CreateEntry(key, entry, cb.callback());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cb.GetResult(rv);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DiskCacheTestWithCache::DoomEntry(const std::string& key) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = cache_->DoomEntry(key, cb.callback());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cb.GetResult(rv);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DiskCacheTestWithCache::DoomAllEntries() {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = cache_->DoomAllEntries(cb.callback());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cb.GetResult(rv);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DiskCacheTestWithCache::DoomEntriesBetween(const base::Time initial_time,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               const base::Time end_time) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = cache_->DoomEntriesBetween(initial_time, end_time, cb.callback());
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cb.GetResult(rv);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DiskCacheTestWithCache::DoomEntriesSince(const base::Time initial_time) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = cache_->DoomEntriesSince(initial_time, cb.callback());
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cb.GetResult(rv);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<DiskCacheTestWithCache::TestIterator>
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DiskCacheTestWithCache::CreateIterator() {
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return scoped_ptr<TestIterator>(new TestIterator(cache_->CreateIterator()));
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::FlushQueueForTest() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (memory_only_ || !cache_impl_)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = cache_impl_->FlushQueueForTest(cb.callback());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, cb.GetResult(rv));
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::RunTaskForTest(const base::Closure& closure) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (memory_only_ || !cache_impl_) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    closure.Run();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = cache_impl_->RunTaskForTest(closure, cb.callback());
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(net::OK, cb.GetResult(rv));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DiskCacheTestWithCache::ReadData(disk_cache::Entry* entry, int index,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     int offset, net::IOBuffer* buf, int len) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = entry->ReadData(index, offset, buf, len, cb.callback());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cb.GetResult(rv);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DiskCacheTestWithCache::WriteData(disk_cache::Entry* entry, int index,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      int offset, net::IOBuffer* buf, int len,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      bool truncate) {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = entry->WriteData(index, offset, buf, len, cb.callback(), truncate);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cb.GetResult(rv);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DiskCacheTestWithCache::ReadSparseData(disk_cache::Entry* entry,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int64 offset, net::IOBuffer* buf,
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           int len) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = entry->ReadSparseData(offset, buf, len, cb.callback());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cb.GetResult(rv);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int DiskCacheTestWithCache::WriteSparseData(disk_cache::Entry* entry,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            int64 offset,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            net::IOBuffer* buf, int len) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = entry->WriteSparseData(offset, buf, len, cb.callback());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return cb.GetResult(rv);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::TrimForTest(bool empty) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTaskForTest(base::Bind(&disk_cache::BackendImpl::TrimForTest,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(cache_impl_),
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            empty));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::TrimDeletedListForTest(bool empty) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTaskForTest(base::Bind(&disk_cache::BackendImpl::TrimDeletedListForTest,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(cache_impl_),
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            empty));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::AddDelay() {
239424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (simple_cache_mode_) {
240424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // The simple cache uses second resolution for many timeouts, so it's safest
241424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // to advance by at least whole seconds before falling back into the normal
242424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // disk cache epsilon advance.
243424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    const base::Time initial_time = base::Time::Now();
244424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    do {
245424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      base::PlatformThread::YieldCurrentThread();
246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    } while (base::Time::Now() -
247424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)             initial_time < base::TimeDelta::FromSeconds(1));
248424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
249424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time initial = base::Time::Now();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (base::Time::Now() <= initial) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1));
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::TearDown() {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  disk_cache::SimpleBackendImpl::FlushWorkerPoolForTesting();
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache_.reset();
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (cache_thread_.IsRunning())
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_thread_.Stop();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!memory_only_ && !simple_cache_mode_ && integrity_) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(CheckCacheIntegrity(cache_path_, new_eviction_, mask_));
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
267d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::RunLoop().RunUntilIdle();
268d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  disk_cache::SimpleBackendImpl::FlushWorkerPoolForTesting();
269d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DiskCacheTest::TearDown();
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::InitMemoryCache() {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mem_cache_ = new disk_cache::MemBackendImpl(NULL);
274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache_.reset(mem_cache_);
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(cache_);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size_)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(mem_cache_->SetMaxSize(size_));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(mem_cache_->Init());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DiskCacheTestWithCache::InitDiskCache() {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (first_cleanup_)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(CleanupCacheDir());
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!cache_thread_.IsRunning()) {
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(cache_thread_.StartWithOptions(
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        base::Thread::Options(base::MessageLoop::TYPE_IO, 0)));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(cache_thread_.message_loop() != NULL);
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CreateBackend(disk_cache::kNoRandom, &cache_thread_);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void DiskCacheTestWithCache::CreateBackend(uint32 flags, base::Thread* thread) {
29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> runner;
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (use_current_thread_)
29903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    runner = base::ThreadTaskRunnerHandle::Get();
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
30103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    runner = thread->task_runner();
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (simple_cache_mode_) {
304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    net::TestCompletionCallback cb;
305a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    scoped_ptr<disk_cache::SimpleBackendImpl> simple_backend(
3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        new disk_cache::SimpleBackendImpl(
30703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            cache_path_, size_, type_, runner, NULL));
308c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int rv = simple_backend->Init(cb.callback());
309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_EQ(net::OK, cb.GetResult(rv));
310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    simple_cache_impl_ = simple_backend.get();
311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    cache_ = simple_backend.PassAs<disk_cache::Backend>();
3127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (simple_cache_wait_for_index_) {
3137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      net::TestCompletionCallback wait_for_index_cb;
314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      rv = simple_cache_impl_->index()->ExecuteWhenReady(
3157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          wait_for_index_cb.callback());
3167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      ASSERT_EQ(net::OK, wait_for_index_cb.GetResult(rv));
3177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
319c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (mask_)
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cache_impl_ = new disk_cache::BackendImpl(cache_path_, mask_, runner, NULL);
323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    cache_impl_ = new disk_cache::BackendImpl(cache_path_, runner, NULL);
325a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  cache_.reset(cache_impl_);
326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(cache_);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size_)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(cache_impl_->SetMaxSize(size_));
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (new_eviction_)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cache_impl_->SetNewEviction();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cache_impl_->SetType(type_);
332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  cache_impl_->SetFlags(flags);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::TestCompletionCallback cb;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = cache_impl_->Init(cb.callback());
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(net::OK, cb.GetResult(rv));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
337