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