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